This commit is contained in:
2026-10-03 12:37:38 +08:00
parent bcf3d3769c
commit 5fc1755c17
22 changed files with 1845 additions and 100 deletions
+3 -4
View File
@@ -117,10 +117,9 @@ func (in *accountInput) validate() error {
return nil
}
const minPasswordLen = 8
// resolvePassword 回傳帳號密碼:有 -password 旗標時直接使用,
// 否則須於終端機以無回顯方式輸入兩次;非終端機環境不得省略旗標。
// 最小長度採 auth.MinPasswordLen(與網頁更新密碼流程一致)。
func resolvePassword(flagPassword string) (string, error) {
password := flagPassword
if password == "" {
@@ -133,8 +132,8 @@ func resolvePassword(flagPassword string) (string, error) {
return "", err
}
}
if len(password) < minPasswordLen {
return "", fmt.Errorf("密碼長度至少 %d 字元", minPasswordLen)
if len(password) < auth.MinPasswordLen {
return "", fmt.Errorf("密碼長度至少 %d 字元", auth.MinPasswordLen)
}
return password, nil
}
+1 -19
View File
@@ -42,7 +42,7 @@ func runUpdatePassword(args []string) error {
if err := u.SetPassword(pw); err != nil {
return fmt.Errorf("hash password: %w", err)
}
revoked, err := updateUserPassword(db, u)
revoked, err := auth.UpdateUserPassword(db, u)
if err != nil {
return err
}
@@ -62,21 +62,3 @@ func findUserByUsername(db *gorm.DB, username string) (*auth.User, error) {
}
return &u, nil
}
// updateUserPassword 於單一交易內寫入新密碼雜湊並刪除該使用者所有
// Session,回傳撤銷的 Session 數;交易確保密碼與 Session 不會只更新一半。
func updateUserPassword(db *gorm.DB, u *auth.User) (int64, error) {
var revoked int64
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Model(u).Update("password_hash", u.PasswordHash).Error; err != nil {
return fmt.Errorf("update password: %w", err)
}
res := tx.Where("user_id = ?", u.ID).Delete(&auth.Session{})
if res.Error != nil {
return fmt.Errorf("delete sessions: %w", res.Error)
}
revoked = res.RowsAffected
return nil
})
return revoked, err
}