diff --git a/src/Lithnet.CredentialProvider/Controls/BitmapControl.cs b/src/Lithnet.CredentialProvider/Controls/BitmapControl.cs
index 2137a7b..15fa7ef 100644
--- a/src/Lithnet.CredentialProvider/Controls/BitmapControl.cs
+++ b/src/Lithnet.CredentialProvider/Controls/BitmapControl.cs
@@ -53,10 +53,9 @@ namespace Lithnet.CredentialProvider
{
this.bitmap = value;
- if (this.Events is ICredentialProviderCredentialEvents3 e)
+ if (this.Events is ICredentialProviderCredentialEvents2 e)
{
- var buffer = this.GetBitmapBuffer(out uint size);
- e.SetFieldBitmapBuffer(this.Credential, this.Id, size, buffer);
+ e.SetFieldBitmap(this.Credential, this.Id, this.GetHBitmap());
}
this.RaisePropertyChanged();
diff --git a/src/Lithnet.CredentialProvider/Controls/ControlCollection.cs b/src/Lithnet.CredentialProvider/Controls/ControlCollection.cs
index 18068d5..1830af1 100644
--- a/src/Lithnet.CredentialProvider/Controls/ControlCollection.cs
+++ b/src/Lithnet.CredentialProvider/Controls/ControlCollection.cs
@@ -20,7 +20,7 @@ namespace Lithnet.CredentialProvider
internal ControlCollection() { }
- internal ControlCollection(CredentialProviderCredential1Tile credential)
+ internal ControlCollection(CredentialTile credential)
{
this.credential = credential;
}
diff --git a/src/Lithnet.CredentialProvider/Controls/InsecurePasswordTextboxControl.cs b/src/Lithnet.CredentialProvider/Controls/InsecurePasswordTextboxControl.cs
index 3082f01..c44336a 100644
--- a/src/Lithnet.CredentialProvider/Controls/InsecurePasswordTextboxControl.cs
+++ b/src/Lithnet.CredentialProvider/Controls/InsecurePasswordTextboxControl.cs
@@ -24,6 +24,7 @@ namespace Lithnet.CredentialProvider
/// The unique key for this control
/// The label associated with the control
public InsecurePasswordTextboxControl(string key, string label) : base(key, label, FieldType.PasswordText) { }
+
private InsecurePasswordTextboxControl(InsecurePasswordTextboxControl source) : base(source) { }
///
@@ -40,7 +41,7 @@ namespace Lithnet.CredentialProvider
if (this.password?.Length > 0)
{
var ptr = Marshal.StringToCoTaskMemUni(this.password);
- this.logger.LogTrace($"0x:{ptr.ToString("X16")} - Created ptr for outgoing SetFieldString");
+ this.logger.LogWarningDebug($"0x:{ptr.ToString("X16")} - Created ptr for outgoing SetFieldString");
this.Events?.SetFieldString(this.Credential, this.Id, ptr);
}
else
diff --git a/src/Lithnet.CredentialProvider/Controls/SecurePasswordTextboxControl.cs b/src/Lithnet.CredentialProvider/Controls/SecurePasswordTextboxControl.cs
index 1a5ef8f..78efab8 100644
--- a/src/Lithnet.CredentialProvider/Controls/SecurePasswordTextboxControl.cs
+++ b/src/Lithnet.CredentialProvider/Controls/SecurePasswordTextboxControl.cs
@@ -1,5 +1,4 @@
using System;
-using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
using Lithnet.CredentialProvider.Interop;
@@ -40,7 +39,7 @@ namespace Lithnet.CredentialProvider
if (this.password?.Length > 0)
{
var ptr = Marshal.SecureStringToCoTaskMemUnicode(this.password);
- Trace.WriteLine($"0x:{ptr.ToString("X16")} - CONTROL: Created ptr for outgoing SetFieldString");
+ this.logger.LogWarningDebug($"0x:{ptr.ToString("X16")} - CONTROL: Created ptr for outgoing SetFieldString");
this.Events?.SetFieldString(this.Credential, this.Id, ptr);
}
else
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderBase.ICredentialProviderSetUserArray.cs b/src/Lithnet.CredentialProvider/CredentialProviderBase.ICredentialProviderSetUserArray.cs
index f5d21cf..49d94c4 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderBase.ICredentialProviderSetUserArray.cs
+++ b/src/Lithnet.CredentialProvider/CredentialProviderBase.ICredentialProviderSetUserArray.cs
@@ -10,11 +10,11 @@ namespace Lithnet.CredentialProvider
{
try
{
- this.logger.LogTrace($"SetUserArray");
+ this.logger.LogTrace("SetUserArray");
if (users.GetCount(out uint count) != HRESULT.S_OK)
{
- this.logger.LogTrace($"ICredentialProviderUserArray.GetCount failed");
+ this.logger.LogTrace("ICredentialProviderUserArray.GetCount failed");
return HRESULT.S_FALSE;
}
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderBase.cs b/src/Lithnet.CredentialProvider/CredentialProviderBase.cs
index ee5f84a..8a64be6 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderBase.cs
+++ b/src/Lithnet.CredentialProvider/CredentialProviderBase.cs
@@ -19,7 +19,7 @@ namespace Lithnet.CredentialProvider
private IntPtr credentialProviderEventsAdviseContext;
private bool notifyOnTileCollectionChange;
- private List tiles;
+ private List tiles;
internal ILoggerFactory LoggerFactory { get; }
@@ -46,7 +46,7 @@ namespace Lithnet.CredentialProvider
///
/// Gets a list of the tiles created for this credential provider
///
- public IReadOnlyList Tiles { get; private set; }
+ public IReadOnlyList Tiles { get; private set; }
///
/// Provides access to the serialized input data provided by CredUI
@@ -106,7 +106,7 @@ namespace Lithnet.CredentialProvider
/// Adds additional user tiles to the collection, and notifies LogonUI that new tiles are available
///
/// One or more credential tiles to add
- public void AddAdditionalUserTiles(params CredentialProviderCredential1Tile[] tiles)
+ public void AddAdditionalUserTiles(params CredentialTile[] tiles)
{
if (tiles == null)
{
@@ -129,7 +129,7 @@ namespace Lithnet.CredentialProvider
/// Removes one or more user tiles, and notifies LogonUI that tiles have been removed
///
/// The crendential tiles to remove
- public void RemoveUserTiles(params CredentialProviderCredential1Tile[] tiles)
+ public void RemoveUserTiles(params CredentialTile[] tiles)
{
if (tiles == null)
{
@@ -147,13 +147,13 @@ namespace Lithnet.CredentialProvider
///
/// This method is used to generate the generic tile for this credential provider. This is called when return true
///
- public abstract CredentialProviderCredential1Tile CreateGenericTile();
+ public abstract CredentialTile CreateGenericTile();
///
/// Creates a credential tile for the specified user
///
/// The user to create the tile for
- public abstract CredentialProviderCredential1Tile CreateUserTile(CredentialProviderUser user);
+ public abstract CredentialTile2 CreateUserTile(CredentialProviderUser user);
///
/// This method is called when the LogonUI or CredUI provides inbound credential data. Override this method to respond to the incoming data.
@@ -177,11 +177,11 @@ namespace Lithnet.CredentialProvider
}
}
- private List GenerateSuppliedUserTiles()
+ private List GenerateSuppliedUserTiles()
{
this.BuildControls();
- var tiles = new List();
+ var tiles = new List();
var users = new List();
@@ -203,26 +203,38 @@ namespace Lithnet.CredentialProvider
var credentialProviderUser = new CredentialProviderUser(this.LoggerFactory, user);
users.Add(credentialProviderUser);
- if (this.ShouldIncludeUserTile(credentialProviderUser))
+ try
{
- var userTile = this.CreateUserTile(credentialProviderUser);
- if (userTile != null)
+ if (this.ShouldIncludeUserTile(credentialProviderUser))
{
- tiles.Add(userTile);
- userTile.Initialize();
+ var userTile = this.CreateUserTile(credentialProviderUser);
+ if (userTile != null)
+ {
+ tiles.Add(userTile);
+ userTile.Initialize();
+ }
}
}
+ catch (NotImplementedException)
+ {
+ }
}
- if (this.ShouldIncludeGenericTile())
+ try
{
- var genericTile = this.CreateGenericTile();
- if (genericTile != null)
+ if (this.ShouldIncludeGenericTile())
{
- tiles.Add(genericTile);
- genericTile.Initialize();
+ var genericTile = this.CreateGenericTile();
+ if (genericTile != null)
+ {
+ tiles.Add(genericTile);
+ genericTile.Initialize();
+ }
}
}
+ catch (NotImplementedException)
+ {
+ }
this.SuppliedUsers = users.AsReadOnly();
@@ -231,7 +243,7 @@ namespace Lithnet.CredentialProvider
private void SetupTiles()
{
- this.tiles = new List(this.GenerateSuppliedUserTiles());
+ this.tiles = new List(this.GenerateSuppliedUserTiles());
this.Tiles = this.tiles.AsReadOnly();
}
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.ICredentialProviderCredential.cs b/src/Lithnet.CredentialProvider/CredentialTile.ICredentialProviderCredential.cs
similarity index 95%
rename from src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.ICredentialProviderCredential.cs
rename to src/Lithnet.CredentialProvider/CredentialTile.ICredentialProviderCredential.cs
index e91a4e2..84d078d 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.ICredentialProviderCredential.cs
+++ b/src/Lithnet.CredentialProvider/CredentialTile.ICredentialProviderCredential.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Logging;
namespace Lithnet.CredentialProvider
{
- public partial class CredentialProviderCredential1Tile : ICredentialProviderCredential
+ public partial class CredentialTile : ICredentialProviderCredential
{
int ICredentialProviderCredential.Advise(ICredentialProviderCredentialEvents pcpce)
{
@@ -54,7 +54,7 @@ namespace Lithnet.CredentialProvider
return HRESULT.E_FAIL;
}
}
-
+
int ICredentialProviderCredential.SetSelected(out int pbAutoLogon)
{
pbAutoLogon = 0;
@@ -73,7 +73,7 @@ namespace Lithnet.CredentialProvider
return HRESULT.E_FAIL;
}
}
-
+
int ICredentialProviderCredential.SetDeselected()
{
try
@@ -145,7 +145,7 @@ namespace Lithnet.CredentialProvider
else
{
ppsz = Marshal.SecureStringToCoTaskMemUnicode(p.Password);
- this.logger.LogCritical($"0x{ppsz.ToString("X16")} - Put password for outbound GetStringValue");
+ this.logger.LogWarningDebug($"0x{ppsz.ToString("X16")} - Put password for outbound GetStringValue");
}
return HRESULT.S_OK;
@@ -160,7 +160,7 @@ namespace Lithnet.CredentialProvider
else
{
ppsz = Marshal.StringToCoTaskMemUni(i.Password);
- this.logger.LogCritical($"0x{ppsz.ToString("X16")} - Put password for outbound GetStringValue");
+ this.logger.LogWarningDebug($"0x{ppsz.ToString("X16")} - Put password for outbound GetStringValue");
}
return HRESULT.S_OK;
@@ -316,7 +316,7 @@ namespace Lithnet.CredentialProvider
{
try
{
- this.logger.LogTrace($"0x{psz.ToString("X16")} - Incoming SetStringValue: field {dwFieldID}");
+ this.logger.LogWarningDebug($"0x{psz.ToString("X16")} - Incoming SetStringValue: field {dwFieldID}");
if (this.Controls.TryGetControl(dwFieldID, out var instance))
{
@@ -328,8 +328,7 @@ namespace Lithnet.CredentialProvider
if (instance.Type == FieldType.PasswordText && instance is SecurePasswordTextboxControl p)
{
- this.logger.LogCritical($"0x{psz.ToString("X16")} - Incoming password in SetStringValue");
-
+ this.logger.LogWarningDebug($"0x{psz.ToString("X16")} - Incoming password in SetStringValue");
p.SetPasswordInternal(psz.IntPtrToSecureString());
PInvoke.SecureZeroMemory(psz, (uint)(psz.Wcslen() * 2));
return HRESULT.S_OK;
@@ -337,8 +336,7 @@ namespace Lithnet.CredentialProvider
if (instance.Type == FieldType.PasswordText && instance is InsecurePasswordTextboxControl i)
{
- this.logger.LogCritical($"0x{psz.ToString("X16")} - Incoming password in SetStringValue");
-
+ this.logger.LogWarningDebug($"0x{psz.ToString("X16")} - Incoming password in SetStringValue");
i.SetPasswordInternal(Marshal.PtrToStringUni(psz));
PInvoke.SecureZeroMemory(psz, (uint)(psz.Wcslen() * 2));
return HRESULT.S_OK;
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.ICredentialProviderCredentialWithFieldOptions.cs b/src/Lithnet.CredentialProvider/CredentialTile.ICredentialProviderCredentialWithFieldOptions.cs
similarity index 90%
rename from src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.ICredentialProviderCredentialWithFieldOptions.cs
rename to src/Lithnet.CredentialProvider/CredentialTile.ICredentialProviderCredentialWithFieldOptions.cs
index c441d24..c0c4709 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.ICredentialProviderCredentialWithFieldOptions.cs
+++ b/src/Lithnet.CredentialProvider/CredentialTile.ICredentialProviderCredentialWithFieldOptions.cs
@@ -4,7 +4,7 @@ using Microsoft.Extensions.Logging;
namespace Lithnet.CredentialProvider
{
- public abstract partial class CredentialProviderCredential1Tile : ICredentialProviderCredentialWithFieldOptions
+ public abstract partial class CredentialTile : ICredentialProviderCredentialWithFieldOptions
{
int ICredentialProviderCredentialWithFieldOptions.GetFieldOptions(uint dwFieldID, out FieldOptions options)
{
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.cs b/src/Lithnet.CredentialProvider/CredentialTile.cs
similarity index 98%
rename from src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.cs
rename to src/Lithnet.CredentialProvider/CredentialTile.cs
index 0ebb64e..cdc0103 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderCredential1Tile.cs
+++ b/src/Lithnet.CredentialProvider/CredentialTile.cs
@@ -9,7 +9,7 @@ namespace Lithnet.CredentialProvider
/// Represents a 'v1' user credential tile that implements the minimum functionality required by the credential provider framework
///
/// Inheriting from this class enables you to provide a v1 credential tile. V1 credential tiles were introduced in Windows Vista. These tiles are not personalized. See the Microsoft documentation on ICredentialProviderCredential for more information
- public abstract partial class CredentialProviderCredential1Tile
+ public abstract partial class CredentialTile
{
private protected readonly ILogger logger;
private protected ICredentialProviderCredentialEvents events;
@@ -17,7 +17,7 @@ namespace Lithnet.CredentialProvider
private protected ControlCollection controls;
- protected CredentialProviderCredential1Tile(CredentialProviderBase credentialProvider)
+ protected CredentialTile(CredentialProviderBase credentialProvider)
{
this.CredentialProvider = credentialProvider;
this.logger = credentialProvider.LoggerFactory.CreateLogger(this.GetType());
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderCredential2Tile.cs b/src/Lithnet.CredentialProvider/CredentialTile2.ICredentialProviderCredential2.cs
similarity index 79%
rename from src/Lithnet.CredentialProvider/CredentialProviderCredential2Tile.cs
rename to src/Lithnet.CredentialProvider/CredentialTile2.ICredentialProviderCredential2.cs
index 5b49b2f..9aa5899 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderCredential2Tile.cs
+++ b/src/Lithnet.CredentialProvider/CredentialTile2.ICredentialProviderCredential2.cs
@@ -4,26 +4,8 @@ using Microsoft.Extensions.Logging;
namespace Lithnet.CredentialProvider
{
- ///
- /// Represents a 'v2' user credential tile that implements the functionality of , and includes support for personalized tile, where a single user tile is shown, with multiple logon options grouped within it.
- ///
- /// Inheriting from this class enables you to provide a v2 credential tile. V2 credential tiles were introduced in Windows 8. See the Microsoft documentation on ICredentialProviderCredential2 for more information
- ///
- public abstract class CredentialProviderCredential2Tile : CredentialProviderCredential1Tile, ICredentialProviderCredential2
+ public abstract partial class CredentialTile2 : ICredentialProviderCredential2
{
- public CredentialProviderUser User { get; }
-
- public override bool IsGenericTile => this.User == null;
-
- public GenericTileDisplayMode GenericTileDisplayMode { get; set; }
-
- protected CredentialProviderCredential2Tile(CredentialProviderBase credentialProvider) : this(credentialProvider, null) { }
-
- protected CredentialProviderCredential2Tile(CredentialProviderBase credentialProvider, CredentialProviderUser user) : base(credentialProvider)
- {
- this.User = user;
- }
-
int ICredentialProviderCredential2.GetUserSid(out string sid)
{
sid = null;
diff --git a/src/Lithnet.CredentialProvider/CredentialTile2.cs b/src/Lithnet.CredentialProvider/CredentialTile2.cs
new file mode 100644
index 0000000..e0a266d
--- /dev/null
+++ b/src/Lithnet.CredentialProvider/CredentialTile2.cs
@@ -0,0 +1,33 @@
+namespace Lithnet.CredentialProvider
+{
+ ///
+ /// Represents a 'v2' user credential tile that implements the functionality of , and includes support for personalized tile, where a single user tile is shown, with multiple logon options grouped within it.
+ ///
+ /// Inheriting from this class enables you to provide a v2 credential tile. V2 credential tiles were introduced in Windows 8. See the Microsoft documentation on ICredentialProviderCredential2 for more information
+ ///
+ public abstract partial class CredentialTile2 : CredentialTile
+ {
+ ///
+ /// Gets the user represented by this credential tile
+ ///
+ public CredentialProviderUser User { get; }
+
+ ///
+ /// Gets a value indicating if this is a personalized or generic tile
+ ///
+ public override bool IsGenericTile => this.User == null;
+
+ ///
+ /// Gets or sets a value that controls how the generic tile is displayed to the end user.
+ ///
+ /// This does not apply in scenarios where a personalized tile is provided
+ public GenericTileDisplayMode GenericTileDisplayMode { get; set; }
+
+ protected CredentialTile2(CredentialProviderBase credentialProvider) : this(credentialProvider, null) { }
+
+ protected CredentialTile2(CredentialProviderBase credentialProvider, CredentialProviderUser user) : base(credentialProvider)
+ {
+ this.User = user;
+ }
+ }
+}
diff --git a/src/Lithnet.CredentialProvider/CredentialProviderCredential3Tile.cs b/src/Lithnet.CredentialProvider/CredentialTile3.ICredentialProviderCredential3.cs
similarity index 82%
rename from src/Lithnet.CredentialProvider/CredentialProviderCredential3Tile.cs
rename to src/Lithnet.CredentialProvider/CredentialTile3.ICredentialProviderCredential3.cs
index f77dc02..30c293d 100644
--- a/src/Lithnet.CredentialProvider/CredentialProviderCredential3Tile.cs
+++ b/src/Lithnet.CredentialProvider/CredentialTile3.ICredentialProviderCredential3.cs
@@ -4,16 +4,8 @@ using Microsoft.Extensions.Logging;
namespace Lithnet.CredentialProvider
{
- ///
- /// Represents a user credential tile that implements the functionality of and , but includes support for dynamically updating bitmap images.
- ///
- /// This interface is public, but undocumented by Microsoft. It is recommended to use tiles unless this specific functionality is needed
- public abstract class CredentialProviderCredential3Tile : CredentialProviderCredential2Tile, ICredentialProviderCredential3
+ internal abstract partial class CredentialTile3 : ICredentialProviderCredential3
{
- protected CredentialProviderCredential3Tile(CredentialProviderBase credentialProvider) : this(credentialProvider, null) { }
-
- protected CredentialProviderCredential3Tile(CredentialProviderBase credentialProvider, CredentialProviderUser user) : base(credentialProvider, user) { }
-
int ICredentialProviderCredential3.GetBitmapBufferValue(uint dwFieldID, out uint pImageBufferSize, out IntPtr ppImageBuffer)
{
this.logger.LogTrace($"Called GetBitmapBufferValue {dwFieldID}");
@@ -41,20 +33,16 @@ namespace Lithnet.CredentialProvider
}
}
- ///
int ICredentialProviderCredential3.GetUserSid(out string sid)
{
return ((ICredentialProviderCredential2)this).GetUserSid(out sid);
}
- ///
int ICredentialProviderCredential3.SetSelected(out int pbAutoLogon)
{
return ((ICredentialProviderCredential)this).SetSelected(out pbAutoLogon);
}
- ///
-
int ICredentialProviderCredential3.SetDeselected()
{
return ((ICredentialProviderCredential)this).SetDeselected();
@@ -119,14 +107,17 @@ namespace Lithnet.CredentialProvider
{
return ((ICredentialProviderCredential)this).GetSerialization(out pcpgsr, out pcpcs, out ppszOptionalStatusText, out pcpsiOptionalStatusIcon);
}
+
int ICredentialProviderCredential3.UnAdvise()
{
return ((ICredentialProviderCredential)this).UnAdvise();
}
+
int ICredentialProviderCredential3.Advise(ICredentialProviderCredentialEvents pcpce)
{
return ((ICredentialProviderCredential)this).Advise(pcpce);
}
+
int ICredentialProviderCredential3.ReportResult(int ntsStatus, int ntsSubstatus, out string ppszOptionalStatusText, out StatusIcon pcpsiOptionalStatusIcon)
{
return ((ICredentialProviderCredential)this).ReportResult(ntsStatus, ntsSubstatus, out ppszOptionalStatusText, out pcpsiOptionalStatusIcon);
diff --git a/src/Lithnet.CredentialProvider/CredentialTile3.cs b/src/Lithnet.CredentialProvider/CredentialTile3.cs
new file mode 100644
index 0000000..8a4c246
--- /dev/null
+++ b/src/Lithnet.CredentialProvider/CredentialTile3.cs
@@ -0,0 +1,17 @@
+using System;
+using Lithnet.CredentialProvider.Interop;
+using Microsoft.Extensions.Logging;
+
+namespace Lithnet.CredentialProvider
+{
+ ///
+ /// Represents a user credential tile that implements the functionality of and , but includes support for dynamically updating bitmap images.
+ ///
+ /// This interface is public, but undocumented by Microsoft. It is recommended to use tiles unless this specific functionality is needed
+ internal abstract partial class CredentialTile3 : CredentialTile2
+ {
+ protected CredentialTile3(CredentialProviderBase credentialProvider) : this(credentialProvider, null) { }
+
+ protected CredentialTile3(CredentialProviderBase credentialProvider, CredentialProviderUser user) : base(credentialProvider, user) { }
+ }
+}
diff --git a/src/Lithnet.CredentialProvider/Interop/CredentialSerializer.cs b/src/Lithnet.CredentialProvider/Interop/CredentialSerializer.cs
index 613b8fa..7c2c2ac 100644
--- a/src/Lithnet.CredentialProvider/Interop/CredentialSerializer.cs
+++ b/src/Lithnet.CredentialProvider/Interop/CredentialSerializer.cs
@@ -19,8 +19,7 @@ namespace Lithnet.CredentialProvider.Interop
{
var authPackage = PInvoke.LookupAuthenticationPackage(CredProviderConstants.NEGOSSP_NAME_A);
var pData = this.SerializeKerbLogon(domain, username, password, isWorkstationUnlock ? KerbLogonSubmitType.WorkstationUnlockLogon : KerbLogonSubmitType.InteractiveLogon, out int size);
-
- this.logger.LogTrace($"0x{pData.ToString("X16")} - Serializer: Password got packed into ");
+ this.logger.LogWarningDebug($"0x{pData.ToString("X16")} - Serializer: Password got packed into ");
return new CredentialSerialization()
{
@@ -35,8 +34,7 @@ namespace Lithnet.CredentialProvider.Interop
{
var authPackage = PInvoke.LookupAuthenticationPackage(CredProviderConstants.NEGOSSP_NAME_A);
var pData = this.SerializeKerbLogon(domain, username, password, isWorkstationUnlock ? KerbLogonSubmitType.WorkstationUnlockLogon : KerbLogonSubmitType.InteractiveLogon, out int size);
-
- this.logger.LogTrace($"0x{pData.ToString("X16")}: Password got packed");
+ this.logger.LogWarningDebug($"0x{pData.ToString("X16")}: Password got packed");
return new CredentialSerialization()
{
@@ -131,25 +129,23 @@ namespace Lithnet.CredentialProvider.Interop
try
{
buff = Marshal.SecureStringToCoTaskMemUnicode(password);
- this.logger.LogTrace($"0x{buff.ToString("X16")} - Serializer: Unprotected password");
-
+ this.logger.LogWarningDebug($"0x{buff.ToString("X16")} - Serializer: Unprotected password");
IntPtr targetPositionToCopyTo = (IntPtr)(buffer + logon->Password.Buffer.ToInt64());
Buffer.MemoryCopy(buff.ToPointer(), targetPositionToCopyTo.ToPointer(), logon->Password.Length, password.Length * sizeof(char));
- this.logger.LogTrace($"0x{targetPositionToCopyTo.ToString("X16")} - Serializer: Copied unprotected password into LSA string buffer");
+ this.logger.LogWarningDebug($"0x{targetPositionToCopyTo.ToString("X16")} - Serializer: Copied unprotected password into LSA string buffer");
}
finally
{
if (buff != IntPtr.Zero)
{
Marshal.ZeroFreeCoTaskMemUnicode(buff);
- this.logger.LogTrace($"0x{buff.ToString("X16")} - Serializer: Freed Unprotected password");
+ this.logger.LogWarningDebug($"0x{buff.ToString("X16")} - Serializer: Freed Unprotected password");
}
}
- this.logger.LogTrace($"0x{((IntPtr)buffer).ToString("X16")} - Serializer: Put password");
-
+ this.logger.LogWarningDebug($"0x{((IntPtr)buffer).ToString("X16")} - Serializer: Put password");
return pBuffer;
}
}
diff --git a/src/Lithnet.CredentialProvider/Interop/InternalExtensions.cs b/src/Lithnet.CredentialProvider/Interop/InternalExtensions.cs
index b845f46..abba1e0 100644
--- a/src/Lithnet.CredentialProvider/Interop/InternalExtensions.cs
+++ b/src/Lithnet.CredentialProvider/Interop/InternalExtensions.cs
@@ -1,10 +1,18 @@
using System;
+using System.Diagnostics;
using System.Security;
+using Microsoft.Extensions.Logging;
namespace Lithnet.CredentialProvider.Interop
{
internal static class InternalExtensions
{
+ [Conditional("DEBUG")]
+ internal static void LogWarningDebug(this ILogger logger, string message)
+ {
+ logger.LogWarning(message);
+ }
+
internal static unsafe int Wcslen(this IntPtr addr)
{
const int maxLength = int.MaxValue;
diff --git a/src/Lithnet.CredentialProvider/ModuleInit/AssemblyResolver.cs b/src/Lithnet.CredentialProvider/ModuleInit/AssemblyResolver.cs
index b9c9f1c..878ac88 100644
--- a/src/Lithnet.CredentialProvider/ModuleInit/AssemblyResolver.cs
+++ b/src/Lithnet.CredentialProvider/ModuleInit/AssemblyResolver.cs
@@ -3,7 +3,6 @@ using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
-using System.Threading;
namespace Lithnet.CredentialProvider.ModuleInit
{
@@ -11,7 +10,9 @@ namespace Lithnet.CredentialProvider.ModuleInit
{
private static string basePath;
+#pragma warning disable CA2255
[ModuleInitializer]
+#pragma warning restore CA2255
public static void AttachResolver()
{
Trace.WriteLine($"Loaded assembly {Assembly.GetExecutingAssembly().Location}");
@@ -39,7 +40,7 @@ namespace Lithnet.CredentialProvider.ModuleInit
var name = new AssemblyName(args.Name);
Trace.WriteLine($"Request for {args.Name}");
- string assyPath = Path.Combine(basePath, $"{name.Name}.dll");
+ string assyPath = Path.Combine(basePath, $"{name.Name}.dll");
if (File.Exists(assyPath))