|  | @@ -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
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 |