Skip to content

Commit b9d611e

Browse files
authored
Always store primary email address into email_address table and also the state (#15956)
* Always store primary email address into email_address table and also the state * Add lower_email to not convert email to lower as what's added * Fix fixture * Fix tests * Use BeforeInsert to save lower email * Fix v180 migration * fix tests * Fix test * Remove wrong submited codes * Fix test * Fix test * Fix test * Add test for v181 migration * remove change user's email to lower * Revert change on user's email column * Fix lower email * Fix test * Fix test
1 parent 21cde5c commit b9d611e

11 files changed

+593
-236
lines changed

integrations/api_gpg_keys_test.go

+43-33
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ func TestGPGKeys(t *testing.T) {
3636
}
3737

3838
for _, tc := range tt {
39-
4039
//Basic test on result code
4140
t.Run(tc.name, func(t *testing.T) {
4241
t.Run("ViewOwnGPGKeys", func(t *testing.T) {
@@ -87,9 +86,9 @@ func TestGPGKeys(t *testing.T) {
8786
assert.Empty(t, subKey.Emails)
8887

8988
primaryKey2 := keys[1] //Primary key 2
90-
assert.EqualValues(t, "FABF39739FE1E927", primaryKey2.KeyID)
89+
assert.EqualValues(t, "3CEF46EF40BEFC3E", primaryKey2.KeyID)
9190
assert.Len(t, primaryKey2.Emails, 1)
92-
assert.EqualValues(t, "user21@example.com", primaryKey2.Emails[0].Email)
91+
assert.EqualValues(t, "user2-2@example.com", primaryKey2.Emails[0].Email)
9392
assert.False(t, primaryKey2.Emails[0].Verified)
9493

9594
var key api.GPGKey
@@ -110,9 +109,9 @@ func TestGPGKeys(t *testing.T) {
110109
req = NewRequest(t, "GET", "/api/v1/user/gpg_keys/"+strconv.FormatInt(primaryKey2.ID, 10)+"?token="+token) //Primary key 2
111110
resp = session.MakeRequest(t, req, http.StatusOK)
112111
DecodeJSON(t, resp, &key)
113-
assert.EqualValues(t, "FABF39739FE1E927", key.KeyID)
112+
assert.EqualValues(t, "3CEF46EF40BEFC3E", key.KeyID)
114113
assert.Len(t, key.Emails, 1)
115-
assert.EqualValues(t, "user21@example.com", key.Emails[0].Email)
114+
assert.EqualValues(t, "user2-2@example.com", key.Emails[0].Email)
116115
assert.False(t, key.Emails[0].Verified)
117116

118117
})
@@ -231,35 +230,46 @@ uy6MA3VSB99SK9ducGmE1Jv8mcziREroz2TEGr0zPs6h
231230
}
232231

233232
func testCreateValidSecondaryEmailGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
234-
//User2 <user21@example.com> //secondary and not activated
233+
//User2 <user2-2@example.com> //secondary and not activated
235234
testCreateGPGKey(t, makeRequest, token, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
236235
237-
mQENBFmGWN4BCAC18V4tVGO65VLCV7p14FuXJlUtZ5CuYMvgEkcOqrvRaBSW9ao4
238-
PGESOhJpfWpnW3QgJniYndLzPpsmdHEclEER6aZjiNgReWPOjHD5tykWocZAJqXD
239-
eY1ym59gvVMLcfbV2yQsyR2hbJlc+dJsl16tigSEe3nwxZSw2IsW92pgEzT9JNUr
240-
Q+mC8dw4dqY0tYmFazYUGNxufUc/twgQT/Or1aNs0az5Q6Jft4rrTRsh/S7We0VB
241-
COKGkdcQyYgAls7HJBuPjQRi6DM9VhgBSHLAgSLyaUcZvhZBJr8Qe/q4PP3/kYDJ
242-
wm4RMnjOLz2pFZPgtRqgcAwpmFtLrACbEB3JABEBAAG0GlVzZXIyIDx1c2VyMjFA
243-
ZXhhbXBsZS5jb20+iQFUBBMBCAA+FiEEPOLHOjPSO42DWM57+r85c5/h6ScFAlmG
244-
WN4CGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ+r85c5/h6Sfx
245-
Lgf/dq64NBV8+X9an3seaLxePRviva48e4K67/wV/JxtXNO5Z/DhMGz5kHXCsG9D
246-
CXuWYO8ehlTjEnMZ6qqdDnY+H6bQsb2OS5oPn4RwpPXslAjEKtojPAr0dDsMS2DB
247-
dUuIm1AoOnewOVO0OFRf1EqX1bivxnN0FVMcO0m8AczfnKDaGb0y/qg/Y9JAsKqp
248-
j5pZNMWUkntRtGySeJ4CVJMmkVKJAHsa1Qj6MKdFeid4h4y94cBJ4ZdyBxNdpQOx
249-
ydf0doicovfeqGNO4oWzsGP4RBK2CqGPCUT+EFl20jPvMkKwOjxgqc8p0z3b2UT9
250-
+9bnmCGHgF/fW1HJ3iKmfFPqnLkBDQRZhljeAQgA5AirU/NJGgm19ZJYFOiHftjS
251-
azbrPxGeD3cSqmvDPIMc1DNZGfQV5D4EVumnVbQBtL6xHFoGKz9KisUMbe4a/X2J
252-
S8JmIphQWG0vMJX1DaZIzr2gT71MnPD7JMGsSUCh5dIKpTNTZX4w+oGPGOu0/UlL
253-
x0448AryKwp30J2p6D4GeI0nb03n35S2lTOpnHDn1wj7Jl/8LS2fdFOdNaNHXSZe
254-
twdSwJKhyBEiScgeHBDyKqo8zWkYoSb9eA2HiYlbVaiNtp24KP1mIEpiUdrRjWno
255-
zauYSZGHZlOFMgF4dKWuetPiuH9m7UYZGKyMLfQ9vYFb+xcPh2bLCQHJ1OEmMQAR
256-
AQABiQE8BBgBCAAmFiEEPOLHOjPSO42DWM57+r85c5/h6ScFAlmGWN4CGwwFCQPC
257-
ZwAACgkQ+r85c5/h6Sfjfwf+O4WEjRdvPJLxNy7mfAGoAqDMHIwyH/tVzYgyVhnG
258-
h/+cfRxJbGc3rpjYdr8dmvghzjEAout8uibPWaIqs63RCAPGPqgWLfxNO5c8+y8V
259-
LZMVOTV26l2olkkdBWAuhLqKTNh6TiQva03yhOgHWj4XDvFfxICWPFXVd6t5ELpD
260-
iApGu1OAj8JfhmzbG03Yzx+Ku7bWDxMonx3V/IDEu5LS5zrboHYDKCA53bXXghoi
261-
Aceqql+PKrDwEjoY4bptwMHLmcjGjdCQ//Qx1neho7nZcS7xjTucY8gQuulwCyXF
262-
y6wM+wMz8dunIG9gw4+Re6c4Rz9tX1kzxLrU7Pl21tMqfg==
263-
=0N/9
236+
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
272+
6qgtsUdi5eviONRkBgeZtN3oxA==
273+
=MgDv
264274
-----END PGP PUBLIC KEY BLOCK-----`)
265275
}

integrations/api_user_email_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestAPIListEmails(t *testing.T) {
3333
Primary: true,
3434
},
3535
{
36-
Email: "user21@example.com",
36+
Email: "user2-2@example.com",
3737
Verified: false,
3838
Primary: false,
3939
},
@@ -55,7 +55,7 @@ func TestAPIAddEmail(t *testing.T) {
5555
session.MakeRequest(t, req, http.StatusUnprocessableEntity)
5656

5757
opts = api.CreateEmailOption{
58-
Emails: []string{"user22@example.com"},
58+
Emails: []string{"user2-3@example.com"},
5959
}
6060
req = NewRequestWithJSON(t, "POST", "/api/v1/user/emails?token="+token, &opts)
6161
resp := session.MakeRequest(t, req, http.StatusCreated)
@@ -64,7 +64,7 @@ func TestAPIAddEmail(t *testing.T) {
6464
DecodeJSON(t, resp, &emails)
6565
assert.EqualValues(t, []*api.Email{
6666
{
67-
Email: "user22@example.com",
67+
Email: "user2-3@example.com",
6868
Verified: true,
6969
Primary: false,
7070
},
@@ -79,13 +79,13 @@ func TestAPIDeleteEmail(t *testing.T) {
7979
token := getTokenForLoggedInUser(t, session)
8080

8181
opts := api.DeleteEmailOption{
82-
Emails: []string{"user22@example.com"},
82+
Emails: []string{"user2-3@example.com"},
8383
}
8484
req := NewRequestWithJSON(t, "DELETE", "/api/v1/user/emails?token="+token, &opts)
8585
session.MakeRequest(t, req, http.StatusNotFound)
8686

8787
opts = api.DeleteEmailOption{
88-
Emails: []string{"user21@example.com"},
88+
Emails: []string{"user2-2@example.com"},
8989
}
9090
req = NewRequestWithJSON(t, "DELETE", "/api/v1/user/emails?token="+token, &opts)
9191
session.MakeRequest(t, req, http.StatusNoContent)

models/error.go

+15
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,21 @@ func (err ErrEmailAddressNotExist) Error() string {
237237
return fmt.Sprintf("Email address does not exist [email: %s]", err.Email)
238238
}
239239

240+
// ErrPrimaryEmailCannotDelete primary email address cannot be deleted
241+
type ErrPrimaryEmailCannotDelete struct {
242+
Email string
243+
}
244+
245+
// IsErrPrimaryEmailCannotDelete checks if an error is an ErrPrimaryEmailCannotDelete
246+
func IsErrPrimaryEmailCannotDelete(err error) bool {
247+
_, ok := err.(ErrPrimaryEmailCannotDelete)
248+
return ok
249+
}
250+
251+
func (err ErrPrimaryEmailCannotDelete) Error() string {
252+
return fmt.Sprintf("Primary email address cannot be deleted [email: %s]", err.Email)
253+
}
254+
240255
// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
241256
type ErrOpenIDAlreadyUsed struct {
242257
OpenID string

0 commit comments

Comments
 (0)