Skip to content

Commit c0d91ab

Browse files
committed
Merge dev into sjain/working/release/23.1.1
2 parents e4e6b15 + ea12611 commit c0d91ab

File tree

32 files changed

+957
-480
lines changed

32 files changed

+957
-480
lines changed

LabApiUtilities/src/main/com/microsoft/identity/labapi/utilities/authentication/LabApiAuthenticationClient.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,48 +51,47 @@ public class LabApiAuthenticationClient implements IAccessTokenSupplier {
5151
private final static int ATTEMPT_RETRY_WAIT = 3;
5252
private final String mLabCredential;
5353
private final String mLabCertPassword;
54-
private final String mScope;
54+
private final String defaultScope = LabConstants.DEFAULT_LAB_SCOPE;
5555
private final String mClientId;
5656

57-
5857
public LabApiAuthenticationClient(@NonNull final String labSecret) {
59-
this(labSecret, null, null, null);
58+
this(labSecret, null, null);
6059
}
6160

6261
public LabApiAuthenticationClient(@NonNull final String labSecret, final String labCertPassword) {
63-
this(labSecret, labCertPassword, null, null);
64-
}
65-
66-
public LabApiAuthenticationClient(@NonNull final String labSecret, @NonNull final String scope, @NonNull final String clientId) {
67-
this(labSecret, null, scope, clientId);
62+
this(labSecret, labCertPassword, null);
6863
}
6964

70-
public LabApiAuthenticationClient(@NonNull final String labSecret, final String labCertPassword, final String scope, final String clientId) {
65+
public LabApiAuthenticationClient(@NonNull final String labSecret, final String labCertPassword, final String clientId) {
7166
mLabCredential = labSecret;
7267
mLabCertPassword = labCertPassword;
73-
mScope = scope != null ? scope : LabConstants.DEFAULT_LAB_SCOPE;
7468
mClientId = clientId != null ? clientId : LabConstants.DEFAULT_LAB_CLIENT_ID;
7569
}
7670

7771
@Override
7872
public String getAccessToken() throws LabApiException {
79-
return getAccessToken(DEFAULT_ACCESS_TOKEN_RETRIES);
73+
return getAccessToken(DEFAULT_ACCESS_TOKEN_RETRIES, null);
74+
}
75+
76+
public String getAccessTokenForCustomScope(final String scope) throws LabApiException {
77+
return getAccessToken(DEFAULT_ACCESS_TOKEN_RETRIES, scope);
8078
}
8179

8280
/**
8381
* Attempt to acquire an access token. Accepts a parameter to denote number of retries
8482
* @param retries how many times to attempt acquire access token before returning a failure.
83+
* @param customScope the custom scope for which the access token is requested. If null, use the default scope.
8584
* @return an access token for Lab API
8685
* @throws LabApiException exception given back by Lab API
8786
*/
88-
public String getAccessToken(final int retries) throws LabApiException {
87+
public String getAccessToken(final int retries, final String customScope) throws LabApiException {
8988

9089
// Do this in a loop, if we get an exception or null result, try again
9190
for (int i = 1; i <= retries; i++) {
9291
System.out.printf(Locale.ENGLISH, "getAccessToken attempt #%d%n", i);
9392

9493
try {
95-
final String result = getAccessTokenInternal();
94+
final String result = getAccessTokenInternal(customScope);
9695
if (result != null) {
9796
return result;
9897
}
@@ -120,12 +119,19 @@ public String getAccessToken(final int retries) throws LabApiException {
120119
return null;
121120
}
122121

123-
private String getAccessTokenInternal() throws LabApiException {
122+
private String getAccessTokenInternal(final String customScope) throws LabApiException {
123+
final String authScope;
124+
if (customScope != null) {
125+
authScope = customScope;
126+
} else {
127+
authScope = defaultScope;
128+
}
129+
124130
final IConfidentialAuthClient confidentialAuthClient = new Msal4jAuthClient();
125131
final TokenParameters tokenParameters = TokenParameters.builder()
126132
.clientId(mClientId)
127133
.authority(AUTHORITY)
128-
.scope(mScope)
134+
.scope(authScope)
129135
.build();
130136

131137
final IAuthenticationResult authenticationResult;

LabApiUtilities/src/main/com/microsoft/identity/labapi/utilities/client/LabClient.java

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,6 @@
6161
public class LabClient implements ILabClient {
6262

6363
private final LabApiAuthenticationClient mLabApiAuthenticationClient;
64-
private final LabApiAuthenticationClient mLabApiAuthenticationClientForKeyVault = new LabApiAuthenticationClient(
65-
BuildConfig.LAB_CLIENT_SECRET, KEYVAULT_SCOPE, DEFAULT_LAB_CLIENT_ID
66-
);
6764
private final long PASSWORD_RESET_WAIT_DURATION = TimeUnit.SECONDS.toMillis(65);
6865
private final long LAB_API_RETRY_WAIT = TimeUnit.SECONDS.toMillis(5);
6966

@@ -229,10 +226,7 @@ private ILabAccount createTempAccountInternal(@NonNull final TempUserType tempUs
229226
mLabApiAuthenticationClient.getAccessToken()
230227
);
231228

232-
final String createTempUserFunctionCode = getKeyVaultSecret(
233-
CreateTempUserApi.AZURE_FUNCTION_CODE_SECRET_NAME
234-
);
235-
final CreateTempUserApi createTempUserApi = new CreateTempUserApi(createTempUserFunctionCode);
229+
final CreateTempUserApi createTempUserApi = new CreateTempUserApi();
236230
createTempUserApi.getApiClient().setReadTimeout(TEMP_USER_API_READ_TIMEOUT);
237231
final TempUser tempUser;
238232

@@ -311,7 +305,7 @@ public String getPasswordForGuestUser(LabGuestAccount guestUser) throws LabApiEx
311305
@Override
312306
public String getKeyVaultSecret(@NonNull final String secretName) throws LabApiException {
313307
Configuration.getKeyVaultApiClient().setAccessToken(
314-
mLabApiAuthenticationClientForKeyVault.getAccessToken()
308+
mLabApiAuthenticationClient.getAccessTokenForCustomScope(KEYVAULT_SCOPE)
315309
);
316310
final KeyVaultSecretsApi keyVaultSecretsApi = new KeyVaultSecretsApi();
317311

@@ -329,14 +323,10 @@ public boolean deleteDevice(@NonNull final String upn,
329323
Configuration.getDefaultApiClient().setAccessToken(
330324
mLabApiAuthenticationClient.getAccessToken()
331325
);
332-
333-
final String deleteDeviceFunctionCode = getKeyVaultSecret(
334-
DeleteDeviceApi.AZURE_FUNCTION_CODE_SECRET_NAME
335-
);
336-
final DeleteDeviceApi deleteDeviceApi = new DeleteDeviceApi(deleteDeviceFunctionCode);
326+
final DeleteDeviceApi deleteDeviceApi = new DeleteDeviceApi();
337327

338328
try {
339-
final CustomSuccessResponse successResponse = deleteDeviceApi.apiDeleteDeviceDelete(
329+
final String successResponse = deleteDeviceApi.apiDeleteDeviceDelete(
340330
upn, deviceId
341331
);
342332

@@ -346,12 +336,12 @@ public boolean deleteDevice(@NonNull final String upn,
346336

347337
// we probably need a more sophisticated logger integrated into LabApi
348338
// for now this is fine
349-
System.out.println(successResponse.getResult());
339+
System.out.println(successResponse);
350340

351341
final String expectedResult = String.format(
352342
"Device : %s, successfully deleted from AAD.", deviceId
353343
);
354-
return expectedResult.equalsIgnoreCase(successResponse.getResult());
344+
return expectedResult.equalsIgnoreCase(successResponse);
355345
} catch (final com.microsoft.identity.internal.test.labapi.ApiException ex) {
356346
throw new LabApiException(
357347
LabError.FAILED_TO_DELETE_DEVICE, ex,
@@ -435,10 +425,10 @@ private String getPassword(final String credentialVaultKeyName) throws LabApiExc
435425

436426
@Override
437427
public boolean resetPassword(@NonNull final String upn) throws LabApiException {
438-
final String resetApiFunctionCode = getKeyVaultSecret(
439-
ResetApi.AZURE_FUNCTION_CODE_SECRET_NAME
428+
Configuration.getDefaultApiClient().setAccessToken(
429+
mLabApiAuthenticationClient.getAccessToken()
440430
);
441-
final ResetApi resetApi = new ResetApi(resetApiFunctionCode);
431+
final ResetApi resetApi = new ResetApi();
442432
try {
443433
final CustomSuccessResponse resetResponse = resetApi.apiResetPut(upn, ResetOperation.PASSWORD.toString());
444434
if (resetResponse == null) {
@@ -512,10 +502,7 @@ public boolean enablePolicy(@NonNull final String upn, @NonNull final Protection
512502
Configuration.getDefaultApiClient().setAccessToken(
513503
mLabApiAuthenticationClient.getAccessToken()
514504
);
515-
final String enablePolicyFunctionCode = getKeyVaultSecret(
516-
EnablePolicyApi.AZURE_FUNCTION_CODE_SECRET_NAME
517-
);
518-
final EnablePolicyApi enablePolicyApi = new EnablePolicyApi(enablePolicyFunctionCode);
505+
final EnablePolicyApi enablePolicyApi = new EnablePolicyApi();
519506
try {
520507
final CustomSuccessResponse enablePolicyResult = enablePolicyApi.apiEnablePolicyPut(upn, policy.toString());
521508
final String expectedResult = (policy + " Enabled for user : " + upn).toLowerCase();
@@ -537,10 +524,10 @@ public boolean enablePolicy(@NonNull final String upn, @NonNull final Protection
537524
* @return boolean value indicating policy is disabled or not for the upn.
538525
*/
539526
public boolean disablePolicy(@NonNull final String upn, @NonNull final ProtectionPolicy policy) throws LabApiException {
540-
final String disablePolicyFunctionCode = getKeyVaultSecret(
541-
DisablePolicyApi.AZURE_FUNCTION_CODE_SECRET_NAME
527+
Configuration.getDefaultApiClient().setAccessToken(
528+
mLabApiAuthenticationClient.getAccessToken()
542529
);
543-
final DisablePolicyApi disablePolicyApi = new DisablePolicyApi(disablePolicyFunctionCode);
530+
final DisablePolicyApi disablePolicyApi = new DisablePolicyApi();
544531
try {
545532
final CustomSuccessResponse disablePolicyResponse = disablePolicyApi.apiDisablePolicyPut(upn, policy.toString());
546533
final String expectedResult = (policy + " Disabled for user : " + upn).toLowerCase();

LabApiUtilities/src/main/com/microsoft/identity/labapi/utilities/constants/LabConstants.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ static final class TempUserPolicy {
163163
}
164164

165165
static final class ResetOperation {
166-
public static final String MFA = "MFA";
167-
public static final String PASSWORD = "Password";
166+
public static final String MFA = "mfa";
167+
public static final String PASSWORD = "password";
168168
}
169169

170170
static final class HasAltId {

LabApiUtilities/src/test/com/microsoft/identity/labapi/utilities/client/LabClientTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ public void canCreateMAMCATempUser() {
171171
}
172172

173173
@Test
174-
@Ignore
175174
public void canResetPassword() {
176175
try {
177176
final ILabAccount labAccount = mLabClient.createTempAccount(TempUserType.BASIC);
@@ -183,7 +182,6 @@ public void canResetPassword() {
183182
}
184183

185184
@Test
186-
@Ignore
187185
public void canEnablePolicy() {
188186
try {
189187
final ILabAccount labAccount = mLabClient.createTempAccount(TempUserType.BASIC);
@@ -195,7 +193,6 @@ public void canEnablePolicy() {
195193
}
196194

197195
@Test
198-
@Ignore
199196
public void canDisablePolicy() {
200197
try {
201198
final ILabAccount labAccount = mLabClient.createTempAccount(TempUserType.MAM_CA);

azure-pipelines/continuous-delivery/common-cd.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ variables:
1616
versionNumber: ${{ variables.customVersion }}
1717

1818
pool:
19-
name: Hosted Windows 2019 with VS2019
19+
name: MSSecurity-1ES-Build-Agents-Pool
20+
image: MSSecurity-1ES-Windows-2022
21+
os: windows
2022
jobs:
2123
# Key Vault
2224
- job: keyvault_phase

changelog.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ Version 23.1.1
33
- [PATCH] Share SharedPreferencesInMemoryCache across instances of BrokerOAuth2TokenCache (#2813)
44
- [PATCH] Use SharedPreferencesInMemoryCache implementation in Broker (#2802)
55

6+
Version 23.1.0
7+
----------
8+
- [MINOR] Determine whether broker app opts out from battery optimization (#2819)
9+
- [MINOR] Cache Active Broker In Memory (BrokerDiscoveryClient) (#2817)
10+
- [MINOR] Enable Broker Discovery by default in MSAL/Broker API (#2818)
11+
- [MINOR] Share SharedPreferencesInMemoryCache across instances of BrokerOAuth2TokenCache
12+
- [MINOR] Use SharedPreferencesInMemoryCache implementation in Broker (#2802)
13+
- [MINOR] Fix for SDL violation in device pop scenarios, Fixes AB#3284510 (#2744)
14+
615
Version 23.1.0
716
----------
817
- [MINOR] Add OpenTelemetry support for passkey operations (#2795)

common/src/androidTest/java/com/microsoft/identity/common/internal/platform/AndroidDevicePoPManagerEncryptionTests.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,27 @@
2424

2525
import android.os.Build;
2626

27+
import androidx.annotation.NonNull;
2728
import androidx.test.core.app.ApplicationProvider;
2829

2930
import com.microsoft.identity.common.java.crypto.IDevicePopManager;
3031
import com.microsoft.identity.common.java.exception.ClientException;
32+
import com.microsoft.identity.common.java.flighting.CommonFlight;
33+
import com.microsoft.identity.common.java.flighting.CommonFlightsManager;
34+
import com.microsoft.identity.common.java.flighting.IFlightsManager;
35+
import com.microsoft.identity.common.java.flighting.IFlightsProvider;
3136

37+
import org.jetbrains.annotations.NotNull;
3238
import org.junit.After;
3339
import org.junit.Assert;
3440
import org.junit.Before;
3541
import org.junit.Test;
3642
import org.junit.runner.RunWith;
3743
import org.junit.runners.Parameterized;
44+
import org.mockito.Mockito;
3845

3946
import java.io.IOException;
47+
import java.security.InvalidKeyException;
4048
import java.security.KeyStoreException;
4149
import java.security.NoSuchAlgorithmException;
4250
import java.security.cert.CertificateException;
@@ -92,6 +100,7 @@ public void setUp() throws ClientException {
92100
@After
93101
public void tearDown() {
94102
devicePopManager.clearAsymmetricKey();
103+
CommonFlightsManager.INSTANCE.resetFlightsManager();
95104
}
96105

97106
@Test
@@ -102,4 +111,46 @@ public void testEncryption() throws ClientException {
102111
Assert.assertEquals(DATA_TO_ENCRYPT, decryptedValue);
103112
Assert.assertNotEquals(DATA_TO_ENCRYPT, cipherText);
104113
}
114+
115+
@Test
116+
public void testEncryption_Disabled() throws ClientException, CertificateException, KeyStoreException, NoSuchAlgorithmException, IOException {
117+
final IFlightsProvider mockFlightsProvider = Mockito.mock(IFlightsProvider.class);
118+
Mockito.when(mockFlightsProvider.isFlightEnabled(CommonFlight.DISABLE_UNNECESSARY_CRYPTO_PURPOSES_FROM_DEVICE_POP_MANAGER))
119+
.thenReturn(true);
120+
// Create anonymous IFlightsManager
121+
IFlightsManager anonymousFlightsManager = new IFlightsManager() {
122+
@Override
123+
public @NotNull IFlightsProvider getFlightsProvider(long waitForConfigsWithTimeoutInMs) {
124+
return mockFlightsProvider;
125+
}
126+
@Override
127+
public @NotNull IFlightsProvider getFlightsProviderForTenant(@NotNull String tenantId, long waitForConfigsWithTimeoutInMs) {
128+
return mockFlightsProvider;
129+
}
130+
@Override
131+
public @NotNull IFlightsProvider getFlightsProviderForTenant(@NotNull String tenantId) {
132+
return mockFlightsProvider;
133+
}
134+
@NonNull
135+
@Override
136+
public IFlightsProvider getFlightsProvider() {
137+
return mockFlightsProvider;
138+
}
139+
};
140+
141+
// Initialize CommonFlightsManager with the anonymous implementation
142+
CommonFlightsManager.INSTANCE.initializeCommonFlightsManager(anonymousFlightsManager);
143+
IDevicePopManager devicePopManager = new AndroidDevicePopManager(ApplicationProvider.getApplicationContext());
144+
devicePopManager.generateAsymmetricKey();
145+
try {
146+
final String cipherText = devicePopManager.encrypt(cipher, DATA_TO_ENCRYPT);
147+
devicePopManager.decrypt(cipher, cipherText);
148+
} catch (Exception exception) {
149+
Assert.assertTrue(exception instanceof ClientException);
150+
Assert.assertTrue(exception.getCause().getCause().getMessage().contains("Incompatible purpose"));
151+
return;
152+
}
153+
Assert.fail();
154+
155+
}
105156
}

0 commit comments

Comments
 (0)