Skip to content

Commit 99a061e

Browse files
authored
Organize browser selection classes and change signature for get AuthorizationStrategy, Fixes AB#3119409 (#2564)
The changes here are the preparatory work for the DUNA feature. Splitting this PR from DUNA to simplify the review process. - Update Browser Selector and move it to Platform Components - Change getAuthorizationStrategy signature from (InteractiveTokenCommandParameters) to (AuthorizationAgent , Browser, isBrokerRequest) - Move getBrowserSafeListForBroker from Platform Util to BrowserDescriptor - Move Browser to common4j [AB#3119409](https://identitydivision.visualstudio.com/fac9d424-53d2-45c0-91b5-ef6ba7a6bf26/_workitems/edit/3119409)
1 parent 223ac0c commit 99a061e

File tree

23 files changed

+437
-412
lines changed

23 files changed

+437
-412
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
vNext
22
----------
3+
- [MINOR] Organize browser selection classes and change signature for get AuthorizationStrategy (#2564)
34
- [MINOR] Add support for OneBox Environment (#2559)
45
- [MINOR] Add support for claims requests for native authentication (#2572)
56

common/src/main/java/com/microsoft/identity/common/components/AndroidPlatformComponentsFactory.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.microsoft.identity.common.internal.platform.AndroidPlatformUtil;
3636
import com.microsoft.identity.common.internal.providers.oauth2.AndroidTaskStateGenerator;
3737
import com.microsoft.identity.common.internal.ui.AndroidAuthorizationStrategyFactory;
38+
import com.microsoft.identity.common.internal.ui.browser.AndroidBrowserSelector;
3839
import com.microsoft.identity.common.java.WarningType;
3940
import com.microsoft.identity.common.java.interfaces.IPlatformComponents;
4041
import com.microsoft.identity.common.java.interfaces.PlatformComponents;
@@ -127,14 +128,16 @@ public static void fillBuilderWithBasicImplementations(
127128
.storageSupplier(new AndroidStorageSupplier(context,
128129
new AndroidAuthSdkStorageEncryptionManager(context)))
129130
.platformUtil(new AndroidPlatformUtil(context, activity))
130-
.httpClientWrapper(new DefaultHttpClientWrapper());
131+
.httpClientWrapper(new DefaultHttpClientWrapper())
132+
.browserSelector(new AndroidBrowserSelector(context));
131133

132134
if (activity != null){
133135
builder.authorizationStrategyFactory(
134136
AndroidAuthorizationStrategyFactory.builder()
135137
.context(activity.getApplicationContext())
136138
.activity(activity)
137139
.fragment(fragment)
140+
.browserSelector(new AndroidBrowserSelector(context))
138141
.build())
139142
.stateGenerator(new AndroidTaskStateGenerator(activity.getTaskId()));
140143
}

common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.microsoft.identity.common.java.authorities.Authority;
3636
import com.microsoft.identity.common.java.authscheme.AbstractAuthenticationScheme;
3737
import com.microsoft.identity.common.java.authscheme.IPoPAuthenticationSchemeParams;
38+
import com.microsoft.identity.common.java.browser.Browser;
3839
import com.microsoft.identity.common.java.cache.ICacheRecord;
3940
import com.microsoft.identity.common.java.commands.parameters.CommandParameters;
4041
import com.microsoft.identity.common.java.commands.parameters.DeviceCodeFlowCommandParameters;
@@ -226,7 +227,14 @@ private AuthorizationResult performAuthorizationRequest(@NonNull final OAuth2Str
226227
.getPlatformUtil()
227228
.throwIfNetworkNotAvailable(parameters.isPowerOptCheckEnabled());
228229

229-
mAuthorizationStrategy = parameters.getPlatformComponents().getAuthorizationStrategyFactory().getAuthorizationStrategy(parameters);
230+
mAuthorizationStrategy = parameters.getPlatformComponents()
231+
.getAuthorizationStrategyFactory()
232+
.getAuthorizationStrategy(
233+
parameters.getAuthorizationAgent(),
234+
parameters.getBrowserSafeList(),
235+
parameters.getPreferredBrowser(),
236+
false
237+
);
230238
mAuthorizationRequest = getAuthorizationRequest(strategy, parameters);
231239

232240
// Suppressing unchecked warnings due to casting of AuthorizationRequest to GenericAuthorizationRequest and AuthorizationStrategy to GenericAuthorizationStrategy in the arguments of call to requestAuthorization method

common/src/main/java/com/microsoft/identity/common/internal/platform/AndroidPlatformUtil.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,12 @@
5555
import com.microsoft.identity.common.java.flighting.CommonFlight;
5656
import com.microsoft.identity.common.java.flighting.CommonFlightsManager;
5757
import com.microsoft.identity.common.java.logging.Logger;
58-
import com.microsoft.identity.common.java.ui.BrowserDescriptor;
5958
import com.microsoft.identity.common.java.util.IPlatformUtil;
6059
import com.microsoft.identity.common.java.util.StringUtil;
6160

6261
import java.security.NoSuchAlgorithmException;
6362
import java.util.AbstractMap;
6463
import java.util.ArrayList;
65-
import java.util.HashSet;
6664
import java.util.List;
6765
import java.util.Map;
6866

@@ -82,28 +80,6 @@ public class AndroidPlatformUtil implements IPlatformUtil {
8280
@Nullable
8381
private final Activity mActivity;
8482

85-
/**
86-
* List of System Browsers which can be used from broker, currently only Chrome is supported.
87-
* This information here is populated from the default browser safe-list in MSAL.
88-
*
89-
* @return
90-
*/
91-
@Override
92-
public List<BrowserDescriptor> getBrowserSafeListForBroker() {
93-
List<BrowserDescriptor> browserDescriptors = new ArrayList<>();
94-
final HashSet<String> signatureHashes = new HashSet<String>();
95-
signatureHashes.add("7fmduHKTdHHrlMvldlEqAIlSfii1tl35bxj1OXN5Ve8c4lU6URVu4xtSHc3BVZxS6WWJnxMDhIfQN0N0K2NDJg==");
96-
final BrowserDescriptor chrome = new BrowserDescriptor(
97-
"com.android.chrome",
98-
signatureHashes,
99-
null,
100-
null
101-
);
102-
browserDescriptors.add(chrome);
103-
104-
return browserDescriptors;
105-
}
106-
10783
@Nullable
10884
@Override
10985
public String getInstalledCompanyPortalVersion() {

common/src/main/java/com/microsoft/identity/common/internal/request/MsalBrokerRequestAdapter.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import com.microsoft.identity.common.java.opentelemetry.SpanExtension;
5858
import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationResult;
5959
import com.microsoft.identity.common.java.providers.oauth2.AuthorizationResult;
60-
import com.microsoft.identity.common.java.ui.BrowserDescriptor;
6160
import com.microsoft.identity.common.java.util.BrokerProtocolVersionUtil;
6261
import com.microsoft.identity.common.java.util.ObjectMapper;
6362
import com.microsoft.identity.common.java.authorities.AzureActiveDirectoryAuthority;
@@ -77,9 +76,6 @@
7776
import com.microsoft.identity.common.logging.Logger;
7877

7978
import java.io.IOException;
80-
import java.util.ArrayList;
81-
import java.util.HashSet;
82-
import java.util.List;
8379

8480
public class MsalBrokerRequestAdapter implements IBrokerRequestAdapter {
8581

@@ -490,27 +486,6 @@ private boolean getMultipleCloudsSupported(@NonNull final TokenCommandParameters
490486
}
491487
}
492488

493-
/**
494-
* List of System Browsers which can be used from broker, currently only Chrome is supported.
495-
* This information here is populated from the default browser safelist in MSAL.
496-
*
497-
* @return
498-
*/
499-
public static List<BrowserDescriptor> getBrowserSafeListForBroker() {
500-
List<BrowserDescriptor> browserDescriptors = new ArrayList<>();
501-
final HashSet<String> signatureHashes = new HashSet<String>();
502-
signatureHashes.add("7fmduHKTdHHrlMvldlEqAIlSfii1tl35bxj1OXN5Ve8c4lU6URVu4xtSHc3BVZxS6WWJnxMDhIfQN0N0K2NDJg==");
503-
final BrowserDescriptor chrome = new BrowserDescriptor(
504-
"com.android.chrome",
505-
signatureHashes,
506-
null,
507-
null
508-
);
509-
browserDescriptors.add(chrome);
510-
511-
return browserDescriptors;
512-
}
513-
514489
/**
515490
* adds required broker protocol version key in request bundle if not null.
516491
*/

common/src/main/java/com/microsoft/identity/common/internal/ui/AndroidAuthorizationStrategyFactory.java

Lines changed: 51 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -26,97 +26,104 @@
2626
import android.content.Context;
2727

2828
import androidx.annotation.NonNull;
29-
import androidx.annotation.Nullable;
3029
import androidx.fragment.app.Fragment;
3130

32-
import com.microsoft.identity.common.internal.ui.browser.Browser;
31+
import com.microsoft.identity.common.java.browser.Browser;
3332
import com.microsoft.identity.common.internal.ui.browser.DefaultBrowserAuthorizationStrategy;
3433
import com.microsoft.identity.common.java.WarningType;
35-
import com.microsoft.identity.common.java.exception.ClientException;
36-
import com.microsoft.identity.common.java.exception.ErrorStrings;
37-
import com.microsoft.identity.common.java.commands.parameters.BrokerInteractiveTokenCommandParameters;
38-
import com.microsoft.identity.common.java.commands.parameters.InteractiveTokenCommandParameters;
34+
import com.microsoft.identity.common.java.browser.IBrowserSelector;
3935
import com.microsoft.identity.common.java.configuration.LibraryConfiguration;
4036
import com.microsoft.identity.common.java.providers.oauth2.IAuthorizationStrategy;
41-
import com.microsoft.identity.common.internal.ui.browser.BrowserSelector;
4237
import com.microsoft.identity.common.internal.ui.webview.EmbeddedWebViewAuthorizationStrategy;
4338
import com.microsoft.identity.common.java.ui.AuthorizationAgent;
4439
import com.microsoft.identity.common.java.ui.BrowserDescriptor;
4540
import com.microsoft.identity.common.logging.Logger;
4641
import com.microsoft.identity.common.java.strategies.IAuthorizationStrategyFactory;
4742

43+
4844
import java.util.List;
4945

46+
import edu.umd.cs.findbugs.annotations.Nullable;
5047
import lombok.Builder;
5148
import lombok.experimental.Accessors;
5249

5350
// Suppressing rawtype warnings due to the generic types AuthorizationStrategy, AuthorizationStrategyFactory, EmbeddedWebViewAuthorizationStrategy and BrowserAuthorizationStrategy
5451
@SuppressWarnings(WarningType.rawtype_warning)
5552
@Builder
5653
@Accessors(prefix = "m")
57-
public class AndroidAuthorizationStrategyFactory implements IAuthorizationStrategyFactory{
54+
public class AndroidAuthorizationStrategyFactory implements IAuthorizationStrategyFactory<IAuthorizationStrategy> {
5855
private static final String TAG = AndroidAuthorizationStrategyFactory.class.getSimpleName();
5956

6057
private final Context mContext;
6158
private final Activity mActivity;
6259
private final Fragment mFragment;
60+
private final IBrowserSelector mBrowserSelector;
6361

62+
/**
63+
* Get the authorization strategy based on the authorization agent and browser.
64+
* If the authorization agent is WEBVIEW or the browser is null,
65+
* return the embedded web view authorization strategy.
66+
* Otherwise, return the browser authorization strategy.
67+
*
68+
* @param authorizationAgent The authorization agent provided by the caller.
69+
* @param browserSafeList The browser safe list provided by the caller.
70+
* @param preferredBrowserDescriptor The preferred browser descriptor provided by the caller.
71+
* @param isBrokerRequest True if the request is from broker.
72+
* @return The authorization strategy.
73+
*/
6474
@Override
75+
@NonNull
6576
public IAuthorizationStrategy getAuthorizationStrategy(
66-
@NonNull final InteractiveTokenCommandParameters parameters) {
77+
@NonNull final AuthorizationAgent authorizationAgent,
78+
@NonNull final List<BrowserDescriptor> browserSafeList,
79+
@Nullable final BrowserDescriptor preferredBrowserDescriptor,
80+
final boolean isBrokerRequest) {
6781
final String methodTag = TAG + ":getAuthorizationStrategy";
68-
//Valid if available browser installed. Will fallback to embedded webView if no browser available.
6982

70-
if (parameters.getAuthorizationAgent() == AuthorizationAgent.WEBVIEW) {
71-
Logger.info(methodTag, "Use webView for authorization.");
72-
return getGenericAuthorizationStrategy();
73-
}
74-
75-
try {
76-
final Browser browser = BrowserSelector.select(
77-
mContext,
78-
parameters.getBrowserSafeList(),
79-
parameters.getPreferredBrowser());
83+
final Browser browser = mBrowserSelector.selectBrowser(browserSafeList, preferredBrowserDescriptor);
8084

81-
Logger.info(methodTag, "Use browser for authorization.");
82-
return getBrowserAuthorizationStrategy(
83-
browser,
84-
(parameters instanceof BrokerInteractiveTokenCommandParameters));
85-
} catch (final ClientException e) {
86-
Logger.info(methodTag, "Unable to use browser to do the authorization because "
87-
+ ErrorStrings.NO_AVAILABLE_BROWSER_FOUND + " Use embedded webView instead.");
85+
if (authorizationAgent == AuthorizationAgent.WEBVIEW || browser == null) {
86+
Logger.info(methodTag, "WebView authorization, browser: " + browser);
8887
return getGenericAuthorizationStrategy();
8988
}
89+
90+
Logger.info(methodTag, "Browser authorization, browser: " + browser);
91+
return getBrowserAuthorizationStrategy(browser, isBrokerRequest);
9092
}
9193

94+
/**
95+
* Get current task browser authorization strategy or default browser authorization strategy.
96+
* If the authorization is in current task, use current task browser authorization strategy.
97+
*
98+
* @param browser The browser to use for authorization.
99+
* @param isBrokerRequest True if the request is from broker.
100+
* @return The browser authorization strategy.
101+
*/
92102
private IAuthorizationStrategy getBrowserAuthorizationStrategy(@NonNull final Browser browser,
93103
final boolean isBrokerRequest) {
94104
if (LibraryConfiguration.getInstance().isAuthorizationInCurrentTask()) {
95-
final CurrentTaskBrowserAuthorizationStrategy currentTaskBrowserAuthorizationStrategy =
96-
new CurrentTaskBrowserAuthorizationStrategy(
97-
mContext,
98-
mActivity,
99-
mFragment);
100-
currentTaskBrowserAuthorizationStrategy.setBrowser(browser);
101-
return currentTaskBrowserAuthorizationStrategy;
105+
return new CurrentTaskBrowserAuthorizationStrategy(
106+
mContext,
107+
mActivity,
108+
mFragment,
109+
browser);
102110
} else {
103-
final DefaultBrowserAuthorizationStrategy defaultBrowserAuthorizationStrategy = new DefaultBrowserAuthorizationStrategy(
111+
return new DefaultBrowserAuthorizationStrategy(
104112
mContext,
105113
mActivity,
106114
mFragment,
107-
isBrokerRequest
115+
isBrokerRequest,
116+
browser
108117
);
109-
defaultBrowserAuthorizationStrategy.setBrowser(browser);
110-
return defaultBrowserAuthorizationStrategy;
111118
}
112119
}
113120

114-
// Suppressing unchecked warnings due to casting of EmbeddedWebViewAuthorizationStrategy to GenericAuthorizationStrategy
115-
@SuppressWarnings(WarningType.unchecked_warning)
121+
/**
122+
* Get the generic authorization strategy.
123+
*
124+
* @return The embedded web view authorization strategy.
125+
*/
116126
private IAuthorizationStrategy getGenericAuthorizationStrategy() {
117-
return new EmbeddedWebViewAuthorizationStrategy(
118-
mContext,
119-
mActivity,
120-
mFragment);
127+
return new EmbeddedWebViewAuthorizationStrategy(mContext, mActivity, mFragment);
121128
}
122129
}

common/src/main/java/com/microsoft/identity/common/internal/ui/CurrentTaskBrowserAuthorizationStrategy.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import androidx.annotation.Nullable;
3131
import androidx.fragment.app.Fragment;
3232

33+
import com.microsoft.identity.common.java.browser.Browser;
3334
import com.microsoft.identity.common.internal.ui.browser.BrowserAuthorizationStrategy;
3435
import com.microsoft.identity.common.java.WarningType;
3536
import com.microsoft.identity.common.java.providers.oauth2.AuthorizationRequest;
@@ -41,10 +42,11 @@ public class CurrentTaskBrowserAuthorizationStrategy<
4142
GenericOAuth2Strategy extends OAuth2Strategy,
4243
GenericAuthorizationRequest extends AuthorizationRequest>
4344
extends BrowserAuthorizationStrategy<GenericOAuth2Strategy, GenericAuthorizationRequest> {
44-
public CurrentTaskBrowserAuthorizationStrategy(@NonNull Context applicationContext,
45-
@NonNull Activity activity,
46-
@Nullable Fragment fragment) {
47-
super(applicationContext, activity, fragment);
45+
public CurrentTaskBrowserAuthorizationStrategy(@NonNull final Context applicationContext,
46+
@NonNull final Activity activity,
47+
@Nullable final Fragment fragment,
48+
@NonNull final Browser browser) {
49+
super(applicationContext, activity, fragment, browser);
4850
}
4951

5052
@Override

0 commit comments

Comments
 (0)