You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@answer.apache.org by li...@apache.org on 2024/01/11 06:28:35 UTC
(incubator-answer) 01/01: fix(user): move logout and change email router
This is an automated email from the ASF dual-hosted git repository.
linkinstar pushed a commit to branch fix/1.2.5/user
in repository https://gitbox.apache.org/repos/asf/incubator-answer.git
commit 661a1c225bec9b064ea408a4a14ea9e3d331c914
Author: LinkinStars <li...@foxmail.com>
AuthorDate: Thu Jan 11 14:28:25 2024 +0800
fix(user): move logout and change email router
---
internal/base/middleware/auth.go | 41 ++++++++++++++++++++++++++++++++----
internal/base/server/http.go | 7 +++++-
internal/router/answer_api_router.go | 9 +++++---
3 files changed, 49 insertions(+), 8 deletions(-)
diff --git a/internal/base/middleware/auth.go b/internal/base/middleware/auth.go
index 0fdc2c42..44fd20a2 100644
--- a/internal/base/middleware/auth.go
+++ b/internal/base/middleware/auth.go
@@ -89,18 +89,51 @@ func (am *AuthUserMiddleware) EjectUserBySiteInfo() gin.HandlerFunc {
return
}
- _, isLogin := ctx.Get(ctxUUIDKey)
- if !isLogin {
+ // If site in private mode, user must login.
+ userInfo := GetUserInfoFromContext(ctx)
+ if userInfo == nil {
handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
ctx.Abort()
return
}
+ // If user is not active, eject user.
+ if userInfo.EmailStatus != entity.EmailStatusAvailable {
+ handler.HandleResponse(ctx, errors.Forbidden(reason.EmailNeedToBeVerified),
+ &schema.ForbiddenResp{Type: schema.ForbiddenReasonTypeInactive})
+ ctx.Abort()
+ return
+ }
+ ctx.Next()
+ }
+}
+
+// MustAuthWithoutAccountAvailable auth user info, any login user can access though user is not active.
+func (am *AuthUserMiddleware) MustAuthWithoutAccountAvailable() gin.HandlerFunc {
+ return func(ctx *gin.Context) {
+ token := ExtractToken(ctx)
+ if len(token) == 0 {
+ handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
+ ctx.Abort()
+ return
+ }
+ userInfo, err := am.authService.GetUserCacheInfo(ctx, token)
+ if err != nil || userInfo == nil {
+ handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
+ ctx.Abort()
+ return
+ }
+ if userInfo.UserStatus == entity.UserStatusDeleted {
+ handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
+ ctx.Abort()
+ return
+ }
+ ctx.Set(ctxUUIDKey, userInfo)
ctx.Next()
}
}
-// MustAuth auth user info. If the user does not log in, an unauthenticated error is displayed
-func (am *AuthUserMiddleware) MustAuth() gin.HandlerFunc {
+// MustAuthAndAccountAvailable auth user info and check user status, only allow active user access.
+func (am *AuthUserMiddleware) MustAuthAndAccountAvailable() gin.HandlerFunc {
return func(ctx *gin.Context) {
token := ExtractToken(ctx)
if len(token) == 0 {
diff --git a/internal/base/server/http.go b/internal/base/server/http.go
index 6e0b6727..daaf90fb 100644
--- a/internal/base/server/http.go
+++ b/internal/base/server/http.go
@@ -74,9 +74,14 @@ func NewHTTPServer(debug bool,
unAuthV1.Use(authUserMiddleware.Auth(), authUserMiddleware.EjectUserBySiteInfo())
answerRouter.RegisterUnAuthAnswerAPIRouter(unAuthV1)
+ // register api that must be authenticated but no need to check account status
+ authWithoutStatusV1 := r.Group("/answer/api/v1")
+ authWithoutStatusV1.Use(authUserMiddleware.MustAuthWithoutAccountAvailable())
+ answerRouter.RegisterAuthUserWithAnyStatusAnswerAPIRouter(authWithoutStatusV1)
+
// register api that must be authenticated
authV1 := r.Group("/answer/api/v1")
- authV1.Use(authUserMiddleware.MustAuth())
+ authV1.Use(authUserMiddleware.MustAuthAndAccountAvailable())
answerRouter.RegisterAnswerAPIRouter(authV1)
adminauthV1 := r.Group("/answer/admin/api")
diff --git a/internal/router/answer_api_router.go b/internal/router/answer_api_router.go
index 0a6d7b83..d5085fb6 100644
--- a/internal/router/answer_api_router.go
+++ b/internal/router/answer_api_router.go
@@ -141,9 +141,6 @@ func (a *AnswerAPIRouter) RegisterMustUnAuthAnswerAPIRouter(authUserMiddleware *
func (a *AnswerAPIRouter) RegisterUnAuthAnswerAPIRouter(r *gin.RouterGroup) {
// user
- r.GET("/user/logout", a.userController.UserLogout)
- r.POST("/user/email/change/code", middleware.BanAPIForUserCenter, a.userController.UserChangeEmailSendCode)
- r.POST("/user/email/verification/send", middleware.BanAPIForUserCenter, a.userController.UserVerifyEmailSend)
r.GET("/personal/user/info", a.userController.GetOtherUserInfoByUsername)
r.GET("/user/ranking", a.userController.UserRanking)
@@ -183,6 +180,12 @@ func (a *AnswerAPIRouter) RegisterUnAuthAnswerAPIRouter(r *gin.RouterGroup) {
r.GET("/personal/rank/page", a.rankController.GetRankPersonalWithPage)
}
+func (a *AnswerAPIRouter) RegisterAuthUserWithAnyStatusAnswerAPIRouter(r *gin.RouterGroup) {
+ r.GET("/user/logout", a.userController.UserLogout)
+ r.POST("/user/email/change/code", middleware.BanAPIForUserCenter, a.userController.UserChangeEmailSendCode)
+ r.POST("/user/email/verification/send", middleware.BanAPIForUserCenter, a.userController.UserVerifyEmailSend)
+}
+
func (a *AnswerAPIRouter) RegisterAnswerAPIRouter(r *gin.RouterGroup) {
// revisions
r.GET("/revisions/unreviewed", a.revisionController.GetUnreviewedRevisionList)