Skip to content
Open
Changes from 12 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
d8a4191
SECURITY-771: Added an assertion for a page title.
A1exKH Sep 26, 2025
1fda975
SECURITY-771: Added a test for anonymous user.
A1exKH Sep 26, 2025
8b86aab
SECURITY-771: Updated the validation for user cannot see About Jenkin…
A1exKH Sep 26, 2025
37a51c7
SECURITY-771: Updated test's description in comments.
A1exKH Sep 26, 2025
8689f68
SECURITY-771: Improved method name.
A1exKH Sep 26, 2025
65d88a5
SECURITY-771: Improved implementation of tests to fix issue with Exce…
A1exKH Sep 27, 2025
ff25c03
SECURITY-771: Refactored code and split logic for positive and negati…
A1exKH Sep 27, 2025
e388c86
SECURITY-771: Refactored code. Created string constants.
A1exKH Sep 27, 2025
c0446cc
SECURITY-771: Refactored code. Created string constants for users.
A1exKH Sep 27, 2025
0c3d4f9
SECURITY-771: Fixed bug in the test.
A1exKH Sep 27, 2025
5e13a23
SECURITY-771: Refactored code. Updated method's names.
A1exKH Sep 27, 2025
ff0a44d
SECURITY-771: Refactored code. Implemented the usage of try-with-reso…
A1exKH Sep 27, 2025
343bcb2
SECURITY-771: Added missing trailing newline.
A1exKH Sep 27, 2025
3a89d66
SECURITY-771: Added missing test scenario for READ + SYSTEM_READ user…
A1exKH Sep 27, 2025
4cc01f5
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 2, 2025
8635a78
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 4, 2025
938074d
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 6, 2025
5a116b1
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 8, 2025
800708d
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 13, 2025
9b9a275
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 15, 2025
aaba461
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 17, 2025
74a6d23
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 20, 2025
bee2674
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 22, 2025
36bea8a
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 24, 2025
8e6942e
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 28, 2025
8138cf6
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Oct 31, 2025
019abf7
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 1, 2025
7239872
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 2, 2025
dc3057c
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 5, 2025
5b3acd9
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 6, 2025
4ad88e0
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 7, 2025
fe613cd
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 12, 2025
fd2237a
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 14, 2025
3d5eaf0
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 15, 2025
4c2c4ed
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 18, 2025
0714fe1
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 21, 2025
77d2703
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 24, 2025
9ef8f31
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 25, 2025
64de575
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Nov 26, 2025
8d2d443
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Dec 1, 2025
92c510f
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Dec 2, 2025
9cd9e8c
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Dec 15, 2025
e08069e
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Dec 17, 2025
7e91dce
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Dec 23, 2025
024e860
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Dec 29, 2025
7e1f735
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 5, 2026
78eccc7
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 7, 2026
e74304a
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 9, 2026
5ae154a
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 12, 2026
39c401b
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 13, 2026
7586855
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 14, 2026
1f19e41
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 20, 2026
aa74ee8
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 22, 2026
dd3f024
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 23, 2026
2c37178
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 24, 2026
1eb3e13
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 26, 2026
4e4ad35
SECURITY-771: Improved comments for "Only Read" test according to fee…
A1exKH Jan 26, 2026
c4ab957
SECURITY-771: Renamed constant name "READONLY_USER" to "SYSTEM_READ_O…
A1exKH Jan 26, 2026
0b1e6e6
SECURITY-771: Fixed typo in constant name "MANAGER_READONLY_USER".
A1exKH Jan 26, 2026
c58e3ec
SECURITY-771: Updated constant names for better readability.
A1exKH Jan 26, 2026
fe130d0
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 27, 2026
29abc01
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 28, 2026
cdc8d25
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 29, 2026
9003fc5
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Jan 30, 2026
51010e4
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Feb 1, 2026
7dfb982
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Feb 2, 2026
44ffd25
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Feb 3, 2026
99fcc90
Merge branch 'master' into SECURITY-771/Fix-test-logic
A1exKH Mar 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 78 additions & 52 deletions test/src/test/java/hudson/AboutJenkinsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,75 +45,101 @@ class AboutJenkinsTest {

private JenkinsRule j;

private static final String ABOUT_PAGE_URL = "about/";

private static final String ABOUT_PAGE_TITLE = "About Jenkins";
private static final String JENKINS_PAGE_TITLE = "Jenkins";
private static final String SIGN_IN_PAGE_TITLE = "Sign in";
private static final String MAVENIZED_DEPS_TEXT = "Mavenized dependencies";

private static final String ADMIN_USER = "admin";
private static final String MANAGER_USER = "manager";
private static final String MANAGER_READONLY_USER = "manager-readonly";
private static final String READONLY_USER = "readonly";
private static final String REGULAR_USER = "user";

@BeforeEach
void setUp(JenkinsRule rule) {
j = rule;
setupTestAuthorization();
}

@Test
@Issue("SECURITY-771")
void onlyAdminOrManageOrSystemReadCanReadAbout() throws Exception {
final String ADMIN = "admin";
final String USER = "user";
final String MANAGER = "manager";
final String READONLY = "readonly";
final String MANAGER_READONLY = "manager-readonly";

private void setupTestAuthorization() {
j.jenkins.setSecurityRealm(j.createDummySecurityRealm());
j.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy()
// full access
.grant(Jenkins.ADMINISTER).everywhere().to(ADMIN)

// Read access
.grant(Jenkins.READ).everywhere().to(USER)
// admin full access
.grant(Jenkins.ADMINISTER).everywhere().to(ADMIN_USER)

// Read and Manage
.grant(Jenkins.READ).everywhere().to(MANAGER)
.grant(Jenkins.MANAGE).everywhere().to(MANAGER)

// Read and System read
.grant(Jenkins.READ).everywhere().to(READONLY)
.grant(Jenkins.SYSTEM_READ).everywhere().to(READONLY)
.grant(Jenkins.READ).everywhere().to(MANAGER_USER)
.grant(Jenkins.MANAGE).everywhere().to(MANAGER_USER)

// Read, Manage and System read
.grant(Jenkins.READ).everywhere().to(MANAGER_READONLY)
.grant(Jenkins.MANAGE).everywhere().to(MANAGER_READONLY)
.grant(Jenkins.SYSTEM_READ).everywhere().to(MANAGER_READONLY)
);
.grant(Jenkins.READ).everywhere().to(MANAGER_READONLY_USER)
.grant(Jenkins.MANAGE).everywhere().to(MANAGER_READONLY_USER)
.grant(Jenkins.SYSTEM_READ).everywhere().to(MANAGER_READONLY_USER)

JenkinsRule.WebClient wc = j.createWebClient()
.withThrowExceptionOnFailingStatusCode(false);

{ // user cannot see it
wc.login(USER);
HtmlPage page = wc.goTo("about/");
assertEquals(HttpURLConnection.HTTP_FORBIDDEN, page.getWebResponse().getStatusCode());
}
// Read access only (should NOT access About Jenkins page)
.grant(Jenkins.READ).everywhere().to(REGULAR_USER)

{ // admin can access it
wc.login(ADMIN);
HtmlPage page = wc.goTo("about/");
assertEquals(HttpURLConnection.HTTP_OK, page.getWebResponse().getStatusCode());
assertThat(page.getWebResponse().getContentAsString(), containsString("Mavenized dependencies"));
}
// System read only (should NOT access About Jenkins page)
.grant(Jenkins.SYSTEM_READ).everywhere().to(READONLY_USER)
);
}

{ // manager can access it
wc.login(MANAGER);
HtmlPage page = wc.goTo("about/");
assertEquals(HttpURLConnection.HTTP_OK, page.getWebResponse().getStatusCode());
private HtmlPage accessAsUser(String username) throws Exception {
try (JenkinsRule.WebClient webClient = j.createWebClient()) {
webClient.withThrowExceptionOnFailingStatusCode(false);
webClient.login(username);
return webClient.goTo(ABOUT_PAGE_URL);
}
}

{ // readonly can access it
wc.login(READONLY);
HtmlPage page = wc.goTo("about/");
assertEquals(HttpURLConnection.HTTP_OK, page.getWebResponse().getStatusCode());
private HtmlPage accessAsAnonymous() throws Exception {
try (JenkinsRule.WebClient webClient = j.createWebClient()) {
webClient.withThrowExceptionOnFailingStatusCode(false);
return webClient.goTo(ABOUT_PAGE_URL);
}
}

{ // manager-readonly can access it
wc.login(MANAGER_READONLY);
HtmlPage page = wc.goTo("about/");
assertEquals(HttpURLConnection.HTTP_OK, page.getWebResponse().getStatusCode());
}
@Test
@Issue("SECURITY-771")
void usersWithElevatedPermissionsCanSeeAboutPage() throws Exception {
// ADMINISTER permission: admin can see About Jenkins page
HtmlPage adminPage = accessAsUser(ADMIN_USER);
assertEquals(HttpURLConnection.HTTP_OK, adminPage.getWebResponse().getStatusCode());
assertThat(adminPage.getWebResponse().getContentAsString(), containsString(MAVENIZED_DEPS_TEXT));
assertThat(adminPage.getTitleText(), containsString(ABOUT_PAGE_TITLE));

// MANAGE permission: manager can see About Jenkins page
HtmlPage managerPage = accessAsUser(MANAGER_USER);
assertEquals(HttpURLConnection.HTTP_OK, managerPage.getWebResponse().getStatusCode());
assertThat(managerPage.getWebResponse().getContentAsString(), containsString(MAVENIZED_DEPS_TEXT));
assertThat(managerPage.getTitleText(), containsString(ABOUT_PAGE_TITLE));

// MANAGE + SYSTEM_READ permissions: manager-readonly can see About Jenkins page
HtmlPage managerReadonlyPage = accessAsUser(MANAGER_READONLY_USER);
assertEquals(HttpURLConnection.HTTP_OK, managerReadonlyPage.getWebResponse().getStatusCode());
assertThat(managerReadonlyPage.getWebResponse().getContentAsString(), containsString(MAVENIZED_DEPS_TEXT));
assertThat(managerReadonlyPage.getTitleText(), containsString(ABOUT_PAGE_TITLE));
}

}
@Test
@Issue("SECURITY-771")
void usersWithBasicPermissionsCannotSeeAboutPage() throws Exception {
// anonymous user cannot see About Jenkins page -> redirect to sign in page
HtmlPage anonymousPage = accessAsAnonymous();
assertEquals(HttpURLConnection.HTTP_OK, anonymousPage.getWebResponse().getStatusCode());
assertThat(anonymousPage.getTitleText(), containsString(SIGN_IN_PAGE_TITLE));

// only READ permission: user cannot see About Jenkins page -> redirect to Access Denied Jenkins page
HtmlPage userPage = accessAsUser(REGULAR_USER);
assertEquals(HttpURLConnection.HTTP_FORBIDDEN, userPage.getWebResponse().getStatusCode());
assertThat(userPage.getTitleText(), containsString(JENKINS_PAGE_TITLE));

// SYSTEM_READ permission: readonly cannot see About Jenkins page -> redirect to Access Denied Jenkins page
HtmlPage readonlyPage = accessAsUser(READONLY_USER);
assertEquals(HttpURLConnection.HTTP_FORBIDDEN, readonlyPage.getWebResponse().getStatusCode());
assertThat(readonlyPage.getTitleText(), containsString(JENKINS_PAGE_TITLE));
}
}