Close #24808 Co-Authour @wxiaoguang @silverwind 1. Most svgs are found from https://worldvectorlogo.com/ , and some are from conversion of png to svg. (facebook and nextcloud). And also changed `templates/user/settings/security/accountlinks.tmpl`. 2. Fixed display name and iconurl related logic # After <img width="1436" alt="Screen Shot 2023-06-05 at 14 09 05" src="https://github.com/go-gitea/gitea/assets/17645053/a5db39d8-1ab0-4676-82a4-fba60a1d1f84"> On mobile <img width="378" alt="Screen Shot 2023-06-05 at 14 09 46" src="https://github.com/go-gitea/gitea/assets/17645053/71d0f51b-baac-4f48-8ca2-ae0e013bd62e"> user/settings/security/accountlinks (The dropdown might be improved later) <img width="973" alt="Screen Shot 2023-06-01 at 10 01 44" src="https://github.com/go-gitea/gitea/assets/17645053/27010e7e-2785-4fc5-8c49-b06621898f37"> --------- Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
		
			
				
	
	
		
			124 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.8 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")
 | |
| 			}
 | |
| 			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),
 | |
| 		}, 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
 | |
| 		}))
 | |
| 
 | |
| 	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) {
 | |
| 			return gitea.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...), 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) {
 | |
| 			return nextcloud.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, custom.TokenURL, custom.ProfileURL, scopes...), nil
 | |
| 		}))
 | |
| 
 | |
| 	RegisterGothProvider(NewCustomProvider(
 | |
| 		"mastodon", "Mastodon", &CustomURLSettings{
 | |
| 			AuthURL: requiredAttribute(mastodon.InstanceURL),
 | |
| 		},
 | |
| 		func(clientID, secret, callbackURL string, custom *CustomURLMapping, scopes []string) (goth.Provider, error) {
 | |
| 			return mastodon.NewCustomisedURL(clientID, secret, callbackURL, custom.AuthURL, scopes...), 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)
 | |
| 			}
 | |
| 
 | |
| 			return azureadv2.New(clientID, secret, callbackURL, azureadv2.ProviderOptions{
 | |
| 				Tenant: azureadv2.TenantType(custom.Tenant),
 | |
| 				Scopes: azureScopes,
 | |
| 			}), nil
 | |
| 		},
 | |
| 	))
 | |
| }
 |