@@ -0,0 +1,81 @@
|
||||
# Generate a Gitea SSH key-verification signature (official UI challenge).
|
||||
# Token from /user/settings/keys -> Verify. Never commit the token.
|
||||
# Matches: echo -n 'TOKEN' | ssh-keygen -Y sign -n gitea -f KEY
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Token,
|
||||
[string]$KeyPath
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
. (Join-Path $PSScriptRoot 'common.ps1')
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($KeyPath)) {
|
||||
$gitProfile = Get-GitSkillsProfile
|
||||
if ($gitProfile -and $gitProfile.sshKeyPath) {
|
||||
$KeyPath = [string]$gitProfile.sshKeyPath
|
||||
} else {
|
||||
$KeyPath = Join-Path $env:USERPROFILE '.ssh\id_ed25519'
|
||||
}
|
||||
}
|
||||
|
||||
$token = $Token.Trim()
|
||||
if ([string]::IsNullOrWhiteSpace($token)) {
|
||||
Write-StatusLine -Key 'status' -Value 'failed'
|
||||
Write-StatusLine -Key 'reason' -Value 'token_empty'
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $KeyPath)) {
|
||||
$pub = $KeyPath + '.pub'
|
||||
if (Test-Path -LiteralPath $pub) {
|
||||
$KeyPath = $pub
|
||||
} else {
|
||||
Write-StatusLine -Key 'status' -Value 'failed'
|
||||
Write-StatusLine -Key 'reason' -Value 'key_missing'
|
||||
Write-StatusLine -Key 'key_path' -Value $KeyPath
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
$bash = Join-Path $env:ProgramFiles 'Git\bin\bash.exe'
|
||||
if (-not (Test-Path -LiteralPath $bash)) {
|
||||
Write-StatusLine -Key 'status' -Value 'failed'
|
||||
Write-StatusLine -Key 'reason' -Value 'git_bash_missing'
|
||||
Write-Output 'hint=Install Git for Windows, or run the echo -n | ssh-keygen command from the Gitea page in Git Bash'
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Convert Windows path to Git Bash path: C:\Users\... -> /c/Users/...
|
||||
$full = [System.IO.Path]::GetFullPath($KeyPath)
|
||||
$drive = $full.Substring(0, 1).ToLower()
|
||||
$rest = $full.Substring(2) -replace '\\', '/'
|
||||
$unixKey = "/$drive$rest"
|
||||
|
||||
$prevEap = $ErrorActionPreference
|
||||
$ErrorActionPreference = 'Continue'
|
||||
try {
|
||||
$sigText = Invoke-GitSkillsNativeWithInput -FilePath $bash -ArgumentList @('-lc', "ssh-keygen -Y sign -n gitea -f '$unixKey'") -InputText $token | Out-String
|
||||
}
|
||||
finally {
|
||||
$ErrorActionPreference = $prevEap
|
||||
}
|
||||
if ($sigText -notmatch 'BEGIN SSH SIGNATURE') {
|
||||
Write-StatusLine -Key 'status' -Value 'failed'
|
||||
Write-StatusLine -Key 'reason' -Value 'sign_failed'
|
||||
Write-StatusLine -Key 'key_path' -Value $KeyPath
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-StatusLine -Key 'status' -Value 'ok'
|
||||
Write-StatusLine -Key 'key_path' -Value $KeyPath
|
||||
Write-Output '-----BEGIN_SIGNATURE_BODY-----'
|
||||
$capture = $false
|
||||
foreach ($line in ($sigText -split "`r?`n")) {
|
||||
if ($line -match 'BEGIN SSH SIGNATURE') { $capture = $true }
|
||||
if ($capture) { Write-Output $line }
|
||||
if ($line -match 'END SSH SIGNATURE') { break }
|
||||
}
|
||||
Write-Output '-----END_SIGNATURE_BODY-----'
|
||||
Write-Output 'Paste the SSH SIGNATURE block into Gitea Verify, then click verify.'
|
||||
Reference in New Issue
Block a user