Remove redundant credential tile image
This commit is contained in:
@@ -67,7 +67,12 @@ Every synchronized user also receives `Universidad La Salle` in the AD
|
|||||||
The generic SGU credential is rendered as a dedicated branded tile instead of
|
The generic SGU credential is rendered as a dedicated branded tile instead of
|
||||||
being grouped below the anonymous **Other user** tile. Machine policy assigns
|
being grouped below the anonymous **Other user** tile. Machine policy assigns
|
||||||
the SGU CLSID as the default provider while retaining the built-in Microsoft
|
the SGU CLSID as the default provider while retaining the built-in Microsoft
|
||||||
password provider.
|
password provider. It enumerates one `CPFT_TILE_IMAGE` and places the
|
||||||
|
`CPFT_LARGE_TEXT` heading immediately after it with `CPFS_DISPLAY_IN_BOTH`,
|
||||||
|
matching Microsoft's supported field ordering. LogonUI owns field typography:
|
||||||
|
on Windows 10 and 11, the account-name title used by **Other user** is shell UI,
|
||||||
|
not a style that a generic Credential Provider can request. Do not add a second
|
||||||
|
tile image or a synthetic Windows account to imitate that title.
|
||||||
|
|
||||||
The managed hierarchy is rooted at `OU=Usuarios-SGU`: `Docentes`, `Alumnos`,
|
The managed hierarchy is rooted at `OU=Usuarios-SGU`: `Docentes`, `Alumnos`,
|
||||||
and `Administrativos` are direct child OUs beneath it.
|
and `Administrativos` are direct child OUs beneath it.
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ internal static class ControlKeys
|
|||||||
{
|
{
|
||||||
public const string ProviderLabel = "ProviderLabel";
|
public const string ProviderLabel = "ProviderLabel";
|
||||||
public const string ProviderLogo = "ProviderLogo";
|
public const string ProviderLogo = "ProviderLogo";
|
||||||
public const string UserTile = "UserTile";
|
|
||||||
public const string Heading = "Heading";
|
public const string Heading = "Heading";
|
||||||
public const string InformationLabel = "InformationLabel";
|
public const string InformationLabel = "InformationLabel";
|
||||||
public const string UserName = "UserName";
|
public const string UserName = "UserName";
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ namespace SGU.CredentialProvider;
|
|||||||
internal static class ProviderTileIcon
|
internal static class ProviderTileIcon
|
||||||
{
|
{
|
||||||
public const int Size = 72;
|
public const int Size = 72;
|
||||||
public const int UserTileSize = 128;
|
|
||||||
|
|
||||||
public static Bitmap Create()
|
public static Bitmap Create()
|
||||||
{
|
{
|
||||||
@@ -31,29 +30,4 @@ internal static class ProviderTileIcon
|
|||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap CreateUserTile()
|
|
||||||
{
|
|
||||||
Bitmap bitmap = new(UserTileSize, UserTileSize, PixelFormat.Format32bppArgb);
|
|
||||||
using Graphics graphics = Graphics.FromImage(bitmap);
|
|
||||||
graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
|
||||||
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
|
||||||
graphics.Clear(Color.FromArgb(0, 83, 155));
|
|
||||||
|
|
||||||
using Pen border = new(Color.FromArgb(190, 221, 241), 5f);
|
|
||||||
using Pen key = new(Color.White, 9f)
|
|
||||||
{
|
|
||||||
StartCap = LineCap.Round,
|
|
||||||
EndCap = LineCap.Round,
|
|
||||||
LineJoin = LineJoin.Round
|
|
||||||
};
|
|
||||||
|
|
||||||
graphics.DrawEllipse(border, 7, 7, 113, 113);
|
|
||||||
graphics.DrawEllipse(key, 25, 25, 43, 43);
|
|
||||||
graphics.DrawLine(key, 62, 62, 99, 99);
|
|
||||||
graphics.DrawLine(key, 82, 82, 95, 69);
|
|
||||||
graphics.DrawLine(key, 93, 93, 106, 80);
|
|
||||||
|
|
||||||
return bitmap;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,11 +21,10 @@ public sealed class SguCredentialProvider : CredentialProviderBase
|
|||||||
ControlKeys.ProviderLogo,
|
ControlKeys.ProviderLogo,
|
||||||
"Acceso institucional SGU",
|
"Acceso institucional SGU",
|
||||||
ProviderTileIcon.Create());
|
ProviderTileIcon.Create());
|
||||||
yield return new UserTileControl(
|
yield return new LargeLabelControl(ControlKeys.Heading, "Acceso institucional SGU")
|
||||||
ControlKeys.UserTile,
|
{
|
||||||
"Universidad La Salle",
|
State = FieldState.DisplayInBoth
|
||||||
ProviderTileIcon.CreateUserTile());
|
};
|
||||||
yield return new LargeLabelControl(ControlKeys.Heading, "Acceso institucional SGU");
|
|
||||||
yield return new SmallLabelControl(
|
yield return new SmallLabelControl(
|
||||||
ControlKeys.InformationLabel,
|
ControlKeys.InformationLabel,
|
||||||
"Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.");
|
"Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.");
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ internal static class Program
|
|||||||
[
|
[
|
||||||
"Universidad La Salle · Acceso SGU",
|
"Universidad La Salle · Acceso SGU",
|
||||||
"Acceso institucional SGU",
|
"Acceso institucional SGU",
|
||||||
"Universidad La Salle",
|
|
||||||
"Acceso institucional SGU",
|
"Acceso institucional SGU",
|
||||||
"Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.",
|
"Usa tu clave institucional (DO, AL o AD + 6 dígitos) y contraseña.",
|
||||||
"Clave institucional",
|
"Clave institucional",
|
||||||
@@ -92,7 +91,7 @@ internal static class Program
|
|||||||
credentialCount == 1 &&
|
credentialCount == 1 &&
|
||||||
credential != IntPtr.Zero &&
|
credential != IntPtr.Zero &&
|
||||||
providerLogoPresent &&
|
providerLogoPresent &&
|
||||||
userTilePresent &&
|
!userTilePresent &&
|
||||||
labels.SequenceEqual(ExpectedLabels, StringComparer.Ordinal);
|
labels.SequenceEqual(ExpectedLabels, StringComparer.Ordinal);
|
||||||
|
|
||||||
if (mode != "enumeration" && passed)
|
if (mode != "enumeration" && passed)
|
||||||
|
|||||||
@@ -33,18 +33,18 @@ public sealed class ProviderTileIconTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ProviderPublishesABrandedDedicatedUserTileAndHeading()
|
public void ProviderPublishesASingleBrandedImageAndLargeHeading()
|
||||||
{
|
{
|
||||||
SguCredentialProvider provider = new();
|
SguCredentialProvider provider = new();
|
||||||
ControlBase[] controls = provider.GetControls(UsageScenario.Logon).ToArray();
|
ControlBase[] controls = provider.GetControls(UsageScenario.Logon).ToArray();
|
||||||
|
|
||||||
UserTileControl userTile = Assert.Single(controls.OfType<UserTileControl>());
|
Assert.Empty(controls.OfType<UserTileControl>());
|
||||||
|
Assert.Single(controls.OfType<CredentialProviderLogoControl>());
|
||||||
LargeLabelControl heading = Assert.Single(controls.OfType<LargeLabelControl>());
|
LargeLabelControl heading = Assert.Single(controls.OfType<LargeLabelControl>());
|
||||||
SguCredentialTile tile = Assert.IsType<SguCredentialTile>(provider.CreateGenericTile());
|
SguCredentialTile tile = Assert.IsType<SguCredentialTile>(provider.CreateGenericTile());
|
||||||
|
|
||||||
Assert.Equal(ProviderTileIcon.UserTileSize, userTile.Bitmap.Width);
|
|
||||||
Assert.Equal(ProviderTileIcon.UserTileSize, userTile.Bitmap.Height);
|
|
||||||
Assert.Equal("Acceso institucional SGU", heading.Label);
|
Assert.Equal("Acceso institucional SGU", heading.Label);
|
||||||
|
Assert.Equal(FieldState.DisplayInBoth, heading.State);
|
||||||
Assert.Equal(GenericTileDisplayMode.DisplayAsDedicatedTile, tile.GenericTileDisplayMode);
|
Assert.Equal(GenericTileDisplayMode.DisplayAsDedicatedTile, tile.GenericTileDisplayMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user