|
@@ -5,6 +5,7 @@
|
|
|
package models
|
|
|
|
|
|
import (
|
|
|
+ "crypto/tls"
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
@@ -133,7 +134,7 @@ func AddSource(source *LoginSource) error {
|
|
|
}
|
|
|
|
|
|
func UpdateSource(source *LoginSource) error {
|
|
|
- _, err := orm.AllCols().Id(source.Id).Update(source)
|
|
|
+ _, err := orm.Id(source.Id).AllCols().Update(source)
|
|
|
return err
|
|
|
}
|
|
|
|
|
@@ -197,7 +198,7 @@ func LoginUser(uname, passwd string) (*User, error) {
|
|
|
if err == nil {
|
|
|
return u, nil
|
|
|
} else {
|
|
|
- log.Warn("try ldap login", source.Name, "by", uname, "error:", err)
|
|
|
+ log.Warn("Fail to login(%s) by LDAP(%s): %v", uname, source.Name, err)
|
|
|
}
|
|
|
} else if source.Type == LT_SMTP {
|
|
|
u, err := LoginUserSMTPSource(nil, uname, passwd,
|
|
@@ -205,7 +206,7 @@ func LoginUser(uname, passwd string) (*User, error) {
|
|
|
if err == nil {
|
|
|
return u, nil
|
|
|
} else {
|
|
|
- log.Warn("try smtp login", source.Name, "by", uname, "error:", err)
|
|
|
+ log.Warn("Fail to login(%s) by SMTP(%s): %v", uname, source.Name, err)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -217,12 +218,9 @@ func LoginUser(uname, passwd string) (*User, error) {
|
|
|
hasSource, err := orm.Id(u.LoginSource).Get(&source)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
- }
|
|
|
- if !hasSource {
|
|
|
+ } else if !hasSource {
|
|
|
return nil, ErrLoginSourceNotExist
|
|
|
- }
|
|
|
-
|
|
|
- if !source.IsActived {
|
|
|
+ } else if !source.IsActived {
|
|
|
return nil, ErrLoginSourceNotActived
|
|
|
}
|
|
|
|
|
@@ -296,20 +294,25 @@ var (
|
|
|
SMTPAuths = []string{SMTP_PLAIN, SMTP_LOGIN}
|
|
|
)
|
|
|
|
|
|
-func SmtpAuth(addr string, a smtp.Auth, tls bool) error {
|
|
|
- c, err := smtp.Dial(addr)
|
|
|
+func SmtpAuth(host string, port int, a smtp.Auth, useTls bool) error {
|
|
|
+ c, err := smtp.Dial(fmt.Sprintf("%s:%d", host, port))
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
defer c.Close()
|
|
|
|
|
|
- if tls {
|
|
|
+ if err = c.Hello("gogs"); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if useTls {
|
|
|
if ok, _ := c.Extension("STARTTLS"); ok {
|
|
|
- if err = c.StartTLS(nil); err != nil {
|
|
|
+ config := &tls.Config{ServerName: host}
|
|
|
+ if err = c.StartTLS(config); err != nil {
|
|
|
return err
|
|
|
}
|
|
|
} else {
|
|
|
- return errors.New("smtp server unsupported tls")
|
|
|
+ return errors.New("SMTP server unsupported TLS")
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -333,11 +336,13 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S
|
|
|
} else if cfg.Auth == SMTP_LOGIN {
|
|
|
auth = LoginAuth(name, passwd)
|
|
|
} else {
|
|
|
- return nil, errors.New("Unsupported smtp auth type")
|
|
|
+ return nil, errors.New("Unsupported SMTP auth type")
|
|
|
}
|
|
|
|
|
|
- err := SmtpAuth(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), auth, cfg.TLS)
|
|
|
- if err != nil {
|
|
|
+ if err := SmtpAuth(cfg.Host, cfg.Port, auth, cfg.TLS); err != nil {
|
|
|
+ if strings.Contains(err.Error(), "Username and Password not accepted") {
|
|
|
+ return nil, ErrUserNotExist
|
|
|
+ }
|
|
|
return nil, err
|
|
|
}
|
|
|
|