mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package common
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/google/uuid"
 | 
						|
	"strings"
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
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)
 | 
						|
}
 | 
						|
 | 
						|
// no lock inside, so the caller must lock the verificationMap before calling!
 | 
						|
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)
 | 
						|
}
 |