Skip to content

Commit

Permalink
Update Android and iOS
Browse files Browse the repository at this point in the history
  • Loading branch information
bgavrilMS committed Jan 18, 2025
1 parent c90eb62 commit 608d2f5
Show file tree
Hide file tree
Showing 11 changed files with 167 additions and 255 deletions.
8 changes: 4 additions & 4 deletions build/platform_and_feature_flags.props
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<Project>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNetCore)' or '$(TargetFramework)' == '$(TargetFrameworkNet)'">
<DefineConstants>$(DefineConstants);SUPPORTS_SYSTEM_TEXT_JSON;NET_CORE;SUPPORTS_CONFIDENTIAL_CLIENT;SUPPORTS_CUSTOM_CACHE;SUPPORTS_BROKER;SUPPORTS_WIN32;</DefineConstants>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNet)'">
<DefineConstants>$(DefineConstants)SUPPORTS_MTLS;NET_CORE;SUPPORTS_CONFIDENTIAL_CLIENT;SUPPORTS_CUSTOM_CACHE;SUPPORTS_BROKER;SUPPORTS_WIN32;</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNet)' or '$(TargetFramework)' == '$(TargetFrameworkNetDesktop462)' or '$(TargetFramework)' == '$(TargetFrameworkNetDesktop472)' or '$(TargetFramework)' == '$(TargetFrameworkNetStandard)'">
<DefineConstants>$(DefineConstants);SUPPORTS_OTEL;</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNet)' or '$(TargetFramework)' == '$(TargetFrameworkNetDesktop472)'">
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNetDesktop472)'">
<DefineConstants>$(DefineConstants);SUPPORTS_MTLS;</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNetAndroid)'">
Expand All @@ -15,7 +15,7 @@
<DefineConstants>$(DefineConstants);SUPPORTS_BROKER;SUPPORTS_CONFIDENTIAL_CLIENT;SUPPORTS_CUSTOM_CACHE;SUPPORTS_WIN32</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNetIos)'">
<DefineConstants>$(DefineConstants);iOS;SUPPORTS_BROKER</DefineConstants>
<DefineConstants>$(DefineConstants);iOS;SUPPORTS_BROKER</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNetStandard)'">
<DefineConstants>$(DefineConstants);NETSTANDARD;SUPPORTS_CONFIDENTIAL_CLIENT;SUPPORTS_BROKER;SUPPORTS_CUSTOM_CACHE;SUPPORTS_WIN32;</DefineConstants>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
using Microsoft.Identity.Client.Internal.Broker;
using Microsoft.Identity.Client.OAuth2;
using Microsoft.Identity.Client.UI;
using Microsoft.Identity.Json.Linq;
using Microsoft.Identity.Client.Internal.Requests;
using Microsoft.Identity.Client.ApiConfig.Parameters;
using Microsoft.Identity.Client.Http;
Expand Down Expand Up @@ -350,14 +349,16 @@ public async Task InitiateBrokerHandshakeAsync()
return;
}

dynamic errorResult = JObject.Parse(helloRequestResult.GetString(BrokerConstants.BrokerResultV2));
string errorResponse = helloRequestResult.GetString(BrokerConstants.BrokerResultV2);
string errorCode = null;
string errorDescription = null;

if (!string.IsNullOrEmpty(errorResult))
if (!string.IsNullOrEmpty(errorResponse))
{
errorCode = errorResult[BrokerResponseConst.BrokerErrorCode]?.ToString();
string errorMessage = errorResult[BrokerResponseConst.BrokerErrorMessage]?.ToString();
// serialize the error response to get the error code and error message withouth dynamic
var errorResult = JsonHelper.DeserializeFromJson<BrokerErrorResponse>(errorResponse);
errorCode = errorResult.BrokerErrorCode;
string errorMessage = errorResult.BrokerErrorMessage;
errorDescription = $"[Android broker] An error occurred during hand shake with the broker. Error: {errorCode} Error Message: {errorMessage}";
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,13 @@
using Android.Content.PM;
using Android.Util;
using Java.Security;
using Java.Util.Concurrent;
using Signature = Android.Content.PM.Signature;
using Microsoft.Identity.Client.Core;
using Microsoft.Identity.Client.Internal.Broker;
using Microsoft.Identity.Client.Utils;
using Microsoft.Identity.Json.Linq;
using System.Threading.Tasks;
using OperationCanceledException = Android.Accounts.OperationCanceledException;
using AndroidUri = Android.Net.Uri;
using Android.Database;
using Microsoft.Identity.Json.Utilities;
using System.Threading;
using Microsoft.Identity.Client.OAuth2;
using Microsoft.Identity.Client.Http;
using AndroidNative = Android;
using System.Linq;
using System.Text.Json;

namespace Microsoft.Identity.Client.Platforms.Android.Broker
{
Expand All @@ -48,7 +39,7 @@ public AndroidBrokerHelper(Context androidContext, ILoggerAdapter logger)
_androidContext = androidContext ?? throw new ArgumentNullException(nameof(androidContext));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));

_logger.Verbose(()=>"[Android broker] Getting the Android context for broker request. ");
_logger.Verbose(() => "[Android broker] Getting the Android context for broker request. ");
AndroidAccountManager = AccountManager.Get(_androidContext);
}

Expand All @@ -57,7 +48,7 @@ public bool IsBrokerInstalledAndInvokable(AuthorityType authorityType)
using (_logger.LogMethodDuration())
{
bool canInvoke = CanSwitchToBroker();
_logger.Verbose(()=>"[Android broker] Can invoke broker? " + canInvoke);
_logger.Verbose(() => "[Android broker] Can invoke broker? " + canInvoke);

return canInvoke;
}
Expand All @@ -74,7 +65,7 @@ private bool CanSwitchToBroker()

//Force this to return true for broker test app
var authenticator = GetInstalledAuthenticator();
return authenticator!= null
return authenticator != null
&& !packageName.Equals(BrokerConstants.PackageName, StringComparison.OrdinalIgnoreCase)
&& !packageName
.Equals(BrokerConstants.AzureAuthenticatorAppPackageName, StringComparison.OrdinalIgnoreCase);
Expand Down Expand Up @@ -120,30 +111,29 @@ public BrokerRequest UpdateBrokerRequestWithAccountData(string accountData, Brok
string homeAccountId = brokerRequest.HomeAccountId;
string localAccountId = brokerRequest.LocalAccountId;

dynamic AccountDataList = JArray.Parse(accountData);
var accountDataList = JsonHelper.DeserializeFromJson<List<AccountData>>(accountData);

foreach (JObject account in AccountDataList)
{
var accountInfo = account[BrokerResponseConst.Account];
var accountInfoHomeAccountID = accountInfo[BrokerResponseConst.HomeAccountId]?.ToString();
var accountInfoLocalAccountID = accountInfo[BrokerResponseConst.LocalAccountId]?.ToString();
foreach (AccountData account in accountDataList)
{
AccountInfo accountInfo = account.Account;
string accountInfoHomeAccountID = accountInfo.HomeAccountId;
string accountInfoLocalAccountID = accountInfo.LocalAccountId;

if (string.Equals(accountInfo[BrokerResponseConst.UserName].ToString(), username, StringComparison.OrdinalIgnoreCase))
{
// TODO: broker request should be immutable!
brokerRequest.HomeAccountId = accountInfoHomeAccountID;
brokerRequest.LocalAccountId = accountInfoLocalAccountID;
_logger.Info("[Android broker] Found broker account in Android account manager using the provided login hint. ");
return brokerRequest;
}
if (string.Equals(accountInfo.UserName, username, StringComparison.OrdinalIgnoreCase))
{
brokerRequest.HomeAccountId = accountInfoHomeAccountID;
brokerRequest.LocalAccountId = accountInfoLocalAccountID;
_logger.Info("[Android broker] Found broker account in Android account manager using the provided login hint. ");
return brokerRequest;
}

if (string.Equals(accountInfoHomeAccountID, homeAccountId, StringComparison.Ordinal) &&
string.Equals(accountInfoLocalAccountID, localAccountId, StringComparison.Ordinal))
{
_logger.Info("[Android broker] Found broker account in Android account manager using the provided account. ");
return brokerRequest;
}
if (string.Equals(accountInfoHomeAccountID, homeAccountId, StringComparison.Ordinal) &&
string.Equals(accountInfoLocalAccountID, localAccountId, StringComparison.Ordinal))
{
_logger.Info("[Android broker] Found broker account in Android account manager using the provided account. ");
return brokerRequest;
}
}

_logger.Info("[Android broker] The requested account does not exist in the Android account manager. ");
throw new MsalUiRequiredException(MsalError.NoAndroidBrokerAccountFound, MsalErrorMessage.NoAndroidBrokerAccountFound);
Expand All @@ -158,24 +148,24 @@ public IReadOnlyList<IAccount> ExtractBrokerAccountsFromAccountData(string accou

if (!string.IsNullOrEmpty(accountData))
{
dynamic authResult = JArray.Parse(accountData);
var accountDataList = JsonHelper.DeserializeFromJson<List<AccountData>>(accountData);

foreach (JObject account in authResult)
foreach (AccountData account in accountDataList)
{
if (account.ContainsKey(BrokerResponseConst.Account))
var accountInfo = account.Account;

if (accountInfo != null && accountInfo.HomeAccountId != null)
{
var accountInfo = account[BrokerResponseConst.Account];
IAccount iAccount = new Account(
accountInfo.Value<string>(BrokerResponseConst.HomeAccountId) ?? string.Empty,
accountInfo.Value<string>(BrokerResponseConst.UserName) ?? string.Empty,
accountInfo.Value<string>(BrokerResponseConst.Environment) ?? string.Empty);
accountInfo.HomeAccountId,
accountInfo.UserName ?? string.Empty,
accountInfo.Environment ?? string.Empty);
brokerAccounts.Add(iAccount);
}
}
}

_logger.Info(() => "[Android broker] Found " + brokerAccounts.Count + " accounts in the account manager. ");

return brokerAccounts;
}

Expand Down Expand Up @@ -258,7 +248,7 @@ public Bundle CreateSilentBrokerBundle(BrokerRequest brokerRequest)
public Bundle CreateBrokerAccountBundle(BrokerRequest brokerRequest)
{
_logger.InfoPii(
() => "[Android broker] CreateBrokerAccountBundle: " + JsonHelper.SerializeToJson(brokerRequest),
() => "[Android broker] CreateBrokerAccountBundle: " + JsonHelper.SerializeToJson(brokerRequest),
() => "Enable PII to see the broker account bundle request. ");
Bundle bundle = new Bundle();

Expand Down Expand Up @@ -387,7 +377,7 @@ private AuthenticatorDescription GetInstalledAuthenticator()
if (authenticator.Type.Equals(BrokerConstants.BrokerAccountType, StringComparison.OrdinalIgnoreCase)
&& VerifySignature(authenticator.PackageName))
{
_logger.Verbose(()=>"[Android broker] Found the Authenticator on the device. ");
_logger.Verbose(() => "[Android broker] Found the Authenticator on the device. ");
return authenticator;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Android.Content;
using Microsoft.Identity.Client.Core;
using Microsoft.Identity.Client.Http;
using Microsoft.Identity.Client.Internal.Broker;
using Microsoft.Identity.Client.OAuth2;
using Microsoft.Identity.Json.Linq;
using Microsoft.Identity.Client.Utils;

namespace Microsoft.Identity.Client.Platforms.Android.Broker
{
Expand Down Expand Up @@ -58,14 +54,15 @@ internal static void SetBrokerResult(Intent data, int resultCode, ILoggerAdapter
case (int)BrokerResponseCode.BrowserCodeError:
unreliableLogger?.Info("[Android broker] Response received - error. ");

dynamic errorResult = JObject.Parse(data.GetStringExtra(BrokerConstants.BrokerResultV2));
var errorResult = JsonHelper.DeserializeFromJson<BrokerErrorResult>
(data.GetStringExtra(BrokerConstants.BrokerResultV2));

string error;
string errorDescription;
if (errorResult != null)
{
error = errorResult[BrokerResponseConst.BrokerErrorCode]?.ToString();
errorDescription = errorResult[BrokerResponseConst.BrokerErrorMessage]?.ToString();
error = errorResult.BrokerErrorCode;
errorDescription = errorResult.BrokerErrorMessage;

unreliableLogger?.Error($"[Android broker] error: {error} errorDescription {errorDescription}. ");
}
Expand All @@ -76,21 +73,22 @@ internal static void SetBrokerResult(Intent data, int resultCode, ILoggerAdapter
unreliableLogger?.Error("[Android broker] Error response received, but not error could be extracted. ");
}

var httpResponse = new HttpResponse();
//TODO: figure out how to get status code properly deserialized from JObject
httpResponse.Body = errorResult[BrokerResponseConst.BrokerHttpBody]?.ToString();
var httpResponse = new HttpResponse
{
Body = errorResult?.BrokerHttpBody
};

InteractiveBrokerTokenResponse = new MsalTokenResponse
{
Error = error,
ErrorDescription = errorDescription,
SubError = errorResult[BrokerResponseConst.BrokerSubError],
SubError = errorResult?.BrokerSubError,
HttpResponse = httpResponse,
CorrelationId = InteractiveRequestCorrelationId,
TenantId = errorResult[BrokerResponseConst.TenantId]?.ToString(),
Upn = errorResult[BrokerResponseConst.UserName]?.ToString(),
AccountUserId = errorResult[BrokerResponseConst.LocalAccountId]?.ToString(),
AuthorityUrl = errorResult[BrokerResponseConst.Authority]?.ToString(),
TenantId = errorResult?.TenantId,
Upn = errorResult?.UserName,
AccountUserId = errorResult?.LocalAccountId,
AuthorityUrl = errorResult?.Authority,
};
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
using Microsoft.Identity.Client.OAuth2;
using Microsoft.Identity.Client.UI;
using Microsoft.Identity.Client.Utils;
using Microsoft.Identity.Json.Linq;
using AndroidNative = Android;
using AndroidUri = Android.Net.Uri;

Expand Down Expand Up @@ -73,16 +72,18 @@ public string GetProtocolKeyFromHandShakeResult(Bundle bundleResult)
return negotiatedBrokerProtocalKey;
}

dynamic errorResult = JObject.Parse(bundleResult?.GetString(BrokerConstants.BrokerResultV2));
string errorResponse = bundleResult.GetString(BrokerConstants.BrokerResultV2);
string errorCode = null;
string errorDescription = null;

if (!string.IsNullOrEmpty(errorResult))
if (!string.IsNullOrEmpty(errorResponse))
{
errorCode = errorResult[BrokerResponseConst.BrokerErrorCode]?.ToString();
string errorMessage = errorResult[BrokerResponseConst.BrokerErrorMessage]?.ToString();
// serialize the error response to get the error code and error message withouth dynamic
var errorResult = JsonHelper.DeserializeFromJson<BrokerErrorResponse>(errorResponse);
errorCode = errorResult.BrokerErrorCode;
string errorMessage = errorResult.BrokerErrorMessage;
errorDescription = $"[Android broker] An error occurred during hand shake with the broker. Error: {errorCode} Error Message: {errorMessage}";
}
}
else
{
errorCode = BrokerConstants.BrokerUnknownErrorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Text.Json.Serialization;
using Microsoft.Identity.Client.Internal.Broker;

namespace Microsoft.Identity.Client.Platforms.Android.Broker
{
[Preserve(AllMembers = true)]
internal class BrokerErrorResponse
{
[JsonPropertyName(BrokerResponseConst.BrokerErrorCode)]
public string BrokerErrorCode { get; set; }

[JsonPropertyName(BrokerResponseConst.BrokerErrorMessage)]
public string BrokerErrorMessage { get; set; }
}
}
Loading

0 comments on commit 608d2f5

Please sign in to comment.