Skip to content

Commit c29abfb

Browse files
committed
[Prod/Test] Implement /Codes zone path
1 parent 645e5c0 commit c29abfb

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

server/src/main/java/org/cloudfoundry/identity/uaa/codestore/CodeStoreEndpoints.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class CodeStoreEndpoints {
2929
this.identityZoneManager = identityZoneManager;
3030
}
3131

32-
@PostMapping({"/Codes", "/Codes/"})
32+
@PostMapping({"/Codes", "/Codes/", "/z/{subdomain}/Codes", "/z/{subdomain}/Codes/"})
3333
@ResponseStatus(HttpStatus.CREATED)
3434
@ResponseBody
3535
public ExpiringCode generateCode(@RequestBody ExpiringCode expiringCode) {
@@ -44,7 +44,7 @@ public ExpiringCode generateCode(@RequestBody ExpiringCode expiringCode) {
4444
}
4545
}
4646

47-
@GetMapping("/Codes/{code}")
47+
@GetMapping({"/Codes/{code}", "/z/{subdomain}/Codes/{code}"})
4848
@ResponseBody
4949
public ExpiringCode retrieveCode(@PathVariable String code) {
5050
ExpiringCode result;

server/src/main/java/org/cloudfoundry/identity/uaa/codestore/CodeStoreSecurityConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ UaaFilterChain codestore(
2929
@Qualifier("resourceAgnosticAuthenticationFilter") FilterRegistrationBean<OAuth2AuthenticationProcessingFilter> oauth2ResourceFilter
3030
) throws Exception {
3131
var originalFilterChain = http
32-
.securityMatcher("/Codes/**")
32+
.securityMatcher("/Codes/**", "/z/*/Codes/**")
3333
.authorizeHttpRequests(authorize -> {
3434
authorize.anyRequest().access(
3535
anyOf()
3636
.isUaaAdmin()
37+
.isZoneAdmin()
3738
.hasScope("oauth.login")
3839
);
3940
})

uaa/src/test/java/org/cloudfoundry/identity/uaa/mock/codestore/CodeStoreEndpointsMockMvcTests.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
package org.cloudfoundry.identity.uaa.mock.codestore;
22

33
import org.cloudfoundry.identity.uaa.DefaultTestContext;
4+
import org.cloudfoundry.identity.uaa.client.UaaClientDetails;
45
import org.cloudfoundry.identity.uaa.codestore.ExpiringCode;
56
import org.cloudfoundry.identity.uaa.codestore.JdbcExpiringCodeStore;
7+
import org.cloudfoundry.identity.uaa.mock.util.MockMvcUtils;
8+
import org.cloudfoundry.identity.uaa.mock.util.MockMvcUtils.ZoneResolutionMode;
69
import org.cloudfoundry.identity.uaa.test.TestClient;
710
import org.cloudfoundry.identity.uaa.util.JsonUtils;
11+
import org.cloudfoundry.identity.uaa.zone.IdentityZoneHolder;
812
import org.junit.jupiter.api.AfterEach;
913
import org.junit.jupiter.api.BeforeEach;
1014
import org.junit.jupiter.api.Nested;
1115
import org.junit.jupiter.api.Test;
1216
import org.junit.jupiter.params.ParameterizedTest;
17+
import org.junit.jupiter.params.provider.EnumSource;
1318
import org.junit.jupiter.params.provider.ValueSource;
1419
import org.springframework.beans.factory.annotation.Autowired;
1520
import org.springframework.beans.factory.annotation.Value;
21+
import org.springframework.http.HttpMethod;
1622
import org.springframework.http.MediaType;
1723
import org.springframework.jdbc.core.JdbcTemplate;
1824
import org.springframework.test.web.servlet.MockMvc;
1925
import org.springframework.test.web.servlet.MvcResult;
2026
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
27+
import org.springframework.web.context.WebApplicationContext;
2128

2229
import java.sql.Timestamp;
2330

@@ -41,6 +48,9 @@ class CodeStoreEndpointsMockMvcTests {
4148
private JdbcTemplate jdbcTemplate;
4249
private JdbcExpiringCodeStore jdbcExpiringCodeStore;
4350

51+
@Autowired
52+
private WebApplicationContext webApplicationContext;
53+
4454
@BeforeEach
4555
void setUp(@Autowired JdbcTemplate jdbcTemplate,
4656
@Autowired JdbcExpiringCodeStore jdbcExpiringCodeStore,
@@ -325,6 +335,30 @@ void verifyExpirationIntervalWorks(String url) throws Exception {
325335
}
326336
}
327337

338+
@Nested
339+
@DefaultTestContext
340+
class CodesZonePathSupport {
341+
342+
@ParameterizedTest
343+
@EnumSource(ZoneResolutionMode.class)
344+
void codes_endpoint_responds_for_zone_path(ZoneResolutionMode mode) throws Exception {
345+
String subdomain = "codeszone" + System.nanoTime();
346+
UaaClientDetails loginClient = new UaaClientDetails("login", "", "oauth.login", "client_credentials", "", "http://redirect");
347+
loginClient.setClientSecret("loginsecret");
348+
MockMvcUtils.createOtherIdentityZoneAndReturnResult(subdomain, mockMvc, webApplicationContext, loginClient, IdentityZoneHolder.getCurrentZoneId());
349+
350+
Timestamp ts = new Timestamp(System.currentTimeMillis() + 60000);
351+
ExpiringCode code = new ExpiringCode(null, ts, "{}", null);
352+
String requestBody = JsonUtils.writeValueAsString(code);
353+
354+
mockMvc.perform(mode.createRequestBuilder(subdomain, HttpMethod.POST, "/Codes")
355+
.contentType(APPLICATION_JSON)
356+
.accept(MediaType.APPLICATION_JSON)
357+
.content(requestBody))
358+
.andExpect(status().isUnauthorized());
359+
}
360+
}
361+
328362
private void expireAllCodes() {
329363
jdbcExpiringCodeStore.setExpirationInterval(0);
330364
Timestamp expired = new Timestamp(System.currentTimeMillis() - 5000);

0 commit comments

Comments
 (0)