Skip to content
Draft
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 @@ -44,15 +44,11 @@
import static com.microsoft.identity.client.PublicClientApplicationConfiguration.SerializedNames.WEBAUTHN_VERSION;
import static com.microsoft.identity.client.PublicClientApplicationConfiguration.SerializedNames.WEB_VIEW_ZOOM_CONTROLS_ENABLED;
import static com.microsoft.identity.client.PublicClientApplicationConfiguration.SerializedNames.WEB_VIEW_ZOOM_ENABLED;
import static com.microsoft.identity.client.exception.MsalClientException.APP_MANIFEST_VALIDATION_ERROR;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
import android.net.Uri;
import android.text.TextUtils;
Expand Down Expand Up @@ -641,107 +637,9 @@ private void verifyRedirectUriWithAppSignature() throws MsalClientException {
}
}

/**
* Ensures that the developer has properly configured their
* AndroidManifest to expose the BrowserTabActivity.
*
* @param context the context of the application
* @param url the redirect uri of the app
* @return a boolean indicating if BrowserTabActivity is configured or not
*/
private static boolean validateCustomTabRedirectActivity(@NonNull final Context context,
@NonNull final String url) throws MsalClientException {
final String methodTag = TAG + ":validateCustomTabRedirectActivity";
final PackageManager packageManager = context.getPackageManager();

if (packageManager == null) {
return false;
}

final Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setDataAndNormalize(Uri.parse(url));

final List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(
intent,
PackageManager.GET_RESOLVED_FILTER
);

// resolve info list will never be null, if no matching activities are found, empty list will be returned.
boolean hasActivity = false;

for (final ResolveInfo info : resolveInfoList) {
final ActivityInfo activityInfo = info.activityInfo;
String activityClassName = BrowserTabActivity.class.getName();

//If we're using authorization in current task... then we need to look for that activity
if(LibraryConfiguration.getInstance().isAuthorizationInCurrentTask()){
activityClassName = CurrentTaskBrowserTabActivity.class.getName();
}

if (activityInfo.name.equals(activityClassName) &&
activityInfo.packageName.equals(context.getPackageName())) {
hasActivity = true;
} else {
// another application is listening for this url scheme, don't open
// Custom Tab for security reasons
com.microsoft.identity.common.logging.Logger.warn(
methodTag,
String.format("Another application %s is listening for the URL scheme %s", activityInfo.packageName, url)
);
throw new MsalClientException(
MsalClientException.MULTIPLE_APPS_LISTENING_CUSTOM_URL_SCHEME,
"More than one app is listening for the URL scheme defined for BrowserTabActivity in the AndroidManifest." +
" The package name of this other app is: " + activityInfo.packageName
);
}
}

return hasActivity;
}

@SuppressWarnings("PMD")
public void checkIntentFilterAddedToAppManifestForBrokerFlow() throws MsalClientException {
final String methodTag = TAG + ":checkIntentFilterAddedToAppManifestForBrokerFlow";
if ((getAuthorizationAgent() == AuthorizationAgent.DEFAULT
|| getAuthorizationAgent() == AuthorizationAgent.BROWSER)) {

final boolean hasCustomTabRedirectActivity = validateCustomTabRedirectActivity(
mAppContext,
mRedirectUri
);

if (!hasCustomTabRedirectActivity) {
String activityClassName = BrowserTabActivity.class.getSimpleName();

if (LibraryConfiguration.getInstance().isAuthorizationInCurrentTask()){
activityClassName = CurrentTaskBrowserTabActivity.class.getSimpleName();
}

final Uri redirectUri = Uri.parse(mRedirectUri);

throw new MsalClientException(
APP_MANIFEST_VALIDATION_ERROR,
"Intent filter for: " +
activityClassName +
" is missing. " +
" Please make sure you have the following activity in your AndroidManifest.xml \n\n" +
"<activity android:name=\"com.microsoft.identity.client." + activityClassName + "\">" + "\n" +
"\t" + "<intent-filter>" + "\n" +
"\t\t" + "<action android:name=\"android.intent.action.VIEW\" />" + "\n" +
"\t\t" + "<category android:name=\"android.intent.category.DEFAULT\" />" + "\n" +
"\t\t" + "<category android:name=\"android.intent.category.BROWSABLE\" />" + "\n" +
"\t\t" + "<data" + "\n" +
"\t\t\t" + "android:host=\"" + redirectUri.getHost() + "\"" + "\n" +
"\t\t\t" + "android:path=\"" + redirectUri.getPath() + "\"" + "\n" +
"\t\t\t" + "android:scheme=\"" + redirectUri.getScheme() + "\" />" + "\n" +
"\t" + "</intent-filter>" + "\n" +
"</activity>" + "\n");
}
}

if (!mUseBroker) {
return;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.shadows.ShadowMockAuthority;
import com.microsoft.identity.client.e2e.shadows.ShadowOpenIdProviderConfigurationClient;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowStrategyResultServerError;
import com.microsoft.identity.client.e2e.shadows.ShadowStrategyResultUnsuccessful;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
Expand Down Expand Up @@ -93,7 +92,6 @@
ShadowAndroidSdkStorageEncryptionManager.class,
ShadowMockAuthority.class,
ShadowHttpClient.class,
ShadowPublicClientApplicationConfiguration.class,
ShadowOpenIdProviderConfigurationClient.class
})
public abstract class AcquireTokenMockTest extends AcquireTokenAbstractTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import com.microsoft.identity.http.HttpRequestInterceptor;
import com.microsoft.identity.http.HttpRequestMatcher;
import com.microsoft.identity.shadow.ShadowHttpClient;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
import com.microsoft.identity.client.e2e.utils.AcquireTokenTestHelper;
Expand Down Expand Up @@ -69,7 +68,6 @@
ShadowAndroidSdkStorageEncryptionManager.class,
ShadowMockAuthority.class,
ShadowHttpClient.class,
ShadowPublicClientApplicationConfiguration.class,
ShadowOpenIdProviderConfigurationClient.class
})
public final class CommandResultCachingTest extends AcquireTokenAbstractTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import com.microsoft.identity.client.MultiTenantAccount;
import com.microsoft.identity.client.SilentAuthenticationCallback;
import com.microsoft.identity.client.e2e.shadows.ShadowAuthorityForMockHttpResponse;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
import com.microsoft.identity.client.e2e.utils.RoboTestUtils;
Expand Down Expand Up @@ -77,7 +76,6 @@
@Config(shadows = {
ShadowAndroidSdkStorageEncryptionManager.class,
ShadowAuthorityForMockHttpResponse.class,
ShadowPublicClientApplicationConfiguration.class,
ShadowHttpClient.class,
}, sdk = {Build.VERSION_CODES.N})
public class CrossCloudGuestAccountTest extends AcquireTokenAbstractTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import com.microsoft.identity.client.e2e.shadows.ShadowDeviceCodeFlowCommandAuthError;
import com.microsoft.identity.client.e2e.shadows.ShadowDeviceCodeFlowCommandSuccessful;
import com.microsoft.identity.client.e2e.shadows.ShadowDeviceCodeFlowCommandTokenError;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.tests.PublicClientApplicationAbstractTest;
import com.microsoft.identity.client.e2e.utils.RoboTestUtils;
import com.microsoft.identity.client.exception.MsalException;
Expand Down Expand Up @@ -78,7 +77,6 @@
* of the protocol. Will be extended to test individual aspects of the flow.
*/
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowPublicClientApplicationConfiguration.class})
@SuppressWarnings("unchecked")
public class DeviceCodeFlowApiTest extends PublicClientApplicationAbstractTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import com.microsoft.identity.client.e2e.shadows.ShadowDeviceCodeFlowCommandAuthError;
import com.microsoft.identity.client.e2e.shadows.ShadowDeviceCodeFlowCommandSuccessful;
import com.microsoft.identity.client.e2e.shadows.ShadowDeviceCodeFlowCommandTokenError;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.tests.PublicClientApplicationAbstractTest;
import com.microsoft.identity.client.e2e.utils.RoboTestUtils;
import com.microsoft.identity.client.exception.MsalException;
Expand Down Expand Up @@ -81,7 +80,6 @@
*/
@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowPublicClientApplicationConfiguration.class})
@SuppressWarnings("unchecked")
public class DeviceCodeFlowWithClaimsApiTest extends PublicClientApplicationAbstractTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import com.microsoft.identity.client.Prompt;
import com.microsoft.identity.client.SingleAccountPublicClientApplication;
import com.microsoft.identity.client.e2e.shadows.ShadowAuthorityForMockHttpResponse;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowOpenIdProviderConfigurationClient;
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
Expand Down Expand Up @@ -77,7 +76,6 @@
@Config(shadows = {
ShadowAndroidSdkStorageEncryptionManager.class,
ShadowAuthorityForMockHttpResponse.class,
ShadowPublicClientApplicationConfiguration.class,
ShadowHttpClient.class,
ShadowOpenIdProviderConfigurationClient.class
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.shadows.ShadowAuthorityForMockHttpResponse;
import com.microsoft.identity.client.e2e.shadows.ShadowOpenIdProviderConfigurationClient;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
import com.microsoft.identity.client.e2e.utils.AcquireTokenTestHelper;
import com.microsoft.identity.client.e2e.utils.RoboTestUtils;
Expand Down Expand Up @@ -55,7 +54,6 @@
@Config(shadows = {
ShadowAndroidSdkStorageEncryptionManager.class,
ShadowAuthorityForMockHttpResponse.class,
ShadowPublicClientApplicationConfiguration.class,
ShadowHttpClient.class,
ShadowOpenIdProviderConfigurationClient.class
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import com.microsoft.identity.client.AcquireTokenSilentParameters;
import com.microsoft.identity.client.e2e.rules.NetworkTestsRuleChain;
import com.microsoft.identity.client.e2e.shadows.ShadowAuthority;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
import com.microsoft.identity.client.e2e.utils.AcquireTokenTestHelper;
Expand All @@ -52,7 +51,7 @@
import static com.microsoft.identity.client.e2e.utils.RoboTestUtils.flushScheduler;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowAndroidSdkStorageEncryptionManager.class, ShadowAuthority.class, ShadowPublicClientApplicationConfiguration.class})
@Config(shadows = {ShadowAndroidSdkStorageEncryptionManager.class, ShadowAuthority.class})
public abstract class AcquireTokenNetworkTest extends AcquireTokenAbstractTest implements IAcquireTokenNetworkTest {

protected String mUsername;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.microsoft.identity.client.MultiTenantAccount;
import com.microsoft.identity.client.e2e.rules.NetworkTestsRuleChain;
import com.microsoft.identity.client.e2e.shadows.ShadowAuthority;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
import com.microsoft.identity.client.e2e.utils.AcquireTokenTestHelper;
Expand All @@ -25,7 +24,7 @@
import static com.microsoft.identity.internal.testutils.TestConstants.Scopes.USER_READ_SCOPE;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowAndroidSdkStorageEncryptionManager.class, ShadowAuthority.class, ShadowPublicClientApplicationConfiguration.class})
@Config(shadows = {ShadowAndroidSdkStorageEncryptionManager.class, ShadowAuthority.class})
public class GuestAccountAcquireTokenNetworkTests extends AcquireTokenAbstractTest {

@Rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import com.microsoft.identity.client.IAccount;
import com.microsoft.identity.client.e2e.rules.NetworkTestsRuleChain;
import com.microsoft.identity.client.e2e.shadows.ShadowAuthority;
import com.microsoft.identity.client.e2e.shadows.ShadowPublicClientApplicationConfiguration;
import com.microsoft.identity.client.e2e.shadows.ShadowAndroidSdkStorageEncryptionManager;
import com.microsoft.identity.client.e2e.tests.AcquireTokenAbstractTest;
import com.microsoft.identity.client.e2e.utils.AcquireTokenTestHelper;
Expand All @@ -52,7 +51,7 @@
import static com.microsoft.identity.internal.testutils.TestConstants.Scopes.USER_READ_SCOPE;

@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowAndroidSdkStorageEncryptionManager.class, ShadowAuthority.class, ShadowPublicClientApplicationConfiguration.class})
@Config(shadows = {ShadowAndroidSdkStorageEncryptionManager.class, ShadowAuthority.class})
public class MultiAccountAndResourceAcquireTokenNetworkTests extends AcquireTokenAbstractTest {

@Rule
Expand Down
Loading