diff --git a/apps/admin/dependencies.py b/apps/admin/dependencies.py index ae0b807..b935ce5 100644 --- a/apps/admin/dependencies.py +++ b/apps/admin/dependencies.py @@ -11,6 +11,7 @@ import time from core.settings import settings from apps.admin.services import FileService, ConfigService, LocalFileService + def create_token(data: dict, expires_in: int = 3600 * 24) -> str: """ 创建JWT token @@ -22,16 +23,17 @@ def create_token(data: dict, expires_in: int = 3600 * 24) -> str: **data, "exp": int(time.time()) + expires_in }).encode()).decode() - + signature = hmac.new( settings.admin_token.encode(), f"{header}.{payload}".encode(), 'sha256' ).digest() signature = base64.b64encode(signature).decode() - + return f"{header}.{payload}.{signature}" + def verify_token(token: str) -> dict: """ 验证JWT token @@ -40,7 +42,7 @@ def verify_token(token: str) -> dict: """ try: header_b64, payload_b64, signature_b64 = token.split('.') - + # 验证签名 expected_signature = hmac.new( settings.admin_token.encode(), @@ -48,21 +50,22 @@ def verify_token(token: str) -> dict: 'sha256' ).digest() expected_signature_b64 = base64.b64encode(expected_signature).decode() - + if signature_b64 != expected_signature_b64: raise ValueError("无效的签名") - + # 解码payload payload = json.loads(base64.b64decode(payload_b64)) - + # 检查是否过期 if payload.get("exp", 0) < time.time(): raise ValueError("token已过期") - + return payload except Exception as e: raise ValueError(f"token验证失败: {str(e)}") + async def admin_required(authorization: str = Header(default=None), request: Request = None): """ 验证管理员权限 @@ -71,9 +74,12 @@ async def admin_required(authorization: str = Header(default=None), request: Req if not authorization or not authorization.startswith("Bearer "): is_admin = False else: - token = authorization.split(" ")[1] - payload = verify_token(token) - is_admin = payload.get("is_admin", False) + try: + token = authorization.split(" ")[1] + payload = verify_token(token) + is_admin = payload.get("is_admin", False) + except ValueError as e: + is_admin = False if request.url.path.startswith('/share/'): if not settings.openUpload and not is_admin: @@ -85,6 +91,7 @@ async def admin_required(authorization: str = Header(default=None), request: Req except ValueError as e: raise HTTPException(status_code=401, detail=str(e)) + async def get_file_service(): return FileService() diff --git a/apps/admin/services.py b/apps/admin/services.py index 821dcb9..133c54c 100644 --- a/apps/admin/services.py +++ b/apps/admin/services.py @@ -90,6 +90,8 @@ class ConfigService: class LocalFileService: async def list_files(self): files = [] + if not os.path.exists(data_root / 'local'): + os.makedirs(data_root / 'local') for file in os.listdir(data_root / 'local'): files.append(LocalFileClass(file)) return files diff --git a/core/settings.py b/core/settings.py index a9353df..c66177d 100644 --- a/core/settings.py +++ b/core/settings.py @@ -35,6 +35,11 @@ DEFAULT_CONFIG = { 'onedrive_password': '', 'onedrive_root_path': 'filebox_storage', 'onedrive_proxy': 0, + 'webdav_hostname': '', + 'webdav_username': '', + 'webdav_password': '', + 'webdav_root_path': 'filebox_storage', + 'webdav_proxy': 0, 'admin_token': 'FileCodeBox2023', 'openUpload': 1, 'uploadSize': 1024 * 1024 * 10, diff --git a/themes/2023/assets/logo_small.png.png b/fcb-fronted/public/assets/logo_small.png similarity index 100% rename from themes/2023/assets/logo_small.png.png rename to fcb-fronted/public/assets/logo_small.png diff --git a/fcb-fronted/public/logo_small.png b/fcb-fronted/public/logo_small.png deleted file mode 100644 index b09e0f0..0000000 Binary files a/fcb-fronted/public/logo_small.png and /dev/null differ diff --git a/fcb-fronted/src/stores/adminData.ts b/fcb-fronted/src/stores/adminData.ts index 059fa0c..aeb9b47 100644 --- a/fcb-fronted/src/stores/adminData.ts +++ b/fcb-fronted/src/stores/adminData.ts @@ -3,9 +3,11 @@ import {ref} from "vue"; export const useAdminData = defineStore('adminData', () => { const adminPassword = ref(localStorage.getItem('adminPassword') || ''); + const isAdmin = ref(!!localStorage.getItem('adminPassword')); function updateAdminPwd(pwd: string) { adminPassword.value = pwd; + isAdmin.value = true; localStorage.setItem('adminPassword', pwd); } - return { adminPassword,updateAdminPwd }; + return { adminPassword,updateAdminPwd,isAdmin }; }); diff --git a/fcb-fronted/src/utils/request.ts b/fcb-fronted/src/utils/request.ts index 05a1658..91d8274 100644 --- a/fcb-fronted/src/utils/request.ts +++ b/fcb-fronted/src/utils/request.ts @@ -8,7 +8,7 @@ const instance = axios.create({ instance.interceptors.request.use( (config: any) => { config.headers= { - 'Authorization': localStorage.getItem('adminPassword') || '', + 'Authorization': 'Bearer '+ localStorage.getItem('adminPassword') || '', } return config; }); @@ -24,6 +24,7 @@ instance.interceptors.response.use( return Promise.reject(response.data); } }, (error:any) => { + localStorage.clear() ElMessage.error(error.response.data.detail); return Promise.reject(error); }); diff --git a/fcb-fronted/src/views/Admin/AdminView.vue b/fcb-fronted/src/views/Admin/AdminView.vue index 4111252..35051fa 100644 --- a/fcb-fronted/src/views/Admin/AdminView.vue +++ b/fcb-fronted/src/views/Admin/AdminView.vue @@ -1,10 +1,10 @@