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