Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@

</PropertyGroup>

<!-- AOT compatibility for .NET 8+ -->
<PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

<ItemGroup Label="Build Tools" Condition="$([MSBuild]::IsOsPlatform('Windows'))">
<PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public void Clear()
{
try
{
GError err = (GError)Marshal.PtrToStructure(error, typeof(GError));
GError err = Marshal.PtrToStructure<GError>(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);
Expand Down Expand Up @@ -136,7 +136,7 @@ public byte[] Read()
{
try
{
GError err = (GError)Marshal.PtrToStructure(error, typeof(GError));
GError err = Marshal.PtrToStructure<GError>(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);
}
Expand Down Expand Up @@ -181,7 +181,7 @@ public void Write(byte[] data)
{
try
{
GError err = (GError)Marshal.PtrToStructure(error, typeof(GError));
GError err = Marshal.PtrToStructure<GError>(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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<IntPtr>(ptr);

return (IntPtr)structure;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,8 @@
<PackageReference Include="System.Diagnostics.DiagnosticSource" />
</ItemGroup>

<PropertyGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkNet)' ">
<IsTrimmable>true</IsTrimmable>
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
</PropertyGroup>

<ItemGroup Condition=" '$(TargetFramework)' == '$(TargetFrameworkNetDesktop462)' or '$(TargetFramework)' == '$(TargetFrameworkNetDesktop472)'">
<Compile Include="$(PathToMsalSources)\Platforms\Features\OpenTelemetry\**\*.cs" />

<PackageReference Include="System.Diagnostics.DiagnosticSource" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}. ");
}
Expand All @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -65,22 +66,26 @@ private async Task<Bundle> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -403,19 +403,20 @@ public void Dispose()
}
}

// Replace the usage of Marshal.PtrToStructure(IntPtr, Type) with the generic version Marshal.PtrToStructure<T>(IntPtr)
// in the ForEachBuffer method inside SecBufferDesc struct.

private void ForEachBuffer(Action<SecBuffer> onBuffer)
{
for (int Index = 0; Index < cBuffers; Index++)
{
int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer));
int CurrentOffset = Index * Marshal.SizeOf<SecBuffer>();

SecBuffer thisSecBuffer = (SecBuffer)Marshal.PtrToStructure(
SecBuffer thisSecBuffer = (SecBuffer)Marshal.PtrToStructure<SecBuffer>(
IntPtr.Add(
pBuffers,
CurrentOffset
),
typeof(SecBuffer)
);
));

onBuffer(thisSecBuffer);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<NativeMethods.KERB_SUBMIT_TKT_REQUEST>(),
LogonId = luid
};

Expand Down