| @@ -21,6 +21,7 @@ type AuthenticationForm struct { | |||||
| Domain string `form:"domain"` | Domain string `form:"domain"` | ||||
| Host string `form:"host"` | Host string `form:"host"` | ||||
| Port int `form:"port"` | Port int `form:"port"` | ||||
| UseSSL bool `form:"usessl"` | |||||
| BaseDN string `form:"base_dn"` | BaseDN string `form:"base_dn"` | ||||
| Attributes string `form:"attributes"` | Attributes string `form:"attributes"` | ||||
| Filter string `form:"filter"` | Filter string `form:"filter"` | ||||
| @@ -37,6 +38,7 @@ func (f *AuthenticationForm) Name(field string) string { | |||||
| "Domain": "Domain name", | "Domain": "Domain name", | ||||
| "Host": "Host address", | "Host": "Host address", | ||||
| "Port": "Port Number", | "Port": "Port Number", | ||||
| "UseSSL": "Use SSL", | |||||
| "BaseDN": "Base DN", | "BaseDN": "Base DN", | ||||
| "Attributes": "Search attributes", | "Attributes": "Search attributes", | ||||
| "Filter": "Search filter", | "Filter": "Search filter", | ||||
| @@ -18,6 +18,7 @@ type Ldapsource struct { | |||||
| Name string // canonical name (ie. corporate.ad) | Name string // canonical name (ie. corporate.ad) | ||||
| Host string // LDAP host | Host string // LDAP host | ||||
| Port int // port number | Port int // port number | ||||
| UseSSL bool // Use SSL | |||||
| BaseDN string // Base DN | BaseDN string // Base DN | ||||
| Attributes string // Attribut to search | Attributes string // Attribut to search | ||||
| Filter string // Query filter to validate entry | Filter string // Query filter to validate entry | ||||
| @@ -31,8 +32,8 @@ var ( | |||||
| ) | ) | ||||
| // Add a new source (LDAP directory) to the global pool | // Add a new source (LDAP directory) to the global pool | ||||
| func AddSource(name string, host string, port int, basedn string, attributes string, filter string, msadsaformat string) { | |||||
| ldaphost := Ldapsource{name, host, port, basedn, attributes, filter, msadsaformat, true} | |||||
| func AddSource(name string, host string, port int, usessl bool, basedn string, attributes string, filter string, msadsaformat string) { | |||||
| ldaphost := Ldapsource{name, host, port, usessl, basedn, attributes, filter, msadsaformat, true} | |||||
| Authensource = append(Authensource, ldaphost) | Authensource = append(Authensource, ldaphost) | ||||
| } | } | ||||
| @@ -52,7 +53,8 @@ func LoginUser(name, passwd string) (a string, r bool) { | |||||
| // searchEntry : search an LDAP source if an entry (name, passwd) is valide and in the specific filter | // searchEntry : search an LDAP source if an entry (name, passwd) is valide and in the specific filter | ||||
| func (ls Ldapsource) SearchEntry(name, passwd string) (string, bool) { | func (ls Ldapsource) SearchEntry(name, passwd string) (string, bool) { | ||||
| l, err := goldap.Dial("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port)) | |||||
| l, err := ldapDial(ls) | |||||
| if err != nil { | if err != nil { | ||||
| log.Debug("LDAP Connect error, disabled source %s", ls.Host) | log.Debug("LDAP Connect error, disabled source %s", ls.Host) | ||||
| ls.Enabled = false | ls.Enabled = false | ||||
| @@ -85,3 +87,11 @@ func (ls Ldapsource) SearchEntry(name, passwd string) (string, bool) { | |||||
| } | } | ||||
| return "", true | return "", true | ||||
| } | } | ||||
| func ldapDial(ls Ldapsource) (*goldap.Conn, error) { | |||||
| if ls.UseSSL { | |||||
| return goldap.DialTLS("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port), nil) | |||||
| } else { | |||||
| return goldap.Dial("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port)) | |||||
| } | |||||
| } | |||||
| @@ -195,11 +195,12 @@ func newLdapService() { | |||||
| ldapname := Cfg.MustValue(v, "name", v) | ldapname := Cfg.MustValue(v, "name", v) | ||||
| ldaphost := Cfg.MustValue(v, "host") | ldaphost := Cfg.MustValue(v, "host") | ||||
| ldapport := Cfg.MustInt(v, "port", 389) | ldapport := Cfg.MustInt(v, "port", 389) | ||||
| ldapusessl := Cfg.MustBool(v, "usessl", false) | |||||
| ldapbasedn := Cfg.MustValue(v, "basedn", "dc=*,dc=*") | ldapbasedn := Cfg.MustValue(v, "basedn", "dc=*,dc=*") | ||||
| ldapattribute := Cfg.MustValue(v, "attribute", "mail") | ldapattribute := Cfg.MustValue(v, "attribute", "mail") | ||||
| ldapfilter := Cfg.MustValue(v, "filter", "(*)") | ldapfilter := Cfg.MustValue(v, "filter", "(*)") | ||||
| ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") | ldapmsadsaformat := Cfg.MustValue(v, "MSADSAFORMAT", "%s") | ||||
| ldap.AddSource(ldapname, ldaphost, ldapport, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) | |||||
| ldap.AddSource(ldapname, ldaphost, ldapport, ldapusessl, ldapbasedn, ldapattribute, ldapfilter, ldapmsadsaformat) | |||||
| nbsrc++ | nbsrc++ | ||||
| log.Debug("%s added as LDAP source", ldapname) | log.Debug("%s added as LDAP source", ldapname) | ||||
| } | } | ||||
| @@ -44,6 +44,7 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { | |||||
| Ldapsource: ldap.Ldapsource{ | Ldapsource: ldap.Ldapsource{ | ||||
| Host: form.Host, | Host: form.Host, | ||||
| Port: form.Port, | Port: form.Port, | ||||
| UseSSL: form.UseSSL, | |||||
| BaseDN: form.BaseDN, | BaseDN: form.BaseDN, | ||||
| Attributes: form.Attributes, | Attributes: form.Attributes, | ||||
| Filter: form.Filter, | Filter: form.Filter, | ||||
| @@ -121,6 +122,7 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { | |||||
| Ldapsource: ldap.Ldapsource{ | Ldapsource: ldap.Ldapsource{ | ||||
| Host: form.Host, | Host: form.Host, | ||||
| Port: form.Port, | Port: form.Port, | ||||
| UseSSL: form.UseSSL, | |||||
| BaseDN: form.BaseDN, | BaseDN: form.BaseDN, | ||||
| Attributes: form.Attributes, | Attributes: form.Attributes, | ||||
| Filter: form.Filter, | Filter: form.Filter, | ||||
| @@ -53,6 +53,14 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="form-group {{if .Err_UseSSL}}has-error has-feedback{{end}}"> | |||||
| <label class="col-md-3 control-label">Use SSL: </label> | |||||
| <div class="col-md-7"> | |||||
| <input name="usessl" class="form-control" type="checkbox" {{if .Source.LDAP.UseSSL}}checked{{end}}> | |||||
| </div> | |||||
| </div> | |||||
| <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> | <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> | ||||
| <label class="col-md-3 control-label">Base DN: </label> | <label class="col-md-3 control-label">Base DN: </label> | ||||
| <div class="col-md-7"> | <div class="col-md-7"> | ||||
| @@ -147,4 +155,4 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{template "base/footer" .}} | |||||
| {{template "base/footer" .}} | |||||
| @@ -51,6 +51,13 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="form-group {{if .Err_UseSSL}}has-error has-feedback{{end}}"> | |||||
| <label class="col-md-3 control-label">Use SSL: </label> | |||||
| <div class="col-md-7"> | |||||
| <input name="usessl" class="form-control" type="checkbox" {{if .usessl}}checked{{end}}> | |||||
| </div> | |||||
| </div> | |||||
| <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> | <div class="form-group {{if .Err_BaseDN}}has-error has-feedback{{end}}"> | ||||
| <label class="col-md-3 control-label">Base DN: </label> | <label class="col-md-3 control-label">Base DN: </label> | ||||
| <div class="col-md-7"> | <div class="col-md-7"> | ||||
| @@ -158,4 +165,4 @@ | |||||
| }); | }); | ||||
| }); | }); | ||||
| </script> | </script> | ||||
| {{template "base/footer" .}} | |||||
| {{template "base/footer" .}} | |||||