From e3019bd76ec1492de9cdbf7951f17873e8fae963 Mon Sep 17 00:00:00 2001 From: JiriUhlir <149317995+JiriUhlir@users.noreply.github.com> Date: Fri, 29 May 2026 10:56:20 +0200 Subject: [PATCH] download backup admin possibility --- app/routes/backups.py | 47 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/app/routes/backups.py b/app/routes/backups.py index 3bfb84c..e0db1d3 100644 --- a/app/routes/backups.py +++ b/app/routes/backups.py @@ -1,11 +1,12 @@ import html from pathlib import Path +from urllib.parse import quote -from fastapi import APIRouter, Depends, Form, Request -from fastapi.responses import HTMLResponse, RedirectResponse +from fastapi import APIRouter, Depends, Form, HTTPException, Request +from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse from ..auth import require_user -from ..backups import is_backup_path, list_backups +from ..backups import backup_dir, is_backup_path, list_backups from ..config import BACKUP_SCRIPT from ..db.audit import log_audit_event from ..shell import run_command @@ -14,14 +15,25 @@ from ..templates.layout import page, render_result router = APIRouter() +def is_admin(user) -> bool: + return (user.get("role") or "").lower() == "admin" + + @router.get("/backups", response_class=HTMLResponse) def backups_page(request: Request, user=Depends(require_user)): rows = "" + can_download = is_admin(user) for path in list_backups(): size_mb = path.stat().st_size / 1024 / 1024 backup_name = html.escape(path.name) backup_path = html.escape(str(path), quote=True) + backup_url_name = quote(path.name, safe="") + download_action = ( + f'
' + if can_download + else "" + ) restore_cmd = html.escape( f"sudo /home/jiri/workspace/appfactory-tools/scripts/restore-appfactory.sh --force {path}", @@ -48,6 +60,7 @@ def backups_page(request: Request, user=Depends(require_user)):