diff options
author | zeripath <art27@cantab.net> | 2021-12-14 08:37:11 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-14 16:37:11 +0800 |
commit | 0981ec30c3d5218939d44fc2f40725b0b4a03684 (patch) | |
tree | 5479fb309f9800310cf2268d493e1cd33abfeac6 /services/externalaccount | |
parent | b4782e24d2821bbb5647eff2eaf5c338e92324db (diff) | |
download | gitea-0981ec30c3d5218939d44fc2f40725b0b4a03684.tar.gz gitea-0981ec30c3d5218939d44fc2f40725b0b4a03684.zip |
Add Option to synchronize Admin & Restricted states from OIDC/OAuth2 along with Setting Scopes (#16766)
* Add setting to OAuth handlers to override local 2FA settings
This PR adds a setting to OAuth and OpenID login sources to allow the source to
override local 2FA requirements.
Fix #13939
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Fix regression from #16544
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Add scopes settings
Signed-off-by: Andrew Thornton <art27@cantab.net>
* fix trace logging in auth_openid
Signed-off-by: Andrew Thornton <art27@cantab.net>
* add required claim options
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Move UpdateExternalUser to externalaccount
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Allow OAuth2/OIDC to set Admin/Restricted status
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Allow use of the same group claim name for the prohibit login value
Signed-off-by: Andrew Thornton <art27@cantab.net>
* fixup! Move UpdateExternalUser to externalaccount
* as per wxiaoguang
Signed-off-by: Andrew Thornton <art27@cantab.net>
* add label back in
Signed-off-by: Andrew Thornton <art27@cantab.net>
* adjust localisation
Signed-off-by: Andrew Thornton <art27@cantab.net>
* placate lint
Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'services/externalaccount')
-rw-r--r-- | services/externalaccount/link.go | 29 | ||||
-rw-r--r-- | services/externalaccount/user.go | 26 |
2 files changed, 50 insertions, 5 deletions
diff --git a/services/externalaccount/link.go b/services/externalaccount/link.go new file mode 100644 index 0000000000..e71a37090f --- /dev/null +++ b/services/externalaccount/link.go @@ -0,0 +1,29 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "fmt" + + user_model "code.gitea.io/gitea/models/user" + "github.com/markbates/goth" +) + +// Store represents a thing that stores things +type Store interface { + Get(interface{}) interface{} + Set(interface{}, interface{}) error + Release() error +} + +// LinkAccountFromStore links the provided user with a stored external user +func LinkAccountFromStore(store Store, user *user_model.User) error { + gothUser := store.Get("linkAccountGothUser") + if gothUser == nil { + return fmt.Errorf("not in LinkAccount session") + } + + return LinkAccountToUser(user, gothUser.(goth.User)) +} diff --git a/services/externalaccount/user.go b/services/externalaccount/user.go index f7280e90e4..8fd0680a1f 100644 --- a/services/externalaccount/user.go +++ b/services/externalaccount/user.go @@ -15,14 +15,12 @@ import ( "github.com/markbates/goth" ) -// LinkAccountToUser link the gothUser to the user -func LinkAccountToUser(user *user_model.User, gothUser goth.User) error { +func toExternalLoginUser(user *user_model.User, gothUser goth.User) (*user_model.ExternalLoginUser, error) { loginSource, err := login.GetActiveOAuth2LoginSourceByName(gothUser.Provider) if err != nil { - return err + return nil, err } - - externalLoginUser := &user_model.ExternalLoginUser{ + return &user_model.ExternalLoginUser{ ExternalID: gothUser.UserID, UserID: user.ID, LoginSourceID: loginSource.ID, @@ -40,6 +38,14 @@ func LinkAccountToUser(user *user_model.User, gothUser goth.User) error { AccessTokenSecret: gothUser.AccessTokenSecret, RefreshToken: gothUser.RefreshToken, ExpiresAt: gothUser.ExpiresAt, + }, nil +} + +// LinkAccountToUser link the gothUser to the user +func LinkAccountToUser(user *user_model.User, gothUser goth.User) error { + externalLoginUser, err := toExternalLoginUser(user, gothUser) + if err != nil { + return err } if err := user_model.LinkExternalToUser(user, externalLoginUser); err != nil { @@ -62,3 +68,13 @@ func LinkAccountToUser(user *user_model.User, gothUser goth.User) error { return nil } + +// UpdateExternalUser updates external user's information +func UpdateExternalUser(user *user_model.User, gothUser goth.User) error { + externalLoginUser, err := toExternalLoginUser(user, gothUser) + if err != nil { + return err + } + + return user_model.UpdateExternalUserByExternalID(externalLoginUser) +} |