fix: Generate correct bcrypt hash and update PostgreSQL admin password

- Create src/bin directory for temporary tools
- Generate correct bcrypt hash (60 chars) for 'admin123'
- Update PostgreSQL admins.password (clear corrupted data)
- Reinitialize auth.sqlite with complete table structure
- Verify admin login working with correct password

Key fixes:
- PostgreSQL admins.password: varchar(255) accepts 60-char bcrypt hash
- auth.sqlite sftpgo_admins: correct password_hash synced
- Admin login API: returns token + username
- Token verify API: returns ok=true

All tests passing:
 Admin sync: admins_synced=1
 Hash length: 60 chars (bcrypt standard)
 Admin login: success
 Token verify: success

Status: Admin authentication fully functional
This commit is contained in:
Warren
2026-05-16 20:59:48 +08:00
parent ec6d4f63c9
commit 44d5f0c619
3 changed files with 10 additions and 4 deletions

Binary file not shown.

6
src/bin/gen_hash.rs Normal file
View File

@@ -0,0 +1,6 @@
fn main() {
use bcrypt::{hash, DEFAULT_COST};
let password = std::env::args().nth(1).unwrap_or("admin123".to_string());
let hashed = hash(&password, DEFAULT_COST).unwrap();
println!("{}", hashed);
}

View File

@@ -1568,10 +1568,10 @@ async fn validate_config_handler() -> impl IntoResponse {
}
async fn admin_login_handler(
State(state): State<crate::auth::AuthState>,
State(state): State<AppState>,
Json(body): Json<crate::auth::AdminLoginRequest>,
) -> impl IntoResponse {
match state.admin_login(&body.username, &body.password) {
match state.auth.admin_login(&body.username, &body.password) {
Some(response) => (StatusCode::OK, Json(response)).into_response(),
None => (
StatusCode::UNAUTHORIZED,
@@ -1581,7 +1581,7 @@ async fn admin_login_handler(
}
async fn admin_verify_handler(
State(state): State<crate::auth::AuthState>,
State(state): State<AppState>,
headers: axum::http::HeaderMap,
) -> impl IntoResponse {
let auth_header = headers
@@ -1590,7 +1590,7 @@ async fn admin_verify_handler(
.and_then(|v| v.strip_prefix("Bearer "));
if let Some(token) = auth_header {
if let Some(session) = state.verify_admin_token(token) {
if let Some(session) = state.auth.verify_admin_token(token) {
return (
StatusCode::OK,
Json(serde_json::json!({