Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,13 @@ public interface ILabClient {
String getPasswordForGuestUser(final LabGuestAccount guestUser) throws LabApiException;

/**
* Get the value of a secret from Lab Api. This primarily includes secrets like passwords for
* accounts but may also be used for any other secret that the Lab has stored in their KeyVault.
* Get a secret from the MSIDLABS KeyVault
*
* @param secretName the name (identifier) of the secret that should be loaded
* @return a String containing the value of the secret
* @throws LabApiException if an error occurs while trying to load secret from lab
*/
String getSecret(String secretName) throws LabApiException;
String getKeyVaultSecret(String secretName) throws LabApiException;

/**
* Reset the password for the username given, then reset it back to the original password.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,24 @@
// THE SOFTWARE.
package com.microsoft.identity.labapi.utilities.client;

import static com.microsoft.identity.labapi.utilities.constants.LabConstants.DEFAULT_LAB_CLIENT_ID;
import static com.microsoft.identity.labapi.utilities.constants.LabConstants.KEYVAULT_SCOPE;

import com.microsoft.identity.internal.test.labapi.ApiException;
import com.microsoft.identity.internal.test.labapi.Configuration;
import com.microsoft.identity.internal.test.labapi.api.ConfigApi;
import com.microsoft.identity.internal.test.labapi.api.CreateTempUserApi;
import com.microsoft.identity.internal.test.labapi.api.DeleteDeviceApi;
import com.microsoft.identity.internal.test.labapi.api.DisablePolicyApi;
import com.microsoft.identity.internal.test.labapi.api.EnablePolicyApi;
import com.microsoft.identity.internal.test.labapi.api.LabSecretApi;
import com.microsoft.identity.internal.test.labapi.api.KeyVaultSecretsApi;
import com.microsoft.identity.internal.test.labapi.api.ResetApi;
import com.microsoft.identity.internal.test.labapi.model.ConfigInfo;
import com.microsoft.identity.internal.test.labapi.model.CustomSuccessResponse;
import com.microsoft.identity.internal.test.labapi.model.SecretResponse;
import com.microsoft.identity.internal.test.labapi.model.SecretBundle;
import com.microsoft.identity.internal.test.labapi.model.TempUser;
import com.microsoft.identity.internal.test.labapi.model.UserInfo;
import com.microsoft.identity.labapi.utilities.BuildConfig;
import com.microsoft.identity.labapi.utilities.authentication.LabApiAuthenticationClient;
import com.microsoft.identity.labapi.utilities.constants.ProtectionPolicy;
import com.microsoft.identity.labapi.utilities.constants.TempUserType;
Expand All @@ -57,6 +61,9 @@
public class LabClient implements ILabClient {

private final LabApiAuthenticationClient mLabApiAuthenticationClient;
private final LabApiAuthenticationClient mLabApiAuthenticationClientForKeyVault = new LabApiAuthenticationClient(
BuildConfig.LAB_CLIENT_SECRET, KEYVAULT_SCOPE, DEFAULT_LAB_CLIENT_ID
);
private final long PASSWORD_RESET_WAIT_DURATION = TimeUnit.SECONDS.toMillis(65);
private final long LAB_API_RETRY_WAIT = TimeUnit.SECONDS.toMillis(5);

Expand Down Expand Up @@ -145,7 +152,7 @@ private ILabAccount getLabAccountObject(@NonNull final ConfigInfo configInfo) th
}

private List<ConfigInfo> fetchConfigsFromLab(@NonNull final String upn) throws LabApiException {
Configuration.getDefaultApiClient().setAccessToken(
Configuration.getLabUserFetchApiClient().setAccessToken(
mLabApiAuthenticationClient.getAccessToken()
);
try {
Expand All @@ -157,7 +164,7 @@ private List<ConfigInfo> fetchConfigsFromLab(@NonNull final String upn) throws L
}

public List<ConfigInfo> fetchConfigsFromLab(@NonNull final LabQuery query) throws LabApiException {
Configuration.getDefaultApiClient().setAccessToken(
Configuration.getLabUserFetchApiClient().setAccessToken(
mLabApiAuthenticationClient.getAccessToken()
);
try {
Expand Down Expand Up @@ -222,7 +229,10 @@ private ILabAccount createTempAccountInternal(@NonNull final TempUserType tempUs
mLabApiAuthenticationClient.getAccessToken()
);

final CreateTempUserApi createTempUserApi = new CreateTempUserApi();
final String createTempUserFunctionCode = getKeyVaultSecret(
CreateTempUserApi.AZURE_FUNCTION_CODE_SECRET_NAME
);
final CreateTempUserApi createTempUserApi = new CreateTempUserApi(createTempUserFunctionCode);
createTempUserApi.getApiClient().setReadTimeout(TEMP_USER_API_READ_TIMEOUT);
final TempUser tempUser;

Expand Down Expand Up @@ -279,7 +289,7 @@ public String getPasswordForGuestUser(LabGuestAccount guestUser) throws LabApiEx

// Adding a second attempt here, api sometimes fails to get the lab secret.
try {
return getSecret(labName);
return getKeyVaultSecret(labName);
} catch (final LabApiException e){
if (e.getErrorCode().equals(LabError.FAILED_TO_GET_SECRET_FROM_LAB)){

Expand All @@ -291,23 +301,23 @@ public String getPasswordForGuestUser(LabGuestAccount guestUser) throws LabApiEx
}

// Try to get the secret again
return getSecret(labName);
return getKeyVaultSecret(labName);
} else {
throw e;
}
}
}

@Override
public String getSecret(@NonNull final String secretName) throws LabApiException {
Configuration.getDefaultApiClient().setAccessToken(
mLabApiAuthenticationClient.getAccessToken()
public String getKeyVaultSecret(@NonNull final String secretName) throws LabApiException {
Configuration.getKeyVaultApiClient().setAccessToken(
mLabApiAuthenticationClientForKeyVault.getAccessToken()
);
final LabSecretApi labSecretApi = new LabSecretApi();
final KeyVaultSecretsApi keyVaultSecretsApi = new KeyVaultSecretsApi();

try {
final SecretResponse secretResponse = labSecretApi.apiLabSecretGet(secretName);
return secretResponse.getValue();
final SecretBundle secretBundle = keyVaultSecretsApi.getKeyVaultSecret(secretName);
return secretBundle.getValue();
} catch (final com.microsoft.identity.internal.test.labapi.ApiException ex) {
throw new LabApiException(LabError.FAILED_TO_GET_SECRET_FROM_LAB, ex);
}
Expand All @@ -320,7 +330,10 @@ public boolean deleteDevice(@NonNull final String upn,
mLabApiAuthenticationClient.getAccessToken()
);

final DeleteDeviceApi deleteDeviceApi = new DeleteDeviceApi();
final String deleteDeviceFunctionCode = getKeyVaultSecret(
DeleteDeviceApi.AZURE_FUNCTION_CODE_SECRET_NAME
);
final DeleteDeviceApi deleteDeviceApi = new DeleteDeviceApi(deleteDeviceFunctionCode);

try {
final CustomSuccessResponse successResponse = deleteDeviceApi.apiDeleteDeviceDelete(
Expand Down Expand Up @@ -400,10 +413,9 @@ private String getPassword(@NonNull final TempUser tempUser) throws LabApiExcept
private String getPassword(final String credentialVaultKeyName) throws LabApiException {
final String secretName = getLabSecretName(credentialVaultKeyName);

// Adding a second attempt here, api sometimes fails to get the lab secret.
try {
return getSecret(secretName);
} catch (final LabApiException e){
return getKeyVaultSecret(secretName);
} catch (final LabApiException e) {
if (e.getErrorCode().equals(LabError.FAILED_TO_GET_SECRET_FROM_LAB)){

// Wait for a bit
Expand All @@ -414,7 +426,7 @@ private String getPassword(final String credentialVaultKeyName) throws LabApiExc
}

// Try to get the secret again
return getSecret(secretName);
return getKeyVaultSecret(secretName);
} else {
throw e;
}
Expand All @@ -423,7 +435,10 @@ private String getPassword(final String credentialVaultKeyName) throws LabApiExc

@Override
public boolean resetPassword(@NonNull final String upn) throws LabApiException {
final ResetApi resetApi = new ResetApi();
final String resetApiFunctionCode = getKeyVaultSecret(
ResetApi.AZURE_FUNCTION_CODE_SECRET_NAME
);
final ResetApi resetApi = new ResetApi(resetApiFunctionCode);
try {
final CustomSuccessResponse resetResponse = resetApi.apiResetPut(upn, ResetOperation.PASSWORD.toString());
if (resetResponse == null) {
Expand Down Expand Up @@ -494,7 +509,13 @@ private String getLabSecretName(final String credentialVaultKeyName) {
* @return boolean value indicating policy enabled or not.
*/
public boolean enablePolicy(@NonNull final String upn, @NonNull final ProtectionPolicy policy) throws LabApiException {
final EnablePolicyApi enablePolicyApi = new EnablePolicyApi();
Configuration.getDefaultApiClient().setAccessToken(
mLabApiAuthenticationClient.getAccessToken()
);
final String enablePolicyFunctionCode = getKeyVaultSecret(
EnablePolicyApi.AZURE_FUNCTION_CODE_SECRET_NAME
);
final EnablePolicyApi enablePolicyApi = new EnablePolicyApi(enablePolicyFunctionCode);
try {
final CustomSuccessResponse enablePolicyResult = enablePolicyApi.apiEnablePolicyPut(upn, policy.toString());
final String expectedResult = (policy + " Enabled for user : " + upn).toLowerCase();
Expand All @@ -516,7 +537,10 @@ public boolean enablePolicy(@NonNull final String upn, @NonNull final Protection
* @return boolean value indicating policy is disabled or not for the upn.
*/
public boolean disablePolicy(@NonNull final String upn, @NonNull final ProtectionPolicy policy) throws LabApiException {
final DisablePolicyApi disablePolicyApi = new DisablePolicyApi();
final String disablePolicyFunctionCode = getKeyVaultSecret(
DisablePolicyApi.AZURE_FUNCTION_CODE_SECRET_NAME
);
final DisablePolicyApi disablePolicyApi = new DisablePolicyApi(disablePolicyFunctionCode);
try {
final CustomSuccessResponse disablePolicyResponse = disablePolicyApi.apiDisablePolicyPut(upn, policy.toString());
final String expectedResult = (policy + " Disabled for user : " + upn).toLowerCase();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;

Expand Down Expand Up @@ -170,6 +171,7 @@ public void canCreateMAMCATempUser() {
}

@Test
@Ignore
public void canResetPassword() {
try {
final ILabAccount labAccount = mLabClient.createTempAccount(TempUserType.BASIC);
Expand All @@ -181,6 +183,7 @@ public void canResetPassword() {
}

@Test
@Ignore
public void canEnablePolicy() {
try {
final ILabAccount labAccount = mLabClient.createTempAccount(TempUserType.BASIC);
Expand All @@ -192,6 +195,7 @@ public void canEnablePolicy() {
}

@Test
@Ignore
public void canDisablePolicy() {
try {
final ILabAccount labAccount = mLabClient.createTempAccount(TempUserType.MAM_CA);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@

public class ApiClient {

public static final String LAB_BASE_PATH = "https://labusermanagerapi.azurewebsites.net";
public static final String USER_FETCH_BASE_PATH = "https://msidlab.com";
private final String AUTH_TYPE = "Access Token";

private static final String DEFAULT_BASE_PATH = "https://msidlab.com";
private String basePath;
private boolean debugging = false;
private Map<String, String> defaultHeaderMap = new HashMap<String, String>();
Expand All @@ -78,7 +78,7 @@ public class ApiClient {
* No-parameter constructor will use default Base Path.
*/
public ApiClient() {
this(DEFAULT_BASE_PATH);
this("");
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@

package com.microsoft.identity.internal.test.labapi;

import static com.microsoft.identity.internal.test.labapi.ApiClient.LAB_BASE_PATH;
import static com.microsoft.identity.internal.test.labapi.ApiClient.USER_FETCH_BASE_PATH;

@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaClientCodegen", date = "2021-06-01T10:19:44.716-07:00[America/Los_Angeles]")public class Configuration {
private static ApiClient defaultApiClient = new ApiClient();
private static ApiClient defaultApiClient = new ApiClient(LAB_BASE_PATH);
private static ApiClient labUserFetchApiClient = new ApiClient(USER_FETCH_BASE_PATH);
private static ApiClient keyVaultApiClient = new ApiClient();

/**
* Get the default API client, which would be used when creating API
Expand All @@ -25,6 +30,13 @@ public static ApiClient getDefaultApiClient() {
return defaultApiClient;
}

public static ApiClient getKeyVaultApiClient() {
return keyVaultApiClient;
}

public static ApiClient getLabUserFetchApiClient() {
return labUserFetchApiClient;
}
/**
* Set the default API client, which would be used when creating API
* instances without providing an API client.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class ConfigApi {
private ApiClient apiClient;

public ConfigApi() {
this(Configuration.getDefaultApiClient());
this(Configuration.getLabUserFetchApiClient());
}

public ConfigApi(ApiClient apiClient) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,16 @@

public class CreateTempUserApi {
private ApiClient apiClient;
private final String mAzureFunctionCode;
public static final String AZURE_FUNCTION_CODE_SECRET_NAME = "CreateTempUser";

public CreateTempUserApi() {
this(Configuration.getDefaultApiClient());
public CreateTempUserApi(final String azureFunctionCode) {
this(Configuration.getDefaultApiClient(), azureFunctionCode);
}

public CreateTempUserApi(ApiClient apiClient) {
public CreateTempUserApi(final ApiClient apiClient, final String azureFunctionCode) {
this.apiClient = apiClient;
mAzureFunctionCode = azureFunctionCode;
}

public ApiClient getApiClient() {
Expand Down Expand Up @@ -73,6 +76,8 @@ public com.squareup.okhttp.Call apiCreateTempUserPostCall(String usertype, final
if (usertype != null)
localVarQueryParams.addAll(apiClient.parameterToPair("usertype", usertype));

localVarQueryParams.addAll(apiClient.parameterToPair("code", mAzureFunctionCode));

Map<String, String> localVarHeaderParams = new HashMap<String, String>();

Map<String, Object> localVarFormParams = new HashMap<String, Object>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,16 @@

public class DeleteDeviceApi {
private ApiClient apiClient;
private final String mAzureFunctionCode;
public static final String AZURE_FUNCTION_CODE_SECRET_NAME = "DeleteDevice";

public DeleteDeviceApi() {
this(Configuration.getDefaultApiClient());
public DeleteDeviceApi(final String azureFunctionCode) {
this(Configuration.getDefaultApiClient(), azureFunctionCode);
}

public DeleteDeviceApi(ApiClient apiClient) {
public DeleteDeviceApi(ApiClient apiClient, final String azureFunctionCode) {
this.apiClient = apiClient;
mAzureFunctionCode = azureFunctionCode;
}

public ApiClient getApiClient() {
Expand Down Expand Up @@ -76,6 +79,8 @@ public com.squareup.okhttp.Call apiDeleteDeviceDeleteCall(String upn, String dev
if (deviceid != null)
localVarQueryParams.addAll(apiClient.parameterToPair("deviceid", deviceid));

localVarQueryParams.addAll(apiClient.parameterToPair("code", mAzureFunctionCode));

Map<String, String> localVarHeaderParams = new HashMap<String, String>();

Map<String, Object> localVarFormParams = new HashMap<String, Object>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,16 @@

public class DisablePolicyApi {
private ApiClient apiClient;
private final String mAzureFunctionCode;
public static final String AZURE_FUNCTION_CODE_SECRET_NAME = "DisablePolicy";

public DisablePolicyApi() {
this(Configuration.getDefaultApiClient());
public DisablePolicyApi(final String azureFunctionCode) {
this(Configuration.getDefaultApiClient(), azureFunctionCode);
}

public DisablePolicyApi(ApiClient apiClient) {
public DisablePolicyApi(ApiClient apiClient, final String azureFunctionCode) {
this.apiClient = apiClient;
mAzureFunctionCode = azureFunctionCode;
}

public ApiClient getApiClient() {
Expand Down Expand Up @@ -75,6 +78,8 @@ public com.squareup.okhttp.Call apiDisablePolicyPutCall(String upn, String polic
if (policy != null)
localVarQueryParams.addAll(apiClient.parameterToPair("policy", policy));

localVarQueryParams.addAll(apiClient.parameterToPair("code", mAzureFunctionCode));

Map<String, String> localVarHeaderParams = new HashMap<String, String>();

Map<String, Object> localVarFormParams = new HashMap<String, Object>();
Expand Down
Loading