diff options
-rw-r--r-- | models/login.go | 23 | ||||
-rw-r--r-- | modules/auth/authentication.go | 27 | ||||
-rw-r--r-- | routers/admin/auths.go | 83 | ||||
-rw-r--r-- | templates/admin/auths/edit.tmpl | 60 | ||||
-rw-r--r-- | templates/admin/auths/new.tmpl | 53 |
5 files changed, 172 insertions, 74 deletions
diff --git a/models/login.go b/models/login.go index 7313726562..fae2ac7609 100644 --- a/models/login.go +++ b/models/login.go @@ -38,6 +38,7 @@ var LoginTypes = map[int]string{ } var _ core.Conversion = &LDAPConfig{} +var _ core.Conversion = &SMTPConfig{} type LDAPConfig struct { ldap.Ldapsource @@ -55,7 +56,7 @@ func (cfg *LDAPConfig) ToDB() ([]byte, error) { type SMTPConfig struct { Auth string Host string - Post string + Port int TLS bool } @@ -122,16 +123,12 @@ func GetLoginSourceById(id int64) (*LoginSource, error) { return source, nil } -func AddLDAPSource(name string, cfg *LDAPConfig) error { - _, err := orm.Insert(&LoginSource{Type: LT_LDAP, - Name: name, - IsActived: true, - Cfg: cfg, - }) +func AddSource(source *LoginSource) error { + _, err := orm.Insert(source) return err } -func UpdateLDAPSource(source *LoginSource) error { +func UpdateSource(source *LoginSource) error { _, err := orm.AllCols().Id(source.Id).Update(source) return err } @@ -293,7 +290,9 @@ func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { } var ( - smtpAuths = []string{"plain", "login", ""} + SMTP_PLAIN = "PLAIN" + SMTP_LOGIN = "LOGIN" + SMTPAuths = []string{SMTP_PLAIN, SMTP_LOGIN} ) func SmtpAuth(addr string, a smtp.Auth) error { @@ -324,13 +323,13 @@ func SmtpAuth(addr string, a smtp.Auth) error { // Return the same LoginUserPlain semantic func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *SMTPConfig, autoRegister bool) (*User, error) { var auth smtp.Auth - if cfg.Auth == "plain" { + if cfg.Auth == SMTP_PLAIN { auth = smtp.PlainAuth("", name, passwd, cfg.Host) - } else if cfg.Auth == "login" { + } else if cfg.Auth == SMTP_LOGIN { auth = LoginAuth(name, passwd) } - err := SmtpAuth(fmt.Sprintf("%s:%d", cfg.Host, cfg.Post), auth) + err := SmtpAuth(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), auth) if err != nil { return nil, err } diff --git a/modules/auth/authentication.go b/modules/auth/authentication.go index 1a5fdcb058..89ccc560f9 100644 --- a/modules/auth/authentication.go +++ b/modules/auth/authentication.go @@ -15,17 +15,22 @@ import ( ) type AuthenticationForm struct { - Id int64 `form:"id"` - Type int `form:"type"` - AuthName string `form:"name" binding:"Required;MaxSize(50)"` - Domain string `form:"domain" binding:"Required"` - Host string `form:"host" binding:"Required"` - Port int `form:"port" binding:"Required"` - BaseDN string `form:"base_dn" binding:"Required"` - Attributes string `form:"attributes" binding:"Required"` - Filter string `form:"filter" binding:"Required"` - MsAdSA string `form:"ms_ad_sa" binding:"Required"` - IsActived bool `form:"is_actived"` + Id int64 `form:"id"` + Type int `form:"type"` + AuthName string `form:"name" binding:"Required;MaxSize(50)"` + Domain string `form:"domain"` + Host string `form:"host"` + Port int `form:"port"` + BaseDN string `form:"base_dn"` + Attributes string `form:"attributes"` + Filter string `form:"filter"` + MsAdSA string `form:"ms_ad_sa"` + IsActived bool `form:"is_actived"` + SmtpAuth string `form:"smtpauth"` + SmtpHost string `form:"smtphost"` + SmtpPort int `form:"smtpport"` + SmtpTls bool `form:"smtptls"` + AllowAutoRegister bool `form:"allowautoregister"` } func (f *AuthenticationForm) Name(field string) string { diff --git a/routers/admin/auths.go b/routers/admin/auths.go index 40318c3d24..c45bbaaba0 100644 --- a/routers/admin/auths.go +++ b/routers/admin/auths.go @@ -5,10 +5,11 @@ package admin import ( + "errors" "strings" "github.com/go-martini/martini" - + "github.com/go-xorm/core" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/auth" "github.com/gogits/gogs/modules/auth/ldap" @@ -21,32 +22,55 @@ func NewAuthSource(ctx *middleware.Context) { ctx.Data["Title"] = "New Authentication" ctx.Data["PageIsAuths"] = true ctx.Data["LoginTypes"] = models.LoginTypes + ctx.Data["SMTPAuths"] = models.SMTPAuths ctx.HTML(200, "admin/auths/new") } func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { ctx.Data["Title"] = "New Authentication" ctx.Data["PageIsAuths"] = true + ctx.Data["LoginTypes"] = models.LoginTypes + ctx.Data["SMTPAuths"] = models.SMTPAuths if ctx.HasError() { ctx.HTML(200, "admin/auths/new") return } - u := &models.LDAPConfig{ - Ldapsource: ldap.Ldapsource{ - Host: form.Host, - Port: form.Port, - BaseDN: form.BaseDN, - Attributes: form.Attributes, - Filter: form.Filter, - MsAdSAFormat: form.MsAdSA, - Enabled: true, - Name: form.AuthName, - }, + var u core.Conversion + if form.Type == models.LT_LDAP { + u = &models.LDAPConfig{ + Ldapsource: ldap.Ldapsource{ + Host: form.Host, + Port: form.Port, + BaseDN: form.BaseDN, + Attributes: form.Attributes, + Filter: form.Filter, + MsAdSAFormat: form.MsAdSA, + Enabled: true, + Name: form.AuthName, + }, + } + } else if form.Type == models.LT_SMTP { + u = &models.SMTPConfig{ + Auth: form.SmtpAuth, + Host: form.SmtpHost, + Port: form.SmtpPort, + TLS: form.SmtpTls, + } + } else { + panic(errors.New("not allow type")) + } + + var source = &models.LoginSource{ + Type: form.Type, + Name: form.AuthName, + IsActived: true, + AllowAutoRegisted: form.AllowAutoRegister, + Cfg: u, } - if err := models.AddLDAPSource(form.AuthName, u); err != nil { + if err := models.AddSource(source); err != nil { switch err { default: ctx.Handle(500, "admin.auths.NewAuth", err) @@ -63,6 +87,9 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { func EditAuthSource(ctx *middleware.Context, params martini.Params) { ctx.Data["Title"] = "Edit Authentication" ctx.Data["PageIsAuths"] = true + ctx.Data["LoginTypes"] = models.LoginTypes + ctx.Data["SMTPAuths"] = models.SMTPAuths + id, err := base.StrTo(params["authid"]).Int64() if err != nil { ctx.Handle(404, "admin.auths.EditAuthSource", err) @@ -74,24 +101,23 @@ func EditAuthSource(ctx *middleware.Context, params martini.Params) { return } ctx.Data["Source"] = u - ctx.Data["LoginTypes"] = models.LoginTypes ctx.HTML(200, "admin/auths/edit") } func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { ctx.Data["Title"] = "Edit Authentication" ctx.Data["PageIsAuths"] = true + ctx.Data["LoginTypes"] = models.LoginTypes + ctx.Data["SMTPAuths"] = models.SMTPAuths if ctx.HasError() { ctx.HTML(200, "admin/auths/edit") return } - u := models.LoginSource{ - Name: form.AuthName, - IsActived: form.IsActived, - Type: models.LT_LDAP, - Cfg: &models.LDAPConfig{ + var config core.Conversion + if form.Type == models.LT_LDAP { + config = &models.LDAPConfig{ Ldapsource: ldap.Ldapsource{ Host: form.Host, Port: form.Port, @@ -102,10 +128,25 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { Enabled: true, Name: form.AuthName, }, - }, + } + } else if form.Type == models.LT_SMTP { + config = &models.SMTPConfig{ + Auth: form.SmtpAuth, + Host: form.SmtpHost, + Port: form.SmtpPort, + TLS: form.SmtpTls, + } + } + + u := models.LoginSource{ + Name: form.AuthName, + IsActived: form.IsActived, + Type: form.Type, + AllowAutoRegisted: form.AllowAutoRegister, + Cfg: config, } - if err := models.UpdateLDAPSource(&u); err != nil { + if err := models.UpdateSource(&u); err != nil { switch err { default: ctx.Handle(500, "admin.auths.EditAuth", err) diff --git a/templates/admin/auths/edit.tmpl b/templates/admin/auths/edit.tmpl index e040ea8f77..56c4db74aa 100644 --- a/templates/admin/auths/edit.tmpl +++ b/templates/admin/auths/edit.tmpl @@ -14,18 +14,16 @@ {{.CsrfTokenHtml}} {{template "base/alert" .}} <input type="hidden" value="{{.Source.Id}}" name="id"/> + {{$type := .Source.Type}} <div class="form-group"> <label class="col-md-3 control-label">Auth Type: </label> + <input type="hidden" name="type" value="{{.Source.Type}}"/> <div class="col-md-7"> - <select class="form-control"> - {{$type := .Source.Type}} - {{range $key, $val := .LoginTypes}} - <option value="{{$key}}" {{if eq $key $type}}selected{{end}}>{{$val}}</option> - {{end}} - </select> + {{range $key, $val := .LoginTypes}} + {{if eq $key $type}}{{$val}}{{end}} + {{end}} </div> </div> - <div class="form-group {{if .Err_AuthName}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Name: </label> <div class="col-md-7"> @@ -33,6 +31,8 @@ </div> </div> + {{if eq $type 2}} + <div class="form-group {{if .Err_Domain}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Domain: </label> <div class="col-md-7"> @@ -81,7 +81,53 @@ <input name="ms_ad_sa" class="form-control" placeholder="Type Ms Ad SA" value="{{.Source.LDAP.MsAdSAFormat}}" required="required"> </div> </div> + {{else}} + {{if eq $type 3}} + + <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">SMTP Auth: </label> + <div class="col-md-7"> + <select name="smtpauth" class="form-control"> + {{$auth := .Source.SMTP.Auth}} + {{range .SMTPAuths}} + <option value="{{.}}" + {{if eq . $auth}} selected{{end}}>{{.}}</option> + {{end}} + } + </select> + </div> + </div> + + <div class="form-group {{if .Err_Host}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">Host: </label> + <div class="col-md-7"> + <input name="smtphost" class="form-control" placeholder="Type host address" value="{{.Source.SMTP.Host}}"> + </div> + </div> + + <div class="form-group {{if .Err_Port}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">Port: </label> + <div class="col-md-7"> + <input name="smtpport" class="form-control" placeholder="Type port number" value="{{.Source.SMTP.Port}}"> + </div> + </div> + + <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">TLS: </label> + <div class="col-md-7"> + <input name="smtptls" type="checkbox" class="form-control" {{if .Source.SMTP.TLS}}checked{{end}}> + </div> + </div> + {{end}} + {{end}} + <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">Auto Register: </label> + <div class="col-md-7"> + <input name="allowautoregister" type="checkbox" class="form-control" {{if .Source.AllowAutoRegisted}}checked{{end}}> + </div> + </div> + <div class="form-group"> <div class="col-md-7 col-md-offset-3"> <div class="checkbox"> diff --git a/templates/admin/auths/new.tmpl b/templates/admin/auths/new.tmpl index 5c0ccccae8..287c996c7f 100644 --- a/templates/admin/auths/new.tmpl +++ b/templates/admin/auths/new.tmpl @@ -16,104 +16,111 @@ <div class="form-group"> <label class="col-md-3 control-label">Auth Type: </label> <div class="col-md-7"> - <select class="form-control" id="auth-type"> + <select name="type" class="form-control" id="auth-type"> {{range $key, $val := .LoginTypes}} <option value="{{$key}}">{{$val}}</option> {{end}} </select> </div> </div> - <div class="ldap"> - <div class="form-group {{if .Err_AuthName}}has-error has-feedback{{end}}"> + <div class="form-group {{if .Err_AuthName}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Name: </label> <div class="col-md-7"> - <input name="name" class="form-control" placeholder="Type authentication's name" value="{{.name}}" required="required"> + <input name="name" class="form-control" placeholder="Type authentication's name" value="{{.name}}"> </div> </div> - + <div class="ldap"> <div class="form-group {{if .Err_Domain}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Domain: </label> <div class="col-md-7"> - <input name="domain" class="form-control" placeholder="Type domain name" value="{{.domain}}" required="required"> + <input name="domain" class="form-control" placeholder="Type domain name" value="{{.domain}}"> </div> </div> <div class="form-group {{if .Err_Host}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Host: </label> <div class="col-md-7"> - <input name="host" class="form-control" placeholder="Type host address" value="{{.host}}" required="required"> + <input name="host" class="form-control" placeholder="Type host address" value="{{.host}}"> </div> </div> <div class="form-group {{if .Err_Port}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Port: </label> <div class="col-md-7"> - <input name="port" class="form-control" placeholder="Type port number" value="{{.port}}" required="required"> + <input name="port" class="form-control" placeholder="Type port number" value="{{.port}}"> </div> </div> <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Base DN: </label> <div class="col-md-7"> - <input name="base_dn" class="form-control" placeholder="Type base DN" value="{{.base_dn}}" required="required"> + <input name="base_dn" class="form-control" placeholder="Type base DN" value="{{.base_dn}}"> </div> </div> <div class="form-group {{if .Err_Attributes}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Search Attributes: </label> <div class="col-md-7"> - <input name="attributes" class="form-control" placeholder="Type search attributes" value="{{.attributes}}" required="required"> + <input name="attributes" class="form-control" placeholder="Type search attributes" value="{{.attributes}}"> </div> </div> <div class="form-group {{if .Err_Filter}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Search Filter: </label> <div class="col-md-7"> - <input name="filter" class="form-control" placeholder="Type search filter" value="{{.filter}}" required="required"> + <input name="filter" class="form-control" placeholder="Type search filter" value="{{.filter}}"> </div> </div> <div class="form-group {{if .Err_MsAdSA}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Ms Ad SA: </label> <div class="col-md-7"> - <input name="ms_ad_sa" class="form-control" placeholder="Type Ms Ad SA" value="{{.ms_ad_sa}}" required="required"> + <input name="ms_ad_sa" class="form-control" placeholder="Type Ms Ad SA" value="{{.ms_ad_sa}}"> </div> </div> </div> <div class="smtp hidden"> + <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">SMTP Auth: </label> + <div class="col-md-7"> + <select name="smtpauth" class="form-control"> + {{range .SMTPAuths}} + <option value="{{.}}">{{.}}</option> + {{end}} + } + </select> + </div> + </div> + <div class="form-group {{if .Err_Host}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Host: </label> <div class="col-md-7"> - <input name="host" class="form-control" placeholder="Type host address" value="{{.host}}" required="required"> + <input name="smtphost" class="form-control" placeholder="Type host address" value="{{.host}}"> </div> </div> <div class="form-group {{if .Err_Port}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">Port: </label> <div class="col-md-7"> - <input name="port" class="form-control" placeholder="Type port number" value="{{.port}}" required="required"> + <input name="smtpport" class="form-control" placeholder="Type port number" value="{{.port}}"> </div> </div> <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> <label class="col-md-3 control-label">TLS: </label> <div class="col-md-7"> - <input name="port" type="checkbox" class="form-control" value="" required="required"> + <input name="smtptls" type="checkbox" class="form-control" value=""> </div> </div> - <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> - <label class="col-md-3 control-label">TLS: </label> + </div> + <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> + <label class="col-md-3 control-label">Auto Register: </label> <div class="col-md-7"> - <select class="form-control"> - <option value="">options</option> - </select> + <input name="allowautoregister" type="checkbox" class="form-control" value=""> </div> </div> - </div> - - <hr/> <div class="form-group"> <div class="col-md-offset-3 col-md-7"> |