mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-24 19:12:24 +00:00
(cherry picked from commitaea4ab25a9) (cherry picked from commitd386b212c4) (cherry picked from commitc4935f08ad) (cherry picked from commitdc6ca7cd25) (cherry picked from commit25296d5a3c) (cherry picked from commit3d54c64c5f) (cherry picked from commit6ece0b9d01) (cherry picked from commit3b39962033) (cherry picked from commit5e2167cd03) (cherry picked from commite676d7b265) (cherry picked from commit9cd258e865) (cherry picked from commit0a8d58c159) (cherry picked from commitb66d06823a) (cherry picked from commit4fbe2a0047) (cherry picked from commita225e0c9b4) (cherry picked from commit3cb2cf907a) (cherry picked from commit8e8b2335cc) (cherry picked from commit02b71042b3) (cherry picked from commit5ec9137eff)
135 lines
5.2 KiB
Go
135 lines
5.2 KiB
Go
// 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")
|
|
}
|
|
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")
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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)
|
|
}
|
|
|
|
provider := azureadv2.New(clientID, secret, callbackURL, azureadv2.ProviderOptions{
|
|
Tenant: azureadv2.TenantType(custom.Tenant),
|
|
Scopes: azureScopes,
|
|
})
|
|
provider.HTTPClient = HTTPClient
|
|
return provider, nil
|
|
},
|
|
))
|
|
}
|