Skip to content

Commit b8d081a

Browse files
committed
[Prod/Test] Implement /oauth/error and /oauth/confirm_access zone path
1 parent 679e665 commit b8d081a

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

docs/path-based-zones-endpoints-without-z-support.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ This document lists endpoints that do **not** yet have a dual path mapping for `
144144

145145
| Endpoint(s) | Controller / Class | Controller has /z/? | Security has /z/*/? | Tests that touch these endpoints |
146146
|------------------------------------------|--------------------|---------------------|----------------------|-----------------------------------|
147-
| `/oauth/confirm_access` | AccessController | No | No ||
148-
| `/oauth/error` | AccessController | No | No ||
147+
| `/oauth/confirm_access` | AccessController | No | No ||
148+
| `/oauth/error` | AccessController | No | No ||
149149
| `/oauth/token/revoke/user/{userId}` etc. | TokenRevocationEndpoint | No | No (OauthEndpointSecurityConfiguration /oauth/token/revoke/** has no /z/) ||
150150
|`/check_token` | CheckTokenEndpoint | No | No ||
151151
|`/introspect` | IntrospectEndpoint | No | No ||

server/src/main/java/org/cloudfoundry/identity/uaa/oauth/AccessController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public AccessController(
7171
this.groupProvisioning = groupProvisioning;
7272
}
7373

74-
@RequestMapping("/oauth/confirm_access")
74+
@RequestMapping({"/oauth/confirm_access", "/z/{subdomain}/oauth/confirm_access"})
7575
public String confirm(Map<String, Object> model, final HttpServletRequest request, Principal principal,
7676
SessionStatus sessionStatus) {
7777

@@ -244,7 +244,7 @@ private String getRedirectUri(ClientDetails client, AuthorizationRequest clientA
244244
return result;
245245
}
246246

247-
@RequestMapping("/oauth/error")
247+
@RequestMapping({"/oauth/error", "/z/{subdomain}/oauth/error"})
248248
public String handleError(WebRequest request, Map<String, Object> model) {
249249
// There is already an error entry in the model
250250
Object object = request.getAttribute("error", RequestAttributes.SCOPE_REQUEST);

server/src/main/java/org/cloudfoundry/identity/uaa/oauth/provider/endpoint/WhitelabelApprovalEndpoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class WhitelabelApprovalEndpoint {
2929
private static final String CSRF = "_csrf";
3030
private static final String SCOPES = "scopes";
3131

32-
@GetMapping(value = "/oauth/confirm_access")
32+
@GetMapping(value = {"/oauth/confirm_access", "/z/{subdomain}/oauth/confirm_access"})
3333
public ModelAndView getAccessConfirmation(Map<String, Object> model, HttpServletRequest request) {
3434
final String approvalContent = createTemplate(model, request);
3535
if (request.getAttribute(CSRF) != null) {

uaa/src/test/java/org/cloudfoundry/identity/uaa/oauth/UaaAuthorizationEndpointMockMvcTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33
import org.cloudfoundry.identity.uaa.DefaultTestContext;
44
import org.cloudfoundry.identity.uaa.authentication.UaaAuthentication;
55
import org.cloudfoundry.identity.uaa.authentication.UaaPrincipal;
6+
import org.cloudfoundry.identity.uaa.client.UaaClientDetails;
67
import org.cloudfoundry.identity.uaa.mock.util.MockMvcUtils;
8+
import org.cloudfoundry.identity.uaa.mock.util.MockMvcUtils.ZoneResolutionMode;
79
import org.cloudfoundry.identity.uaa.scim.ScimUser;
810
import org.cloudfoundry.identity.uaa.test.ZoneSeeder;
911
import org.cloudfoundry.identity.uaa.test.ZoneSeederExtension;
1012
import org.cloudfoundry.identity.uaa.user.UaaAuthority;
13+
import org.cloudfoundry.identity.uaa.zone.IdentityZoneHolder;
1114
import org.junit.jupiter.api.BeforeEach;
1215
import org.junit.jupiter.api.Nested;
1316
import org.junit.jupiter.api.Test;
1417
import org.junit.jupiter.api.extension.ExtendWith;
18+
import org.junit.jupiter.params.ParameterizedTest;
19+
import org.junit.jupiter.params.provider.EnumSource;
1520
import org.springframework.beans.factory.annotation.Autowired;
21+
import org.springframework.http.HttpMethod;
1622
import org.springframework.mock.web.MockHttpSession;
1723
import org.cloudfoundry.identity.uaa.oauth.common.exceptions.RedirectMismatchException;
1824
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
@@ -235,4 +241,33 @@ private MockHttpServletRequestBuilder authCodeAuthorizeRequest(String redirectUr
235241
.param(REDIRECT_URI, redirectUri)
236242
.session(session);
237243
}
244+
245+
@Nested
246+
@DefaultTestContext
247+
class ConfirmAccessAndErrorZonePathSupport {
248+
249+
@ParameterizedTest
250+
@EnumSource(ZoneResolutionMode.class)
251+
void confirm_access_responds_for_zone_path(ZoneResolutionMode mode) throws Exception {
252+
String subdomain = "zone" + System.nanoTime();
253+
UaaClientDetails client = new UaaClientDetails("client-id", "", "openid", "authorization_code", "", "http://redirect");
254+
client.setClientSecret("secret");
255+
MockMvcUtils.createOtherIdentityZoneAndReturnResult(subdomain, mockMvc, webApplicationContext, client, IdentityZoneHolder.getCurrentZoneId());
256+
257+
mockMvc.perform(mode.createRequestBuilder(subdomain, HttpMethod.GET, "/oauth/confirm_access"))
258+
.andExpect(status().is3xxRedirection());
259+
}
260+
261+
@ParameterizedTest
262+
@EnumSource(ZoneResolutionMode.class)
263+
void oauth_error_responds_for_zone_path(ZoneResolutionMode mode) throws Exception {
264+
String subdomain = "zone" + System.nanoTime();
265+
UaaClientDetails client = new UaaClientDetails("client-id", "", "openid", "authorization_code", "", "http://redirect");
266+
client.setClientSecret("secret");
267+
MockMvcUtils.createOtherIdentityZoneAndReturnResult(subdomain, mockMvc, webApplicationContext, client, IdentityZoneHolder.getCurrentZoneId());
268+
269+
mockMvc.perform(mode.createRequestBuilder(subdomain, HttpMethod.GET, "/oauth/error"))
270+
.andExpect(status().is3xxRedirection());
271+
}
272+
}
238273
}

0 commit comments

Comments
 (0)