summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2024-04-25 19:22:32 +0800
committerGitHub <noreply@github.com>2024-04-25 11:22:32 +0000
commitbffbbf547063fa170cc52ae2e757d5badb336632 (patch)
treede5e17bfdbc504c7c9788ebcd09978340e241b40 /modules
parentd0bfc978de802683b9a44720b7f5a8a8394d38be (diff)
downloadgitea-bffbbf547063fa170cc52ae2e757d5badb336632.tar.gz
gitea-bffbbf547063fa170cc52ae2e757d5badb336632.zip
Improve oauth2 client "preferred username field" logic and the error handling (#30622)
Follow #30454 And fix #24957 When using "preferred_username", if no such field, `extractUserNameFromOAuth2` (old `getUserName`) shouldn't return an error. All other USERNAME options do not return such error. And fine tune some logic and error messages, make code more stable and more friendly to end users.
Diffstat (limited to 'modules')
-rw-r--r--modules/session/mock.go26
-rw-r--r--modules/session/store.go23
-rw-r--r--modules/setting/oauth2.go14
3 files changed, 52 insertions, 11 deletions
diff --git a/modules/session/mock.go b/modules/session/mock.go
new file mode 100644
index 0000000000..95231a3655
--- /dev/null
+++ b/modules/session/mock.go
@@ -0,0 +1,26 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package session
+
+import (
+ "net/http"
+
+ "gitea.com/go-chi/session"
+)
+
+type MockStore struct {
+ *session.MemStore
+}
+
+func (m *MockStore) Destroy(writer http.ResponseWriter, request *http.Request) error {
+ return nil
+}
+
+type mockStoreContextKeyStruct struct{}
+
+var MockStoreContextKey = mockStoreContextKeyStruct{}
+
+func NewMockStore(sid string) *MockStore {
+ return &MockStore{session.NewMemStore(sid)}
+}
diff --git a/modules/session/store.go b/modules/session/store.go
index 70988fcdc5..09d1ef44dd 100644
--- a/modules/session/store.go
+++ b/modules/session/store.go
@@ -6,6 +6,8 @@ package session
import (
"net/http"
+ "code.gitea.io/gitea/modules/setting"
+
"gitea.com/go-chi/session"
)
@@ -14,6 +16,10 @@ type Store interface {
Get(any) any
Set(any, any) error
Delete(any) error
+ ID() string
+ Release() error
+ Flush() error
+ Destroy(http.ResponseWriter, *http.Request) error
}
// RegenerateSession regenerates the underlying session and returns the new store
@@ -21,8 +27,21 @@ func RegenerateSession(resp http.ResponseWriter, req *http.Request) (Store, erro
for _, f := range BeforeRegenerateSession {
f(resp, req)
}
- s, err := session.RegenerateSession(resp, req)
- return s, err
+ if setting.IsInTesting {
+ if store, ok := req.Context().Value(MockStoreContextKey).(*MockStore); ok {
+ return store, nil
+ }
+ }
+ return session.RegenerateSession(resp, req)
+}
+
+func GetContextSession(req *http.Request) Store {
+ if setting.IsInTesting {
+ if store, ok := req.Context().Value(MockStoreContextKey).(*MockStore); ok {
+ return store
+ }
+ }
+ return session.GetSession(req)
}
// BeforeRegenerateSession is a list of functions that are called before a session is regenerated.
diff --git a/modules/setting/oauth2.go b/modules/setting/oauth2.go
index 34e1a336dc..e59f54420b 100644
--- a/modules/setting/oauth2.go
+++ b/modules/setting/oauth2.go
@@ -16,14 +16,10 @@ import (
type OAuth2UsernameType string
const (
- // OAuth2UsernameUserid oauth2 userid field will be used as gitea name
- OAuth2UsernameUserid OAuth2UsernameType = "userid"
- // OAuth2UsernameNickname oauth2 nickname field will be used as gitea name
- OAuth2UsernameNickname OAuth2UsernameType = "nickname"
- // OAuth2UsernameEmail username of oauth2 email field will be used as gitea name
- OAuth2UsernameEmail OAuth2UsernameType = "email"
- // OAuth2UsernameEmail username of oauth2 preferred_username field will be used as gitea name
- OAuth2UsernamePreferredUsername OAuth2UsernameType = "preferred_username"
+ OAuth2UsernameUserid OAuth2UsernameType = "userid" // use user id (sub) field as gitea's username
+ OAuth2UsernameNickname OAuth2UsernameType = "nickname" // use nickname field
+ OAuth2UsernameEmail OAuth2UsernameType = "email" // use email field
+ OAuth2UsernamePreferredUsername OAuth2UsernameType = "preferred_username" // use preferred_username field
)
func (username OAuth2UsernameType) isValid() bool {
@@ -71,8 +67,8 @@ func loadOAuth2ClientFrom(rootCfg ConfigProvider) {
OAuth2Client.EnableAutoRegistration = sec.Key("ENABLE_AUTO_REGISTRATION").MustBool()
OAuth2Client.Username = OAuth2UsernameType(sec.Key("USERNAME").MustString(string(OAuth2UsernameNickname)))
if !OAuth2Client.Username.isValid() {
- log.Warn("Username setting is not valid: '%s', will fallback to '%s'", OAuth2Client.Username, OAuth2UsernameNickname)
OAuth2Client.Username = OAuth2UsernameNickname
+ log.Warn("[oauth2_client].USERNAME setting is invalid, falls back to %q", OAuth2Client.Username)
}
OAuth2Client.UpdateAvatar = sec.Key("UPDATE_AVATAR").MustBool()
OAuth2Client.AccountLinking = OAuth2AccountLinkingType(sec.Key("ACCOUNT_LINKING").MustString(string(OAuth2AccountLinkingLogin)))