From a276be4098127d9a25a7f03850b3ae73f3e963d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=A5=E4=B8=8B=E9=83=A8=20=E8=A9=A9?= Date: Tue, 2 Mar 2021 12:43:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=B8=90=E5=8F=B7=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=B0=9A=E6=9C=AA=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=EF=BC=8C=E5=86=8D=E5=8F=91=E4=B8=80=E6=AC=A1=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=BF=A1=20(#765)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 注册帐号时,如果尚未验证,再发一次验证信 * 修正2个bug。 1:未验证显示密码错误 2:未验证无法重发email * 小修正,如果已存在user,拿已有user资讯取代掉新user资讯来寄送激活码 * 激活码改成激活邮件 * 忘记密码以后,重设二步验证设定 * Revert "忘记密码以后,重设二步验证设定" This reverts commit c5ac10b11c960c0a3213f3daba24a8170dc71f6a. * 實作 https://github.com/cloudreve/Cloudreve/pull/765#discussion_r584313520 --- middleware/auth.go | 2 +- models/user.go | 7 +++++++ routers/controllers/user.go | 4 ++-- service/user/login.go | 6 ++++++ service/user/register.go | 19 +++++++++++++++---- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/middleware/auth.go b/middleware/auth.go index fd0f143..69233ee 100644 --- a/middleware/auth.go +++ b/middleware/auth.go @@ -90,7 +90,7 @@ func WebDAVAuth() gin.HandlerFunc { return } - expectedUser, err := model.GetUserByEmail(username) + expectedUser, err := model.GetActiveUserByEmail(username) if err != nil { c.Status(http.StatusUnauthorized) c.Abort() diff --git a/models/user.go b/models/user.go index c4226f0..ecd091b 100644 --- a/models/user.go +++ b/models/user.go @@ -139,6 +139,13 @@ func GetActiveUserByOpenID(openid string) (User, error) { // GetUserByEmail 用Email获取用户 func GetUserByEmail(email string) (User, error) { + var user User + result := DB.Set("gorm:auto_preload", true).Where("email = ?", email).First(&user) + return user, result.Error +} + +// GetActiveUserByEmail 用Email获取可登录用户 +func GetActiveUserByEmail(email string) (User, error) { var user User result := DB.Set("gorm:auto_preload", true).Where("status = ? and email = ?", Active, email).First(&user) return user, result.Error diff --git a/routers/controllers/user.go b/routers/controllers/user.go index b710942..77a5426 100644 --- a/routers/controllers/user.go +++ b/routers/controllers/user.go @@ -18,7 +18,7 @@ import ( // StartLoginAuthn 开始注册WebAuthn登录 func StartLoginAuthn(c *gin.Context) { userName := c.Param("username") - expectedUser, err := model.GetUserByEmail(userName) + expectedUser, err := model.GetActiveUserByEmail(userName) if err != nil { c.JSON(200, serializer.Err(serializer.CodeNotFound, "用户不存在", err)) return @@ -52,7 +52,7 @@ func StartLoginAuthn(c *gin.Context) { // FinishLoginAuthn 完成注册WebAuthn登录 func FinishLoginAuthn(c *gin.Context) { userName := c.Param("username") - expectedUser, err := model.GetUserByEmail(userName) + expectedUser, err := model.GetActiveUserByEmail(userName) if err != nil { c.JSON(200, serializer.Err(serializer.CodeCredentialInvalid, "用户邮箱或密码错误", err)) return diff --git a/service/user/login.go b/service/user/login.go index acea163..4689bc4 100644 --- a/service/user/login.go +++ b/service/user/login.go @@ -94,6 +94,12 @@ func (service *UserResetEmailService) Reset(c *gin.Context) serializer.Response // 查找用户 if user, err := model.GetUserByEmail(service.UserName); err == nil { + if user.Status == model.Baned || user.Status == model.OveruseBaned { + return serializer.Err(403, "该账号已被封禁", nil) + } + if user.Status == model.NotActivicated { + return serializer.Err(403, "该账号未激活", nil) + } // 创建密码重设会话 secret := util.RandStringRunes(32) cache.Set(fmt.Sprintf("user_reset_%d", user.ID), secret, 3600) diff --git a/service/user/register.go b/service/user/register.go index 04083ad..94c5eda 100644 --- a/service/user/register.go +++ b/service/user/register.go @@ -64,10 +64,17 @@ func (service *UserRegisterService) Register(c *gin.Context) serializer.Response user.Status = model.NotActivicated } user.GroupID = uint(defaultGroup) - + userNotActivated := false // 创建用户 if err := model.DB.Create(&user).Error; err != nil { - return serializer.DBErr("此邮箱已被使用", err) + //检查已存在使用者是否尚未激活 + expectedUser, err := model.GetUserByEmail(service.UserName) + if expectedUser.Status == model.NotActivicated { + userNotActivated = true + user = expectedUser + } else { + return serializer.DBErr("此邮箱已被使用", err) + } } // 发送激活邮件 @@ -100,8 +107,12 @@ func (service *UserRegisterService) Register(c *gin.Context) serializer.Response if err := email.Send(user.Email, title, body); err != nil { return serializer.Err(serializer.CodeInternalSetting, "无法发送激活邮件", err) } - - return serializer.Response{Code: 203} + if userNotActivated == true { + //原本在上面要抛出的DBErr,放来这边抛出 + return serializer.DBErr("用户未激活,已重新发送激活邮件", nil) + } else { + return serializer.Response{Code: 203} + } } return serializer.Response{}