forgejo/services/auth/source/oauth2/providers_custom.go

136 lines
5.2 KiB
Go
Raw Normal View History

// Copyright 2021 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
import (
"code.gitea.io/gitea/modules/setting"
"github.com/markbates/goth"
"github.com/markbates/goth/providers/azureadv2"
"github.com/markbates/goth/providers/gitea"
"github.com/markbates/goth/providers/github"
"github.com/markbates/goth/providers/gitlab"
"github.com/markbates/goth/providers/mastodon"
"github.com/markbates/goth/providers/nextcloud"
)
// CustomProviderNewFn creates a goth.Provider using a custom url mapping
type CustomProviderNewFn func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error)
// CustomProvider is a GothProvider that has CustomURL features
type CustomProvider struct {
BaseProvider
customURLSettings *CustomURLSettings
newFn CustomProviderNewFn
}
// CustomURLSettings returns the CustomURLSettings for this provider
func (c *CustomProvider) CustomURLSettings() *CustomURLSettings {
return c.customURLSettings
}
// CreateGothProvider creates a GothProvider from this Provider
func (c *CustomProvider) CreateGothProvider(providerName, callbackURL string, source *Source) (goth.Provider, error) {
custom := c.customURLSettings.OverrideWith(source.CustomURLMapping)
return c.newFn(source.ClientID, source.ClientSecret, callbackURL, custom, source.Scopes)
}
// NewCustomProvider is a constructor function for custom providers
func NewCustomProvider(name, displayName string, customURLSetting *CustomURLSettings, newFn CustomProviderNewFn) *CustomProvider {
return &CustomProvider{
BaseProvider: BaseProvider{
name: name,
displayName: displayName,
},
customURLSettings: customURLSetting,
newFn: newFn,
}
}
var _ GothProvider = &CustomProvider{}
func init() {
RegisterGothProvider(NewCustomProvider(
"github", "GitHub", &CustomURLSettings{
TokenURL: availableAttribute(github.TokenURL),
AuthURL: availableAttribute(github.AuthURL),
ProfileURL: availableAttribute(github.ProfileURL),
EmailURL: availableAttribute(github.EmailURL),
},
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
if setting.OAuth2Client.EnableAutoRegistration {
scopes = append(scopes, "user:email")
}
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
provider := github.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, custom.EmailURL, scopes...)
provider.HTTPClient = HTTPClient
return provider, nil
}))
RegisterGothProvider(NewCustomProvider(
"gitlab", "GitLab", &CustomURLSettings{
AuthURL: availableAttribute(gitlab.AuthURL),
TokenURL: availableAttribute(gitlab.TokenURL),
ProfileURL: availableAttribute(gitlab.ProfileURL),
}, func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
scopes = append(scopes, "read_user")
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
provider := gitlab.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...)
provider.HTTPClient = HTTPClient
return provider, nil
}))
RegisterGothProvider(NewCustomProvider(
"gitea", "Gitea", &CustomURLSettings{
TokenURL: requiredAttribute(gitea.TokenURL),
AuthURL: requiredAttribute(gitea.AuthURL),
ProfileURL: requiredAttribute(gitea.ProfileURL),
},
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
provider := gitea.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...)
provider.HTTPClient = HTTPClient
return provider, nil
}))
RegisterGothProvider(NewCustomProvider(
"nextcloud", "Nextcloud", &CustomURLSettings{
TokenURL: requiredAttribute(nextcloud.TokenURL),
AuthURL: requiredAttribute(nextcloud.AuthURL),
ProfileURL: requiredAttribute(nextcloud.ProfileURL),
},
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
provider := nextcloud.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...)
provider.HTTPClient = HTTPClient
return provider, nil
}))
RegisterGothProvider(NewCustomProvider(
"mastodon", "Mastodon", &CustomURLSettings{
AuthURL: requiredAttribute(mastodon.InstanceURL),
},
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
provider := mastodon.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, scopes...)
provider.HTTPClient = HTTPClient
return provider, nil
}))
RegisterGothProvider(NewCustomProvider(
"azureadv2", "Azure AD v2", &CustomURLSettings{
Tenant: requiredAttribute("organizations"),
},
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
azureScopes := make([]azureadv2.ScopeType, len(scopes))
for i, scope := range scopes {
azureScopes[i] = azureadv2.ScopeType(scope)
}
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
provider := azureadv2.New(clientID, secret, callbackURL, azureadv2.ProviderOptions{
Tenant: azureadv2.TenantType(custom.Tenant),
Scopes: azureScopes,
[TESTS] oauth2: make it possible to use an alternate http.Client (cherry picked from commit aea4ab25a93642b9032544e82299ef652162a092) (cherry picked from commit d386b212c48d0b1c8b50f947f11f08a0ad8c6d63) (cherry picked from commit c4935f08adc2830747905fdd051c551a7e3a0434) (cherry picked from commit dc6ca7cd25d82039a89c6b0d34cb1cfe80d186e9) (cherry picked from commit 25296d5a3cc48b8a6b3517a8e085f30208f681c8) (cherry picked from commit 3d54c64c5f7793e70201ed8b1d636aff2160682e) (cherry picked from commit 6ece0b9d0144b85ef3e3c5814e56f3d87cacf4cc) (cherry picked from commit 3b39962033fe87494f2318e4db89dd47182ccaef) (cherry picked from commit 5e2167cd03efc7af5782abb4fcfa009345a550e3) (cherry picked from commit e676d7b265d0784241c498645dcd7b6127071024) (cherry picked from commit 9cd258e8658af36f7149249e81a8923284c4802f) (cherry picked from commit 0a8d58c1592d0677819977bba4f08cad6a178865) (cherry picked from commit b66d06823a5634ab355e95c6171749c9bac93878) (cherry picked from commit 4fbe2a0047c2b78b5a329664f6c9442576d65bbf) (cherry picked from commit a225e0c9b419ed32f35699630af0d7b97e6a3395) (cherry picked from commit 21b670b9273353ec233c2840282b168150c0dc99) (cherry picked from commit d586e335d51dd447cc76b42dac8ddacbf99feb73) (cherry picked from commit 7ab21549a3014aa7f9ab55d6a9f35a8b1ca551b8) (cherry picked from commit eb3235039fb82785f67200822f192a42fa44bb00) (cherry picked from commit 02b16875cf5b2d494b6a7deb440528a4ed202b05) (cherry picked from commit 130a1617aafa8e30781c1c3a0b1b7cf06228f29e) (cherry picked from commit e9ddf75e6bca922436b145e253d756b3774c0bab)
2023-06-27 08:38:30 +00:00
})
provider.HTTPClient = HTTPClient
return provider, nil
},
))
}