Skip to content

Commit 8b43097

Browse files
committed
Merge branch 'dev' into feature/handle-error-when-activity-not-found
2 parents 3906dbf + d9a322f commit 8b43097

File tree

5 files changed

+57
-3
lines changed

5 files changed

+57
-3
lines changed

changelog.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
vNext
22
----------
33
- [PATCH] Translate MFA token error to UIRequiredException instead of ServiceException (#2538)
4+
- [MINOR] Add Child Spans for Interactive Span (#2516)
5+
- [MINOR] For MSAL CPP flows, match exact claims when deleting AT with intersecting scopes (#2548)
46
- [MINOR] Handle error gracefully when amazon app url scheme is not found (#2515)
57

68
Version 18.2.2

common/src/test/java/com/microsoft/identity/common/MsalCppOAuth2TokenCacheTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,4 +534,40 @@ public void saveATSansTargetThrowsException() throws ClientException {
534534
mTestBundle.mGeneratedRefreshToken
535535
);
536536
}
537+
538+
@Test
539+
public void saveCredentialsWithSameTargetAndDifferentClaims() throws ClientException {
540+
mTestBundle.mGeneratedAccessToken.setRequestedClaims("TestClaims");
541+
mCppCache.saveCredentials(
542+
false,
543+
mTestBundle.mGeneratedAccessToken
544+
);
545+
546+
mTestBundle.mGeneratedAccessToken.setRequestedClaims(null);
547+
mCppCache.saveCredentials(
548+
false,
549+
mTestBundle.mGeneratedAccessToken
550+
);
551+
552+
List<Credential> credentials = mCppCache.getCredentials();
553+
Assert.assertEquals(credentials.size(), 1);
554+
555+
//Clear credentials and now match exact claims
556+
mCppCache.clearCache();
557+
558+
mTestBundle.mGeneratedAccessToken.setRequestedClaims("TestClaims");
559+
mCppCache.saveCredentials(
560+
true,
561+
mTestBundle.mGeneratedAccessToken
562+
);
563+
564+
mTestBundle.mGeneratedAccessToken.setRequestedClaims(null);
565+
mCppCache.saveCredentials(
566+
true,
567+
mTestBundle.mGeneratedAccessToken
568+
);
569+
570+
credentials = mCppCache.getCredentials();
571+
Assert.assertEquals(credentials.size(), 2);
572+
}
537573
}

common4j/src/main/com/microsoft/identity/common/java/cache/MsalCppOAuth2TokenCache.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,15 @@ public IAccountCredentialCache getAccountCredentialCache() {
128128
* @throws ClientException If the supplied Account or Credential are null or schema invalid.
129129
*/
130130
public synchronized void saveCredentials(@NonNull final Credential... credentials) throws ClientException {
131+
saveCredentials(false, credentials);
132+
}
133+
134+
/**
135+
* @param credentials list of Credential which can include AccessTokenRecord, IdTokenRecord and RefreshTokenRecord.
136+
* @param mustMatchExactClaims If true, match exact claims when deleting AT with intersecting scopes.
137+
* @throws ClientException If the supplied Account or Credential are null or schema invalid.
138+
*/
139+
public synchronized void saveCredentials(boolean mustMatchExactClaims, @NonNull final Credential... credentials) throws ClientException {
131140
if (credentials.length == 0) {
132141
throw new ClientException("Credential array passed in is null or empty");
133142
}
@@ -148,7 +157,7 @@ public synchronized void saveCredentials(@NonNull final Credential... credential
148157
}
149158
}
150159

151-
saveCredentialsInternal(credentials);
160+
saveCredentialsInternal(mustMatchExactClaims, credentials);
152161
}
153162

154163
/**

common4j/src/main/com/microsoft/identity/common/java/cache/MsalOAuth2TokenCache.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,13 +1635,17 @@ private void saveAccounts(final AccountRecord... accounts) {
16351635
}
16361636

16371637
void saveCredentialsInternal(final Credential... credentials) {
1638+
saveCredentialsInternal(false, credentials);
1639+
}
1640+
1641+
void saveCredentialsInternal(boolean mustMatchExactClaims, final Credential... credentials) {
16381642
for (final Credential credential : credentials) {
16391643
if (credential == null) {
16401644
continue;
16411645
}
16421646

16431647
if (credential instanceof AccessTokenRecord) {
1644-
deleteAccessTokensWithIntersectingScopes((AccessTokenRecord) credential);
1648+
deleteAccessTokensWithIntersectingScopes((AccessTokenRecord) credential, mustMatchExactClaims);
16451649
}
16461650

16471651
mAccountCredentialCache.saveCredential(credential);
@@ -1707,7 +1711,7 @@ void validateCacheArtifacts(
17071711
}
17081712

17091713
private void deleteAccessTokensWithIntersectingScopes(
1710-
final AccessTokenRecord referenceToken) {
1714+
final AccessTokenRecord referenceToken, boolean mustMatchExactClaims) {
17111715
final String methodName = "deleteAccessTokensWithIntersectingScopes";
17121716

17131717
final List<Credential> accessTokens = mAccountCredentialCache.getCredentialsFilteredBy(
@@ -1721,6 +1725,7 @@ private void deleteAccessTokensWithIntersectingScopes(
17211725
null, // Wildcard (*)
17221726
referenceToken.getAccessTokenType(),
17231727
referenceToken.getRequestedClaims(),
1728+
mustMatchExactClaims,
17241729
mAccountCredentialCache.getCredentials()
17251730
);
17261731

common4j/src/main/com/microsoft/identity/common/java/opentelemetry/SpanName.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public enum SpanName {
3131
GetAccounts,
3232
RemoveAccount,
3333
WorkplaceJoin,
34+
ATIInteractively,
35+
ATISilently,
3436
DoDiscovery,
3537
WorkplaceLeave,
3638
DeviceState,

0 commit comments

Comments
 (0)