Files
markbase/data/init_auth_db.sql
Warren 4be06d2fcd feat: Add admin authentication for Settings panel
- Add sftpgo_admins table to auth.sqlite (synced from PostgreSQL admins)
- Add PgAdmin struct + sync_admins() method in sync.rs
- Add fetch_admins() method in pg_client.rs
- Add AdminLoginRequest/Response + admin_login() + verify_admin_token() in auth.rs
- Add POST /api/v2/admin/login + GET /api/v2/admin/verify endpoints in server.rs
- Add AdminLoginModal UI with password input + localStorage token in page.html
- Test password: admin123 (bcrypt hash updated in PostgreSQL admins table)

Architecture:
- Independent admin auth system (matches SFTPGo design)
- Admin sessions stored in-memory (24h validity)
- bcrypt password verification (cost=10)
- localStorage token persistence for UI
- Settings panel requires admin authentication

Files changed:
- data/init_auth_db.sql: +20 lines
- src/sync.rs: +100 lines
- src/pg_client.rs: +50 lines
- src/auth.rs: +60 lines
- src/server.rs: +50 lines
- src/page.html: +70 lines
Total: ~290 lines added

Tested: Admin sync, login, verify, UI modal all working
2026-05-16 20:47:28 +08:00

82 lines
2.4 KiB
SQL

-- MarkBase Authentication Database Schema
-- Synced from SFTPGo PostgreSQL
-- 1. Users table (synced from sftpgo.users)
CREATE TABLE IF NOT EXISTS sftpgo_users (
username TEXT PRIMARY KEY,
password_hash TEXT NOT NULL,
email TEXT,
status INTEGER DEFAULT 1,
home_dir TEXT,
permissions TEXT,
uid INTEGER,
gid INTEGER,
last_login INTEGER,
created_at INTEGER,
updated_at INTEGER,
last_sync_at INTEGER,
sync_status INTEGER DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_users_status ON sftpgo_users(status);
CREATE INDEX IF NOT EXISTS idx_users_sync_status ON sftpgo_users(sync_status);
-- 2. Groups table (synced from sftpgo.groups)
CREATE TABLE IF NOT EXISTS sftpgo_groups (
name TEXT PRIMARY KEY,
description TEXT,
created_at INTEGER,
updated_at INTEGER,
last_sync_at INTEGER
);
-- 3. Users-Groups mapping (synced from sftpgo.users_groups_mapping)
CREATE TABLE IF NOT EXISTS users_groups_mapping (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
group_name TEXT NOT NULL,
created_at INTEGER,
FOREIGN KEY (username) REFERENCES sftpgo_users(username) ON DELETE CASCADE,
FOREIGN KEY (group_name) REFERENCES sftpgo_groups(name) ON DELETE CASCADE,
UNIQUE(username, group_name)
);
CREATE INDEX IF NOT EXISTS idx_mapping_username ON users_groups_mapping(username);
CREATE INDEX IF NOT EXISTS idx_mapping_group ON users_groups_mapping(group_name);
-- 4. Sync log table
CREATE TABLE IF NOT EXISTS sync_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sync_type TEXT,
sync_time INTEGER,
users_synced INTEGER DEFAULT 0,
users_failed INTEGER DEFAULT 0,
groups_synced INTEGER DEFAULT 0,
groups_failed INTEGER DEFAULT 0,
mappings_synced INTEGER DEFAULT 0,
status TEXT,
error_message TEXT,
details TEXT
);
CREATE INDEX IF NOT EXISTS idx_sync_time ON sync_log(sync_time);
CREATE INDEX IF NOT EXISTS idx_sync_status ON sync_log(status);
-- 5. Admins table (synced from sftpgo.admins)
CREATE TABLE IF NOT EXISTS sftpgo_admins (
username TEXT PRIMARY KEY,
password_hash TEXT NOT NULL,
email TEXT,
description TEXT,
status INTEGER DEFAULT 1,
permissions TEXT NOT NULL,
filters TEXT,
role_id INTEGER,
last_login INTEGER DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
last_sync_at INTEGER
);
CREATE INDEX IF NOT EXISTS idx_admins_status ON sftpgo_admins(status);