| @@ -148,10 +148,8 @@ func DelLoginSource(source *LoginSource) error { | |||
| // login a user | |||
| func LoginUser(uname, passwd string) (*User, error) { | |||
| var u *User | |||
| var emailLogin bool | |||
| if strings.Contains(uname, "@") { | |||
| u = &User{Email: uname} | |||
| emailLogin = true | |||
| } else { | |||
| u = &User{LowerName: strings.ToLower(uname)} | |||
| } | |||
| @@ -161,14 +159,10 @@ func LoginUser(uname, passwd string) (*User, error) { | |||
| return nil, err | |||
| } | |||
| // if email login, then we cannot auto register | |||
| if emailLogin { | |||
| if !has { | |||
| return nil, ErrUserNotExist | |||
| } | |||
| } | |||
| if u.LoginType == LT_NOTYPE { | |||
| u.LoginType = LT_PLAIN | |||
| if has { | |||
| u.LoginType = LT_PLAIN | |||
| } | |||
| } | |||
| // for plain login, user must have existed. | |||
| @@ -194,13 +188,13 @@ func LoginUser(uname, passwd string) (*User, error) { | |||
| for _, source := range sources { | |||
| if source.Type == LT_LDAP { | |||
| u, err := LoginUserLdapSource(nil, u.LoginName, passwd, | |||
| u, err := LoginUserLdapSource(nil, uname, passwd, | |||
| source.Id, source.Cfg.(*LDAPConfig), true) | |||
| if err == nil { | |||
| return u, err | |||
| } | |||
| } else if source.Type == LT_SMTP { | |||
| u, err := LoginUserSMTPSource(nil, u.LoginName, passwd, | |||
| u, err := LoginUserSMTPSource(nil, uname, passwd, | |||
| source.Id, source.Cfg.(*SMTPConfig), true) | |||
| if err == nil { | |||
| @@ -295,16 +289,20 @@ var ( | |||
| SMTPAuths = []string{SMTP_PLAIN, SMTP_LOGIN} | |||
| ) | |||
| func SmtpAuth(addr string, a smtp.Auth) error { | |||
| func SmtpAuth(addr string, a smtp.Auth, tls bool) error { | |||
| c, err := smtp.Dial(addr) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| defer c.Close() | |||
| if ok, _ := c.Extension("STARTTLS"); ok { | |||
| if err = c.StartTLS(nil); err != nil { | |||
| return err | |||
| if tls { | |||
| if ok, _ := c.Extension("STARTTLS"); ok { | |||
| if err = c.StartTLS(nil); err != nil { | |||
| return err | |||
| } | |||
| } else { | |||
| return errors.New("smtp server unsupported tls") | |||
| } | |||
| } | |||
| @@ -327,9 +325,11 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S | |||
| auth = smtp.PlainAuth("", name, passwd, cfg.Host) | |||
| } else if cfg.Auth == SMTP_LOGIN { | |||
| auth = LoginAuth(name, passwd) | |||
| } else { | |||
| return nil, errors.New("Unsupported smtp auth type") | |||
| } | |||
| err := SmtpAuth(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), auth) | |||
| err := SmtpAuth(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), auth, cfg.TLS) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| @@ -338,10 +338,15 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S | |||
| return user, nil | |||
| } | |||
| var loginName = name | |||
| idx := strings.Index(name, "@") | |||
| if idx > -1 { | |||
| loginName = name[:idx] | |||
| } | |||
| // fake a local user creation | |||
| user = &User{ | |||
| LowerName: strings.ToLower(name), | |||
| Name: strings.ToLower(name), | |||
| LowerName: strings.ToLower(loginName), | |||
| Name: strings.ToLower(loginName), | |||
| LoginType: LT_SMTP, | |||
| LoginSource: sourceId, | |||
| LoginName: name, | |||