This repository has been archived by the owner on Feb 5, 2024. It is now read-only.
/
email_confirmation.go
86 lines (71 loc) · 2.45 KB
/
email_confirmation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package models
import (
"fmt"
"time"
"github.com/ProgrammingLab/koneko-online-judge/server/logger"
"github.com/ProgrammingLab/koneko-online-judge/server/modules/nekomail"
"github.com/ProgrammingLab/koneko-online-judge/server/modules/unique"
)
type EmailConfirmation struct {
ID uint `gorm:"primary_key" json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
LifeTime time.Duration `json:"lifeTime"`
Token string `gorm:"not null; index" json:"-"`
WhiteEmailID uint `gorm:"not null" json:"whiteEmailID"`
WhiteEmail WhiteEmail `json:"whiteEmail"`
}
const (
EmailConfirmationTokenLifetime = 7 * 24 * time.Hour
subjectEmailConfirmation = "[Koneko Online Judge]招待のご案内"
bodyEmailConfirmation = `<p>Koneko Online Judgeへ招待されました。
ユーザー登録を行うには、下記のリンクをクリックしてください。</p>
<p><a href="https://judge.kurume-nct.com/registration/%v">https://judge.kurume-nct.com/registration/%v</a></p>
<p>このリンクの有効期間は1週間です。</p>`
)
func StartEmailConfirmation(email *WhiteEmail) error {
if email == nil {
return ErrNilArgument
}
confirm, err := newEmailConfirmation(email)
if err != nil {
return err
}
body := fmt.Sprintf(bodyEmailConfirmation, confirm.Token, confirm.Token)
return nekomail.SendMail(email.Email, subjectEmailConfirmation, body)
}
func newEmailConfirmation(email *WhiteEmail) (*EmailConfirmation, error) {
db.Delete(EmailConfirmation{}, "white_email_id = ?", email.ID)
token, err := unique.GenerateRandomBase62String(48)
if err != nil {
logger.AppLog.Errorf("token error: %+v", err)
return nil, err
}
c := &EmailConfirmation{
LifeTime: EmailConfirmationTokenLifetime,
Token: token,
WhiteEmailID: email.ID,
}
if err := db.Create(c).Error; err != nil {
logger.AppLog.Errorf("insert error: %+v", err)
return nil, err
}
return c, nil
}
func GetEmailConfirmation(token string) *EmailConfirmation {
res := &EmailConfirmation{}
nf := db.Model(EmailConfirmation{}).Where("token = ?", token).Scan(res).RecordNotFound()
if nf {
return nil
}
if time.Now().After(res.CreatedAt.Add(res.LifeTime)) {
db.Where("id = ?", res.ID).Delete(EmailConfirmation{})
return nil
}
return res
}
func (c *EmailConfirmation) FetchWhiteEmail() {
res := WhiteEmail{}
db.Model(res).Where("id = ?", c.WhiteEmailID).Scan(&res)
c.WhiteEmail = res
}