dockerfiles/anylink/server/admin/common.go

115 lines
2.6 KiB
Go

package admin
import (
"crypto/tls"
"errors"
"time"
"github.com/bjdgyc/anylink/base"
"github.com/bjdgyc/anylink/dbdata"
"github.com/golang-jwt/jwt/v4"
mail "github.com/xhit/go-simple-mail/v2"
// "github.com/mojocn/base64Captcha"
)
func SetJwtData(data map[string]interface{}, expiresAt int64) (string, error) {
jwtData := jwt.MapClaims{"exp": expiresAt}
for k, v := range data {
jwtData[k] = v
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwtData)
// Sign and get the complete encoded token as a string using the secret
tokenString, err := token.SignedString([]byte(base.Cfg.JwtSecret))
return tokenString, err
}
func GetJwtData(jwtToken string) (map[string]interface{}, error) {
token, err := jwt.Parse(jwtToken, func(token *jwt.Token) (interface{}, error) {
// since we only use the one private key to sign the tokens,
// we also only use its public counter part to verify
return []byte(base.Cfg.JwtSecret), nil
})
if err != nil || !token.Valid {
return nil, err
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
return nil, errors.New("data is parse err")
}
return claims, nil
}
func SendMail(subject, to, htmlBody string) error {
dataSmtp := &dbdata.SettingSmtp{}
err := dbdata.SettingGet(dataSmtp)
if err != nil {
base.Error(err)
return err
}
server := mail.NewSMTPClient()
// SMTP Server
server.Host = dataSmtp.Host
server.Port = dataSmtp.Port
server.Username = dataSmtp.Username
server.Password = dataSmtp.Password
switch dataSmtp.Encryption {
case "SSLTLS":
server.Encryption = mail.EncryptionSSLTLS
case "STARTTLS":
server.Encryption = mail.EncryptionSTARTTLS
default:
server.Encryption = mail.EncryptionNone
}
// Since v2.3.0 you can specified authentication type:
// - PLAIN (default)
// - LOGIN
// - CRAM-MD5
server.Authentication = mail.AuthPlain
// Variable to keep alive connection
server.KeepAlive = false
// Timeout for connect to SMTP Server
server.ConnectTimeout = 10 * time.Second
// Timeout for send the data and wait respond
server.SendTimeout = 10 * time.Second
// Set TLSConfig to provide custom TLS configuration. For example,
// to skip TLS verification (useful for testing):
server.TLSConfig = &tls.Config{InsecureSkipVerify: true}
// SMTP client
smtpClient, err := server.Connect()
if err != nil {
base.Error(err)
return err
}
// New email simple html with inline and CC
email := mail.NewMSG()
email.SetFrom(dataSmtp.From).
AddTo(to).
SetSubject(subject)
email.SetBody(mail.TextHTML, htmlBody)
// Call Send and pass the client
err = email.Send(smtpClient)
if err != nil {
base.Error(err)
}
return err
}