mirror of https://github.com/go-gitea/gitea.git
Fix the bug that user may logout if he switch pages too fast (#29962)
This PR fixed a bug when the user switching pages too fast, he will logout automatically. The reason is that when the error is context cancelled, the previous code think user hasn't login then the session will be deleted. Now it will return the errors but not think it's not login. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
parent
b150ff0bab
commit
82db9a2ba7
|
@ -4,7 +4,6 @@
|
||||||
package auth
|
package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
@ -29,40 +28,33 @@ func (s *Session) Name() string {
|
||||||
// object for that uid.
|
// object for that uid.
|
||||||
// Returns nil if there is no user uid stored in the session.
|
// Returns nil if there is no user uid stored in the session.
|
||||||
func (s *Session) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) {
|
func (s *Session) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) {
|
||||||
user := SessionUser(req.Context(), sess)
|
|
||||||
if user != nil {
|
|
||||||
return user, nil
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SessionUser returns the user object corresponding to the "uid" session variable.
|
|
||||||
func SessionUser(ctx context.Context, sess SessionStore) *user_model.User {
|
|
||||||
if sess == nil {
|
if sess == nil {
|
||||||
return nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get user ID
|
// Get user ID
|
||||||
uid := sess.Get("uid")
|
uid := sess.Get("uid")
|
||||||
if uid == nil {
|
if uid == nil {
|
||||||
return nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
log.Trace("Session Authorization: Found user[%d]", uid)
|
log.Trace("Session Authorization: Found user[%d]", uid)
|
||||||
|
|
||||||
id, ok := uid.(int64)
|
id, ok := uid.(int64)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get user object
|
// Get user object
|
||||||
user, err := user_model.GetUserByID(ctx, id)
|
user, err := user_model.GetUserByID(req.Context(), id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !user_model.IsErrUserNotExist(err) {
|
if !user_model.IsErrUserNotExist(err) {
|
||||||
log.Error("GetUserById: %v", err)
|
log.Error("GetUserByID: %v", err)
|
||||||
|
// Return the err as-is to keep current signed-in session, in case the err is something like context.Canceled. Otherwise non-existing user (nil, nil) will make the caller clear the signed-in session.
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
return nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Trace("Session Authorization: Logged in user %-v", user)
|
log.Trace("Session Authorization: Logged in user %-v", user)
|
||||||
return user
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue