scsusers/2fa.go

45 lines
867 B
Go

package scsusers
import (
"crypto/rand"
"errors"
"fmt"
"math/big"
"time"
)
func generate2fa() string {
num, err := rand.Int(rand.Reader, big.NewInt(999999))
if err != nil {
return "918273"
}
return fmt.Sprintf("%06d", num)
}
func Validate2FA(u *UserData, challenge string) bool {
v, ok := u.Get("2fa")
return ok && v == challenge
}
func Send2FA(u *UserData) error {
code := generate2fa()
u.Set("2fa", code)
u.Set("2faexpires", fmt.Sprintf("%d", time.Now().Add(15*time.Minute).Unix()))
email,ok:=u.Get("email")
if !ok {
return errors.New("send2fa: no email")
}
firstname,ok:=u.Get("firstname")
if !ok {
return errors.New("send2fa: no firstname")
}
lastname,ok:=u.Get("lastname")
if !ok {
return errors.New("send2fa: no lastname")
}
fullname:=fmt.Sprintf("%s %s", firstname, lastname)
return Send2faEmail(email, fullname, code)
}