diff --git a/certy.ps1 b/certy.ps1 index f805598..844ac9d 100644 --- a/certy.ps1 +++ b/certy.ps1 @@ -130,6 +130,33 @@ function Save-Defaults { Set-Content -Path $path -Value $json -Encoding ascii } +function Get-ReplicationCredentialPath { + $dir = Join-Path $env:ProgramData "Certy" + return Join-Path $dir "replication-cred.xml" +} + +function Load-ReplicationCredential { + $path = Get-ReplicationCredentialPath + if (-not (Test-Path -Path $path -PathType Leaf)) { return $null } + try { + $cred = Import-Clixml -Path $path + if ($cred -is [pscredential]) { return $cred } + } catch { + # Ignore load errors and treat as missing. + } + return $null +} + +function Save-ReplicationCredential { + param([pscredential]$Credential) + $path = Get-ReplicationCredentialPath + $dir = Split-Path -Path $path -Parent + if (-not (Test-Path -Path $dir -PathType Container)) { + New-Item -Path $dir -ItemType Directory -Force | Out-Null + } + $Credential | Export-Clixml -Path $path +} + function Get-DefaultValue { param( [object]$Defaults, @@ -658,6 +685,14 @@ $replicationRemoteBox = Add-CheckBox "Run repadmin remotely (PowerShell)" $xInpu $replicationRemoteBox.Checked = $true $y += $rowHeight + $gap +$replicationCredBtn = New-Object System.Windows.Forms.Button +$replicationCredBtn.Text = "Set Replication Credentials" +$replicationCredBtn.Location = [System.Drawing.Point]::new($xInput, $y) +$replicationCredBtn.Size = [System.Drawing.Size]::new(220, 26) +$panel.Controls.Add($replicationCredBtn) +Style-ButtonSecondary $replicationCredBtn +$y += $rowHeight + $gap + $y += $gap Add-SectionHeader "ACME / Output" @@ -768,6 +803,7 @@ function Update-ReplicationUI { $replicationCmdBox.Enabled = $enabled $replicationDelayBox.Enabled = $enabled $replicationRemoteBox.Enabled = $enabled + $replicationCredBtn.Enabled = $enabled $dnsListBox.Enabled = $enabled } @@ -898,6 +934,7 @@ function Apply-Layout { $replicationCmdBox.Width = $inputWidthCalc $replicationDelayBox.Width = $inputWidthCalc $replicationRemoteBox.Width = $inputWidthCalc + $replicationCredBtn.Width = [Math]::Min($inputWidthCalc, 260) $wacsPathBox.Width = $inputWidthCalc $outputTypeBox.Width = $inputWidthCalc $outputPathBox.Width = $inputWidthCalc @@ -1035,6 +1072,16 @@ $outputTypeBox.Add_SelectedIndexChanged({ Update-OutputTypeUI }) +$replicationCredBtn.Add_Click({ + $cred = Get-Credential -Message "Enter credentials for replication sessions." + if (-not $cred) { + & $logAction "Replication credentials not set." + return + } + Save-ReplicationCredential -Credential $cred + & $logAction "Replication credentials saved for this user." +}) + $hostsBox.Add_TextChanged({ Update-ZoneFromHostInput }) @@ -1139,10 +1186,15 @@ $runBtn.Add_Click({ } $replicationCredential = $null if ($replicationRemoteBox.Checked) { - $replicationCredential = Get-Credential -Message "Enter credentials for replication targets." + $replicationCredential = Load-ReplicationCredential if (-not $replicationCredential) { - & $logAction "Replication canceled: credentials not provided." - return + $replicationCredential = Get-Credential -Message "Enter credentials for replication targets." + if (-not $replicationCredential) { + & $logAction "Replication canceled: credentials not provided." + return + } + Save-ReplicationCredential -Credential $replicationCredential + & $logAction "Replication credentials saved for this user." } } Invoke-Replication -Servers $replicationTargets -Command $replicationCmdBox.Text -UseRemote $replicationRemoteBox.Checked -Credential $replicationCredential -Log $logAction