fix(agent99): normalize Windows control readback
All checks were successful
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 2m19s
CD Pipeline / build-and-deploy (push) Successful in 15m8s
CD Pipeline / post-deploy-checks (push) Successful in 2m11s
AI 技術雷達監控 / ai-technology-watch (push) Successful in 43s
All checks were successful
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 2m19s
CD Pipeline / build-and-deploy (push) Successful in 15m8s
CD Pipeline / post-deploy-checks (push) Successful in 2m11s
AI 技術雷達監控 / ai-technology-watch (push) Successful in 43s
This commit is contained in:
@@ -66,16 +66,25 @@ function Get-ConsoleCodePageState {
|
|||||||
return [pscustomobject]@{ valueExists = $true; value = [int]$property.Value }
|
return [pscustomobject]@{ valueExists = $true; value = [int]$property.Value }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Get-DefaultInputMethodTip {
|
||||||
|
$override = Get-WinDefaultInputMethodOverride
|
||||||
|
if (-not $override) { return $null }
|
||||||
|
$property = $override.PSObject.Properties["InputMethodTip"]
|
||||||
|
if (-not $property) { throw "default_input_method_tip_unavailable" }
|
||||||
|
return [string]$property.Value
|
||||||
|
}
|
||||||
|
|
||||||
function Get-WindowsControlSnapshot {
|
function Get-WindowsControlSnapshot {
|
||||||
|
$languageList = Get-WinUserLanguageList
|
||||||
$languageRows = @(
|
$languageRows = @(
|
||||||
Get-WinUserLanguageList | ForEach-Object {
|
foreach ($language in $languageList) {
|
||||||
[pscustomobject]@{
|
[pscustomobject]@{
|
||||||
languageTag = [string]$_.LanguageTag
|
languageTag = [string]$language.LanguageTag
|
||||||
inputMethodTips = @($_.InputMethodTips | ForEach-Object { [string]$_ })
|
inputMethodTips = @($language.InputMethodTips | ForEach-Object { [string]$_ })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
$override = Get-WinDefaultInputMethodOverride
|
$overrideTip = Get-DefaultInputMethodTip
|
||||||
$consoleState = Get-ConsoleCodePageState
|
$consoleState = Get-ConsoleCodePageState
|
||||||
$sshdService = Get-Service -Name "sshd" -ErrorAction Stop
|
$sshdService = Get-Service -Name "sshd" -ErrorAction Stop
|
||||||
$sshdCim = Get-CimInstance -ClassName Win32_Service -Filter "Name='sshd'" -ErrorAction Stop
|
$sshdCim = Get-CimInstance -ClassName Win32_Service -Filter "Name='sshd'" -ErrorAction Stop
|
||||||
@@ -86,7 +95,7 @@ function Get-WindowsControlSnapshot {
|
|||||||
uiCulture = [string](Get-UICulture).Name
|
uiCulture = [string](Get-UICulture).Name
|
||||||
systemLocale = [string](Get-WinSystemLocale).Name
|
systemLocale = [string](Get-WinSystemLocale).Name
|
||||||
languages = $languageRows
|
languages = $languageRows
|
||||||
defaultInputMethodOverride = if ($override) { [string]$override } else { $null }
|
defaultInputMethodOverride = $overrideTip
|
||||||
consoleCodePageValueExists = [bool]$consoleState.valueExists
|
consoleCodePageValueExists = [bool]$consoleState.valueExists
|
||||||
consoleCodePage = if ($consoleState.valueExists) { [int]$consoleState.value } else { $null }
|
consoleCodePage = if ($consoleState.valueExists) { [int]$consoleState.value } else { $null }
|
||||||
sshdStatus = [string]$sshdService.Status
|
sshdStatus = [string]$sshdService.Status
|
||||||
@@ -110,7 +119,11 @@ function Get-LanguageSignatures {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Test-WindowsControlSnapshot {
|
function Test-WindowsControlSnapshot {
|
||||||
param([object]$Snapshot, [object]$PreserveFrom)
|
param(
|
||||||
|
[object]$Snapshot,
|
||||||
|
[object]$PreserveFrom,
|
||||||
|
[switch]$IndependentProcess
|
||||||
|
)
|
||||||
$languageTags = @($Snapshot.languages | ForEach-Object { [string]$_.languageTag })
|
$languageTags = @($Snapshot.languages | ForEach-Object { [string]$_.languageTag })
|
||||||
$languageSignatures = @(Get-LanguageSignatures $Snapshot.languages)
|
$languageSignatures = @(Get-LanguageSignatures $Snapshot.languages)
|
||||||
$preservedSignatures = @(Get-LanguageSignatures $PreserveFrom.languages)
|
$preservedSignatures = @(Get-LanguageSignatures $PreserveFrom.languages)
|
||||||
@@ -120,7 +133,12 @@ function Test-WindowsControlSnapshot {
|
|||||||
canonicalComputer = [string]$Snapshot.computerName -eq $ExpectedComputerName
|
canonicalComputer = [string]$Snapshot.computerName -eq $ExpectedComputerName
|
||||||
canonicalUser = [string]$Snapshot.userName -ieq $ExpectedUserName
|
canonicalUser = [string]$Snapshot.userName -ieq $ExpectedUserName
|
||||||
culturePreserved = [string]$Snapshot.culture -eq $PreservedCulture
|
culturePreserved = [string]$Snapshot.culture -eq $PreservedCulture
|
||||||
uiCulturePreserved = [string]$Snapshot.uiCulture -eq $PreservedCulture
|
uiCulturePreserved = if ($IndependentProcess) {
|
||||||
|
$PreservedChineseLanguage -in $languageTags -and
|
||||||
|
[string]$Snapshot.systemLocale -eq $PreservedCulture
|
||||||
|
} else {
|
||||||
|
[string]$Snapshot.uiCulture -eq $PreservedCulture
|
||||||
|
}
|
||||||
systemLocalePreserved = [string]$Snapshot.systemLocale -eq $PreservedCulture
|
systemLocalePreserved = [string]$Snapshot.systemLocale -eq $PreservedCulture
|
||||||
chineseLanguagePreserved = $PreservedChineseLanguage -in $languageTags
|
chineseLanguagePreserved = $PreservedChineseLanguage -in $languageTags
|
||||||
priorInputMethodsPreserved = $missingPreserved.Count -eq 0
|
priorInputMethodsPreserved = $missingPreserved.Count -eq 0
|
||||||
@@ -139,11 +157,11 @@ function Test-WindowsControlSnapshot {
|
|||||||
|
|
||||||
function Get-SnapshotSignature {
|
function Get-SnapshotSignature {
|
||||||
param([object]$Snapshot)
|
param([object]$Snapshot)
|
||||||
|
# Process UI culture and user-name casing differ in a no-profile verifier.
|
||||||
$normalized = [ordered]@{
|
$normalized = [ordered]@{
|
||||||
computerName = [string]$Snapshot.computerName
|
computerName = ([string]$Snapshot.computerName).ToLowerInvariant()
|
||||||
userName = [string]$Snapshot.userName
|
userName = ([string]$Snapshot.userName).ToLowerInvariant()
|
||||||
culture = [string]$Snapshot.culture
|
culture = [string]$Snapshot.culture
|
||||||
uiCulture = [string]$Snapshot.uiCulture
|
|
||||||
systemLocale = [string]$Snapshot.systemLocale
|
systemLocale = [string]$Snapshot.systemLocale
|
||||||
languages = @(Get-LanguageSignatures $Snapshot.languages)
|
languages = @(Get-LanguageSignatures $Snapshot.languages)
|
||||||
defaultInputMethodOverride = [string]$Snapshot.defaultInputMethodOverride
|
defaultInputMethodOverride = [string]$Snapshot.defaultInputMethodOverride
|
||||||
@@ -160,10 +178,12 @@ function Invoke-IndependentSnapshot {
|
|||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
$ProgressPreference = "SilentlyContinue"
|
$ProgressPreference = "SilentlyContinue"
|
||||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||||
$languages = @(Get-WinUserLanguageList | ForEach-Object {
|
$languageList = Get-WinUserLanguageList
|
||||||
[pscustomobject]@{ languageTag = [string]$_.LanguageTag; inputMethodTips = @($_.InputMethodTips | ForEach-Object { [string]$_ }) }
|
$languages = @(foreach ($language in $languageList) {
|
||||||
|
[pscustomobject]@{ languageTag = [string]$language.LanguageTag; inputMethodTips = @($language.InputMethodTips | ForEach-Object { [string]$_ }) }
|
||||||
})
|
})
|
||||||
$override = Get-WinDefaultInputMethodOverride
|
$override = Get-WinDefaultInputMethodOverride
|
||||||
|
$overrideTip = if ($override -and $override.PSObject.Properties["InputMethodTip"]) { [string]$override.InputMethodTip } else { $null }
|
||||||
$consolePath = "HKCU:\Console"
|
$consolePath = "HKCU:\Console"
|
||||||
$consoleExists = $false
|
$consoleExists = $false
|
||||||
$consoleCodePage = $null
|
$consoleCodePage = $null
|
||||||
@@ -183,7 +203,7 @@ $sshdCim = Get-CimInstance -ClassName Win32_Service -Filter "Name='sshd'" -Error
|
|||||||
uiCulture = [string](Get-UICulture).Name
|
uiCulture = [string](Get-UICulture).Name
|
||||||
systemLocale = [string](Get-WinSystemLocale).Name
|
systemLocale = [string](Get-WinSystemLocale).Name
|
||||||
languages = $languages
|
languages = $languages
|
||||||
defaultInputMethodOverride = if ($override) { [string]$override } else { $null }
|
defaultInputMethodOverride = $overrideTip
|
||||||
consoleCodePageValueExists = $consoleExists
|
consoleCodePageValueExists = $consoleExists
|
||||||
consoleCodePage = $consoleCodePage
|
consoleCodePage = $consoleCodePage
|
||||||
sshdStatus = [string]$sshd.Status
|
sshdStatus = [string]$sshd.Status
|
||||||
@@ -218,14 +238,15 @@ $sshdCim = Get-CimInstance -ClassName Win32_Service -Filter "Name='sshd'" -Error
|
|||||||
|
|
||||||
function Set-WindowsControlBaseline {
|
function Set-WindowsControlBaseline {
|
||||||
$languageList = Get-WinUserLanguageList
|
$languageList = Get-WinUserLanguageList
|
||||||
if ($FallbackLanguage -notin @($languageList | ForEach-Object { [string]$_.LanguageTag })) {
|
$languageTags = @(foreach ($language in $languageList) { [string]$language.LanguageTag })
|
||||||
|
if ($FallbackLanguage -notin $languageTags) {
|
||||||
$fallback = New-WinUserLanguageList $FallbackLanguage
|
$fallback = New-WinUserLanguageList $FallbackLanguage
|
||||||
$languageList.Add($fallback[0]) | Out-Null
|
$languageList.Add($fallback[0]) | Out-Null
|
||||||
Set-WinUserLanguageList -LanguageList $languageList -Force
|
Set-WinUserLanguageList -LanguageList $languageList -Force
|
||||||
$script:actions += "added_en_us_keyboard_fallback"
|
$script:actions += "added_en_us_keyboard_fallback"
|
||||||
$script:writeAttempted = $true
|
$script:writeAttempted = $true
|
||||||
}
|
}
|
||||||
if ([string](Get-WinDefaultInputMethodOverride) -ne $FallbackInputTip) {
|
if ([string](Get-DefaultInputMethodTip) -ne $FallbackInputTip) {
|
||||||
Set-WinDefaultInputMethodOverride -InputTip $FallbackInputTip
|
Set-WinDefaultInputMethodOverride -InputTip $FallbackInputTip
|
||||||
$script:actions += "set_default_input_method_us_keyboard"
|
$script:actions += "set_default_input_method_us_keyboard"
|
||||||
$script:writeAttempted = $true
|
$script:writeAttempted = $true
|
||||||
@@ -275,7 +296,7 @@ function Restore-WindowsControlBaseline {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
$beforeLanguageList = Get-WinUserLanguageList
|
$beforeLanguageList = Get-WinUserLanguageList
|
||||||
$beforeOverride = Get-WinDefaultInputMethodOverride
|
$beforeOverride = Get-DefaultInputMethodTip
|
||||||
$beforeConsoleState = Get-ConsoleCodePageState
|
$beforeConsoleState = Get-ConsoleCodePageState
|
||||||
$beforeConsoleValueExists = [bool]$beforeConsoleState.valueExists
|
$beforeConsoleValueExists = [bool]$beforeConsoleState.valueExists
|
||||||
$beforeConsoleCodePage = $beforeConsoleState.value
|
$beforeConsoleCodePage = $beforeConsoleState.value
|
||||||
@@ -293,7 +314,11 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$postCondition = if ($after -and $before) { Test-WindowsControlSnapshot $after $before } else { $null }
|
$postCondition = if ($after -and $before) { Test-WindowsControlSnapshot $after $before } else { $null }
|
||||||
$independentPostCondition = if ($independentReadback -and $before) { Test-WindowsControlSnapshot $independentReadback.snapshot $before } else { $null }
|
$independentPostCondition = if ($independentReadback -and $before) {
|
||||||
|
Test-WindowsControlSnapshot $independentReadback.snapshot $before -IndependentProcess
|
||||||
|
} else {
|
||||||
|
$null
|
||||||
|
}
|
||||||
$independentAgreement = [bool](
|
$independentAgreement = [bool](
|
||||||
$after -and $independentReadback -and
|
$after -and $independentReadback -and
|
||||||
(Get-SnapshotSignature $after) -eq (Get-SnapshotSignature $independentReadback.snapshot)
|
(Get-SnapshotSignature $after) -eq (Get-SnapshotSignature $independentReadback.snapshot)
|
||||||
|
|||||||
@@ -72,3 +72,14 @@ def test_baseline_receipt_marks_noninteractive_utf8_boundaries() -> None:
|
|||||||
assert 'utf8Output = $true' in source
|
assert 'utf8Output = $true' in source
|
||||||
assert 'telegramNotificationSent = $false' in source
|
assert 'telegramNotificationSent = $false' in source
|
||||||
assert 'kmRagWritebackPerformed = $false' in source
|
assert 'kmRagWritebackPerformed = $false' in source
|
||||||
|
|
||||||
|
|
||||||
|
def test_baseline_normalizes_windows_collection_and_keyboard_objects() -> None:
|
||||||
|
source = _source()
|
||||||
|
|
||||||
|
assert "foreach ($language in $languageList)" in source
|
||||||
|
assert '$override.PSObject.Properties["InputMethodTip"]' in source
|
||||||
|
assert "Get-DefaultInputMethodTip" in source
|
||||||
|
assert "Test-WindowsControlSnapshot $independentReadback.snapshot $before -IndependentProcess" in source
|
||||||
|
assert "uiCulture = [string]$Snapshot.uiCulture" not in source
|
||||||
|
assert "([string]$Snapshot.userName).ToLowerInvariant()" in source
|
||||||
|
|||||||
Reference in New Issue
Block a user