mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.0 KiB
49 lines
1.0 KiB
package gomail |
|
|
|
import ( |
|
"bytes" |
|
"errors" |
|
"fmt" |
|
"net/smtp" |
|
) |
|
|
|
// loginAuth is an smtp.Auth that implements the LOGIN authentication mechanism. |
|
type loginAuth struct { |
|
username string |
|
password string |
|
host string |
|
} |
|
|
|
func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { |
|
if !server.TLS { |
|
advertised := false |
|
for _, mechanism := range server.Auth { |
|
if mechanism == "LOGIN" { |
|
advertised = true |
|
break |
|
} |
|
} |
|
if !advertised { |
|
return "", nil, errors.New("gomail: unencrypted connection") |
|
} |
|
} |
|
if server.Name != a.host { |
|
return "", nil, errors.New("gomail: wrong host name") |
|
} |
|
return "LOGIN", nil, nil |
|
} |
|
|
|
func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { |
|
if !more { |
|
return nil, nil |
|
} |
|
|
|
switch { |
|
case bytes.Equal(fromServer, []byte("Username:")): |
|
return []byte(a.username), nil |
|
case bytes.Equal(fromServer, []byte("Password:")): |
|
return []byte(a.password), nil |
|
default: |
|
return nil, fmt.Errorf("gomail: unexpected server challenge: %s", fromServer) |
|
} |
|
}
|
|
|