| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- // Copyright 2024 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package integration
-
- import (
- "net/http"
- "testing"
-
- "code.gitea.io/gitea/modules/container"
- "code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/tests"
-
- "github.com/stretchr/testify/assert"
- )
-
- // Validate that each navbar setting is correct. This checks that the
- // appropriate context is passed everywhere the navbar is rendered
- func assertNavbar(t *testing.T, doc *HTMLDoc) {
- // Only show the account page if users can change their email notifications, delete themselves, or manage credentials
- if setting.Admin.UserDisabledFeatures.Contains(setting.UserFeatureDeletion, setting.UserFeatureManageCredentials) && !setting.Service.EnableNotifyMail {
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/account']", false)
- } else {
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/account']", true)
- }
-
- if setting.Admin.UserDisabledFeatures.Contains(setting.UserFeatureManageMFA, setting.UserFeatureManageCredentials) {
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/security']", false)
- } else {
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/security']", true)
- }
-
- if setting.Admin.UserDisabledFeatures.Contains(setting.UserFeatureManageSSHKeys, setting.UserFeatureManageGPGKeys) {
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/keys']", false)
- } else {
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/keys']", true)
- }
- }
-
- func WithDisabledFeatures(t *testing.T, features ...string) {
- t.Helper()
-
- global := setting.Admin.UserDisabledFeatures
- user := setting.Admin.ExternalUserDisableFeatures
-
- setting.Admin.UserDisabledFeatures = container.SetOf(features...)
- setting.Admin.ExternalUserDisableFeatures = setting.Admin.UserDisabledFeatures
-
- t.Cleanup(func() {
- setting.Admin.UserDisabledFeatures = global
- setting.Admin.ExternalUserDisableFeatures = user
- })
- }
-
- func TestUserSettingsAccount(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("all features enabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- // account navbar should display
- AssertHTMLElement(t, doc, ".menu a[href='/user/settings/account']", true)
-
- AssertHTMLElement(t, doc, "#password", true)
- AssertHTMLElement(t, doc, "#email", true)
- AssertHTMLElement(t, doc, "#delete-form", true)
- })
-
- t.Run("credentials disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageCredentials)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#password", false)
- AssertHTMLElement(t, doc, "#email", false)
- AssertHTMLElement(t, doc, "#delete-form", true)
- })
-
- t.Run("deletion disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureDeletion)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#password", true)
- AssertHTMLElement(t, doc, "#email", true)
- AssertHTMLElement(t, doc, "#delete-form", false)
- })
-
- t.Run("deletion, credentials and email notifications are disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- mail := setting.Service.EnableNotifyMail
- setting.Service.EnableNotifyMail = false
- defer func() {
- setting.Service.EnableNotifyMail = mail
- }()
-
- WithDisabledFeatures(t, setting.UserFeatureDeletion, setting.UserFeatureManageCredentials)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/account")
- session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsUpdatePassword(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("enabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- session := loginUser(t, "user2")
-
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- req = NewRequestWithValues(t, "POST", "/user/settings/account", map[string]string{
- "_csrf": doc.GetCSRF(),
- "old_password": "password",
- "password": "password",
- "retype": "password",
- })
- session.MakeRequest(t, req, http.StatusSeeOther)
- })
-
- t.Run("credentials disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageCredentials)
-
- session := loginUser(t, "user2")
-
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- req = NewRequestWithValues(t, "POST", "/user/settings/account", map[string]string{
- "_csrf": doc.GetCSRF(),
- })
- session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsUpdateEmail(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("credentials disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageCredentials)
-
- session := loginUser(t, "user2")
-
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- req = NewRequestWithValues(t, "POST", "/user/settings/account/email", map[string]string{
- "_csrf": doc.GetCSRF(),
- })
- session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsDeleteEmail(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("credentials disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageCredentials)
-
- session := loginUser(t, "user2")
-
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- req = NewRequestWithValues(t, "POST", "/user/settings/account/email/delete", map[string]string{
- "_csrf": doc.GetCSRF(),
- })
- session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsDelete(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("deletion disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureDeletion)
-
- session := loginUser(t, "user2")
-
- req := NewRequest(t, "GET", "/user/settings/account")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- req = NewRequestWithValues(t, "POST", "/user/settings/account/delete", map[string]string{
- "_csrf": doc.GetCSRF(),
- })
- session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsAppearance(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/appearance")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- }
-
- func TestUserSettingsSecurity(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("credentials disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
- WithDisabledFeatures(t, setting.UserFeatureManageCredentials)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/security")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#register-webauthn", true)
- })
-
- t.Run("mfa disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
- WithDisabledFeatures(t, setting.UserFeatureManageMFA)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/security")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#register-webauthn", false)
- })
-
- t.Run("credentials and mfa disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
- WithDisabledFeatures(t, setting.UserFeatureManageCredentials, setting.UserFeatureManageMFA)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/security")
- session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsApplications(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("Applications", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/applications")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- })
-
- t.Run("OAuth2", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- session := loginUser(t, "user2")
-
- t.Run("OAuth2ApplicationShow", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- req := NewRequest(t, "GET", "/user/settings/applications/oauth2/2")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- })
-
- t.Run("OAuthApplicationsEdit", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- req := NewRequest(t, "GET", "/user/settings/applications/oauth2/2")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- t.Run("Invalid URL", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- req := NewRequestWithValues(t, "POST", "/user/settings/applications/oauth2/2", map[string]string{
- "_csrf": doc.GetCSRF(),
- "application_name": "Test native app",
- "redirect_uris": "ftp://127.0.0.1",
- "confidential_client": "false",
- })
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- msg := doc.Find(".flash-error p").Text()
- assert.Equal(t, `form.RedirectURIs"ftp://127.0.0.1" is not a valid URL.`, msg)
- })
-
- t.Run("OK", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- req := NewRequestWithValues(t, "POST", "/user/settings/applications/oauth2/2", map[string]string{
- "_csrf": doc.GetCSRF(),
- "application_name": "Test native app",
- "redirect_uris": "http://127.0.0.1",
- "confidential_client": "false",
- })
- session.MakeRequest(t, req, http.StatusSeeOther)
- })
- })
- })
- }
-
- func TestUserSettingsKeys(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- t.Run("all enabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/keys")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#add-ssh-button", true)
- AssertHTMLElement(t, doc, "#add-gpg-key-panel", true)
- })
-
- t.Run("ssh keys disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageSSHKeys)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/keys")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#add-ssh-button", false)
- AssertHTMLElement(t, doc, "#add-gpg-key-panel", true)
- })
-
- t.Run("gpg keys disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageGPGKeys)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/keys")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
-
- AssertHTMLElement(t, doc, "#add-ssh-button", true)
- AssertHTMLElement(t, doc, "#add-gpg-key-panel", false)
- })
-
- t.Run("ssh & gpg keys disabled", func(t *testing.T) {
- defer tests.PrintCurrentTest(t)()
-
- WithDisabledFeatures(t, setting.UserFeatureManageSSHKeys, setting.UserFeatureManageGPGKeys)
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/keys")
- _ = session.MakeRequest(t, req, http.StatusNotFound)
- })
- }
-
- func TestUserSettingsSecrets(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/actions/secrets")
- if setting.Actions.Enabled {
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- } else {
- session.MakeRequest(t, req, http.StatusNotFound)
- }
- }
-
- func TestUserSettingsPackages(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/packages")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- }
-
- func TestUserSettingsPackagesRulesAdd(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/packages/rules/add")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- }
-
- func TestUserSettingsOrganization(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/organization")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- }
-
- func TestUserSettingsRepos(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/repos")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- }
-
- func TestUserSettingsBlockedUsers(t *testing.T) {
- defer tests.PrepareTestEnv(t)()
-
- session := loginUser(t, "user2")
- req := NewRequest(t, "GET", "/user/settings/blocked_users")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- assertNavbar(t, doc)
- }
|