mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Refactor: Move login out of models (#16199)
`models` does far too much. In particular it handles all `UserSignin`. It shouldn't be responsible for calling LDAP, SMTP or PAM for signing in. Therefore we should move this code out of `models`. This code has to depend on `models` - therefore it belongs in `services`. There is a package in `services` called `auth` and clearly this functionality belongs in there. Plan: - [x] Change `auth.Auth` to `auth.Method` - as they represent methods of authentication. - [x] Move `models.UserSignIn` into `auth` - [x] Move `models.ExternalUserLogin` - [x] Move most of the `LoginVia*` methods to `auth` or subpackages - [x] Move Resynchronize functionality to `auth` - Involved some restructuring of `models/ssh_key.go` to reduce the size of this massive file and simplify its files. - [x] Move the rest of the LDAP functionality in to the ldap subpackage - [x] Re-factor the login sources to express an interfaces `auth.Source`? - I've done this through some smaller interfaces Authenticator and Synchronizable - which would allow us to extend things in future - [x] Now LDAP is out of models - need to think about modules/auth/ldap and I think all of that functionality might just be moveable - [x] Similarly a lot Oauth2 functionality need not be in models too and should be moved to services/auth/source/oauth2 - [x] modules/auth/oauth2/oauth2.go uses xorm... This is naughty - probably need to move this into models. - [x] models/oauth2.go - mostly should be in modules/auth/oauth2 or services/auth/source/oauth2 - [x] More simplifications of login_source.go may need to be done - Allow wiring in of notify registration - *this can now easily be done - but I think we should do it in another PR* - see #16178 - More refactors...? - OpenID should probably become an auth Method but I think that can be left for another PR - Methods should also probably be cleaned up - again another PR I think. - SSPI still needs more refactors.* Rename auth.Auth auth.Method * Restructure ssh_key.go - move functions from models/user.go that relate to ssh_key to ssh_key - split ssh_key.go to try create clearer function domains for allow for future refactors here. Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		@@ -11,8 +11,6 @@ import (
 | 
			
		||||
	"regexp"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/auth/ldap"
 | 
			
		||||
	"code.gitea.io/gitea/modules/auth/oauth2"
 | 
			
		||||
	"code.gitea.io/gitea/modules/auth/pam"
 | 
			
		||||
	"code.gitea.io/gitea/modules/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
@@ -20,6 +18,11 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	"code.gitea.io/gitea/modules/web"
 | 
			
		||||
	"code.gitea.io/gitea/services/auth/source/ldap"
 | 
			
		||||
	"code.gitea.io/gitea/services/auth/source/oauth2"
 | 
			
		||||
	pamService "code.gitea.io/gitea/services/auth/source/pam"
 | 
			
		||||
	"code.gitea.io/gitea/services/auth/source/smtp"
 | 
			
		||||
	"code.gitea.io/gitea/services/auth/source/sspi"
 | 
			
		||||
	"code.gitea.io/gitea/services/forms"
 | 
			
		||||
 | 
			
		||||
	"xorm.io/xorm/convert"
 | 
			
		||||
@@ -74,9 +77,9 @@ var (
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	securityProtocols = []dropdownItem{
 | 
			
		||||
		{models.SecurityProtocolNames[ldap.SecurityProtocolUnencrypted], ldap.SecurityProtocolUnencrypted},
 | 
			
		||||
		{models.SecurityProtocolNames[ldap.SecurityProtocolLDAPS], ldap.SecurityProtocolLDAPS},
 | 
			
		||||
		{models.SecurityProtocolNames[ldap.SecurityProtocolStartTLS], ldap.SecurityProtocolStartTLS},
 | 
			
		||||
		{ldap.SecurityProtocolNames[ldap.SecurityProtocolUnencrypted], ldap.SecurityProtocolUnencrypted},
 | 
			
		||||
		{ldap.SecurityProtocolNames[ldap.SecurityProtocolLDAPS], ldap.SecurityProtocolLDAPS},
 | 
			
		||||
		{ldap.SecurityProtocolNames[ldap.SecurityProtocolStartTLS], ldap.SecurityProtocolStartTLS},
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -88,15 +91,15 @@ func NewAuthSource(ctx *context.Context) {
 | 
			
		||||
 | 
			
		||||
	ctx.Data["type"] = models.LoginLDAP
 | 
			
		||||
	ctx.Data["CurrentTypeName"] = models.LoginNames[models.LoginLDAP]
 | 
			
		||||
	ctx.Data["CurrentSecurityProtocol"] = models.SecurityProtocolNames[ldap.SecurityProtocolUnencrypted]
 | 
			
		||||
	ctx.Data["CurrentSecurityProtocol"] = ldap.SecurityProtocolNames[ldap.SecurityProtocolUnencrypted]
 | 
			
		||||
	ctx.Data["smtp_auth"] = "PLAIN"
 | 
			
		||||
	ctx.Data["is_active"] = true
 | 
			
		||||
	ctx.Data["is_sync_enabled"] = true
 | 
			
		||||
	ctx.Data["AuthSources"] = authSources
 | 
			
		||||
	ctx.Data["SecurityProtocols"] = securityProtocols
 | 
			
		||||
	ctx.Data["SMTPAuths"] = models.SMTPAuths
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = models.OAuth2Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = models.OAuth2DefaultCustomURLMappings
 | 
			
		||||
	ctx.Data["SMTPAuths"] = smtp.Authenticators
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = oauth2.Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = oauth2.DefaultCustomURLMappings
 | 
			
		||||
 | 
			
		||||
	ctx.Data["SSPIAutoCreateUsers"] = true
 | 
			
		||||
	ctx.Data["SSPIAutoActivateUsers"] = true
 | 
			
		||||
@@ -105,7 +108,7 @@ func NewAuthSource(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["SSPIDefaultLanguage"] = ""
 | 
			
		||||
 | 
			
		||||
	// only the first as default
 | 
			
		||||
	for key := range models.OAuth2Providers {
 | 
			
		||||
	for key := range oauth2.Providers {
 | 
			
		||||
		ctx.Data["oauth2_provider"] = key
 | 
			
		||||
		break
 | 
			
		||||
	}
 | 
			
		||||
@@ -113,45 +116,43 @@ func NewAuthSource(ctx *context.Context) {
 | 
			
		||||
	ctx.HTML(http.StatusOK, tplAuthNew)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseLDAPConfig(form forms.AuthenticationForm) *models.LDAPConfig {
 | 
			
		||||
func parseLDAPConfig(form forms.AuthenticationForm) *ldap.Source {
 | 
			
		||||
	var pageSize uint32
 | 
			
		||||
	if form.UsePagedSearch {
 | 
			
		||||
		pageSize = uint32(form.SearchPageSize)
 | 
			
		||||
	}
 | 
			
		||||
	return &models.LDAPConfig{
 | 
			
		||||
		Source: &ldap.Source{
 | 
			
		||||
			Name:                  form.Name,
 | 
			
		||||
			Host:                  form.Host,
 | 
			
		||||
			Port:                  form.Port,
 | 
			
		||||
			SecurityProtocol:      ldap.SecurityProtocol(form.SecurityProtocol),
 | 
			
		||||
			SkipVerify:            form.SkipVerify,
 | 
			
		||||
			BindDN:                form.BindDN,
 | 
			
		||||
			UserDN:                form.UserDN,
 | 
			
		||||
			BindPassword:          form.BindPassword,
 | 
			
		||||
			UserBase:              form.UserBase,
 | 
			
		||||
			AttributeUsername:     form.AttributeUsername,
 | 
			
		||||
			AttributeName:         form.AttributeName,
 | 
			
		||||
			AttributeSurname:      form.AttributeSurname,
 | 
			
		||||
			AttributeMail:         form.AttributeMail,
 | 
			
		||||
			AttributesInBind:      form.AttributesInBind,
 | 
			
		||||
			AttributeSSHPublicKey: form.AttributeSSHPublicKey,
 | 
			
		||||
			SearchPageSize:        pageSize,
 | 
			
		||||
			Filter:                form.Filter,
 | 
			
		||||
			GroupsEnabled:         form.GroupsEnabled,
 | 
			
		||||
			GroupDN:               form.GroupDN,
 | 
			
		||||
			GroupFilter:           form.GroupFilter,
 | 
			
		||||
			GroupMemberUID:        form.GroupMemberUID,
 | 
			
		||||
			UserUID:               form.UserUID,
 | 
			
		||||
			AdminFilter:           form.AdminFilter,
 | 
			
		||||
			RestrictedFilter:      form.RestrictedFilter,
 | 
			
		||||
			AllowDeactivateAll:    form.AllowDeactivateAll,
 | 
			
		||||
			Enabled:               true,
 | 
			
		||||
		},
 | 
			
		||||
	return &ldap.Source{
 | 
			
		||||
		Name:                  form.Name,
 | 
			
		||||
		Host:                  form.Host,
 | 
			
		||||
		Port:                  form.Port,
 | 
			
		||||
		SecurityProtocol:      ldap.SecurityProtocol(form.SecurityProtocol),
 | 
			
		||||
		SkipVerify:            form.SkipVerify,
 | 
			
		||||
		BindDN:                form.BindDN,
 | 
			
		||||
		UserDN:                form.UserDN,
 | 
			
		||||
		BindPassword:          form.BindPassword,
 | 
			
		||||
		UserBase:              form.UserBase,
 | 
			
		||||
		AttributeUsername:     form.AttributeUsername,
 | 
			
		||||
		AttributeName:         form.AttributeName,
 | 
			
		||||
		AttributeSurname:      form.AttributeSurname,
 | 
			
		||||
		AttributeMail:         form.AttributeMail,
 | 
			
		||||
		AttributesInBind:      form.AttributesInBind,
 | 
			
		||||
		AttributeSSHPublicKey: form.AttributeSSHPublicKey,
 | 
			
		||||
		SearchPageSize:        pageSize,
 | 
			
		||||
		Filter:                form.Filter,
 | 
			
		||||
		GroupsEnabled:         form.GroupsEnabled,
 | 
			
		||||
		GroupDN:               form.GroupDN,
 | 
			
		||||
		GroupFilter:           form.GroupFilter,
 | 
			
		||||
		GroupMemberUID:        form.GroupMemberUID,
 | 
			
		||||
		UserUID:               form.UserUID,
 | 
			
		||||
		AdminFilter:           form.AdminFilter,
 | 
			
		||||
		RestrictedFilter:      form.RestrictedFilter,
 | 
			
		||||
		AllowDeactivateAll:    form.AllowDeactivateAll,
 | 
			
		||||
		Enabled:               true,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseSMTPConfig(form forms.AuthenticationForm) *models.SMTPConfig {
 | 
			
		||||
	return &models.SMTPConfig{
 | 
			
		||||
func parseSMTPConfig(form forms.AuthenticationForm) *smtp.Source {
 | 
			
		||||
	return &smtp.Source{
 | 
			
		||||
		Auth:           form.SMTPAuth,
 | 
			
		||||
		Host:           form.SMTPHost,
 | 
			
		||||
		Port:           form.SMTPPort,
 | 
			
		||||
@@ -161,7 +162,7 @@ func parseSMTPConfig(form forms.AuthenticationForm) *models.SMTPConfig {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseOAuth2Config(form forms.AuthenticationForm) *models.OAuth2Config {
 | 
			
		||||
func parseOAuth2Config(form forms.AuthenticationForm) *oauth2.Source {
 | 
			
		||||
	var customURLMapping *oauth2.CustomURLMapping
 | 
			
		||||
	if form.Oauth2UseCustomURL {
 | 
			
		||||
		customURLMapping = &oauth2.CustomURLMapping{
 | 
			
		||||
@@ -173,7 +174,7 @@ func parseOAuth2Config(form forms.AuthenticationForm) *models.OAuth2Config {
 | 
			
		||||
	} else {
 | 
			
		||||
		customURLMapping = nil
 | 
			
		||||
	}
 | 
			
		||||
	return &models.OAuth2Config{
 | 
			
		||||
	return &oauth2.Source{
 | 
			
		||||
		Provider:                      form.Oauth2Provider,
 | 
			
		||||
		ClientID:                      form.Oauth2Key,
 | 
			
		||||
		ClientSecret:                  form.Oauth2Secret,
 | 
			
		||||
@@ -183,7 +184,7 @@ func parseOAuth2Config(form forms.AuthenticationForm) *models.OAuth2Config {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseSSPIConfig(ctx *context.Context, form forms.AuthenticationForm) (*models.SSPIConfig, error) {
 | 
			
		||||
func parseSSPIConfig(ctx *context.Context, form forms.AuthenticationForm) (*sspi.Source, error) {
 | 
			
		||||
	if util.IsEmptyString(form.SSPISeparatorReplacement) {
 | 
			
		||||
		ctx.Data["Err_SSPISeparatorReplacement"] = true
 | 
			
		||||
		return nil, errors.New(ctx.Tr("form.SSPISeparatorReplacement") + ctx.Tr("form.require_error"))
 | 
			
		||||
@@ -198,7 +199,7 @@ func parseSSPIConfig(ctx *context.Context, form forms.AuthenticationForm) (*mode
 | 
			
		||||
		return nil, errors.New(ctx.Tr("form.lang_select_error"))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &models.SSPIConfig{
 | 
			
		||||
	return &sspi.Source{
 | 
			
		||||
		AutoCreateUsers:      form.SSPIAutoCreateUsers,
 | 
			
		||||
		AutoActivateUsers:    form.SSPIAutoActivateUsers,
 | 
			
		||||
		StripDomainNames:     form.SSPIStripDomainNames,
 | 
			
		||||
@@ -215,12 +216,12 @@ func NewAuthSourcePost(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["PageIsAdminAuthentications"] = true
 | 
			
		||||
 | 
			
		||||
	ctx.Data["CurrentTypeName"] = models.LoginNames[models.LoginType(form.Type)]
 | 
			
		||||
	ctx.Data["CurrentSecurityProtocol"] = models.SecurityProtocolNames[ldap.SecurityProtocol(form.SecurityProtocol)]
 | 
			
		||||
	ctx.Data["CurrentSecurityProtocol"] = ldap.SecurityProtocolNames[ldap.SecurityProtocol(form.SecurityProtocol)]
 | 
			
		||||
	ctx.Data["AuthSources"] = authSources
 | 
			
		||||
	ctx.Data["SecurityProtocols"] = securityProtocols
 | 
			
		||||
	ctx.Data["SMTPAuths"] = models.SMTPAuths
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = models.OAuth2Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = models.OAuth2DefaultCustomURLMappings
 | 
			
		||||
	ctx.Data["SMTPAuths"] = smtp.Authenticators
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = oauth2.Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = oauth2.DefaultCustomURLMappings
 | 
			
		||||
 | 
			
		||||
	ctx.Data["SSPIAutoCreateUsers"] = true
 | 
			
		||||
	ctx.Data["SSPIAutoActivateUsers"] = true
 | 
			
		||||
@@ -238,7 +239,7 @@ func NewAuthSourcePost(ctx *context.Context) {
 | 
			
		||||
		config = parseSMTPConfig(form)
 | 
			
		||||
		hasTLS = true
 | 
			
		||||
	case models.LoginPAM:
 | 
			
		||||
		config = &models.PAMConfig{
 | 
			
		||||
		config = &pamService.Source{
 | 
			
		||||
			ServiceName: form.PAMServiceName,
 | 
			
		||||
			EmailDomain: form.PAMEmailDomain,
 | 
			
		||||
		}
 | 
			
		||||
@@ -271,7 +272,7 @@ func NewAuthSourcePost(ctx *context.Context) {
 | 
			
		||||
	if err := models.CreateLoginSource(&models.LoginSource{
 | 
			
		||||
		Type:          models.LoginType(form.Type),
 | 
			
		||||
		Name:          form.Name,
 | 
			
		||||
		IsActived:     form.IsActive,
 | 
			
		||||
		IsActive:      form.IsActive,
 | 
			
		||||
		IsSyncEnabled: form.IsSyncEnabled,
 | 
			
		||||
		Cfg:           config,
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
@@ -297,9 +298,9 @@ func EditAuthSource(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["PageIsAdminAuthentications"] = true
 | 
			
		||||
 | 
			
		||||
	ctx.Data["SecurityProtocols"] = securityProtocols
 | 
			
		||||
	ctx.Data["SMTPAuths"] = models.SMTPAuths
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = models.OAuth2Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = models.OAuth2DefaultCustomURLMappings
 | 
			
		||||
	ctx.Data["SMTPAuths"] = smtp.Authenticators
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = oauth2.Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = oauth2.DefaultCustomURLMappings
 | 
			
		||||
 | 
			
		||||
	source, err := models.GetLoginSourceByID(ctx.ParamsInt64(":authid"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -310,7 +311,7 @@ func EditAuthSource(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["HasTLS"] = source.HasTLS()
 | 
			
		||||
 | 
			
		||||
	if source.IsOAuth2() {
 | 
			
		||||
		ctx.Data["CurrentOAuth2Provider"] = models.OAuth2Providers[source.OAuth2().Provider]
 | 
			
		||||
		ctx.Data["CurrentOAuth2Provider"] = oauth2.Providers[source.Cfg.(*oauth2.Source).Provider]
 | 
			
		||||
	}
 | 
			
		||||
	ctx.HTML(http.StatusOK, tplAuthEdit)
 | 
			
		||||
}
 | 
			
		||||
@@ -322,9 +323,9 @@ func EditAuthSourcePost(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["PageIsAdmin"] = true
 | 
			
		||||
	ctx.Data["PageIsAdminAuthentications"] = true
 | 
			
		||||
 | 
			
		||||
	ctx.Data["SMTPAuths"] = models.SMTPAuths
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = models.OAuth2Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = models.OAuth2DefaultCustomURLMappings
 | 
			
		||||
	ctx.Data["SMTPAuths"] = smtp.Authenticators
 | 
			
		||||
	ctx.Data["OAuth2Providers"] = oauth2.Providers
 | 
			
		||||
	ctx.Data["OAuth2DefaultCustomURLMappings"] = oauth2.DefaultCustomURLMappings
 | 
			
		||||
 | 
			
		||||
	source, err := models.GetLoginSourceByID(ctx.ParamsInt64(":authid"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -346,7 +347,7 @@ func EditAuthSourcePost(ctx *context.Context) {
 | 
			
		||||
	case models.LoginSMTP:
 | 
			
		||||
		config = parseSMTPConfig(form)
 | 
			
		||||
	case models.LoginPAM:
 | 
			
		||||
		config = &models.PAMConfig{
 | 
			
		||||
		config = &pamService.Source{
 | 
			
		||||
			ServiceName: form.PAMServiceName,
 | 
			
		||||
			EmailDomain: form.PAMEmailDomain,
 | 
			
		||||
		}
 | 
			
		||||
@@ -364,7 +365,7 @@ func EditAuthSourcePost(ctx *context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	source.Name = form.Name
 | 
			
		||||
	source.IsActived = form.IsActive
 | 
			
		||||
	source.IsActive = form.IsActive
 | 
			
		||||
	source.IsSyncEnabled = form.IsSyncEnabled
 | 
			
		||||
	source.Cfg = config
 | 
			
		||||
	if err := models.UpdateSource(source); err != nil {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user