2.5 KiB
2.5 KiB
Authentication & Authorization
Overview
Trackpull uses session-based authentication backed by a SQLite database. There are two roles: admin and user. Passwords are hashed using werkzeug's PBKDF2-based scheme — no plaintext is ever stored.
Login Flow
- User submits credentials via
POST /login. get_user_by_username()looks up the record in theuserstable.check_password_hash()verifies the submitted password against the stored hash.- On success, Flask session is populated with
user_id,username, androle. - User is redirected to the main app. On failure, the login page re-renders with an error.
Logout is a simple GET /logout that clears the session and redirects to /login.
Authorization Enforcement
A @app.before_request hook runs before every request. If the session lacks a user_id, the request is redirected to /login.
Public (unauthenticated) routes are whitelisted:
/login/logout/static/*/offline/sw.js
Admin-only routes check session["role"] == "admin" via a require_admin() helper. Unauthorized admin access returns 403.
Role Permissions
| Action | User | Admin |
|---|---|---|
| Download (Votify/Monochrome/Unified) | Yes | Yes |
| View own jobs & files | Yes | Yes |
| Cancel/delete own jobs | Yes | Yes |
| Change own password | Yes | Yes |
| View any user's jobs/files | No | Yes |
| Manage users (create/delete/reset) | No | Yes |
| Upload cookies.txt / device.wvd | No | Yes |
| Change global settings | No | Yes |
Admin Seeding
On first run, if no users exist in the database, an admin account is created automatically from ADMIN_USERNAME and ADMIN_PASSWORD environment variables (see docker-deployment.md).
Session Security
- Sessions are encrypted using Flask's
SECRET_KEYenv var (should be a 32-byte random hex string). - Sessions survive application restarts because the key is stable.
- There is no token-based auth or "remember me" — sessions expire when the browser closes by default.
Password Management
update_user_password()indb.pyre-hashes and saves a new password.- Users change their own password at
POST /api/account/password. - Admins reset any user's password at
POST /api/admin/users/<id>/password.
Key Files
| File | Relevance |
|---|---|
| app.py | Route definitions, before_request hook, require_admin() |
| db.py | create_user, get_user_by_username, verify_password, update_user_password |