Make gmail auth work
This commit is contained in:
		
							parent
							
								
									db6b71ad03
								
							
						
					
					
						commit
						4744996f9a
					
				
					 8 changed files with 52 additions and 35 deletions
				
			
		| 
						 | 
				
			
			@ -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>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue