58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
import json
|
|
import os
|
|
import uuid
|
|
from pathlib import Path
|
|
|
|
from app.mywhoosh.models import MyWhooshToken
|
|
|
|
|
|
class MyWhooshTokenStore:
|
|
def __init__(self, path: Path) -> None:
|
|
self.path = path
|
|
self.device_id_path = path.with_name("device_id")
|
|
|
|
def load(self) -> MyWhooshToken | None:
|
|
try:
|
|
raw = json.loads(self.path.read_text("utf-8"))
|
|
return MyWhooshToken(
|
|
access_token=raw["access_token"],
|
|
refresh_token=raw.get("refresh_token"),
|
|
whoosh_id=raw.get("whoosh_id"),
|
|
)
|
|
except (FileNotFoundError, OSError, ValueError, KeyError, TypeError):
|
|
return None
|
|
|
|
def save(self, token: MyWhooshToken) -> None:
|
|
self.path.parent.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
tmp = self.path.with_suffix(".tmp")
|
|
tmp.write_text(
|
|
json.dumps(
|
|
{
|
|
"access_token": token.access_token,
|
|
"refresh_token": token.refresh_token,
|
|
"whoosh_id": token.whoosh_id,
|
|
},
|
|
indent=2,
|
|
),
|
|
"utf-8",
|
|
)
|
|
os.chmod(tmp, 0o600)
|
|
tmp.replace(self.path)
|
|
os.chmod(self.path, 0o600)
|
|
|
|
def clear(self) -> None:
|
|
self.path.unlink(missing_ok=True)
|
|
|
|
def get_or_create_device_id(self) -> str:
|
|
try:
|
|
existing = self.device_id_path.read_text("utf-8").strip()
|
|
except (FileNotFoundError, OSError):
|
|
existing = ""
|
|
if existing:
|
|
return existing
|
|
device_id = str(uuid.uuid4())
|
|
self.device_id_path.parent.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
self.device_id_path.write_text(device_id, "utf-8")
|
|
os.chmod(self.device_id_path, 0o600)
|
|
return device_id
|