Skip to content

Commit 0c08fb6

Browse files
committed
Merge branch 'develop' of github.com:cloudfoundry/uaa into fix/redirect-when-only-saml-allowed
* 'develop' of github.com:cloudfoundry/uaa: Backfill test cases for using refresh token value that was created with refresh_token_validity seconds specified [#178076368] Bump Spring Dependencies (#1580) fix: test token audience claim in an unordered way
2 parents 18f6e2a + db47c2b commit 0c08fb6

File tree

5 files changed

+98
-12
lines changed

5 files changed

+98
-12
lines changed

dependencies.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ versions.aspectJVersion = "1.9.4"
1212
versions.apacheDsVersion = "2.0.0.AM26"
1313
versions.bouncyCastleVersion = "1.69"
1414
versions.hamcrestVersion = "2.2"
15-
versions.springBootVersion = "2.4.6"
15+
versions.springBootVersion = "2.4.7"
1616
versions.springSecurityJwtVersion = "1.1.1.RELEASE"
1717
versions.springSecurityOAuthVersion = "2.5.0.RELEASE"
1818
versions.springSecuritySamlVersion = "1.0.10.RELEASE"
19-
versions.springVersion = "5.3.7"
19+
versions.springVersion = "5.3.8"
2020
versions.xmlBind = "2.3.0.1"
2121
versions.tomcatCargoVersion = "9.0.46"
2222

server/src/test/java/org/cloudfoundry/identity/uaa/oauth/DeprecatedUaaTokenServicesTests.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import static org.hamcrest.MatcherAssert.assertThat;
7676
import static org.hamcrest.Matchers.startsWith;
7777
import static org.hamcrest.Matchers.*;
78+
import static org.hamcrest.Matchers.containsInAnyOrder;
7879
import static org.hamcrest.core.AllOf.allOf;
7980
import static org.hamcrest.number.OrderingComparison.greaterThan;
8081
import static org.hamcrest.number.OrderingComparison.lessThanOrEqualTo;
@@ -2103,7 +2104,7 @@ private void assertCommonClientAccessTokenProperties(OAuth2AccessToken accessTok
21032104
username(is(nullValue())),
21042105
cid(is(CLIENT_ID)),
21052106
scope(is(tokenSupport.clientScopes)),
2106-
audience(is(tokenSupport.resourceIds)),
2107+
audience(containsInAnyOrder(tokenSupport.resourceIds.toArray(new String[]{}))),
21072108
jwtId(not(isEmptyString())),
21082109
issuedAt(is(greaterThan(0))),
21092110
expiry(is(greaterThan(0)))));
@@ -2114,7 +2115,7 @@ private void assertCommonUserAccessTokenProperties(OAuth2AccessToken accessToken
21142115
assertThat(accessToken, allOf(username(is(tokenSupport.username)),
21152116
clientId(is(clientId)),
21162117
subject(is(tokenSupport.userId)),
2117-
audience(is(tokenSupport.resourceIds)),
2118+
audience(containsInAnyOrder(tokenSupport.resourceIds.toArray(new String[]{}))),
21182119
origin(is(OriginKeys.UAA)),
21192120
revocationSignature(is(not(nullValue()))),
21202121
cid(is(clientId)),
@@ -2132,7 +2133,7 @@ private void assertCommonUserRefreshTokenProperties(OAuth2RefreshToken refreshTo
21322133
OAuth2RefreshTokenMatchers.username(is(tokenSupport.username)),
21332134
OAuth2RefreshTokenMatchers.clientId(is(CLIENT_ID)),
21342135
OAuth2RefreshTokenMatchers.subject(is(not(nullValue()))),
2135-
OAuth2RefreshTokenMatchers.audience(is(tokenSupport.resourceIds)),
2136+
OAuth2RefreshTokenMatchers.audience(containsInAnyOrder(tokenSupport.resourceIds.toArray(new String[]{}))),
21362137
OAuth2RefreshTokenMatchers.origin(is(OriginKeys.UAA)),
21372138
OAuth2RefreshTokenMatchers.revocationSignature(is(not(nullValue()))),
21382139
OAuth2RefreshTokenMatchers.jwtId(not(isEmptyString())),

server/src/test/java/org/cloudfoundry/identity/uaa/oauth/token/matchers/OAuth2AccessTokenMatchers.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public static Matcher<OAuth2AccessToken> scope(Matcher<Object> scopes) {
6161
return new OAuth2AccessTokenMatchers(ClaimConstants.SCOPE, scopes);
6262
}
6363

64-
public static Matcher<OAuth2AccessToken> audience(Matcher<Object> resourceIds) {
64+
public static Matcher<OAuth2AccessToken> audience(Matcher<Iterable<? extends String>> resourceIds) {
6565
return new OAuth2AccessTokenMatchers(ClaimConstants.AUD, resourceIds);
6666
}
6767

server/src/test/java/org/cloudfoundry/identity/uaa/oauth/token/matchers/OAuth2RefreshTokenMatchers.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static Matcher<OAuth2RefreshToken> scope(Matcher<Object> scopes) {
6262
return new OAuth2RefreshTokenMatchers(ClaimConstants.GRANTED_SCOPES, scopes);
6363
}
6464

65-
public static Matcher<OAuth2RefreshToken> audience(Matcher<Object> resourceIds) {
65+
public static Matcher<OAuth2RefreshToken> audience(Matcher<Iterable<? extends String>> resourceIds) {
6666
return new OAuth2RefreshTokenMatchers(ClaimConstants.AUD, resourceIds);
6767
}
6868

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

+90-5
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,11 @@
2222
import org.cloudfoundry.identity.uaa.oauth.token.CompositeToken;
2323
import org.cloudfoundry.identity.uaa.user.JdbcUaaUserDatabase;
2424
import org.cloudfoundry.identity.uaa.user.UaaUser;
25+
import org.cloudfoundry.identity.uaa.util.TimeService;
2526
import org.cloudfoundry.identity.uaa.util.UaaTokenUtils;
2627
import org.cloudfoundry.identity.uaa.zone.MultitenantClientServices;
2728
import org.joda.time.DateTime;
28-
import org.junit.jupiter.api.AfterEach;
29-
import org.junit.jupiter.api.BeforeEach;
30-
import org.junit.jupiter.api.DisplayName;
31-
import org.junit.jupiter.api.Nested;
32-
import org.junit.jupiter.api.Test;
29+
import org.junit.jupiter.api.*;
3330
import org.junit.jupiter.params.ParameterizedTest;
3431
import org.junit.jupiter.params.provider.Arguments;
3532
import org.junit.jupiter.params.provider.MethodSource;
@@ -481,6 +478,94 @@ void happyCase(List<String> amrs) {
481478
}
482479
}
483480

481+
@Nested
482+
@DisplayName("when the client was created with refresh_token_validity specified")
483+
@DefaultTestContext
484+
@TestPropertySource(properties = {"uaa.url=https://uaa.some.test.domain.com:555/uaa"})
485+
@DirtiesContext
486+
class WhenRefreshTokenValidityIsSpecified {
487+
private RefreshTokenCreator refreshTokenCreator;
488+
private RefreshTokenRequestData refreshTokenRequestData;
489+
private UaaUser uaaUser;
490+
private TokenRequest tokenRequest;
491+
492+
@Autowired
493+
private TokenEndpointBuilder tokenEndpointBuilder;
494+
@Autowired
495+
private TimeService timeService;
496+
@Autowired
497+
private KeyInfoService keyInfoService;
498+
499+
@BeforeEach
500+
void init() {
501+
refreshTokenRequestData = new RefreshTokenRequestData(
502+
GRANT_TYPE_AUTHORIZATION_CODE,
503+
Sets.newHashSet("openid", "user_attributes"),
504+
null,
505+
"",
506+
Sets.newHashSet(""),
507+
"jku_test",
508+
false,
509+
new Date(),
510+
null,
511+
null
512+
);
513+
uaaUser = jdbcUaaUserDatabase.retrieveUserByName("admin", "uaa");
514+
tokenRequest = new TokenRequest(new HashMap<>(), "jku_test",
515+
Lists.newArrayList("openid", "user_attributes"),
516+
GRANT_TYPE_REFRESH_TOKEN);
517+
}
518+
519+
@ParameterizedTest
520+
@ValueSource(ints = { 3600, 24*3600*15, Integer.MAX_VALUE })
521+
void validExpClaim(int validitySeconds) {
522+
RefreshTokenCreator refreshTokenCreator = createRefreshTokenCreator(
523+
validitySeconds);
524+
CompositeExpiringOAuth2RefreshToken refreshToken =
525+
refreshTokenCreator.createRefreshToken(uaaUser,
526+
refreshTokenRequestData, null);
527+
Assertions.assertNotNull(refreshToken);
528+
529+
OAuth2AccessToken accessToken = tokenServices.refreshAccessToken(
530+
refreshToken.getValue(), tokenRequest);
531+
Assertions.assertNotNull(accessToken);
532+
}
533+
534+
@ParameterizedTest
535+
@ValueSource(ints = { -3600, Integer.MIN_VALUE })
536+
void invalidExpClaim(int validitySeconds) {
537+
RefreshTokenCreator refreshTokenCreator = createRefreshTokenCreator(
538+
validitySeconds);
539+
CompositeExpiringOAuth2RefreshToken refreshToken =
540+
refreshTokenCreator.createRefreshToken(uaaUser,
541+
refreshTokenRequestData, null);
542+
Assertions.assertNotNull(refreshToken);
543+
544+
// Verifying with generic Exception instead of specific type because
545+
// refreshAccessToken() throws an Exception of which type is
546+
// different from the one that is declared in its method signature
547+
Assertions.assertThrows(Exception.class, () ->
548+
tokenServices.refreshAccessToken(refreshToken.getValue(),
549+
tokenRequest));
550+
}
551+
552+
private RefreshTokenCreator createRefreshTokenCreator(
553+
int validitySeconds) {
554+
TokenValidityResolver tokenValidityResolver =
555+
new TokenValidityResolver(
556+
new ClientTokenValidity() {
557+
public Integer getValiditySeconds(String clientId) {
558+
return validitySeconds;
559+
}
560+
public Integer getZoneValiditySeconds() {
561+
return 2592000;
562+
}
563+
}, 2592000, timeService);
564+
return new RefreshTokenCreator(false, tokenValidityResolver,
565+
tokenEndpointBuilder, timeService, keyInfoService);
566+
}
567+
}
568+
484569
private OAuth2Authentication constructUserAuthenticationFromAuthzRequest(AuthorizationRequest authzRequest,
485570
String userId,
486571
String userOrigin,

0 commit comments

Comments
 (0)