Private/Update-PAAccount.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
function Update-PAAccount {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Position=0,ValueFromPipeline,ValueFromPipelineByPropertyName)]
        [Alias('Name')]
        [string]$ID
    )

    Begin {
        # make sure we have a server configured
        if (-not ($server = Get-PAServer)) {
            throw "No ACME server configured. Run Set-PAServer first."
        }
    }

    Process {

        # make sure there's an ID or current account
        if (-not $ID -and -not ($acct = Get-PAAccount)) {
            Write-Warning "No ACME account configured. Run Set-PAAccount or specify an ID."
            return
        }

        # get a reference to the specified account if it exists
        if ($ID -and $ID -ne $acct.id) {
            if (-not ($acct = Get-PAAccount -ID $ID)) {
                Write-Warning "Specified account id ($ID) not found. Nothing to update."
                return
            }
        }

        # skip refreshing non-valid accounts
        if ($acct.status -ne 'valid') {
            Write-Warning "Account '$($acct.id)' has status '$($acct.status)'. Skipping server refresh."
            return
        }

        Write-Debug "Refreshing account $($acct.id)"

        # build the header
        $header = @{
            alg   = $acct.alg;
            kid   = $acct.location;
            nonce = $script:Dir.nonce;
            url   = $acct.location;
        }

        # send the request
        try {
            $response = Invoke-ACME $header ([String]::Empty) $acct -EA Stop
        } catch { throw }

        $respObj = $response.Content | ConvertFrom-Json

        # update the things that could have changed
        $acct | Add-Member 'status' $respObj.status -Force
        $acct | Add-Member 'contact' $respObj.contact -Force

        # save it to disk without the dynamic properties
        $acctFile = Join-Path $server.Folder "$($acct.id)\acct.json"
        $acct | Select-Object -Property * -ExcludeProperty id,Folder |
            ConvertTo-Json -Depth 5 |
            Out-File $acctFile -Force -EA Stop

    }
}