Skip to content

Commit 347d865

Browse files
committed
Merge branch '114247167-identity-zone-test'
[Completes #114247167]
2 parents 9dd3675 + 56f4c59 commit 347d865

File tree

27 files changed

+625
-196
lines changed

27 files changed

+625
-196
lines changed

.idea/dictionaries/bhale.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/integration_test.xml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ci/integration-test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ run:
1414
path: cf-java-client/ci/integration-test.sh
1515

1616
params:
17+
TEST_ADMIN_CLIENTID:
18+
TEST_ADMIN_CLIENTSECRET:
19+
TEST_ADMIN_PASSWORD:
20+
TEST_ADMIN_USERNAME:
1721
TEST_APIHOST:
18-
TEST_PASSWORD:
1922
TEST_SKIPSSLVALIDATION:
20-
TEST_UAA_CLIENTID:
21-
TEST_UAA_CLIENTSECRET:
22-
TEST_USERNAME:

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/_DefaultConnectionContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.cloudfoundry.reactor;
1818

19+
import com.fasterxml.jackson.databind.DeserializationFeature;
1920
import com.fasterxml.jackson.databind.ObjectMapper;
2021
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
2122
import org.cloudfoundry.reactor.util.DefaultSslCertificateTruster;
@@ -75,6 +76,7 @@ public HttpClient getHttpClient() {
7576
public ObjectMapper getObjectMapper() {
7677
ObjectMapper objectMapper = new ObjectMapper()
7778
.disable(FAIL_ON_UNKNOWN_PROPERTIES)
79+
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
7880
.registerModule(new Jdk8Module())
7981
.setSerializationInclusion(NON_NULL);
8082

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/AbstractUaaTokenProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.cloudfoundry.reactor.util.JsonCodec;
2424
import org.cloudfoundry.reactor.util.NetworkLogging;
2525
import org.immutables.value.Value;
26+
import org.slf4j.Logger;
27+
import org.slf4j.LoggerFactory;
2628
import org.springframework.web.util.UriComponentsBuilder;
2729
import reactor.core.publisher.Flux;
2830
import reactor.core.publisher.Mono;
@@ -34,6 +36,8 @@
3436

3537
abstract class AbstractUaaTokenProvider implements TokenProvider {
3638

39+
private static final Logger LOGGER = LoggerFactory.getLogger("cloudfoundry-client.token");
40+
3741
private static final Duration REFRESH_MARGIN = Duration.ofSeconds(10);
3842

3943
private final Object refreshTokenMonitor = new Object();
@@ -103,6 +107,7 @@ private Mono<String> getTokenFlow(ConnectionContext connectionContext) {
103107
))
104108
.repeat()
105109
.cast(String.class)
110+
.doOnNext(token -> LOGGER.debug("JWT Token: {}", token))
106111
.cache(1)
107112
.next();
108113
}

cloudfoundry-client/src/main/java/org/cloudfoundry/uaa/identityzones/_KeyInformation.java renamed to cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/_ClientCredentialsGrantTokenProvider.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.cloudfoundry.uaa.identityzones;
17+
package org.cloudfoundry.reactor.tokenprovider;
1818

19-
import com.fasterxml.jackson.annotation.JsonProperty;
20-
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
21-
import org.cloudfoundry.Nullable;
19+
import org.cloudfoundry.reactor.TokenProvider;
2220
import org.immutables.value.Value;
21+
import org.springframework.web.util.UriComponentsBuilder;
2322

2423
/**
25-
* The payload for the token policy keys
24+
* The Client Credentials Grant implementation of {@link TokenProvider}
2625
*/
27-
@JsonDeserialize
2826
@Value.Immutable
29-
abstract class _KeyInformation {
27+
abstract class _ClientCredentialsGrantTokenProvider extends AbstractUaaTokenProvider {
3028

31-
/**
32-
* The Signing key
33-
*/
34-
@JsonProperty("signingKey")
35-
@Nullable
36-
abstract String getSigningKey();
29+
@Override
30+
protected UriComponentsBuilder getAccessTokenUri(UriComponentsBuilder builder) {
31+
return builder
32+
.queryParam("client_id", getClientId())
33+
.queryParam("client_secret", getClientSecret())
34+
.queryParam("grant_type", "client_credentials")
35+
.queryParam("response_type", "token");
36+
}
3737

3838
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/_PasswordGrantTokenProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ abstract class _PasswordGrantTokenProvider extends AbstractUaaTokenProvider {
2929
@Override
3030
protected UriComponentsBuilder getAccessTokenUri(UriComponentsBuilder builder) {
3131
return builder
32-
.queryParam("grant_type", "password")
3332
.queryParam("client_id", getClientId())
3433
.queryParam("client_secret", getClientSecret())
35-
.queryParam("username", getUsername())
36-
.queryParam("password", getPassword());
34+
.queryParam("grant_type", "password")
35+
.queryParam("password", getPassword())
36+
.queryParam("username", getUsername());
3737
}
3838

3939
/**

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/uaa/UsernameProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.security.KeyFactory;
3232
import java.security.PublicKey;
3333
import java.security.spec.X509EncodedKeySpec;
34+
import java.util.Optional;
3435

3536
import static org.cloudfoundry.util.tuple.TupleUtils.function;
3637

@@ -81,7 +82,9 @@ private static Mono<PublicKey> getSigningKey(Tokens tokens) {
8182

8283
private static String getUsername(PublicKey publicKey, String token) {
8384
Jws<Claims> jws = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);
84-
return jws.getBody().get("user_name", String.class);
85+
return Optional
86+
.ofNullable(jws.getBody().get("user_name", String.class))
87+
.orElseThrow(() -> new IllegalStateException("Unable to retrieve username from token"));
8588
}
8689

8790
private static Mono<GetTokenKeyResponse> requestTokenKey(Tokens tokens) {

cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/AbstractRestTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.cloudfoundry.reactor;
1818

19+
import com.fasterxml.jackson.databind.DeserializationFeature;
1920
import com.fasterxml.jackson.databind.ObjectMapper;
2021
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
2122
import okhttp3.mockwebserver.Dispatcher;
@@ -38,6 +39,7 @@ public abstract class AbstractRestTest {
3839
.httpClient(HttpClient.create())
3940
.objectMapper(new ObjectMapper()
4041
.addHandler(new FailingDeserializationProblemHandler())
42+
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
4143
.registerModule(new Jdk8Module())
4244
.setSerializationInclusion(NON_NULL))
4345
.build();

cloudfoundry-client-reactor/src/test/java/org/cloudfoundry/reactor/uaa/clients/ReactorClientsTest.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
import static io.netty.handler.codec.http.HttpMethod.PUT;
4141
import static io.netty.handler.codec.http.HttpResponseStatus.CREATED;
4242
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
43+
import static org.cloudfoundry.uaa.tokens.GrantType.AUTHORIZATION_CODE;
4344
import static org.cloudfoundry.uaa.tokens.GrantType.CLIENT_CREDENTIALS;
45+
import static org.cloudfoundry.uaa.tokens.GrantType.REFRESH_TOKEN;
4446

4547
public final class ReactorClientsTest {
4648

@@ -148,6 +150,66 @@ protected Mono<DeleteClientResponse> invoke(DeleteClientRequest request) {
148150
}
149151
}
150152

153+
public static final class Deserialize extends AbstractUaaApiTest<ListClientsRequest, ListClientsResponse> {
154+
155+
private final ReactorClients clients = new ReactorClients(CONNECTION_CONTEXT, this.root, TOKEN_PROVIDER);
156+
157+
@Override
158+
protected InteractionContext getInteractionContext() {
159+
return InteractionContext.builder()
160+
.request(TestRequest.builder()
161+
.method(GET).path("/oauth/clients")
162+
.build())
163+
.response(TestResponse.builder()
164+
.status(OK)
165+
.payload("fixtures/uaa/clients/GET_response_deserialize.json")
166+
.build())
167+
.build();
168+
}
169+
170+
@Override
171+
protected ListClientsResponse getResponse() {
172+
return ListClientsResponse.builder()
173+
.resource(Client.builder()
174+
.action("none")
175+
.authority("uaa.none")
176+
.authorizedGrantType(AUTHORIZATION_CODE, REFRESH_TOKEN)
177+
.autoApprove("true")
178+
.clientId("ssh-proxy")
179+
.lastModified(1469112324000L)
180+
.redirectUriPattern("/login")
181+
.resourceId("none")
182+
.scope("openid", "cloud_controller.read", "cloud_controller.write")
183+
.build())
184+
.resource(Client.builder()
185+
.action("none")
186+
.authority("routing.routes.write", "routing.routes.read")
187+
.authorizedGrantType(CLIENT_CREDENTIALS, REFRESH_TOKEN)
188+
.autoApprove("routing.routes.write", "routing.routes.read")
189+
.clientId("tcp_emitter")
190+
.lastModified(1469112324000L)
191+
.resourceId("none")
192+
.scope("uaa.none")
193+
.build())
194+
.startIndex(1)
195+
.itemsPerPage(2)
196+
.totalResults(2)
197+
.schema("http://cloudfoundry.org/schema/scim/oauth-clients-1.0")
198+
.build();
199+
}
200+
201+
@Override
202+
protected ListClientsRequest getValidRequest() throws Exception {
203+
return ListClientsRequest.builder()
204+
.build();
205+
}
206+
207+
@Override
208+
protected Mono<ListClientsResponse> invoke(ListClientsRequest request) {
209+
return this.clients.list(request);
210+
}
211+
}
212+
151213
public static final class Get extends AbstractUaaApiTest<GetClientRequest, GetClientResponse> {
152214

153215
private final ReactorClients clients = new ReactorClients(CONNECTION_CONTEXT, this.root, TOKEN_PROVIDER);

0 commit comments

Comments
 (0)