diff options
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/api/admin.py')
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/api/admin.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/api/admin.py b/packages/meshbay-hub/src/meshbay_hub/api/admin.py index 397b4d9..7ca1e68 100644 --- a/packages/meshbay-hub/src/meshbay_hub/api/admin.py +++ b/packages/meshbay-hub/src/meshbay_hub/api/admin.py @@ -42,6 +42,8 @@ class SettingsPatchRequest(BaseModel): mail: dict[str, int] | None = None # The sign-in lockout's two numbers, each optional, as for mail. login: dict[str, int] | None = None + # Session lifetime, in hours, each optional. + session: dict[str, int] | None = None # ── Instance settings ──────────────────────────────────────────────────────── @@ -59,6 +61,9 @@ async def _settings_payload(db: AsyncSession) -> dict: "login": await hub_settings.login_limits(db), "login_defaults": dict(hub_settings.LOGIN_DEFAULTS), "login_bounds": {k: list(v) for k, v in hub_settings.LOGIN_BOUNDS.items()}, + "session": await hub_settings.session_limits(db), + "session_defaults": dict(hub_settings.SESSION_DEFAULTS), + "session_bounds": {k: list(v) for k, v in hub_settings.SESSION_BOUNDS.items()}, } @@ -138,6 +143,26 @@ async def admin_patch_settings( )) await db.commit() + if body.session: + unknown = sorted(set(body.session) - set(hub_settings.SESSION_KEYS)) + if unknown: + raise HTTPException( + status_code=422, detail=f"Unknown session setting(s): {unknown}") + changed = [] + for key, value in body.session.items(): + clamped = hub_settings.clamp_session_value(key, value) + await hub_settings.set_raw(db, f"session.{key}", str(clamped)) + changed.append(f"{key}={clamped}") + log.info("Session lifetime changed by %s: %s", + current_user.username, ", ".join(changed)) + db.add(IPLog( + user_id=current_user.id, + event="admin_session_update", + ip_address="admin", + detail=", ".join(changed)[:255], + )) + await db.commit() + return await _settings_payload(db) |