From 6c42c7a504e1ac28469ad5921154fe0fc45acbd0 Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 15:33:43 -0500 Subject: [PATCH 1/8] add exceptions registration for broadcast receivers --- .../java/controllers/CommandDispatcher.java | 29 ++++++++++++-- .../java/util/ported/LocalBroadcaster.java | 39 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java b/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java index a5abca03d4..d0c515a241 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java +++ b/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java @@ -43,9 +43,9 @@ import com.microsoft.identity.common.java.BuildConfig; import com.microsoft.identity.common.java.WarningType; import com.microsoft.identity.common.java.commands.BaseCommand; +import com.microsoft.identity.common.java.commands.DeviceCodeFlowAuthResultCommand; import com.microsoft.identity.common.java.commands.DeviceCodeFlowCommand; import com.microsoft.identity.common.java.commands.DeviceCodeFlowTokenResultCommand; -import com.microsoft.identity.common.java.commands.DeviceCodeFlowAuthResultCommand; import com.microsoft.identity.common.java.commands.ICommandResult; import com.microsoft.identity.common.java.commands.InteractiveTokenCommand; import com.microsoft.identity.common.java.commands.SilentTokenCommand; @@ -89,7 +89,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -708,7 +707,7 @@ private static boolean eligibleToCache ( @NonNull final CommandResult commandRes } } - public static void beginInteractive ( final InteractiveTokenCommand command){ + public static void beginInteractive (final InteractiveTokenCommand command) { final String methodName = ":beginInteractive"; synchronized (sLock) { @@ -755,7 +754,11 @@ public void run() { final LocalBroadcaster.IReceiverCallback resultReceiver = new LocalBroadcaster.IReceiverCallback() { @Override public void onReceive(@NonNull PropertyBag dataBag) { - completeInteractive(dataBag); + try { + completeInteractive(dataBag); + } catch (final Exception e) { + LocalBroadcaster.INSTANCE.registerExceptionDuringCallback(RETURN_AUTHORIZATION_REQUEST_RESULT, e); + } } }; @@ -770,8 +773,26 @@ public void onReceive(@NonNull PropertyBag dataBag) { commandResult = executeCommand(command); sCommand = null; + // Fetch the registered exception for this alias (if it exists) + BaseException receiverException = null; + final Exception exception = LocalBroadcaster.INSTANCE.getExceptionForAlias(RETURN_AUTHORIZATION_REQUEST_RESULT); + + if (exception != null) { + if (exception instanceof BaseException) { + receiverException = (BaseException) exception; + } else { + receiverException = ExceptionAdapter.baseExceptionFromException(exception); + } + } + LocalBroadcaster.INSTANCE.unregisterCallback(RETURN_AUTHORIZATION_REQUEST_RESULT); + // If we received an exception during the receiver callback execution, + // we should set that as the command result + if (receiverException != null) { + commandResult = CommandResult.of(CommandResult.ResultStatus.ERROR, receiverException, correlationId); + } + Logger.info(TAG + methodName, "Completed interactive request for correlation id : **" + correlationId + statusMsg(commandResult.getStatus().getLogStatus())); diff --git a/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java b/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java index f994c51c54..5e46061580 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java +++ b/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java @@ -42,6 +42,7 @@ public interface IReceiverCallback { } final ConcurrentHashMap mReceivers = new ConcurrentHashMap<>(); + final ConcurrentHashMap mExceptions = new ConcurrentHashMap<>(); public void registerCallback(@NonNull final String alias, @NonNull final IReceiverCallback callback){ final String methodName = ":registerCallback"; @@ -55,11 +56,48 @@ public void registerCallback(@NonNull final String alias, @NonNull final IReceiv mReceivers.put(alias, callback); } + /** + * Register an exception for an exisiting receiver alias. + * This should only be called inside the {@link IReceiverCallback#onReceive} method. + * @param alias alias of the receiver to log the exception + * @param e the exception being logged + */ + public void registerExceptionDuringCallback(@NonNull final String alias, @NonNull final Exception e){ + final String methodName = ":registerExceptionDuringCallback"; + + if (!mReceivers.containsKey(alias)){ + // Reaching this should be impossible, log + Logger.warn(TAG + methodName, "No alias found in the local broadcaster when trying to register exception for: " + alias); + } else { + Logger.error(TAG + methodName, "Registering Exception for Alias: " + alias, e); + mExceptions.put(alias, e); + } + } + + /** + * Get the exception for receiver alias provided. + * @param alias alias of the receiver to fetch exception for + * @return the exception registered for the receiver, returns null if alias is not registered, or if no exception exists + */ + public Exception getExceptionForAlias(@NonNull final String alias){ + final String methodName = ":getExceptionForAlias"; + + if (mReceivers.containsKey(alias) && mExceptions.containsKey(alias)){ + Logger.info(TAG + methodName, "Returning exception for alias: " + alias); + return mExceptions.get(alias); + } + + // If there is no receiver for the given alias, or if there is no exception for that receiver, + // return null. + return null; + } + public void unregisterCallback(@NonNull final String alias){ final String methodName = ":unregisterCallback"; Logger.info(TAG + methodName, "Removing alias: " + alias); mReceivers.remove(alias); + mExceptions.remove(alias); } public boolean hasReceivers(@NonNull final String alias) { @@ -87,6 +125,7 @@ public void run() { */ public void clearReceivers() { mReceivers.clear(); + mExceptions.clear(); } /** From 861837db866733ac5da5bfc9464ea251ea946a4f Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 15:40:54 -0500 Subject: [PATCH 2/8] changelog --- changelog.txt | 1 + .../identity/common/java/util/ported/LocalBroadcaster.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 0202f708ee..9aa3fb153e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,6 @@ V.Next --------- +- [PATCH] Add exception registration in LocalBroadcaster (#2305) - [MINOR] Add IpcStrategyWithBackup (#2301) - [PATCH] Fix MSAL Issue 1864 (#2280) - [MINOR] Add AccountManagerBackupIpcStrategyTargetingSpecificBrokerApp (#2294) diff --git a/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java b/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java index 5e46061580..96ac55759a 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java +++ b/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java @@ -66,7 +66,7 @@ public void registerExceptionDuringCallback(@NonNull final String alias, @NonNul final String methodName = ":registerExceptionDuringCallback"; if (!mReceivers.containsKey(alias)){ - // Reaching this should be impossible, log + // Reaching this should be impossible, log a warning instead of throwing another exception Logger.warn(TAG + methodName, "No alias found in the local broadcaster when trying to register exception for: " + alias); } else { Logger.error(TAG + methodName, "Registering Exception for Alias: " + alias, e); From 815b7bf72a1e08e380e5158f9c5df2f5b7531104 Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 19:50:22 -0500 Subject: [PATCH 3/8] check for future --- .../controllers/LocalMSALController.java | 74 ++++++++++++------- ...ederationServices2012R2OAuth2Strategy.java | 4 +- ...yFederationServices2016OAuth2Strategy.java | 4 +- ...AzureActiveDirectoryB2COAuth2Strategy.java | 4 +- .../browser/BrowserAuthorizationStrategy.java | 7 +- .../EmbeddedWebViewAuthorizationStrategy.java | 9 +-- .../oauth2/IAuthorizationStrategy.java | 6 +- .../java/providers/oauth2/OAuth2Strategy.java | 10 +-- .../MockStrategyWithMockedHttpResponse.java | 6 +- .../strategies/MockTestStrategy.java | 6 +- ...eOwnerPasswordCredentialsTestStrategy.java | 6 +- 11 files changed, 71 insertions(+), 65 deletions(-) diff --git a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java index 809acf5570..b86262d039 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java @@ -28,62 +28,62 @@ import androidx.annotation.WorkerThread; import com.microsoft.identity.common.internal.broker.BrokerData; -import com.microsoft.identity.common.java.configuration.LibraryConfiguration; -import com.microsoft.identity.common.java.controllers.CommandDispatcher; -import com.microsoft.identity.common.java.eststelemetry.PublicApiId; -import com.microsoft.identity.common.java.exception.ArgumentException; -import com.microsoft.identity.common.java.exception.BrokerRequiredException; -import com.microsoft.identity.common.java.exception.ClientException; -import com.microsoft.identity.common.java.exception.ErrorStrings; -import com.microsoft.identity.common.java.exception.ServiceException; -import com.microsoft.identity.common.java.cache.ICacheRecord; import com.microsoft.identity.common.internal.commands.RefreshOnCommand; -import com.microsoft.identity.common.java.commands.parameters.DeviceCodeFlowCommandParameters; -import com.microsoft.identity.common.java.commands.parameters.GenerateShrCommandParameters; -import com.microsoft.identity.common.java.commands.parameters.RemoveAccountCommandParameters; -import com.microsoft.identity.common.java.dto.AccountRecord; -import com.microsoft.identity.common.java.exception.UiRequiredException; -import com.microsoft.identity.common.java.platform.DevicePoPUtils; -import com.microsoft.identity.common.java.constants.OAuth2ErrorCode; -import com.microsoft.identity.common.java.controllers.BaseController; -import com.microsoft.identity.common.java.result.AcquireTokenResult; -import com.microsoft.identity.common.java.result.GenerateShrResult; -import com.microsoft.identity.common.java.result.LocalAuthenticationResult; import com.microsoft.identity.common.internal.telemetry.Telemetry; import com.microsoft.identity.common.internal.telemetry.events.ApiEndEvent; import com.microsoft.identity.common.internal.telemetry.events.ApiStartEvent; -import com.microsoft.identity.common.java.util.ThreadUtils; import com.microsoft.identity.common.java.WarningType; import com.microsoft.identity.common.java.authorities.Authority; import com.microsoft.identity.common.java.authscheme.AbstractAuthenticationScheme; import com.microsoft.identity.common.java.authscheme.IPoPAuthenticationSchemeParams; +import com.microsoft.identity.common.java.cache.ICacheRecord; import com.microsoft.identity.common.java.commands.parameters.CommandParameters; +import com.microsoft.identity.common.java.commands.parameters.DeviceCodeFlowCommandParameters; +import com.microsoft.identity.common.java.commands.parameters.GenerateShrCommandParameters; import com.microsoft.identity.common.java.commands.parameters.InteractiveTokenCommandParameters; +import com.microsoft.identity.common.java.commands.parameters.RemoveAccountCommandParameters; import com.microsoft.identity.common.java.commands.parameters.SilentTokenCommandParameters; -import com.microsoft.identity.common.java.providers.RawAuthorizationResult; +import com.microsoft.identity.common.java.configuration.LibraryConfiguration; +import com.microsoft.identity.common.java.controllers.BaseController; +import com.microsoft.identity.common.java.controllers.CommandDispatcher; +import com.microsoft.identity.common.java.dto.AccountRecord; +import com.microsoft.identity.common.java.eststelemetry.PublicApiId; +import com.microsoft.identity.common.java.exception.ArgumentException; +import com.microsoft.identity.common.java.exception.BrokerRequiredException; +import com.microsoft.identity.common.java.exception.ClientException; +import com.microsoft.identity.common.java.exception.ErrorStrings; +import com.microsoft.identity.common.java.exception.ServiceException; +import com.microsoft.identity.common.java.exception.UiRequiredException; +import com.microsoft.identity.common.java.platform.DevicePoPUtils; +import com.microsoft.identity.common.java.providers.microsoft.MicrosoftAuthorizationErrorResponse; +import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationErrorResponse; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationRequest; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationResponse; +import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationResult; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsTokenRequest; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationRequest; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationResult; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationStatus; import com.microsoft.identity.common.java.providers.oauth2.IAuthorizationStrategy; -import com.microsoft.identity.common.java.providers.oauth2.IResult; import com.microsoft.identity.common.java.providers.oauth2.OAuth2Strategy; import com.microsoft.identity.common.java.providers.oauth2.OAuth2StrategyParameters; import com.microsoft.identity.common.java.providers.oauth2.OAuth2TokenCache; import com.microsoft.identity.common.java.providers.oauth2.TokenResult; import com.microsoft.identity.common.java.request.SdkType; +import com.microsoft.identity.common.java.result.AcquireTokenResult; +import com.microsoft.identity.common.java.result.GenerateShrResult; +import com.microsoft.identity.common.java.result.LocalAuthenticationResult; import com.microsoft.identity.common.java.telemetry.TelemetryEventStrings; -import com.microsoft.identity.common.java.util.ported.PropertyBag; +import com.microsoft.identity.common.java.util.ResultFuture; import com.microsoft.identity.common.java.util.ResultUtil; +import com.microsoft.identity.common.java.util.ThreadUtils; +import com.microsoft.identity.common.java.util.ported.PropertyBag; import com.microsoft.identity.common.logging.Logger; import java.io.IOException; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; import lombok.EqualsAndHashCode; @@ -95,6 +95,9 @@ public class LocalMSALController extends BaseController { @SuppressWarnings(WarningType.rawtype_warning) private IAuthorizationStrategy mAuthorizationStrategy = null; + @SuppressWarnings({WarningType.rawtype_warning, WarningType.unchecked_warning}) + ResultFuture mAuthorizationFuture = null; + @SuppressWarnings(WarningType.rawtype_warning) private AuthorizationRequest mAuthorizationRequest = null; @@ -230,12 +233,14 @@ private AuthorizationResult performAuthorizationRequest(@NonNull final OAuth2Str mAuthorizationRequest = getAuthorizationRequest(strategy, parameters); // Suppressing unchecked warnings due to casting of AuthorizationRequest to GenericAuthorizationRequest and AuthorizationStrategy to GenericAuthorizationStrategy in the arguments of call to requestAuthorization method - @SuppressWarnings(WarningType.unchecked_warning) final Future future = strategy.requestAuthorization( + mAuthorizationFuture = strategy.requestAuthorization( mAuthorizationRequest, mAuthorizationStrategy ); - return future.get(); + AuthorizationResult result = mAuthorizationFuture.get(); + mAuthorizationFuture = null; + return result; } @Override @@ -255,7 +260,20 @@ public void onFinishAuthorizationSession(int requestCode, .put(TelemetryEventStrings.Key.REQUEST_CODE, String.valueOf(requestCode)) ); - mAuthorizationStrategy.completeAuthorization(requestCode, RawAuthorizationResult.fromPropertyBag(data)); + + + try { + throw new NullPointerException("Test"); +// mAuthorizationStrategy.completeAuthorization(requestCode, RawAuthorizationResult.fromPropertyBag(data)); + } catch (Exception e){ + // If the future is somehow initialized and waiting, give the future an exception + if (mAuthorizationFuture != null && !mAuthorizationFuture.isDone()) { + mAuthorizationFuture.setException(e); + } else { + // Best Effort + throw e; + } + } Telemetry.emit( new ApiEndEvent() diff --git a/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2012R2OAuth2Strategy.java b/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2012R2OAuth2Strategy.java index 8b11673fb2..1bc000275e 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2012R2OAuth2Strategy.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2012R2OAuth2Strategy.java @@ -43,7 +43,7 @@ import com.microsoft.identity.common.java.providers.oauth2.TokenRequest; import com.microsoft.identity.common.java.providers.oauth2.TokenResponse; -import java.util.concurrent.Future; +import com.microsoft.identity.common.java.util.ResultFuture; /** * Azure Active Directory Federation Services 2012 R2 OAuth Strategy @@ -70,7 +70,7 @@ public ActiveDirectoryFederationServices2012R2OAuth2Strategy(OAuth2Configuration // Suppressing unchecked warnings due to casting of AuthorizationRequest to GenericAuthorizationRequest and AuthorizationStrategy to GenericAuthorizationStrategy in the arguments of call to super class' method requestAuthorization @SuppressWarnings(WarningType.unchecked_warning) @Override - public Future requestAuthorization(AuthorizationRequest request, IAuthorizationStrategy IAuthorizationStrategy) + public ResultFuture requestAuthorization(AuthorizationRequest request, IAuthorizationStrategy IAuthorizationStrategy) throws ClientException { return super.requestAuthorization(request, IAuthorizationStrategy); } diff --git a/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2016OAuth2Strategy.java b/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2016OAuth2Strategy.java index 206a3b27ea..d507d6fcda 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2016OAuth2Strategy.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/activedirectoryfederationservices/ActiveDirectoryFederationServices2016OAuth2Strategy.java @@ -43,7 +43,7 @@ import com.microsoft.identity.common.java.providers.oauth2.TokenRequest; import com.microsoft.identity.common.java.providers.oauth2.TokenResponse; -import java.util.concurrent.Future; +import com.microsoft.identity.common.java.util.ResultFuture; /** * Azure Active Directory Federation Services 2016 oAuth2 Strategy. @@ -68,7 +68,7 @@ public ActiveDirectoryFederationServices2016OAuth2Strategy(OAuth2Configuration c // Suppressing unchecked warnings due to casting of AuthorizationRequest to GenericAuthorizationRequest and AuthorizationStrategy to GenericAuthorizationStrategy in the arguments of call to super class' method requestAuthorization @SuppressWarnings(WarningType.unchecked_warning) @Override - public Future requestAuthorization(AuthorizationRequest request, IAuthorizationStrategy IAuthorizationStrategy) throws ClientException { + public ResultFuture requestAuthorization(AuthorizationRequest request, IAuthorizationStrategy IAuthorizationStrategy) throws ClientException { return super.requestAuthorization(request, IAuthorizationStrategy); } diff --git a/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/azureactivedirectoryb2c/AzureActiveDirectoryB2COAuth2Strategy.java b/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/azureactivedirectoryb2c/AzureActiveDirectoryB2COAuth2Strategy.java index f8d3d2a205..8ae2ebb653 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/azureactivedirectoryb2c/AzureActiveDirectoryB2COAuth2Strategy.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/providers/microsoft/azureactivedirectoryb2c/AzureActiveDirectoryB2COAuth2Strategy.java @@ -43,7 +43,7 @@ import com.microsoft.identity.common.java.providers.oauth2.TokenResponse; import com.microsoft.identity.common.java.providers.oauth2.TokenResult; -import java.util.concurrent.Future; +import com.microsoft.identity.common.java.util.ResultFuture; /** * Azure Active Directory B2C OAuth Strategy. @@ -68,7 +68,7 @@ public AzureActiveDirectoryB2COAuth2Strategy(OAuth2Configuration config, OAuth2S // Suppressing unchecked warnings due to casting of AuthorizationRequest to GenericAuthorizationRequest and AuthorizationStrategy to GenericAuthorizationStrategy in the arguments of call to super class' method requestAuthorization @SuppressWarnings(WarningType.unchecked_warning) @Override - public Future requestAuthorization(AuthorizationRequest request, IAuthorizationStrategy authorizationStrategy) throws ClientException { + public ResultFuture requestAuthorization(AuthorizationRequest request, IAuthorizationStrategy authorizationStrategy) throws ClientException { return super.requestAuthorization(request, authorizationStrategy); } diff --git a/common/src/main/java/com/microsoft/identity/common/internal/ui/browser/BrowserAuthorizationStrategy.java b/common/src/main/java/com/microsoft/identity/common/internal/ui/browser/BrowserAuthorizationStrategy.java index 2da2f084fc..e9ffbe6f8b 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/ui/browser/BrowserAuthorizationStrategy.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/ui/browser/BrowserAuthorizationStrategy.java @@ -33,20 +33,17 @@ import com.microsoft.identity.common.internal.providers.oauth2.AndroidAuthorizationStrategy; import com.microsoft.identity.common.internal.providers.oauth2.AuthorizationActivityFactory; -import com.microsoft.identity.common.java.ui.AuthorizationAgent; import com.microsoft.identity.common.java.WarningType; import com.microsoft.identity.common.java.exception.ClientException; import com.microsoft.identity.common.java.providers.RawAuthorizationResult; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationRequest; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationResult; import com.microsoft.identity.common.java.providers.oauth2.OAuth2Strategy; -import com.microsoft.identity.common.java.ui.BrowserDescriptor; +import com.microsoft.identity.common.java.ui.AuthorizationAgent; import com.microsoft.identity.common.java.util.ResultFuture; import com.microsoft.identity.common.logging.Logger; import java.net.URI; -import java.util.List; -import java.util.concurrent.Future; import static com.microsoft.identity.common.java.AuthenticationConstants.UIRequest.BROWSER_FLOW; @@ -77,7 +74,7 @@ public void setBrowser(final Browser browser) { } @Override - public Future requestAuthorization( + public ResultFuture requestAuthorization( GenericAuthorizationRequest authorizationRequest, GenericOAuth2Strategy oAuth2Strategy) throws ClientException { diff --git a/common/src/main/java/com/microsoft/identity/common/internal/ui/webview/EmbeddedWebViewAuthorizationStrategy.java b/common/src/main/java/com/microsoft/identity/common/internal/ui/webview/EmbeddedWebViewAuthorizationStrategy.java index f9c4231887..572328dcd6 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/ui/webview/EmbeddedWebViewAuthorizationStrategy.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/ui/webview/EmbeddedWebViewAuthorizationStrategy.java @@ -22,6 +22,8 @@ // THE SOFTWARE. package com.microsoft.identity.common.internal.ui.webview; +import static com.microsoft.identity.common.java.AuthenticationConstants.UIRequest.BROWSER_FLOW; + import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -43,9 +45,6 @@ import com.microsoft.identity.common.logging.Logger; import java.net.URI; -import java.util.concurrent.Future; - -import static com.microsoft.identity.common.java.AuthenticationConstants.UIRequest.BROWSER_FLOW; /** * Serve as a class to do the OAuth2 auth code grant flow with Android embedded web view. @@ -76,8 +75,8 @@ public EmbeddedWebViewAuthorizationStrategy(@NonNull Context applicationContext, * The activity result is set in Authorization.setResult() and passed to the onActivityResult() of the calling activity. */ @Override - public Future requestAuthorization(GenericAuthorizationRequest authorizationRequest, - GenericOAuth2Strategy oAuth2Strategy) throws ClientException { + public ResultFuture requestAuthorization(GenericAuthorizationRequest authorizationRequest, + GenericOAuth2Strategy oAuth2Strategy) throws ClientException { final String methodTag = TAG + ":requestAuthorization"; mAuthorizationResultFuture = new ResultFuture<>(); mOAuth2Strategy = oAuth2Strategy; diff --git a/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/IAuthorizationStrategy.java b/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/IAuthorizationStrategy.java index 9a69fae8c1..f43f117df0 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/IAuthorizationStrategy.java +++ b/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/IAuthorizationStrategy.java @@ -26,7 +26,7 @@ import com.microsoft.identity.common.java.exception.ClientException; import com.microsoft.identity.common.java.providers.RawAuthorizationResult; -import java.util.concurrent.Future; +import com.microsoft.identity.common.java.util.ResultFuture; import edu.umd.cs.findbugs.annotations.NonNull; @@ -43,8 +43,8 @@ public interface IAuthorizationStrategy< /** * Perform the authorization request. */ - Future requestAuthorization(GenericAuthorizationRequest authorizationRequest, - GenericOAuth2Strategy oAuth2Strategy) + ResultFuture requestAuthorization(GenericAuthorizationRequest authorizationRequest, + GenericOAuth2Strategy oAuth2Strategy) throws ClientException; /** diff --git a/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/OAuth2Strategy.java b/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/OAuth2Strategy.java index d17a5d28b9..7091327873 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/OAuth2Strategy.java +++ b/common4j/src/main/com/microsoft/identity/common/java/providers/oauth2/OAuth2Strategy.java @@ -30,7 +30,6 @@ import com.microsoft.identity.common.java.authscheme.AbstractAuthenticationScheme; import com.microsoft.identity.common.java.cache.ICacheRecord; import com.microsoft.identity.common.java.commands.parameters.RopcTokenCommandParameters; -import com.microsoft.identity.common.java.constants.FidoConstants; import com.microsoft.identity.common.java.dto.IAccountRecord; import com.microsoft.identity.common.java.eststelemetry.EstsTelemetry; import com.microsoft.identity.common.java.exception.ClientException; @@ -53,10 +52,11 @@ import com.microsoft.identity.common.java.telemetry.Telemetry; import com.microsoft.identity.common.java.telemetry.TelemetryEventStrings; import com.microsoft.identity.common.java.telemetry.events.UiShownEvent; +import com.microsoft.identity.common.java.util.CommonURIBuilder; import com.microsoft.identity.common.java.util.IClockSkewManager; import com.microsoft.identity.common.java.util.ObjectMapper; +import com.microsoft.identity.common.java.util.ResultFuture; import com.microsoft.identity.common.java.util.StringUtil; -import com.microsoft.identity.common.java.util.CommonURIBuilder; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -67,7 +67,6 @@ import java.util.Locale; import java.util.Map; import java.util.TreeMap; -import java.util.concurrent.Future; import javax.net.ssl.HttpsURLConnection; @@ -139,15 +138,14 @@ public OAuth2Strategy(GenericOAuth2Configuration config, * @param authorizationStrategy generic authorization strategy. * @return GenericAuthorizationResponse */ - @NonNull - public Future requestAuthorization( + public ResultFuture requestAuthorization( final GenericAuthorizationRequest request, final GenericAuthorizationStrategy authorizationStrategy) throws ClientException { validateAuthorizationRequest(request); // Suppressing unchecked warnings due to casting an object in reference of current class to the child class GenericOAuth2Strategy while calling method requestAuthorization() - @SuppressWarnings(WarningType.unchecked_warning) final Future authorizationFuture = + @SuppressWarnings(WarningType.unchecked_warning) final ResultFuture authorizationFuture = authorizationStrategy.requestAuthorization(request, this); Telemetry.emit(new UiShownEvent().putVisible(TelemetryEventStrings.Value.TRUE)); diff --git a/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockStrategyWithMockedHttpResponse.java b/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockStrategyWithMockedHttpResponse.java index 96d96b1e18..5700389de4 100644 --- a/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockStrategyWithMockedHttpResponse.java +++ b/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockStrategyWithMockedHttpResponse.java @@ -30,8 +30,6 @@ import com.microsoft.identity.common.java.util.ResultFuture; import com.microsoft.identity.internal.testutils.mocks.MockSuccessAuthorizationResultMockedTests; -import java.util.concurrent.Future; - public class MockStrategyWithMockedHttpResponse extends ResourceOwnerPasswordCredentialsTestStrategy { /** @@ -46,12 +44,12 @@ public MockStrategyWithMockedHttpResponse(MicrosoftStsOAuth2Configuration config /** * Template method for executing an OAuth2 authorization request. * - * @param request microsoft sts authorization request. + * @param request microsoft sts authorization request. * @param IAuthorizationStrategy authorization strategy. * @return GenericAuthorizationResponse */ @Override - public Future requestAuthorization( + public ResultFuture requestAuthorization( final MicrosoftStsAuthorizationRequest request, final IAuthorizationStrategy IAuthorizationStrategy) { final MockSuccessAuthorizationResultMockedTests authorizationResult = new MockSuccessAuthorizationResultMockedTests(); diff --git a/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockTestStrategy.java b/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockTestStrategy.java index 4836b5abfa..4dc0322929 100644 --- a/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockTestStrategy.java +++ b/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/MockTestStrategy.java @@ -24,7 +24,6 @@ import static com.microsoft.identity.common.java.net.HttpConstants.HeaderField.X_MS_CLITELEM; -import com.microsoft.identity.common.adal.internal.AuthenticationConstants; import com.microsoft.identity.common.java.exception.ClientException; import com.microsoft.identity.common.java.net.HttpResponse; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationRequest; @@ -43,7 +42,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.concurrent.Future; public class MockTestStrategy extends ResourceOwnerPasswordCredentialsTestStrategy { @@ -59,12 +57,12 @@ public MockTestStrategy(MicrosoftStsOAuth2Configuration config) throws ClientExc /** * Template method for executing an OAuth2 authorization request. * - * @param request microsoft sts authorization request. + * @param request microsoft sts authorization request. * @param IAuthorizationStrategy authorization strategy. * @return GenericAuthorizationResponse */ @Override - public Future requestAuthorization( + public ResultFuture requestAuthorization( final MicrosoftStsAuthorizationRequest request, final IAuthorizationStrategy IAuthorizationStrategy) { final MockSuccessAuthorizationResultMockedTests authorizationResult = new MockSuccessAuthorizationResultMockedTests(); diff --git a/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/ResourceOwnerPasswordCredentialsTestStrategy.java b/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/ResourceOwnerPasswordCredentialsTestStrategy.java index 4a94744a6c..8c653f86b0 100644 --- a/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/ResourceOwnerPasswordCredentialsTestStrategy.java +++ b/testutils/src/main/java/com/microsoft/identity/internal/testutils/strategies/ResourceOwnerPasswordCredentialsTestStrategy.java @@ -41,8 +41,6 @@ import com.microsoft.identity.internal.testutils.labutils.LabConfig; import com.microsoft.identity.internal.testutils.mocks.MockSuccessAuthorizationResultNetworkTests; -import java.util.concurrent.Future; - public class ResourceOwnerPasswordCredentialsTestStrategy extends MicrosoftStsOAuth2Strategy { public static final String USERNAME_EMPTY_OR_NULL = "username_empty_or_null"; @@ -71,12 +69,12 @@ public ResourceOwnerPasswordCredentialsTestStrategy(final MicrosoftStsOAuth2Conf /** * Template method for executing an OAuth2 authorization request. * - * @param request microsoft sts authorization request. + * @param request microsoft sts authorization request. * @param IAuthorizationStrategy authorization strategy. * @return GenericAuthorizationResponse */ @Override - public Future requestAuthorization( + public ResultFuture requestAuthorization( final MicrosoftStsAuthorizationRequest request, final IAuthorizationStrategy IAuthorizationStrategy) { final MockSuccessAuthorizationResultNetworkTests authorizationResult = new MockSuccessAuthorizationResultNetworkTests(); From 6ffc68b6eefeac864a84123f375e87c77c0db16b Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 19:53:04 -0500 Subject: [PATCH 4/8] remove test code --- .../common/internal/controllers/LocalMSALController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java index b86262d039..fdbd49f563 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java @@ -55,6 +55,7 @@ import com.microsoft.identity.common.java.exception.ServiceException; import com.microsoft.identity.common.java.exception.UiRequiredException; import com.microsoft.identity.common.java.platform.DevicePoPUtils; +import com.microsoft.identity.common.java.providers.RawAuthorizationResult; import com.microsoft.identity.common.java.providers.microsoft.MicrosoftAuthorizationErrorResponse; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationErrorResponse; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationRequest; @@ -263,8 +264,7 @@ public void onFinishAuthorizationSession(int requestCode, try { - throw new NullPointerException("Test"); -// mAuthorizationStrategy.completeAuthorization(requestCode, RawAuthorizationResult.fromPropertyBag(data)); + mAuthorizationStrategy.completeAuthorization(requestCode, RawAuthorizationResult.fromPropertyBag(data)); } catch (Exception e){ // If the future is somehow initialized and waiting, give the future an exception if (mAuthorizationFuture != null && !mAuthorizationFuture.isDone()) { From 1b39437d5e6020bae7462188d8fbb52ecbd193c3 Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 20:19:58 -0500 Subject: [PATCH 5/8] comments --- changelog.txt | 2 +- .../controllers/LocalMSALController.java | 2 - .../java/controllers/CommandDispatcher.java | 20 +++------- .../java/util/ported/LocalBroadcaster.java | 39 ------------------- 4 files changed, 6 insertions(+), 57 deletions(-) diff --git a/changelog.txt b/changelog.txt index 9aa3fb153e..b820e49575 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ V.Next --------- -- [PATCH] Add exception registration in LocalBroadcaster (#2305) +- [PATCH] Handle Receiver Callback Exception in CommandDispatcher interactive command (#2305) - [MINOR] Add IpcStrategyWithBackup (#2301) - [PATCH] Fix MSAL Issue 1864 (#2280) - [MINOR] Add AccountManagerBackupIpcStrategyTargetingSpecificBrokerApp (#2294) diff --git a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java index fdbd49f563..7fceb75327 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java @@ -261,8 +261,6 @@ public void onFinishAuthorizationSession(int requestCode, .put(TelemetryEventStrings.Key.REQUEST_CODE, String.valueOf(requestCode)) ); - - try { mAuthorizationStrategy.completeAuthorization(requestCode, RawAuthorizationResult.fromPropertyBag(data)); } catch (Exception e){ diff --git a/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java b/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java index d0c515a241..8547199918 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java +++ b/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java @@ -751,13 +751,15 @@ public void run() { EstsTelemetry.getInstance().emitApiId(command.getPublicApiId()); + final BaseException[] receiverException = new BaseException[1]; + final LocalBroadcaster.IReceiverCallback resultReceiver = new LocalBroadcaster.IReceiverCallback() { @Override public void onReceive(@NonNull PropertyBag dataBag) { try { completeInteractive(dataBag); - } catch (final Exception e) { - LocalBroadcaster.INSTANCE.registerExceptionDuringCallback(RETURN_AUTHORIZATION_REQUEST_RESULT, e); + } catch (Exception e) { + receiverException[0] = ExceptionAdapter.baseExceptionFromException(e); } } }; @@ -773,23 +775,11 @@ public void onReceive(@NonNull PropertyBag dataBag) { commandResult = executeCommand(command); sCommand = null; - // Fetch the registered exception for this alias (if it exists) - BaseException receiverException = null; - final Exception exception = LocalBroadcaster.INSTANCE.getExceptionForAlias(RETURN_AUTHORIZATION_REQUEST_RESULT); - - if (exception != null) { - if (exception instanceof BaseException) { - receiverException = (BaseException) exception; - } else { - receiverException = ExceptionAdapter.baseExceptionFromException(exception); - } - } - LocalBroadcaster.INSTANCE.unregisterCallback(RETURN_AUTHORIZATION_REQUEST_RESULT); // If we received an exception during the receiver callback execution, // we should set that as the command result - if (receiverException != null) { + if (receiverException[0] != null) { commandResult = CommandResult.of(CommandResult.ResultStatus.ERROR, receiverException, correlationId); } diff --git a/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java b/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java index 96ac55759a..f994c51c54 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java +++ b/common4j/src/main/com/microsoft/identity/common/java/util/ported/LocalBroadcaster.java @@ -42,7 +42,6 @@ public interface IReceiverCallback { } final ConcurrentHashMap mReceivers = new ConcurrentHashMap<>(); - final ConcurrentHashMap mExceptions = new ConcurrentHashMap<>(); public void registerCallback(@NonNull final String alias, @NonNull final IReceiverCallback callback){ final String methodName = ":registerCallback"; @@ -56,48 +55,11 @@ public void registerCallback(@NonNull final String alias, @NonNull final IReceiv mReceivers.put(alias, callback); } - /** - * Register an exception for an exisiting receiver alias. - * This should only be called inside the {@link IReceiverCallback#onReceive} method. - * @param alias alias of the receiver to log the exception - * @param e the exception being logged - */ - public void registerExceptionDuringCallback(@NonNull final String alias, @NonNull final Exception e){ - final String methodName = ":registerExceptionDuringCallback"; - - if (!mReceivers.containsKey(alias)){ - // Reaching this should be impossible, log a warning instead of throwing another exception - Logger.warn(TAG + methodName, "No alias found in the local broadcaster when trying to register exception for: " + alias); - } else { - Logger.error(TAG + methodName, "Registering Exception for Alias: " + alias, e); - mExceptions.put(alias, e); - } - } - - /** - * Get the exception for receiver alias provided. - * @param alias alias of the receiver to fetch exception for - * @return the exception registered for the receiver, returns null if alias is not registered, or if no exception exists - */ - public Exception getExceptionForAlias(@NonNull final String alias){ - final String methodName = ":getExceptionForAlias"; - - if (mReceivers.containsKey(alias) && mExceptions.containsKey(alias)){ - Logger.info(TAG + methodName, "Returning exception for alias: " + alias); - return mExceptions.get(alias); - } - - // If there is no receiver for the given alias, or if there is no exception for that receiver, - // return null. - return null; - } - public void unregisterCallback(@NonNull final String alias){ final String methodName = ":unregisterCallback"; Logger.info(TAG + methodName, "Removing alias: " + alias); mReceivers.remove(alias); - mExceptions.remove(alias); } public boolean hasReceivers(@NonNull final String alias) { @@ -125,7 +87,6 @@ public void run() { */ public void clearReceivers() { mReceivers.clear(); - mExceptions.clear(); } /** From 2b395f658c71c9459fc81fd8e3f10a58624b9ac8 Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 20:40:39 -0500 Subject: [PATCH 6/8] checks From b0f28275b2eb6d3152d96c4e0f801570d40d5a83 Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 21:38:33 -0500 Subject: [PATCH 7/8] comments --- .../internal/controllers/LocalMSALController.java | 15 ++++++--------- .../java/controllers/CommandDispatcher.java | 4 ++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java index 7fceb75327..4d8bf43cda 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java @@ -56,11 +56,8 @@ import com.microsoft.identity.common.java.exception.UiRequiredException; import com.microsoft.identity.common.java.platform.DevicePoPUtils; import com.microsoft.identity.common.java.providers.RawAuthorizationResult; -import com.microsoft.identity.common.java.providers.microsoft.MicrosoftAuthorizationErrorResponse; -import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationErrorResponse; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationRequest; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationResponse; -import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsAuthorizationResult; import com.microsoft.identity.common.java.providers.microsoft.microsoftsts.MicrosoftStsTokenRequest; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationRequest; import com.microsoft.identity.common.java.providers.oauth2.AuthorizationResult; @@ -97,7 +94,7 @@ public class LocalMSALController extends BaseController { private IAuthorizationStrategy mAuthorizationStrategy = null; @SuppressWarnings({WarningType.rawtype_warning, WarningType.unchecked_warning}) - ResultFuture mAuthorizationFuture = null; + ResultFuture mAuthorizationResultFuture = null; @SuppressWarnings(WarningType.rawtype_warning) private AuthorizationRequest mAuthorizationRequest = null; @@ -234,13 +231,13 @@ private AuthorizationResult performAuthorizationRequest(@NonNull final OAuth2Str mAuthorizationRequest = getAuthorizationRequest(strategy, parameters); // Suppressing unchecked warnings due to casting of AuthorizationRequest to GenericAuthorizationRequest and AuthorizationStrategy to GenericAuthorizationStrategy in the arguments of call to requestAuthorization method - mAuthorizationFuture = strategy.requestAuthorization( + mAuthorizationResultFuture = strategy.requestAuthorization( mAuthorizationRequest, mAuthorizationStrategy ); - AuthorizationResult result = mAuthorizationFuture.get(); - mAuthorizationFuture = null; + AuthorizationResult result = mAuthorizationResultFuture.get(); + mAuthorizationResultFuture = null; return result; } @@ -265,8 +262,8 @@ public void onFinishAuthorizationSession(int requestCode, mAuthorizationStrategy.completeAuthorization(requestCode, RawAuthorizationResult.fromPropertyBag(data)); } catch (Exception e){ // If the future is somehow initialized and waiting, give the future an exception - if (mAuthorizationFuture != null && !mAuthorizationFuture.isDone()) { - mAuthorizationFuture.setException(e); + if (mAuthorizationResultFuture != null && !mAuthorizationResultFuture.isDone()) { + mAuthorizationResultFuture.setException(e); } else { // Best Effort throw e; diff --git a/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java b/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java index 8547199918..f77f2690ae 100644 --- a/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java +++ b/common4j/src/main/com/microsoft/identity/common/java/controllers/CommandDispatcher.java @@ -758,7 +758,7 @@ public void run() { public void onReceive(@NonNull PropertyBag dataBag) { try { completeInteractive(dataBag); - } catch (Exception e) { + } catch (final Exception e) { receiverException[0] = ExceptionAdapter.baseExceptionFromException(e); } } @@ -780,7 +780,7 @@ public void onReceive(@NonNull PropertyBag dataBag) { // If we received an exception during the receiver callback execution, // we should set that as the command result if (receiverException[0] != null) { - commandResult = CommandResult.of(CommandResult.ResultStatus.ERROR, receiverException, correlationId); + commandResult = CommandResult.of(CommandResult.ResultStatus.ERROR, receiverException[0], correlationId); } Logger.info(TAG + methodName, From 77ec4485b802022a79043748653e78378aab7047 Mon Sep 17 00:00:00 2001 From: fadidurah Date: Wed, 31 Jan 2024 21:44:16 -0500 Subject: [PATCH 8/8] comment --- .../common/internal/controllers/LocalMSALController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java index 4d8bf43cda..7d94cff59f 100644 --- a/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java +++ b/common/src/main/java/com/microsoft/identity/common/internal/controllers/LocalMSALController.java @@ -94,7 +94,7 @@ public class LocalMSALController extends BaseController { private IAuthorizationStrategy mAuthorizationStrategy = null; @SuppressWarnings({WarningType.rawtype_warning, WarningType.unchecked_warning}) - ResultFuture mAuthorizationResultFuture = null; + private ResultFuture mAuthorizationResultFuture = null; @SuppressWarnings(WarningType.rawtype_warning) private AuthorizationRequest mAuthorizationRequest = null;