2017-03-11 15:30:29 +01:00
|
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
2022-11-27 19:20:29 +01:00
|
|
|
// SPDX-License-Identifier: MIT
|
2017-03-11 15:30:29 +01:00
|
|
|
|
2022-09-02 21:18:23 +02:00
|
|
|
package integration
|
2017-03-11 15:30:29 +01:00
|
|
|
|
|
|
|
import (
|
2020-11-14 17:53:43 +01:00
|
|
|
"fmt"
|
2017-04-25 09:24:51 +02:00
|
|
|
"net/http"
|
2020-11-14 17:53:43 +01:00
|
|
|
"strings"
|
2017-03-11 15:30:29 +01:00
|
|
|
"testing"
|
|
|
|
|
2021-11-16 09:53:21 +01:00
|
|
|
"code.gitea.io/gitea/models/unittest"
|
2021-11-24 10:49:20 +01:00
|
|
|
user_model "code.gitea.io/gitea/models/user"
|
2017-04-25 09:24:51 +02:00
|
|
|
"code.gitea.io/gitea/modules/setting"
|
[GITEA] Allow changing the email address before activation
During registration, one may be required to give their email address, to
be verified and activated later. However, if one makes a mistake, a
typo, they may end up with an account that cannot be activated due to
having a wrong email address.
They can still log in, but not change the email address, thus, no way to
activate it without help from an administrator.
To remedy this issue, lets allow changing the email address for logged
in, but not activated users.
This fixes gitea#17785.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
(cherry picked from commit aaaece28e4c6a8980cef932e224e84933d7c9262)
(cherry picked from commit 639dafabec0a5c1f943b44ca02f72c5ba2fc5e10)
2023-12-07 12:57:16 +01:00
|
|
|
"code.gitea.io/gitea/modules/test"
|
2022-06-26 16:19:22 +02:00
|
|
|
"code.gitea.io/gitea/modules/translation"
|
2022-09-02 21:18:23 +02:00
|
|
|
"code.gitea.io/gitea/tests"
|
2021-11-17 13:34:35 +01:00
|
|
|
|
2020-11-14 17:53:43 +01:00
|
|
|
"github.com/stretchr/testify/assert"
|
2017-04-25 09:24:51 +02:00
|
|
|
)
|
2017-03-11 15:30:29 +01:00
|
|
|
|
|
|
|
func TestSignup(t *testing.T) {
|
2022-09-02 21:18:23 +02:00
|
|
|
defer tests.PrepareTestEnv(t)()
|
2017-04-28 15:23:28 +02:00
|
|
|
|
2017-04-25 09:24:51 +02:00
|
|
|
setting.Service.EnableCaptcha = false
|
|
|
|
|
2017-06-17 06:49:45 +02:00
|
|
|
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
|
|
|
"user_name": "exampleUser",
|
|
|
|
"email": "exampleUser@example.com",
|
2019-11-09 04:40:37 +01:00
|
|
|
"password": "examplePassword!1",
|
|
|
|
"retype": "examplePassword!1",
|
2017-06-17 06:49:45 +02:00
|
|
|
})
|
2022-03-23 05:54:07 +01:00
|
|
|
MakeRequest(t, req, http.StatusSeeOther)
|
2017-03-11 15:30:29 +01:00
|
|
|
|
2017-04-25 09:24:51 +02:00
|
|
|
// should be able to view new user's page
|
2017-06-10 02:41:36 +02:00
|
|
|
req = NewRequest(t, "GET", "/exampleUser")
|
2017-07-07 21:36:47 +02:00
|
|
|
MakeRequest(t, req, http.StatusOK)
|
2017-03-11 15:30:29 +01:00
|
|
|
}
|
2020-11-14 17:53:43 +01:00
|
|
|
|
2021-07-15 21:19:48 +02:00
|
|
|
func TestSignupAsRestricted(t *testing.T) {
|
2022-09-02 21:18:23 +02:00
|
|
|
defer tests.PrepareTestEnv(t)()
|
2021-07-15 21:19:48 +02:00
|
|
|
|
|
|
|
setting.Service.EnableCaptcha = false
|
|
|
|
setting.Service.DefaultUserIsRestricted = true
|
|
|
|
|
|
|
|
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
|
|
|
"user_name": "restrictedUser",
|
|
|
|
"email": "restrictedUser@example.com",
|
|
|
|
"password": "examplePassword!1",
|
|
|
|
"retype": "examplePassword!1",
|
|
|
|
})
|
2022-03-23 05:54:07 +01:00
|
|
|
MakeRequest(t, req, http.StatusSeeOther)
|
2021-07-15 21:19:48 +02:00
|
|
|
|
|
|
|
// should be able to view new user's page
|
|
|
|
req = NewRequest(t, "GET", "/restrictedUser")
|
|
|
|
MakeRequest(t, req, http.StatusOK)
|
|
|
|
|
2022-08-16 04:22:25 +02:00
|
|
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "restrictedUser"})
|
2021-07-15 21:19:48 +02:00
|
|
|
assert.True(t, user2.IsRestricted)
|
|
|
|
}
|
|
|
|
|
2020-11-14 17:53:43 +01:00
|
|
|
func TestSignupEmail(t *testing.T) {
|
2022-09-02 21:18:23 +02:00
|
|
|
defer tests.PrepareTestEnv(t)()
|
2020-11-14 17:53:43 +01:00
|
|
|
|
|
|
|
setting.Service.EnableCaptcha = false
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
email string
|
|
|
|
wantStatus int
|
|
|
|
wantMsg string
|
|
|
|
}{
|
2022-06-26 16:19:22 +02:00
|
|
|
{"exampleUser@example.com\r\n", http.StatusOK, translation.NewLocale("en-US").Tr("form.email_invalid")},
|
|
|
|
{"exampleUser@example.com\r", http.StatusOK, translation.NewLocale("en-US").Tr("form.email_invalid")},
|
|
|
|
{"exampleUser@example.com\n", http.StatusOK, translation.NewLocale("en-US").Tr("form.email_invalid")},
|
2022-03-23 05:54:07 +01:00
|
|
|
{"exampleUser@example.com", http.StatusSeeOther, ""},
|
2020-11-14 17:53:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for i, test := range tests {
|
|
|
|
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
|
|
|
"user_name": fmt.Sprintf("exampleUser%d", i),
|
|
|
|
"email": test.email,
|
|
|
|
"password": "examplePassword!1",
|
|
|
|
"retype": "examplePassword!1",
|
|
|
|
})
|
|
|
|
resp := MakeRequest(t, req, test.wantStatus)
|
|
|
|
if test.wantMsg != "" {
|
|
|
|
htmlDoc := NewHTMLParser(t, resp.Body)
|
|
|
|
assert.Equal(t,
|
|
|
|
test.wantMsg,
|
|
|
|
strings.TrimSpace(htmlDoc.doc.Find(".ui.message").Text()),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
[GITEA] Allow changing the email address before activation
During registration, one may be required to give their email address, to
be verified and activated later. However, if one makes a mistake, a
typo, they may end up with an account that cannot be activated due to
having a wrong email address.
They can still log in, but not change the email address, thus, no way to
activate it without help from an administrator.
To remedy this issue, lets allow changing the email address for logged
in, but not activated users.
This fixes gitea#17785.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
(cherry picked from commit aaaece28e4c6a8980cef932e224e84933d7c9262)
(cherry picked from commit 639dafabec0a5c1f943b44ca02f72c5ba2fc5e10)
2023-12-07 12:57:16 +01:00
|
|
|
|
|
|
|
func TestSignupEmailChangeForInactiveUser(t *testing.T) {
|
|
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
|
|
|
|
// Disable the captcha & enable email confirmation for registrations
|
|
|
|
defer test.MockVariableValue(&setting.Service.EnableCaptcha, false)()
|
|
|
|
defer test.MockVariableValue(&setting.Service.RegisterEmailConfirm, true)()
|
|
|
|
|
|
|
|
// Create user
|
|
|
|
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
|
|
|
"user_name": "exampleUserX",
|
|
|
|
"email": "wrong-email@example.com",
|
|
|
|
"password": "examplePassword!1",
|
|
|
|
"retype": "examplePassword!1",
|
|
|
|
})
|
|
|
|
MakeRequest(t, req, http.StatusOK)
|
|
|
|
|
|
|
|
session := loginUserWithPassword(t, "exampleUserX", "examplePassword!1")
|
|
|
|
|
|
|
|
// Verify that the initial e-mail is the wrong one.
|
|
|
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "exampleUserX"})
|
|
|
|
assert.Equal(t, "wrong-email@example.com", user.Email)
|
|
|
|
|
|
|
|
// Change the email address
|
|
|
|
req = NewRequestWithValues(t, "POST", "/user/activate", map[string]string{
|
|
|
|
"email": "fine-email@example.com",
|
|
|
|
})
|
|
|
|
session.MakeRequest(t, req, http.StatusSeeOther)
|
|
|
|
|
|
|
|
// Verify that the email was updated
|
|
|
|
user = unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "exampleUserX"})
|
|
|
|
assert.Equal(t, "fine-email@example.com", user.Email)
|
Rate limit pre-activation email change separately
Changing the email address before any email address is activated should
be subject to a different rate limit than the normal activation email
resending. If there's only one rate limit for both, then if a newly
signed up quickly discovers they gave a wrong email address, they'd have
to wait three minutes to change it.
With the two separate limits, they don't - but they'll have to wait
three minutes before they can change the email address again.
The downside of this setup is that a malicious actor can alternate
between resending and changing the email address (to something like
`user+$idx@domain`, delivered to the same inbox) to effectively halving
the rate limit. I do not think there's a better solution, and this feels
like such a small attack surface that I'd deem it acceptable.
The way the code works after this change is that `ActivatePost` will now
check the `MailChangeLimit_user` key rather than `MailResendLimit_user`,
and if we're within the limit, it will set `MailChangedJustNow_user`. The
`Activate` method - which sends the activation email, whether it is a
normal resend, or one following an email change - will check
`MailChangedJustNow_user`, and if it is set, it will check the rate
limit against `MailChangedLimit_user`, otherwise against
`MailResendLimit_user`, and then will delete the
`MailChangedJustNow_user` key from the cache.
Fixes #2040.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
2023-12-27 11:59:01 +01:00
|
|
|
|
|
|
|
// Try to change the email again
|
|
|
|
req = NewRequestWithValues(t, "POST", "/user/activate", map[string]string{
|
|
|
|
"email": "wrong-again@example.com",
|
|
|
|
})
|
|
|
|
session.MakeRequest(t, req, http.StatusSeeOther)
|
|
|
|
// Verify that the email was NOT updated
|
|
|
|
user = unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "exampleUserX"})
|
|
|
|
assert.Equal(t, "fine-email@example.com", user.Email)
|
[GITEA] Allow changing the email address before activation
During registration, one may be required to give their email address, to
be verified and activated later. However, if one makes a mistake, a
typo, they may end up with an account that cannot be activated due to
having a wrong email address.
They can still log in, but not change the email address, thus, no way to
activate it without help from an administrator.
To remedy this issue, lets allow changing the email address for logged
in, but not activated users.
This fixes gitea#17785.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
(cherry picked from commit aaaece28e4c6a8980cef932e224e84933d7c9262)
(cherry picked from commit 639dafabec0a5c1f943b44ca02f72c5ba2fc5e10)
2023-12-07 12:57:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestSignupEmailChangeForActiveUser(t *testing.T) {
|
|
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
|
|
|
|
// Disable the captcha & enable email confirmation for registrations
|
|
|
|
defer test.MockVariableValue(&setting.Service.EnableCaptcha, false)()
|
|
|
|
defer test.MockVariableValue(&setting.Service.RegisterEmailConfirm, false)()
|
|
|
|
|
|
|
|
// Create user
|
|
|
|
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
|
|
|
"user_name": "exampleUserY",
|
|
|
|
"email": "wrong-email-2@example.com",
|
|
|
|
"password": "examplePassword!1",
|
|
|
|
"retype": "examplePassword!1",
|
|
|
|
})
|
|
|
|
MakeRequest(t, req, http.StatusSeeOther)
|
|
|
|
|
|
|
|
session := loginUserWithPassword(t, "exampleUserY", "examplePassword!1")
|
|
|
|
|
|
|
|
// Verify that the initial e-mail is the wrong one.
|
|
|
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "exampleUserY"})
|
|
|
|
assert.Equal(t, "wrong-email-2@example.com", user.Email)
|
|
|
|
|
|
|
|
// Changing the email for a validated address is not available
|
|
|
|
req = NewRequestWithValues(t, "POST", "/user/activate", map[string]string{
|
|
|
|
"email": "fine-email-2@example.com",
|
|
|
|
})
|
|
|
|
session.MakeRequest(t, req, http.StatusNotFound)
|
|
|
|
|
|
|
|
// Verify that the email remained unchanged
|
|
|
|
user = unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "exampleUserY"})
|
|
|
|
assert.Equal(t, "wrong-email-2@example.com", user.Email)
|
|
|
|
}
|