From 5a66af31051e30303e438102039c9ee14c091433 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 2 Mar 2021 12:21:43 +0800 Subject: [PATCH 1/4] Fix: failed unit test --- pkg/filesystem/driver/local/handler_test.go | 33 +++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/pkg/filesystem/driver/local/handler_test.go b/pkg/filesystem/driver/local/handler_test.go index ed0bc2b..cd0bdc7 100644 --- a/pkg/filesystem/driver/local/handler_test.go +++ b/pkg/filesystem/driver/local/handler_test.go @@ -2,13 +2,6 @@ package local import ( "context" - "io" - "io/ioutil" - "net/url" - "os" - "strings" - "testing" - model "github.com/cloudreve/Cloudreve/v3/models" "github.com/cloudreve/Cloudreve/v3/pkg/auth" "github.com/cloudreve/Cloudreve/v3/pkg/conf" @@ -16,6 +9,12 @@ import ( "github.com/cloudreve/Cloudreve/v3/pkg/util" "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" + "io" + "io/ioutil" + "net/url" + "os" + "strings" + "testing" ) func TestHandler_Put(t *testing.T) { @@ -61,23 +60,33 @@ func TestHandler_Delete(t *testing.T) { asserts := assert.New(t) handler := Driver{} ctx := context.Background() + filePath := util.RelativePath("test.file") - file, err := os.Create(util.RelativePath("test.file")) + file, err := os.Create(filePath) asserts.NoError(err) _ = file.Close() list, err := handler.Delete(ctx, []string{"test.file"}) asserts.Equal([]string{}, list) asserts.NoError(err) - file, err = os.Create(util.RelativePath("test.file")) - asserts.NoError(err) + file, err = os.Create(filePath) _ = file.Close() + file, _ = os.OpenFile(filePath, os.O_RDWR, os.FileMode(0)) + asserts.NoError(err) list, err = handler.Delete(ctx, []string{"test.file", "test.notexist"}) - asserts.Equal([]string{"test.notexist"}, list) + file.Close() + asserts.Equal([]string{"test.file"}, list) asserts.Error(err) list, err = handler.Delete(ctx, []string{"test.notexist"}) - asserts.Equal([]string{"test.notexist"}, list) + asserts.Equal([]string{}, list) + asserts.NoError(err) + + file, err = os.Create(filePath) + asserts.NoError(err) + list, err = handler.Delete(ctx, []string{"test.file"}) + _ = file.Close() + asserts.Equal([]string{"test.file"}, list) asserts.Error(err) } From 4cf6c815345e6052fd55531d1e492c9ea151da42 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 2 Mar 2021 12:32:34 +0800 Subject: [PATCH 2/4] Fix: failed unit test --- pkg/filesystem/driver/local/handler_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/filesystem/driver/local/handler_test.go b/pkg/filesystem/driver/local/handler_test.go index cd0bdc7..6d6f98d 100644 --- a/pkg/filesystem/driver/local/handler_test.go +++ b/pkg/filesystem/driver/local/handler_test.go @@ -75,8 +75,8 @@ func TestHandler_Delete(t *testing.T) { asserts.NoError(err) list, err = handler.Delete(ctx, []string{"test.file", "test.notexist"}) file.Close() - asserts.Equal([]string{"test.file"}, list) - asserts.Error(err) + asserts.Equal([]string{}, list) + asserts.NoError(err) list, err = handler.Delete(ctx, []string{"test.notexist"}) asserts.Equal([]string{}, list) @@ -86,8 +86,8 @@ func TestHandler_Delete(t *testing.T) { asserts.NoError(err) list, err = handler.Delete(ctx, []string{"test.file"}) _ = file.Close() - asserts.Equal([]string{"test.file"}, list) - asserts.Error(err) + asserts.Equal([]string{}, list) + asserts.NoError(err) } func TestHandler_Get(t *testing.T) { 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 3/4] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=B8=90=E5=8F=B7?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=B0=9A=E6=9C=AA=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=EF=BC=8C=E5=86=8D=E5=8F=91=E4=B8=80=E6=AC=A1=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=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{} From e2488841b45c77844bd3797e6bac1b8b95ea43fc Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 2 Mar 2021 12:45:54 +0800 Subject: [PATCH 4/4] Test: #765 --- models/user_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/models/user_test.go b/models/user_test.go index ea346a2..5b4d375 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -352,10 +352,20 @@ func TestUser_IncreaseStorageWithoutCheck(t *testing.T) { } } -func TestGetUserByEmail(t *testing.T) { +func TestGetActiveUserByEmail(t *testing.T) { asserts := assert.New(t) mock.ExpectQuery("SELECT(.+)").WithArgs(Active, "abslant@foxmail.com").WillReturnRows(sqlmock.NewRows([]string{"id", "email"})) + _, err := GetActiveUserByEmail("abslant@foxmail.com") + + asserts.Error(err) + asserts.NoError(mock.ExpectationsWereMet()) +} + +func TestGetUserByEmail(t *testing.T) { + asserts := assert.New(t) + + mock.ExpectQuery("SELECT(.+)").WithArgs("abslant@foxmail.com").WillReturnRows(sqlmock.NewRows([]string{"id", "email"})) _, err := GetUserByEmail("abslant@foxmail.com") asserts.Error(err)