mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-01-07 21:04:38 +01:00
d699c12ceb
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 commitaaaece28e4
) (cherry picked from commit639dafabec
)
162 lines
5.2 KiB
Go
162 lines
5.2 KiB
Go
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package integration
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
|
|
"code.gitea.io/gitea/models/unittest"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/test"
|
|
"code.gitea.io/gitea/modules/translation"
|
|
"code.gitea.io/gitea/tests"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestSignup(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
setting.Service.EnableCaptcha = false
|
|
|
|
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
|
"user_name": "exampleUser",
|
|
"email": "exampleUser@example.com",
|
|
"password": "examplePassword!1",
|
|
"retype": "examplePassword!1",
|
|
})
|
|
MakeRequest(t, req, http.StatusSeeOther)
|
|
|
|
// should be able to view new user's page
|
|
req = NewRequest(t, "GET", "/exampleUser")
|
|
MakeRequest(t, req, http.StatusOK)
|
|
}
|
|
|
|
func TestSignupAsRestricted(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
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",
|
|
})
|
|
MakeRequest(t, req, http.StatusSeeOther)
|
|
|
|
// should be able to view new user's page
|
|
req = NewRequest(t, "GET", "/restrictedUser")
|
|
MakeRequest(t, req, http.StatusOK)
|
|
|
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "restrictedUser"})
|
|
assert.True(t, user2.IsRestricted)
|
|
}
|
|
|
|
func TestSignupEmail(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
setting.Service.EnableCaptcha = false
|
|
|
|
tests := []struct {
|
|
email string
|
|
wantStatus int
|
|
wantMsg string
|
|
}{
|
|
{"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")},
|
|
{"exampleUser@example.com", http.StatusSeeOther, ""},
|
|
}
|
|
|
|
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()),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
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)()
|
|
defer test.MockVariableValue(&setting.CacheService.Enabled, false)()
|
|
|
|
// 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)
|
|
}
|
|
|
|
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)()
|
|
defer test.MockVariableValue(&setting.CacheService.Enabled, 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)
|
|
}
|