Refactor default and auto-logon tile handling
Refactored `CredentialProviderBase` and `CredentialTile` to improve the handling of default and auto-logon tiles. Key changes include: - Introduced `SetDefaultTile` method with validation and tile refresh. - Refactored `IsAutoLogon` and `IsDefault` properties to be read only properties. - Added `ShouldAutoLogon` method to be called when a tile is selected.
This commit is contained in:
@@ -169,23 +169,20 @@ namespace Lithnet.CredentialProvider
|
||||
|
||||
this.notifyOnTileCollectionChange = true;
|
||||
|
||||
var autoLogonTile = this.Tiles.FirstOrDefault(t => t.IsAutoLogon);
|
||||
var defaultTile = this.Tiles.FirstOrDefault(t => t.IsDefault);
|
||||
var defaultTile = this.DefaultTile;
|
||||
|
||||
uint defaultIndex = CREDENTIAL_PROVIDER_NO_DEFAULT;
|
||||
if (autoLogonTile != null)
|
||||
if (defaultTile != null)
|
||||
{
|
||||
defaultIndex = (uint)this.tiles.IndexOf(autoLogonTile);
|
||||
}
|
||||
else if (defaultTile != null)
|
||||
{
|
||||
defaultIndex = (uint)this.tiles.IndexOf(defaultTile);
|
||||
var index = this.tiles.IndexOf(defaultTile);
|
||||
|
||||
if (index >= 0)
|
||||
{
|
||||
pdwDefault = (uint)index;
|
||||
pbAutoLogonWithDefault = this.DefaultTileAutoLogon ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
pdwCount = (uint)this.Tiles.Count;
|
||||
pdwDefault = defaultIndex;
|
||||
pbAutoLogonWithDefault = autoLogonTile == null ? 0 : 1;
|
||||
|
||||
this.logger.LogTrace($"GetCredentialCount returning pdwCount: {pdwCount}, pdwDefault: {pdwDefault}, pbAutoLogonWithDefault: {pbAutoLogonWithDefault}");
|
||||
|
||||
return HRESULT.S_OK;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using Lithnet.CredentialProvider.Interop;
|
||||
@@ -114,7 +115,28 @@ namespace Lithnet.CredentialProvider
|
||||
/// Gets a value that indicates if the credential provider should show a generic tile. That is, a tile that is not associated with a specific user.
|
||||
/// </summary>
|
||||
public abstract bool ShouldIncludeGenericTile();
|
||||
|
||||
|
||||
protected internal CredentialTile DefaultTile { get; set; }
|
||||
|
||||
protected internal bool DefaultTileAutoLogon { get; set; }
|
||||
|
||||
public void SetDefaultTile(CredentialTile tile, bool autoLogon)
|
||||
{
|
||||
if (this.DefaultTile == tile && this.DefaultTileAutoLogon == autoLogon)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.Tiles.Contains(tile))
|
||||
{
|
||||
throw new InvalidOperationException("The default tile must be one of the tiles provided by the credential provider");
|
||||
}
|
||||
|
||||
this.DefaultTile = tile;
|
||||
this.DefaultTileAutoLogon = autoLogon;
|
||||
this.ReloadUserTiles();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Notifies LogonUI that one of more of the tile items has been modified, and should be reloaded
|
||||
/// </summary>
|
||||
|
||||
@@ -66,8 +66,8 @@ namespace Lithnet.CredentialProvider
|
||||
{
|
||||
this.logger.LogTrace("SetSelected");
|
||||
this.IsSelected = true;
|
||||
this.OnSelected(out bool autoLogon);
|
||||
pbAutoLogon = autoLogon ? 1 : 0;
|
||||
this.OnSelected();
|
||||
pbAutoLogon = this.ShouldAutoLogon() ? 1 : 0;
|
||||
return HRESULT.S_OK;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -40,19 +40,16 @@ namespace Lithnet.CredentialProvider
|
||||
/// </summary>
|
||||
public bool IsAutoLogon
|
||||
{
|
||||
get => this.isAutoLogon;
|
||||
set
|
||||
{
|
||||
this.isAutoLogon = value;
|
||||
this.CredentialProvider.ReloadUserTiles();
|
||||
|
||||
}
|
||||
get => this.CredentialProvider.DefaultTile == this && this.CredentialProvider.DefaultTileAutoLogon;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating if this should be the default time
|
||||
/// Gets a value indicating if this should be the default tile
|
||||
/// </summary>
|
||||
public bool IsDefault { get; set; }
|
||||
public bool IsDefault
|
||||
{
|
||||
get => this.CredentialProvider.DefaultTile == this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current usage scenario
|
||||
@@ -164,14 +161,16 @@ namespace Lithnet.CredentialProvider
|
||||
/// <summary>
|
||||
/// Called when the user selects this tile
|
||||
/// </summary>
|
||||
/// <param name="autoLogon">A value that indicates if logon should be performed immediately, without waiting for further user input</param>
|
||||
protected virtual void OnSelected() { }
|
||||
|
||||
/// <summary>
|
||||
/// Called after a tiles is selected to determine if the user should be automatically logged on
|
||||
/// </summary>
|
||||
/// <returns>True, if a logon should be immediately attempted</returns>
|
||||
/// <remarks>
|
||||
/// In Windows 10, if a credential provider wants to automatically log the user on in a situation Windows does not think is appropriate, the system will display a sign in button as a speed bump. One example of this is when a user with an empty password locks the computer or signs out. In that scenario, Windows does not directly log the user back in.
|
||||
/// </remarks>
|
||||
protected virtual void OnSelected(out bool autoLogon)
|
||||
{
|
||||
autoLogon = false;
|
||||
}
|
||||
protected virtual bool ShouldAutoLogon() => false;
|
||||
|
||||
/// <summary>
|
||||
/// Called when a user deselects this tile
|
||||
|
||||
Reference in New Issue
Block a user