MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
This commit is contained in:
Warren
2026-06-12 12:59:54 +08:00
parent 4cb7e80568
commit 1300a4e223
4559 changed files with 195840 additions and 4244 deletions

View File

@@ -0,0 +1,87 @@
use crate::sync::{AuthDb, PgUser};
use bcrypt::verify;
pub struct SftpAuth {
auth_db: AuthDb,
}
impl SftpAuth {
pub fn new(auth_db_path: &str) -> anyhow::Result<Self> {
let auth_db = AuthDb::new(auth_db_path)?;
Ok(Self { auth_db })
}
pub fn verify_password(&self, username: &str, password: &str) -> bool {
match self.auth_db.get_user(username) {
Ok(Some(user)) if user.status == 1 => {
verify(password, &user.password_hash).unwrap_or(false)
}
Ok(Some(_)) => {
log::warn!("User {} is disabled", username);
false
}
Ok(None) => {
log::warn!("User {} not found", username);
false
}
Err(e) => {
log::error!("Failed to get user {}: {}", username, e);
false
}
}
}
pub fn get_user(&self, username: &str) -> Option<PgUser> {
self.auth_db.get_user(username).ok().flatten()
}
}
#[cfg(test)]
mod tests {
use bcrypt::{hash, verify, DEFAULT_COST};
#[test]
fn test_bcrypt_verify_correct_password() {
let password = "demo123";
let hashed = hash(password, DEFAULT_COST).unwrap();
// 验证正确密码
let valid = verify(password, &hashed).unwrap();
assert!(valid);
}
#[test]
fn test_bcrypt_verify_wrong_password() {
let password = "demo123";
let wrong_password = "wrong123";
let hashed = hash(password, DEFAULT_COST).unwrap();
// 验证错误密码
let valid = verify(wrong_password, &hashed).unwrap();
assert!(!valid);
}
#[test]
fn test_bcrypt_verify_empty_password() {
let password = "";
let hashed = hash(password, DEFAULT_COST).unwrap();
// 验证空密码
let valid = verify(password, &hashed).unwrap();
assert!(valid);
// 验证非空密码对空hash
let valid = verify("test", &hashed).unwrap();
assert!(!valid);
}
#[test]
fn test_verify_database_hash() {
// 验证数据库中的实际hashdemo123
let db_hash = "$2b$10$ha5wU.mOi8fHLJCfun860u2cfVopa04jwe/q82IKOwqp5uG70qsH6";
let password = "demo123";
let valid = verify(password, db_hash).unwrap();
assert!(valid);
}
}