| @@ -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 | |||
| } | |||
| @@ -34,7 +34,7 @@ var ( | |||
| ErrUserNameIllegal = errors.New("User name contains illegal characters") | |||
| ErrLoginSourceNotExist = errors.New("Login source does not exist") | |||
| ErrLoginSourceNotActived = errors.New("Login source is not actived") | |||
| ErrUnsupportedLoginType = errors.New("Login source is unknow") | |||
| ErrUnsupportedLoginType = errors.New("Login source is unknown") | |||
| ) | |||
| // User represents the object of individual and member of organization. | |||
| @@ -72,16 +72,14 @@ func Send(msg *Message) (int, error) { | |||
| // get message body | |||
| content := msg.Content() | |||
| auth := smtp.PlainAuth("", base.MailService.User, base.MailService.Passwd, host[0]) | |||
| if len(msg.To) == 0 { | |||
| return 0, fmt.Errorf("empty receive emails") | |||
| } | |||
| if len(msg.Body) == 0 { | |||
| } else if len(msg.Body) == 0 { | |||
| return 0, fmt.Errorf("empty email body") | |||
| } | |||
| auth := smtp.PlainAuth("", base.MailService.User, base.MailService.Passwd, host[0]) | |||
| if msg.Massive { | |||
| // send mail to multiple emails one by one | |||
| num := 0 | |||
| @@ -158,7 +158,7 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) { | |||
| } | |||
| log.Trace("%s Authentication changed by admin(%s): %s", ctx.Req.RequestURI, | |||
| ctx.User.LowerName, strings.ToLower(form.AuthName)) | |||
| ctx.User.LowerName, form.AuthName) | |||
| ctx.Redirect("/admin/auths") | |||
| } | |||
| @@ -19,7 +19,7 @@ | |||
| <th>Actived</th> | |||
| <th>Updated</th> | |||
| <th>Created</th> | |||
| <th>Operation</th> | |||
| <th>Edit</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| @@ -115,16 +115,20 @@ | |||
| <input name="smtpport" class="form-control" placeholder="Type port number" value="{{.Source.SMTP.Port}}"> | |||
| </div> | |||
| </div> | |||
| <!-- <div class="form-group {{if .Err_TLS}}has-error has-feedback{{end}}"> | |||
| <label class="col-md-3 control-label">TLS: </label> | |||
| <div class="col-md-7"> | |||
| <input name="tls" type="checkbox" class="form-control" {{if .Source.SMTP.TLS}}checked{{end}}> | |||
| </div> | |||
| </div> --> | |||
| {{end}} | |||
| <div class="form-group"> | |||
| {{if eq $type 3}} | |||
| <div class="col-md-offset-3 col-md-7"> | |||
| <div class="checkbox"> | |||
| <label> | |||
| <input name="tls" type="checkbox" class="form-control" {{if .Source.SMTP.TLS}}checked{{end}}> | |||
| <strong>Enable TLS Encryption</strong> | |||
| </label> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| <div class="col-md-offset-3 col-md-7"> | |||
| <div class="checkbox"> | |||
| <label> | |||
| @@ -114,16 +114,16 @@ | |||
| </div> | |||
| </div> | |||
| <!-- <div class="form-group"> | |||
| <div class="form-group"> | |||
| <div class="col-md-offset-3 col-md-7"> | |||
| <div class="checkbox"> | |||
| <label> | |||
| <input name="tls" type="checkbox" {{if .tls}}checked{{end}}> | |||
| <strong>Enable Register Confirmation</strong> | |||
| <strong>Enable TLS Encryption</strong> | |||
| </label> | |||
| </div> | |||
| </div> | |||
| </div> --> | |||
| </div> | |||
| </div> | |||
| <div class="form-group"> | |||
| @@ -148,6 +148,16 @@ | |||
| </div> | |||
| </div> | |||
| <div class="panel panel-info"> | |||
| <div class="panel-heading"> | |||
| Tips | |||
| </div> | |||
| <div class="panel-body"> | |||
| <h5>GMail Setting:</h5> | |||
| <p>Host: smtp.gmail.com, Post: 587, Enable TLS Encryption: true</p> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <script> | |||
| @@ -29,7 +29,7 @@ | |||
| <div class="form-group"> | |||
| <label class="col-md-3 control-label">Auth Login Name: </label> | |||
| <div class="col-md-7"> | |||
| <input name="loginname" class="form-control" placeholder="Type auth login's username" value="{{.loginname}}"> | |||
| <input name="loginname" class="form-control" placeholder="Type auth login's username" value="{{.User.LoginName}}"> | |||
| </div> | |||
| </div> | |||