1package httpd
2
3import (
4	"sync"
5	"time"
6
7	"github.com/drakkan/sftpgo/v2/util"
8)
9
10var (
11	resetCodeLifespan = 10 * time.Minute
12	resetCodes        sync.Map
13)
14
15type resetCode struct {
16	Code      string
17	Username  string
18	IsAdmin   bool
19	ExpiresAt time.Time
20}
21
22func (c *resetCode) isExpired() bool {
23	return c.ExpiresAt.Before(time.Now().UTC())
24}
25
26func newResetCode(username string, isAdmin bool) *resetCode {
27	return &resetCode{
28		Code:      util.GenerateUniqueID(),
29		Username:  username,
30		IsAdmin:   isAdmin,
31		ExpiresAt: time.Now().Add(resetCodeLifespan).UTC(),
32	}
33}
34
35func cleanupExpiredResetCodes() {
36	resetCodes.Range(func(key, value interface{}) bool {
37		c, ok := value.(*resetCode)
38		if !ok || c.isExpired() {
39			resetCodes.Delete(key)
40		}
41		return true
42	})
43}
44