Public/Connect-Confluence.ps1

function Connect-Confluence {
    <#
    .SYNOPSIS
        Stellt eine Verbindung zu Confluence Cloud her (API-Token-Auth).
    .PARAMETER BaseUrl
        z.B. https://deinedomain.atlassian.net (ein angehängtes "/wiki" wird automatisch entfernt)
    .PARAMETER Email
        Atlassian-Account-E-Mail
    .PARAMETER ApiToken
        API-Token von https://id.atlassian.com/manage-profile/security/api-tokens
    .PARAMETER ProxyServer
        Name eines in der Konfigurationsdatei abgelegten Proxy-Profils, z.B. "server-proxy" oder "client-proxy".
        Siehe Set-ConfluenceProxyConfig.
    .PARAMETER ProxyConfigPath
        Pfad zur Proxy-Konfigurationsdatei (JSON). Standard: <Modulstamm>\Configurations\ProxyConfig.json
    .PARAMETER ProxyUrl
        Alternative zu -ProxyServer: Proxy-URI direkt angeben, z.B. "http://proxy.firma.ch:8080".
    .PARAMETER ProxyUseDefaultCredentials
        Nur zusammen mit -ProxyUrl: Verwendet die aktuellen Windows-Anmeldedaten für die Proxy-Authentifizierung.
    .PARAMETER ProxyCredential
        Nur zusammen mit -ProxyUrl: Explizite Anmeldedaten für die Proxy-Authentifizierung.
    .EXAMPLE
        Connect-Confluence -BaseUrl "https://meinefirma.atlassian.net" -Email "ich@firma.ch" -ApiToken (Read-Host -AsSecureString)
    .EXAMPLE
        Connect-Confluence -BaseUrl "https://meinefirma.atlassian.net" -Email "ich@firma.ch" -ApiToken $Token -ProxyServer "client-proxy"
    .EXAMPLE
        Connect-Confluence -BaseUrl "https://meinefirma.atlassian.net" -Email "ich@firma.ch" -ApiToken $Token -ProxyUrl "http://proxy.firma.ch:8080" -ProxyUseDefaultCredentials
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $BaseUrl,

        [Parameter(Mandatory = $true)]
        [string]
        $Email,

        [Parameter(Mandatory = $true)]
        [object]
        $ApiToken,

        [Parameter(Mandatory = $false)]
        [ArgumentCompleter({
            param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters)

            $ConfigPath = $FakeBoundParameters['ProxyConfigPath']
            if (-not $ConfigPath) {
                $ModuleBase = (Get-Module -Name ConfluenceAPI | Select-Object -First 1).ModuleBase
                if ($ModuleBase) {
                    $ConfigPath = Join-Path -Path (Split-Path -Path $ModuleBase -Parent) -ChildPath "Configurations\ProxyConfig.json"
                }
            }

            if ($ConfigPath -and (Test-Path -LiteralPath $ConfigPath)) {
                (Get-Content -LiteralPath $ConfigPath -Raw | ConvertFrom-Json).PSObject.Properties.Name |
                    Where-Object { $_ -like "$WordToComplete*" }
            }
        })]
        [string]
        $ProxyServer,

        [Parameter(Mandatory = $false)]
        [string]
        $ProxyConfigPath = $script:CFL_DefaultProxyConfigPath,

        [Parameter(Mandatory = $false)]
        [string]
        $ProxyUrl,

        [Parameter(Mandatory = $false)]
        [switch]
        $ProxyUseDefaultCredentials,

        [Parameter(Mandatory = $false)]
        [System.Management.Automation.PSCredential]
        $ProxyCredential
    )

    begin {
        $ErrorActionPreference = "Stop"

        if ($ApiToken -is [System.Security.SecureString]) {
            $PlainToken = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
                [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($ApiToken)
            )
        }
        else {
            $PlainToken = [string]$ApiToken
        }

        $Pair = "{0}:{1}" -f $Email, $PlainToken
        $Base64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($Pair))
    }

    process {
        $script:CFL_BaseUrl = $BaseUrl.TrimEnd('/') -replace '/wiki$', ''
        $script:CFL_Email = $Email
        $script:CFL_AuthHeader = @{ Authorization = "Basic $Base64" }

        if ($ProxyServer) {
            $ProxyConfigEntry = Get-ConfluenceProxyConfig -Name $ProxyServer -ConfigPath $ProxyConfigPath
            $script:CFL_ProxyUrl = $ProxyConfigEntry.ProxyUrl
            $script:CFL_ProxyUseDefaultCredentials = [bool]$ProxyConfigEntry.UseDefaultCredentials
            $script:CFL_ProxyCredential = $null
        }
        elseif ($ProxyUrl) {
            $script:CFL_ProxyUrl = $ProxyUrl
            $script:CFL_ProxyUseDefaultCredentials = [bool]$ProxyUseDefaultCredentials
            $script:CFL_ProxyCredential = $ProxyCredential
        }
        else {
            $script:CFL_ProxyUrl = $null
            $script:CFL_ProxyUseDefaultCredentials = $null
            $script:CFL_ProxyCredential = $null
        }

        $ProxyParams = Get-ConfluenceProxyParams

        try {
            $null = Invoke-RestMethod -Method Get -Uri "$($script:CFL_BaseUrl)/wiki/api/v2/spaces?limit=1" -Headers $script:CFL_AuthHeader @ProxyParams
        }
        catch {
            $script:CFL_BaseUrl = $null
            $script:CFL_Email = $null
            $script:CFL_AuthHeader = $null
            $script:CFL_ProxyUrl = $null
            $script:CFL_ProxyUseDefaultCredentials = $null
            $script:CFL_ProxyCredential = $null
            Write-Error $_.Exception.Message
            Throw "Verbindung zu Confluence fehlgeschlagen."
        }
    }

    end {
        [pscustomobject]@{
            BaseUrl  = $script:CFL_BaseUrl
            Email    = $script:CFL_Email
            ProxyUrl = $script:CFL_ProxyUrl
        }
    }
}