| package common |
|
|
| import ( |
| "strings" |
| "sync" |
| "time" |
|
|
| "github.com/google/uuid" |
| ) |
|
|
| type verificationValue struct { |
| code string |
| time time.Time |
| } |
|
|
| const ( |
| EmailVerificationPurpose = "v" |
| PasswordResetPurpose = "r" |
| ) |
|
|
| var verificationMutex sync.Mutex |
| var verificationMap map[string]verificationValue |
| var verificationMapMaxSize = 10 |
| var VerificationValidMinutes = 10 |
|
|
| func GenerateVerificationCode(length int) string { |
| code := uuid.New().String() |
| code = strings.Replace(code, "-", "", -1) |
| if length == 0 { |
| return code |
| } |
| return code[:length] |
| } |
|
|
| func RegisterVerificationCodeWithKey(key string, code string, purpose string) { |
| verificationMutex.Lock() |
| defer verificationMutex.Unlock() |
| verificationMap[purpose+key] = verificationValue{ |
| code: code, |
| time: time.Now(), |
| } |
| if len(verificationMap) > verificationMapMaxSize { |
| removeExpiredPairs() |
| } |
| } |
|
|
| func VerifyCodeWithKey(key string, code string, purpose string) bool { |
| verificationMutex.Lock() |
| defer verificationMutex.Unlock() |
| value, okay := verificationMap[purpose+key] |
| now := time.Now() |
| if !okay || int(now.Sub(value.time).Seconds()) >= VerificationValidMinutes*60 { |
| return false |
| } |
| return code == value.code |
| } |
|
|
| func DeleteKey(key string, purpose string) { |
| verificationMutex.Lock() |
| defer verificationMutex.Unlock() |
| delete(verificationMap, purpose+key) |
| } |
|
|
| |
| func removeExpiredPairs() { |
| now := time.Now() |
| for key := range verificationMap { |
| if int(now.Sub(verificationMap[key].time).Seconds()) >= VerificationValidMinutes*60 { |
| delete(verificationMap, key) |
| } |
| } |
| } |
|
|
| func init() { |
| verificationMutex.Lock() |
| defer verificationMutex.Unlock() |
| verificationMap = make(map[string]verificationValue) |
| } |
|
|