diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index d2054177b4..273cfe9b43 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -28,6 +28,11 @@
+
+
+ true
+
+
diff --git a/src/client/Microsoft.Identity.Client.Extensions.Msal/Accessors/LinuxKeyRingAccessor.cs b/src/client/Microsoft.Identity.Client.Extensions.Msal/Accessors/LinuxKeyRingAccessor.cs
index e0ec591630..4e5c56ebbb 100644
--- a/src/client/Microsoft.Identity.Client.Extensions.Msal/Accessors/LinuxKeyRingAccessor.cs
+++ b/src/client/Microsoft.Identity.Client.Extensions.Msal/Accessors/LinuxKeyRingAccessor.cs
@@ -101,7 +101,7 @@ public void Clear()
{
try
{
- GError err = (GError)Marshal.PtrToStructure(error, typeof(GError));
+ GError err = Marshal.PtrToStructure(error);
throw new InteropException(
$"An error was encountered while clearing secret from keyring in the {nameof(Storage)} domain:'{err.Domain}' code:'{err.Code}' message:'{err.Message}'",
err.Code);
@@ -136,7 +136,7 @@ public byte[] Read()
{
try
{
- GError err = (GError)Marshal.PtrToStructure(error, typeof(GError));
+ GError err = Marshal.PtrToStructure(error);
throw new InteropException(
$"An error was encountered while reading secret from keyring in the {nameof(Storage)} domain:'{err.Domain}' code:'{err.Code}' message:'{err.Message}'", err.Code);
}
@@ -181,7 +181,7 @@ public void Write(byte[] data)
{
try
{
- GError err = (GError)Marshal.PtrToStructure(error, typeof(GError));
+ GError err = Marshal.PtrToStructure(error);
string message = $"An error was encountered while saving secret to keyring in the {nameof(Storage)} domain:'{err.Domain}' code:'{err.Code}' message:'{err.Message}'";
throw new InteropException(message, err.Code);
}
diff --git a/src/client/Microsoft.Identity.Client.Extensions.Msal/Shared/Mac/LibSystem.cs b/src/client/Microsoft.Identity.Client.Extensions.Msal/Shared/Mac/LibSystem.cs
index 079185ceb6..634c4bca1e 100644
--- a/src/client/Microsoft.Identity.Client.Extensions.Msal/Shared/Mac/LibSystem.cs
+++ b/src/client/Microsoft.Identity.Client.Extensions.Msal/Shared/Mac/LibSystem.cs
@@ -20,8 +20,8 @@ internal static class LibSystem
public static IntPtr GetGlobal(IntPtr handle, string symbol)
{
- IntPtr ptr = dlsym(handle, symbol);
- var structure = Marshal.PtrToStructure(ptr, typeof(IntPtr));
+ IntPtr ptr = dlsym(handle, symbol);
+ var structure = Marshal.PtrToStructure(ptr);
return (IntPtr)structure;
}
diff --git a/src/client/Microsoft.Identity.Client/Microsoft.Identity.Client.csproj b/src/client/Microsoft.Identity.Client/Microsoft.Identity.Client.csproj
index 578bb27e45..2fbcd27067 100644
--- a/src/client/Microsoft.Identity.Client/Microsoft.Identity.Client.csproj
+++ b/src/client/Microsoft.Identity.Client/Microsoft.Identity.Client.csproj
@@ -109,14 +109,8 @@
-
- true
- true
-
-
-
diff --git a/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidAccountManagerBroker.cs b/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidAccountManagerBroker.cs
index 21176836e7..a76920b428 100644
--- a/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidAccountManagerBroker.cs
+++ b/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidAccountManagerBroker.cs
@@ -350,14 +350,17 @@ public async Task InitiateBrokerHandshakeAsync()
return;
}
- dynamic errorResult = JObject.Parse(helloRequestResult.GetString(BrokerConstants.BrokerResultV2));
+ JObject errorResultObj = JObject.Parse(helloRequestResult.GetString(BrokerConstants.BrokerResultV2) ?? "{}");
string errorCode = null;
string errorDescription = null;
- if (!string.IsNullOrEmpty(errorResult))
+ if (errorResultObj != null && errorResultObj.Count > 0)
{
- errorCode = errorResult[BrokerResponseConst.BrokerErrorCode]?.ToString();
- string errorMessage = errorResult[BrokerResponseConst.BrokerErrorMessage]?.ToString();
+ JToken errorCodeToken = errorResultObj[BrokerResponseConst.BrokerErrorCode];
+ errorCode = errorCodeToken?.ToString();
+
+ JToken errorMsgToken = errorResultObj[BrokerResponseConst.BrokerErrorMessage];
+ string errorMessage = errorMsgToken?.ToString();
errorDescription = $"[Android broker] An error occurred during hand shake with the broker. Error: {errorCode} Error Message: {errorMessage}";
}
else
diff --git a/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidBrokerInteractiveResponseHelper.cs b/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidBrokerInteractiveResponseHelper.cs
index f772e155e2..ad6e044be3 100644
--- a/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidBrokerInteractiveResponseHelper.cs
+++ b/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidBrokerInteractiveResponseHelper.cs
@@ -58,14 +58,18 @@ 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));
+ JObject errorResultObj = JObject.Parse(data.GetStringExtra(BrokerConstants.BrokerResultV2) ?? "{}");
string error;
string errorDescription;
- if (errorResult != null)
+
+ if (errorResultObj != null && errorResultObj.Count > 0)
{
- error = errorResult[BrokerResponseConst.BrokerErrorCode]?.ToString();
- errorDescription = errorResult[BrokerResponseConst.BrokerErrorMessage]?.ToString();
+ JToken errorToken = errorResultObj[BrokerResponseConst.BrokerErrorCode];
+ error = errorToken?.ToString();
+
+ JToken errorDescToken = errorResultObj[BrokerResponseConst.BrokerErrorMessage];
+ errorDescription = errorDescToken?.ToString();
unreliableLogger?.Error($"[Android broker] error: {error} errorDescription {errorDescription}. ");
}
@@ -77,20 +81,27 @@ internal static void SetBrokerResult(Intent data, int resultCode, ILoggerAdapter
}
var httpResponse = new HttpResponse();
- //TODO: figure out how to get status code properly deserialized from JObject
- httpResponse.Body = errorResult[BrokerResponseConst.BrokerHttpBody]?.ToString();
+ //Get HTTP body from the JSON
+ JToken bodyToken = errorResultObj[BrokerResponseConst.BrokerHttpBody];
+ httpResponse.Body = bodyToken?.ToString();
+
+ JToken subErrorToken = errorResultObj[BrokerResponseConst.BrokerSubError];
+ JToken tenantIdToken = errorResultObj[BrokerResponseConst.TenantId];
+ JToken upnToken = errorResultObj[BrokerResponseConst.UserName];
+ JToken accountUserIdToken = errorResultObj[BrokerResponseConst.LocalAccountId];
+ JToken authorityUrlToken = errorResultObj[BrokerResponseConst.Authority];
InteractiveBrokerTokenResponse = new MsalTokenResponse
{
Error = error,
ErrorDescription = errorDescription,
- SubError = errorResult[BrokerResponseConst.BrokerSubError],
+ SubError = subErrorToken?.ToString(),
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 = tenantIdToken?.ToString(),
+ Upn = upnToken?.ToString(),
+ AccountUserId = accountUserIdToken?.ToString(),
+ AuthorityUrl = authorityUrlToken?.ToString(),
};
break;
default:
diff --git a/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidContentProviderBroker.cs b/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidContentProviderBroker.cs
index 488ca3bf43..16ed256313 100644
--- a/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidContentProviderBroker.cs
+++ b/src/client/Microsoft.Identity.Client/Platforms/Android/Broker/AndroidContentProviderBroker.cs
@@ -18,6 +18,7 @@
using Microsoft.Identity.Client.UI;
using Microsoft.Identity.Client.Utils;
using Microsoft.Identity.Json.Linq;
+using System.Diagnostics.CodeAnalysis;
using AndroidNative = Android;
using AndroidUri = Android.Net.Uri;
@@ -65,22 +66,26 @@ private async Task GetHandShakeBundleResultFromBrokerAsync()
public string GetProtocolKeyFromHandShakeResult(Bundle bundleResult)
{
- var negotiatedBrokerProtocalKey = bundleResult?.GetString(BrokerConstants.NegotiatedBPVersionKey);
+ var negotiatedBrokerProtocolKey = bundleResult?.GetString(BrokerConstants.NegotiatedBPVersionKey);
- if (!string.IsNullOrEmpty(negotiatedBrokerProtocalKey))
+ if (!string.IsNullOrEmpty(negotiatedBrokerProtocolKey))
{
- _logger.Info(() => "[Android broker] Using broker protocol version: " + negotiatedBrokerProtocalKey);
- return negotiatedBrokerProtocalKey;
+ _logger.Info(() => "[Android broker] Using broker protocol version: " + negotiatedBrokerProtocolKey);
+ return negotiatedBrokerProtocolKey;
}
- dynamic errorResult = JObject.Parse(bundleResult?.GetString(BrokerConstants.BrokerResultV2));
+ JObject errorResultObj = JObject.Parse(bundleResult?.GetString(BrokerConstants.BrokerResultV2) ?? "{}");
string errorCode = null;
string errorDescription = null;
- if (!string.IsNullOrEmpty(errorResult))
+ if (errorResultObj != null && errorResultObj.Count > 0)
{
- errorCode = errorResult[BrokerResponseConst.BrokerErrorCode]?.ToString();
- string errorMessage = errorResult[BrokerResponseConst.BrokerErrorMessage]?.ToString();
+ JToken errorCodeToken = errorResultObj[BrokerResponseConst.BrokerErrorCode];
+ errorCode = errorCodeToken?.ToString();
+
+ JToken errorMessageToken = errorResultObj[BrokerResponseConst.BrokerErrorMessage];
+ string errorMessage = errorMessageToken?.ToString();
+
errorDescription = $"[Android broker] An error occurred during hand shake with the broker. Error: {errorCode} Error Message: {errorMessage}";
}
else
diff --git a/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/NativeMethods.cs b/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/NativeMethods.cs
index 2f08a9daac..cc441e67fd 100644
--- a/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/NativeMethods.cs
+++ b/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/NativeMethods.cs
@@ -80,7 +80,7 @@ [Out] out LsaSafeHandle LsaHandle
);
[DllImport(SECUR32)]
- public static unsafe extern int LsaCallAuthenticationPackage(
+ public static extern unsafe int LsaCallAuthenticationPackage(
LsaSafeHandle LsaHandle,
int AuthenticationPackage,
void* ProtocolSubmitBuffer,
@@ -403,19 +403,20 @@ public void Dispose()
}
}
+ // Replace the usage of Marshal.PtrToStructure(IntPtr, Type) with the generic version Marshal.PtrToStructure(IntPtr)
+ // in the ForEachBuffer method inside SecBufferDesc struct.
+
private void ForEachBuffer(Action onBuffer)
{
for (int Index = 0; Index < cBuffers; Index++)
{
- int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer));
+ int CurrentOffset = Index * Marshal.SizeOf();
- SecBuffer thisSecBuffer = (SecBuffer)Marshal.PtrToStructure(
+ SecBuffer thisSecBuffer = (SecBuffer)Marshal.PtrToStructure(
IntPtr.Add(
pBuffers,
CurrentOffset
- ),
- typeof(SecBuffer)
- );
+ ));
onBuffer(thisSecBuffer);
}
diff --git a/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/TicketCacheWriter.cs b/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/TicketCacheWriter.cs
index e61c2a5605..9cb3f70918 100644
--- a/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/TicketCacheWriter.cs
+++ b/src/client/Microsoft.Identity.Client/Platforms/Features/DesktopOS/Kerberos/TicketCacheWriter.cs
@@ -102,7 +102,7 @@ public unsafe void ImportCredential(byte[] ticketBytes, long luid = 0)
{
MessageType = NativeMethods.KERB_PROTOCOL_MESSAGE_TYPE.KerbSubmitTicketMessage,
KerbCredSize = ticketBytes.Length,
- KerbCredOffset = Marshal.SizeOf(typeof(NativeMethods.KERB_SUBMIT_TKT_REQUEST)),
+ KerbCredOffset = Marshal.SizeOf(),
LogonId = luid
};