cloak-api / key_store.py
n1th1sh's picture
Create key_store.py
b0dae05 verified
Raw
History Blame Contribute Delete
1.64 kB
import secrets
import json
import os
from datetime import datetime
KEYS_FILE = "api_keys.json"
def load_keys():
if os.path.exists(KEYS_FILE):
with open(KEYS_FILE, "r") as f:
return json.load(f)
return {}
def save_keys(keys):
with open(KEYS_FILE, "w") as f:
json.dump(keys, f, indent=2)
def generate_api_key(label: str) -> str:
keys = load_keys()
new_key = "pii_sk_" + secrets.token_urlsafe(32)
keys[new_key] = {
"label": label,
"active": True,
"usage": 0,
"created_at": datetime.utcnow().isoformat()
}
save_keys(keys)
return new_key
def validate_key(api_key: str) -> dict | None:
keys = load_keys()
entry = keys.get(api_key)
if entry and entry["active"]:
return entry
return None
def increment_usage(api_key: str):
keys = load_keys()
if api_key in keys:
keys[api_key]["usage"] += 1
save_keys(keys)
def revoke_key(api_key: str):
keys = load_keys()
if api_key in keys:
keys[api_key]["active"] = False
save_keys(keys)
def delete_key(api_key: str):
keys = load_keys()
keys.pop(api_key, None)
save_keys(keys)
def list_keys() -> list[dict]:
keys = load_keys()
rows = []
for k, v in keys.items():
rows.append({
"key_preview": k[:14] + "••••••••",
"label": v["label"],
"status": "Active" if v["active"] else "Revoked",
"usage": v["usage"],
"created_at": v["created_at"][:10],
"full_key": k # used internally for revoke/delete
})
return rows