Prechádzať zdrojové kódy

add support for smtp authentication

Lunny Xiao 10 rokov pred
rodič
commit
bf58679390

+ 11 - 12
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
 	}

+ 16 - 11
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 {

+ 62 - 21
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)

+ 53 - 7
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">

+ 30 - 23
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">