@@ -18,10 +18,13 @@ import (
1818 "github.com/go-macaron/binding"
1919 "github.com/go-xorm/core"
2020 "github.com/go-xorm/xorm"
21+ "github.com/yohcop/openid-go"
22+ //"github.com/akavel/go-openid"
2123
2224 "code.gitea.io/gitea/modules/auth/ldap"
2325 "code.gitea.io/gitea/modules/auth/pam"
2426 "code.gitea.io/gitea/modules/log"
27+ "code.gitea.io/gitea/modules/setting"
2528)
2629
2730// LoginType represents an login type.
@@ -35,14 +38,16 @@ const (
3538 LoginSMTP // 3
3639 LoginPAM // 4
3740 LoginDLDAP // 5
41+ LoginOpenID // 6
3842)
3943
4044// LoginNames contains the name of LoginType values.
4145var LoginNames = map [LoginType ]string {
42- LoginLDAP : "LDAP (via BindDN)" ,
43- LoginDLDAP : "LDAP (simple auth)" , // Via direct bind
44- LoginSMTP : "SMTP" ,
45- LoginPAM : "PAM" ,
46+ LoginLDAP : "LDAP (via BindDN)" ,
47+ LoginDLDAP : "LDAP (simple auth)" , // Via direct bind
48+ LoginSMTP : "SMTP" ,
49+ LoginPAM : "PAM" ,
50+ LoginOpenID : "OpenID" ,
4651}
4752
4853// SecurityProtocolNames contains the name of SecurityProtocol values.
5762 _ core.Conversion = & LDAPConfig {}
5863 _ core.Conversion = & SMTPConfig {}
5964 _ core.Conversion = & PAMConfig {}
65+ _ core.Conversion = & OpenIDConfig {}
6066)
6167
6268// LDAPConfig holds configuration for LDAP login source.
@@ -80,6 +86,21 @@ func (cfg *LDAPConfig) SecurityProtocolName() string {
8086 return SecurityProtocolNames [cfg .SecurityProtocol ]
8187}
8288
89+ // OpenIDConfig holds an OpenID login source configuration.
90+ type OpenIDConfig struct {
91+ //*openid.Source
92+ }
93+
94+ // FromDB fills up an OpenIDConfig from serialized format.
95+ func (cfg * OpenIDConfig ) FromDB (bs []byte ) error {
96+ return json .Unmarshal (bs , & cfg )
97+ }
98+
99+ // ToDB exports an OpenIDConfig to a serialized format.
100+ func (cfg * OpenIDConfig ) ToDB () ([]byte , error ) {
101+ return json .Marshal (cfg )
102+ }
103+
83104// SMTPConfig holds configuration for the SMTP login source.
84105type SMTPConfig struct {
85106 Auth string
@@ -162,6 +183,8 @@ func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
162183 source .Cfg = new (SMTPConfig )
163184 case LoginPAM :
164185 source .Cfg = new (PAMConfig )
186+ case LoginOpenID :
187+ source .Cfg = new (OpenIDConfig )
165188 default :
166189 panic ("unrecognized login source type: " + com .ToStr (* val ))
167190 }
@@ -526,6 +549,54 @@ func LoginViaPAM(user *User, login, password string, sourceID int64, cfg *PAMCon
526549 return user , CreateUser (user )
527550}
528551
552+ // ________ .___________
553+ // \_____ \ ______ ____ ____ | \______ \
554+ // / | \\____ \_/ __ \ / \| || | \
555+ // / | \ |_> > ___/| | \ || ` \
556+ // \_______ / __/ \___ >___| /___/_______ /
557+ // \/|__| \/ \/ \/
558+
559+ // LoginViaOpenID authorizes against "id" (openid URL)
560+ // and create a local user if success when enabled.
561+ func LoginViaOpenID (user * User , id string , source * LoginSource , autoRegister bool ) (* User , error ) {
562+
563+ url , err := openid .RedirectURL (id , setting .AppURL + "user/login/openid/verify" , setting .AppURL )
564+ if err != nil {
565+ return nil , err
566+ }
567+ return nil , ErrDelegatedAuth {OP : url }
568+ }
569+
570+ var nonceStore = openid .NewSimpleNonceStore ()
571+ var discoveryCache = openid .NewSimpleDiscoveryCache ()
572+
573+ // LoginViaOpenIDVerification verifies a given OpenID url.
574+ func LoginViaOpenIDVerification (url string , autoRegister bool ) (* User , error ) {
575+
576+ var id , err = openid .Verify (url , discoveryCache , nonceStore )
577+ if err != nil {
578+ log .Fatal (1 , "Error verifying: %v" , err )
579+ }
580+ log .Trace ("Verified ID: " + id )
581+
582+ /*
583+ login := id
584+
585+ user = &User{
586+ LowerName: strings.ToLower(login),
587+ Name: login,
588+ Email: login,
589+ Passwd: nil,
590+ LoginType: LoginOpenID,
591+ LoginSource: sourceID,
592+ LoginName: login,
593+ IsActive: true,
594+ }
595+ return user, CreateUser(user)
596+ */
597+ return nil , nil
598+ }
599+
529600// ExternalUserLogin attempts a login using external source types.
530601func ExternalUserLogin (user * User , login , password string , source * LoginSource , autoRegister bool ) (* User , error ) {
531602 if ! source .IsActived {
@@ -539,6 +610,8 @@ func ExternalUserLogin(user *User, login, password string, source *LoginSource,
539610 return LoginViaSMTP (user , login , password , source .ID , source .Cfg .(* SMTPConfig ), autoRegister )
540611 case LoginPAM :
541612 return LoginViaPAM (user , login , password , source .ID , source .Cfg .(* PAMConfig ), autoRegister )
613+ case LoginOpenID :
614+ return LoginViaOpenID (user , login , source , autoRegister )
542615 }
543616
544617 return nil , ErrUnsupportedLoginType
@@ -549,6 +622,8 @@ func UserSignIn(username, password string) (*User, error) {
549622 var user * User
550623 if strings .Contains (username , "@" ) {
551624 user = & User {Email : strings .ToLower (strings .TrimSpace (username ))}
625+ } else if strings .Contains (username , "://" ) {
626+ user = & User {OpenID : strings .ToLower (username )}
552627 } else {
553628 user = & User {LowerName : strings .ToLower (strings .TrimSpace (username ))}
554629 }
@@ -580,7 +655,7 @@ func UserSignIn(username, password string) (*User, error) {
580655 }
581656 }
582657
583- sources := make ([]* LoginSource , 0 , 3 )
658+ sources := make ([]* LoginSource , 0 , 4 )
584659 if err = x .UseBool ().Find (& sources , & LoginSource {IsActived : true }); err != nil {
585660 return nil , err
586661 }
@@ -590,6 +665,9 @@ func UserSignIn(username, password string) (*User, error) {
590665 if err == nil {
591666 return authUser , nil
592667 }
668+ if IsErrDelegatedAuth (err ) {
669+ return nil , err
670+ }
593671
594672 log .Warn ("Failed to login '%s' via '%s': %v" , username , source .Name , err )
595673 }
0 commit comments