From bc984aaaa0da89fcad1dbb39f9bfbfd090ef27a3 Mon Sep 17 00:00:00 2001 From: Ryan Newington Date: Fri, 3 Feb 2023 07:26:07 +1100 Subject: [PATCH] Renames tile control classes Adds conditional logging for memory debugging Hides CrredentialTile3 implementation --- .../Controls/BitmapControl.cs | 5 +- .../Controls/ControlCollection.cs | 2 +- .../InsecurePasswordTextboxControl.cs | 3 +- .../Controls/SecurePasswordTextboxControl.cs | 3 +- ...derBase.ICredentialProviderSetUserArray.cs | 4 +- .../CredentialProviderBase.cs | 50 ++++++++++++------- ...tialTile.ICredentialProviderCredential.cs} | 18 +++---- ...tialProviderCredentialWithFieldOptions.cs} | 2 +- ...erCredential1Tile.cs => CredentialTile.cs} | 4 +- ...alTile2.ICredentialProviderCredential2.cs} | 20 +------- .../CredentialTile2.cs | 33 ++++++++++++ ...alTile3.ICredentialProviderCredential3.cs} | 17 ++----- .../CredentialTile3.cs | 17 +++++++ .../Interop/CredentialSerializer.cs | 16 +++--- .../Interop/InternalExtensions.cs | 8 +++ .../ModuleInit/AssemblyResolver.cs | 5 +- 16 files changed, 122 insertions(+), 85 deletions(-) rename src/Lithnet.CredentialProvider/{CredentialProviderCredential1Tile.ICredentialProviderCredential.cs => CredentialTile.ICredentialProviderCredential.cs} (95%) rename src/Lithnet.CredentialProvider/{CredentialProviderCredential1Tile.ICredentialProviderCredentialWithFieldOptions.cs => CredentialTile.ICredentialProviderCredentialWithFieldOptions.cs} (90%) rename src/Lithnet.CredentialProvider/{CredentialProviderCredential1Tile.cs => CredentialTile.cs} (98%) rename src/Lithnet.CredentialProvider/{CredentialProviderCredential2Tile.cs => CredentialTile2.ICredentialProviderCredential2.cs} (79%) create mode 100644 src/Lithnet.CredentialProvider/CredentialTile2.cs rename src/Lithnet.CredentialProvider/{CredentialProviderCredential3Tile.cs => CredentialTile3.ICredentialProviderCredential3.cs} (82%) create mode 100644 src/Lithnet.CredentialProvider/CredentialTile3.cs 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))