Skip to content

Commit 444f15a

Browse files
committed
wip do not use
1 parent 587bb65 commit 444f15a

File tree

7 files changed

+150
-12
lines changed

7 files changed

+150
-12
lines changed

server/src/main/java/org/cloudfoundry/identity/uaa/SpringServletXmlSecurityConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public class SpringServletXmlSecurityConfiguration {
6464
"/saml_error",
6565
"/favicon.ico",
6666
"/oauth_error",
67-
"/session",
68-
"/session_management",
67+
"/session", "/z/*/session",
68+
"/session_management", "/z/*/session_management",
6969
"/oauth/token/.well-known/openid-configuration", "/z/*/oauth/token/.well-known/openid-configuration",
7070
"/.well-known/openid-configuration", "/z/*/.well-known/openid-configuration",
7171
"/logged_out", "/z/*/logged_out"

server/src/main/java/org/cloudfoundry/identity/uaa/login/SessionController.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,32 @@
1313
*******************************************************************************/
1414
package org.cloudfoundry.identity.uaa.login;
1515

16+
import org.cloudfoundry.identity.uaa.util.UaaUrlUtils;
1617
import org.springframework.stereotype.Controller;
1718
import org.springframework.ui.Model;
1819
import org.springframework.web.bind.annotation.RequestMapping;
1920
import org.springframework.web.bind.annotation.RequestParam;
2021

22+
import jakarta.servlet.http.HttpServletRequest;
23+
2124
@Controller
2225
public class SessionController {
2326

24-
@RequestMapping("/session")
25-
public String session(Model model, @RequestParam String clientId, @RequestParam String messageOrigin) {
27+
@RequestMapping({"/session", "/z/{subdomain}/session"})
28+
public String session(Model model, HttpServletRequest request,
29+
@RequestParam String clientId, @RequestParam String messageOrigin) {
2630
// We need to maintain this version of the session page to continue compatibility with the
2731
// original version of uaa-singular.
32+
model.addAttribute("pathPrefix", UaaUrlUtils.getZonePathPrefix(request));
2833
model.addAttribute("clientId", clientId);
2934
model.addAttribute("messageOrigin", messageOrigin);
3035
return "session";
3136
}
3237

33-
@RequestMapping("/session_management")
34-
public String sessionManagement(Model model, @RequestParam String clientId, @RequestParam String messageOrigin) {
38+
@RequestMapping({"/session_management", "/z/{subdomain}/session_management"})
39+
public String sessionManagement(Model model, HttpServletRequest request,
40+
@RequestParam String clientId, @RequestParam String messageOrigin) {
41+
model.addAttribute("pathPrefix", UaaUrlUtils.getZonePathPrefix(request));
3542
model.addAttribute("clientId", clientId);
3643
model.addAttribute("messageOrigin", messageOrigin);
3744
return "session_management";

server/src/main/resources/templates/web/error.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<div th:if="${error_message_code}" class="alert alert-error">
88
<p th:text="#{${error_message_code}}">Error Message</p>
99
</div>
10-
<img src="/resources/images/sad_cloud.png" th:src="@{/resources/images/sad_cloud.png}" role="presentation" />
10+
<img src="/resources/images/sad_cloud.png" th:src="${pathPrefix != null && !#strings.isEmpty(pathPrefix) ? pathPrefix + '/resources/images/sad_cloud.png' : '/resources/images/sad_cloud.png'}" role="presentation" />
1111
</div>
1212
<h2>
1313
Uh oh.<br />

server/src/main/resources/templates/web/session.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html xmlns:th="http://www.thymeleaf.org">
33
<head>
44
<script type="text/javascript" src="/resources/javascripts/session/session_message_handler.js"
5-
th:src="@{'/resources/javascripts/session/session_message_handler.js'}"></script>
5+
th:src="${pathPrefix != null && !#strings.isEmpty(pathPrefix) ? pathPrefix + '/resources/javascripts/session/session_message_handler.js' : '/resources/javascripts/session/session_message_handler.js'}"></script>
66
</head>
77
<body>
88
<input type="hidden" id="clientId" th:value="${clientId}">

server/src/main/resources/templates/web/session_management.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<!DOCTYPE html>
22
<html xmlns:th="http://www.thymeleaf.org">
33
<head>
4-
<script type="application/javascript" th:src="@{'/resources/javascripts/session/sjcl.js'}"></script>
5-
<script type="application/javascript" th:src="@{'/resources/javascripts/session/session.js'}"></script>
4+
<script type="application/javascript" th:src="${pathPrefix != null && !#strings.isEmpty(pathPrefix) ? pathPrefix + '/resources/javascripts/session/sjcl.js' : '/resources/javascripts/session/sjcl.js'}"></script>
5+
<script type="application/javascript" th:src="${pathPrefix != null && !#strings.isEmpty(pathPrefix) ? pathPrefix + '/resources/javascripts/session/session.js' : '/resources/javascripts/session/session.js'}"></script>
66
<script type="application/javascript"
7-
th:src="@{'/resources/javascripts/session/session_management_message_handler.js'}"></script>
7+
th:src="${pathPrefix != null && !#strings.isEmpty(pathPrefix) ? pathPrefix + '/resources/javascripts/session/session_management_message_handler.js' : '/resources/javascripts/session/session_management_message_handler.js'}"></script>
88
</head>
99
<body>
1010
<input type="hidden" id="clientId" th:value="${clientId}">

server/src/test/java/org/cloudfoundry/identity/uaa/login/HomeControllerViewTests.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ private static String expectedHref(ZoneRequestPathMode mode, String path) {
9292
return prefix.isEmpty() ? "href=\"" + path + "\"" : "href=\"" + prefix + path + "\"";
9393
}
9494

95+
/** Expected resource path in response (e.g. script src, img src): {@code /resources/...} or {@code /z/test-zone/resources/...}. */
96+
private static String expectedResourcePath(ZoneRequestPathMode mode, String path) {
97+
String prefix = mode.redirectPrefix();
98+
return prefix.isEmpty() ? path : prefix + path;
99+
}
100+
95101
/** Ensures current zone has test branding so error-page assertions (footer, logo) pass for ZONE_PATH. */
96102
private void applyTestBrandingToCurrentZone() {
97103
IdentityZoneConfiguration newConfiguration = new IdentityZoneConfiguration();
@@ -212,9 +218,10 @@ void errorPageContainsCorrectNavLinks(ZoneRequestPathMode mode) throws Exception
212218
@EnumSource(ZoneRequestPathMode.class)
213219
void errorPageContainsCorrectResourceLink(ZoneRequestPathMode mode) throws Exception {
214220
mode.setZone();
221+
String imagePath = "/resources/images/sad_cloud.png";
215222
mockMvc.perform(request(mode, "/error"))
216223
.andExpect(status().isOk())
217-
.andExpect(content().string(containsString("src=\"/resources/images/sad_cloud.png\"")));
224+
.andExpect(content().string(containsString("src=\"" + expectedResourcePath(mode, imagePath) + "\"")));
218225
}
219226

220227
static Stream<Arguments> errorBrandingParams() {
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package org.cloudfoundry.identity.uaa.login;
2+
3+
import org.cloudfoundry.identity.uaa.TestClassNullifier;
4+
import org.cloudfoundry.identity.uaa.extensions.PollutionPreventionExtension;
5+
import org.cloudfoundry.identity.uaa.util.ZoneRequestPathMode;
6+
import org.cloudfoundry.identity.uaa.zone.IdentityZoneHolder;
7+
import org.junit.jupiter.api.AfterEach;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.extension.ExtendWith;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.EnumSource;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.context.annotation.Import;
15+
import org.springframework.security.core.context.SecurityContextHolder;
16+
import org.springframework.test.annotation.DirtiesContext;
17+
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
18+
import org.springframework.test.context.web.WebAppConfiguration;
19+
import org.springframework.test.web.servlet.MockMvc;
20+
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
21+
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
22+
import org.springframework.web.context.WebApplicationContext;
23+
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
24+
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
25+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
26+
27+
import static org.hamcrest.CoreMatchers.containsString;
28+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
29+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
30+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
31+
32+
/**
33+
* View tests for SessionController. Each test is parameterized by {@link ZoneRequestPathMode} so that
34+
* both default paths ({@code /session}, {@code /session_management}) and zone paths ({@code /z/{subdomain}/session}, ...) are covered.
35+
* Asserts that paths in the response content (e.g. script src) are correct for the mode.
36+
*/
37+
@ExtendWith(PollutionPreventionExtension.class)
38+
@WebAppConfiguration
39+
@SpringJUnitConfig(classes = SessionControllerViewTests.ContextConfiguration.class)
40+
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
41+
class SessionControllerViewTests extends TestClassNullifier {
42+
43+
private static final String CLIENT_ID = "test-client";
44+
private static final String MESSAGE_ORIGIN = "https://origin.example.com";
45+
46+
/** GET request for the given path; uses /z/{subdomain} when mode is ZONE_PATH so handler mapping matches. */
47+
private static MockHttpServletRequestBuilder request(ZoneRequestPathMode mode, String pathSuffix) {
48+
if (mode.redirectPrefix().isEmpty()) {
49+
return get(pathSuffix);
50+
}
51+
return get("/z/{subdomain}" + pathSuffix, mode.getSubdomain());
52+
}
53+
54+
/** Expected script src path in response: {@code /resources/...} or {@code /z/test-zone/resources/...}. */
55+
private static String expectedResourcePath(ZoneRequestPathMode mode, String path) {
56+
String prefix = mode.redirectPrefix();
57+
return prefix.isEmpty() ? path : prefix + path;
58+
}
59+
60+
@Autowired
61+
private WebApplicationContext webApplicationContext;
62+
63+
private MockMvc mockMvc;
64+
65+
@BeforeEach
66+
void beforeEach() {
67+
SecurityContextHolder.clearContext();
68+
IdentityZoneHolder.clear();
69+
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
70+
}
71+
72+
@AfterEach
73+
void afterEach() {
74+
SecurityContextHolder.clearContext();
75+
IdentityZoneHolder.clear();
76+
}
77+
78+
@ParameterizedTest
79+
@EnumSource(ZoneRequestPathMode.class)
80+
void sessionPageReturnsOkAndContainsExpectedPaths(ZoneRequestPathMode mode) throws Exception {
81+
mode.setZone();
82+
String scriptPath = "/resources/javascripts/session/session_message_handler.js";
83+
mockMvc.perform(request(mode, "/session")
84+
.param("clientId", CLIENT_ID)
85+
.param("messageOrigin", MESSAGE_ORIGIN))
86+
.andExpect(status().isOk())
87+
.andExpect(content().string(containsString("src=\"" + expectedResourcePath(mode, scriptPath) + "\"")))
88+
.andExpect(content().string(containsString(CLIENT_ID)))
89+
.andExpect(content().string(containsString(MESSAGE_ORIGIN)));
90+
}
91+
92+
@ParameterizedTest
93+
@EnumSource(ZoneRequestPathMode.class)
94+
void sessionManagementPageReturnsOkAndContainsExpectedPaths(ZoneRequestPathMode mode) throws Exception {
95+
mode.setZone();
96+
String sjcl = "/resources/javascripts/session/sjcl.js";
97+
String sessionJs = "/resources/javascripts/session/session.js";
98+
String handlerJs = "/resources/javascripts/session/session_management_message_handler.js";
99+
mockMvc.perform(request(mode, "/session_management")
100+
.param("clientId", CLIENT_ID)
101+
.param("messageOrigin", MESSAGE_ORIGIN))
102+
.andExpect(status().isOk())
103+
.andExpect(content().string(containsString("src=\"" + expectedResourcePath(mode, sjcl) + "\"")))
104+
.andExpect(content().string(containsString("src=\"" + expectedResourcePath(mode, sessionJs) + "\"")))
105+
.andExpect(content().string(containsString("src=\"" + expectedResourcePath(mode, handlerJs) + "\"")))
106+
.andExpect(content().string(containsString(CLIENT_ID)))
107+
.andExpect(content().string(containsString(MESSAGE_ORIGIN)));
108+
}
109+
110+
@EnableWebMvc
111+
@Import(ThymeleafConfig.class)
112+
static class ContextConfiguration implements WebMvcConfigurer {
113+
114+
@Override
115+
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
116+
configurer.enable();
117+
}
118+
119+
@Bean
120+
SessionController sessionController() {
121+
return new SessionController();
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)