安全与可靠性: 修复配额并发、投票事务、密码授权与导出完整性

This commit is contained in:
tamakyi
2026-11-05 12:17:05 +08:00
parent 7636456d4e
commit 25aee35030
18 changed files with 1002 additions and 194 deletions
+15 -2
View File
@@ -133,6 +133,13 @@ type User struct {
PagePassword string `json:"-" gorm:"column:page_password;type:varchar(255);default:''"`
AskPassword string `json:"-" gorm:"column:ask_password;type:varchar(255);default:''"`
// PagePasswordVer / AskPasswordVer 是页面访问密码 / 提问密码的版本号。
// 每次修改对应密码时 +1,session 中保存授权时的版本号;
// 校验时若 session 中的版本号 != 当前版本号,则视为授权已失效。
// 这让「修改页面密码」能立即撤销已泄露的旧授权(SEC-06)。
PagePasswordVer uint `gorm:"default:0" json:"-"`
AskPasswordVer uint `gorm:"default:0" json:"-"`
// 私聊相关
AllowChat bool `json:"allow_chat" gorm:"default:false"`
// 每个私聊会话的消息条数上限(用户自设)。default:20 仅是 DB 层兜底;
@@ -884,7 +891,10 @@ func (db *users) UpdatePagePassword(ctx context.Context, id uint, password strin
return err
}
user.SetPagePassword(password)
return db.WithContext(ctx).Model(user).Update("page_password", user.PagePassword).Error
return db.WithContext(ctx).Model(user).Updates(map[string]interface{}{
"page_password": user.PagePassword,
"page_password_ver": gorm.Expr("page_password_ver + 1"),
}).Error
}
func (db *users) UpdateAskPassword(ctx context.Context, id uint, password string) error {
@@ -893,7 +903,10 @@ func (db *users) UpdateAskPassword(ctx context.Context, id uint, password string
return err
}
user.SetAskPassword(password)
return db.WithContext(ctx).Model(user).Update("ask_password", user.AskPassword).Error
return db.WithContext(ctx).Model(user).Updates(map[string]interface{}{
"ask_password": user.AskPassword,
"ask_password_ver": gorm.Expr("ask_password_ver + 1"),
}).Error
}
// 新增私聊设置