|
|
@ -6,6 +6,7 @@ import (
|
|
|
|
"errors"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
"net/url"
|
|
|
|
"net/url"
|
|
|
|
|
|
|
|
"strings"
|
|
|
|
"text/template"
|
|
|
|
"text/template"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
@ -119,8 +120,9 @@ type captchaPayload struct {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type retrievePasswordPayload struct {
|
|
|
|
type retrievePasswordPayload struct {
|
|
|
|
Host string
|
|
|
|
Captcha string
|
|
|
|
Url string
|
|
|
|
Host string
|
|
|
|
|
|
|
|
Url string
|
|
|
|
|
|
|
|
|
|
|
|
Year int
|
|
|
|
Year int
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -293,16 +295,22 @@ func SendRetrievePasswordCaptchaEmail(userID, email, host string) error {
|
|
|
|
if userID == "" {
|
|
|
|
if userID == "" {
|
|
|
|
return errors.New("user id is empty")
|
|
|
|
return errors.New("user id is empty")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if email == "" {
|
|
|
|
if email == "" {
|
|
|
|
return errors.New("email is empty")
|
|
|
|
return errors.New("email is empty")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if host == "" {
|
|
|
|
|
|
|
|
return errors.New("host is empty")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if !strings.HasPrefix(host, "http://") && !strings.HasPrefix(host, "https://") {
|
|
|
|
|
|
|
|
log.Errorf("host: %s must start with http:// or https://", host)
|
|
|
|
|
|
|
|
return errors.New("get host error")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
u, err := url.Parse(host)
|
|
|
|
u, err := url.Parse(host)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
u.Path = `/web/auth/reset`
|
|
|
|
u.Path = `web/auth/reset`
|
|
|
|
|
|
|
|
|
|
|
|
pool, err := getSmtpPool()
|
|
|
|
pool, err := getSmtpPool()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
@ -318,16 +326,17 @@ func SendRetrievePasswordCaptchaEmail(userID, email, host string) error {
|
|
|
|
entry.SetExpiration(time.Now().Add(time.Minute * 5))
|
|
|
|
entry.SetExpiration(time.Now().Add(time.Minute * 5))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
q := u.Query()
|
|
|
|
q := url.Values{}
|
|
|
|
q.Set("captcha", entry.Value())
|
|
|
|
q.Set("captcha", entry.Value())
|
|
|
|
q.Set("email", email)
|
|
|
|
q.Set("email", email)
|
|
|
|
u.RawQuery = q.Encode()
|
|
|
|
u.RawQuery = q.Encode()
|
|
|
|
|
|
|
|
|
|
|
|
out := bytes.NewBuffer(nil)
|
|
|
|
out := bytes.NewBuffer(nil)
|
|
|
|
err = retrievePasswordTemplate.Execute(out, retrievePasswordPayload{
|
|
|
|
err = retrievePasswordTemplate.Execute(out, retrievePasswordPayload{
|
|
|
|
Host: host,
|
|
|
|
Captcha: entry.Value(),
|
|
|
|
Url: u.String(),
|
|
|
|
Host: host,
|
|
|
|
Year: time.Now().Year(),
|
|
|
|
Url: u.String(),
|
|
|
|
|
|
|
|
Year: time.Now().Year(),
|
|
|
|
})
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|