2021-08-06 04:11:08 +03:00
|
|
|
// 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 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
|
2021-12-14 11:37:11 +03:00
|
|
|
type CustomProviderNewFn func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error)
|
2021-08-06 04:11:08 +03:00
|
|
|
|
|
|
|
// 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)
|
|
|
|
|
2021-12-14 11:37:11 +03:00
|
|
|
return c.newFn(source.ClientID, source.ClientSecret, callbackURL, custom, source.Scopes)
|
2021-08-06 04:11:08 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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{
|
2021-08-17 11:07:52 +03:00
|
|
|
TokenURL: availableAttribute(github.TokenURL),
|
2021-08-06 04:11:08 +03:00
|
|
|
AuthURL: availableAttribute(github.AuthURL),
|
|
|
|
ProfileURL: availableAttribute(github.ProfileURL),
|
|
|
|
EmailURL: availableAttribute(github.EmailURL),
|
|
|
|
},
|
2021-12-14 11:37:11 +03:00
|
|
|
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
|
2021-08-06 04:11:08 +03:00
|
|
|
if setting.OAuth2Client.EnableAutoRegistration {
|
|
|
|
scopes = append(scopes, "user:email")
|
|
|
|
}
|
|
|
|
return github.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, custom.EmailURL, scopes...), nil
|
|
|
|
}))
|
|
|
|
|
|
|
|
RegisterGothProvider(NewCustomProvider(
|
|
|
|
"gitlab", "GitLab", &CustomURLSettings{
|
|
|
|
AuthURL: availableAttribute(gitlab.AuthURL),
|
|
|
|
TokenURL: availableAttribute(gitlab.TokenURL),
|
|
|
|
ProfileURL: availableAttribute(gitlab.ProfileURL),
|
2021-12-14 11:37:11 +03:00
|
|
|
}, func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
|
|
|
|
scopes = append(scopes, "read_user")
|
|
|
|
return gitlab.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...), nil
|
2021-08-06 04:11:08 +03:00
|
|
|
}))
|
|
|
|
|
|
|
|
RegisterGothProvider(NewCustomProvider(
|
|
|
|
"gitea", "Gitea", &CustomURLSettings{
|
|
|
|
TokenURL: requiredAttribute(gitea.TokenURL),
|
|
|
|
AuthURL: requiredAttribute(gitea.AuthURL),
|
|
|
|
ProfileURL: requiredAttribute(gitea.ProfileURL),
|
|
|
|
},
|
2021-12-14 11:37:11 +03:00
|
|
|
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
|
|
|
|
return gitea.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...), nil
|
2021-08-06 04:11:08 +03:00
|
|
|
}))
|
|
|
|
|
|
|
|
RegisterGothProvider(NewCustomProvider(
|
|
|
|
"nextcloud", "Nextcloud", &CustomURLSettings{
|
|
|
|
TokenURL: requiredAttribute(nextcloud.TokenURL),
|
|
|
|
AuthURL: requiredAttribute(nextcloud.AuthURL),
|
|
|
|
ProfileURL: requiredAttribute(nextcloud.ProfileURL),
|
|
|
|
},
|
2021-12-14 11:37:11 +03:00
|
|
|
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
|
|
|
|
return nextcloud.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...), nil
|
2021-08-06 04:11:08 +03:00
|
|
|
}))
|
|
|
|
|
|
|
|
RegisterGothProvider(NewCustomProvider(
|
|
|
|
"mastodon", "Mastodon", &CustomURLSettings{
|
|
|
|
AuthURL: requiredAttribute(mastodon.InstanceURL),
|
|
|
|
},
|
2021-12-14 11:37:11 +03:00
|
|
|
func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
|
|
|
|
return mastodon.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, scopes...), nil
|
2021-08-06 04:11:08 +03:00
|
|
|
}))
|
|
|
|
|
|
|
|
RegisterGothProvider(NewCustomProvider(
|
|
|
|
"azureadv2", "Azure AD v2", &CustomURLSettings{
|
|
|
|
Tenant: requiredAttribute("organizations"),
|
|
|
|
},
|
2021-12-14 11:37:11 +03:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2021-08-06 04:11:08 +03:00
|
|
|
return azureadv2.New(clientID, secret, callbackURL, azureadv2.ProviderOptions{
|
|
|
|
Tenant: azureadv2.TenantType(custom.Tenant),
|
2021-12-14 11:37:11 +03:00
|
|
|
Scopes: azureScopes,
|
2021-08-06 04:11:08 +03:00
|
|
|
}), nil
|
|
|
|
},
|
|
|
|
))
|
|
|
|
}
|