From f5303fc53696e6f3c5d7237c3a802bf7f40ffcb4 Mon Sep 17 00:00:00 2001 From: MrSphay Date: Sat, 16 May 2026 13:43:52 +0200 Subject: [PATCH] Modernize MrTrust GUI --- .gitea/workflows/build.yml | 2 +- scripts/Start-MrTrustGui.ps1 | 382 ++++++++++++++++++++++++----------- 2 files changed, 262 insertions(+), 122 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 9382c32..0f3433c 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -59,7 +59,7 @@ jobs: path: dist/MrTrust-${{ env.MRTRUST_VERSION }}.zip - name: Attach ZIP to Gitea release - if: github.event_name == 'push' && github.ref == 'refs/heads/main' + if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'workflow_dispatch' shell: bash env: GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/scripts/Start-MrTrustGui.ps1 b/scripts/Start-MrTrustGui.ps1 index 6ce3c31..49d24d3 100644 --- a/scripts/Start-MrTrustGui.ps1 +++ b/scripts/Start-MrTrustGui.ps1 @@ -14,16 +14,20 @@ $script:SelectedFilePath = $null $script:CurrentAccent = 0 $colors = @{ - Background = [Drawing.Color]::FromArgb(18, 23, 26) - Panel = [Drawing.Color]::FromArgb(27, 33, 36) - PanelAlt = [Drawing.Color]::FromArgb(35, 43, 47) - Border = [Drawing.Color]::FromArgb(61, 73, 79) - Text = [Drawing.Color]::FromArgb(234, 239, 236) - Muted = [Drawing.Color]::FromArgb(165, 180, 172) - Green = [Drawing.Color]::FromArgb(28, 185, 111) - GreenHover = [Drawing.Color]::FromArgb(38, 205, 130) + Background = [Drawing.Color]::FromArgb(15, 20, 20) + Shell = [Drawing.Color]::FromArgb(20, 27, 27) + Panel = [Drawing.Color]::FromArgb(27, 36, 35) + PanelAlt = [Drawing.Color]::FromArgb(34, 45, 43) + PanelSelected = [Drawing.Color]::FromArgb(31, 64, 49) + Border = [Drawing.Color]::FromArgb(53, 66, 64) + Text = [Drawing.Color]::FromArgb(239, 244, 241) + Muted = [Drawing.Color]::FromArgb(157, 172, 166) + Green = [Drawing.Color]::FromArgb(0, 175, 91) + GreenHover = [Drawing.Color]::FromArgb(0, 199, 104) + GreenSoft = [Drawing.Color]::FromArgb(34, 76, 52) Orange = [Drawing.Color]::FromArgb(242, 153, 74) Red = [Drawing.Color]::FromArgb(235, 87, 87) + Blue = [Drawing.Color]::FromArgb(82, 166, 255) } function Test-IsAdministrator { @@ -127,6 +131,89 @@ function New-Label { $label } +function New-Card { + param( + [int]$X, + [int]$Y, + [int]$Width, + [int]$Height, + [Drawing.Color]$BackColor = $colors.Panel + ) + + $panel = [Windows.Forms.Panel]::new() + $panel.Location = [Drawing.Point]::new($X, $Y) + $panel.Size = [Drawing.Size]::new($Width, $Height) + $panel.BackColor = $BackColor + $panel.BorderStyle = "FixedSingle" + $panel.Anchor = "Top,Left,Right" + $panel +} + +function New-PageTitle { + param( + [string]$Title, + [string]$Description + ) + + $titleLabel = New-Label -Text $Title -X 0 -Y 0 -Width 760 -Height 34 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 15, [Drawing.FontStyle]::Bold)) + $descriptionLabel = New-Label -Text $Description -X 1 -Y 38 -Width 850 -Height 24 -Color $colors.Muted + [pscustomobject]@{ + Title = $titleLabel + Description = $descriptionLabel + } +} + +function New-NavButton { + param( + [Parameter(Mandatory)][string]$Key, + [Parameter(Mandatory)][string]$Text, + [Parameter(Mandatory)][int]$Y + ) + + $button = [Windows.Forms.Button]::new() + $button.Text = $Text + $button.Tag = $Key + $button.Size = [Drawing.Size]::new(174, 44) + $button.Location = [Drawing.Point]::new(22, $Y) + $button.TextAlign = "MiddleLeft" + $button.Padding = [Windows.Forms.Padding]::new(14, 0, 0, 0) + $button.Font = [Drawing.Font]::new("Segoe UI", 10, [Drawing.FontStyle]::Bold) + $button.FlatStyle = "Flat" + $button.FlatAppearance.BorderSize = 1 + $button.FlatAppearance.BorderColor = $colors.Shell + $button.BackColor = $colors.Shell + $button.ForeColor = $colors.Muted + $button.Cursor = [Windows.Forms.Cursors]::Hand + $button.Add_MouseEnter({ param($sender, $eventArgs) if ($script:ActivePage -ne $sender.Tag) { $sender.BackColor = $colors.PanelAlt } }.GetNewClosure()) + $button.Add_MouseLeave({ param($sender, $eventArgs) if ($script:ActivePage -ne $sender.Tag) { $sender.BackColor = $colors.Shell } }.GetNewClosure()) + $button.Add_Click({ param($sender, $eventArgs) Show-MrTrustPage -Key $sender.Tag }) + $button +} + +function Show-MrTrustPage { + param([Parameter(Mandatory)][string]$Key) + + $script:ActivePage = $Key + + foreach ($pageKey in $script:Pages.Keys) { + $script:Pages[$pageKey].Visible = $pageKey -eq $Key + } + + foreach ($buttonKey in $script:NavButtons.Keys) { + $button = $script:NavButtons[$buttonKey] + if ($buttonKey -eq $Key) { + $button.BackColor = $colors.PanelSelected + $button.FlatAppearance.BorderColor = $colors.Green + $button.ForeColor = $colors.Text + } + else { + $button.BackColor = $colors.Shell + $button.FlatAppearance.BorderColor = $colors.Shell + $button.ForeColor = $colors.Muted + } + } +} + function Update-TrustStatus { try { Set-Busy $true @@ -291,8 +378,8 @@ function Test-SelectedFile { $form = [Windows.Forms.Form]::new() $form.Text = "MrTrust" $form.StartPosition = "CenterScreen" -$form.ClientSize = [Drawing.Size]::new(980, 660) -$form.MinimumSize = [Drawing.Size]::new(920, 620) +$form.ClientSize = [Drawing.Size]::new(1120, 720) +$form.MinimumSize = [Drawing.Size]::new(1040, 680) $form.BackColor = $colors.Background $form.Font = [Drawing.Font]::new("Segoe UI", 10) if (Test-Path -LiteralPath $script:IconPath) { @@ -301,187 +388,235 @@ if (Test-Path -LiteralPath $script:IconPath) { $header = [Windows.Forms.Panel]::new() $header.Dock = "Top" -$header.Height = 126 -$header.BackColor = $colors.Panel +$header.Height = 96 +$header.BackColor = $colors.Background $form.Controls.Add($header) -$accent = [Windows.Forms.Panel]::new() -$accent.Dock = "Left" -$accent.Width = 8 -$accent.BackColor = $colors.Green -$header.Controls.Add($accent) +$brandLine = [Windows.Forms.Panel]::new() +$brandLine.Dock = "Bottom" +$brandLine.Height = 1 +$brandLine.BackColor = $colors.Border +$header.Controls.Add($brandLine) $logoBox = [Windows.Forms.PictureBox]::new() -$logoBox.Size = [Drawing.Size]::new(46, 46) -$logoBox.Location = [Drawing.Point]::new(34, 30) +$logoBox.Size = [Drawing.Size]::new(42, 42) +$logoBox.Location = [Drawing.Point]::new(28, 26) $logoBox.SizeMode = "StretchImage" if (Test-Path -LiteralPath $script:IconPath) { $logoBox.Image = [Drawing.Icon]::new($script:IconPath).ToBitmap() } $header.Controls.Add($logoBox) -$title = New-Label -Text "MrTrust" -X 96 -Y 22 -Width 260 -Height 48 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 25, [Drawing.FontStyle]::Bold)) +$title = New-Label -Text "MrTrust" -X 86 -Y 20 -Width 260 -Height 36 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 18, [Drawing.FontStyle]::Bold)) $header.Controls.Add($title) -$subtitle = New-Label -Text "Trust diagnostics for MrSphay signed Windows apps" -X 100 -Y 76 -Width 520 -Height 24 -Color $colors.Muted +$subtitle = New-Label -Text "Local certificate trust for MrSphay signed Windows apps" -X 88 -Y 56 -Width 520 -Height 24 -Color $colors.Muted $header.Controls.Add($subtitle) -$statusText = New-Label -Text "Status" -X 720 -Y 31 -Width 180 -Height 22 -$header.Controls.Add($statusText) +$statusCard = [Windows.Forms.Panel]::new() +$statusCard.Anchor = "Top,Right" +$statusCard.Location = [Drawing.Point]::new(780, 20) +$statusCard.Size = [Drawing.Size]::new(300, 56) +$statusCard.BackColor = $colors.Panel +$statusCard.BorderStyle = "FixedSingle" +$header.Controls.Add($statusCard) + +$statusText = New-Label -Text "Trust status" -X 18 -Y 7 -Width 130 -Height 20 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5)) +$statusCard.Controls.Add($statusText) $script:StatusPill = [Windows.Forms.Panel]::new() -$script:StatusPill.Size = [Drawing.Size]::new(16, 16) -$script:StatusPill.Location = [Drawing.Point]::new(720, 63) +$script:StatusPill.Size = [Drawing.Size]::new(14, 14) +$script:StatusPill.Location = [Drawing.Point]::new(18, 31) $script:StatusPill.BackColor = $colors.Orange -$header.Controls.Add($script:StatusPill) +$statusCard.Controls.Add($script:StatusPill) -$script:StatusLabel = New-Label -Text "Checking..." -X 748 -Y 58 -Width 190 -Height 28 -Color $colors.Text +$script:StatusLabel = New-Label -Text "Checking..." -X 40 -Y 26 -Width 210 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 10, [Drawing.FontStyle]::Bold)) $script:StatusLabel.AutoEllipsis = $true -$header.Controls.Add($script:StatusLabel) +$statusCard.Controls.Add($script:StatusLabel) $script:ProgressBar = [Windows.Forms.ProgressBar]::new() -$script:ProgressBar.Location = [Drawing.Point]::new(100, 108) -$script:ProgressBar.Size = [Drawing.Size]::new(820, 5) +$script:ProgressBar.Anchor = "Top,Left,Right" +$script:ProgressBar.Location = [Drawing.Point]::new(28, 86) +$script:ProgressBar.Size = [Drawing.Size]::new(1052, 4) $script:ProgressBar.Visible = $false $header.Controls.Add($script:ProgressBar) -$tabControl = [Windows.Forms.TabControl]::new() -$tabControl.Dock = "Fill" -$tabControl.Appearance = "Normal" -$tabControl.BackColor = $colors.Background -$tabControl.ForeColor = $colors.Text -$form.Controls.Add($tabControl) +$shell = [Windows.Forms.Panel]::new() +$shell.Dock = "Fill" +$shell.BackColor = $colors.Background +$form.Controls.Add($shell) -$trustTab = [Windows.Forms.TabPage]::new() -$trustTab.Text = "Trust" -$trustTab.BackColor = $colors.Background -$tabControl.TabPages.Add($trustTab) +$sidebar = [Windows.Forms.Panel]::new() +$sidebar.Dock = "Left" +$sidebar.Width = 220 +$sidebar.BackColor = $colors.Shell +$shell.Controls.Add($sidebar) -$diagnosticsTab = [Windows.Forms.TabPage]::new() -$diagnosticsTab.Text = "Diagnostics" -$diagnosticsTab.BackColor = $colors.Background -$tabControl.TabPages.Add($diagnosticsTab) +$sideAccent = [Windows.Forms.Panel]::new() +$sideAccent.Dock = "Left" +$sideAccent.Width = 4 +$sideAccent.BackColor = $colors.Green +$sidebar.Controls.Add($sideAccent) -$helpTab = [Windows.Forms.TabPage]::new() -$helpTab.Text = "SmartScreen" -$helpTab.BackColor = $colors.Background -$tabControl.TabPages.Add($helpTab) +$navTitle = New-Label -Text "Navigation" -X 24 -Y 26 -Width 160 -Height 22 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5, [Drawing.FontStyle]::Bold)) +$sidebar.Controls.Add($navTitle) -$trustPanel = [Windows.Forms.Panel]::new() -$trustPanel.BackColor = $colors.Panel -$trustPanel.Size = [Drawing.Size]::new(880, 245) -$trustPanel.Location = [Drawing.Point]::new(36, 34) -$trustTab.Controls.Add($trustPanel) +$script:NavButtons = @{} +$script:NavButtons.Trust = New-NavButton -Key "Trust" -Text "Trust" -Y 58 +$script:NavButtons.Diagnostics = New-NavButton -Key "Diagnostics" -Text "File scan" -Y 110 +$script:NavButtons.SmartScreen = New-NavButton -Key "SmartScreen" -Text "SmartScreen" -Y 162 +foreach ($navButton in $script:NavButtons.Values) { + $sidebar.Controls.Add($navButton) +} -$scopeLabel = New-Label -Text "Scope" -X 26 -Y 24 +$sideNote = New-Label -Text "Installs public certificates only. No Defender, SmartScreen, UAC, firewall, or policy bypasses." -X 24 -Y 510 -Width 164 -Height 96 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5)) +$sideNote.Anchor = "Left,Bottom" +$sidebar.Controls.Add($sideNote) + +$contentHost = [Windows.Forms.Panel]::new() +$contentHost.Dock = "Fill" +$contentHost.BackColor = $colors.Background +$contentHost.Padding = [Windows.Forms.Padding]::new(34, 30, 34, 30) +$shell.Controls.Add($contentHost) + +$script:Pages = @{} + +$trustPage = [Windows.Forms.Panel]::new() +$trustPage.Dock = "Fill" +$trustPage.BackColor = $colors.Background +$contentHost.Controls.Add($trustPage) +$script:Pages.Trust = $trustPage + +$trustTitle = New-PageTitle -Title "Trust" -Description "Install, remove, and verify the MrSphay public trust certificates." +$trustPage.Controls.Add($trustTitle.Title) +$trustPage.Controls.Add($trustTitle.Description) + +$trustPanel = New-Card -X 0 -Y 82 -Width 820 -Height 236 +$trustPage.Controls.Add($trustPanel) + +$scopeLabel = New-Label -Text "Scope" -X 24 -Y 22 -Width 160 -Height 22 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 8.5, [Drawing.FontStyle]::Bold)) $trustPanel.Controls.Add($scopeLabel) $script:AllUsersCheckBox = [Windows.Forms.CheckBox]::new() -$script:AllUsersCheckBox.Text = "Install for all users (requires Administrator)" +$script:AllUsersCheckBox.Text = "All users (LocalMachine, requires Administrator)" $script:AllUsersCheckBox.ForeColor = $colors.Text -$script:AllUsersCheckBox.Location = [Drawing.Point]::new(26, 50) +$script:AllUsersCheckBox.Location = [Drawing.Point]::new(24, 46) $script:AllUsersCheckBox.AutoSize = $true $script:AllUsersCheckBox.FlatStyle = "Flat" $script:AllUsersCheckBox.Add_CheckedChanged({ Update-TrustStatus }) $trustPanel.Controls.Add($script:AllUsersCheckBox) -$trustPanel.Controls.Add((New-Label -Text "Root thumbprint" -X 26 -Y 92)) -$script:RootThumbprintLabel = New-Label -Text "-" -X 205 -Y 92 -Width 580 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Consolas", 9)) +$trustPanel.Controls.Add((New-Label -Text "Root thumbprint" -X 24 -Y 90 -Width 170 -Height 24)) +$script:RootThumbprintLabel = New-Label -Text "-" -X 210 -Y 90 -Width 560 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Consolas", 9)) +$script:RootThumbprintLabel.AutoEllipsis = $true $trustPanel.Controls.Add($script:RootThumbprintLabel) -$trustPanel.Controls.Add((New-Label -Text "Publisher thumbprint" -X 26 -Y 126)) -$script:PublisherThumbprintLabel = New-Label -Text "-" -X 205 -Y 126 -Width 580 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Consolas", 9)) +$trustPanel.Controls.Add((New-Label -Text "Publisher thumbprint" -X 24 -Y 124 -Width 170 -Height 24)) +$script:PublisherThumbprintLabel = New-Label -Text "-" -X 210 -Y 124 -Width 560 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Consolas", 9)) +$script:PublisherThumbprintLabel.AutoEllipsis = $true $trustPanel.Controls.Add($script:PublisherThumbprintLabel) -$trustPanel.Controls.Add((New-Label -Text "Expires" -X 26 -Y 160)) -$script:ExpiryLabel = New-Label -Text "-" -X 205 -Y 160 -Width 200 -Height 24 -Color $colors.Text +$trustPanel.Controls.Add((New-Label -Text "Expires" -X 24 -Y 158 -Width 170 -Height 24)) +$script:ExpiryLabel = New-Label -Text "-" -X 210 -Y 158 -Width 180 -Height 24 -Color $colors.Text $trustPanel.Controls.Add($script:ExpiryLabel) -$trustPanel.Controls.Add((New-Label -Text "Active scope" -X 26 -Y 194)) -$script:ScopeValueLabel = New-Label -Text "-" -X 205 -Y 194 -Width 200 -Height 24 -Color $colors.Text +$trustPanel.Controls.Add((New-Label -Text "Active scope" -X 24 -Y 192 -Width 170 -Height 24)) +$script:ScopeValueLabel = New-Label -Text "-" -X 210 -Y 192 -Width 200 -Height 24 -Color $colors.Text $trustPanel.Controls.Add($script:ScopeValueLabel) -$script:TrustSummaryLabel = New-Label -Text "Checking trust state..." -X 36 -Y 306 -Width 860 -Height 42 -Color $colors.Muted -$trustTab.Controls.Add($script:TrustSummaryLabel) +$summaryPanel = New-Card -X 0 -Y 338 -Width 820 -Height 76 -BackColor $colors.PanelAlt +$trustPage.Controls.Add($summaryPanel) + +$script:TrustSummaryLabel = New-Label -Text "Checking trust state..." -X 22 -Y 18 -Width 760 -Height 34 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 10, [Drawing.FontStyle]::Bold)) +$summaryPanel.Controls.Add($script:TrustSummaryLabel) $installButton = [Windows.Forms.Button]::new() $installButton.Text = "Install trust" -$installButton.Size = [Drawing.Size]::new(180, 48) -$installButton.Location = [Drawing.Point]::new(36, 372) +$installButton.Size = [Drawing.Size]::new(160, 44) +$installButton.Location = [Drawing.Point]::new(0, 438) Add-AnimatedButton -Button $installButton -Normal $colors.Green -Hover $colors.GreenHover $installButton.Add_Click({ Install-MrTrustCertificates }) -$trustTab.Controls.Add($installButton) +$trustPage.Controls.Add($installButton) $removeButton = [Windows.Forms.Button]::new() $removeButton.Text = "Remove trust" -$removeButton.Size = [Drawing.Size]::new(180, 48) -$removeButton.Location = [Drawing.Point]::new(238, 372) +$removeButton.Size = [Drawing.Size]::new(160, 44) +$removeButton.Location = [Drawing.Point]::new(176, 438) Add-AnimatedButton -Button $removeButton -Normal $colors.PanelAlt -Hover $colors.Border $removeButton.Add_Click({ Remove-MrTrustCertificates }) -$trustTab.Controls.Add($removeButton) +$trustPage.Controls.Add($removeButton) $refreshButton = [Windows.Forms.Button]::new() $refreshButton.Text = "Refresh" -$refreshButton.Size = [Drawing.Size]::new(140, 48) -$refreshButton.Location = [Drawing.Point]::new(440, 372) +$refreshButton.Size = [Drawing.Size]::new(124, 44) +$refreshButton.Location = [Drawing.Point]::new(352, 438) Add-AnimatedButton -Button $refreshButton -Normal $colors.PanelAlt -Hover $colors.Border $refreshButton.Add_Click({ Update-TrustStatus }) -$trustTab.Controls.Add($refreshButton) +$trustPage.Controls.Add($refreshButton) -$note = New-Label -Text "MrTrust installs public certificates only. It does not disable Defender, SmartScreen, UAC, or enterprise policies." -X 36 -Y 456 -Width 880 -Height 46 -Color $colors.Muted -$trustTab.Controls.Add($note) +$note = New-Label -Text "Trust actions are reversible and scoped to the selected Windows certificate store." -X 0 -Y 508 -Width 820 -Height 26 -Color $colors.Muted +$trustPage.Controls.Add($note) -$filePanel = [Windows.Forms.Panel]::new() -$filePanel.BackColor = $colors.Panel -$filePanel.Size = [Drawing.Size]::new(880, 420) -$filePanel.Location = [Drawing.Point]::new(36, 34) -$diagnosticsTab.Controls.Add($filePanel) +$diagnosticsPage = [Windows.Forms.Panel]::new() +$diagnosticsPage.Dock = "Fill" +$diagnosticsPage.BackColor = $colors.Background +$diagnosticsPage.Visible = $false +$contentHost.Controls.Add($diagnosticsPage) +$script:Pages.Diagnostics = $diagnosticsPage + +$diagnosticsTitle = New-PageTitle -Title "File scan" -Description "Inspect a Windows executable, installer, catalog, or DLL for signature and origin signals." +$diagnosticsPage.Controls.Add($diagnosticsTitle.Title) +$diagnosticsPage.Controls.Add($diagnosticsTitle.Description) + +$filePanel = New-Card -X 0 -Y 82 -Width 820 -Height 420 +$diagnosticsPage.Controls.Add($filePanel) $chooseButton = [Windows.Forms.Button]::new() -$chooseButton.Text = "Choose .exe or .msi" -$chooseButton.Size = [Drawing.Size]::new(190, 44) +$chooseButton.Text = "Choose file" +$chooseButton.Size = [Drawing.Size]::new(150, 42) $chooseButton.Location = [Drawing.Point]::new(24, 24) Add-AnimatedButton -Button $chooseButton -Normal $colors.Green -Hover $colors.GreenHover $filePanel.Controls.Add($chooseButton) $scanButton = [Windows.Forms.Button]::new() -$scanButton.Text = "Scan file" -$scanButton.Size = [Drawing.Size]::new(130, 44) -$scanButton.Location = [Drawing.Point]::new(232, 24) +$scanButton.Text = "Scan again" +$scanButton.Size = [Drawing.Size]::new(130, 42) +$scanButton.Location = [Drawing.Point]::new(190, 24) Add-AnimatedButton -Button $scanButton -Normal $colors.PanelAlt -Hover $colors.Border $filePanel.Controls.Add($scanButton) -$script:FileVerdictLabel = New-Label -Text "Choose a Windows installer or executable to inspect." -X 24 -Y 88 -Width 820 -Height 30 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold)) +$script:FileVerdictLabel = New-Label -Text "Choose a Windows app or installer to inspect." -X 24 -Y 88 -Width 760 -Height 30 -Color $colors.Muted -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold)) $filePanel.Controls.Add($script:FileVerdictLabel) -$filePanel.Controls.Add((New-Label -Text "File" -X 24 -Y 136)) -$script:FileNameLabel = New-Label -Text "-" -X 210 -Y 136 -Width 620 -Height 24 -Color $colors.Text +$filePanel.Controls.Add((New-Label -Text "File" -X 24 -Y 136 -Width 170 -Height 24)) +$script:FileNameLabel = New-Label -Text "-" -X 210 -Y 136 -Width 560 -Height 24 -Color $colors.Text +$script:FileNameLabel.AutoEllipsis = $true $filePanel.Controls.Add($script:FileNameLabel) -$filePanel.Controls.Add((New-Label -Text "Path" -X 24 -Y 170)) -$script:FilePathLabel = New-Label -Text "-" -X 210 -Y 170 -Width 620 -Height 40 -Color $colors.Text +$filePanel.Controls.Add((New-Label -Text "Path" -X 24 -Y 170 -Width 170 -Height 24)) +$script:FilePathLabel = New-Label -Text "-" -X 210 -Y 170 -Width 560 -Height 40 -Color $colors.Text $script:FilePathLabel.AutoEllipsis = $true $filePanel.Controls.Add($script:FilePathLabel) -$filePanel.Controls.Add((New-Label -Text "Signature status" -X 24 -Y 222)) -$script:SignatureStatusLabel = New-Label -Text "-" -X 210 -Y 222 -Width 620 -Height 24 -Color $colors.Text +$filePanel.Controls.Add((New-Label -Text "Signature status" -X 24 -Y 222 -Width 170 -Height 24)) +$script:SignatureStatusLabel = New-Label -Text "-" -X 210 -Y 222 -Width 560 -Height 24 -Color $colors.Text $filePanel.Controls.Add($script:SignatureStatusLabel) -$filePanel.Controls.Add((New-Label -Text "Signer" -X 24 -Y 256)) -$script:SignerLabel = New-Label -Text "-" -X 210 -Y 256 -Width 620 -Height 36 -Color $colors.Text +$filePanel.Controls.Add((New-Label -Text "Signer" -X 24 -Y 256 -Width 170 -Height 24)) +$script:SignerLabel = New-Label -Text "-" -X 210 -Y 256 -Width 560 -Height 36 -Color $colors.Text $script:SignerLabel.AutoEllipsis = $true $filePanel.Controls.Add($script:SignerLabel) -$filePanel.Controls.Add((New-Label -Text "MrSphay match" -X 24 -Y 306)) -$script:MrSphayMatchLabel = New-Label -Text "-" -X 210 -Y 306 -Width 180 -Height 24 -Color $colors.Text +$filePanel.Controls.Add((New-Label -Text "MrSphay match" -X 24 -Y 306 -Width 170 -Height 24)) +$script:MrSphayMatchLabel = New-Label -Text "-" -X 210 -Y 306 -Width 160 -Height 24 -Color $colors.Text $filePanel.Controls.Add($script:MrSphayMatchLabel) -$filePanel.Controls.Add((New-Label -Text "Mark-of-the-Web" -X 24 -Y 340)) -$script:MotwLabel = New-Label -Text "-" -X 210 -Y 340 -Width 180 -Height 24 -Color $colors.Text +$filePanel.Controls.Add((New-Label -Text "Mark-of-the-Web" -X 390 -Y 306 -Width 160 -Height 24)) +$script:MotwLabel = New-Label -Text "-" -X 560 -Y 306 -Width 160 -Height 24 -Color $colors.Text $filePanel.Controls.Add($script:MotwLabel) -$filePanel.Controls.Add((New-Label -Text "SmartScreen note" -X 24 -Y 374)) -$script:SmartScreenLabel = New-Label -Text "-" -X 210 -Y 374 -Width 620 -Height 40 -Color $colors.Muted +$filePanel.Controls.Add((New-Label -Text "SmartScreen note" -X 24 -Y 352 -Width 170 -Height 24)) +$script:SmartScreenLabel = New-Label -Text "-" -X 210 -Y 352 -Width 560 -Height 48 -Color $colors.Muted $filePanel.Controls.Add($script:SmartScreenLabel) $chooseButton.Add_Click({ @@ -498,35 +633,40 @@ $scanButton.Add_Click({ } }) -$helpPanel = [Windows.Forms.Panel]::new() -$helpPanel.BackColor = $colors.Panel -$helpPanel.Size = [Drawing.Size]::new(880, 420) -$helpPanel.Location = [Drawing.Point]::new(36, 34) -$helpTab.Controls.Add($helpPanel) +$helpPage = [Windows.Forms.Panel]::new() +$helpPage.Dock = "Fill" +$helpPage.BackColor = $colors.Background +$helpPage.Visible = $false +$contentHost.Controls.Add($helpPage) +$script:Pages.SmartScreen = $helpPage -$helpTitle = New-Label -Text "Why SmartScreen can still appear" -X 24 -Y 24 -Width 780 -Height 34 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 14, [Drawing.FontStyle]::Bold)) -$helpPanel.Controls.Add($helpTitle) +$helpTitle = New-PageTitle -Title "SmartScreen" -Description "Understand what MrTrust can verify and what Windows reputation still controls." +$helpPage.Controls.Add($helpTitle.Title) +$helpPage.Controls.Add($helpTitle.Description) -$helpText = @" -MrTrust handles local certificate trust. SmartScreen also uses Microsoft reputation. +$helpPanel = New-Card -X 0 -Y 82 -Width 820 -Height 330 +$helpPage.Controls.Add($helpPanel) -If Windows shows "Publisher: MrSphay Code Signing", the signature identity is being recognized. +$helpPanel.Controls.Add((New-Label -Text "Local trust" -X 24 -Y 24 -Width 180 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold)))) +$helpPanel.Controls.Add((New-Label -Text "MrTrust installs the public MrSphay root and publisher certificates into the selected Windows certificate stores." -X 24 -Y 54 -Width 740 -Height 42 -Color $colors.Muted)) -A red SmartScreen dialog can still appear when a file is new, downloaded from the Internet, rarely seen, or has not built enough Microsoft reputation yet. +$helpPanel.Controls.Add((New-Label -Text "Windows reputation" -X 24 -Y 118 -Width 220 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold)))) +$helpPanel.Controls.Add((New-Label -Text "SmartScreen can still warn for a new or rarely downloaded file, even when the signature is valid and the publisher is recognized." -X 24 -Y 148 -Width 740 -Height 42 -Color $colors.Muted)) -MrTrust will not disable SmartScreen. It can show whether a file is signed, whether it matches MrSphay, and whether Mark-of-the-Web is present. -"@ -$helpBody = New-Label -Text $helpText -X 24 -Y 78 -Width 820 -Height 250 -Color $colors.Muted -$helpPanel.Controls.Add($helpBody) +$helpPanel.Controls.Add((New-Label -Text "What to check" -X 24 -Y 212 -Width 180 -Height 24 -Color $colors.Text -Font ([Drawing.Font]::new("Segoe UI", 11, [Drawing.FontStyle]::Bold)))) +$helpPanel.Controls.Add((New-Label -Text "Use File scan to verify signature status, MrSphay signer matching, and Mark-of-the-Web. MrTrust never disables SmartScreen." -X 24 -Y 242 -Width 740 -Height 46 -Color $colors.Muted)) $pulseTimer = [Windows.Forms.Timer]::new() -$pulseTimer.Interval = 80 +$pulseTimer.Interval = 100 $pulseTimer.Add_Tick({ $script:CurrentAccent = ($script:CurrentAccent + 1) % 40 - $value = 150 + [Math]::Abs(20 - $script:CurrentAccent) * 3 - $accent.BackColor = [Drawing.Color]::FromArgb(28, [Math]::Min(220, $value), 111) + $value = 130 + [Math]::Abs(20 - $script:CurrentAccent) * 4 + $sideAccent.BackColor = [Drawing.Color]::FromArgb(0, [Math]::Min(205, $value), 91) }) $pulseTimer.Start() -$form.Add_Shown({ Update-TrustStatus }) +$form.Add_Shown({ + Show-MrTrustPage -Key "Trust" + Update-TrustStatus +}) [Windows.Forms.Application]::Run($form)