initial commit
This commit is contained in:
commit
e8da0f7874
15 files changed
+722
No files matched your search
@@ -0,0 +1,23 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/smtp"
|
||||
|
||||
c "desq.com.ru/testjwtauth/config"
|
||||
)
|
||||
|
||||
func NotifyEmail(m string, r string) error {
|
||||
a := smtp.PlainAuth("", c.SMTPEmail, c.SMTPPassword, c.SMTPHost)
|
||||
|
||||
message := "From: " + c.SMTPEmail + "\n" +
|
||||
"To: " + r + "\n" +
|
||||
"Subject: Access from an unknown IP\n\n" +
|
||||
m
|
||||
|
||||
if err := smtp.SendMail(fmt.Sprintf("%s:%d", c.SMTPHost, 587), a, c.SMTPEmail, []string{r}, []byte(message)); err != nil {
|
||||
return fmt.Errorf("failed to send email: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"desq.com.ru/testjwtauth/config"
|
||||
)
|
||||
|
||||
func TestNotifyEmail(t *testing.T) {
|
||||
type args struct {
|
||||
m string
|
||||
r string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "WithValidEmail",
|
||||
args: args{
|
||||
m: "TestNotifyEmail",
|
||||
r: config.MockSMTPRecipient,
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "WithInvalidEmail",
|
||||
args: args{
|
||||
m: "TestNotifyEmail",
|
||||
r: "",
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if err := NotifyEmail(tt.args.m, tt.args.r); (err != nil) != tt.wantErr {
|
||||
t.Errorf("NotifyEmail() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
func GenerateToken(l int) (string, error) {
|
||||
bytes := make([]byte, l)
|
||||
|
||||
_, err := rand.Read(bytes)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
token := base64.StdEncoding.EncodeToString(bytes)
|
||||
|
||||
return token, nil
|
||||
}
|
||||
|
||||
func EncodeToken(token string) (string, error) {
|
||||
encodedToken, err := bcrypt.GenerateFromPassword([]byte(token), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(encodedToken), nil
|
||||
}
|
||||
|
||||
func CompareToken(hash string, token string) bool {
|
||||
eq := bcrypt.CompareHashAndPassword([]byte(hash), []byte(token))
|
||||
|
||||
return eq == nil
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGenerateToken(t *testing.T) {
|
||||
type args struct {
|
||||
l int
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "GenerateRefreshToken",
|
||||
args: args{
|
||||
l: 32,
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
_, err := GenerateToken(tt.args.l)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("GenerateToken() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncodeToken(t *testing.T) {
|
||||
token, err := GenerateToken(32)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to generate refresh token")
|
||||
}
|
||||
type args struct {
|
||||
token string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "EncodeToken",
|
||||
args: args{
|
||||
token: token,
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
_, err := EncodeToken(tt.args.token)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("EncodeToken() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user