From 19615363e356451308fec9663b3ea582efca711b Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Wed, 3 Jun 2026 21:34:35 -0400 Subject: [PATCH 01/27] CI: add dotnet --info / df -h / free -m diagnostics and an explicit 'Restore NuGet packages' step before build to isolate restore failures (build of e15f650 on main exited with code -1 and zero dotnet output). --- .gitea/workflows/publish-psgallery.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.gitea/workflows/publish-psgallery.yml b/.gitea/workflows/publish-psgallery.yml index 435c250..8caa971 100644 --- a/.gitea/workflows/publish-psgallery.yml +++ b/.gitea/workflows/publish-psgallery.yml @@ -27,6 +27,23 @@ jobs: } Write-Host ("pwsh: " + (pwsh -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')) Write-Host ("dotnet: " + (dotnet --version)) + Write-Host '--- dotnet --info ---' + dotnet --info + Write-Host '--- disk free ---' + df -h . + Write-Host '--- memory ---' + free -m + + - name: Restore NuGet packages + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + Write-Host '==> dotnet restore src/PSInfisicalAPI/PSInfisicalAPI.csproj' + dotnet restore src/PSInfisicalAPI/PSInfisicalAPI.csproj --verbosity normal + if ($LASTEXITCODE -ne 0) { throw "Restore of PSInfisicalAPI.csproj failed with exit code $LASTEXITCODE" } + Write-Host '==> dotnet restore src/PSInfisicalAPI.Tests/PSInfisicalAPI.Tests.csproj' + dotnet restore src/PSInfisicalAPI.Tests/PSInfisicalAPI.Tests.csproj --verbosity normal + if ($LASTEXITCODE -ne 0) { throw "Restore of PSInfisicalAPI.Tests.csproj failed with exit code $LASTEXITCODE" } - name: Build and test module shell: pwsh From 51bf819c37e5438efea4a0d15f2ecfc44d4794d7 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 14:26:40 -0400 Subject: [PATCH 02/27] Request-InfisicalCertificate + PKI lifecycle, MAML help for all 39 cmdlets, chain-store routing fix Cmdlets added: Request-InfisicalCertificate, Get-InfisicalCertificate, Get-InfisicalCertificates. Request supports BySubscriber/ByCa parameter sets, BouncyCastle CSR generation (RSA/ECDSA/Ed25519), local-key generation, -Install/-InstallChain (chain certs routed to Root vs CertificateAuthority by self-signed status), idempotency reuse with -AllowRenewal/-RenewalThresholdDays, local chain reconstruction with -LocalChainOnly opt-out, Infisical bundle fallback when local stores are incomplete, and private-key protection modes (Exportable/LocalOnly/NonExportable/Ephemeral) via -PrivateKeyProtection plus -PersistKey/-MachineKey/-PrivateKeyPath. Install-InfisicalCertificate fix: chain certs were previously dumped into CertificateAuthority unconditionally. They are now routed by Subject==Issuer (self-signed -> Root, otherwise -> CertificateAuthority), matching Request-InfisicalCertificate. Routing centralized in InfisicalCertificateRequestHelpers.GetChainCertificateTargetStore and a new InstallChain(IEnumerable,...) overload. Help: authored Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml covering all 39 cmdlets (synopsis, description, notes, two examples per cmdlet: one-liner + OrderedDictionary splat with preceding Get- resolvers for IDs/slugs). Build pipeline: build.ps1 stages the help XML into bin// next to the DLL during publish (hard-fails if missing or has zero entries). Test-ModuleImports now enumerates every exported cmdlet via Get-Command, cross-checks against expected names, and asserts non-empty synopsis (rejecting auto-generated cmdlet-name fallback), non-empty description, and at least one example with a non-empty block. Tests: 230/230 passing (up from 190). --- CHANGELOG.md | 99 ++ Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 7 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 241664 -> 275968 bytes .../bin/en-US/PSInfisicalAPI.dll-Help.xml | 1531 +++++++++++++++++ .../en-US/PSInfisicalAPI.dll-Help.xml | 1531 +++++++++++++++++ build.ps1 | 81 +- .../CertificateMapperTests.cs | 38 + .../CsrAndRequestCmdletTests.cs | 479 ++++++ .../PemCertificateBuilderTests.cs | 5 + .../PkiClientParseTests.cs | 86 + .../PkiEndpointRegistryTests.cs | 61 + .../GetInfisicalCertificateAuthorityCmdlet.cs | 5 +- .../Cmdlets/GetInfisicalCertificateCmdlet.cs | 36 + .../Cmdlets/GetInfisicalCertificatesCmdlet.cs | 76 + .../InstallInfisicalCertificateCmdlet.cs | 3 +- .../RequestInfisicalCertificateCmdlet.cs | 204 +++ .../Endpoints/InfisicalEndpointNames.cs | 2 + .../Endpoints/InfisicalEndpointRegistry.cs | 44 + .../Models/InfisicalCertificateResult.cs | 23 + .../Models/InfisicalSignedCertificate.cs | 16 + src/PSInfisicalAPI/Pki/InfisicalCaDtos.cs | 21 + src/PSInfisicalAPI/Pki/InfisicalCaMapper.cs | 39 +- .../Pki/InfisicalCertificateRequestHelpers.cs | 338 ++++ src/PSInfisicalAPI/Pki/InfisicalCsrBuilder.cs | 201 +++ .../Pki/InfisicalLocalCertificateLookup.cs | 85 + src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 182 +- .../Pki/InfisicalPrivateKeyProtection.cs | 10 + .../Pki/InfisicalSignCertificateDtos.cs | 33 + 28 files changed, 5192 insertions(+), 44 deletions(-) create mode 100644 Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml create mode 100644 Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml create mode 100644 src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs create mode 100644 src/PSInfisicalAPI.Tests/PkiClientParseTests.cs create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs create mode 100644 src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs create mode 100644 src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs create mode 100644 src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCsrBuilder.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalLocalCertificateLookup.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalPrivateKeyProtection.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index da75758..6703ba2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,105 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.1825 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1820 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +- `Install-InfisicalCertificate` now routes chain certificates by self-signed status instead of dumping every chain entry into the Intermediate Certification Authorities store. Self-signed roots are installed into `StoreName.Root` (Trusted Root Certification Authorities) and non-self-signed intermediates are installed into `StoreName.CertificateAuthority` (Intermediate Certification Authorities). The leaf continues to use the user-specified `-StoreName`/`-StoreLocation` (default `My`/`CurrentUser`). `Request-InfisicalCertificate` already routed chain certs correctly; the same routing helper is now shared by both cmdlets. +- `InfisicalCertificateRequestHelpers` exposes a new public `GetChainCertificateTargetStore(X509Certificate2)` classifier and a new `InstallChain(IEnumerable, StoreLocation, bool, IInfisicalLogger, string)` overload. The existing `InstallChain(InfisicalSignedCertificate, ...)` overload now delegates to the new collection-based overload, so PKI chain-installation routing is centralized in one place. + +## 2026.06.04.1810 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +- Authored MAML help (`Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml`) covering all 39 exported cmdlets. Every entry includes a synopsis, description, notes section, and two examples: a one-liner and an `OrderedDictionary` splat (with `OrdinalIgnoreCase`) that includes preceding `Get-` resolver commands wherever IDs or slugs are required. +- `build.ps1` now stages the cmdlet help XML next to the deployed binary. After the publish step, every culture directory under `Module/PSInfisicalAPI/` (matching `xx` or `xx-XX`) that contains `PSInfisicalAPI.dll-Help.xml` is mirrored into `bin//`. The script hard-fails if `bin/en-US/PSInfisicalAPI.dll-Help.xml` is missing or contains zero `` entries. +- `Test-ModuleImports` in `build.ps1` now dynamically enumerates exported cmdlets via `Get-Command -Module PSInfisicalAPI -CommandType Cmdlet`, cross-checks the result against an expected list of 39 cmdlet names (including the previously-missing `Copy-InfisicalSecret`), and for each cmdlet asserts that `Get-Help -Full` returns a non-empty synopsis (rejecting PowerShell's auto-generated cmdlet-name fallback), a non-empty description, and that `Get-Help -Examples` returns at least one example node whose `` block is non-empty. + +## 2026.06.04.1808 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1658 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +- `Request-InfisicalCertificate` reuse path now falls back to the Infisical certificate-bundle endpoint when the local trust stores do not contain the issuing intermediates or root. The cmdlet builds the local chain first; if the result has no intermediates and no root, it fetches `GetCertificateBundle(serialNumber)` and rebuilds the result with the bundle's chain PEM merged in. A new `-LocalChainOnly` switch opts out of the bundle fetch for strict offline behavior. Bundle-fetch failures are logged at verbose level and the cmdlet returns the local-only result. +- `InfisicalCertificateRequestHelpers.BuildResultFromExistingLocal` adds a second overload that accepts an `InfisicalCertificateBundle`; when supplied, chain certs from the bundle are deduplicated by thumbprint and merged with the locally-resolved chain before classification. + +## 2026.06.04.1652 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1651 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1634 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1631 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1622 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +- **PKI contract fixes and cmdlet expansion**: + - `InfisicalPkiClient` no longer auto-injects `connection.ProjectId` into PKI CA list/retrieve calls; only the caller's explicit `-ProjectId` is forwarded so that cert-manager primary routes (which do not accept the query parameter) succeed. + - List/single CA and single certificate response parsing now tolerate raw arrays, wrapper objects (`{certificate: {...}}`, `{certificates: [...]}`), and nested `configuration` blocks. `InfisicalCaMapper` reads CA detail fields from `configuration` first, falling back to top-level. + - `RetrieveCertificate(connection, identifier)` added on `InfisicalPkiClient`. +- **New cmdlets**: + - **`Get-InfisicalCertificate`** — single-record retrieval by `-SerialNumber`/`-Id` (mandatory positional). + - **`Get-InfisicalCertificates`** — listing with light filtering (`-CommonName`, `-FriendlyName`, `-Status`, `-CaId`, `-Limit`, `-Offset`, `-NoAutoPage`). Auto-paginates by default. + - **`Request-InfisicalCertificate`** — generates a keypair locally (private key never leaves the device), submits a PKCS#10 CSR to either `pki-subscribers/{name}/sign-certificate` (`-PkiSubscriberSlug`) or `ca/{caId}/sign-certificate` (`-CertificateAuthorityId`), and returns a single `InfisicalCertificateResult` object with the leaf and chain pre-classified. The result exposes `Leaf : X509Certificate2`, `Intermediates : X509Certificate2[]`, `Root : X509Certificate2` (nullable), `Chain : X509Certificate2[]` (ordered leaf → intermediates → root, deduplicated by thumbprint), plus pass-through `SerialNumber`, `CertificatePem`, `CertificateChainPem`, and `PrivateKeyPem`. Supports `-Subject` (`IDictionary` with `CN`/`C`/`ST`/`L`/`O`/`OU`/`E` keys) merged with individual `-CommonName`/`-Country`/etc. parameters (individual params win), `-DnsName`/`-IpAddress` SANs (auto-populated from local FQDN when omitted). Idempotency: scans the local `X509Store` for an existing certificate matching `CN` and an Infisical-known serial number; returns the existing certificate wrapped in an `InfisicalCertificateResult` whose `Intermediates`/`Root`/`Chain` are populated by walking the local trust stores via `X509Chain` (no network calls, revocation checks disabled), and whose `CertificatePem`/`CertificateChainPem` are reconstructed from the resolved certs. Reuse is short-circuited unless `-Force` or `-AllowRenewal` (with optional `-RenewalThresholdDays`, default 30) requests a new one. Installation: `-Install` adds the leaf to `-StoreName`/`-StoreLocation` (default `My`/`CurrentUser`); `-InstallChain` additionally places intermediates into `CertificateAuthority` and self-signed roots into `Root` for the same `-StoreLocation`. `-KeyStorageFlags` is passed through to `X509Certificate2` import. + - **Multi-algorithm CSR support** on `Request-InfisicalCertificate` via split parameters: `-KeyAlgorithm` (`Rsa`/`Ecdsa`/`Ed25519`, default `Rsa`), `-KeySize` (`2048`/`3072`/`4096`, default `2048`, applies to RSA only), `-Curve` (`P256`/`P384`, default `P256`, applies to ECDSA only). Signature algorithms are picked automatically: SHA256WITHRSA for RSA, SHA256WITHECDSA / SHA384WITHECDSA for ECDSA P-256/P-384, and Ed25519 (pure-EdDSA) for Ed25519. The underlying `InfisicalCsrBuilder.Build(subject, dns, ip, options)` API was updated to take an `InfisicalCsrOptions` object in place of the prior `keySize` int. + - **Sign-certificate endpoint registrations**: `SignCertificateBySubscriber` and `SignCertificateByCa` registered with both `/api/v1/pki/...` and `/api/v1/cert-manager/...` candidate paths and marked `ContainsSecretMaterialInResponse = true`. + +## 2026.06.04.1554 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1512 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + +## 2026.06.04.1508 + +- Build produced from commit 19615363e356. + +## Unreleased (carried forward) + - **CI — Gitea artifact upload fix**: Replaced `actions/upload-artifact@v4` and `actions/download-artifact@v4` with the Gitea-compatible forks `christopherhx/gitea-upload-artifact@v4` and `christopherhx/gitea-download-artifact@v4` in `.gitea/workflows/publish-psgallery.yml`. The upstream v4 actions abort on Gitea because Gitea is detected as GHES, which the upstream v4 actions do not support (see [go-gitea/gitea#28853](https://github.com/go-gitea/gitea/issues/28853)). ## 2026.06.04.0123 diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index e0de7f0..5ffa120 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.0123' + ModuleVersion = '2026.06.04.1825' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -41,7 +41,10 @@ 'Update-InfisicalTag', 'Remove-InfisicalTag', 'Get-InfisicalCertificateAuthority', + 'Get-InfisicalCertificate', + 'Get-InfisicalCertificates', 'Search-InfisicalCertificate', + 'Request-InfisicalCertificate', 'ConvertTo-InfisicalCertificate', 'Install-InfisicalCertificate', 'Uninstall-InfisicalCertificate', @@ -57,7 +60,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '2cbd5c2008f5' + CommitHash = '19615363e356' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index e4308f8e79234bfda8890d715ee41923a3fcb18f..634d6d87badd09d7fd2f64c4c144439ae966c096 100644 GIT binary patch literal 275968 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 }^x=S?k%OR>PTJK*RY2&X&sfV{u#Ox)^M< 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 + + + + + Connect-Infisical + Establishes an authenticated session with an Infisical server and stores it for use by subsequent cmdlets. + Connect + Infisical + + + Authenticates against an Infisical instance using one of the supported auth providers (UniversalAuth, Token, JWT, OIDC, LDAP, Azure, GCP IAM) and stores the resulting connection in the module-level session manager. Subsequent cmdlets pick up the connection automatically. If parameters such as BaseUri, OrganizationId, ProjectId, Environment, ClientId, or ClientSecret are not supplied, the cmdlet attempts to resolve them from a curated list of environment-variable name patterns across Process, User, and Machine scopes. + + + Notes + + Use -PassThru to emit the resulting InfisicalConnection object; by default the connection is stored silently. SecureString-typed parameters such as ClientSecret, AccessToken, Jwt, and Password are never logged. + The cmdlet pins the API version to the bound value when -ApiVersion is supplied explicitly; otherwise the default 'v4' is used and remains overridable per-call. + + + + + EXAMPLE 1 + Connect-Infisical -BaseUri 'https://app.infisical.com' -ClientId $ClientId -ClientSecret $ClientSecret -OrganizationId $OrgId -ProjectId $ProjectId -Environment 'dev' + Performs a Universal-Auth machine-identity login and stores the resulting session for subsequent cmdlets. + + + EXAMPLE 2 + $ConnectInfisicalParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ConnectInfisicalParameters.BaseUri = 'https://app.infisical.com' +$ConnectInfisicalParameters.OrganizationId = $OrganizationId +$ConnectInfisicalParameters.ProjectId = $ProjectId +$ConnectInfisicalParameters.Environment = 'dev' +$ConnectInfisicalParameters.ClientId = $ClientId +$ConnectInfisicalParameters.ClientSecret = $ClientSecret +$ConnectInfisicalParameters.SecretPath = '/' +$ConnectInfisicalParameters.ApiVersion = 'v4' +$ConnectInfisicalParameters.PassThru = $True +$ConnectInfisicalParameters.Verbose = $True + +$ConnectInfisicalResult = Connect-Infisical @ConnectInfisicalParameters + Builds an ordered parameter dictionary, splats it onto Connect-Infisical, and captures the returned InfisicalConnection for later reuse. + + + + + + + Disconnect-Infisical + Clears the current Infisical session from the module-level session manager. + Disconnect + Infisical + + + Removes the cached InfisicalConnection so subsequent cmdlets that require an active session will fail until Connect-Infisical is invoked again. The cmdlet does not contact the Infisical server. + + + Notes + + Use -PassThru to receive a status object that includes the disconnect timestamp; by default the cmdlet returns no output. + + + + + EXAMPLE 1 + Disconnect-Infisical + Clears the active Infisical session silently. + + + EXAMPLE 2 + $DisconnectInfisicalParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$DisconnectInfisicalParameters.PassThru = $True +$DisconnectInfisicalParameters.Verbose = $True + +$DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters + Disconnects and captures a status object that includes IsConnected and DisconnectedAtUtc for logging. + + + + + + + Get-InfisicalSecret + Retrieves a single Infisical secret by name from the active session's project and environment. + Get + InfisicalSecret + + + Fetches a single secret by name. Project, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection but can be overridden per call. Optional flags request reference-expansion, import inclusion, or a specific historical version. + + + Notes + + The returned InfisicalSecret stores the value as SecureString; call .GetPlainTextValue() to materialize the cleartext value only when strictly required. + + + + + EXAMPLE 1 + Get-InfisicalSecret -SecretName 'DATABASE_URL' + Retrieves the DATABASE_URL secret from the project and environment pinned by Connect-Infisical. + + + EXAMPLE 2 + $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalSecretParameters.SecretName = 'DATABASE_URL' +$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalSecretParameters.ExpandSecretReferences = $True +$GetInfisicalSecretParameters.IncludeImports = $True +$GetInfisicalSecretParameters.Verbose = $True + +$GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters + Retrieves a single secret from a script-specific subpath with secret-reference expansion and folder imports enabled. + + + + + + + Get-InfisicalSecrets + Lists Infisical secrets within a project, environment, and optional folder path. + Get + InfisicalSecrets + + + Enumerates secrets under the active session's project and environment, optionally recursing through subfolders. Supports metadata-based filtering, tag-slug filtering, secret-reference expansion, and personal-override inclusion. + + + Notes + + Use -Recursive together with -SecretPath to walk an entire folder subtree. Pipe the result into ConvertTo-InfisicalSecretDictionary for hashtable-style lookup. + + + + + EXAMPLE 1 + Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + Lists every secret under /Windows in the active project and environment. + + + EXAMPLE 2 + $GetInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalSecretsParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalSecretsParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretsParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalSecretsParameters.Recursive = $True +$GetInfisicalSecretsParameters.ExpandSecretReferences = $True +$GetInfisicalSecretsParameters.IncludeImports = $True +$GetInfisicalSecretsParameters.IncludePersonalOverrides = $True +$GetInfisicalSecretsParameters.Verbose = $True + +$GetInfisicalSecretsResult = Get-InfisicalSecrets @GetInfisicalSecretsParameters + Lists secrets under a script-specific subpath with imports, personal overrides, and reference expansion enabled. + + + + + + + New-InfisicalSecret + Creates a new Infisical secret, with support for SecureString values and bulk creation. + New + InfisicalSecret + + + Creates one or many secrets. Three parameter sets are supported: PlainText (SecretName + SecretValue), SecureString (SecretName + SecureSecretValue), and Bulk (an array of hashtables piped or supplied via -Secrets). Honors -WhatIf and -Confirm. + + + Notes + + Pass -SkipMultilineEncoding when the value already contains literal newlines that the server should preserve verbatim. Use -TagIds to attach tag references at creation time. + + + + + EXAMPLE 1 + New-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'super-secret-value' + Creates a single shared secret in the active project/environment. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags -ProjectId $ConnectInfisicalParameters.ProjectId + +$NewInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalSecretParameters.SecretName = 'API_KEY' +$NewInfisicalSecretParameters.SecretValue = 'super-secret-value' +$NewInfisicalSecretParameters.SecretComment = 'Issued by deployment pipeline' +$NewInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagsResult[0].Id) +$NewInfisicalSecretParameters.Verbose = $True + +$NewInfisicalSecretResult = New-InfisicalSecret @NewInfisicalSecretParameters + Looks up tags to attach, then creates a single secret with a comment and tag association under a script-specific subpath. + + + + + + + Update-InfisicalSecret + Updates an existing Infisical secret value, comment, name, or tags. + Update + InfisicalSecret + + + Updates one or many secrets. Supports PlainText, SecureString, and Bulk parameter sets. Use -NewSecretName to rename a secret, -SecretComment to update its comment, and -TagIds to replace tag associations. Honors -WhatIf and -Confirm. + + + Notes + + Only the parameters you bind are sent; omitted scalar parameters are not modified server-side. The Bulk parameter set accepts pipeline input of hashtables containing SecretName/SecretValue/etc. + + + + + EXAMPLE 1 + Update-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'rotated-value' + Rotates the API_KEY secret in the active project/environment. + + + EXAMPLE 2 + $UpdateInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalSecretParameters.SecretName = 'API_KEY' +$UpdateInfisicalSecretParameters.NewSecretName = 'API_KEY_V2' +$UpdateInfisicalSecretParameters.SecretValue = 'rotated-value' +$UpdateInfisicalSecretParameters.SecretComment = 'Rotated by scheduled job' +$UpdateInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$UpdateInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$UpdateInfisicalSecretParameters.Verbose = $True + +$UpdateInfisicalSecretResult = Update-InfisicalSecret @UpdateInfisicalSecretParameters + Rotates the value, renames the secret, and updates its comment in a single call. + + + + + + + Remove-InfisicalSecret + Deletes one or many Infisical secrets by name. + Remove + InfisicalSecret + + + Deletes a single secret (Single parameter set) or a batch of secrets by name (Bulk parameter set). High ConfirmImpact triggers prompts by default. -PassThru emits the removed secret names. + + + Notes + + Removal is irreversible from this cmdlet's perspective; rely on Infisical's audit log or secret-version history for forensics. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalSecret -SecretName 'API_KEY_V1' -Confirm:$False + Deletes a single secret without prompting. + + + EXAMPLE 2 + $RemoveInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalSecretParameters.SecretNames = @('LEGACY_KEY_1','LEGACY_KEY_2','LEGACY_KEY_3') +$RemoveInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$RemoveInfisicalSecretParameters.PassThru = $True +$RemoveInfisicalSecretParameters.Confirm = $False +$RemoveInfisicalSecretParameters.Verbose = $True + +$RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretParameters + Bulk-deletes three legacy secrets and returns the removed names for audit logging. + + + + + + + Copy-InfisicalSecret + Duplicates one or more secrets into a different environment or secret path. + Copy + InfisicalSecret + + + Server-side duplicates an array of secret IDs into a destination environment (and optional destination path), with switches that control whether the value, comment, tags, and metadata are copied. Use Get-InfisicalSecrets followed by selection of the desired Id values to feed -SecretId. + + + Notes + + Set -OverwriteExisting to replace same-named secrets at the destination. Without -CopySecretValue, the destination secrets are created with empty values, preserving only metadata. + + + + + EXAMPLE 1 + Get-InfisicalSecrets | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue + Copies all secrets from the active environment into 'staging', including their values. + + + EXAMPLE 2 + $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + +$CopyInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretsResult.Id +$CopyInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$CopyInfisicalSecretParameters.SourceEnvironment = $ConnectInfisicalParameters.Environment +$CopyInfisicalSecretParameters.SourceSecretPath = '/Windows' +$CopyInfisicalSecretParameters.DestinationEnvironment = 'staging' +$CopyInfisicalSecretParameters.DestinationSecretPath = '/Windows' +$CopyInfisicalSecretParameters.OverwriteExisting = $True +$CopyInfisicalSecretParameters.CopySecretValue = $True +$CopyInfisicalSecretParameters.CopySecretComment = $True +$CopyInfisicalSecretParameters.CopyTags = $True +$CopyInfisicalSecretParameters.CopyMetadata = $True +$CopyInfisicalSecretParameters.Verbose = $True + +$CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters + Promotes every Windows secret from the active environment into staging with full value/comment/tag/metadata propagation. + + + + + + + ConvertTo-InfisicalSecretDictionary + Converts a stream of InfisicalSecret objects into a name-keyed Dictionary of SecureString or plain text values. + ConvertTo + InfisicalSecretDictionary + + + Aggregates an incoming pipeline of InfisicalSecret objects into a case-insensitive Dictionary keyed by SecretName. By default values are SecureString; pass -AsPlainText to materialize string values. Duplicate keys are handled via the -DuplicateKeyBehavior parameter (Error, FirstWins, LastWins). + + + Notes + + Use this conversion before splatting secrets into another process (-AsPlainText) or before passing them to libraries that expect SecureString-keyed lookups (default). + + + + + EXAMPLE 1 + Get-InfisicalSecrets | ConvertTo-InfisicalSecretDictionary -AsPlainText + Builds a plain-text dictionary of every secret in the active environment. + + + EXAMPLE 2 + $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + +$ConvertToInfisicalSecretDictionaryParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretsResult +$ConvertToInfisicalSecretDictionaryParameters.DuplicateKeyBehavior = 'LastWins' +$ConvertToInfisicalSecretDictionaryParameters.AsPlainText = $True +$ConvertToInfisicalSecretDictionaryParameters.Verbose = $True + +$ConvertToInfisicalSecretDictionaryResult = ConvertTo-InfisicalSecretDictionary @ConvertToInfisicalSecretDictionaryParameters + Aggregates recursive secret results into a plain-text dictionary, with the last value winning on key collisions. + + + + + + + Export-InfisicalSecrets + Exports InfisicalSecret objects to disk or environment variables in a chosen file format. + Export + InfisicalSecrets + + + Buffers an incoming pipeline of InfisicalSecret objects and writes them to a file in the requested format (DotEnv, Json, Yaml, EnvironmentVariables, etc.) or sets them as environment variables on the chosen scope (Process, User, Machine). -Encoding controls text encoding for file outputs. + + + Notes + + EnvironmentVariables format does not require -Path; all other formats do. User/Machine scopes require appropriate privileges (Machine scope requires elevation on Windows). + + + + + EXAMPLE 1 + Get-InfisicalSecrets | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force + Writes the active environment's secrets to a .env file. + + + EXAMPLE 2 + $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + +$ExportInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretsResult +$ExportInfisicalSecretsParameters.Format = 'EnvironmentVariables' +$ExportInfisicalSecretsParameters.Scope = 'Process' +$ExportInfisicalSecretsParameters.Force = $True +$ExportInfisicalSecretsParameters.Verbose = $True + +$ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsParameters + Projects the recursive secret result into Process-scope environment variables for the current PowerShell session. + + + + + + + Get-InfisicalProjects + Lists Infisical projects accessible to the current identity. + Get + InfisicalProjects + + + Returns every project the active session can see. The cmdlet requires an active InfisicalConnection but takes no parameters; project visibility is governed by Infisical's role assignments. + + + Notes + + The result is an array of InfisicalProject objects; pipe into Where-Object or Select-Object to filter by Slug, Name, or Id. + + + + + EXAMPLE 1 + Get-InfisicalProjects + Lists every project the current session can see. + + + EXAMPLE 2 + $GetInfisicalProjectsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalProjectsParameters.Verbose = $True + +$GetInfisicalProjectsResult = Get-InfisicalProjects @GetInfisicalProjectsParameters | Where-Object { $_.Slug -ilike 'platform-*' } + Lists projects and filters down to those whose slug begins with 'platform-'. + + + + + + + Get-InfisicalProject + Retrieves a single Infisical project by its identifier. + Get + InfisicalProject + + + Retrieves one project by Id. If -ProjectId is not supplied, the cmdlet falls back to the ProjectId pinned on the active InfisicalConnection. + + + Notes + + The cmdlet accepts pipeline input by property name; objects emitted by Get-InfisicalProjects can be piped in directly to refresh a single record. + + + + + EXAMPLE 1 + Get-InfisicalProject + Retrieves the project pinned by the active session. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects + +$GetInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult[0].Id +$GetInfisicalProjectParameters.Verbose = $True + +$GetInfisicalProjectResult = Get-InfisicalProject @GetInfisicalProjectParameters + Looks up the first project in the list and retrieves its full record. + + + + + + + New-InfisicalProject + Creates a new Infisical project in the active organization. + New + InfisicalProject + + + Creates a project with the supplied name and optional slug, description, type, and organization id. If -OrganizationId is not supplied, the active session's organization is used. Honors -WhatIf and -Confirm. + + + Notes + + Slug must be unique within the organization; if not supplied, the server derives one from the project name. + + + + + EXAMPLE 1 + New-InfisicalProject -ProjectName 'Platform Telemetry' + Creates a new project named 'Platform Telemetry' in the active organization. + + + EXAMPLE 2 + $NewInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalProjectParameters.ProjectName = 'Platform Telemetry' +$NewInfisicalProjectParameters.Slug = 'platform-telemetry' +$NewInfisicalProjectParameters.Description = 'Secrets for platform telemetry pipeline' +$NewInfisicalProjectParameters.Type = 'secret-manager' +$NewInfisicalProjectParameters.OrganizationId = $ConnectInfisicalParameters.OrganizationId +$NewInfisicalProjectParameters.Verbose = $True + +$NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters + Creates a project with an explicit slug, description, and type bound to a specific organization id. + + + + + + + Update-InfisicalProject + Updates the name, description, or auto-capitalization flag on an existing project. + Update + InfisicalProject + + + Updates mutable attributes on a project. -ProjectId defaults to the pinned session project when omitted. Only parameters that are bound are sent to the server. Honors -WhatIf and -Confirm. + + + Notes + + AutoCapitalization controls whether secret names submitted in mixed case are stored uppercase server-side; setting it false preserves the literal case supplied by clients. + + + + + EXAMPLE 1 + Update-InfisicalProject -Name 'Platform Telemetry (v2)' + Renames the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$UpdateInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$UpdateInfisicalProjectParameters.Name = 'Platform Telemetry (v2)' +$UpdateInfisicalProjectParameters.Description = 'Migrated to v2 pipeline' +$UpdateInfisicalProjectParameters.AutoCapitalization = $False +$UpdateInfisicalProjectParameters.Verbose = $True + +$UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectParameters + Locates the project by slug, renames it, updates the description, and disables auto-capitalization. + + + + + + + Remove-InfisicalProject + Deletes an Infisical project. + Remove + InfisicalProject + + + Deletes a project by Id. Defaults to the session-pinned project when -ProjectId is omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed project id. + + + Notes + + This is destructive and removes all secrets, environments, folders, and tags within the project. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalProject -Confirm:$False + Deletes the session-pinned project without prompting. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'sandbox-temp' } + +$RemoveInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$RemoveInfisicalProjectParameters.PassThru = $True +$RemoveInfisicalProjectParameters.Confirm = $False +$RemoveInfisicalProjectParameters.Verbose = $True + +$RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectParameters + Finds the sandbox project by slug, removes it without confirmation, and emits the removed project id for logging. + + + + + + + Get-InfisicalEnvironments + Lists environments defined on an Infisical project. + Get + InfisicalEnvironments + + + Returns all environments configured on a project. -ProjectId defaults to the session-pinned project id when omitted. + + + Notes + + Each InfisicalEnvironment carries both Id and Slug; downstream cmdlets accept either form on -Environment-like parameters. + + + + + EXAMPLE 1 + Get-InfisicalEnvironments + Lists environments for the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$GetInfisicalEnvironmentsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalEnvironmentsParameters.ProjectId = $GetInfisicalProjectsResult.Id +$GetInfisicalEnvironmentsParameters.Verbose = $True + +$GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments @GetInfisicalEnvironmentsParameters + Resolves a project by slug and lists every environment defined on it. + + + + + + + Get-InfisicalEnvironment + Retrieves a single Infisical environment by slug or id. + Get + InfisicalEnvironment + + + Returns one environment record by slug or id (-EnvironmentSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Accepts pipeline input by property name so InfisicalEnvironment objects from Get-InfisicalEnvironments can be refreshed directly. + + + + + EXAMPLE 1 + Get-InfisicalEnvironment -EnvironmentSlugOrId 'dev' + Retrieves the 'dev' environment from the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'dev' } + +$GetInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalEnvironmentParameters.EnvironmentSlugOrId = $GetInfisicalEnvironmentsResult.Slug +$GetInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalEnvironmentParameters.Verbose = $True + +$GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironmentParameters + Looks up the dev environment by slug and re-fetches the canonical record by slug or id. + + + + + + + New-InfisicalEnvironment + Creates a new environment on an Infisical project. + New + InfisicalEnvironment + + + Creates an environment with the supplied display name and slug, optionally setting its sort -Position. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Slugs must be unique within the project and are used as the canonical -Environment value across all other cmdlets. + + + + + EXAMPLE 1 + New-InfisicalEnvironment -Name 'Staging' -Slug 'staging' + Adds a Staging environment to the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$NewInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectsResult.Id +$NewInfisicalEnvironmentParameters.Name = 'Staging' +$NewInfisicalEnvironmentParameters.Slug = 'staging' +$NewInfisicalEnvironmentParameters.Position = 20 +$NewInfisicalEnvironmentParameters.Verbose = $True + +$NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironmentParameters + Adds a Staging environment at sort position 20 on the resolved project. + + + + + + + Update-InfisicalEnvironment + Updates the name, slug, or sort order of an existing Infisical environment. + Update + InfisicalEnvironment + + + Updates an environment identified by -EnvironmentId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + + + Notes + + Changing -Slug can break downstream automation that pins to the previous slug. Coordinate slug rotation with consumers. + + + + + EXAMPLE 1 + Update-InfisicalEnvironment -EnvironmentId $EnvId -Name 'Pre-Production' + Renames an environment in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'staging' } + +$UpdateInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$UpdateInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalEnvironmentParameters.Name = 'Pre-Production' +$UpdateInfisicalEnvironmentParameters.Slug = 'preprod' +$UpdateInfisicalEnvironmentParameters.Position = 25 +$UpdateInfisicalEnvironmentParameters.Verbose = $True + +$UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisicalEnvironmentParameters + Locates the staging environment, renames it to Pre-Production, rotates its slug, and updates its sort order. + + + + + + + Remove-InfisicalEnvironment + Deletes an Infisical environment from a project. + Remove + InfisicalEnvironment + + + Removes an environment by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed environment id. + + + Notes + + Removing an environment deletes every secret and folder scoped to it. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalEnvironment -EnvironmentId $EnvId -Confirm:$False + Deletes an environment without prompting. + + + EXAMPLE 2 + $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'sandbox' } + +$RemoveInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$RemoveInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalEnvironmentParameters.PassThru = $True +$RemoveInfisicalEnvironmentParameters.Confirm = $False +$RemoveInfisicalEnvironmentParameters.Verbose = $True + +$RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisicalEnvironmentParameters + Removes the sandbox environment without prompting and emits its id for the audit trail. + + + + + + + Get-InfisicalFolders + Lists Infisical folders at a given secret path. + Get + InfisicalFolders + + + Enumerates folders directly under the supplied -Path within the active project and environment. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. + + + Notes + + This is a non-recursive listing of immediate subfolders. To enumerate secrets across a folder subtree use Get-InfisicalSecrets -Recursive. + + + + + EXAMPLE 1 + Get-InfisicalFolders -Path '/Windows' + Lists every folder directly under /Windows in the active project and environment. + + + EXAMPLE 2 + $GetInfisicalFoldersParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalFoldersParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalFoldersParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalFoldersParameters.Path = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalFoldersParameters.Verbose = $True + +$GetInfisicalFoldersResult = Get-InfisicalFolders @GetInfisicalFoldersParameters + Lists folders under a script-specific subpath using the session-pinned project and environment. + + + + + + + Get-InfisicalFolder + Retrieves a single Infisical folder by name or id. + Get + InfisicalFolder + + + Returns one folder record by name or id (-FolderNameOrId) under the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. + + + Notes + + Accepts pipeline input by property name so InfisicalFolder objects from Get-InfisicalFolders can be refreshed directly. + + + + + EXAMPLE 1 + Get-InfisicalFolder -FolderNameOrId 'Deployments' -Path '/Windows' + Retrieves the Deployments folder under /Windows in the active project and environment. + + + EXAMPLE 2 + $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + +$GetInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFoldersResult.Id +$GetInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalFolderParameters.Path = '/Windows' +$GetInfisicalFolderParameters.Verbose = $True + +$GetInfisicalFolderResult = Get-InfisicalFolder @GetInfisicalFolderParameters + Locates the folder by name first, then re-fetches it by id to refresh the canonical record. + + + + + + + New-InfisicalFolder + Creates a new Infisical folder under the supplied parent path. + New + InfisicalFolder + + + Creates a folder with the supplied -Name beneath the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Folder names are case-sensitive and must be unique within a parent path; the cmdlet does not create intermediate folders. + + + + + EXAMPLE 1 + New-InfisicalFolder -Name 'Deployments' -Path '/Windows' + Creates the Deployments folder under /Windows in the active project and environment. + + + EXAMPLE 2 + $NewInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalFolderParameters.Name = $CallingScriptPath.BaseName +$NewInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalFolderParameters.Path = '/Windows' +$NewInfisicalFolderParameters.Verbose = $True + +$NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters + Creates a script-named folder under /Windows using the session-pinned project and environment. + + + + + + + Update-InfisicalFolder + Renames an existing Infisical folder. + Update + InfisicalFolder + + + Renames a folder identified by -FolderId to the supplied -Name. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Renaming a folder rewrites the path component for every secret beneath it; coordinate with consumers that pin to the previous path. + + + + + EXAMPLE 1 + Update-InfisicalFolder -FolderId $FolderId -Name 'Deployments-Archive' + Renames a folder in the session-pinned project/environment. + + + EXAMPLE 2 + $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + +$UpdateInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$UpdateInfisicalFolderParameters.Name = 'Deployments-Archive' +$UpdateInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$UpdateInfisicalFolderParameters.Path = '/Windows' +$UpdateInfisicalFolderParameters.Verbose = $True + +$UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderParameters + Resolves the folder by name and renames it to Deployments-Archive. + + + + + + + Remove-InfisicalFolder + Deletes an Infisical folder and all secrets it contains. + Remove + InfisicalFolder + + + Removes a folder by Id from the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed folder id. + + + Notes + + This is destructive and removes every secret and subfolder under the target folder. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalFolder -FolderId $FolderId -Confirm:$False + Deletes a folder from the session-pinned project/environment without prompting. + + + EXAMPLE 2 + $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq $CallingScriptPath.BaseName } + +$RemoveInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$RemoveInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalFolderParameters.Path = '/Windows' +$RemoveInfisicalFolderParameters.PassThru = $True +$RemoveInfisicalFolderParameters.Confirm = $False +$RemoveInfisicalFolderParameters.Verbose = $True + +$RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderParameters + Resolves the script-named folder under /Windows and removes it without prompting, returning its id for logging. + + + + + + + Get-InfisicalTags + Lists Infisical tags defined on a project. + Get + InfisicalTags + + + Returns every tag configured on a project. -ProjectId defaults to the session-pinned project id when omitted. + + + Notes + + Tag Ids returned here are the values to pass on -TagIds when creating or updating secrets. + + + + + EXAMPLE 1 + Get-InfisicalTags + Lists every tag defined on the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$GetInfisicalTagsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalTagsParameters.ProjectId = $GetInfisicalProjectsResult.Id +$GetInfisicalTagsParameters.Verbose = $True + +$GetInfisicalTagsResult = Get-InfisicalTags @GetInfisicalTagsParameters + Resolves a project by slug and lists every tag defined on it. + + + + + + + Get-InfisicalTag + Retrieves a single Infisical tag by slug or id. + Get + InfisicalTag + + + Returns one tag record by slug or id (-TagSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Accepts pipeline input by property name so InfisicalTag objects from Get-InfisicalTags can be refreshed directly. + + + + + EXAMPLE 1 + Get-InfisicalTag -TagSlugOrId 'critical' + Retrieves the 'critical' tag from the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + +$GetInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalTagParameters.TagSlugOrId = $GetInfisicalTagsResult.Slug +$GetInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalTagParameters.Verbose = $True + +$GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters + Filters tags to the critical slug and refetches the canonical record. + + + + + + + New-InfisicalTag + Creates a new Infisical tag on a project. + New + InfisicalTag + + + Creates a tag with the supplied -Slug, optional -Name and -Color. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Tag slugs must be unique within the project and are the canonical reference used by tag-filtered secret lookups. + + + + + EXAMPLE 1 + New-InfisicalTag -Slug 'critical' -Name 'Critical' -Color '#FF0000' + Creates a red Critical tag in the session-pinned project. + + + EXAMPLE 2 + $NewInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalTagParameters.Slug = 'critical' +$NewInfisicalTagParameters.Name = 'Critical' +$NewInfisicalTagParameters.Color = '#FF0000' +$NewInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalTagParameters.Verbose = $True + +$NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters + Creates a red Critical tag against an explicitly supplied project id. + + + + + + + Update-InfisicalTag + Updates the slug, name, or color of an existing Infisical tag. + Update + InfisicalTag + + + Updates a tag identified by -TagId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + + + Notes + + Changing -Slug breaks tag-filtered automation that pins to the previous slug. Coordinate slug rotation with consumers. + + + + + EXAMPLE 1 + Update-InfisicalTag -TagId $TagId -Color '#FFA500' + Changes the display color of a tag in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + +$UpdateInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$UpdateInfisicalTagParameters.Slug = 'critical-v2' +$UpdateInfisicalTagParameters.Name = 'Critical (v2)' +$UpdateInfisicalTagParameters.Color = '#FFA500' +$UpdateInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalTagParameters.Verbose = $True + +$UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters + Locates the critical tag and rotates its slug, display name, and color. + + + + + + + Remove-InfisicalTag + Deletes an Infisical tag from a project. + Remove + InfisicalTag + + + Removes a tag by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed tag id. + + + Notes + + Removing a tag detaches it from every secret it was applied to but does not delete the secrets themselves. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalTag -TagId $TagId -Confirm:$False + Deletes a tag from the session-pinned project without prompting. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical-v2' } + +$RemoveInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$RemoveInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalTagParameters.PassThru = $True +$RemoveInfisicalTagParameters.Confirm = $False +$RemoveInfisicalTagParameters.Verbose = $True + +$RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters + Resolves a tag by slug and removes it without prompting, returning its id for the audit trail. + + + + + + + Get-InfisicalCertificateAuthority + Lists or retrieves Infisical internal Certificate Authorities. + Get + InfisicalCertificateAuthority + + + When -CaId is supplied (ById parameter set) returns a single CA. Otherwise (List parameter set) returns every internal CA visible in the project. -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Only internal CAs are surfaced; external/ACME issuers are not enumerated by this cmdlet. CA Ids returned here are the values to pass on -CertificateAuthorityId to Request-InfisicalCertificate. + + + + + EXAMPLE 1 + Get-InfisicalCertificateAuthority + Lists every internal CA visible in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } + +$GetInfisicalCertificateAuthorityParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateAuthorityParameters.CaId = $GetInfisicalCertificateAuthorityListResult.Id +$GetInfisicalCertificateAuthorityParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateAuthorityParameters.Verbose = $True + +$GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @GetInfisicalCertificateAuthorityParameters + Filters the CA list by friendly name and then re-fetches the canonical CA record by id. + + + + + + + Get-InfisicalCertificates + Lists Infisical certificates in a project, with optional filters and automatic paging. + Get + InfisicalCertificates + + + Enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId. -Limit and -Offset drive a single page; pages are walked automatically until exhausted unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + For advanced filtering (validity window, key algorithm, extended key usage, etc.) use Search-InfisicalCertificate instead. + + + + + EXAMPLE 1 + Get-InfisicalCertificates -Status 'active' + Lists every active certificate in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } + +$GetInfisicalCertificatesParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificatesParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificatesParameters.CommonName = $env:COMPUTERNAME +$GetInfisicalCertificatesParameters.FriendlyName = 'web-tier' +$GetInfisicalCertificatesParameters.Status = 'active' +$GetInfisicalCertificatesParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) +$GetInfisicalCertificatesParameters.Limit = 100 +$GetInfisicalCertificatesParameters.Verbose = $True + +$GetInfisicalCertificatesResult = Get-InfisicalCertificates @GetInfisicalCertificatesParameters + Resolves the issuing CA, then lists active certificates scoped to that CA, the local hostname, and the 'web-tier' friendly name. + + + + + + + Get-InfisicalCertificate + Retrieves a single Infisical certificate by serial number. + Get + InfisicalCertificate + + + Returns one certificate record by -SerialNumber. Accepts pipeline input by property name so InfisicalCertificate objects from list/search cmdlets can be re-fetched directly. + + + Notes + + This returns metadata only. To obtain certificate and chain PEM material use ConvertTo-InfisicalCertificate or Export-InfisicalCertificate. + + + + + EXAMPLE 1 + Get-InfisicalCertificate -SerialNumber '7A:F2:1B:...:9E' + Retrieves the certificate record for the supplied serial number. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$GetInfisicalCertificateParameters.Verbose = $True + +$GetInfisicalCertificateResult = Get-InfisicalCertificate @GetInfisicalCertificateParameters + Selects the active certificate whose common name matches the host and refetches its canonical record. + + + + + + + Search-InfisicalCertificate + Searches Infisical certificates with advanced filters and automatic paging. + Search + InfisicalCertificate + + + Performs a server-side search across certificates with filters for friendly name, common name, free-text search, status, CA/profile/application/enrollment scope, key/signature algorithm, source, and validity window (-NotBeforeFrom/-NotBeforeTo/-NotAfterFrom/-NotAfterTo). Results are paged automatically unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Use -SortBy together with -SortOrder ('asc'/'desc') to control result ordering. Pair with Get-InfisicalCertificate or Export-InfisicalCertificate to drill into specific hits. + + + + + EXAMPLE 1 + Search-InfisicalCertificate -Search $env:COMPUTERNAME -Status 'active' + Finds active certificates whose searchable fields contain the local hostname. + + + EXAMPLE 2 + $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } + +$SearchInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$SearchInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$SearchInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME +$SearchInfisicalCertificateParameters.Status = 'active' +$SearchInfisicalCertificateParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) +$SearchInfisicalCertificateParameters.KeyAlgorithm = @('RSA') +$SearchInfisicalCertificateParameters.NotAfterTo = (Get-Date).AddDays(30) +$SearchInfisicalCertificateParameters.SortBy = 'notAfter' +$SearchInfisicalCertificateParameters.SortOrder = 'asc' +$SearchInfisicalCertificateParameters.Limit = 100 +$SearchInfisicalCertificateParameters.Verbose = $True + +$SearchInfisicalCertificateResult = Search-InfisicalCertificate @SearchInfisicalCertificateParameters + Searches for RSA certificates from a specific CA, scoped to the local hostname, that expire within the next 30 days, sorted soonest-first. + + + + + + + Request-InfisicalCertificate + Requests a new Infisical certificate (local CSR + sign) or reuses a still-valid existing one. + Request + InfisicalCertificate + + + Generates a keypair locally, builds a CSR, and submits it for signing either via a PKI subscriber (-PkiSubscriberSlug, default parameter set) or by direct CA signing (-CertificateAuthorityId). On subsequent runs an existing certificate whose CN matches and whose remaining lifetime exceeds -RenewalThresholdDays is reused; pass -Force to always issue or -AllowRenewal to allow rotation inside the threshold. Optional flags install the leaf (-Install) and chain (-InstallChain) into a Windows certificate store, and control private-key protection (-PrivateKeyProtection, -PersistKey, -MachineKey, -PrivateKeyPath, -KeyStorageFlags). Honors -WhatIf and -Confirm. + + + Notes + + Default -PrivateKeyProtection is 'LocalOnly': the leaf is loaded into memory without persisting the private key and PrivateKeyPem is scrubbed from the emitted result unless -PrivateKeyPath or an explicit -KeyStorageFlags binding overrides it. The reuse path completes its chain from the Infisical bundle when local stores are incomplete; pass -LocalChainOnly to suppress that fetch entirely. + + + + + EXAMPLE 1 + Request-InfisicalCertificate -PkiSubscriberSlug 'web-tier' -Install + Requests (or reuses) a certificate for the 'web-tier' subscriber and installs it into CurrentUser\My. + + + EXAMPLE 2 + $RequestInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RequestInfisicalCertificateParameters.PkiSubscriberSlug = 'web-tier' +$RequestInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RequestInfisicalCertificateParameters.CommonName = ([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName +$RequestInfisicalCertificateParameters.DnsName = @(([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName, $env:COMPUTERNAME) +$RequestInfisicalCertificateParameters.KeyAlgorithm = 'Rsa' +$RequestInfisicalCertificateParameters.KeySize = 3072 +$RequestInfisicalCertificateParameters.Install = $True +$RequestInfisicalCertificateParameters.InstallChain = $True +$RequestInfisicalCertificateParameters.StoreName = 'My' +$RequestInfisicalCertificateParameters.StoreLocation = 'LocalMachine' +$RequestInfisicalCertificateParameters.PrivateKeyProtection = 'NonExportable' +$RequestInfisicalCertificateParameters.MachineKey = $True +$RequestInfisicalCertificateParameters.PersistKey = $True +$RequestInfisicalCertificateParameters.AllowRenewal = $True +$RequestInfisicalCertificateParameters.RenewalThresholdDays = 30 +$RequestInfisicalCertificateParameters.Verbose = $True + +$RequestInfisicalCertificateResult = Request-InfisicalCertificate @RequestInfisicalCertificateParameters + Issues (or renews within 30 days) a 3072-bit RSA certificate for the local FQDN, installs the leaf and chain into LocalMachine\My with a non-exportable machine-bound persistent key. + + + + + + + ConvertTo-InfisicalCertificate + Materializes an X509Certificate2 from an Infisical certificate record, bundle, or serial number. + ConvertTo + InfisicalCertificate + + + Fetches the certificate bundle (when given an InfisicalCertificate or -SerialNumber), or accepts an already-fetched -Bundle, and constructs an X509Certificate2 from the PEM material. Use -NoPrivateKey to omit the private key, -KeyStorageFlags to control how the key is loaded, and -IncludeChain to additionally emit each chain certificate as a separate X509Certificate2 in the pipeline. + + + Notes + + The bundle for any given certificate is typically retrievable only once after issuance; -SerialNumber and pipeline modes will fail with a bundle-not-available error for older certificates. Use -KeyStorageFlags Exportable when callers need to re-export the resulting cert as PFX. + + + + + EXAMPLE 1 + Get-InfisicalCertificate -SerialNumber $Serial | ConvertTo-InfisicalCertificate -IncludeChain + Materializes the certificate and emits each chain element individually. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$ConvertToInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ConvertToInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ConvertToInfisicalCertificateParameters.NoPrivateKey = $False +$ConvertToInfisicalCertificateParameters.IncludeChain = $True +$ConvertToInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable +$ConvertToInfisicalCertificateParameters.Verbose = $True + +$ConvertToInfisicalCertificateResult = ConvertTo-InfisicalCertificate @ConvertToInfisicalCertificateParameters + Selects the active certificate whose CN matches the host and materializes it (with private key and chain) as exportable X509Certificate2 objects. + + + + + + + Export-InfisicalCertificate + Exports an Infisical certificate to disk in PEM, PFX, or CER format. + Export + InfisicalCertificate + + + Writes a certificate to -Path in the supplied -Format. Accepts an X509Certificate2, an InfisicalCertificateBundle, an InfisicalCertificate (refetches bundle by serial), or a -SerialNumber. -Password (SecureString) supplies the PFX password. -IncludeChain appends chain certificates (PEM only). -NoPrivateKey omits the private key. -Force overwrites an existing file. Honors -WhatIf and -Confirm. + + + Notes + + PFX export requires the cert to have been loaded with X509KeyStorageFlags.Exportable; bundle/serial modes import with Exportable automatically. CER and PFX formats ignore -IncludeChain. + + + + + EXAMPLE 1 + Export-InfisicalCertificate -Path 'C:\Temp\web-tier.pem' -Format Pem -SerialNumber $Serial -IncludeChain + Exports a certificate, its chain, and private key (when available) as a single PEM bundle. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$ExportInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ExportInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ExportInfisicalCertificateParameters.Path = "C:\Temp\$($env:COMPUTERNAME).pfx" +$ExportInfisicalCertificateParameters.Format = 'Pfx' +$ExportInfisicalCertificateParameters.Password = (Read-Host -AsSecureString -Prompt 'PFX password') +$ExportInfisicalCertificateParameters.Force = $True +$ExportInfisicalCertificateParameters.PassThru = $True +$ExportInfisicalCertificateParameters.Verbose = $True + +$ExportInfisicalCertificateResult = Export-InfisicalCertificate @ExportInfisicalCertificateParameters + Resolves the active host certificate by serial and exports it as a password-protected PFX, overwriting any existing file and emitting a FileInfo for downstream use. + + + + + + + Install-InfisicalCertificate + Installs an Infisical certificate (and optional chain) into a Windows certificate store. + Install + InfisicalCertificate + + + Adds a certificate to the supplied -StoreName and -StoreLocation. Accepts an X509Certificate2, an InfisicalCertificate (refetches bundle by serial), or a -SerialNumber. -KeyStorageFlags controls private-key loading. -IncludeChain installs each chain certificate to the CertificateAuthority store of the same -StoreLocation. -Force replaces an existing thumbprint. -PassThru emits the installed certificate. Honors -WhatIf and -Confirm. + + + Notes + + Installing into LocalMachine stores typically requires elevation. -IncludeChain only fires for serial/InfisicalCertificate inputs because the X509Certificate2 input has no associated bundle to walk. + + + + + EXAMPLE 1 + Install-InfisicalCertificate -SerialNumber $Serial -StoreLocation LocalMachine -IncludeChain + Installs the leaf into LocalMachine\My and each chain element into LocalMachine\CertificateAuthority. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$InstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$InstallInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$InstallInfisicalCertificateParameters.StoreName = 'My' +$InstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' +$InstallInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet -bor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet +$InstallInfisicalCertificateParameters.IncludeChain = $True +$InstallInfisicalCertificateParameters.Force = $True +$InstallInfisicalCertificateParameters.PassThru = $True +$InstallInfisicalCertificateParameters.Verbose = $True + +$InstallInfisicalCertificateResult = Install-InfisicalCertificate @InstallInfisicalCertificateParameters + Resolves the active host certificate and installs the leaf (with a machine-bound persistent key) plus its chain into LocalMachine, replacing any existing thumbprint match. + + + + + + + Uninstall-InfisicalCertificate + Removes a certificate from a Windows certificate store by thumbprint, subject, or pipeline input. + Uninstall + InfisicalCertificate + + + Removes matching certificates from the supplied -StoreName and -StoreLocation. Accepts -Thumbprint, -Subject, an X509Certificate2 (-Certificate), or an InfisicalCertificate (-InfisicalCertificate, uses FingerprintSha1). -Force allows removing multiple matches in one call; -PassThru emits each removed certificate. Honors -WhatIf and -Confirm. + + + Notes + + When more than one certificate matches -Subject and -Force is not supplied the cmdlet throws to prevent accidental bulk removal. Uninstalling from LocalMachine stores typically requires elevation. + + + + + EXAMPLE 1 + Uninstall-InfisicalCertificate -Thumbprint $Thumbprint -StoreLocation LocalMachine + Removes the certificate with the supplied thumbprint from LocalMachine\My. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'revoked' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$UninstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UninstallInfisicalCertificateParameters.InfisicalCertificate = $GetInfisicalCertificatesResult[0] +$UninstallInfisicalCertificateParameters.StoreName = 'My' +$UninstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' +$UninstallInfisicalCertificateParameters.Force = $True +$UninstallInfisicalCertificateParameters.PassThru = $True +$UninstallInfisicalCertificateParameters.Verbose = $True + +$UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @UninstallInfisicalCertificateParameters + Picks the revoked host certificate and removes it from LocalMachine\My using its SHA1 fingerprint, emitting the removed object for the audit trail. + + + + + + + diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml new file mode 100644 index 0000000..dc9fb90 --- /dev/null +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -0,0 +1,1531 @@ + + + + + + Connect-Infisical + Establishes an authenticated session with an Infisical server and stores it for use by subsequent cmdlets. + Connect + Infisical + + + Authenticates against an Infisical instance using one of the supported auth providers (UniversalAuth, Token, JWT, OIDC, LDAP, Azure, GCP IAM) and stores the resulting connection in the module-level session manager. Subsequent cmdlets pick up the connection automatically. If parameters such as BaseUri, OrganizationId, ProjectId, Environment, ClientId, or ClientSecret are not supplied, the cmdlet attempts to resolve them from a curated list of environment-variable name patterns across Process, User, and Machine scopes. + + + Notes + + Use -PassThru to emit the resulting InfisicalConnection object; by default the connection is stored silently. SecureString-typed parameters such as ClientSecret, AccessToken, Jwt, and Password are never logged. + The cmdlet pins the API version to the bound value when -ApiVersion is supplied explicitly; otherwise the default 'v4' is used and remains overridable per-call. + + + + + EXAMPLE 1 + Connect-Infisical -BaseUri 'https://app.infisical.com' -ClientId $ClientId -ClientSecret $ClientSecret -OrganizationId $OrgId -ProjectId $ProjectId -Environment 'dev' + Performs a Universal-Auth machine-identity login and stores the resulting session for subsequent cmdlets. + + + EXAMPLE 2 + $ConnectInfisicalParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ConnectInfisicalParameters.BaseUri = 'https://app.infisical.com' +$ConnectInfisicalParameters.OrganizationId = $OrganizationId +$ConnectInfisicalParameters.ProjectId = $ProjectId +$ConnectInfisicalParameters.Environment = 'dev' +$ConnectInfisicalParameters.ClientId = $ClientId +$ConnectInfisicalParameters.ClientSecret = $ClientSecret +$ConnectInfisicalParameters.SecretPath = '/' +$ConnectInfisicalParameters.ApiVersion = 'v4' +$ConnectInfisicalParameters.PassThru = $True +$ConnectInfisicalParameters.Verbose = $True + +$ConnectInfisicalResult = Connect-Infisical @ConnectInfisicalParameters + Builds an ordered parameter dictionary, splats it onto Connect-Infisical, and captures the returned InfisicalConnection for later reuse. + + + + + + + Disconnect-Infisical + Clears the current Infisical session from the module-level session manager. + Disconnect + Infisical + + + Removes the cached InfisicalConnection so subsequent cmdlets that require an active session will fail until Connect-Infisical is invoked again. The cmdlet does not contact the Infisical server. + + + Notes + + Use -PassThru to receive a status object that includes the disconnect timestamp; by default the cmdlet returns no output. + + + + + EXAMPLE 1 + Disconnect-Infisical + Clears the active Infisical session silently. + + + EXAMPLE 2 + $DisconnectInfisicalParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$DisconnectInfisicalParameters.PassThru = $True +$DisconnectInfisicalParameters.Verbose = $True + +$DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters + Disconnects and captures a status object that includes IsConnected and DisconnectedAtUtc for logging. + + + + + + + Get-InfisicalSecret + Retrieves a single Infisical secret by name from the active session's project and environment. + Get + InfisicalSecret + + + Fetches a single secret by name. Project, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection but can be overridden per call. Optional flags request reference-expansion, import inclusion, or a specific historical version. + + + Notes + + The returned InfisicalSecret stores the value as SecureString; call .GetPlainTextValue() to materialize the cleartext value only when strictly required. + + + + + EXAMPLE 1 + Get-InfisicalSecret -SecretName 'DATABASE_URL' + Retrieves the DATABASE_URL secret from the project and environment pinned by Connect-Infisical. + + + EXAMPLE 2 + $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalSecretParameters.SecretName = 'DATABASE_URL' +$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalSecretParameters.ExpandSecretReferences = $True +$GetInfisicalSecretParameters.IncludeImports = $True +$GetInfisicalSecretParameters.Verbose = $True + +$GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters + Retrieves a single secret from a script-specific subpath with secret-reference expansion and folder imports enabled. + + + + + + + Get-InfisicalSecrets + Lists Infisical secrets within a project, environment, and optional folder path. + Get + InfisicalSecrets + + + Enumerates secrets under the active session's project and environment, optionally recursing through subfolders. Supports metadata-based filtering, tag-slug filtering, secret-reference expansion, and personal-override inclusion. + + + Notes + + Use -Recursive together with -SecretPath to walk an entire folder subtree. Pipe the result into ConvertTo-InfisicalSecretDictionary for hashtable-style lookup. + + + + + EXAMPLE 1 + Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + Lists every secret under /Windows in the active project and environment. + + + EXAMPLE 2 + $GetInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalSecretsParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalSecretsParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretsParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalSecretsParameters.Recursive = $True +$GetInfisicalSecretsParameters.ExpandSecretReferences = $True +$GetInfisicalSecretsParameters.IncludeImports = $True +$GetInfisicalSecretsParameters.IncludePersonalOverrides = $True +$GetInfisicalSecretsParameters.Verbose = $True + +$GetInfisicalSecretsResult = Get-InfisicalSecrets @GetInfisicalSecretsParameters + Lists secrets under a script-specific subpath with imports, personal overrides, and reference expansion enabled. + + + + + + + New-InfisicalSecret + Creates a new Infisical secret, with support for SecureString values and bulk creation. + New + InfisicalSecret + + + Creates one or many secrets. Three parameter sets are supported: PlainText (SecretName + SecretValue), SecureString (SecretName + SecureSecretValue), and Bulk (an array of hashtables piped or supplied via -Secrets). Honors -WhatIf and -Confirm. + + + Notes + + Pass -SkipMultilineEncoding when the value already contains literal newlines that the server should preserve verbatim. Use -TagIds to attach tag references at creation time. + + + + + EXAMPLE 1 + New-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'super-secret-value' + Creates a single shared secret in the active project/environment. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags -ProjectId $ConnectInfisicalParameters.ProjectId + +$NewInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalSecretParameters.SecretName = 'API_KEY' +$NewInfisicalSecretParameters.SecretValue = 'super-secret-value' +$NewInfisicalSecretParameters.SecretComment = 'Issued by deployment pipeline' +$NewInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagsResult[0].Id) +$NewInfisicalSecretParameters.Verbose = $True + +$NewInfisicalSecretResult = New-InfisicalSecret @NewInfisicalSecretParameters + Looks up tags to attach, then creates a single secret with a comment and tag association under a script-specific subpath. + + + + + + + Update-InfisicalSecret + Updates an existing Infisical secret value, comment, name, or tags. + Update + InfisicalSecret + + + Updates one or many secrets. Supports PlainText, SecureString, and Bulk parameter sets. Use -NewSecretName to rename a secret, -SecretComment to update its comment, and -TagIds to replace tag associations. Honors -WhatIf and -Confirm. + + + Notes + + Only the parameters you bind are sent; omitted scalar parameters are not modified server-side. The Bulk parameter set accepts pipeline input of hashtables containing SecretName/SecretValue/etc. + + + + + EXAMPLE 1 + Update-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'rotated-value' + Rotates the API_KEY secret in the active project/environment. + + + EXAMPLE 2 + $UpdateInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalSecretParameters.SecretName = 'API_KEY' +$UpdateInfisicalSecretParameters.NewSecretName = 'API_KEY_V2' +$UpdateInfisicalSecretParameters.SecretValue = 'rotated-value' +$UpdateInfisicalSecretParameters.SecretComment = 'Rotated by scheduled job' +$UpdateInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$UpdateInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$UpdateInfisicalSecretParameters.Verbose = $True + +$UpdateInfisicalSecretResult = Update-InfisicalSecret @UpdateInfisicalSecretParameters + Rotates the value, renames the secret, and updates its comment in a single call. + + + + + + + Remove-InfisicalSecret + Deletes one or many Infisical secrets by name. + Remove + InfisicalSecret + + + Deletes a single secret (Single parameter set) or a batch of secrets by name (Bulk parameter set). High ConfirmImpact triggers prompts by default. -PassThru emits the removed secret names. + + + Notes + + Removal is irreversible from this cmdlet's perspective; rely on Infisical's audit log or secret-version history for forensics. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalSecret -SecretName 'API_KEY_V1' -Confirm:$False + Deletes a single secret without prompting. + + + EXAMPLE 2 + $RemoveInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalSecretParameters.SecretNames = @('LEGACY_KEY_1','LEGACY_KEY_2','LEGACY_KEY_3') +$RemoveInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$RemoveInfisicalSecretParameters.PassThru = $True +$RemoveInfisicalSecretParameters.Confirm = $False +$RemoveInfisicalSecretParameters.Verbose = $True + +$RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretParameters + Bulk-deletes three legacy secrets and returns the removed names for audit logging. + + + + + + + Copy-InfisicalSecret + Duplicates one or more secrets into a different environment or secret path. + Copy + InfisicalSecret + + + Server-side duplicates an array of secret IDs into a destination environment (and optional destination path), with switches that control whether the value, comment, tags, and metadata are copied. Use Get-InfisicalSecrets followed by selection of the desired Id values to feed -SecretId. + + + Notes + + Set -OverwriteExisting to replace same-named secrets at the destination. Without -CopySecretValue, the destination secrets are created with empty values, preserving only metadata. + + + + + EXAMPLE 1 + Get-InfisicalSecrets | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue + Copies all secrets from the active environment into 'staging', including their values. + + + EXAMPLE 2 + $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + +$CopyInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretsResult.Id +$CopyInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$CopyInfisicalSecretParameters.SourceEnvironment = $ConnectInfisicalParameters.Environment +$CopyInfisicalSecretParameters.SourceSecretPath = '/Windows' +$CopyInfisicalSecretParameters.DestinationEnvironment = 'staging' +$CopyInfisicalSecretParameters.DestinationSecretPath = '/Windows' +$CopyInfisicalSecretParameters.OverwriteExisting = $True +$CopyInfisicalSecretParameters.CopySecretValue = $True +$CopyInfisicalSecretParameters.CopySecretComment = $True +$CopyInfisicalSecretParameters.CopyTags = $True +$CopyInfisicalSecretParameters.CopyMetadata = $True +$CopyInfisicalSecretParameters.Verbose = $True + +$CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters + Promotes every Windows secret from the active environment into staging with full value/comment/tag/metadata propagation. + + + + + + + ConvertTo-InfisicalSecretDictionary + Converts a stream of InfisicalSecret objects into a name-keyed Dictionary of SecureString or plain text values. + ConvertTo + InfisicalSecretDictionary + + + Aggregates an incoming pipeline of InfisicalSecret objects into a case-insensitive Dictionary keyed by SecretName. By default values are SecureString; pass -AsPlainText to materialize string values. Duplicate keys are handled via the -DuplicateKeyBehavior parameter (Error, FirstWins, LastWins). + + + Notes + + Use this conversion before splatting secrets into another process (-AsPlainText) or before passing them to libraries that expect SecureString-keyed lookups (default). + + + + + EXAMPLE 1 + Get-InfisicalSecrets | ConvertTo-InfisicalSecretDictionary -AsPlainText + Builds a plain-text dictionary of every secret in the active environment. + + + EXAMPLE 2 + $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + +$ConvertToInfisicalSecretDictionaryParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretsResult +$ConvertToInfisicalSecretDictionaryParameters.DuplicateKeyBehavior = 'LastWins' +$ConvertToInfisicalSecretDictionaryParameters.AsPlainText = $True +$ConvertToInfisicalSecretDictionaryParameters.Verbose = $True + +$ConvertToInfisicalSecretDictionaryResult = ConvertTo-InfisicalSecretDictionary @ConvertToInfisicalSecretDictionaryParameters + Aggregates recursive secret results into a plain-text dictionary, with the last value winning on key collisions. + + + + + + + Export-InfisicalSecrets + Exports InfisicalSecret objects to disk or environment variables in a chosen file format. + Export + InfisicalSecrets + + + Buffers an incoming pipeline of InfisicalSecret objects and writes them to a file in the requested format (DotEnv, Json, Yaml, EnvironmentVariables, etc.) or sets them as environment variables on the chosen scope (Process, User, Machine). -Encoding controls text encoding for file outputs. + + + Notes + + EnvironmentVariables format does not require -Path; all other formats do. User/Machine scopes require appropriate privileges (Machine scope requires elevation on Windows). + + + + + EXAMPLE 1 + Get-InfisicalSecrets | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force + Writes the active environment's secrets to a .env file. + + + EXAMPLE 2 + $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + +$ExportInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretsResult +$ExportInfisicalSecretsParameters.Format = 'EnvironmentVariables' +$ExportInfisicalSecretsParameters.Scope = 'Process' +$ExportInfisicalSecretsParameters.Force = $True +$ExportInfisicalSecretsParameters.Verbose = $True + +$ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsParameters + Projects the recursive secret result into Process-scope environment variables for the current PowerShell session. + + + + + + + Get-InfisicalProjects + Lists Infisical projects accessible to the current identity. + Get + InfisicalProjects + + + Returns every project the active session can see. The cmdlet requires an active InfisicalConnection but takes no parameters; project visibility is governed by Infisical's role assignments. + + + Notes + + The result is an array of InfisicalProject objects; pipe into Where-Object or Select-Object to filter by Slug, Name, or Id. + + + + + EXAMPLE 1 + Get-InfisicalProjects + Lists every project the current session can see. + + + EXAMPLE 2 + $GetInfisicalProjectsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalProjectsParameters.Verbose = $True + +$GetInfisicalProjectsResult = Get-InfisicalProjects @GetInfisicalProjectsParameters | Where-Object { $_.Slug -ilike 'platform-*' } + Lists projects and filters down to those whose slug begins with 'platform-'. + + + + + + + Get-InfisicalProject + Retrieves a single Infisical project by its identifier. + Get + InfisicalProject + + + Retrieves one project by Id. If -ProjectId is not supplied, the cmdlet falls back to the ProjectId pinned on the active InfisicalConnection. + + + Notes + + The cmdlet accepts pipeline input by property name; objects emitted by Get-InfisicalProjects can be piped in directly to refresh a single record. + + + + + EXAMPLE 1 + Get-InfisicalProject + Retrieves the project pinned by the active session. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects + +$GetInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult[0].Id +$GetInfisicalProjectParameters.Verbose = $True + +$GetInfisicalProjectResult = Get-InfisicalProject @GetInfisicalProjectParameters + Looks up the first project in the list and retrieves its full record. + + + + + + + New-InfisicalProject + Creates a new Infisical project in the active organization. + New + InfisicalProject + + + Creates a project with the supplied name and optional slug, description, type, and organization id. If -OrganizationId is not supplied, the active session's organization is used. Honors -WhatIf and -Confirm. + + + Notes + + Slug must be unique within the organization; if not supplied, the server derives one from the project name. + + + + + EXAMPLE 1 + New-InfisicalProject -ProjectName 'Platform Telemetry' + Creates a new project named 'Platform Telemetry' in the active organization. + + + EXAMPLE 2 + $NewInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalProjectParameters.ProjectName = 'Platform Telemetry' +$NewInfisicalProjectParameters.Slug = 'platform-telemetry' +$NewInfisicalProjectParameters.Description = 'Secrets for platform telemetry pipeline' +$NewInfisicalProjectParameters.Type = 'secret-manager' +$NewInfisicalProjectParameters.OrganizationId = $ConnectInfisicalParameters.OrganizationId +$NewInfisicalProjectParameters.Verbose = $True + +$NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters + Creates a project with an explicit slug, description, and type bound to a specific organization id. + + + + + + + Update-InfisicalProject + Updates the name, description, or auto-capitalization flag on an existing project. + Update + InfisicalProject + + + Updates mutable attributes on a project. -ProjectId defaults to the pinned session project when omitted. Only parameters that are bound are sent to the server. Honors -WhatIf and -Confirm. + + + Notes + + AutoCapitalization controls whether secret names submitted in mixed case are stored uppercase server-side; setting it false preserves the literal case supplied by clients. + + + + + EXAMPLE 1 + Update-InfisicalProject -Name 'Platform Telemetry (v2)' + Renames the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$UpdateInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$UpdateInfisicalProjectParameters.Name = 'Platform Telemetry (v2)' +$UpdateInfisicalProjectParameters.Description = 'Migrated to v2 pipeline' +$UpdateInfisicalProjectParameters.AutoCapitalization = $False +$UpdateInfisicalProjectParameters.Verbose = $True + +$UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectParameters + Locates the project by slug, renames it, updates the description, and disables auto-capitalization. + + + + + + + Remove-InfisicalProject + Deletes an Infisical project. + Remove + InfisicalProject + + + Deletes a project by Id. Defaults to the session-pinned project when -ProjectId is omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed project id. + + + Notes + + This is destructive and removes all secrets, environments, folders, and tags within the project. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalProject -Confirm:$False + Deletes the session-pinned project without prompting. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'sandbox-temp' } + +$RemoveInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$RemoveInfisicalProjectParameters.PassThru = $True +$RemoveInfisicalProjectParameters.Confirm = $False +$RemoveInfisicalProjectParameters.Verbose = $True + +$RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectParameters + Finds the sandbox project by slug, removes it without confirmation, and emits the removed project id for logging. + + + + + + + Get-InfisicalEnvironments + Lists environments defined on an Infisical project. + Get + InfisicalEnvironments + + + Returns all environments configured on a project. -ProjectId defaults to the session-pinned project id when omitted. + + + Notes + + Each InfisicalEnvironment carries both Id and Slug; downstream cmdlets accept either form on -Environment-like parameters. + + + + + EXAMPLE 1 + Get-InfisicalEnvironments + Lists environments for the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$GetInfisicalEnvironmentsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalEnvironmentsParameters.ProjectId = $GetInfisicalProjectsResult.Id +$GetInfisicalEnvironmentsParameters.Verbose = $True + +$GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments @GetInfisicalEnvironmentsParameters + Resolves a project by slug and lists every environment defined on it. + + + + + + + Get-InfisicalEnvironment + Retrieves a single Infisical environment by slug or id. + Get + InfisicalEnvironment + + + Returns one environment record by slug or id (-EnvironmentSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Accepts pipeline input by property name so InfisicalEnvironment objects from Get-InfisicalEnvironments can be refreshed directly. + + + + + EXAMPLE 1 + Get-InfisicalEnvironment -EnvironmentSlugOrId 'dev' + Retrieves the 'dev' environment from the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'dev' } + +$GetInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalEnvironmentParameters.EnvironmentSlugOrId = $GetInfisicalEnvironmentsResult.Slug +$GetInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalEnvironmentParameters.Verbose = $True + +$GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironmentParameters + Looks up the dev environment by slug and re-fetches the canonical record by slug or id. + + + + + + + New-InfisicalEnvironment + Creates a new environment on an Infisical project. + New + InfisicalEnvironment + + + Creates an environment with the supplied display name and slug, optionally setting its sort -Position. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Slugs must be unique within the project and are used as the canonical -Environment value across all other cmdlets. + + + + + EXAMPLE 1 + New-InfisicalEnvironment -Name 'Staging' -Slug 'staging' + Adds a Staging environment to the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$NewInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectsResult.Id +$NewInfisicalEnvironmentParameters.Name = 'Staging' +$NewInfisicalEnvironmentParameters.Slug = 'staging' +$NewInfisicalEnvironmentParameters.Position = 20 +$NewInfisicalEnvironmentParameters.Verbose = $True + +$NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironmentParameters + Adds a Staging environment at sort position 20 on the resolved project. + + + + + + + Update-InfisicalEnvironment + Updates the name, slug, or sort order of an existing Infisical environment. + Update + InfisicalEnvironment + + + Updates an environment identified by -EnvironmentId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + + + Notes + + Changing -Slug can break downstream automation that pins to the previous slug. Coordinate slug rotation with consumers. + + + + + EXAMPLE 1 + Update-InfisicalEnvironment -EnvironmentId $EnvId -Name 'Pre-Production' + Renames an environment in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'staging' } + +$UpdateInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$UpdateInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalEnvironmentParameters.Name = 'Pre-Production' +$UpdateInfisicalEnvironmentParameters.Slug = 'preprod' +$UpdateInfisicalEnvironmentParameters.Position = 25 +$UpdateInfisicalEnvironmentParameters.Verbose = $True + +$UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisicalEnvironmentParameters + Locates the staging environment, renames it to Pre-Production, rotates its slug, and updates its sort order. + + + + + + + Remove-InfisicalEnvironment + Deletes an Infisical environment from a project. + Remove + InfisicalEnvironment + + + Removes an environment by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed environment id. + + + Notes + + Removing an environment deletes every secret and folder scoped to it. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalEnvironment -EnvironmentId $EnvId -Confirm:$False + Deletes an environment without prompting. + + + EXAMPLE 2 + $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'sandbox' } + +$RemoveInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$RemoveInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalEnvironmentParameters.PassThru = $True +$RemoveInfisicalEnvironmentParameters.Confirm = $False +$RemoveInfisicalEnvironmentParameters.Verbose = $True + +$RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisicalEnvironmentParameters + Removes the sandbox environment without prompting and emits its id for the audit trail. + + + + + + + Get-InfisicalFolders + Lists Infisical folders at a given secret path. + Get + InfisicalFolders + + + Enumerates folders directly under the supplied -Path within the active project and environment. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. + + + Notes + + This is a non-recursive listing of immediate subfolders. To enumerate secrets across a folder subtree use Get-InfisicalSecrets -Recursive. + + + + + EXAMPLE 1 + Get-InfisicalFolders -Path '/Windows' + Lists every folder directly under /Windows in the active project and environment. + + + EXAMPLE 2 + $GetInfisicalFoldersParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalFoldersParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalFoldersParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalFoldersParameters.Path = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalFoldersParameters.Verbose = $True + +$GetInfisicalFoldersResult = Get-InfisicalFolders @GetInfisicalFoldersParameters + Lists folders under a script-specific subpath using the session-pinned project and environment. + + + + + + + Get-InfisicalFolder + Retrieves a single Infisical folder by name or id. + Get + InfisicalFolder + + + Returns one folder record by name or id (-FolderNameOrId) under the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. + + + Notes + + Accepts pipeline input by property name so InfisicalFolder objects from Get-InfisicalFolders can be refreshed directly. + + + + + EXAMPLE 1 + Get-InfisicalFolder -FolderNameOrId 'Deployments' -Path '/Windows' + Retrieves the Deployments folder under /Windows in the active project and environment. + + + EXAMPLE 2 + $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + +$GetInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFoldersResult.Id +$GetInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalFolderParameters.Path = '/Windows' +$GetInfisicalFolderParameters.Verbose = $True + +$GetInfisicalFolderResult = Get-InfisicalFolder @GetInfisicalFolderParameters + Locates the folder by name first, then re-fetches it by id to refresh the canonical record. + + + + + + + New-InfisicalFolder + Creates a new Infisical folder under the supplied parent path. + New + InfisicalFolder + + + Creates a folder with the supplied -Name beneath the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Folder names are case-sensitive and must be unique within a parent path; the cmdlet does not create intermediate folders. + + + + + EXAMPLE 1 + New-InfisicalFolder -Name 'Deployments' -Path '/Windows' + Creates the Deployments folder under /Windows in the active project and environment. + + + EXAMPLE 2 + $NewInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalFolderParameters.Name = $CallingScriptPath.BaseName +$NewInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalFolderParameters.Path = '/Windows' +$NewInfisicalFolderParameters.Verbose = $True + +$NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters + Creates a script-named folder under /Windows using the session-pinned project and environment. + + + + + + + Update-InfisicalFolder + Renames an existing Infisical folder. + Update + InfisicalFolder + + + Renames a folder identified by -FolderId to the supplied -Name. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Renaming a folder rewrites the path component for every secret beneath it; coordinate with consumers that pin to the previous path. + + + + + EXAMPLE 1 + Update-InfisicalFolder -FolderId $FolderId -Name 'Deployments-Archive' + Renames a folder in the session-pinned project/environment. + + + EXAMPLE 2 + $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + +$UpdateInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$UpdateInfisicalFolderParameters.Name = 'Deployments-Archive' +$UpdateInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$UpdateInfisicalFolderParameters.Path = '/Windows' +$UpdateInfisicalFolderParameters.Verbose = $True + +$UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderParameters + Resolves the folder by name and renames it to Deployments-Archive. + + + + + + + Remove-InfisicalFolder + Deletes an Infisical folder and all secrets it contains. + Remove + InfisicalFolder + + + Removes a folder by Id from the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed folder id. + + + Notes + + This is destructive and removes every secret and subfolder under the target folder. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalFolder -FolderId $FolderId -Confirm:$False + Deletes a folder from the session-pinned project/environment without prompting. + + + EXAMPLE 2 + $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq $CallingScriptPath.BaseName } + +$RemoveInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$RemoveInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalFolderParameters.Path = '/Windows' +$RemoveInfisicalFolderParameters.PassThru = $True +$RemoveInfisicalFolderParameters.Confirm = $False +$RemoveInfisicalFolderParameters.Verbose = $True + +$RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderParameters + Resolves the script-named folder under /Windows and removes it without prompting, returning its id for logging. + + + + + + + Get-InfisicalTags + Lists Infisical tags defined on a project. + Get + InfisicalTags + + + Returns every tag configured on a project. -ProjectId defaults to the session-pinned project id when omitted. + + + Notes + + Tag Ids returned here are the values to pass on -TagIds when creating or updating secrets. + + + + + EXAMPLE 1 + Get-InfisicalTags + Lists every tag defined on the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + +$GetInfisicalTagsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalTagsParameters.ProjectId = $GetInfisicalProjectsResult.Id +$GetInfisicalTagsParameters.Verbose = $True + +$GetInfisicalTagsResult = Get-InfisicalTags @GetInfisicalTagsParameters + Resolves a project by slug and lists every tag defined on it. + + + + + + + Get-InfisicalTag + Retrieves a single Infisical tag by slug or id. + Get + InfisicalTag + + + Returns one tag record by slug or id (-TagSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Accepts pipeline input by property name so InfisicalTag objects from Get-InfisicalTags can be refreshed directly. + + + + + EXAMPLE 1 + Get-InfisicalTag -TagSlugOrId 'critical' + Retrieves the 'critical' tag from the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + +$GetInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalTagParameters.TagSlugOrId = $GetInfisicalTagsResult.Slug +$GetInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalTagParameters.Verbose = $True + +$GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters + Filters tags to the critical slug and refetches the canonical record. + + + + + + + New-InfisicalTag + Creates a new Infisical tag on a project. + New + InfisicalTag + + + Creates a tag with the supplied -Slug, optional -Name and -Color. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + + + Notes + + Tag slugs must be unique within the project and are the canonical reference used by tag-filtered secret lookups. + + + + + EXAMPLE 1 + New-InfisicalTag -Slug 'critical' -Name 'Critical' -Color '#FF0000' + Creates a red Critical tag in the session-pinned project. + + + EXAMPLE 2 + $NewInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalTagParameters.Slug = 'critical' +$NewInfisicalTagParameters.Name = 'Critical' +$NewInfisicalTagParameters.Color = '#FF0000' +$NewInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalTagParameters.Verbose = $True + +$NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters + Creates a red Critical tag against an explicitly supplied project id. + + + + + + + Update-InfisicalTag + Updates the slug, name, or color of an existing Infisical tag. + Update + InfisicalTag + + + Updates a tag identified by -TagId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + + + Notes + + Changing -Slug breaks tag-filtered automation that pins to the previous slug. Coordinate slug rotation with consumers. + + + + + EXAMPLE 1 + Update-InfisicalTag -TagId $TagId -Color '#FFA500' + Changes the display color of a tag in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + +$UpdateInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UpdateInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$UpdateInfisicalTagParameters.Slug = 'critical-v2' +$UpdateInfisicalTagParameters.Name = 'Critical (v2)' +$UpdateInfisicalTagParameters.Color = '#FFA500' +$UpdateInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalTagParameters.Verbose = $True + +$UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters + Locates the critical tag and rotates its slug, display name, and color. + + + + + + + Remove-InfisicalTag + Deletes an Infisical tag from a project. + Remove + InfisicalTag + + + Removes a tag by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed tag id. + + + Notes + + Removing a tag detaches it from every secret it was applied to but does not delete the secrets themselves. Honors -WhatIf and -Confirm. + + + + + EXAMPLE 1 + Remove-InfisicalTag -TagId $TagId -Confirm:$False + Deletes a tag from the session-pinned project without prompting. + + + EXAMPLE 2 + $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical-v2' } + +$RemoveInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RemoveInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$RemoveInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalTagParameters.PassThru = $True +$RemoveInfisicalTagParameters.Confirm = $False +$RemoveInfisicalTagParameters.Verbose = $True + +$RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters + Resolves a tag by slug and removes it without prompting, returning its id for the audit trail. + + + + + + + Get-InfisicalCertificateAuthority + Lists or retrieves Infisical internal Certificate Authorities. + Get + InfisicalCertificateAuthority + + + When -CaId is supplied (ById parameter set) returns a single CA. Otherwise (List parameter set) returns every internal CA visible in the project. -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Only internal CAs are surfaced; external/ACME issuers are not enumerated by this cmdlet. CA Ids returned here are the values to pass on -CertificateAuthorityId to Request-InfisicalCertificate. + + + + + EXAMPLE 1 + Get-InfisicalCertificateAuthority + Lists every internal CA visible in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } + +$GetInfisicalCertificateAuthorityParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateAuthorityParameters.CaId = $GetInfisicalCertificateAuthorityListResult.Id +$GetInfisicalCertificateAuthorityParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateAuthorityParameters.Verbose = $True + +$GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @GetInfisicalCertificateAuthorityParameters + Filters the CA list by friendly name and then re-fetches the canonical CA record by id. + + + + + + + Get-InfisicalCertificates + Lists Infisical certificates in a project, with optional filters and automatic paging. + Get + InfisicalCertificates + + + Enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId. -Limit and -Offset drive a single page; pages are walked automatically until exhausted unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + For advanced filtering (validity window, key algorithm, extended key usage, etc.) use Search-InfisicalCertificate instead. + + + + + EXAMPLE 1 + Get-InfisicalCertificates -Status 'active' + Lists every active certificate in the session-pinned project. + + + EXAMPLE 2 + $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } + +$GetInfisicalCertificatesParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificatesParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificatesParameters.CommonName = $env:COMPUTERNAME +$GetInfisicalCertificatesParameters.FriendlyName = 'web-tier' +$GetInfisicalCertificatesParameters.Status = 'active' +$GetInfisicalCertificatesParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) +$GetInfisicalCertificatesParameters.Limit = 100 +$GetInfisicalCertificatesParameters.Verbose = $True + +$GetInfisicalCertificatesResult = Get-InfisicalCertificates @GetInfisicalCertificatesParameters + Resolves the issuing CA, then lists active certificates scoped to that CA, the local hostname, and the 'web-tier' friendly name. + + + + + + + Get-InfisicalCertificate + Retrieves a single Infisical certificate by serial number. + Get + InfisicalCertificate + + + Returns one certificate record by -SerialNumber. Accepts pipeline input by property name so InfisicalCertificate objects from list/search cmdlets can be re-fetched directly. + + + Notes + + This returns metadata only. To obtain certificate and chain PEM material use ConvertTo-InfisicalCertificate or Export-InfisicalCertificate. + + + + + EXAMPLE 1 + Get-InfisicalCertificate -SerialNumber '7A:F2:1B:...:9E' + Retrieves the certificate record for the supplied serial number. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$GetInfisicalCertificateParameters.Verbose = $True + +$GetInfisicalCertificateResult = Get-InfisicalCertificate @GetInfisicalCertificateParameters + Selects the active certificate whose common name matches the host and refetches its canonical record. + + + + + + + Search-InfisicalCertificate + Searches Infisical certificates with advanced filters and automatic paging. + Search + InfisicalCertificate + + + Performs a server-side search across certificates with filters for friendly name, common name, free-text search, status, CA/profile/application/enrollment scope, key/signature algorithm, source, and validity window (-NotBeforeFrom/-NotBeforeTo/-NotAfterFrom/-NotAfterTo). Results are paged automatically unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + + + Notes + + Use -SortBy together with -SortOrder ('asc'/'desc') to control result ordering. Pair with Get-InfisicalCertificate or Export-InfisicalCertificate to drill into specific hits. + + + + + EXAMPLE 1 + Search-InfisicalCertificate -Search $env:COMPUTERNAME -Status 'active' + Finds active certificates whose searchable fields contain the local hostname. + + + EXAMPLE 2 + $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } + +$SearchInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$SearchInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$SearchInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME +$SearchInfisicalCertificateParameters.Status = 'active' +$SearchInfisicalCertificateParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) +$SearchInfisicalCertificateParameters.KeyAlgorithm = @('RSA') +$SearchInfisicalCertificateParameters.NotAfterTo = (Get-Date).AddDays(30) +$SearchInfisicalCertificateParameters.SortBy = 'notAfter' +$SearchInfisicalCertificateParameters.SortOrder = 'asc' +$SearchInfisicalCertificateParameters.Limit = 100 +$SearchInfisicalCertificateParameters.Verbose = $True + +$SearchInfisicalCertificateResult = Search-InfisicalCertificate @SearchInfisicalCertificateParameters + Searches for RSA certificates from a specific CA, scoped to the local hostname, that expire within the next 30 days, sorted soonest-first. + + + + + + + Request-InfisicalCertificate + Requests a new Infisical certificate (local CSR + sign) or reuses a still-valid existing one. + Request + InfisicalCertificate + + + Generates a keypair locally, builds a CSR, and submits it for signing either via a PKI subscriber (-PkiSubscriberSlug, default parameter set) or by direct CA signing (-CertificateAuthorityId). On subsequent runs an existing certificate whose CN matches and whose remaining lifetime exceeds -RenewalThresholdDays is reused; pass -Force to always issue or -AllowRenewal to allow rotation inside the threshold. Optional flags install the leaf (-Install) and chain (-InstallChain) into a Windows certificate store, and control private-key protection (-PrivateKeyProtection, -PersistKey, -MachineKey, -PrivateKeyPath, -KeyStorageFlags). Honors -WhatIf and -Confirm. + + + Notes + + Default -PrivateKeyProtection is 'LocalOnly': the leaf is loaded into memory without persisting the private key and PrivateKeyPem is scrubbed from the emitted result unless -PrivateKeyPath or an explicit -KeyStorageFlags binding overrides it. The reuse path completes its chain from the Infisical bundle when local stores are incomplete; pass -LocalChainOnly to suppress that fetch entirely. + + + + + EXAMPLE 1 + Request-InfisicalCertificate -PkiSubscriberSlug 'web-tier' -Install + Requests (or reuses) a certificate for the 'web-tier' subscriber and installs it into CurrentUser\My. + + + EXAMPLE 2 + $RequestInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$RequestInfisicalCertificateParameters.PkiSubscriberSlug = 'web-tier' +$RequestInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RequestInfisicalCertificateParameters.CommonName = ([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName +$RequestInfisicalCertificateParameters.DnsName = @(([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName, $env:COMPUTERNAME) +$RequestInfisicalCertificateParameters.KeyAlgorithm = 'Rsa' +$RequestInfisicalCertificateParameters.KeySize = 3072 +$RequestInfisicalCertificateParameters.Install = $True +$RequestInfisicalCertificateParameters.InstallChain = $True +$RequestInfisicalCertificateParameters.StoreName = 'My' +$RequestInfisicalCertificateParameters.StoreLocation = 'LocalMachine' +$RequestInfisicalCertificateParameters.PrivateKeyProtection = 'NonExportable' +$RequestInfisicalCertificateParameters.MachineKey = $True +$RequestInfisicalCertificateParameters.PersistKey = $True +$RequestInfisicalCertificateParameters.AllowRenewal = $True +$RequestInfisicalCertificateParameters.RenewalThresholdDays = 30 +$RequestInfisicalCertificateParameters.Verbose = $True + +$RequestInfisicalCertificateResult = Request-InfisicalCertificate @RequestInfisicalCertificateParameters + Issues (or renews within 30 days) a 3072-bit RSA certificate for the local FQDN, installs the leaf and chain into LocalMachine\My with a non-exportable machine-bound persistent key. + + + + + + + ConvertTo-InfisicalCertificate + Materializes an X509Certificate2 from an Infisical certificate record, bundle, or serial number. + ConvertTo + InfisicalCertificate + + + Fetches the certificate bundle (when given an InfisicalCertificate or -SerialNumber), or accepts an already-fetched -Bundle, and constructs an X509Certificate2 from the PEM material. Use -NoPrivateKey to omit the private key, -KeyStorageFlags to control how the key is loaded, and -IncludeChain to additionally emit each chain certificate as a separate X509Certificate2 in the pipeline. + + + Notes + + The bundle for any given certificate is typically retrievable only once after issuance; -SerialNumber and pipeline modes will fail with a bundle-not-available error for older certificates. Use -KeyStorageFlags Exportable when callers need to re-export the resulting cert as PFX. + + + + + EXAMPLE 1 + Get-InfisicalCertificate -SerialNumber $Serial | ConvertTo-InfisicalCertificate -IncludeChain + Materializes the certificate and emits each chain element individually. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$ConvertToInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ConvertToInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ConvertToInfisicalCertificateParameters.NoPrivateKey = $False +$ConvertToInfisicalCertificateParameters.IncludeChain = $True +$ConvertToInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable +$ConvertToInfisicalCertificateParameters.Verbose = $True + +$ConvertToInfisicalCertificateResult = ConvertTo-InfisicalCertificate @ConvertToInfisicalCertificateParameters + Selects the active certificate whose CN matches the host and materializes it (with private key and chain) as exportable X509Certificate2 objects. + + + + + + + Export-InfisicalCertificate + Exports an Infisical certificate to disk in PEM, PFX, or CER format. + Export + InfisicalCertificate + + + Writes a certificate to -Path in the supplied -Format. Accepts an X509Certificate2, an InfisicalCertificateBundle, an InfisicalCertificate (refetches bundle by serial), or a -SerialNumber. -Password (SecureString) supplies the PFX password. -IncludeChain appends chain certificates (PEM only). -NoPrivateKey omits the private key. -Force overwrites an existing file. Honors -WhatIf and -Confirm. + + + Notes + + PFX export requires the cert to have been loaded with X509KeyStorageFlags.Exportable; bundle/serial modes import with Exportable automatically. CER and PFX formats ignore -IncludeChain. + + + + + EXAMPLE 1 + Export-InfisicalCertificate -Path 'C:\Temp\web-tier.pem' -Format Pem -SerialNumber $Serial -IncludeChain + Exports a certificate, its chain, and private key (when available) as a single PEM bundle. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$ExportInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ExportInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ExportInfisicalCertificateParameters.Path = "C:\Temp\$($env:COMPUTERNAME).pfx" +$ExportInfisicalCertificateParameters.Format = 'Pfx' +$ExportInfisicalCertificateParameters.Password = (Read-Host -AsSecureString -Prompt 'PFX password') +$ExportInfisicalCertificateParameters.Force = $True +$ExportInfisicalCertificateParameters.PassThru = $True +$ExportInfisicalCertificateParameters.Verbose = $True + +$ExportInfisicalCertificateResult = Export-InfisicalCertificate @ExportInfisicalCertificateParameters + Resolves the active host certificate by serial and exports it as a password-protected PFX, overwriting any existing file and emitting a FileInfo for downstream use. + + + + + + + Install-InfisicalCertificate + Installs an Infisical certificate (and optional chain) into a Windows certificate store. + Install + InfisicalCertificate + + + Adds a certificate to the supplied -StoreName and -StoreLocation. Accepts an X509Certificate2, an InfisicalCertificate (refetches bundle by serial), or a -SerialNumber. -KeyStorageFlags controls private-key loading. -IncludeChain installs each chain certificate to the CertificateAuthority store of the same -StoreLocation. -Force replaces an existing thumbprint. -PassThru emits the installed certificate. Honors -WhatIf and -Confirm. + + + Notes + + Installing into LocalMachine stores typically requires elevation. -IncludeChain only fires for serial/InfisicalCertificate inputs because the X509Certificate2 input has no associated bundle to walk. + + + + + EXAMPLE 1 + Install-InfisicalCertificate -SerialNumber $Serial -StoreLocation LocalMachine -IncludeChain + Installs the leaf into LocalMachine\My and each chain element into LocalMachine\CertificateAuthority. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$InstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$InstallInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$InstallInfisicalCertificateParameters.StoreName = 'My' +$InstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' +$InstallInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet -bor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet +$InstallInfisicalCertificateParameters.IncludeChain = $True +$InstallInfisicalCertificateParameters.Force = $True +$InstallInfisicalCertificateParameters.PassThru = $True +$InstallInfisicalCertificateParameters.Verbose = $True + +$InstallInfisicalCertificateResult = Install-InfisicalCertificate @InstallInfisicalCertificateParameters + Resolves the active host certificate and installs the leaf (with a machine-bound persistent key) plus its chain into LocalMachine, replacing any existing thumbprint match. + + + + + + + Uninstall-InfisicalCertificate + Removes a certificate from a Windows certificate store by thumbprint, subject, or pipeline input. + Uninstall + InfisicalCertificate + + + Removes matching certificates from the supplied -StoreName and -StoreLocation. Accepts -Thumbprint, -Subject, an X509Certificate2 (-Certificate), or an InfisicalCertificate (-InfisicalCertificate, uses FingerprintSha1). -Force allows removing multiple matches in one call; -PassThru emits each removed certificate. Honors -WhatIf and -Confirm. + + + Notes + + When more than one certificate matches -Subject and -Force is not supplied the cmdlet throws to prevent accidental bulk removal. Uninstalling from LocalMachine stores typically requires elevation. + + + + + EXAMPLE 1 + Uninstall-InfisicalCertificate -Thumbprint $Thumbprint -StoreLocation LocalMachine + Removes the certificate with the supplied thumbprint from LocalMachine\My. + + + EXAMPLE 2 + $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'revoked' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + +$UninstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$UninstallInfisicalCertificateParameters.InfisicalCertificate = $GetInfisicalCertificatesResult[0] +$UninstallInfisicalCertificateParameters.StoreName = 'My' +$UninstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' +$UninstallInfisicalCertificateParameters.Force = $True +$UninstallInfisicalCertificateParameters.PassThru = $True +$UninstallInfisicalCertificateParameters.Verbose = $True + +$UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @UninstallInfisicalCertificateParameters + Picks the revoked host certificate and removes it from LocalMachine\My using its SHA1 fingerprint, emitting the removed object for the audit trail. + + + + + + + diff --git a/build.ps1 b/build.ps1 index ae27921..b928622 100644 --- a/build.ps1 +++ b/build.ps1 @@ -129,7 +129,10 @@ function Write-Manifest { 'Update-InfisicalTag', 'Remove-InfisicalTag', 'Get-InfisicalCertificateAuthority', + 'Get-InfisicalCertificate', + 'Get-InfisicalCertificates', 'Search-InfisicalCertificate', + 'Request-InfisicalCertificate', 'ConvertTo-InfisicalCertificate', 'Install-InfisicalCertificate', 'Uninstall-InfisicalCertificate', @@ -193,15 +196,50 @@ if (`$null -eq `$manifest) { Import-Module -Name '$($ModuleDirectory.FullName)' -Force -`$cmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecrets','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProjects','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironments','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolders','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTags','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Search-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') -foreach (`$c in `$cmds) { - if (-not (Get-Command -Name `$c -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { - throw "Cmdlet not found: `$c" +`$cmds = @(Get-Command -Module PSInfisicalAPI -CommandType Cmdlet) +if (`$cmds.Count -eq 0) { + throw "No cmdlets were exported by the PSInfisicalAPI module." +} + +`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecrets','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProjects','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironments','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolders','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTags','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalCertificate','Get-InfisicalCertificates','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') +foreach (`$expected in `$expectedCmds) { + if (-not (Get-Command -Name `$expected -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { + throw "Cmdlet not found: `$expected" + } +} + +foreach (`$cmd in `$cmds) { + `$name = `$cmd.Name + `$help = Get-Help -Name `$name -Full -ErrorAction SilentlyContinue + if (`$null -eq `$help) { + throw "Get-Help returned nothing for cmdlet: `$name" } - `$help = Get-Help -Name `$c -ErrorAction SilentlyContinue - if (`$null -eq `$help) { - throw "Get-Help returned nothing for cmdlet: `$c" + `$synopsis = (`$help.Synopsis | Out-String).Trim() + if ([string]::IsNullOrWhiteSpace(`$synopsis) -or `$synopsis.StartsWith(`$name, [System.StringComparison]::OrdinalIgnoreCase)) { + throw "Get-Help synopsis is missing or auto-generated for cmdlet: `$name" + } + + `$description = (`$help.description | Out-String).Trim() + if ([string]::IsNullOrWhiteSpace(`$description)) { + throw "Get-Help description is empty for cmdlet: `$name" + } + + `$examples = Get-Help -Name `$name -Examples -ErrorAction SilentlyContinue + if (`$null -eq `$examples -or `$null -eq `$examples.examples -or `$null -eq `$examples.examples.example) { + throw "Get-Help -Examples returned no examples for cmdlet: `$name" + } + + `$exampleNodes = @(`$examples.examples.example) + if (`$exampleNodes.Count -lt 1) { + throw "Get-Help -Examples returned zero examples for cmdlet: `$name" + } + + foreach (`$example in `$exampleNodes) { + `$code = (`$example.code | Out-String).Trim() + if ([string]::IsNullOrWhiteSpace(`$code)) { + throw "Example with empty code block found for cmdlet: `$name" + } } } @@ -297,6 +335,35 @@ foreach ($assembly in $desiredAssemblies) { } } +Write-Step "Staging cmdlet help XML next to module binary" +$moduleCultureDirs = Get-ChildItem -LiteralPath $ModuleRoot.FullName -Directory -Force -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match '^[a-z]{2}(-[A-Za-z0-9]+)*$' } +foreach ($cultureDir in $moduleCultureDirs) { + $helpXmlSource = [System.IO.FileInfo][System.IO.Path]::Combine($cultureDir.FullName, 'PSInfisicalAPI.dll-Help.xml') + if (-not $helpXmlSource.Exists) { continue } + + $binCultureDir = [System.IO.DirectoryInfo][System.IO.Path]::Combine($ModuleBinDir.FullName, $cultureDir.Name) + Ensure-Directory -Directory $binCultureDir + Copy-Item -LiteralPath $helpXmlSource.FullName -Destination $binCultureDir.FullName -Force +} + +$primaryHelpXml = [System.IO.FileInfo][System.IO.Path]::Combine($ModuleBinDir.FullName, 'en-US', 'PSInfisicalAPI.dll-Help.xml') +if (-not $primaryHelpXml.Exists) { + throw "Help XML not found at '$($primaryHelpXml.FullName)'. Ensure Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml exists." +} + +try { + [xml]$helpDocument = Get-Content -LiteralPath $primaryHelpXml.FullName -Raw +} catch { + throw "Help XML at '$($primaryHelpXml.FullName)' failed to parse as XML: $_" +} + +$helpCommandCount = @($helpDocument.helpItems.command).Count +if ($helpCommandCount -lt 1) { + throw "Help XML at '$($primaryHelpXml.FullName)' contains no entries." +} +Write-Step "Help XML contains $helpCommandCount cmdlet entries." + $manifestPath = [System.IO.FileInfo][System.IO.Path]::Combine($ModuleRoot.FullName, 'PSInfisicalAPI.psd1') Write-Manifest -Path $manifestPath -ModuleVersion $buildVersion -CommitHash $commitHash diff --git a/src/PSInfisicalAPI.Tests/CertificateMapperTests.cs b/src/PSInfisicalAPI.Tests/CertificateMapperTests.cs index a9653b3..13d21f4 100644 --- a/src/PSInfisicalAPI.Tests/CertificateMapperTests.cs +++ b/src/PSInfisicalAPI.Tests/CertificateMapperTests.cs @@ -12,6 +12,7 @@ namespace PSInfisicalAPI.Tests private static readonly Type CertDtoType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateResponseDto", true); private static readonly Type CaMapperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCaMapper", true); private static readonly Type CaDtoType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalInternalCaResponseDto", true); + private static readonly Type CaConfigDtoType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalInternalCaConfigurationDto", true); private static readonly Type BundleDtoType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateBundleResponseDto", true); private static InfisicalCertificate InvokeCertMap(object dto, string fallbackProjectId) @@ -90,6 +91,43 @@ namespace PSInfisicalAPI.Tests Assert.Equal("proj-fallback", mapped.ProjectId); } + [Fact] + public void CaMap_Prefers_Configuration_Fields_Over_TopLevel() + { + object cfg = Activator.CreateInstance(CaConfigDtoType); + CaConfigDtoType.GetProperty("FriendlyName").SetValue(cfg, "C=US, CN=GSPA Intermediate"); + CaConfigDtoType.GetProperty("CommonName").SetValue(cfg, "GSPA Intermediate"); + CaConfigDtoType.GetProperty("OrganizationName").SetValue(cfg, "GSPA"); + CaConfigDtoType.GetProperty("OrganizationUnit").SetValue(cfg, "MECM"); + CaConfigDtoType.GetProperty("Country").SetValue(cfg, "US"); + CaConfigDtoType.GetProperty("KeyAlgorithm").SetValue(cfg, "RSA_2048"); + CaConfigDtoType.GetProperty("DistinguishedName").SetValue(cfg, "CN=GSPA Intermediate"); + CaConfigDtoType.GetProperty("SerialNumber").SetValue(cfg, "74a4b62197ad"); + CaConfigDtoType.GetProperty("MaxPathLength").SetValue(cfg, 0); + CaConfigDtoType.GetProperty("Type").SetValue(cfg, "intermediate"); + + object dto = Activator.CreateInstance(CaDtoType); + CaDtoType.GetProperty("Id").SetValue(dto, "ca-9"); + CaDtoType.GetProperty("Name").SetValue(dto, "intermediate-ca"); + CaDtoType.GetProperty("Type").SetValue(dto, "internal"); + CaDtoType.GetProperty("Status").SetValue(dto, "active"); + CaDtoType.GetProperty("Configuration").SetValue(dto, cfg); + + InfisicalCertificateAuthority mapped = InvokeCaMap(dto, "proj-fallback"); + Assert.Equal("ca-9", mapped.Id); + Assert.Equal("intermediate-ca", mapped.Name); + Assert.Equal("internal", mapped.Type); + Assert.Equal("C=US, CN=GSPA Intermediate", mapped.FriendlyName); + Assert.Equal("GSPA Intermediate", mapped.CommonName); + Assert.Equal("GSPA", mapped.OrganizationName); + Assert.Equal("MECM", mapped.OrganizationUnit); + Assert.Equal("US", mapped.Country); + Assert.Equal("RSA_2048", mapped.KeyAlgorithm); + Assert.Equal("CN=GSPA Intermediate", mapped.DistinguishedName); + Assert.Equal("74a4b62197ad", mapped.SerialNumber); + Assert.Equal(0, mapped.MaxPathLength); + } + [Fact] public void BundleMap_Maps_All_Pem_Fields() { diff --git a/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs b/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs new file mode 100644 index 0000000..e048a6a --- /dev/null +++ b/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs @@ -0,0 +1,479 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Management.Automation; +using System.Reflection; +using PSInfisicalAPI.Endpoints; +using PSInfisicalAPI.Pki; +using Xunit; + +namespace PSInfisicalAPI.Tests +{ + public class CsrAndRequestCmdletTests + { + private static readonly Assembly ModuleAssembly = typeof(PSInfisicalAPI.Connections.InfisicalConnection).Assembly; + + [Fact] + public void CsrBuilder_Rsa2048_Produces_Pem_Csr_And_PrivateKey_With_Subject_And_Sans() + { + InfisicalCsrSubject subject = new InfisicalCsrSubject + { + CommonName = "test.contoso.local", + Organization = "Contoso", + Country = "US" + }; + + InfisicalCsrOptions options = new InfisicalCsrOptions { KeyAlgorithm = InfisicalKeyAlgorithm.Rsa, RsaKeySize = 2048 }; + InfisicalCsrResult result = InfisicalCsrBuilder.Build(subject, new[] { "test.contoso.local", "alt.contoso.local" }, new[] { "10.0.0.5" }, options); + + Assert.NotNull(result); + Assert.Contains("BEGIN CERTIFICATE REQUEST", result.CsrPem); + Assert.Contains("END CERTIFICATE REQUEST", result.CsrPem); + Assert.Contains("BEGIN RSA PRIVATE KEY", result.PrivateKeyPem); + + Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest pkcs10 = ReadCsr(result.CsrPem); + Assert.True(pkcs10.Verify()); + Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters rsa = Assert.IsAssignableFrom(pkcs10.GetPublicKey()); + Assert.Equal(2048, rsa.Modulus.BitLength); + } + + [Theory] + [InlineData(InfisicalEcCurve.P256, "1.2.840.10045.3.1.7")] + [InlineData(InfisicalEcCurve.P384, "1.3.132.0.34")] + public void CsrBuilder_Ecdsa_Produces_Verifiable_Csr(InfisicalEcCurve curve, string expectedCurveOid) + { + InfisicalCsrSubject subject = new InfisicalCsrSubject { CommonName = "ec.contoso.local" }; + InfisicalCsrOptions options = new InfisicalCsrOptions { KeyAlgorithm = InfisicalKeyAlgorithm.Ecdsa, EcCurve = curve }; + InfisicalCsrResult result = InfisicalCsrBuilder.Build(subject, new[] { "ec.contoso.local" }, null, options); + + Assert.Contains("BEGIN CERTIFICATE REQUEST", result.CsrPem); + Assert.True(result.PrivateKeyPem.Contains("BEGIN EC PRIVATE KEY") || result.PrivateKeyPem.Contains("BEGIN PRIVATE KEY")); + + Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest pkcs10 = ReadCsr(result.CsrPem); + Assert.True(pkcs10.Verify()); + Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters ec = Assert.IsAssignableFrom(pkcs10.GetPublicKey()); + Assert.Equal(expectedCurveOid, ec.PublicKeyParamSet.Id); + } + + [Fact] + public void CsrBuilder_Ed25519_Produces_Verifiable_Csr() + { + InfisicalCsrSubject subject = new InfisicalCsrSubject { CommonName = "ed.contoso.local" }; + InfisicalCsrOptions options = new InfisicalCsrOptions { KeyAlgorithm = InfisicalKeyAlgorithm.Ed25519 }; + InfisicalCsrResult result = InfisicalCsrBuilder.Build(subject, new[] { "ed.contoso.local" }, null, options); + + Assert.Contains("BEGIN CERTIFICATE REQUEST", result.CsrPem); + Assert.Contains("BEGIN PRIVATE KEY", result.PrivateKeyPem); + + Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest pkcs10 = ReadCsr(result.CsrPem); + Assert.True(pkcs10.Verify()); + Assert.IsAssignableFrom(pkcs10.GetPublicKey()); + } + + [Fact] + public void CsrBuilder_Rsa_Rejects_Invalid_KeySize() + { + InfisicalCsrSubject subject = new InfisicalCsrSubject { CommonName = "test.local" }; + InfisicalCsrOptions options = new InfisicalCsrOptions { KeyAlgorithm = InfisicalKeyAlgorithm.Rsa, RsaKeySize = 1024 }; + Assert.Throws(() => InfisicalCsrBuilder.Build(subject, null, null, options)); + } + + [Fact] + public void CsrBuilder_Throws_When_CommonName_Missing() + { + InfisicalCsrSubject subject = new InfisicalCsrSubject { Organization = "Contoso" }; + Assert.Throws(() => InfisicalCsrBuilder.Build(subject, null, null, new InfisicalCsrOptions())); + } + + private static Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest ReadCsr(string pem) + { + using (System.IO.StringReader reader = new System.IO.StringReader(pem)) + { + Org.BouncyCastle.OpenSsl.PemReader pemReader = new Org.BouncyCastle.OpenSsl.PemReader(reader); + object obj = pemReader.ReadObject(); + return Assert.IsType(obj); + } + } + + [Fact] + public void MergeSubject_Hashtable_Then_Individual_Params_Override() + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo merge = helperType.GetMethod("MergeSubject", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(merge); + + Hashtable subject = new Hashtable { { "CN", "fallback.local" }, { "O", "FallbackOrg" }, { "C", "DE" } }; + object result = merge.Invoke(null, new object[] { subject, "explicit.local", null, null, null, "ExplicitOrg", null, null }); + + PropertyInfo commonNameProp = result.GetType().GetProperty("CommonName"); + PropertyInfo organizationProp = result.GetType().GetProperty("Organization"); + PropertyInfo countryProp = result.GetType().GetProperty("Country"); + + Assert.Equal("explicit.local", commonNameProp.GetValue(result)); + Assert.Equal("ExplicitOrg", organizationProp.GetValue(result)); + Assert.Equal("DE", countryProp.GetValue(result)); + } + + [Fact] + public void Candidates_For_SignCertificateBySubscriber_Include_Pki_And_CertManager() + { + IReadOnlyList candidates = InfisicalEndpointRegistry.GetCandidates(InfisicalEndpointNames.SignCertificateBySubscriber); + Assert.Contains(candidates, c => c.Template == "/api/v1/pki/pki-subscribers/{subscriberName}/sign-certificate"); + Assert.Contains(candidates, c => c.Template == "/api/v1/cert-manager/pki-subscribers/{subscriberName}/sign-certificate"); + foreach (InfisicalEndpointDefinition candidate in candidates) + { + Assert.Equal("POST", candidate.Method); + Assert.True(candidate.RequiresAuthorization); + Assert.True(candidate.ContainsSecretMaterialInResponse); + } + } + + [Fact] + public void Candidates_For_SignCertificateByCa_Include_Pki_And_CertManager() + { + IReadOnlyList candidates = InfisicalEndpointRegistry.GetCandidates(InfisicalEndpointNames.SignCertificateByCa); + Assert.Contains(candidates, c => c.Template == "/api/v1/pki/ca/{caId}/sign-certificate"); + Assert.Contains(candidates, c => c.Template == "/api/v1/cert-manager/ca/{caId}/sign-certificate"); + } + + [Fact] + public void RequestInfisicalCertificate_Cmdlet_Has_Both_Parameter_Sets() + { + Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.RequestInfisicalCertificateCmdlet", true); + Assert.True(typeof(PSInfisicalAPI.Cmdlets.InfisicalCmdletBase).IsAssignableFrom(cmdletType)); + + CustomAttributeData cmdletData = null; + foreach (CustomAttributeData candidate in cmdletType.GetCustomAttributesData()) + { + if (candidate.AttributeType == typeof(CmdletAttribute)) { cmdletData = candidate; break; } + } + Assert.NotNull(cmdletData); + Assert.Equal(VerbsLifecycle.Request, cmdletData.ConstructorArguments[0].Value); + Assert.Equal("InfisicalCertificate", cmdletData.ConstructorArguments[1].Value); + + string defaultParameterSetName = null; + foreach (CustomAttributeNamedArgument named in cmdletData.NamedArguments) + { + if (named.MemberName == "DefaultParameterSetName") { defaultParameterSetName = (string)named.TypedValue.Value; break; } + } + Assert.Equal("BySubscriber", defaultParameterSetName); + + Assert.NotNull(cmdletType.GetProperty("PkiSubscriberSlug")); + Assert.NotNull(cmdletType.GetProperty("CertificateAuthorityId")); + Assert.NotNull(cmdletType.GetProperty("Subject")); + Assert.NotNull(cmdletType.GetProperty("CommonName")); + Assert.NotNull(cmdletType.GetProperty("DnsName")); + Assert.NotNull(cmdletType.GetProperty("IpAddress")); + Assert.NotNull(cmdletType.GetProperty("Install")); + Assert.NotNull(cmdletType.GetProperty("StoreName")); + Assert.NotNull(cmdletType.GetProperty("StoreLocation")); + Assert.NotNull(cmdletType.GetProperty("AllowRenewal")); + Assert.NotNull(cmdletType.GetProperty("RenewalThresholdDays")); + Assert.NotNull(cmdletType.GetProperty("Force")); + Assert.NotNull(cmdletType.GetProperty("InstallChain")); + + PropertyInfo keyAlgorithmProp = cmdletType.GetProperty("KeyAlgorithm"); + PropertyInfo curveProp = cmdletType.GetProperty("Curve"); + Assert.NotNull(keyAlgorithmProp); + Assert.NotNull(curveProp); + Assert.Equal(typeof(InfisicalKeyAlgorithm), keyAlgorithmProp.PropertyType); + Assert.Equal(typeof(InfisicalEcCurve), curveProp.PropertyType); + + PropertyInfo protectionProp = cmdletType.GetProperty("PrivateKeyProtection"); + Assert.NotNull(protectionProp); + Assert.Equal(typeof(InfisicalPrivateKeyProtection), protectionProp.PropertyType); + Assert.NotNull(cmdletType.GetProperty("PersistKey")); + Assert.NotNull(cmdletType.GetProperty("MachineKey")); + Assert.NotNull(cmdletType.GetProperty("PrivateKeyPath")); + Assert.NotNull(cmdletType.GetProperty("LocalChainOnly")); + + CustomAttributeData outputTypeData = null; + foreach (CustomAttributeData candidate in cmdletType.GetCustomAttributesData()) + { + if (candidate.AttributeType == typeof(OutputTypeAttribute)) { outputTypeData = candidate; break; } + } + Assert.NotNull(outputTypeData); + IList outputTypeArgs = (IList)outputTypeData.ConstructorArguments[0].Value; + Assert.Contains(outputTypeArgs, a => (Type)a.Value == typeof(PSInfisicalAPI.Models.InfisicalCertificateResult)); + } + + [Fact] + public void BuildResult_Splits_Chain_Into_Leaf_Intermediates_And_Root() + { + (string leafPem, _, string leafThumb) = PemCertificateBuilderTests.CreateSelfSignedExposed("BuildResult.Leaf"); + (string intermediatePem, _, string intermediateThumb) = PemCertificateBuilderTests.CreateSelfSignedExposed("BuildResult.Intermediate"); + (string rootPem, _, string rootThumb) = PemCertificateBuilderTests.CreateSelfSignedExposed("BuildResult.Root"); + + PSInfisicalAPI.Models.InfisicalSignedCertificate signed = new PSInfisicalAPI.Models.InfisicalSignedCertificate + { + SerialNumber = "ABC123", + CertificatePem = leafPem, + CertificateChainPem = intermediatePem + rootPem, + IssuingCaCertificatePem = rootPem + }; + + using (System.Security.Cryptography.X509Certificates.X509Certificate2 leaf = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.Text.Encoding.ASCII.GetBytes(leafPem))) + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo buildResult = helperType.GetMethod("BuildResult", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(buildResult); + + PSInfisicalAPI.Models.InfisicalCertificateResult result = (PSInfisicalAPI.Models.InfisicalCertificateResult)buildResult.Invoke(null, new object[] { leaf, signed }); + + Assert.Same(leaf, result.Leaf); + Assert.Equal("ABC123", result.SerialNumber); + Assert.Empty(result.Intermediates); + Assert.NotNull(result.Root); + Assert.Equal(2, result.Chain.Length); + Assert.Same(leaf, result.Chain[0]); + } + } + + [Theory] + [InlineData(InfisicalPrivateKeyProtection.LocalOnly, false, false, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.DefaultKeySet)] + [InlineData(InfisicalPrivateKeyProtection.Exportable, false, false, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable)] + [InlineData(InfisicalPrivateKeyProtection.NonExportable, false, false, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.DefaultKeySet)] + [InlineData(InfisicalPrivateKeyProtection.LocalOnly, true, false, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.PersistKeySet)] + [InlineData(InfisicalPrivateKeyProtection.LocalOnly, false, true, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.MachineKeySet)] + [InlineData(InfisicalPrivateKeyProtection.Exportable, true, true, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable | System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.MachineKeySet | System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.PersistKeySet)] + public void ResolveKeyStorageFlags_Maps_Protection_And_Switches(InfisicalPrivateKeyProtection protection, bool persist, bool machine, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags expected) + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo method = helperType.GetMethod("ResolveKeyStorageFlags", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(method); + + System.Security.Cryptography.X509Certificates.X509KeyStorageFlags actual = (System.Security.Cryptography.X509Certificates.X509KeyStorageFlags)method.Invoke(null, new object[] { protection, persist, machine }); + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(InfisicalPrivateKeyProtection.LocalOnly, false, false)] + [InlineData(InfisicalPrivateKeyProtection.Exportable, false, false)] + [InlineData(InfisicalPrivateKeyProtection.NonExportable, false, true)] + [InlineData(InfisicalPrivateKeyProtection.Ephemeral, false, true)] + [InlineData(InfisicalPrivateKeyProtection.LocalOnly, true, true)] + [InlineData(InfisicalPrivateKeyProtection.Exportable, true, true)] + public void ShouldScrubPrivateKeyPem_Returns_Expected(InfisicalPrivateKeyProtection protection, bool hasPath, bool expected) + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo method = helperType.GetMethod("ShouldScrubPrivateKeyPem", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(method); + + bool actual = (bool)method.Invoke(null, new object[] { protection, hasPath }); + Assert.Equal(expected, actual); + } + + [Fact] + public void WritePrivateKeyPem_Writes_File_And_Creates_Directory() + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo method = helperType.GetMethod("WritePrivateKeyPem", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(method); + + string tempRoot = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "PSInfisicalAPI_PemWrite_" + Guid.NewGuid().ToString("N")); + string nested = System.IO.Path.Combine(tempRoot, "nested", "key.pem"); + const string pem = "-----BEGIN PRIVATE KEY-----\nMIIBVgIBADANBgkqhkiG9w0BAQEFAA==\n-----END PRIVATE KEY-----\n"; + try + { + method.Invoke(null, new object[] { pem, nested }); + Assert.True(System.IO.File.Exists(nested)); + Assert.Equal(pem, System.IO.File.ReadAllText(nested)); + } + finally + { + if (System.IO.Directory.Exists(tempRoot)) { System.IO.Directory.Delete(tempRoot, true); } + } + } + + [Fact] + public void BuildResultFromExistingLocal_Populates_Leaf_And_Pem_For_Selfsigned() + { + (string leafPem, _, string leafThumb) = PemCertificateBuilderTests.CreateSelfSignedExposed("ReuseLookup.Leaf"); + + using (System.Security.Cryptography.X509Certificates.X509Certificate2 leaf = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.Text.Encoding.ASCII.GetBytes(leafPem))) + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo build = helperType.GetMethod("BuildResultFromExistingLocal", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(System.Security.Cryptography.X509Certificates.X509Certificate2) }, null); + Assert.NotNull(build); + + PSInfisicalAPI.Models.InfisicalCertificateResult result = (PSInfisicalAPI.Models.InfisicalCertificateResult)build.Invoke(null, new object[] { leaf }); + + Assert.Same(leaf, result.Leaf); + Assert.Equal(leaf.SerialNumber, result.SerialNumber); + Assert.Contains("BEGIN CERTIFICATE", result.CertificatePem); + Assert.NotNull(result.Chain); + Assert.NotEmpty(result.Chain); + Assert.Same(leaf, result.Chain[0]); + Assert.Empty(result.Intermediates); + } + } + + [Fact] + public void BuildResultFromExistingLocal_Has_Bundle_Fallback_Overload() + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo overload = helperType.GetMethod( + "BuildResultFromExistingLocal", + BindingFlags.Public | BindingFlags.Static, + null, + new Type[] { typeof(System.Security.Cryptography.X509Certificates.X509Certificate2), typeof(PSInfisicalAPI.Models.InfisicalCertificateBundle) }, + null); + Assert.NotNull(overload); + Assert.Equal(typeof(PSInfisicalAPI.Models.InfisicalCertificateResult), overload.ReturnType); + } + + [Fact] + public void BuildResultFromExistingLocal_With_Null_Bundle_Matches_LocalOnly_Behavior() + { + (string leafPem, _, _) = PemCertificateBuilderTests.CreateSelfSignedExposed("ReuseLookup.Bundle.Null.Leaf"); + + using (System.Security.Cryptography.X509Certificates.X509Certificate2 leaf = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.Text.Encoding.ASCII.GetBytes(leafPem))) + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo overload = helperType.GetMethod( + "BuildResultFromExistingLocal", + BindingFlags.Public | BindingFlags.Static, + null, + new Type[] { typeof(System.Security.Cryptography.X509Certificates.X509Certificate2), typeof(PSInfisicalAPI.Models.InfisicalCertificateBundle) }, + null); + + PSInfisicalAPI.Models.InfisicalCertificateResult result = (PSInfisicalAPI.Models.InfisicalCertificateResult)overload.Invoke(null, new object[] { leaf, null }); + + Assert.Same(leaf, result.Leaf); + Assert.Empty(result.Intermediates); + Assert.Single(result.Chain); + } + } + + [Fact] + public void BuildResultFromExistingLocal_With_Bundle_Merges_Chain_From_Bundle() + { + (string leafPem, _, string leafThumb) = PemCertificateBuilderTests.CreateSelfSignedExposed("ReuseLookup.Bundle.Leaf"); + (string caPem, _, string caThumb) = PemCertificateBuilderTests.CreateSelfSignedExposed("ReuseLookup.Bundle.Ca"); + + using (System.Security.Cryptography.X509Certificates.X509Certificate2 leaf = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.Text.Encoding.ASCII.GetBytes(leafPem))) + { + PSInfisicalAPI.Models.InfisicalCertificateBundle bundle = new PSInfisicalAPI.Models.InfisicalCertificateBundle + { + SerialNumber = leaf.SerialNumber, + CertificatePem = leafPem, + CertificateChainPem = caPem + }; + + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo overload = helperType.GetMethod( + "BuildResultFromExistingLocal", + BindingFlags.Public | BindingFlags.Static, + null, + new Type[] { typeof(System.Security.Cryptography.X509Certificates.X509Certificate2), typeof(PSInfisicalAPI.Models.InfisicalCertificateBundle) }, + null); + + PSInfisicalAPI.Models.InfisicalCertificateResult result = (PSInfisicalAPI.Models.InfisicalCertificateResult)overload.Invoke(null, new object[] { leaf, bundle }); + + Assert.Same(leaf, result.Leaf); + Assert.NotNull(result.Root); + Assert.Equal(caThumb, result.Root.Thumbprint); + Assert.Equal(2, result.Chain.Length); + Assert.Same(leaf, result.Chain[0]); + Assert.Equal(caThumb, result.Chain[1].Thumbprint); + + Assert.NotNull(result.CertificateChainPem); + Assert.Contains("BEGIN CERTIFICATE", result.CertificateChainPem); + } + } + + [Fact] + public void GetChainCertificateTargetStore_SelfSigned_Returns_Root() + { + using (System.Security.Cryptography.RSA rsa = System.Security.Cryptography.RSA.Create(2048)) + { + System.Security.Cryptography.X509Certificates.CertificateRequest request = new System.Security.Cryptography.X509Certificates.CertificateRequest( + "CN=ChainRouting.SelfSigned", + rsa, + System.Security.Cryptography.HashAlgorithmName.SHA256, + System.Security.Cryptography.RSASignaturePadding.Pkcs1); + using (System.Security.Cryptography.X509Certificates.X509Certificate2 selfSigned = request.CreateSelfSigned(DateTimeOffset.UtcNow.AddMinutes(-5), DateTimeOffset.UtcNow.AddDays(1))) + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo classify = helperType.GetMethod("GetChainCertificateTargetStore", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(classify); + + object result = classify.Invoke(null, new object[] { selfSigned }); + Assert.Equal(System.Security.Cryptography.X509Certificates.StoreName.Root, result); + } + } + } + + [Fact] + public void GetChainCertificateTargetStore_NonSelfSigned_Returns_CertificateAuthority() + { + using (System.Security.Cryptography.RSA rootRsa = System.Security.Cryptography.RSA.Create(2048)) + using (System.Security.Cryptography.RSA intermediateRsa = System.Security.Cryptography.RSA.Create(2048)) + { + System.Security.Cryptography.X509Certificates.CertificateRequest rootRequest = new System.Security.Cryptography.X509Certificates.CertificateRequest( + "CN=ChainRouting.Root", + rootRsa, + System.Security.Cryptography.HashAlgorithmName.SHA256, + System.Security.Cryptography.RSASignaturePadding.Pkcs1); + rootRequest.CertificateExtensions.Add(new System.Security.Cryptography.X509Certificates.X509BasicConstraintsExtension(true, false, 0, true)); + + using (System.Security.Cryptography.X509Certificates.X509Certificate2 rootCert = rootRequest.CreateSelfSigned(DateTimeOffset.UtcNow.AddMinutes(-5), DateTimeOffset.UtcNow.AddDays(1))) + { + System.Security.Cryptography.X509Certificates.CertificateRequest intermediateRequest = new System.Security.Cryptography.X509Certificates.CertificateRequest( + "CN=ChainRouting.Intermediate", + intermediateRsa, + System.Security.Cryptography.HashAlgorithmName.SHA256, + System.Security.Cryptography.RSASignaturePadding.Pkcs1); + intermediateRequest.CertificateExtensions.Add(new System.Security.Cryptography.X509Certificates.X509BasicConstraintsExtension(true, false, 0, true)); + + byte[] serial = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + using (System.Security.Cryptography.X509Certificates.X509Certificate2 intermediate = intermediateRequest.Create(rootCert, DateTimeOffset.UtcNow.AddMinutes(-5), DateTimeOffset.UtcNow.AddDays(1), serial)) + { + Assert.NotEqual(intermediate.Subject, intermediate.Issuer); + + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo classify = helperType.GetMethod("GetChainCertificateTargetStore", BindingFlags.Public | BindingFlags.Static); + + object result = classify.Invoke(null, new object[] { intermediate }); + Assert.Equal(System.Security.Cryptography.X509Certificates.StoreName.CertificateAuthority, result); + } + } + } + } + + [Fact] + public void InstallChain_Has_X509Collection_Overload() + { + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + Type loggerType = ModuleAssembly.GetType("PSInfisicalAPI.Logging.IInfisicalLogger", true); + + MethodInfo overload = helperType.GetMethod( + "InstallChain", + BindingFlags.Public | BindingFlags.Static, + null, + new Type[] + { + typeof(System.Collections.Generic.IEnumerable), + typeof(System.Security.Cryptography.X509Certificates.StoreLocation), + typeof(bool), + loggerType, + typeof(string) + }, + null); + + Assert.NotNull(overload); + Assert.Equal(typeof(void), overload.ReturnType); + } + + [Fact] + public void InstallInfisicalCertificateCmdlet_Uses_ChainRouting_Helper() + { + Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.InstallInfisicalCertificateCmdlet", true); + Assert.NotNull(cmdletType); + + Type helperType = ModuleAssembly.GetType("PSInfisicalAPI.Pki.InfisicalCertificateRequestHelpers", true); + MethodInfo classify = helperType.GetMethod("GetChainCertificateTargetStore", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(classify); + } + } +} diff --git a/src/PSInfisicalAPI.Tests/PemCertificateBuilderTests.cs b/src/PSInfisicalAPI.Tests/PemCertificateBuilderTests.cs index b147725..17d3d01 100644 --- a/src/PSInfisicalAPI.Tests/PemCertificateBuilderTests.cs +++ b/src/PSInfisicalAPI.Tests/PemCertificateBuilderTests.cs @@ -8,6 +8,11 @@ namespace PSInfisicalAPI.Tests { public class PemCertificateBuilderTests { + public static (string CertPem, string KeyPem, string Thumbprint) CreateSelfSignedExposed(string commonName) + { + return CreateSelfSigned(commonName); + } + private static (string CertPem, string KeyPem, string Thumbprint) CreateSelfSigned(string commonName) { using (RSA rsa = RSA.Create(2048)) diff --git a/src/PSInfisicalAPI.Tests/PkiClientParseTests.cs b/src/PSInfisicalAPI.Tests/PkiClientParseTests.cs new file mode 100644 index 0000000..8ccbf5d --- /dev/null +++ b/src/PSInfisicalAPI.Tests/PkiClientParseTests.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections; +using System.Reflection; +using PSInfisicalAPI.Http; +using PSInfisicalAPI.Logging; +using PSInfisicalAPI.Pki; +using Xunit; + +namespace PSInfisicalAPI.Tests +{ + public class PkiClientParseTests + { + private sealed class NoopHttpClient : IInfisicalHttpClient + { + public InfisicalHttpResponse Send(InfisicalHttpRequest request) { throw new NotImplementedException(); } + } + + private static InfisicalPkiClient CreateClient() + { + return new InfisicalPkiClient(new NoopHttpClient(), NullInfisicalLogger.Instance); + } + + private static object InvokeNonPublic(InfisicalPkiClient client, string methodName, string body) + { + MethodInfo method = typeof(InfisicalPkiClient).GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance); + return method.Invoke(client, new object[] { body }); + } + + [Fact] + public void ParseCaListBody_Reads_Raw_Json_Array() + { + string body = "[{\"id\":\"ca-1\",\"name\":\"intermediate\",\"projectId\":\"p1\",\"configuration\":{\"commonName\":\"Intermediate CA\",\"keyAlgorithm\":\"RSA_2048\"}}]"; + object result = InvokeNonPublic(CreateClient(), "ParseCaListBody", body); + IList list = (IList)result; + Assert.Single(list); + object dto = list[0]; + Assert.Equal("ca-1", dto.GetType().GetProperty("Id").GetValue(dto)); + object cfg = dto.GetType().GetProperty("Configuration").GetValue(dto); + Assert.NotNull(cfg); + Assert.Equal("Intermediate CA", cfg.GetType().GetProperty("CommonName").GetValue(cfg)); + } + + [Fact] + public void ParseCaListBody_Reads_CertificateAuthorities_Wrapper() + { + string body = "{\"certificateAuthorities\":[{\"id\":\"ca-2\",\"name\":\"root\"}]}"; + object result = InvokeNonPublic(CreateClient(), "ParseCaListBody", body); + IList list = (IList)result; + Assert.Single(list); + object dto = list[0]; + Assert.Equal("ca-2", dto.GetType().GetProperty("Id").GetValue(dto)); + } + + [Fact] + public void ParseCaSingleBody_Reads_Raw_Object_With_Configuration() + { + string body = "{\"id\":\"ca-9\",\"name\":\"intermediate-ca\",\"status\":\"active\",\"configuration\":{\"commonName\":\"GSPA Intermediate\",\"organization\":\"GSPA\"}}"; + object result = InvokeNonPublic(CreateClient(), "ParseCaSingleBody", body); + Assert.NotNull(result); + Assert.Equal("ca-9", result.GetType().GetProperty("Id").GetValue(result)); + object cfg = result.GetType().GetProperty("Configuration").GetValue(result); + Assert.NotNull(cfg); + Assert.Equal("GSPA Intermediate", cfg.GetType().GetProperty("CommonName").GetValue(cfg)); + Assert.Equal("GSPA", cfg.GetType().GetProperty("OrganizationName").GetValue(cfg)); + } + + [Fact] + public void ParseCaSingleBody_Reads_CertificateAuthority_Wrapper() + { + string body = "{\"certificateAuthority\":{\"id\":\"ca-7\",\"name\":\"root\"}}"; + object result = InvokeNonPublic(CreateClient(), "ParseCaSingleBody", body); + Assert.NotNull(result); + Assert.Equal("ca-7", result.GetType().GetProperty("Id").GetValue(result)); + } + + [Fact] + public void ParseCertificateSingleBody_Reads_Certificate_Wrapper() + { + string body = "{\"certificate\":{\"id\":\"cert-1\",\"serialNumber\":\"ABCD\",\"commonName\":\"host.example\"}}"; + object result = InvokeNonPublic(CreateClient(), "ParseCertificateSingleBody", body); + Assert.NotNull(result); + Assert.Equal("cert-1", result.GetType().GetProperty("Id").GetValue(result)); + Assert.Equal("ABCD", result.GetType().GetProperty("SerialNumber").GetValue(result)); + } + } +} diff --git a/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs b/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs index 70c3ca2..9ecd5c9 100644 --- a/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs +++ b/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs @@ -1,4 +1,7 @@ +using System; using System.Collections.Generic; +using System.Management.Automation; +using System.Reflection; using PSInfisicalAPI.Endpoints; using Xunit; @@ -6,6 +9,64 @@ namespace PSInfisicalAPI.Tests { public class PkiEndpointRegistryTests { + private static readonly Assembly ModuleAssembly = typeof(PSInfisicalAPI.Connections.InfisicalConnection).Assembly; + + [Fact] + public void GetInfisicalCertificate_Cmdlet_Is_Singular_With_Mandatory_SerialNumber() + { + Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.GetInfisicalCertificateCmdlet", true); + Assert.True(typeof(PSInfisicalAPI.Cmdlets.InfisicalCmdletBase).IsAssignableFrom(cmdletType)); + + CustomAttributeData cmdletData = null; + foreach (CustomAttributeData candidate in cmdletType.GetCustomAttributesData()) + { + if (candidate.AttributeType == typeof(CmdletAttribute)) { cmdletData = candidate; break; } + } + Assert.NotNull(cmdletData); + Assert.Equal(2, cmdletData.ConstructorArguments.Count); + Assert.Equal(VerbsCommon.Get, cmdletData.ConstructorArguments[0].Value); + Assert.Equal("InfisicalCertificate", cmdletData.ConstructorArguments[1].Value); + + PropertyInfo serialProp = cmdletType.GetProperty("SerialNumber"); + Assert.NotNull(serialProp); + + CustomAttributeData parameterAttr = null; + foreach (CustomAttributeData candidate in serialProp.GetCustomAttributesData()) + { + if (candidate.AttributeType == typeof(ParameterAttribute)) { parameterAttr = candidate; break; } + } + Assert.NotNull(parameterAttr); + + bool mandatory = false; + foreach (CustomAttributeNamedArgument named in parameterAttr.NamedArguments) + { + if (named.MemberName == "Mandatory") { mandatory = (bool)named.TypedValue.Value; break; } + } + Assert.True(mandatory); + } + + [Fact] + public void GetInfisicalCertificates_Cmdlet_Is_Registered_For_Listing() + { + Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.GetInfisicalCertificatesCmdlet", true); + Assert.True(typeof(PSInfisicalAPI.Cmdlets.InfisicalCmdletBase).IsAssignableFrom(cmdletType)); + + CustomAttributeData cmdletData = null; + foreach (CustomAttributeData candidate in cmdletType.GetCustomAttributesData()) + { + if (candidate.AttributeType == typeof(CmdletAttribute)) { cmdletData = candidate; break; } + } + Assert.NotNull(cmdletData); + Assert.Equal(VerbsCommon.Get, cmdletData.ConstructorArguments[0].Value); + Assert.Equal("InfisicalCertificates", cmdletData.ConstructorArguments[1].Value); + + Assert.NotNull(cmdletType.GetProperty("CommonName")); + Assert.NotNull(cmdletType.GetProperty("FriendlyName")); + Assert.NotNull(cmdletType.GetProperty("CaId")); + Assert.NotNull(cmdletType.GetProperty("Limit")); + Assert.NotNull(cmdletType.GetProperty("Offset")); + } + [Fact] public void Get_ListInternalCertificateAuthorities_Returns_CertManager_Primary() { diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs index d80992e..bd90777 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs @@ -21,12 +21,11 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) { - InfisicalCertificateAuthority ca = client.GetInternalCertificateAuthority(connection, CaId, resolvedProjectId); + InfisicalCertificateAuthority ca = client.GetInternalCertificateAuthority(connection, CaId, ProjectId); if (ca != null) { WriteObject(ca); @@ -35,7 +34,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalCertificateAuthority[] all = client.ListInternalCertificateAuthorities(connection, resolvedProjectId); + InfisicalCertificateAuthority[] all = client.ListInternalCertificateAuthorities(connection, ProjectId); foreach (InfisicalCertificateAuthority ca in all) { WriteObject(ca); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs new file mode 100644 index 0000000..df5970c --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs @@ -0,0 +1,36 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalCertificate")] + [OutputType(typeof(InfisicalCertificate))] + public sealed class GetInfisicalCertificateCmdlet : InfisicalCmdletBase + { + [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Id", "Identifier")] + public string SerialNumber { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + + InfisicalCertificate cert = client.RetrieveCertificate(connection, SerialNumber); + if (cert != null) + { + WriteObject(cert); + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalCertificateCmdlet", "GetCertificate", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs new file mode 100644 index 0000000..7c90278 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs @@ -0,0 +1,76 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalCertificates")] + [OutputType(typeof(InfisicalCertificate))] + public sealed class GetInfisicalCertificatesCmdlet : InfisicalCmdletBase + { + [Parameter] public string ProjectId { get; set; } + [Parameter] public string CommonName { get; set; } + [Parameter] public string FriendlyName { get; set; } + [Parameter] public string Status { get; set; } + [Parameter] public string[] CaId { get; set; } + [Parameter] public int? Limit { get; set; } + [Parameter] public int? Offset { get; set; } + [Parameter] public SwitchParameter NoAutoPage { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + InfisicalCertificateSearchQuery query = new InfisicalCertificateSearchQuery + { + ProjectId = resolvedProjectId, + CommonName = CommonName, + FriendlyName = FriendlyName, + Status = Status, + CaIds = CaId, + Limit = Limit ?? 100, + Offset = Offset ?? 0 + }; + + int requestedLimit = query.Limit ?? 100; + int emitted = 0; + while (true) + { + InfisicalCertificateSearchResult page = client.SearchCertificates(connection, query); + if (page == null || page.Certificates == null || page.Certificates.Length == 0) + { + break; + } + + foreach (InfisicalCertificate cert in page.Certificates) + { + WriteObject(cert); + emitted++; + } + + if (NoAutoPage.IsPresent || page.Certificates.Length < requestedLimit) + { + break; + } + + if (page.TotalCount > 0 && emitted >= page.TotalCount) + { + break; + } + + query.Offset = (query.Offset ?? 0) + page.Certificates.Length; + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalCertificatesCmdlet", "GetCertificates", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Cmdlets/InstallInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/InstallInfisicalCertificateCmdlet.cs index af32a3e..03b635a 100644 --- a/src/PSInfisicalAPI/Cmdlets/InstallInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/InstallInfisicalCertificateCmdlet.cs @@ -44,7 +44,8 @@ namespace PSInfisicalAPI.Cmdlets { foreach (X509Certificate2 chainCert in ResolveChain()) { - InstallCertificate(chainCert, StoreName.CertificateAuthority, StoreLocation); + StoreName chainStore = InfisicalCertificateRequestHelpers.GetChainCertificateTargetStore(chainCert); + InstallCertificate(chainCert, chainStore, StoreLocation); } } diff --git a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs new file mode 100644 index 0000000..1fc3b09 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Management.Automation; +using System.Security.Cryptography.X509Certificates; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsLifecycle.Request, "InfisicalCertificate", SupportsShouldProcess = true, DefaultParameterSetName = "BySubscriber")] + [OutputType(typeof(InfisicalCertificateResult))] + public sealed class RequestInfisicalCertificateCmdlet : InfisicalCmdletBase + { + private const string Component = "RequestInfisicalCertificateCmdlet"; + + [Parameter(ParameterSetName = "BySubscriber", Mandatory = true, Position = 0)] + [Alias("Subscriber")] + public string PkiSubscriberSlug { get; set; } + + [Parameter(ParameterSetName = "ByCa", Mandatory = true, Position = 0)] + [Alias("CaId")] + public string CertificateAuthorityId { get; set; } + + [Parameter] public string ProjectId { get; set; } + [Parameter] public IDictionary Subject { get; set; } + [Parameter] public string CommonName { get; set; } + [Parameter] public string Country { get; set; } + [Parameter] public string State { get; set; } + [Parameter] public string Locality { get; set; } + [Parameter] public string Organization { get; set; } + [Parameter] public string OrganizationalUnit { get; set; } + [Parameter] public string EmailAddress { get; set; } + [Parameter] public string[] DnsName { get; set; } + [Parameter] public string[] IpAddress { get; set; } + [Parameter] public InfisicalKeyAlgorithm KeyAlgorithm { get; set; } = InfisicalKeyAlgorithm.Rsa; + [Parameter] public int KeySize { get; set; } = 2048; + [Parameter] public InfisicalEcCurve Curve { get; set; } = InfisicalEcCurve.P256; + + [Parameter(ParameterSetName = "ByCa")] public string Ttl { get; set; } + [Parameter(ParameterSetName = "ByCa")] public string NotBefore { get; set; } + [Parameter(ParameterSetName = "ByCa")] public string NotAfter { get; set; } + [Parameter(ParameterSetName = "ByCa")] public string FriendlyName { get; set; } + [Parameter(ParameterSetName = "ByCa")] public string PkiCollectionId { get; set; } + [Parameter(ParameterSetName = "ByCa")] public string[] KeyUsage { get; set; } + [Parameter(ParameterSetName = "ByCa")] public string[] ExtendedKeyUsage { get; set; } + + [Parameter] public SwitchParameter Install { get; set; } + [Parameter] public StoreName StoreName { get; set; } = StoreName.My; + [Parameter] public StoreLocation StoreLocation { get; set; } = StoreLocation.CurrentUser; + [Parameter] public X509KeyStorageFlags KeyStorageFlags { get; set; } = X509KeyStorageFlags.DefaultKeySet; + [Parameter] public SwitchParameter InstallChain { get; set; } + + [Parameter] public InfisicalPrivateKeyProtection PrivateKeyProtection { get; set; } = InfisicalPrivateKeyProtection.LocalOnly; + [Parameter] public SwitchParameter PersistKey { get; set; } + [Parameter] public SwitchParameter MachineKey { get; set; } + [Parameter] public string PrivateKeyPath { get; set; } + + [Parameter] public SwitchParameter AllowRenewal { get; set; } + [Parameter] public int RenewalThresholdDays { get; set; } = 30; + [Parameter] public SwitchParameter Force { get; set; } + [Parameter] public SwitchParameter LocalChainOnly { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + InfisicalCsrSubject csrSubject = InfisicalCertificateRequestHelpers.MergeSubject(Subject, CommonName, Country, State, Locality, Organization, OrganizationalUnit, EmailAddress); + List dnsNames = BuildDnsNames(csrSubject); + if (string.IsNullOrEmpty(csrSubject.CommonName) && dnsNames.Count > 0) { csrSubject.CommonName = dnsNames[0]; } + if (string.IsNullOrEmpty(csrSubject.CommonName)) { throw new InvalidOperationException("Subject CommonName could not be determined and no DnsName was provided."); } + + X509Certificate2 existing = TryFindExisting(client, connection, resolvedProjectId, csrSubject.CommonName); + if (existing != null && !Force.IsPresent && !(AllowRenewal.IsPresent && InfisicalLocalCertificateLookup.IsRenewable(existing, RenewalThresholdDays))) + { + Logger.Information(Component, string.Concat("Reusing existing certificate (Thumbprint=", existing.Thumbprint, ", NotAfter=", existing.NotAfter.ToString("u"), ").")); + InfisicalCertificateResult reuseResult = InfisicalCertificateRequestHelpers.BuildResultFromExistingLocal(existing); + + if (!LocalChainOnly.IsPresent + && (reuseResult.Root == null || reuseResult.Intermediates == null || reuseResult.Intermediates.Length == 0) + && !string.IsNullOrEmpty(existing.SerialNumber)) + { + try + { + InfisicalCertificateBundle bundle = client.GetCertificateBundle(connection, existing.SerialNumber); + if (bundle != null && !string.IsNullOrEmpty(bundle.CertificateChainPem)) + { + reuseResult = InfisicalCertificateRequestHelpers.BuildResultFromExistingLocal(existing, bundle); + Logger.Information(Component, "Reused certificate chain completed from Infisical bundle."); + } + } + catch (Exception bundleException) + { + Logger.Verbose(Component, string.Concat("Infisical bundle fetch for reuse path failed (continuing with local-only chain): ", bundleException.Message)); + } + } + + WriteObject(reuseResult); + return; + } + + string target = string.Concat("PKI subscriber '", PkiSubscriberSlug ?? "(n/a)", "' or CA '", CertificateAuthorityId ?? "(n/a)", "' for CN=", csrSubject.CommonName); + if (!ShouldProcess(target, "Request new certificate")) { return; } + + InfisicalCsrOptions csrOptions = new InfisicalCsrOptions { KeyAlgorithm = KeyAlgorithm, RsaKeySize = KeySize, EcCurve = Curve }; + InfisicalCsrResult csr = InfisicalCsrBuilder.Build(csrSubject, dnsNames, IpAddress, csrOptions); + InfisicalSignedCertificate signed = SignCertificate(client, connection, resolvedProjectId, csr.CsrPem); + signed.PrivateKeyPem = csr.PrivateKeyPem; + + X509KeyStorageFlags resolvedFlags = ResolveEffectiveKeyStorageFlags(); + X509Certificate2 cert = PemCertificateBuilder.Build(signed.CertificatePem, signed.PrivateKeyPem, signed.CertificateChainPem, resolvedFlags); + + if (Install.IsPresent) + { + InfisicalCertificateRequestHelpers.InstallToStore(cert, StoreName, StoreLocation, Force.IsPresent, Logger, Component); + if (InstallChain.IsPresent) + { + InfisicalCertificateRequestHelpers.InstallChain(signed, StoreLocation, Force.IsPresent, Logger, Component); + } + } + + InfisicalCertificateResult resultObj = InfisicalCertificateRequestHelpers.BuildResult(cert, signed); + + bool hasExplicitPath = !string.IsNullOrEmpty(PrivateKeyPath); + if (hasExplicitPath && !string.IsNullOrEmpty(resultObj.PrivateKeyPem)) + { + InfisicalCertificateRequestHelpers.WritePrivateKeyPem(resultObj.PrivateKeyPem, PrivateKeyPath); + Logger.Information(Component, string.Concat("Wrote private key PEM to '", PrivateKeyPath, "'.")); + } + + if (!MyInvocation.BoundParameters.ContainsKey("KeyStorageFlags") + && InfisicalCertificateRequestHelpers.ShouldScrubPrivateKeyPem(PrivateKeyProtection, hasExplicitPath)) + { + resultObj.PrivateKeyPem = null; + } + + WriteObject(resultObj); + } + catch (Exception exception) + { + ThrowTerminatingForException(Component, "RequestCertificate", exception); + } + } + + private List BuildDnsNames(InfisicalCsrSubject subject) + { + List result = new List(); + if (DnsName != null) { foreach (string dns in DnsName) { if (!string.IsNullOrEmpty(dns)) { result.Add(dns); } } } + if (result.Count == 0) + { + string fqdn = InfisicalCertificateRequestHelpers.ResolveLocalFqdn(); + if (!string.IsNullOrEmpty(fqdn)) { result.Add(fqdn); } + } + + if (!string.IsNullOrEmpty(subject.CommonName) && !result.Contains(subject.CommonName)) { result.Insert(0, subject.CommonName); } + return result; + } + + private X509Certificate2 TryFindExisting(InfisicalPkiClient client, InfisicalConnection connection, string projectId, string commonName) + { + List candidateSerials = new List(); + try + { + InfisicalCertificateSearchQuery query = new InfisicalCertificateSearchQuery { ProjectId = projectId, CommonName = commonName, Status = "active", Limit = 50 }; + InfisicalCertificateSearchResult page = client.SearchCertificates(connection, query); + if (page != null && page.Certificates != null) + { + foreach (InfisicalCertificate hit in page.Certificates) { if (!string.IsNullOrEmpty(hit.SerialNumber)) { candidateSerials.Add(hit.SerialNumber); } } + } + } + catch (Exception searchException) + { + Logger.Verbose(Component, string.Concat("Infisical search for idempotency check failed: ", searchException.Message)); + } + + return InfisicalLocalCertificateLookup.FindMatch(StoreName, StoreLocation, commonName, candidateSerials); + } + + private X509KeyStorageFlags ResolveEffectiveKeyStorageFlags() + { + if (MyInvocation.BoundParameters.ContainsKey("KeyStorageFlags")) + { + return KeyStorageFlags; + } + + return InfisicalCertificateRequestHelpers.ResolveKeyStorageFlags(PrivateKeyProtection, PersistKey.IsPresent, MachineKey.IsPresent); + } + + private InfisicalSignedCertificate SignCertificate(InfisicalPkiClient client, InfisicalConnection connection, string projectId, string csrPem) + { + if (string.Equals(ParameterSetName, "BySubscriber", StringComparison.Ordinal)) + { + return client.SignCertificateBySubscriber(connection, PkiSubscriberSlug, projectId, csrPem); + } + + return client.SignCertificateByCa(connection, CertificateAuthorityId, csrPem, CommonName, null, Ttl, NotBefore, NotAfter, FriendlyName, PkiCollectionId, KeyUsage, ExtendedKeyUsage); + } + } +} diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index 6d01d4a..22f08bf 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -49,5 +49,7 @@ namespace PSInfisicalAPI.Endpoints public const string SearchCertificates = "SearchCertificates"; public const string RetrieveCertificate = "RetrieveCertificate"; public const string GetCertificateBundle = "GetCertificateBundle"; + public const string SignCertificateBySubscriber = "SignCertificateBySubscriber"; + public const string SignCertificateByCa = "SignCertificateByCa"; } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index 9d1e305..2bd0f58 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -589,6 +589,50 @@ namespace PSInfisicalAPI.Endpoints RequiresAuthorization = true, ContainsSecretMaterialInResponse = true }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.SignCertificateBySubscriber, + Resource = "Pki", + Version = "v1", + Method = "POST", + Template = "/api/v1/pki/pki-subscribers/{subscriberName}/sign-certificate", + RequiresAuthorization = true, + ContainsSecretMaterialInResponse = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.SignCertificateBySubscriber, + Resource = "Pki", + Version = "v1", + Method = "POST", + Template = "/api/v1/cert-manager/pki-subscribers/{subscriberName}/sign-certificate", + RequiresAuthorization = true, + ContainsSecretMaterialInResponse = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.SignCertificateByCa, + Resource = "Pki", + Version = "v1", + Method = "POST", + Template = "/api/v1/pki/ca/{caId}/sign-certificate", + RequiresAuthorization = true, + ContainsSecretMaterialInResponse = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.SignCertificateByCa, + Resource = "Pki", + Version = "v1", + Method = "POST", + Template = "/api/v1/cert-manager/ca/{caId}/sign-certificate", + RequiresAuthorization = true, + ContainsSecretMaterialInResponse = true + }); } public static InfisicalEndpointDefinition Get(string name) diff --git a/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs b/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs new file mode 100644 index 0000000..38dd62a --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalCertificateResult + { + public X509Certificate2 Leaf { get; set; } + public X509Certificate2[] Intermediates { get; set; } + public X509Certificate2 Root { get; set; } + public X509Certificate2[] Chain { get; set; } + public string SerialNumber { get; set; } + public string CertificatePem { get; set; } + public string CertificateChainPem { get; set; } + public string PrivateKeyPem { get; set; } + + public override string ToString() + { + if (Leaf != null) { return Leaf.Subject; } + return SerialNumber; + } + } +} diff --git a/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs b/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs new file mode 100644 index 0000000..e40d62f --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs @@ -0,0 +1,16 @@ +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalSignedCertificate + { + public string SerialNumber { get; set; } + public string CertificatePem { get; set; } + public string CertificateChainPem { get; set; } + public string IssuingCaCertificatePem { get; set; } + public string PrivateKeyPem { get; set; } + + public override string ToString() + { + return SerialNumber; + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCaDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalCaDtos.cs index 01c45fc..553dd5e 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalCaDtos.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalCaDtos.cs @@ -3,6 +3,26 @@ using Newtonsoft.Json; namespace PSInfisicalAPI.Pki { + internal sealed class InfisicalInternalCaConfigurationDto + { + [JsonProperty("type")] public string Type { get; set; } + [JsonProperty("friendlyName")] public string FriendlyName { get; set; } + [JsonProperty("commonName")] public string CommonName { get; set; } + [JsonProperty("organization")] public string OrganizationName { get; set; } + [JsonProperty("ou")] public string OrganizationUnit { get; set; } + [JsonProperty("country")] public string Country { get; set; } + [JsonProperty("province")] public string State { get; set; } + [JsonProperty("locality")] public string Locality { get; set; } + [JsonProperty("notBefore")] public string NotBefore { get; set; } + [JsonProperty("notAfter")] public string NotAfter { get; set; } + [JsonProperty("maxPathLength")] public int? MaxPathLength { get; set; } + [JsonProperty("keyAlgorithm")] public string KeyAlgorithm { get; set; } + [JsonProperty("dn")] public string DistinguishedName { get; set; } + [JsonProperty("parentCaId")] public string ParentCaId { get; set; } + [JsonProperty("serialNumber")] public string SerialNumber { get; set; } + [JsonProperty("activeCaCertId")] public string ActiveCaCertId { get; set; } + } + internal sealed class InfisicalInternalCaResponseDto { [JsonProperty("id")] public string Id { get; set; } @@ -28,6 +48,7 @@ namespace PSInfisicalAPI.Pki [JsonProperty("activeCaCertId")] public string ActiveCaCertId { get; set; } [JsonProperty("createdAt")] public string CreatedAt { get; set; } [JsonProperty("updatedAt")] public string UpdatedAt { get; set; } + [JsonProperty("configuration")] public InfisicalInternalCaConfigurationDto Configuration { get; set; } } internal sealed class InfisicalInternalCaListResponseDto diff --git a/src/PSInfisicalAPI/Pki/InfisicalCaMapper.cs b/src/PSInfisicalAPI/Pki/InfisicalCaMapper.cs index dc83822..aa1c3dd 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalCaMapper.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalCaMapper.cs @@ -14,34 +14,41 @@ namespace PSInfisicalAPI.Pki return null; } + InfisicalInternalCaConfigurationDto cfg = dto.Configuration; + return new InfisicalCertificateAuthority { Id = dto.Id, ProjectId = !string.IsNullOrEmpty(dto.ProjectId) ? dto.ProjectId : fallbackProjectId, Name = dto.Name, - FriendlyName = dto.FriendlyName, - Type = dto.Type, + FriendlyName = Coalesce(cfg != null ? cfg.FriendlyName : null, dto.FriendlyName), + Type = Coalesce(dto.Type, cfg != null ? cfg.Type : null), Status = dto.Status, EnableDirectIssuance = dto.EnableDirectIssuance, - KeyAlgorithm = dto.KeyAlgorithm, - DistinguishedName = dto.DistinguishedName, - OrganizationName = dto.OrganizationName, - OrganizationUnit = dto.OrganizationUnit, - Country = dto.Country, - State = dto.State, - Locality = dto.Locality, - CommonName = dto.CommonName, - MaxPathLength = dto.MaxPathLength, - NotBefore = dto.NotBefore, - NotAfter = dto.NotAfter, - SerialNumber = dto.SerialNumber, - ParentCaId = dto.ParentCaId, - ActiveCaCertId = dto.ActiveCaCertId, + KeyAlgorithm = Coalesce(cfg != null ? cfg.KeyAlgorithm : null, dto.KeyAlgorithm), + DistinguishedName = Coalesce(cfg != null ? cfg.DistinguishedName : null, dto.DistinguishedName), + OrganizationName = Coalesce(cfg != null ? cfg.OrganizationName : null, dto.OrganizationName), + OrganizationUnit = Coalesce(cfg != null ? cfg.OrganizationUnit : null, dto.OrganizationUnit), + Country = Coalesce(cfg != null ? cfg.Country : null, dto.Country), + State = Coalesce(cfg != null ? cfg.State : null, dto.State), + Locality = Coalesce(cfg != null ? cfg.Locality : null, dto.Locality), + CommonName = Coalesce(cfg != null ? cfg.CommonName : null, dto.CommonName), + MaxPathLength = (cfg != null && cfg.MaxPathLength.HasValue) ? cfg.MaxPathLength : dto.MaxPathLength, + NotBefore = Coalesce(cfg != null ? cfg.NotBefore : null, dto.NotBefore), + NotAfter = Coalesce(cfg != null ? cfg.NotAfter : null, dto.NotAfter), + SerialNumber = Coalesce(cfg != null ? cfg.SerialNumber : null, dto.SerialNumber), + ParentCaId = Coalesce(cfg != null ? cfg.ParentCaId : null, dto.ParentCaId), + ActiveCaCertId = Coalesce(cfg != null ? cfg.ActiveCaCertId : null, dto.ActiveCaCertId), CreatedAtUtc = ParseTimestamp(dto.CreatedAt), UpdatedAtUtc = ParseTimestamp(dto.UpdatedAt) }; } + private static string Coalesce(string primary, string fallback) + { + return !string.IsNullOrEmpty(primary) ? primary : fallback; + } + public static InfisicalCertificateAuthority[] MapMany(IEnumerable items, string fallbackProjectId) { if (items == null) diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs new file mode 100644 index 0000000..15c296b --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using PSInfisicalAPI.Logging; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Pki +{ + internal static class InfisicalCertificateRequestHelpers + { + public static InfisicalCsrSubject MergeSubject(IDictionary subject, string commonName, string country, string state, string locality, string organization, string organizationalUnit, string emailAddress) + { + InfisicalCsrSubject result = new InfisicalCsrSubject(); + if (subject != null) + { + result.CommonName = ReadString(subject, "CN", "CommonName"); + result.Country = ReadString(subject, "C", "Country"); + result.State = ReadString(subject, "ST", "S", "State"); + result.Locality = ReadString(subject, "L", "Locality"); + result.Organization = ReadString(subject, "O", "Organization"); + result.OrganizationalUnit = ReadString(subject, "OU", "OrganizationalUnit"); + result.EmailAddress = ReadString(subject, "E", "EMAIL", "EmailAddress"); + } + + if (!string.IsNullOrEmpty(commonName)) { result.CommonName = commonName; } + if (!string.IsNullOrEmpty(country)) { result.Country = country; } + if (!string.IsNullOrEmpty(state)) { result.State = state; } + if (!string.IsNullOrEmpty(locality)) { result.Locality = locality; } + if (!string.IsNullOrEmpty(organization)) { result.Organization = organization; } + if (!string.IsNullOrEmpty(organizationalUnit)) { result.OrganizationalUnit = organizationalUnit; } + if (!string.IsNullOrEmpty(emailAddress)) { result.EmailAddress = emailAddress; } + + return result; + } + + public static string ResolveLocalFqdn() + { + try + { + string host = System.Net.Dns.GetHostName(); + string domain = null; + try { domain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName; } + catch { domain = null; } + + if (!string.IsNullOrEmpty(domain) && !host.EndsWith("." + domain, StringComparison.OrdinalIgnoreCase)) + { + return string.Concat(host, ".", domain); + } + + return host; + } + catch + { + return null; + } + } + + public static void InstallToStore(X509Certificate2 cert, StoreName storeName, StoreLocation storeLocation, bool force, IInfisicalLogger logger, string component) + { + X509Store store = new X509Store(storeName, storeLocation); + try + { + store.Open(OpenFlags.ReadWrite); + X509Certificate2Collection existing = store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false); + string target = string.Concat(storeLocation.ToString(), @"\", storeName.ToString(), " [", cert.Thumbprint, "]"); + if (existing.Count > 0) + { + if (!force) + { + logger.Information(component, string.Concat("Certificate already present in ", target, "; no action taken.")); + return; + } + + store.RemoveRange(existing); + } + + store.Add(cert); + logger.Information(component, string.Concat("Installed certificate to ", target, ".")); + } + finally + { + store.Close(); + } + } + + public static void InstallChain(InfisicalSignedCertificate signed, StoreLocation storeLocation, bool force, IInfisicalLogger logger, string component) + { + List chainCerts = CollectChainCertificates(signed); + InstallChain(chainCerts, storeLocation, force, logger, component); + } + + public static void InstallChain(IEnumerable chainCerts, StoreLocation storeLocation, bool force, IInfisicalLogger logger, string component) + { + if (chainCerts == null) { return; } + foreach (X509Certificate2 chainCert in chainCerts) + { + if (chainCert == null) { continue; } + StoreName targetStore = GetChainCertificateTargetStore(chainCert); + InstallToStore(chainCert, targetStore, storeLocation, force, logger, component); + } + } + + public static StoreName GetChainCertificateTargetStore(X509Certificate2 cert) + { + return IsSelfSigned(cert) ? StoreName.Root : StoreName.CertificateAuthority; + } + + public static X509KeyStorageFlags ResolveKeyStorageFlags(InfisicalPrivateKeyProtection protection, bool persistKey, bool machineKey) + { + X509KeyStorageFlags flags = X509KeyStorageFlags.DefaultKeySet; + switch (protection) + { + case InfisicalPrivateKeyProtection.Exportable: + flags |= X509KeyStorageFlags.Exportable; + break; + case InfisicalPrivateKeyProtection.Ephemeral: + const int ephemeralValue = 32; + if (Enum.GetName(typeof(X509KeyStorageFlags), ephemeralValue) == null) + { + throw new PlatformNotSupportedException("InfisicalPrivateKeyProtection.Ephemeral requires .NET Core 3.0 or later (PowerShell 7+). Use LocalOnly or NonExportable on Windows PowerShell 5.1."); + } + flags |= (X509KeyStorageFlags)ephemeralValue; + break; + } + + if (machineKey) { flags |= X509KeyStorageFlags.MachineKeySet; } + if (persistKey) { flags |= X509KeyStorageFlags.PersistKeySet; } + + return flags; + } + + public static bool ShouldScrubPrivateKeyPem(InfisicalPrivateKeyProtection protection, bool hasExplicitPrivateKeyPath) + { + if (hasExplicitPrivateKeyPath) { return true; } + return protection == InfisicalPrivateKeyProtection.NonExportable + || protection == InfisicalPrivateKeyProtection.Ephemeral; + } + + public static void WritePrivateKeyPem(string privateKeyPem, string path) + { + if (string.IsNullOrEmpty(privateKeyPem)) { throw new ArgumentException("PrivateKeyPem is empty.", nameof(privateKeyPem)); } + if (string.IsNullOrEmpty(path)) { throw new ArgumentException("Path is required.", nameof(path)); } + + string fullPath = System.IO.Path.GetFullPath(path); + string directory = System.IO.Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(directory) && !System.IO.Directory.Exists(directory)) + { + System.IO.Directory.CreateDirectory(directory); + } + + System.IO.File.WriteAllText(fullPath, privateKeyPem); + } + + public static InfisicalCertificateResult BuildResultFromExistingLocal(X509Certificate2 leaf) + { + return BuildResultFromExistingLocal(leaf, null); + } + + public static InfisicalCertificateResult BuildResultFromExistingLocal(X509Certificate2 leaf, InfisicalCertificateBundle fallbackBundle) + { + if (leaf == null) { throw new ArgumentNullException(nameof(leaf)); } + + InfisicalCertificateResult result = new InfisicalCertificateResult + { + Leaf = leaf, + SerialNumber = leaf.SerialNumber, + CertificatePem = ExportCertificateToPem(leaf) + }; + + List chainElements = BuildLocalChain(leaf); + + if (fallbackBundle != null && !string.IsNullOrEmpty(fallbackBundle.CertificateChainPem)) + { + List bundleChain = PemCertificateBuilder.ReadCertificateChain(fallbackBundle.CertificateChainPem); + HashSet seen = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (X509Certificate2 c in chainElements) { if (c != null) { seen.Add(c.Thumbprint); } } + foreach (X509Certificate2 c in bundleChain) + { + if (c == null) { continue; } + if (seen.Add(c.Thumbprint)) { chainElements.Add(c); } + } + } + + List intermediates = new List(); + X509Certificate2 root = null; + foreach (X509Certificate2 cert in chainElements) + { + if (string.Equals(cert.Thumbprint, leaf.Thumbprint, StringComparison.OrdinalIgnoreCase)) { continue; } + if (IsSelfSigned(cert)) { if (root == null) { root = cert; } } + else { intermediates.Add(cert); } + } + + result.Intermediates = intermediates.ToArray(); + result.Root = root; + + List ordered = new List { leaf }; + ordered.AddRange(intermediates); + if (root != null) { ordered.Add(root); } + result.Chain = ordered.ToArray(); + + if (intermediates.Count > 0 || root != null) + { + StringBuilder sb = new StringBuilder(); + foreach (X509Certificate2 c in intermediates) { sb.Append(ExportCertificateToPem(c)); } + if (root != null) { sb.Append(ExportCertificateToPem(root)); } + result.CertificateChainPem = sb.ToString(); + } + + return result; + } + + public static InfisicalCertificateResult BuildResult(X509Certificate2 leaf, InfisicalSignedCertificate signed) + { + InfisicalCertificateResult result = new InfisicalCertificateResult { Leaf = leaf }; + if (signed != null) + { + result.SerialNumber = signed.SerialNumber; + result.CertificatePem = signed.CertificatePem; + result.CertificateChainPem = signed.CertificateChainPem; + result.PrivateKeyPem = signed.PrivateKeyPem; + } + + List chainCerts = signed != null ? CollectChainCertificates(signed) : new List(); + List intermediates = new List(); + X509Certificate2 root = null; + foreach (X509Certificate2 cert in chainCerts) + { + if (IsSelfSigned(cert)) { if (root == null) { root = cert; } } + else { intermediates.Add(cert); } + } + + result.Intermediates = intermediates.ToArray(); + result.Root = root; + + List ordered = new List(); + if (leaf != null) { ordered.Add(leaf); } + ordered.AddRange(intermediates); + if (root != null) { ordered.Add(root); } + result.Chain = ordered.ToArray(); + return result; + } + + private static List CollectChainCertificates(InfisicalSignedCertificate signed) + { + List chainCerts = PemCertificateBuilder.ReadCertificateChain(signed.CertificateChainPem); + if (!string.IsNullOrEmpty(signed.IssuingCaCertificatePem)) + { + foreach (X509Certificate2 issuing in PemCertificateBuilder.ReadCertificateChain(signed.IssuingCaCertificatePem)) + { + chainCerts.Add(issuing); + } + } + + HashSet seen = new HashSet(StringComparer.OrdinalIgnoreCase); + List deduped = new List(); + foreach (X509Certificate2 cert in chainCerts) + { + if (cert == null) { continue; } + if (seen.Add(cert.Thumbprint)) { deduped.Add(cert); } + } + + return deduped; + } + + private static bool IsSelfSigned(X509Certificate2 cert) + { + if (cert == null) { return false; } + return string.Equals(cert.Subject, cert.Issuer, StringComparison.OrdinalIgnoreCase); + } + + private static List BuildLocalChain(X509Certificate2 leaf) + { + List result = new List(); + using (X509Chain chain = new X509Chain()) + { + chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; + chain.ChainPolicy.VerificationFlags = + X509VerificationFlags.IgnoreNotTimeValid | + X509VerificationFlags.IgnoreNotTimeNested | + X509VerificationFlags.IgnoreInvalidName | + X509VerificationFlags.IgnoreInvalidPolicy | + X509VerificationFlags.IgnoreEndRevocationUnknown | + X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown | + X509VerificationFlags.IgnoreRootRevocationUnknown | + X509VerificationFlags.IgnoreCtlNotTimeValid | + X509VerificationFlags.IgnoreCtlSignerRevocationUnknown | + X509VerificationFlags.IgnoreInvalidBasicConstraints | + X509VerificationFlags.IgnoreWrongUsage; + + try { chain.Build(leaf); } + catch { return result; } + + foreach (X509ChainElement element in chain.ChainElements) + { + if (element != null && element.Certificate != null) + { + result.Add(new X509Certificate2(element.Certificate.RawData)); + } + } + } + + return result; + } + + private static string ExportCertificateToPem(X509Certificate2 cert) + { + byte[] der = cert.Export(X509ContentType.Cert); + StringBuilder sb = new StringBuilder(); + sb.AppendLine("-----BEGIN CERTIFICATE-----"); + sb.AppendLine(Convert.ToBase64String(der, Base64FormattingOptions.InsertLineBreaks)); + sb.AppendLine("-----END CERTIFICATE-----"); + return sb.ToString(); + } + + private static string ReadString(IDictionary source, params string[] keys) + { + foreach (string key in keys) + { + if (source.Contains(key)) + { + object value = source[key]; + if (value != null) + { + string text = value.ToString(); + if (!string.IsNullOrEmpty(text)) + { + return text; + } + } + } + } + + return null; + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCsrBuilder.cs b/src/PSInfisicalAPI/Pki/InfisicalCsrBuilder.cs new file mode 100644 index 0000000..2aae813 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCsrBuilder.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.Sec; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Pkcs; +using Org.BouncyCastle.Security; +using BcAttribute = Org.BouncyCastle.Asn1.Cms.Attribute; + +namespace PSInfisicalAPI.Pki +{ + public enum InfisicalKeyAlgorithm + { + Rsa = 0, + Ecdsa = 1, + Ed25519 = 2 + } + + public enum InfisicalEcCurve + { + P256 = 0, + P384 = 1 + } + + public sealed class InfisicalCsrSubject + { + public string CommonName { get; set; } + public string Country { get; set; } + public string State { get; set; } + public string Locality { get; set; } + public string Organization { get; set; } + public string OrganizationalUnit { get; set; } + public string EmailAddress { get; set; } + } + + public sealed class InfisicalCsrOptions + { + public InfisicalKeyAlgorithm KeyAlgorithm { get; set; } = InfisicalKeyAlgorithm.Rsa; + public int RsaKeySize { get; set; } = 2048; + public InfisicalEcCurve EcCurve { get; set; } = InfisicalEcCurve.P256; + } + + public sealed class InfisicalCsrResult + { + public string CsrPem { get; set; } + public string PrivateKeyPem { get; set; } + } + + public static class InfisicalCsrBuilder + { + public static InfisicalCsrResult Build(InfisicalCsrSubject subject, IEnumerable dnsNames, IEnumerable ipAddresses, InfisicalCsrOptions options) + { + if (subject == null) { throw new ArgumentNullException(nameof(subject)); } + if (string.IsNullOrEmpty(subject.CommonName)) { throw new ArgumentException("Subject.CommonName is required.", nameof(subject)); } + if (options == null) { options = new InfisicalCsrOptions(); } + + SecureRandom random = new SecureRandom(); + AsymmetricCipherKeyPair keyPair = GenerateKeyPair(options, random); + string signatureAlgorithm = ResolveSignatureAlgorithm(options); + + X509Name x509Name = BuildX509Name(subject); + Asn1Set attributes = BuildSanAttributes(dnsNames, ipAddresses); + + Pkcs10CertificationRequest pkcs10 = new Pkcs10CertificationRequest(signatureAlgorithm, x509Name, keyPair.Public, attributes, keyPair.Private); + + return new InfisicalCsrResult + { + CsrPem = WritePem(pkcs10), + PrivateKeyPem = WritePem(keyPair.Private) + }; + } + + private static AsymmetricCipherKeyPair GenerateKeyPair(InfisicalCsrOptions options, SecureRandom random) + { + switch (options.KeyAlgorithm) + { + case InfisicalKeyAlgorithm.Rsa: + { + int keySize = options.RsaKeySize; + if (keySize != 2048 && keySize != 3072 && keySize != 4096) + { + throw new ArgumentException("RsaKeySize must be 2048, 3072, or 4096.", nameof(options)); + } + + RsaKeyPairGenerator generator = new RsaKeyPairGenerator(); + generator.Init(new KeyGenerationParameters(random, keySize)); + return generator.GenerateKeyPair(); + } + case InfisicalKeyAlgorithm.Ecdsa: + { + DerObjectIdentifier curveOid = options.EcCurve == InfisicalEcCurve.P384 + ? SecObjectIdentifiers.SecP384r1 + : SecObjectIdentifiers.SecP256r1; + ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA"); + generator.Init(new ECKeyGenerationParameters(curveOid, random)); + return generator.GenerateKeyPair(); + } + case InfisicalKeyAlgorithm.Ed25519: + { + Ed25519KeyPairGenerator generator = new Ed25519KeyPairGenerator(); + generator.Init(new Ed25519KeyGenerationParameters(random)); + return generator.GenerateKeyPair(); + } + default: + throw new ArgumentOutOfRangeException(nameof(options), options.KeyAlgorithm, "Unsupported KeyAlgorithm."); + } + } + + private static string ResolveSignatureAlgorithm(InfisicalCsrOptions options) + { + switch (options.KeyAlgorithm) + { + case InfisicalKeyAlgorithm.Rsa: + return "SHA256WITHRSA"; + case InfisicalKeyAlgorithm.Ecdsa: + return options.EcCurve == InfisicalEcCurve.P384 ? "SHA384WITHECDSA" : "SHA256WITHECDSA"; + case InfisicalKeyAlgorithm.Ed25519: + return "Ed25519"; + default: + throw new ArgumentOutOfRangeException(nameof(options), options.KeyAlgorithm, "Unsupported KeyAlgorithm."); + } + } + + private static X509Name BuildX509Name(InfisicalCsrSubject subject) + { + List order = new List(); + Dictionary values = new Dictionary(); + + AppendComponent(order, values, X509Name.C, subject.Country); + AppendComponent(order, values, X509Name.ST, subject.State); + AppendComponent(order, values, X509Name.L, subject.Locality); + AppendComponent(order, values, X509Name.O, subject.Organization); + AppendComponent(order, values, X509Name.OU, subject.OrganizationalUnit); + AppendComponent(order, values, X509Name.CN, subject.CommonName); + AppendComponent(order, values, X509Name.EmailAddress, subject.EmailAddress); + + return new X509Name(order, values); + } + + private static void AppendComponent(List order, Dictionary values, DerObjectIdentifier oid, string value) + { + if (string.IsNullOrEmpty(value)) { return; } + order.Add(oid); + values[oid] = value; + } + + private static Asn1Set BuildSanAttributes(IEnumerable dnsNames, IEnumerable ipAddresses) + { + List generalNames = new List(); + if (dnsNames != null) + { + foreach (string dns in dnsNames) + { + if (string.IsNullOrEmpty(dns)) { continue; } + generalNames.Add(new GeneralName(GeneralName.DnsName, dns)); + } + } + + if (ipAddresses != null) + { + foreach (string ip in ipAddresses) + { + if (string.IsNullOrEmpty(ip)) { continue; } + IPAddress parsed; + if (!IPAddress.TryParse(ip, out parsed)) { continue; } + generalNames.Add(new GeneralName(GeneralName.IPAddress, ip)); + } + } + + if (generalNames.Count == 0) { return null; } + + GeneralNames sanValue = new GeneralNames(generalNames.ToArray()); + X509Extensions extensions = new X509Extensions( + new Dictionary + { + { X509Extensions.SubjectAlternativeName, new X509Extension(false, new DerOctetString(sanValue)) } + }); + + BcAttribute extensionRequest = new BcAttribute(PkcsObjectIdentifiers.Pkcs9AtExtensionRequest, new DerSet(extensions)); + return new DerSet(extensionRequest); + } + + private static string WritePem(object obj) + { + using (StringWriter sw = new StringWriter()) + { + PemWriter pemWriter = new PemWriter(sw); + pemWriter.WriteObject(obj); + pemWriter.Writer.Flush(); + return sw.ToString(); + } + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalLocalCertificateLookup.cs b/src/PSInfisicalAPI/Pki/InfisicalLocalCertificateLookup.cs new file mode 100644 index 0000000..366ed98 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalLocalCertificateLookup.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; + +namespace PSInfisicalAPI.Pki +{ + internal static class InfisicalLocalCertificateLookup + { + public static X509Certificate2 FindMatch(StoreName storeName, StoreLocation storeLocation, string commonName, IEnumerable candidateSerialNumbers) + { + HashSet serialSet = NormalizeSerials(candidateSerialNumbers); + string subjectFilter = !string.IsNullOrEmpty(commonName) ? string.Concat("CN=", commonName) : null; + + X509Store store = new X509Store(storeName, storeLocation); + try + { + store.Open(OpenFlags.ReadOnly); + + X509Certificate2 bestMatch = null; + foreach (X509Certificate2 candidate in store.Certificates) + { + if (subjectFilter != null && candidate.Subject.IndexOf(subjectFilter, StringComparison.OrdinalIgnoreCase) < 0) + { + continue; + } + + if (serialSet.Count > 0) + { + string normalizedSerial = NormalizeSerial(candidate.SerialNumber); + if (!serialSet.Contains(normalizedSerial)) + { + continue; + } + } + + if (bestMatch == null || candidate.NotAfter > bestMatch.NotAfter) + { + bestMatch = candidate; + } + } + + return bestMatch; + } + finally + { + store.Close(); + } + } + + public static bool IsRenewable(X509Certificate2 cert, int renewalThresholdDays) + { + if (cert == null) { return true; } + DateTime threshold = DateTime.UtcNow.AddDays(renewalThresholdDays); + return cert.NotAfter.ToUniversalTime() <= threshold; + } + + private static HashSet NormalizeSerials(IEnumerable serials) + { + HashSet set = new HashSet(StringComparer.OrdinalIgnoreCase); + if (serials == null) { return set; } + foreach (string serial in serials) + { + string normalized = NormalizeSerial(serial); + if (!string.IsNullOrEmpty(normalized)) + { + set.Add(normalized); + } + } + + return set; + } + + private static string NormalizeSerial(string value) + { + if (string.IsNullOrEmpty(value)) { return null; } + string trimmed = value.Trim(); + if (trimmed.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + { + trimmed = trimmed.Substring(2); + } + + return trimmed.Replace(":", string.Empty).Replace(" ", string.Empty).TrimStart('0'); + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index 06b38a3..ff8de17 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using Newtonsoft.Json.Linq; using PSInfisicalAPI.Connections; using PSInfisicalAPI.Endpoints; using PSInfisicalAPI.Errors; @@ -8,6 +9,7 @@ using PSInfisicalAPI.Http; using PSInfisicalAPI.Logging; using PSInfisicalAPI.Models; using PSInfisicalAPI.Serialization; +using System.Linq; namespace PSInfisicalAPI.Pki { @@ -30,23 +32,23 @@ namespace PSInfisicalAPI.Pki public InfisicalCertificateAuthority[] ListInternalCertificateAuthorities(InfisicalConnection connection, string projectId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); List> query = null; - if (!string.IsNullOrEmpty(resolvedProjectId)) + if (!string.IsNullOrEmpty(projectId)) { - query = new List> { new KeyValuePair("projectId", resolvedProjectId) }; + query = new List> { new KeyValuePair("projectId", projectId) }; } try { _logger.Information(Component, "Attempting to list Infisical internal certificate authorities. Please Wait..."); InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.ListInternalCertificateAuthorities, "ListInternalCertificateAuthorities", null, query, null); - InfisicalInternalCaListResponseDto dto = _serializer.Deserialize(response.Body); + string body = response.Body; response.Clear(); - List source = dto != null ? (dto.CertificateAuthorities ?? dto.Cas) : null; - InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, resolvedProjectId); + List source = ParseCaListBody(body); + string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; + InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, fallbackProjectId); _logger.Information(Component, "Infisical internal certificate authority list retrieval was successful."); return mapped; } @@ -63,21 +65,22 @@ namespace PSInfisicalAPI.Pki if (string.IsNullOrEmpty(caId)) { throw new InfisicalConfigurationException("CaId is required."); } Dictionary pathParameters = new Dictionary { { "caId", caId } }; + List> query = null; + if (!string.IsNullOrEmpty(projectId)) + { + query = new List> { new KeyValuePair("projectId", projectId) }; + } try { _logger.Information(Component, string.Concat("Attempting to retrieve Infisical internal certificate authority '", caId, "'. Please Wait...")); - InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.RetrieveInternalCertificateAuthority, "RetrieveInternalCertificateAuthority", pathParameters, null, null); - InfisicalInternalCaSingleResponseDto dto = _serializer.Deserialize(response.Body); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.RetrieveInternalCertificateAuthority, "RetrieveInternalCertificateAuthority", pathParameters, query, null); + string body = response.Body; response.Clear(); - InfisicalInternalCaResponseDto inner = dto != null ? (dto.CertificateAuthority ?? dto.Ca) : null; - if (inner == null) - { - inner = _serializer.Deserialize(response.Body); - } - - InfisicalCertificateAuthority mapped = InfisicalCaMapper.Map(inner, FirstNonEmpty(projectId, connection.ProjectId)); + InfisicalInternalCaResponseDto inner = ParseCaSingleBody(body); + string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; + InfisicalCertificateAuthority mapped = InfisicalCaMapper.Map(inner, fallbackProjectId); _logger.Information(Component, "Infisical internal certificate authority retrieval was successful."); return mapped; } @@ -88,6 +91,68 @@ namespace PSInfisicalAPI.Pki } } + public InfisicalCertificate RetrieveCertificate(InfisicalConnection connection, string identifier) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(identifier)) { throw new InfisicalConfigurationException("Identifier (serial number or id) is required."); } + + Dictionary pathParameters = new Dictionary { { "serialNumber", identifier } }; + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve Infisical certificate '", identifier, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.RetrieveCertificate, "RetrieveCertificate", pathParameters, null, null); + string body = response.Body; + response.Clear(); + + InfisicalCertificateResponseDto inner = ParseCertificateSingleBody(body); + InfisicalCertificate mapped = InfisicalCertificateMapper.Map(inner, connection.ProjectId); + _logger.Information(Component, "Infisical certificate retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate retrieval failed."); + throw; + } + } + + private List ParseCaListBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Array) + { + return token.ToObject>(); + } + + InfisicalInternalCaListResponseDto wrapper = token.ToObject(); + return wrapper != null ? (wrapper.CertificateAuthorities ?? wrapper.Cas) : null; + } + + private InfisicalInternalCaResponseDto ParseCaSingleBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type != JTokenType.Object) { return null; } + JObject obj = (JObject)token; + + if (obj["certificateAuthority"] is JObject ca1) { return ca1.ToObject(); } + if (obj["ca"] is JObject ca2) { return ca2.ToObject(); } + return obj.ToObject(); + } + + private InfisicalCertificateResponseDto ParseCertificateSingleBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type != JTokenType.Object) { return null; } + JObject obj = (JObject)token; + + if (obj["certificate"] is JObject cert) { return cert.ToObject(); } + return obj.ToObject(); + } + public InfisicalCertificateSearchResult SearchCertificates(InfisicalConnection connection, InfisicalCertificateSearchQuery query) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } @@ -118,6 +183,93 @@ namespace PSInfisicalAPI.Pki } } + public InfisicalSignedCertificate SignCertificateBySubscriber(InfisicalConnection connection, string subscriberName, string projectId, string csrPem) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(subscriberName)) { throw new InfisicalConfigurationException("SubscriberName is required."); } + if (string.IsNullOrEmpty(csrPem)) { throw new InfisicalConfigurationException("CSR is required."); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + Dictionary pathParameters = new Dictionary { { "subscriberName", subscriberName } }; + InfisicalSignCertificateBySubscriberRequestDto request = new InfisicalSignCertificateBySubscriberRequestDto + { + ProjectId = resolvedProjectId, + Csr = csrPem + }; + string body = _serializer.Serialize(request); + + try + { + _logger.Information(Component, string.Concat("Attempting to sign certificate via subscriber '", subscriberName, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.SignCertificateBySubscriber, "SignCertificateBySubscriber", pathParameters, null, body); + InfisicalSignCertificateResponseDto dto = _serializer.Deserialize(response.Body); + response.Clear(); + + InfisicalSignedCertificate signed = MapSigned(dto); + _logger.Information(Component, "Infisical certificate signing (subscriber) was successful."); + return signed; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate signing (subscriber) failed."); + throw; + } + } + + public InfisicalSignedCertificate SignCertificateByCa(InfisicalConnection connection, string caId, string csrPem, string commonName, string altNames, string ttl, string notBefore, string notAfter, string friendlyName, string pkiCollectionId, IEnumerable keyUsages, IEnumerable extendedKeyUsages) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(caId)) { throw new InfisicalConfigurationException("CaId is required."); } + if (string.IsNullOrEmpty(csrPem)) { throw new InfisicalConfigurationException("CSR is required."); } + if (string.IsNullOrEmpty(ttl) && string.IsNullOrEmpty(notAfter)) { throw new InfisicalConfigurationException("Either Ttl or NotAfter must be provided."); } + + Dictionary pathParameters = new Dictionary { { "caId", caId } }; + InfisicalSignCertificateByCaRequestDto request = new InfisicalSignCertificateByCaRequestDto + { + Csr = csrPem, + CommonName = commonName, + AltNames = altNames, + Ttl = ttl, + NotBefore = notBefore, + NotAfter = notAfter, + FriendlyName = friendlyName, + PkiCollectionId = pkiCollectionId, + KeyUsages = keyUsages != null ? keyUsages.ToList() : null, + ExtendedKeyUsages = extendedKeyUsages != null ? extendedKeyUsages.ToList() : null + }; + string body = _serializer.Serialize(request); + + try + { + _logger.Information(Component, string.Concat("Attempting to sign certificate via CA '", caId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.SignCertificateByCa, "SignCertificateByCa", pathParameters, null, body); + InfisicalSignCertificateResponseDto dto = _serializer.Deserialize(response.Body); + response.Clear(); + + InfisicalSignedCertificate signed = MapSigned(dto); + _logger.Information(Component, "Infisical certificate signing (CA) was successful."); + return signed; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate signing (CA) failed."); + throw; + } + } + + private static InfisicalSignedCertificate MapSigned(InfisicalSignCertificateResponseDto dto) + { + if (dto == null) { return null; } + return new InfisicalSignedCertificate + { + SerialNumber = dto.SerialNumber, + CertificatePem = dto.Certificate, + CertificateChainPem = dto.CertificateChain, + IssuingCaCertificatePem = dto.IssuingCaCertificate + }; + } + public InfisicalCertificateBundle GetCertificateBundle(InfisicalConnection connection, string serialNumber) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } diff --git a/src/PSInfisicalAPI/Pki/InfisicalPrivateKeyProtection.cs b/src/PSInfisicalAPI/Pki/InfisicalPrivateKeyProtection.cs new file mode 100644 index 0000000..0a793b9 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalPrivateKeyProtection.cs @@ -0,0 +1,10 @@ +namespace PSInfisicalAPI.Pki +{ + public enum InfisicalPrivateKeyProtection + { + Exportable = 0, + LocalOnly = 1, + NonExportable = 2, + Ephemeral = 3 + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs new file mode 100644 index 0000000..e6a82eb --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace PSInfisicalAPI.Pki +{ + internal sealed class InfisicalSignCertificateBySubscriberRequestDto + { + [JsonProperty("projectId")] public string ProjectId { get; set; } + [JsonProperty("csr")] public string Csr { get; set; } + } + + internal sealed class InfisicalSignCertificateByCaRequestDto + { + [JsonProperty("csr")] public string Csr { get; set; } + [JsonProperty("commonName", NullValueHandling = NullValueHandling.Ignore)] public string CommonName { get; set; } + [JsonProperty("altNames", NullValueHandling = NullValueHandling.Ignore)] public string AltNames { get; set; } + [JsonProperty("ttl", NullValueHandling = NullValueHandling.Ignore)] public string Ttl { get; set; } + [JsonProperty("notBefore", NullValueHandling = NullValueHandling.Ignore)] public string NotBefore { get; set; } + [JsonProperty("notAfter", NullValueHandling = NullValueHandling.Ignore)] public string NotAfter { get; set; } + [JsonProperty("friendlyName", NullValueHandling = NullValueHandling.Ignore)] public string FriendlyName { get; set; } + [JsonProperty("pkiCollectionId", NullValueHandling = NullValueHandling.Ignore)] public string PkiCollectionId { get; set; } + [JsonProperty("keyUsages", NullValueHandling = NullValueHandling.Ignore)] public List KeyUsages { get; set; } + [JsonProperty("extendedKeyUsages", NullValueHandling = NullValueHandling.Ignore)] public List ExtendedKeyUsages { get; set; } + } + + internal sealed class InfisicalSignCertificateResponseDto + { + [JsonProperty("certificate")] public string Certificate { get; set; } + [JsonProperty("certificateChain")] public string CertificateChain { get; set; } + [JsonProperty("issuingCaCertificate")] public string IssuingCaCertificate { get; set; } + [JsonProperty("serialNumber")] public string SerialNumber { get; set; } + } +} From 2489b7adca98d7677d78272bda4e3d4ad239a027 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 15:11:49 -0400 Subject: [PATCH 03/27] Consolidate Get-Infisical* singular/plural pairs; fix PKI subscriber 404; add Get-InfisicalPkiSubscriber BREAKING: Removed Get-InfisicalProjects, Get-InfisicalEnvironments, Get-InfisicalFolders, Get-InfisicalTags, Get-InfisicalSecrets, and Get-InfisicalCertificates. Their list behavior is now the default parameter set on the singular cmdlets; supplying the identity parameter switches to single-record retrieval. No back-compat aliases. Fix: SignCertificateBySubscriber endpoint resolved to /api/v1/pki/subscribers/{subscriberName}/sign-certificate (was /pki/pki-subscribers and /cert-manager/pki-subscribers, both 404). Added Get-InfisicalPkiSubscriber (List/ByName), InfisicalPkiSubscriber model, DTOs, mapper, and InfisicalPkiClient.ListPkiSubscribers/GetPkiSubscriber. MAML help refreshed for all consolidated cmdlets with 2 straight-line + 1 OrderedDictionary splat examples each. README extended with extension guide. CHANGELOG updated. 230/230 tests pass. --- CHANGELOG.md | 22 +- Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 11 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 275968 -> 284672 bytes .../bin/en-US/PSInfisicalAPI.dll-Help.xml | 434 ++++++------------ .../en-US/PSInfisicalAPI.dll-Help.xml | 434 ++++++------------ README.md | 72 ++- build.ps1 | 9 +- .../CsrAndRequestCmdletTests.cs | 16 +- .../PkiEndpointRegistryTests.cs | 31 +- .../Cmdlets/GetInfisicalCertificateCmdlet.cs | 67 ++- .../Cmdlets/GetInfisicalCertificatesCmdlet.cs | 76 --- .../Cmdlets/GetInfisicalEnvironmentCmdlet.cs | 24 +- .../Cmdlets/GetInfisicalEnvironmentsCmdlet.cs | 34 -- .../Cmdlets/GetInfisicalFolderCmdlet.cs | 24 +- .../Cmdlets/GetInfisicalFoldersCmdlet.cs | 38 -- .../GetInfisicalPkiSubscriberCmdlet.cs | 50 ++ .../Cmdlets/GetInfisicalProjectCmdlet.cs | 26 +- .../Cmdlets/GetInfisicalProjectsCmdlet.cs | 32 -- .../Cmdlets/GetInfisicalSecretCmdlet.cs | 78 +++- .../Cmdlets/GetInfisicalSecretsCmdlet.cs | 76 --- .../Cmdlets/GetInfisicalTagCmdlet.cs | 24 +- .../Cmdlets/GetInfisicalTagsCmdlet.cs | 34 -- .../Endpoints/InfisicalEndpointNames.cs | 3 + .../Endpoints/InfisicalEndpointRegistry.cs | 33 +- .../Models/InfisicalPkiSubscriber.cs | 37 ++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 68 +++ .../Pki/InfisicalPkiSubscriberDtos.cs | 43 ++ .../Pki/InfisicalPkiSubscriberMapper.cs | 95 ++++ 28 files changed, 919 insertions(+), 972 deletions(-) delete mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs delete mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentsCmdlet.cs delete mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalFoldersCmdlet.cs create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs delete mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectsCmdlet.cs delete mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretsCmdlet.cs delete mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalTagsCmdlet.cs create mode 100644 src/PSInfisicalAPI/Models/InfisicalPkiSubscriber.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberDtos.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberMapper.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 6703ba2..4efa7a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,17 +6,35 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.1911 + +- Build produced from commit 51bf819c37e5. + +## Unreleased (carried forward) + +## 2026.06.04.1906 + +- Build produced from commit 51bf819c37e5. + +## Unreleased (carried forward) + +- **BREAKING**: Removed the plural-noun discovery cmdlets `Get-InfisicalProjects`, `Get-InfisicalEnvironments`, `Get-InfisicalFolders`, `Get-InfisicalTags`, `Get-InfisicalSecrets`, and `Get-InfisicalCertificates`. Their behavior is now folded into the corresponding singular cmdlets via a `List` (default) / single-record parameter set pair, matching the existing `Get-InfisicalCertificateAuthority` precedent. Callers should drop the trailing `s`; invocation without the identity parameter (`-ProjectId`, `-EnvironmentSlugOrId`, `-FolderNameOrId`, `-TagSlugOrId`, `-SecretName`, `-SerialNumber`) now returns the list, and supplying the identity parameter returns the single record. No back-compat aliases were added. +- Added `Get-InfisicalPkiSubscriber` with `List` (default) and `ByName` parameter sets, backed by new `InfisicalPkiClient.ListPkiSubscribers` and `GetPkiSubscriber` methods, an `InfisicalPkiSubscriber` model, and corresponding DTOs/mapper. Use the emitted `Name` (slug) on `Request-InfisicalCertificate -PkiSubscriberSlug`. +- **Bug fix**: `Request-InfisicalCertificate -PkiSubscriberSlug ...` was returning 404 because the registry's `SignCertificateBySubscriber` endpoint pointed at `/api/v1/pki/pki-subscribers/{subscriberName}/sign-certificate` and `/api/v1/cert-manager/pki-subscribers/...`. Per Infisical's `v1/index.ts`, the subscriber router is mounted at `/pki/subscribers`, so the single correct path is `/api/v1/pki/subscribers/{subscriberName}/sign-certificate`. The redundant `cert-manager` template was removed; the PKI endpoint registry tests were updated to match. +- Updated MAML help in `Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml`: the six consolidated cmdlets and the new `Get-InfisicalPkiSubscriber` each ship three examples — two straight-line invocations (one per parameter set) plus one `OrderedDictionary` splat example. All in-text references to the removed plural cmdlets across other cmdlets' examples were updated to the singular form. +- `build.ps1`: `CmdletsToExport` and the `Test-ModuleImports` expected cmdlet list were updated to drop the six plural cmdlets and add `Get-InfisicalPkiSubscriber` (total: 34 exported cmdlets). + ## 2026.06.04.1825 - Build produced from commit 19615363e356. -## Unreleased (carried forward) +## Unreleased (carried forward) ## 2026.06.04.1820 - Build produced from commit 19615363e356. -## Unreleased (carried forward) +## Unreleased (carried forward) - `Install-InfisicalCertificate` now routes chain certificates by self-signed status instead of dumping every chain entry into the Intermediate Certification Authorities store. Self-signed roots are installed into `StoreName.Root` (Trusted Root Certification Authorities) and non-self-signed intermediates are installed into `StoreName.CertificateAuthority` (Intermediate Certification Authorities). The leaf continues to use the user-specified `-StoreName`/`-StoreLocation` (default `My`/`CurrentUser`). `Request-InfisicalCertificate` already routed chain certs correctly; the same routing helper is now shared by both cmdlets. - `InfisicalCertificateRequestHelpers` exposes a new public `GetChainCertificateTargetStore(X509Certificate2)` classifier and a new `InstallChain(IEnumerable, StoreLocation, bool, IInfisicalLogger, string)` overload. The existing `InstallChain(InfisicalSignedCertificate, ...)` overload now delegates to the new collection-based overload, so PKI chain-installation routing is centralized in one place. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 5ffa120..20bb1bb 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.1825' + ModuleVersion = '2026.06.04.1911' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -12,7 +12,6 @@ CmdletsToExport = @( 'Connect-Infisical', 'Disconnect-Infisical', - 'Get-InfisicalSecrets', 'Get-InfisicalSecret', 'New-InfisicalSecret', 'Update-InfisicalSecret', @@ -20,29 +19,25 @@ 'Copy-InfisicalSecret', 'ConvertTo-InfisicalSecretDictionary', 'Export-InfisicalSecrets', - 'Get-InfisicalProjects', 'Get-InfisicalProject', 'New-InfisicalProject', 'Update-InfisicalProject', 'Remove-InfisicalProject', - 'Get-InfisicalEnvironments', 'Get-InfisicalEnvironment', 'New-InfisicalEnvironment', 'Update-InfisicalEnvironment', 'Remove-InfisicalEnvironment', - 'Get-InfisicalFolders', 'Get-InfisicalFolder', 'New-InfisicalFolder', 'Update-InfisicalFolder', 'Remove-InfisicalFolder', - 'Get-InfisicalTags', 'Get-InfisicalTag', 'New-InfisicalTag', 'Update-InfisicalTag', 'Remove-InfisicalTag', 'Get-InfisicalCertificateAuthority', + 'Get-InfisicalPkiSubscriber', 'Get-InfisicalCertificate', - 'Get-InfisicalCertificates', 'Search-InfisicalCertificate', 'Request-InfisicalCertificate', 'ConvertTo-InfisicalCertificate', @@ -60,7 +55,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '19615363e356' + CommitHash = '51bf819c37e5' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index 634d6d87badd09d7fd2f64c4c144439ae966c096..bb515ee94a1250e90b37e81975835b4e95007007 100644 GIT binary patch literal 284672 zcmd442b|o*`Nyr(?rPhe?e(4S&IN1?XT~(ly;oB#&|->>jp@Ay2qrWK z5=ep20;!br1QH-5Apsm(2Jfmk*~KKA4Yi{e)gKdW0G9%OHu=3P!rka*=!{N{T(Z^PYN zyhkQyycVVJ{qQe8?DV`+rmr01#HsZzE*ARPp1xq(lBK?vT`XzlcXifhleCM8@T{My zpP57Bk8H0uaYo*IlgDy%MI7P&#F6f+&H(pxW|#MLWuiL+FIXPtaikQ4-8`gLj{C&! zHW)0dkB9Wc2Lpm=0=n!kk_X2TB))({bQI6@7s*32@h^qSA>YvvorOWGzev1Rh(5|i zgkP#{h3Iy4u`kn69aD@Z^5CAn{Ip`U1}X?Q(kA<~@bKesYUP9q z;cd~pxtn*+x4mv;OZ$whce$p;`w4%}qU1K7=Ay*U1R+rnlsj9iVZN}etr+c%FLDz@ z!cyuRU5xf^Ue^3#Z=vge)THWD$J#d=Lir?pV^!laFa&>HwU)EaC3Zc(0 z^ya$`DCYx;^*bHCYx;|bqipX~KeJc`fSVmq0icd`Km~wi%>fmFq5&0vk^vQfvH=wU znknao3P76y6>GXyL_9dk3{(I{8&Hw5N%iU6RDsQk0Tn5mW6eMXHroxT0CX5ok-Bx9 z8K}S}t(|+S3IHvZ11jv+_8A%P9@2(LOwuOe;Yrig?MFN(xyWRyqug~h@YPbOek9dW zj~@}?iKT)c5x0TZ5E$*_ED)PPw4c+&R}k&*G%*rH2Z|1&gB`-VLAa6dLmi+IO~By* z$zKy^_}(s@c>;b8Lb6D;x4tH|Ysrr$ORHM#%1b3#%4p5lTBzlNLbMhjFBN8~@AVa> zd@aaFYjg2R5Us-rho!vwUZ=PA9FIVFp0s&1pdQ($;=7isG`3~sIG#5#-|L4x+%|d7 zv0g}vP~s8wb;X^g4Y_|Safm;car}CSm7cC>Jvn9jGM&|yE@?nYJ>3z_OKCBo&1Pz2 z{6!+_HIP(^rCtg1blkyXmCTitfr-va2rQLWbeH2?j*=_&W+|M(Az$BIdK}F<-t#&- zylxuRmWiY}eHM>QU&&awyp`j`RqSUHm$|H#R_tAlHy_I7o_s`|U8>Xcl%m-@3P5Bf zV6Hs7Rqre`{ZvT#iN=r^_C`Z*yUzVs5>^Mz<* zXj@Q>HsS0#1QB@u19f^e3Q|9Lr$;M4=74k zFthl8td|WI$+6$_{9t8pAXe&I;g<9ptJ6s9!0RGLs7UZ@zVj;br{7!O8XIKrZ8()@ zzshs+(YEN;!kp*0D1?{?ZS_l9ynrr4t~ep-m&SJyIQpjXV|wn6pVIUA_&ahAaW06? z;U;deu5A2ja?4+vR+bE~(h@jV*O0SwWvR0g_klvZ7DVSK7dzL=UBBaZG z<@k6kxc*>(2{x0GI=B1Xci-(_ShvT}^-q1T%lkvnqGeU$Y%Xy|5q5D#;Uvy>z;Ywb zB$qYf?9Ztm>ZrjMg2S(fZew1EX~(jaF}K3ZqZd&`5Y=iLdqerxDDx)EoP7rrD~5 zJHzX{a3Fejhr~phcpaQU#0TqC$22=oOJ)IjW z0Mt_sr~pt19Z&(7WQ)*(XP_cw zK)dG*RNw>+paUuZWPAry0B8>#PywKYb3g@vw$1?+09ri-put|02Y^nfI?>V3XK$Yi!3INrg11bR2WDclEJ&lUV8K}S} z^^yZB08}~-r~pv=IG_SR1>}GV0M(BJDge|!4yZ^yo(jnss7M(cXa*{9;vfSm00$dT z0XW2f3c#TTRHPg~%nVdu^Kb(y07n>50XWit3cyhYQ~-`Ppd$6OW6VGWHjg!+0&tuG z6@cRnr~sT`Kt;;&d1jyjn5YD!CGoSovNqmXr_OeLrd|B_c^>OVPiuZxZ>RK!-tT*?@AdJlF7dnT zTIzc+*YY0B3oxZsUx0}?_X6yUxJUX?*6@HXi*B_fD6O+7jl(Dgf6RPyx8!fC|7322`Yc{1G!yfz2BYr~uq#Kn37t11bO?HJ}1;ivbmY zWd>9LZZ)6+@G%1_0Jj-X0l3|Oic}EpFas6XywiXRz+DDZ0G1n20rh+IDpHO=Z3Zf^`85M70ADwt0`Lt3 zDgfU!paSqM11bRDHlPCV9Rn%=-!-5D@I3=60M8gu0eIGc3JcS(lab*}Phab_)VJxy zKfrqW1NC!qZ6Bzg7q=$PD0qC&^Cr-~_5UU z$LDd+Acxl(;PAuhu+fnno;Kj#*Y#ebBj4LAo~mUdIk$DTXRG6jmF%+iTt03odZ$)$ z8kd!9*8wtYRAh+gHNG>;J^Q+IG>skl%3bk}9NgFGO#B6OHk!nPtEeG6A7XN2#UaJ>v%-J85mCioE824Txw?U z^|@_85h-gCX)S0G$!nArw1}AQUqm)A7X}oOLfpTI%rbk!6p=#w6ZPdB3rJsEHj<0z zWKxsT@;b)qn{2cRxNU4EJOz_l4WH_rM(0D@vtzUR#VU-rN*A(CxwkzxHs?xNUm}<3Rj~twT`8WcndS64V>ZGD(-rWhK0eLr-vv)DmX1**pp3uj{ zAm?1(9{Qoi6Oy?buF#0Tw9vHH>A325lOVbnRmtU}OZD7r26nS&4$kAzc4jZ!v0l%^bX=aBgOfqwSePWR6?a zZZswY1@9kvaiCoAs-YM20iWzVxy4N1b6!cFIjh&eL!^;+;t8xzLE$9=$kEE_lPy ziwop}ml?gdh>P$QAzy(+F-}whdSO9@>~ZzHEsx|gbp2(F+6$FJ5WRqs^NV`UM?cnc zGiTq5OB#Pe4ZffmYT&5beyUp}}$cy^adG*tYSn{G=xxC2W zN-8g2=<;Ivv-%~(fGaYEIxlmYgTy>~GP$^1E}l*0A2UR)~|-%c*B zmkZt|)#M{wxctc5V-PJEm>&<7{P+$=E_1w&lpTN1{^5dIoHyeFQ zp8pHIC`7;1b0c$(8I(C+B?=0Xb5@x-+bfbe@5S|aBjg8?IS<64p)=>hVv=;fBy+mF z`Ao~rM>q54vn`%CWtDmJF?=j}Q_hk%|BK55>&XW&8@`@=&`ke_ys1x}S3lF`O}Wy% zSzWJDNxD|Cy-=rHqj`n_gCII`mx3nve8$$ z*LrS$ZSZEYJZWwZPL|eY|L$pLtKbG%+B({^+34G__B>+&GJw)ID;s^cADEhrp6Lge zpz{4RsBKdJ59!_GT#Ekcv^Wy|-D$Z$`lr)!YxHk)d$!(&W>V)$G08`sT)BWozUV@f zl~XYaoQXtyRB-y6qD!LjPAlj3T+)o?WZG%9z2BSI<{grWG~wp8m&TSxYA2b^irwdM zGQI{$h6~>JxWOjomv4D$jio=Dy?9wfZ(9ph6d zc>(>5o||RobbIFDvJ>5}cC*nL*lE0D$VI<*jL)g9MupctsKVQibk0WNtHG}b_o&%f zVkWZjiZG~(dqOgc^!o=?aqXRrOr-NnJ#XEXLoRUjTRUqt9w*(_A>Fd!4Ggq4Iz~B7 zg=LK~+HxlP3>Vq4ezchEF)hd!!k^!C!b-B4Q=$Pv|zy)Dtw!P$r zE;?7X@PDOrcr77fv{grZVpFgH^vF09}qolB|_yXCK#Xjx&IS?9F)H15c1^l9h4zCP|QlsT1D zv9dm*Qa_KlW6pZFq{wEzj66~B*T_c~AX*C=6`ADAzD#JRXKJ$pUhX$Lpf{OuxX9d? z?A#!=B|5W-8$~8iiyJFCk_nkVO}k?EPI33@+|tzDeFd4RoASa->6-)UFz5X-$?Z9c zXWIHZ{jIlbC}Y0ky!Ezl^B8>ZK(BhC=^MS;Q>I_^CjHTAndiyykT*^0&nP5h$(p;q zwS)Lu#P-DKB7)aBvm=Oq(!5-mC3{p`I?KK$?UWnIakH2ykzCUC_GabseN93)-J2CA zRm7Aa{$!GEOBysjN&Y|SD zgLH0sb1LuR19g(R9OF%SZoD%GEqvMNJRGR?W}?q>riXMACiR)Y4zO2qFL~DshopF^33RRWx41|XYT@>kFIt4BGK2QSurVJ z#`4h_T=X84 z1W#7B79xhvgK*sep}h{bG_-94Li;N*aG@;{DEB@%%e(0DW_anc$~^Po!n?sldl{%t z7EkaQRZh96TTW!*33|>&ll08&G|r7=?35HtN6XPTH(azlidig&4yxp{$R;d(lxRu5 zw@I`NSnw;6;THT#1PzLo=W$D;C0Xy=%mwRCYQ#%(z3)NZ#jiEvg`T=s8$Mo|pA1rK zJCl4+pCmP61{(5RtDCQ*|NZAsL$ zbD<+!EUc1+ve_iluuwKTbgp?>B0)!6a|5zX-x|&6$u;uLq2A@cY{t)Bz8Qte?w{S;=g9ITuq9mi%mzA7GVbR3&})|!m~;QdCv-|tfAf94}FXz6D7ssQ}N zfC>OZmCl9=z)uaR05FK@Y^VS*M(ThHz$*q+02r%sHdFvs7*GLV6wBFA0eH=T3c%|I zRM=Ds4BjvU6#z!JoLedYZy8XLy7d=kpaPq38&Hw5$>5lCQw25|h;u+i%I2@kKm|5` zZ9oO!HwIJyerrGl;CBX8q#S4T#ywR9HveEi1%NRdXG4YEs(pYjlPBa)=kM0XP}R^= z_zit!_j<=f&EIh$>o^5Q|H-O_KZsuG^q)ktmRWB6vuNMxzoHwC{GAJNL|~M47XB$Z zaQfe(3r@FCH-zhPh)NFp7sIeuK&u1qHoz!=u8G{4FifWm%A8vI&8!2xgdPZQ&6jf0 zIklHbk3^b_WKQknTqphA0ds1vz{JXmtOK<`h(B45Pyt{#&t(x6fIk~h0r-mn6@b4QPyzUx0TlqohMc1+0RJ$c0>Fro zv!Md;F9Rw7G|J9~3c!C1r~v%efC|7$11bRT8c+dX9LhPW!U_ZiEoPtsK-=eRssLmR zr~oj4*r~okHDgaE-cQ#Z2#u!imV8*?(p#m`0fC>Op;++i@fDQvH0OJg(05JQ^-J$}}Wk3ah z*=5d#id6cHHv<*eWPX{msUl@_q8X^b<|G3u%%+s3gM81Mp>>BFbE9OI>Q}njZ8s^V zhdI5672q0c;Hk{yIy%Cc?J4>w(SdY20^YhHezdpTbEy~}<1FrrHY?SJ;c?FJ!(#CS zrwO|_;6SMzhSsEZMdTvp4u=xKW(_Z8paL73)6->tKsPl!;8hxkIoQq zIfv*{2hM7M%K^PJljRbArq_3CKz5-W*&u1JCTM$gEdi$GxQ>(VTW~!h6JCNtNrQC* zVCa1dK7t7imb}w^koy);Xx6YoqXNJ@O;_Gj045ty0hnSy1z;@$DgaXrr~s^OKm}kO z11bPL22=p18BhUO*MJH@Xg~#kCCtw2DgeC(Q~;_5Q~(%+bhoGg^cheAm~KD?V0{BB z05c4z0Bm4D1z@HD6@Xa=Q~)+KpaQUw0TqCa4X6NYVn798wgDA@IR;b!<{D4|*wlau zz-9(i05&(E0|{Vi%I3~ypdw|kiy5fEiCqn-0PJQ!1z>jrDgb*JPyzUm0TqBf4X6O@Wk3aB zZv!d-`xsCG*w=sxz*zDgXx5kxGsu%|HbX*k8=73(PNyxQS?}+Zx-F*^ev)0oxW9cx6`+Yp5XKy zq9-|hm*_Q}W+HSDO>z1j(NmrNr08{=zEAWtr$3FBUJ4`MBK18Z3Z21*J30NV=v|!tf#}_weqQt*PXAE!o=*P=9j=`Lu#2Gt z=qC-ZuLD1A0QN5w8!tBi+qwvNwE+$S==-U(_cN3BexkPbHW3#=#ns8?euuj*E&5>^z}}!A^Ia|)=0kJwV{Exm~p~c zgt2})&X)W+ynfL`vzZC;*^ET-32#Pg#P;{qxYzm7^Q0CJIdjc=$@^YF=SR1k?z z_=ajAAISst+m3uo+>^N9khBPwaYL!29Nx+~`WT1uirlo0@(M4xl}}_lB==yC_l8e!Qj1?vixS?H z#k@`lF1?cM=~VC@e^Rza^SmAWkk}0}*&N9gqVT!wIkY8a8*BM)VJPTc951m=O>`fk zoUgU#!}YM+nlHE;r%6&pQ!(u0i*3LjQf?uR?R``B*4xm1+vLq*11$IX<9jFZDE*$b z3+GLER%gkt1^)Qyh3fQR!V#rv_*@^+6@Ch5Cr`POfv=YE)AERN{3k+J{|tIzFnP)m zrED!5bRSX5)N;Y(F-NdV);1YgBJOuj&-vq5w)A$%T5;bynCB2^TkAb0?p}*g=$$y! zKPzq}dxnjPj}d-pireb%fI;7A4R6w7s)6 z4$JZN;#wD07S``|b=61R>0wxOr|NJPcSg(6Y}7RqUCzwGaW4~H2h)-4N9CNaPGV}*=S4CZp*EViz6H&wGGVwh4YS8NlTxF`=2v!7izfqge8^7j z@3H%fm13=%`-{!{`CP~47jVHGdSReL^)F)D+R@hV&nD(xsZvsxT%J$%LLFZzX{M+Z zihXUBQd_l9z*_nVPY!$n1CC$f8PPK0fUo@@3w5svmjZeW0c1MW-bXt$@uT52bSr8GQyd z@D7X>YtBLMBwBI~dKc09+)T8G=uf~ieR++bDs{LNc)cihw7M{7t5aD;r8$O`4M}1Y zNQ_)-mE_L3#K^jQ^CLo^P3If(T{AHX&BSQ)Yx$x}kYZj_gAEId1(z7bW?E?c=)3;m z-uhSD+$~~)u+Nq9qd^KKzth3kjUc&JV)Nue3^W{V)e39HG#FV)ZOuX%=j*rebtdiW zX2B`D{AzBjV{Q-?wJr(0RPtJOYUIo$G7@KHl)Im^vNnn~#pg@&nmbwg&i6LB!|9{w z({xg!K8cfl^b|)|2&68Q@pwk{y-g*(r3jVkPjf8iBW5{dj3|kxV)QJ>zGwPR zUm-N)U2P*nHimHRqR$S7(IT6xl9l}FZ6@i|6@4E!N?M+J;*U|~MLz&c>j}ET=Mc$N z{9?mI3yC~K>gO#uZ;m^gV&waJYh!+rT#Tq*bOS>w8a=9SGXWqs(Y2VeY z#*VeuAr-tI9cMrV;CKTn04Eqw0hnh%1>i&jDgY-LPysmEfC|7V22=p%8&Cm=45$E{ zYCr|xGy^ICu>lo;x&ak{(+#KqEHIz~aE1XDfHMuK0Gwq&1>kH0DgX-&r~oW7paO7? z0TuREiou0upaO7_0TqCY4X6NIVn7ApQUfXgml;q2xZHq>)Z?!(0~Of3(trxURR&b- z;!lx1Sr?0GbEDj=&5jCgy2gMCd!FX)oX0SzkIhNan!|{k85;C;LcFH zBRQ&UwnY!dWa>X8$Cq+Jc)oNBav{4v2Yz@V$JR_XyqI$vb7)?~67}qlIMsiwMWntI zBW4?imvD~Q{axlPi@5{m0$kb4dejKg=cBG&04)XEX8<|=?Z&@z`8Qia;74a-TFz^H zOrOHJmCuyjoTh&c>Op>G>rub6L$T zd4*GJ{J7lsDzc}LsnhV4WZg$8dW}PG{dM7)`Wr&tlmp+nOTGFq=jSW8!hiAC#SOl6 zmlnD?Vf*824El$QewqGQz#5#ZYsLTIo`#=-xMOWD;|=w=uO1~t!#qUh#9fOsTl0+i z+dQ}aOAe);V97h2{pbV&8eYT!@+&1LrpT|AoSY(jF6XZKDe_w-r>4m7lxWULT>ib1 z*z5%LKLC1IrcHFvRI?{wKf;8WNJHRlG}Te+oda^uXE!oITm{T9c#5w!5Wp^ zAeX+Mb}5MdA+F0_lrjUqRR0%;a{b>NdzSo%V`skpU*Rh`MDL2?y{*)`q=jRl?sKeX zN!qyBm+)SUJeBgy4sSL&D7gX z9>?7`iolyPt?AzVxVIhd<-*HJk&Z@s)-(k2Nzqb}T^^LNF2~c-R zfQmefIkyMUOqWFF^0f+`jwdn8+jPuLgQ$#I=LX%F$Qwj>1y5=Zn3*gq3re*KG?W;% zp;;%)QC500#K)RY+#QYXyQA2iU%{5cpXByeD$TG=^OoH0-VLQqmiXJAu+VMk>Xpq8 zN_@=9oGe?H$!L!_Enm0Ba@Os{T;B4%UAb=u?rZk4N;o0YXC;f3tCRAY#nj)nTY7B_)9DA#{dhtth)*W2Cq^CktX2rRqjBQnAdaC+ zPQ!+58d8eS=y%!J`*g-_Q5VL&tDHS~owNzId&%{3k^H>I4bmD&Im>%=j=dd;i~jQ` zJCcmi*Hu3T@3>#jNKN)EF~L$?j~C*__-YP19g3ZpfSI_u4pa^uK}W={&q0q)F)X`@ zRQd2)GDMQ|3K{+Rj%rJmn7)j$ytKoo;eF^Jwrk&2bnWBM2cTeNL@43> z-h8x}Tqe^u^U=8|B2DU&BZwpFh2h-lnl4rT>D0t6Y}*sAhtDSRhy?;<2)PigDG$oW zd-pTqogiOKjND0{MV%#Gm(_dL0sS0w&zh{yl5O{^lIBv5XS8_U?t{~q9^FuT5^Y3s zF#6|GWO;ZSm&xGKaC42_>Ys8pycN4lAeHK*5KX}c%n5C#*{R}NnHgzS!8?Fh4)Tj2 zk}+gc2)UW6UMI<~g%hmZNdMf5yw<)((gfjJJdE|=xjq_?tLL#bNG^H<0~WTVo;j*F zd1ie%)_Z7X?$C2Sx=U_%YxPGqV&0odT<$SAE?q7w#}DCv zD=*0?GI93n2D2e}w;IT;TUiXX$qH@t&NqoJn=UnuTo`dMudd^3`)pH^Gy`GEF zAN5>{{!h3@jc+3A0Y-qq>`mbWbA|4;3la!($Tff^dw+bN!$*I zFBebpS@_5?Tkdw8oKfxE8hooP*&+zg4WBkysOb^rNC~Yu& zIZHToK-}ERO+$7$_~2ks!|0+bSF^nNNxxEm zq;ze7<2Q zur~!FZ(6AU+-N|Bjf7!vlNqQ0+-yJv;G+gq0B$j$0hb7Dgd7_ zpaSqo11eH6cdr?!z~+4hQ~*9@Kn38_22=n(V?YJqvj$WE?l+(!_4o(OK!q7-e#v;7 zB<0mj*Z2)zV<;FOm+bg$r|&_#I?hcrmh0%d&g_$-pK^6aQXq! zFFO4oI+^z)(#`Gpu`_$PX(rN{z2wXuZJLR6WYW?~49|)6a0~OeO+JFkc*9@oteBFQwb88~=oEVbz zJ}i01m9a7LSyb!sLmb>NydP#r6Na0zoXSaWqm|inWE1@W$UA)wqt^Pm5ZRZt)K*`Q zqYMBC^Il_?E*%;?oK zZmDZu8G!J;6TEesoK)O+X7hO7LBob?qrw6P zT_jv=$FMnWOZajtW)~K04A#e%NqhPH1a1cV+x>#Q;jBim<<&Qd-@LcWUM}3yKVeKp zzc*`EncRKV!&qZ{ehZ$-Z`W~*w&EZ^VeqV#85Mx<8&CoGfdLhO=M1O-Ja0e+-~|IJ z06#RK0`Q^%6@VWZPyzU{0TqCs7*GLt$$$#LPYtL5{LFv~z{>_y0A4Ym0`RH<6@V26 zQ~-W%Kn37611bQo8&Cmw!+;9Fn+8+>-ZG#9@CySf0B;*m0r;f>6@YgPr~v%RfC|8` z4X6P8#()aIZw;sb{LX+1!0!#H0Q|v#3cw!?r~v%QfC|9>8BhWEvjG)=zZg&f_^SaG zfWH|~ag!geMMc@uH<5W}YpbfDCacP$@+k7V{uH?6`@h@mDggg5paSqu11bRjGN1zR zZv!d-|1qEf@LvNe04ois0K98J1%P_my(*{xusGHM6#yp9IiLcNF`xpFHJ}2JGoS(x z7*GMo8&CmYwW@oH3P90-3P8z#3P9O_3IN;JIyY1R+6<^5(T;8;+L4V!JG+r+hYm=z zQFglu+#78`1z?N;6@ZEX6=Z;`2Dr&K3eJxzxTD>G3P6Ve6@YODQ~=l&!nvUW&}Bdc zfDI#@4Hba#22{-V!<+F}t<|0NQznh?9RvKz_7ct&6}U3lfC|7A11bP(8BhV3YCr`^ z@L3+B-J-s{yWqi}hRMeXKfG^%7uK`eRp4H)0TqC%0TqCn0TqBg11bR14X6ODZ$Jfr zHqC`x1-|}5+ShV{uODmp`q2Tt-oS2GfqOFzr~u3|paQU=0TqCa45$EXY(NEI69Xy$ zvkj;K%rT$>FxP+zz@`RN05&tA0zQ9Sx`e>|{U%U}pm=Qjg!o3{+rqR|6^lyBSac*xi5%z#axv z06t_u1z=ADDgb*KPyyK6fC|7q22_wC-%V#oxgbOSw~-oU$CalVPe&dSwilFz$&P+E;R9j09W&^37zOHFYSbCFP z85|~?QEg54wr8oBgf(%4EVYJwSV(29W9^YD@WXKiRHSSkZw4x`d4d5IfO!T~08TWZ zBIVY6Gf;ue$bbsKsRmR4PBWka5F1c|<2wupTHP$D;EvM`r~oW5paO7)0TqBV4X6N| zWk3bsYy&E2!uG`*J$=&e`mic#KlV<0jj_|Lw}f{SKFP?q>o%kkzg-b8%U$oXWZ4bX^FyP}cACSA_=TwiEqJh_vz z%(Lml%@eqleW1iRh_>fJSW4UJS`9nh1MTcE*q!kM?d&+%&V(WD^bZollNO}&B}nb8 zZ#k9l971^d&&g?goBB&57P8@WY|&P78$Ys=iA7AZ?<3QX_b=Y*}C~MDzyutTY{r`d)|F5i`MbCX1+v=%-6k_vUP;!%@#K9WJX!3G;^p zlFJe&C0DJSnQv5Tw6$#ot!8Y?Sicy32!B>LEyQ=?%M_NZQeCGIOSO~2l48shijI=d z6{Dj$xfPIe7f?&4$25~Qmu2tz+idJMt6?~jF!-717;cSjB(BiMioRL2n>f1*UXE_% zIujiyM#pm~b(X7BbahO$3=?va81b93Vu2JWHCDs?EECNGG9()oH9OW%c&tewtSzMC7X2C3QIx=z;j7I>pCbmQv2cdR!%2@k!ci>2O}>Sq?K09;}~1>jNx zDgc)mPyx8yfC|7B22=p9G@t@-l>rris|~0~^-QlZ0~Of3)_@AYbp})bt~a0paDxFA z^I7UC(d37c3bnF3M<)}njgGjq0a@=T@}|yFZd9C~CyTkM8PfmwZSyKRm-5iaquFpd zPM7@pDLC5GBYSZ(!u@er6bZ?NcZog~9i7I3ewch0xR&SfO!=0msoARwvPxZSk06Dm zwR&(tON#ukTC=3=z?GDc+UEJbVla7H6yxHw!0goJAx~gFEttG{(@gFNn`WJ?qGSqP zsqeNGr9zD^i`G_d?tD@Xy1nDiwQ`Wr_0>mmyauc_egr$oPV({NX1^^cPDpl6UJJv1)q#eg zJsa?|g*q|ZzO3HgZw~q(zkJ!;cBvU8Vcg#P@U8Z}BIBJ&dN4;R31eTzr`DIBjV$ro zn6$q#8NJMph(IRjdiC0*d~(%6z*#bp@6y@pT4(mAZT3w}+w5y|W_gXB-oUMaU-caJ z8_Cy=IqWydMKXu|X36kw?kmk6C4OLk*(PqK=c|26vaA`n8C`B)d@(57&IhC1E&X?| z7aOg~Oo4LTH{wsXxk+F8WMMuHE@iD@p$VAWCBcn*ykl1jyBx}*!4-4ib8H(#=Yv#pN`i!Rr>xsXMC6Z+V7j5;IC2^RjBPV`GOipb2@sgbRi7-y7k~KpM zRXVm_QKtsYx^{_Hn@gg}p(sn7&Jwps1WmMLcX3U$!M}JpOrq_8Q*I8ho5tQuw41~v zNwmgX#lLwMpVLe;diL^Ne84z@Re%3Oz4(EZpJtjR%WwLn&;M9`_AgsMCVqx3Thlfr zndCr|>MGM@kLPCmZiT7F{D8vp5#cW0n|0%_y#2Sby79fwQT!;?gLY6=(3!i%fC|7e z11bQw8c+fFm;n`l+YG1x+-^Vx;0^;S0CyTt0l3S63czv$DpFn8kDGytl)>F*pdw{( zj~S@I?N1m`0r;c=6@YsUr~uq&Kt;;&Pnm%VY<}8+3czO!r~rJ{fC_U<$A!LTeIy)x zI|~npe%$E?MSs!hhedx`bUym3ocI+yXYv(H!WCltv;$8xz}EpXpD&~9A5WxSko}uC zpnmJEpFv*^-=4{-TBPPJMkt0Iyw7w%nse1a-`=Q!Gi?4k`ZFLoW!RxDgS zZ|1$3=nq`W*W1qeB8kdOB%X`TK?jS(6FNSg4;M?6HL{rIvGWM)$r9FMh7T(*+P}fQ z#Yf?zcA=PYMwAWobnd_ z@^uX>Ui19zb8_Tgfq$d;*TFy9Q?I&a{V({cxBgE(zNW{&>G2IY#(R=7qrH`#Ob2rx z2=raSB_9Rvek*t?01p^Y0r;E&6@Ui~r~o`U#Ar4@G{5*5m5bz5W3{=8N^WH^uU`_R ze}Mk6V39c86`t#IQU7e!n#xxEq?BeR4Hxgr-h2s{^m!=G8xZ|&U9%|3E4`9eiZ#~I z&xW|1J(gASa#f7xa@0YZMs|3v`P~k;rS6zPpCaNJt0;}n3>9kw%SWlcl<@U*Md!&W zh|ZT&XLNxJbff5Wch@fjwboB0!YFF_@FFf3A4d!o7s)ZYm}@8FQJd2|U&6I3Ao@F5 z)otr1Ny4y*u(^i{j~P$_c-(*r zz!wat0DRGa3c!~Pr~rJ~fC|7@45$En)qo1X69!ZOo;0Asa*rF&lQxq2lU9I^{8#96u<-3-lb zBD76xFbi1pXwh`IW$b}LX)h*>KHI|fv4Kc@6!|bdheIa%j|7X6EB$<}4UKlzGts{= za24LfF^L_}(5uY<^sQWk5`^{*C`*p8U`ij(6Iz}jt`EFT@ z%QV+(79qa(#>sL$lk=p9_^p&T@=fLZ0av#5*SHA(1eL-O->@W{t?N4 zH*%19^V0XYfajhr&s}gnIir@DJgL`T02Db9Dfy-53%ppBu#22A8!T!rWk-~4`1HZ! zr;wSwS>i@=jbG$?tX=bXxo)#-rl-pFxZX8-JLwfIdfG~z3c%M4sGu0$gx}>oE@ZHz z)H_Y4IDAypL4HmVCKK?9pA9E*>OIPrQ8KYHzyPgpe8YeWz&8!30DQ}U3c$Aw zr~rJ&fC@akhIm6fEa~GsJXzHLYP9IP_5>9?@_PnU{IBi~>(Nzif$}WRZww!QUoMj2 z;~$8}$Y1h3`Olmekk9(hw-{=iWEWy*^)^aiem_r$my`SBZ*tI~1g7)@Gx6Llp>mM* z&N4{Ef?)An@{?oi`7`h*#}4Je@?uep4oAtmi!M)RVDK2OgYXQF=|>)d<8Iu@E#Oai zMof}%BUUlEHLkmPSH5Ixf3x1@#K#%$D?SlG+vtS8VB^7?Q6l+X@jlY2;jiWZVRKOTM=jJ;`q?J++iJ=3_4+AzoqYyQ zkP`!mC+ayDoy@tBcr=5uKSMLFr))Lk7?jHd3o(r4AR9F3NFigxk_&7+e?y!bVrPtl zcw`VR;Fx~Y?KtET+zsb9J@FqgNfO+B1Mc(d}D|{6X4i`z?+Y(7~u$m_s_iSdD%`j|^dp7wp;V#%x zZ@PNpByYbbt=@R=&7g1+B&N22=oEFrWhPLjx)RFB(t*_>ln>fFB!BK@-$T zcT5`epO}G)l)+18paPpeHJ~D8^JiwD0-G-zP?56viW#WD=Box&09F`Kk-GKgW}pI_ zuNhDQc-?>syH&>oqz|Rv_ubg#eiSe5b=DZW+`n<*#xCVrh9JdKss4x?K-{%qi9yQU z6B`1fPdN)868#yc_Y!@-)BA}2oai8Wh*NVd@!6CO8GGEA;@w-ng$@vd70Wp3TH;#~ z8Li)vp~sH_hF(j28zy8%xBjrxTYHWhdn88QuozJRc+-Fiz*`1X0DfUW1>kK1DgeJU zpaSrY0TqB>8Bk#f(axX=dyVK{{dWAkv@7Ffm&hT!oLF+|iiWzfp{{DEs~hT?hPoCd zWl_crs+<=}yt>~c9_vMS@Swi-`g!DbI+*%nz(I5;ke3{K&P1Hf|BxX){`~qSxYiTD zBgOnIm7}&pE>u|)d5+4NBA2M#Oyp9LozeMn>WVIOr;9m-mvJy>mx|TZboTbuclKxR z!P&p8zO%LMSKqfgiQUzUg!A8nv$wClvoE~|XaBbP&d%In^&??#u{&}kkWnSSv73Cq z{Pu-n^C`SMC;9DianI#9oha$@+qI3SbXk5Il+lKE?{h=C_xaUuZ=dq&`)|en?B3A+ z>)w%PYpf0*-sf9~@?XlmRCyi3z2VC158GDZ>_Or;mn`qW*?Y#V!r9|Sbaqf`-#B_G z_fokh75dW$$L4UMAKKZWBlXVJcecH<3g4z8^*#7@XlGNtO*#7>e0%QLRrofQR`0>L zLpz)DZOYmA;M=HU6~0a7gcnzxWIFC8^N-}u8Zr6F_@ogl?1UWDHm2&T31T5tcKfx4 z@+0i4>(CY>IV3+@KG>m!a?7CBdg(|G$&Y*wb|}^Cr}EH8>T>SLJTk6IrE0Z;upZ^6EaKL#Z5h$j;auE;qxd4e;(kOQ z$$Q<14yEFLNQZ`rdzpEdxciUz}`I+SW$58G{oIC?J*-9M5;vbE&u z`e@AV{e8r%@Sx7>dvS06YPctx`;O?pRMf9n4fkY|+SPS$?>$x>-uL3(ovY!VY!Ex5 z|57=G{fCDyMY5sl>N<4LP!7q$_!}AB=!}-iK#GjNY(hU#$6ws&S}xPES7)yd?D)x8 zOsyQS*MGz!>{6dI&Lj@()g@ot#6dSkb|P*qVl2mv-KZncT@2hr%Q=**o3LE$<8pa7 zht}$7mW$kjVg-qg>u~uAF8khLOE7-zZx6n4xs@*5_DM02A1q_NHZv{~0~thezeCaE zP1@S_DeLsMJIHAX-&Xy@SB^hJ#JH~|!-ldF{}xO9h#x_=H7E>{bu;dz!@ep2;|-_) zOfaAVFwuYtz$61I0Baaf0a(+33czFoDggZar}Kvjz*+`W0N6Ly*-!ykTL9;E%s_?A zNnkyy{@D*L#*_Bc#fyG;C+Vs)5~eHZj%Vn3ydN&_Z!#g?O-&~H;ioX^%g4JHyi-|^ zb0DW=@%&+acrR&K--Re$EWSyGvvqCNI{4rm^39SS3|M&)kmC1Yd&xAeTXoiE5Pk~q zire?xXD;8EZd>oGZ-*59hoA=8Y=bGG4_O65v;(flnliM{Q{Im!G zvm7AbTz$-^qKEr?$u488sok4{4P6)|T# z%Y{S7*Il`nADxew$H~rm@!z;1d{7=SA&AHBMV<4IT(A&oO}j8>GpuXQ>RihT@u&M= z`ntxf{xG*NI=(ATmaFR~OUMGsIK{WrJWQhn4H(mP74b8%r?U_~g{9?~9Ek}t8W#l%_+s7CSFb;c*V~!y`gu9$s&iR}@t8;^ z|JC}~K|owr_t+pZUmGKvM5<%a9hZ6IB(kJjv~yl6>AK(;ER>j&=`+dXOLDKysg%778KzHu zk4B0%DgI@Q%hiqY>ic_GYSq$8a(@L{o015fO-!}Vk z6_=dCltA4W=48amAeOm=ZetiRaT~+9w9~y853fIg|Mgq9CRffw)e8!XcRiyRn#H$~^p~t5s87L|7JYvt)T?cWsz^>+!jXl6c4e*cy zH#fjr4&2uOQyE3$majCxUVzz574_=-${g3O*81k0d;IY0lEO8oUlBds>E}dmh%V2T zNn7<@k)`fc-u8mrwy|^KMbWd>i9N-My~K&}|Em*i;=~@}#Dw?c#E-=nbDfV~61|!F z=&M9oeI0Rb;(Kzg8K~-#`nq!er2qB)E$aKr{hh14{~7W24D6C#-xoa-T@GXeyS(J1 z&v1--VN?WcJ+K9eN%TJ?@#{0O&h8#xBacO2=Mc}@mp1VmlI61X&tYg;;AW>a3)~{w z&33|dMYjqnM7KFx-{chC;q$=pHfG{fMGZiY!K3 z;o;~$(Ouf*07)3MCn7WZ!-p{Q!xbFc^K7~CO}t+#_!xW(wW71V;Kw@?uJ}w2l|pzw z@v(wmD%*MziJbiHN!gQs^i<@x30tK9xU=th7ixKwGN|QmLO4;If>6mNxaSC~`K6?| z1^a#UuO$k?Z*yDU(S9g#;4VJwhY|_yV&|YX&JU#|)wXcw=sV)|4f3@%Ka^B;_SVYR z=zmJe*2W|$EcQBAwp8<7)of?ArAxX_n$9kuAD2{={ZG=~s%;RTu^&HXwky?rhqE2- zKs@pzU+U4Zg)SEFe^-2v_lw~-c%C0$EO+e29WF?z+rn?Dg}cSV?rK4TnYQp9weYxD z*h4Ky(9;&a$8}I!+mD|UJA0`eiH^k1j(9G7p6lxN`Pw#q{EpcAklK>SNxSr{T*vsiLJCVKhW!DKJWN&lF$3ri$yQlo7>W{B8{Mn7jjZIe0jkAjdH^MqL=J5@P5gd z8n2oYU*&$+XUljMsw!IRing$&eo4f-en}&3PE(nP_f$=Zgg5e&a7loKH?o#+iT8vL z$iB6yNvs4kHKPTHU0Qa>h^Dc6@Y z>$FAO>}oK|eE2p#?Cl^&YKFP4X;$>ZcQ7ke*GK!v{RF)vrbL^}PM=V&!3LiRZ5 z(mf9F*P)%)FViL~Ax@CnG9c_O66fqdLAHZ^FOS)wK z9_z*CdmWNq;=dd5-{ttvZSV5~9Aqaw2~YGKx?DYy@r375Y~~;fBO4op$jH+R@Y+m2 z{Hw%FCEipYHiKAj#myOX&ssAmW(v^{u^hd~p*pJnH4k7GZmI7kH$=5B@s{k;BK4Vj zXX*0hU*z)JE`FUgg{8&f#b(m(WC^E&l;me~T)$ieU>5@_0Q{Jav!Md8n*kL7eqzVj zPyyJ(fC>OVyyI-B0MNoapaQU$0TqC~4X6O@V?c%GnSWD%U!i&Czr<{f!Xf9YsUqIO zL^FKJrw+(dYlRPRD9cqwu0F@1RjzV!^&p2fxhl%lLmXHy?;M+VCAqpKzJN4iH&vVu ze@r5@=cpOtyMWkNZ3FCcKx@~e(#5QmXpqg!Kl+|?KQBqz0S>G{Lr|oOGM+N0Y%5@Ziyr2KlI`Bep3{~!Y@00$dT0XW2f3c#TTQ~(Y$paO8X z0TqBF45$DcX+QG`VxgmNR{HKHCOgVLRpd-; zGWt@;Qzoy5+P#%5jh75Rd0rd;y7*UJ!w*<6JBvH2W0B#8q6(rmLb+aRyzW7y-8>FK zbK6X}U?p51TNVVGw?GF|?OiA5yIXJLR(haAz3X_ymHe~(Dsupz1L5xq-$;@s{wW-2 zb`2)-OkOdxW02}JlrpSX!f3DRVS{=NecfzMjG3&8X?IdP2TW%U*MgVx$@py2NuUEU zpp(#+VP&!Q6ZXpNsgtF{DmO}sxGJic+0!~;C8YGg0?yI}o1ncf{SNde!gdW|bK9Eb z=6r(doLW{7%)N>0AOUkopXhZmf$m*4x#V^(^TYMT!=$tJ4p@3Ak8rQAYjUez4R@<} z*>3GSFsB}Nx9-NR(tiwxzO~9w^y{QTvW;4{EBZcJv@0a7Y-_c6;=yK~aU*JOn}dGq zc()~d*Gl-$q*GD~vWrinN8*R;;;+6@!6LaDuTEFH9A&xnS<-)bgLnw%N=GM?58vdX zcWx%}g}Y4E9w%6tR6!w~XFvtuL<1@SCmB!yIN5*-z$pe)$k=|fzqg5aUtW7f^zZM@ z=eA+`d+!n#*J(X5hubEsY~d}sr?!C~ZYs{L7wVJ~Hn7>Fo60vn}DSBIhIvl;@v^+8TwbPr6{;kt#m!jW0 zwl(JA_G0Oe0ID|eVfYq0h~DJ5qK|g!D*PUQYnT9Ny*0S6`TX-DeB2 z<}cja)9Vsl>mQPSdmR0@vPp?Pq2!ZS{qS({O6%BG*WB!C&dsZ2XKum8ojj*= zgEHSjoL+yuVliSU!i__U_ZxQ{;DRUtnZ2{@_^MsYQ;7fgKFNd4u4TV*$yNx9m7)7$2)NSxFPWSVmBc9};N_xu<=~?If_*)YE%%KE7-{`3{%i#Iv z4=RI8EJP{@;<*M?0G1k10XWZq3c&dWR1hB%X9ONQmCC!e)k(z5Db0A{Dw3)cb7`bM= zT4J}t$c4PQ$ZxLedr8rc*COKLeI)h<*X#G*J1FihuyCs&A}%zb!qpp+Kj;rxJfuT+ zC0SSBWY4ykvHWp7en@JOiBc1vi3Qe8W4~YiV7GzjW+@!mPQC)KPX1URA(W{>tD8SA zvLLA-j29bF(QJQi9y*NFMKV}5Fag(=x^HnK*bx<^&Q1dwIzMW2dLD@*n%knTW5woj9$rsT)( zN@?5RFiKm=nws<&&IaTy`Dg8{?5nka+(Uin=KeJIS7#y!g`ct4Er*&2(kl~zWJ<{Y z!`pknM^$w3-!rqDN)nRLJESfUkluT*(gZ>;p$Ayl&_f_}6ht~oQ>2Mhk*1&^DuRlD z4M9N^ML>O&VnIaT^E-2HvJmwDJfHV{|M`3}d%kDp&OOuT&dlERuBUmw90S24FdhzY zB!u<;M}l6t7-f%yP zYugqJq@a%2Dp<(w=V^lE^z&3-HX*k$wYz_@p6b*;&jU7~KxlpAzMhch0hE>hLs!_8 z%EdPth2z&1X3fPPoCl1gw{cRE%7qz|Hi|~f43O28d4gWd3BNqXuA`I~kd}cUP+BjX z5p$_{%Fk7letIpkCm+pO=#dKB0(x~1 zE2#=&pV95aPB+HhY*y@Rvu}*wj7dg?p+EZzHRX)EjD62WxyCl3w2_6nxR{)*-`JQ+ z1%Th!z|T4?W4RE$UAC}q73A#S)CedOfdiMG?~yfBy;f1y^4U=qNU_>cut176j)DbJ z(EQw9!U8FtbrdX+f@an>1Pi2C=O|bp#q*AW1yZbc6fBTpgQH-<*878$C$yGF`#tYd z@$tUiR#Kt=KST;@qU3tsWAP}t&caPnH<=Y=FN>9HW;`b;2yfqol`TQ-dmpvk@DNXF zp5z#M0`-fJym>G0GkXS@7BXZXh0X`~-zdn~XD;ftXf5vz%6nfxA8HxdYk78$uY*d; z$ll}Iu))svuofCXZFUW%(K+{;+x1s|+N;sr^Wbb?+Y%_~g1PA^a_MY+Azug97j}8q zQ97QFFXE#EEK>5J?trwlq|HU|mVcH$gS^j?OUDusG{5(Ga%l^S)7PTP>P%- z%5t>bjJ9Rd(v|KJ=vzT9ucp}7T6Cio*Rp+_T@7=wWl*qpBgIuVk~{|bc~qd^h@s^> zX{|QK*EmM}(1>4*K|$Wl6z+@cJ*v*?g?ngf_T1zS`lR$wJ>a=scBx_?bRSv!Py3*+ zl3!?9+Vng?0yaJI`M+&?(mFA1jMBb8U75X>864~^Wrhdy;$%p$>?I$eaCS8lw!85D zEk$ME*q*&lixpRxBP*_1mSM$}?Ut@3Fzr>!oBzYsEY1?zaMljqsxH&T6v;rNH3c%z zRI`VnjZR}@fm+`tN5KLqHaiLyNb!QBU;*tjkjLETkT&BvLn-k+=~wuDvbWYgLYCwl ztnko^=hIWW@zK^0NgY=z4`dodpYyG(F^nIS4K1#?1P}alemmo|^>BPl$`mn7l z4G*96lxgD)@ovVW$nPcqO9M6o~odmEzDca#ESRlntN5KLq zb~y?bNb!=RV1d$)_j}QvyP{45`EZ%i;2Y?d4{6TA;P*&rL8_`awvGV~6&cF=rzm)6 zBM-!5Jm0eW9lO`a4f4{QDM#6_KrY~$x(_S+F=KL+{ca}>EKs6eb`&g-VvnO>ffRck z1q-Cu=O|bp#ePS@0x1qS3KmH5ilbnG6t6l87D#c>QLsRYLym$4QoQCUSit&geVUxn zjr{%wIXl(db-qVgX&?S;9;HI1Qw0T6~dyz zqH^I;;Q~E*D5{b_k?Fp~eooU2xR9IEaEsLCsD<62&$85kgQui92S0oy{1upvjT3t0 z42{o(51*^f6Oh)$T8)UkjUm%X_NG?%8+6Sf2jOS+kmT0*2*K}?A*ni;QV|gy;r~?G z4qmi#PX~7q#DyTaqjTGJ%CP82*}0F*+PUv!0|rn)Z)cMKVTYVf8PG!&?U2)Br9Iq2 z-A0u0b*0Sk;l&nFQO@Jjee0ASs#ExPo}c{IDPMOgAPZC@4?7ALNO8nbut17890d!` zxInWD^cNwN1mELXg<~%IjSIQS?;+y?l^%}^xRj1Lup3S;o#e^cH@u9b;v2OO>l+?2 zE*y1?Wr3`J(^0TMinkmE3)KI))g)>vG{Zr9@{l3EFa6RpAbT9hM}7}Uk2B8UQg2J@ z80i!NiO&8LO-pRFc3~ESU7`MzsDkumbiYJ7{rVvf(=)}glTOJi0m|x=N`d}m2t?E& z-Yql)(jfqnvu0VGGw`)J!&B^e$QpcCJbOgUo(IgClVePL*GU%(l+gDa1q=2$W0;h0 zc2Oqcu6D{2`UhMFY^6cC> zM|r;Qn8*Uze9}>{K#C6>1q-A&4RF*{!<#g#!>H zVnv&CI0~Xp&-X}5c9kqjf$_~F^v%2Q5sWX4p>N)U59)yT;nT*BuPb32Dj<+{edxRn znOvK0nkOVWg!|q z=vzdz#X*PWXiZ-H79lp;;jC%<+Ic{lzj7y7t12~2+HCRHB}GS3_x(7jJde{IYDIGp zUNbsE@naybQp`i+L+t>41`b-7L*%LH+Y$DX^(9U4Z;t+f%$A& zo~Wp(r1DWwerLi;(usg5PkFgjRziGZ$Tqv;6`zOJ1G7D@l1EfDztEo#>hPC$E-Dk1 zo4cnAQ8cx7mh*g14&rQ}6ETzq{u=vE))e#|rF>6IC#z}b=tnVl$5}ZA@&qdngggl;3*z<7KE(8-Fb$eu)Bzg%CKGs;kVhW+ zZC~Ok#NKv18(R!59k1}VAf%5+?MEwogz_R69m(*FMJT7nBn^xr)p$}F&qQ|bt5AN~ z=t-a((MIikS0_f%;QxQPE|IRI2g4B0BP7saV9zXyf(x6Dhvf;63QuYp73STTb>^?S zkOWNP+h&($p20XohB$JZ-K5jk@=d#z6o|iRSB_5IO{K8(L|T?2N(zn&%j?}l_j1l8 z(-T-8<3mgE4W)~s@;HMpRoaGC$f3U{spy)}=NbCM-UiNeL65(`Xom*>&bW*<#7xp} zp*rt;2dNhskmRAWH}r|uffwM{f!q3y?Zz%t+q2&Oec67cr(8i#Jn{?Ql)@?veI156 z4TPkh7$y&^EJ7O?An#98(xm@(~=}SmUYkQ6Cv7e+`_LC2RB~lfoLtxZe@vRhVPdFMckS+E9iJuQI z#^b3tyByabw*zywO25h&;STi7B?FvwW}0WHj2S8(`Hy^VMrorB23o6qNXcWZIh`_` z=7p#L#xspv=O{SsSo@KujJ-*o3gP%&RsNG1?>(|oPG8V=mhBbjR}8#MaRn6U3?k?g zqXI2l52g>}8Om-dyCc~3vOAjHG;+Pm5W(xFBz|5h;|dK;wDyZJmDYYSlF|o8M^mDB z1_re3rQkn_cteN<8rJSP3KmE~wb6!PffRo`3KmE~uXL~>SRe&`m&z(wAcb)hERe$G zC|Dqc+flGUiU3E!0x1F=1q-AIauh6(BG^%|K#CAY!2&5l9R&-d$mJ+lAVrv?V1X3j zj)DbJL^ui-NRiu7ut17PN5KLqq8tSaJYTL&Eq)u-wd`lkWmJq0nHpo}5JpdvN6Fhc zRYyk?!^scS&{!;+Cbd>7<*_|D35_|8I};QV<) z=5o`u}R>eoSTX65yeTUdD`%3C3~xAJz# z9j&|*a~`i>&B>F((YX0386n>%EtlKneU4I>pI*{M>m#8w zZt@ny9lEECfO%~Qno_+>*GVw?u@a2MI1r3Kxhi~E)>SkPzeT~F_!6^yXuLc|KG^8R zCugn`tZ{a*CbWrFYshvX2Ai z;=t^IZj_34+~=>|P?*+u|X+uFL2K{F5Nri!9DM^q@gG)-7qCX8Q^j zC=n$c1q-AoH1`oQw3T-WNq4bZgR?Qv->N#-fOge_~7>XXe15q zFwQDyr<{BA$WhK7$4C~)>e7ya1yYo86fBUUtfOFo6iJSP1yYoA6fBUUyrW=&6puIx z7Dz!W)VA`lK#Gcvf(24kauh6(qOzl4ffQ971q)o?+^RKof^_D@FV6#MqcFQ_1%tAx zRwyWI&ovC>tb0Fv&s9+nEOO%$i`?{WN9yL79=_+gHLH*VF3^g$N~8C#VHtTnKIrfb zKIjkuKIoZl3qEapo(A-Yi=Dv*$X(T8)Uk$yPQL(%T&}Jp}f&IyZE^AqRQ; z;v?AGA0Hv!0X9Gc1$c1(br8HLXNK4ykqGjy`>(@nz-ZiTILZI8|4Lu$e(3&df#KAe z@CyL{u>V?x>KFc$Dv^HrPHi zKPAi8j%;)~4!^OZIQczf?4Z)+^?6)MFTG>8FuO&`^#+jlgI&r*WWo%WUzd_~M)bk4 zqp%NeyTZ61#A_Wp$^d-tn3YvC{rb-?UNtiZM@r0Hs%rD-`wrv+| zn?WI9+eEevF7AlW`)un)cW`WDPsg?_aBSO|71CF!8QFG=Z9_1&ZRW#m!}t(P_2?zC z$xSH?52O3hx0XXE1rSl02}J-4jm$!7j)4hNGU>N=C=tGjHUPN<%TyAe!x*h$# zmFGDc2*V2GPpd)28y*o5;=PSIsyl57>EnItaNTr>LHy%5-kDa;phAqRWs;)7b= ze0=&^(gLq{fekeSp%z+s7Uac{<%i>HQ$QQKFy>!RkXN1ntPG8VgiWxeB$PZ(b-Pl8 zLv)y4RjN)2ItarCQ2>|k9*N?gCp0?LlQn0z(`U@NZ2^T)sHf=?Z*BT6C7-E?pvn3i z$_QK0qFlamUTQHF$R2xz<4qUfJq+~v1!@IFNc%Wll)qvz+DB}H?4oC4Q4aU~g6fq> zQA7ph_0FYmWa3j4EoXmP6H>&}gugz226^Yvr(FgMp%_5)+AX~L(c73q&{yo}Gf&vX zU^0F!8UIC8SQ+f`QI$|X(0>%=$UXX}B_aN!zM&3PDPHbjffRKe1q-C8=O|bpMSVxX z0x23e3KmGw&{42Jibjrt1yVG26fBUUiKAe_X>8=t)bU_}6wMq33#4f7C|GbV#diQO z2<@h1n{wf4%aKL-y-(3c8I$%aWjuZDxW*;QhbgTnf}o}JCavE{8-6h?;lkUbPPlNG z+>n~Dz~#3`=5g1+$v3LL`zheYL0BcklOet^z;DY$O|%6xfYkWDfK}7_ihY|@TYTZ6 z9vJ+JM@v1XpJkt#>G?7F5=>(*AwA0*t?8A@`POM5GCJ?2=x9zmsL7IhQv_a zsg;UvB+@ss#-_j`jNU;}q25^X`hs7X!wFn4w0<56cV9k4(GSCF4<$(@sE|jfyW@3d zlB=pfI;X0QYN=L#>%4a}P_?0uv~%LTTZ_)6yF5+FxKR31FMaSq^`yiA-&a(HeIcW0 z9i5snc~J8tcYY^|(sP$g=M55S?WCkN_kt{C^jBT2)Fsz10bK z2+JQ{Hj2K$=dDIMZ*_8LrHX#_oL|sd>B_~>ykUWPIm^EY^428pAbGE47gchceXlFd z`k$n_gug;hA{p@o3apJUSa5A7>Q3P&eNg51Wl)k!Qm(1AKPeG7tiAmKO+nvx4`>Sc za*w|6s?63DWdSG3stqZC0wCxT`7 zdr|}^?$>0t^ABDg8~Gm!^K#R&-=#ma$~c{a`tq_ z@+@%1^6^RJBp{1ZyXZf*mfo>qz}Iz=gU1FwjmhX_S`?&hF7hY`M{M#-@&O&VQ8vTk*>6Z zv>j8ehaFe52T;E$9^MT}n?h*!n%X^m^&=|nMM>XNNS`}n2|m&R_f50{)8TR7Y%4Gz zYkHNjH0vtwBNU%gV4JfHv{8C1TEp-7>2ayA(*(+htO**u$FDKXK`=|pScI76YRuOH z)1i?`TgGDe%FHceA%IQi`_No>D_xLAGlNi19h&Y0rf1(PYc`UVJI(-G%cLh$MD$zZ zbREBNpXbNRO?o#{^Q)6rXnv z-P~VkjT=n<_rH+NOM}{d0omTHg3aM=lfdyH3I7}rsS+zVbVUkXlfKHYOnMgM^)Qp| z>i|d7s7)bcj^%Ip!R&~#)A$DEs=XqIg}<;@t$#DlJC}0DdFNpLbecT*-H<&WR-<=wTwG^+6(?i=1;>w<;{cE1% zepwc#&nM!#$pTfMCmjU~q*&l6SjbtQ@a*?JjZH_8Hrt+aPsA{XX%$b9#2ow%M$V?p z^B8W*xpFK)(R(Zq$9SwH@j8?!vKOQ1#TE#`D^fu@7NjJ2_NtU9{+p#KdTA{tfx)~w zMMpHU*QOlcrKx)K;tUFA=X6rM3P4!SzTu2R**Diyvk z7(t5y>!}hrGs_Vao2*ZX2d_^BLD?}*{DE-%`+ zcSk4Do1Cthpa43#)(-N?ns9ZE2K_@-!CD2{2dWhE4OQ3bLjF)AWGxQ=jz-9>id;#}>Z|&FVR?7fv}lyntdnR? zPG2)LQ2lD+1_r869)as=1@}f}xXs(ZeSZ+#7JTif?oUq*R0Uf=Q>ZW8T9e?$HBV|5 zq2g*?84{t6H2Y{)geub~BAGOgG;>9$HNM3rLcN*MqF;o1s|RFN0eas6xE+T!a|J3h zVva9RRqeHhQ&N`Jiz0G$ghpOhIcT;Tls`jJsKlen;-&RI!Av0U_3sl3J;3{9Y zJ>)yT+nFd3m`|%fKHL`WR05_2&x;&>^9Wp9v_?|1Xmzs&LSE~OyH_ZW zy#2cm+&bmq+io=URr*3xcjlU*(dxCD(Cn=Y-#&cprJjhPE$O3GU-oT5@kFbWK4@xE z4AJTZ)<+GSLh%&Iggdq!>cIPLVM)VB;eK5YZin`8du77i(*6eBt9p0HWe4176{;H6 zM=kn@>RYIq(mS?wsOrjYYzEiBz6iOaQ7LK#XL>?T;5yKh$~sVelnnQ`p>W^lx)(DP zxq2qWM|Wv67$vx%65M`Oklt~W1A(d)*ZiIhkZ9%ER5n^2yY4RF^h#Ep5~5Pb&Q`R1YImn_lCagsOX$b|(j_isd)ay_$DN ztt-y8ZaLSV37p&2YQeT+&EQ6IF8xHUj9LfRz}w}JGZz}ctuX}dd9H`!+Cc8#rdO^& z^=uO4Ib1r|xa}9^nz@(j*pVdU(zW4xT=~`F?hRY#S4Vp{Y)z%mzG|Cjb!G@^(T2Xc z>PD*-ZBawsY7fnYGN@O-X=r{RO|&XB8}7X7aC7xTn0ajxb7Q{One?P)==*5zkN(iN zYdTCYa$>7NHJPvtc%UOF06P;z+dF|GR1v24JAfipNv17bK+!lSO(DPP49cgHR3=g5 zo*?=?E;=0&sXpi(NQ(glRW-ifWg__1P}3-6^sIxkYN|r2Hq+8xr$&J28_DF?u9Kyv zOl={`p6dx)#;OR7QfW5BQhuhsOqr@2)4nP2dqOp0dWLDK>dN#H)3a(M zQ$#a_+^Eu-er^ids^&6v=8(J93Z}|T`_=PINb1eCL!mpT~!+v8rTAIgn znyIu7|WDRg-#Xr3O+u@ssJTA(Mp&{j5d2QAdo_UZpJ)h~s1o$o0YhB3QUpalt^?Ig!o#FR_KF)N4^K7R+%W-z$6z$UI+0I|vz|LLz zB8U8(b7HU13XWyJrmw!y9hUMP-q63Zo!!~ax3zX7?cY~gI^?8!TL%$Es@JP69a59_ za4aRy0{y0YvEQ!ppa}CM(~b$CXtRQ28Pf-`6gFGfZ&*6~iZjtydPc)9*6d}!upaO$ zE%a3~sG@m?{cfg!8k--O2KYd&%w4AT<3W$nPXoZtC)}WcrUujRbwGnnT_XC0qsq8n zs%gf4eK@hc)E^#b-%r8v82>r%%e8{fhHPs&T2gj*;g5EIs0yULG`A2sRZ>Wx%LQDmTlzGd< zFm+{m*HmP>BvgfIw@`Jap6zhm`=%b#V)lFAGz>(237%ASWKEhW(OFKSVVyvy4GrN$ zk9Gu|HQkwhd<^uN>BUr}1L(Y=Nf?D}(-riE8O$`Z3+PKTG7!1DuP5khGnVgHqU|Q8 z@qwsW=LUeTo4G{v#^RZv0Rrs{m%W3B>0 zXgPOB9T;&^b#@gYid0iMmTpW+t*8sX0j}!o_c>oTL}(G;!RuPVJ_Pl1TVMFq zaeG40^SwoWil{V)yqIDA$}(M_0BY*47lOLGu{WrNyD9r6b_YG?ZpoCNsk6Hc(>lIi z7k4`*H~V#UcVzmU{kpn4hqx%t@if1!sgm8vOm~>Nxx0tBN=2%Zw2n|yb$9n($ndn(fuPSJSxG(W$I z?iqf5liahIhS0%{nrgCpPKcrW45oFQnrfTd5lzrleLI*qu`_lw=>fIb(QGQ%da`96{mz z?>jmQF}F^H8&)iueB<&#o?RMl_X2PqDO!m1qu9a_4(V@CnFRQL!l~F0Qxq|T#gS|8 z@}Lb`{pmrRjXCC`aY+=iQ(P5tZT!{}tB+2oLwcJ7R&T>t3$1O|p2GzjP{{QqoBx;L zpUw*#{+p}(^C9QGY)Wky8|Ob+l*MGu=bUM=@%Yy_d##Pf#%!T!M%qq%|pddqx^fAs&Sd5 zvHgjE48N9qob)CR?&zq+RZ+~$eIK;VK znR7Uvb9)5KujRtEtJ%Gj3%OK~^ZW#lTrY813@(j2bFDba!o#EIPjQfMv9-n6PXAo0 z$s?(M&J2!uiNaq`e3jgJ`ClW~-~LA2L)z30O+d`k*d4`v<{Ufju-lB=+BEK~Unzoi zXVZ8h3UasnNJ|>KzjE3=Tu;ujoQvh1JU%XGxj(l%o1gRes`rZ`hH^YQ+Zy%%kDW)! z+O+&|e=P#nQv&W;mUFTEpq+t%w_UH6?2=jB{VusN?2dQ6Thh^oxlWNjh+M5~?akS; zY;W*1*Mt+XNa-s@-lgyj3Zh&h3gX({oLA$>{pUVsaLmUP(w1h-yizUTdH19`=M4 zMwU3U$0(9>K4JOC<~(8LqmUb7ijzxE6Xg0oN!dF-__XDeSG8PWR7Qb~ao?QvA=0lF zJv<(#FUq#ciFszLG8FTUs&G5khg-NF+>3q6l&YrAlzpUBDRp366}U8GyuZi3)epV; zHJ(50=NVT?9@9G&u1R*Th#gG6@9=1NhWpi`9*pvd`Qa9d# zMQt!Y)`Qc3o2Wwy8ZC(T!!-Z0J? zTU%~(9f&QC+{>;ZT{7>qnC9-1S+phGn(ThTnzAfkXE}`Jh>-}>a6H^tcB9#?!fpw6 zBiOCL?qA~&a^(oPkNM!%V7Cmr&DfpGaXyj`-(2k8nFP5Q%iB^R-|G(dGP|F$`!l;+ z20{O29k}nY`v$w8u=`{R^y6m19WxN_q-q?pJlv3Oa6{d21Nkn$Cr@)%RG$nSL-{;} zTb6yUY{+@oD<4L7+o#!{+4j<(aKD`=d^%m#mHW~kA`6u)rP_0=>{v9aR7F)gV0Nh} zHFWahBqt1QPVMe;L)14-dD|g#>QuOA$dV43WyppOneD2;E!_kz*2Elpa^Br-TVewG zM%+uQ)2vDHK)%I&Mb{|Ec16ghXqjgLY3Ai$LT*T&r^&T_UCYwY--=m7?vA36-;75a z{JsRny9snvDb=gT^Q5_+8{>;z8?mb*_IcT^li2*R_qtLL@f<7w*OLhMTnyYMVQ^uI z(?fpRbSw3T37K#&ByT0(dHFFqTMIv6YptEOFWMT9FgA78T5JFAs0U+i=-Neb9%u&l zr=(qUl}*>f`W9TfvEZ((l-hCDrpVsCE$5!q*mhy#G~pG_)Ffm4C^u?OTjgX-vKj}3`63eDq@Qx^WEuszSKbZttp!{qwcnFmYZ{$9&k?%#L$r^V)g|GI>o zOZcx#IP(Fti}3|ew~NNTMXp_S^pDLyXX5f92M%*>wCkS_&H>$u;DV)u8pd;?!~A`Wv8+a6zI zUz^f@dJ?y7=QD0W`yyb&OZluNDC?Z71pmzwcg~jhfnC?-zQxw(OZ=4TpT_JyL@WRL zkaM)Pb;G~4`qvPfUhC_>lJ-w^*sjF>uQl1$qKDUKTcezMOqsxe4snW%n?k&8^Td za-A>*N$%IHn4czw zT$^nRn%bGd{7L&(u%SE2_iOsZV2nmh&RZ1i0y#;&7SCqwE{~6A_?YEBc^+&eH; z7f=D%dR4Q72L?u}0xCjiXHcpxsPYTF9z-WqR0*LT^;2~rl_)fzexxd-DhQQ(Bvlty zHH4}?5~&KShC++`r0OE7rO@g=k#xGTqtNt_R9#ec7g`t+sfwx;p>LsP|Gb*?gpxoYOVN<8gwY8q}n7jebC!P zJB50aUn#X;XfXMeQb#OtEHUc1_&rH@{3j1EpaSy z>ZbT1cjMF_Lde}X<)Rm4pp1~a@hX=PayMS(6+-SNsG>s1-2@eHiSLl8%84KDkf^E( z;SPzao)GTfQO$&K2ajqeggca0U4?Lm(yFf|z5|^QWm>KhlF!GKp{E*Hy<9DsemN#d z&171nIwjwTDGv|&I~LHs&fSTtPKuByw6J>Uu+C>(Xg+>vy~HxY+tCQ>a1a?AV6tHzwPv8mqsB(5f1% zU{2!fV6>_xDpClos);Hjw6|=kZmLQNy;(L=HC1JVwogjc%~U0!*Cx>^RaIN4TgxS} z%~fNefh|`NwGoNZne^5t`9FCA_s-C^Wc1s&1p678=)p&Q+;(LcJ&rZPgYbFQuWa+AV}u z{HS_W2(9>0^`;P7aXa;%5L$6N^|8>W<05r?^@Y&&aVg>L)we=7D6c!HAB9wKr0Sr4 z73w``Lu^O&m(bur+lhkcJvL}#1Kj&#JE`14b?{+KE$e&|0RQ}{}^(|EbyhWn(8fBeMnY&~T~sR}w6QL#lMvciSJguZZLF&rV2SUZtcHtUER|of8Y5Je z$}d@E2sNVe>!xN2wW0FsrWRP@Sh}m_;&)}lyRqHXTA`aGJ|fyI^zO(Du|3pIp-)F% zAv$1*W9g}mh#$(mr#dc#a__0m2%+xwQs;zFcYCR?g>d)Y>bel_-do+W#CPbU?uy@$ zaX-iQQLc(MuiqQ@3sIOQ4oN?ECw>?$`l_Nr7%lp$cp=!*Pn8pbE&WtAA*7+dswadr z^jFP=(2i16J0Y~A6qPK5wlYBV6+&AXpoR*e&JR?hg;3`Qs!2kf>fVhVq^1jvsOyRw zq~-}N>~}VNuv#Lts$Us3Sgp3isU4y=h#yirL~Rp7YKN%3LP+gU^_mb;J5(JLLTZPp z4}_4~Vd|_9Qk$y26hdlK)m0&+cDVXk2&o;e?g$~ZBb2UW%Lu6*LGS3XG`V7`9;u>* z7F48fKd2%?$O*5C6+%vURgw^LVw9>Pgq#?q>RRHQ7_FL$A97-}YAb}C7_GVpAt!vQ zw-9o|rv?ilC(@Kx2sx3aCI}%X#;8mo(ShYy}(3_4`&j_J69jl%fLY|FN zFA5>g#;KQukZ0r7K_TSXc=eVL@@0a0UkLd!L46{Ge3_^&2q9l4sw+b1!6vEy2%!g? zq<*u+R;R1K#Sd1etDwrZj9_)TiWEYLO;!bkP-2r+DIugNLzNaniZWCsA*5)EswIRJ zO;L@7kfN!owGdJ?RXrwz6lJQOLP$}j8YqMmO;aO;kfLd7oFz`tbTvi%kfP~owh&S@ zT|MO&a)w$VeyA@q)U!gUFEi8&LYR%tRJ(*Q8=a|M5kg&>rQQ%iU7Drd6+&H_tv(b& zU7D>v7rHVcEN+gvEOc{3KB6BiaT?~T+u{ey=Bhu1VA)(1P{o!JEPGsq3&FC-Rem8@ z_Jk@f1k0XKi9)b!o_a(Gmd#T&gmxsQ>iMdH(Eg-Iddg}kbY(<|xF=Nyp_?N-MBOd1 z)eBUA@q^V1)G#4fy+EZ2!Rn_}x)7{>O3f64)eF^pAy~aoEfa#(i_{t+SiMMX61p;? zQru#-L+Iv++C=*;v1LotVe#8n>u&54^^VZ7TCTVy>aOkEQiJjfNdOx+Z!=e`@eT>T-`+U<&4u3U7Il4b&Y_Z2FarC_9eg~}s@w69P_ zg-%l1pH^`~mnrQ}t8zk{(^K^`s;bb@^ho+G_j*FJC|_2pWSt$IRe*Ys9I zODu6}pH-`wF!OI8_pExO8t$-2746YjJ*Q4H;W;2VZk?(@?;nHTs!9Xno>y&z@Kmr~ z%@27R<8)5X1$=^5JJs* zLA@)4nzcoJD1@4|MSU(bx@D?ydY3 zx2XXBmiFx6Uq-s(wy6lA<^3b|c9mb~<^Cz*+f@mnzWwjU?of$B>HS@CJ5&WBQ~Pf0 zPE|uFe{EOXPDNiLqQBX}LwYTW+okBxHdA`9l|&tdULAZk{3X?0=$*l3=#7{umbk=r zEBe9+U)P)Z`Q0i_Xax21yVYbN)ZLfWOd;g%%j!uX`64>Xs04 z_f>UQ2)X;Ja@VqHM~NL&VL~XegDRgT&ZR@DnD`-=4ykw{fDk7@6NzuM1&hep|g`iF4_gIwgL{ zrDN)>5OV35x+H}8#5?M$5atu_s2f7a!Q<+V5OVOiGW3=P)N`nDDoF@A_@1gNgdBWd)fGYxzOR}IAqP*YM}?4sCskJ=`m`^@JtP!82;H_#p?+sFgyUT?Q z^;!Cwi7g{oeO3hv!RoUrN(g29nJOfNvi(fO2%&7xsWL(++jFY25c2c9sx5^4Jg=Gv zAwNG?ZG@1YpR3M71Kf+^zEHh{#=BP%4YI^mUr-~(4_04LAQYP(!{|f%L6Nv?|n)Z&hv~)Q~HxfDmfP z6;)CQwctDD5kf8aPE{1TGGasARaH~y=7_CCjV!Tc*HkO<6_#2y@yW)p8-sX@6AD3SAlTa@>E^W}%xS zUM1RPiLL%g;k%>AC0PBFIwAzCe^MueVD-=Hj1a8;S)CVx)i>1FLa_RV`d$cD-&D7R zVD(M)r_k~NXTxtPH@`4tcJQVFWz;PdZiy|st@4Qklo7tAVuSHpxbtGuIpLYP(F zQRzaMRsNx72w_(Fhng=`hDPnXYN=2?8ny4LHA2&9UjC=rD71p+<$tOjLc3{RevjTZ zVQo1~^YVM@u+Z}~FaJxuBlI%O%l}fRg^=@qtIvdx^M9+aEOG8CeJzV7#3&s{FGHYO zKzlDoxach=qBwg<*J@PK2m?v5wu8orpCrc>*1ZO-}&m5;`8XZ&Y)>(RHHia z`SjH;phfEF!0z!ybzHKg>-9&*m(YiV0v{b4Us5M`gWohYIoGuK7@gSNhCJJNaeSg~ zAcS3^GI}(V-FGUhcUhveua7UMC-lH|vuWRHdwh94q^G5-)%V9&(3!m~m974Ed^P=C zZ%gN^e;Qv~_wB>PJ56=<5FxCI*VUtiuqIwlPZYwMcs)H`2rH%a^%Fu^DXp)U2w{b_ zfnFtq71joNgV3UOsk))wCbX_yq-v=53ax6LsvGIogtoPgq_;U7bNtAb#`*)Hjbuw> zeO3q~WfT3S5Jt)-`l?X(){(lY{#j^r>y+@O`i>CRwwq~MlBB=c!C2dFrbC6Ww%uGu z3t?@$xh^8qVdTa57CKg_|H!LENtU>_w$xR`59`n^bsZt(ZcE)%2szkFw-rJTw$fdM zkb|vtZz1GhYdzQ!-=U56il3|ht@t*2yij!idqkN+-VwLr+v>SOlSkYmT4af1c~n0m zetXLXCp@ax3B6f1g6Kt|XkTzbJH1<|xG#d}pe2r_y?#^t^3llLUcV<4Pa|`C{jm^I z)IonCgcNnq-wM4$b)uvGQRpJoiH`bLA(U+={g)8Rwv!I(r|55XaPDAQ<=44|VrU=X zF{Z6hGv3XYCO}UU$|Ng-|2A=$b;PkzI5nq3*5k#&*@Mghsb^#dX!4Eb$$Z zbx$TdUFS*s{V zO`tV+y+x?)Oj?82F9~&RiU)%v<9z_3T0HMHF*7=&~~~mMSmppDqWYNzYscH znbzR-H$o>X(;B?~Q7EVvt-ykp9sicQ!k5DR=^blQ9XbQE)p}MBflhhiA>PAA1yV0t*3;u_C8#Xajv5~4A&V#m=}!DvxG1&7@-#kp?;3k z%Y{%sN9t#VPz$_zvk+>5SML%+?HQ#H2%+|j(r*a$^wO%kJ|Q&NORMhsL!t9!@5cJ{ zd7)cnU2#5rSqQnCroR_L?xyM6Lde}Q`cEO`?id{~(3TNu-B=wigjzRN=NCe)8>fp4 zq1KJli9)D#QD_u_(LT#O_X9}UVPS#Hfp|)n|WkRT}8G5Y{YR?qCNeH!Piry)NS~pei z7ecL@s*ebvW@YN*La14p`iu}pr)m0}5JsnI`fDMKPSf>uA&gGb^(~>3t!gC9(07Ht zY*mlQJ&4PQYwJuMW+}L9O4EdyIutkCd|_DLSOZ5M^xSt$1+=26TgI6 z-4kZ(dP4PQ^(AU9^rx$P!W`XB$mQ-!lx&G(nXCIUq5mA5FjpTN0y`I}E=gYfg#MTb zz3J$L`MSxcD7dixKP-P3lC2rX`*UM7SVw@|MY8cwCMNN*AvOV=&Z zJB8{~Enlqn3$>zJzE~d-YE31!L?0JQrV?AC&j_`pIm%LfPG~UAQI_hjh2Eh1Ez{S9 zPSO3A>03hU>3+-gU7?rhe#^Cc7?)V^Ns4oY4ioy4;#{Hg33;fNKdp-i)uCGcv`!GJ zPHBHemltYHX@5pn7eddlQr8zk&#+Rr5JF8}rP~XkCa==ngwPYM*8POg6Rp<6gwW#F zXrB;T+!~!Ov~NJFUaMyay*VIKt=02|zU-fw@T^`c^ke_IL~DfZlHYTBqfk`JT%sL9 z=%v=_eM0D^*6G7SmC5gU{fi;1?r_X z=$k?Vskhmv{}7r$z0F4LO0{M5H1$%ObS|MS)JtvBd4=Ag>o)76LZ8!hn{~WUl#5ou zbvdC#7p;QpYC^*dt%B=%LQ@Q_g6rl&^IdmiU)1e{mbqMUFY08W(bT(b)qRCBsdw9| zhYBUollL}Fzn({bvx6(rllL|~NoWA|eB1SOq4Cu7ZP)XJwoZ%GJMvf?U-X*aw>0?3xqgD}}61qTbWw$;n z^ar(--TIPH0csB~>#IVQs6D)_ZwR6H-lOjbq4(aS4PMDgsYUO-SBDCr_ui}X2=%Al zbe}FFG>UrDeL7AEz3_gWB!pggzpg5TUig5nD}-M7fNo}qd$(8gqvF?b;G%?AbQhtN zfvbr62pyX|U%#pc3w<(K(>vuxS>jj@>Ivc(UTsstL7gd7tlBoB$NfSc(u>3oE%lIo zMhGqSkbYhWE%i11q7Yi@Yx-rOwKPkAT^|(MLbLSO^;<&dH4f|dh0tpp)}IJ18^0v> zh`u27-1t>QSA^apzc=)Mggzm^H}r2py=i^osQz1M2(3>X)xjfdiTTLyO&uvTjr`u! zg@iVd-&?wr&@1HkmM$aoGp*FTtt$z+2hy6jt}XOPIa&qRjfI+&qg8O-Mku}6+3w!Y(QI6}8LJ3J{!%ygOLKTzBs1tgs(8;Q_3a;k}ov%u( z;Ci9ZcjWh;ep=`z`Msyt3H?s@dtYx63TaNO;Ci>v^!Bt0u3r^e)Sgzs^_xN;({&%{ z_k^yHoge6rh5FNVr}P&>KDzFd{#K|=W~x4|e-x^k8L3X|UxjM-pmlHkmr%+VOor1)W6`AB<&Fs^*0>8C?$t`FVT(=S$(SlaNbtj>obfVx>-9spqP858q2Uy~}pVh;eFuQm;;jDgZ6z+%l z#A^xXbkb-`_sYMY@VOqsWS`Ey&@YJJwb7p>T+mh0Y{;I?uLgdrw+Y>?{B6Rwdf^!B zccR5_3E%4tSrnM~Gkqb=`h`|0l=zE|6!Hv?N&Hn05_+y_xx_nqg3v2X#|PcjUkWX1 zR5kIQzM4h#693Xk6KtH%PiU1$zhOBML_4+vyCl-PpC?(0%9WDnGDU?pv>2A?Hm8MJ zG##H9U<#(&kd5k1Nendone3Wsuo)(V`BJb+6GD#?V(52c>2G#0dXx||QwTjusF^Q> z9wpQ)6GD%Y%d8PXkCMx55<-s>W_AdnM+r0gh0vpfo5MorQNqn}A@nE_=Clxcln8T9 z2t7(}^OX>Kl-%aJ5PFnIb5jUCN~F0fgdQczxF*~5p+|`_VM6FpqD@{Q^eEA$m=JoD zJSJWUJxU%^UI;x(UQSO9woo&Cv>vvoWufV zsL=VU3yFL}-;rNIGfC(s`4u!Xgnn-}C$W&3Clu0rA<Fwtv7B;Je7PVhUv{C3| zx~_=XE_9{YLZW>_{pq@*=5-+-U02k+BZMBMm^mec9;KN1Ob9(nadSxsJxXzNO$a?o z33EdTJxU4lhb3;)C5_3jWrSK+(u4}3)|E7Qgz!vR$`ld8Gi50gCxmCp7?UJ~XUZ5; zRS3_Nv8JvNo+)EZGa;-_#+gTjusRuMx(asU6lz$9z9VSX3*D%_IkB|aDs->* zcA`C&_zq>vJL1=;X{s(`P6-Wb8mY>d&x9tEUs-cWXaV_^HPBxf)hJ&Qsrf!?Z}17?R{^XxhxM*X?VR8q~<_WU?#d zjm^)N)RQT-JWb8Q-iVPaE^Q&?}h(J#Ec^ zIo9vJ%;BC#%>ky_YRteiPdnp&+{O~pZK|h(Y4U`nQ1?7fXLEcWXpt(OYqO`HanHAY zfvLMZ{moUO-;)n|2AJRl@SCPw(~fxtn-)y7)qCa7c!rpgPr+}AYM=4BXP6nV5VT13 zPyWV}YMv9q?!a(!hG}+i$ASOxj48*Y`x~L_+bUh zYg~(PKl{xSuL%>v^Ykc_R|w<7C{s)b&(ot#ybzwJN1O6OSl#lOYC>4u@|pTVXvJx! zxe!`$nrSbD@nMWf7Q*;2#`F`)*MwG^%uu0XO=z{r_=IW=$V?b#CJA*JFqdeC5S};3 zn|VTb-W+e13gLNkf>|wu=gkRbqfn#9cVj1-?Lx_oU2zl5KA}RRmc&jnuM1VBXPHUn z9U&j3A>Eu3dVvUI=~b9J9?5r)aL(BYszgg_fRc4hj7_EHBa9ejy(> zr}* zc678atwfoI;`eS}T8T2PEU}%7Oh@rU$VH~RU&uu!MF?$Wu}Kv|TUl(z2w{z7iJ2^f zHI^l2mJr&?QuCw`+R9S1TnNw1%gkCKJTosdn}zVqyxi;*!ZY)7b3h35!4>9+5axp` z%n70Hv@i3tIU_WZ_GO+n=Y`Pzo-tnwq5VB$z86CKTWM|yq5Z8ie_G;PT4mhyQhM}D zcw$&(!i4a|u*&2U!V|-4Q%nd?4699oP&vA8jVUkGjILW_ste%>Wv!_%geR1>riCTG z`?ID!6UM)WrJpsUR=}3!YI=*drPrHFOpDa7)sjnZFfE>j-y$_kiF(}tDa zWEwnU{l=CZU3#-gWwPs-n@yS!)-gAm$wH`EFPND^s97(VCxy`OZZXS*(C=SP9doB~uS8DF4#qm>E)yn%bNzHI6Xp)_AMErd{a_n7uVsJnYiHzBmKy{4ZK+Spz*ObBgkpYaKy zjqNk(LSObj8@}Jn5c;uy8MWWc7rIM+2h38TsFX75fLSAib<9`HMj@j`_Oz zLkR1buN&7YTSi#NJZy3aVIA|Z$t#3)%p<0#5Y{n|n0O(qW4>X^31J=c4O2}B>zGGP zJt3@P9yQH{u#WkrX(xnr%r{N45Y{o@GJS=xj`@}uDui{+x6NoFtYf}yCJA93^O%_~ zgmuhgW}Xn%G2byugs_hJj#({)btgAmp+kDKj6SjRkJ_6lJg^MrX_2dnqxv( z$9&hE62dy>d*-YV)-m5RmxLMw%t?ITTovjNu#o76P=E3}Y3>O5$nT^vt8E!gC%+F& zsL&Gf`@rN8I!1n{Oc9~8dCG}|a$Mmp%+z*~HDH0NM z#WN;V2z}NWGe!t~)`w=Y5c;eS%`73z2R|}T3SmC@ky$Q;w)wGHD}=WBvDqwy-Of+U zP9f}eeqs&?p)dH<91%ia@ToZ=gx$`w=8O<_JI|W)LTG=VnXiS={ysC`3t_kOoVg{0 z-Oh97Pa*7fo;U6_Hs`V1dESHzVYl;hlTQe{ou8ZHLYM`8VG@Ke3;M!5B7|Ac1yfxJ zv!Dy6fe>av7flNx%z`eO4npX&zBJv0&}V&V`U_#V^O6}Rgx$_dCQS%q|5qkm2xI?O zW~LCv{;$n^A&mWBn`J`iTQ8e6Lg-sBn@vL4?fk~<5W;TfH)g*Oc00c{hlQ})`K>uF zg!*~KoEAd;ykgD?p?-d6z7j(H{LWlwvi0+-iCoL&!1eR0DQGDec3w3lg<$7ZQ(EYm zCUol2R216Qgibx0T0*($N%*>HB$P-`!q-h}Av`62Z#oI#DfxTTlgZlhgBf7`*p?s6 za0xk~&g9@9%ow3*b;9+4=D-Z11w!9Uo*euivs~!M$>oCnW1ba? zX)&(!PiC`FQi}|tT|!9v&*p#-(*Cn~LkMZVVNM7k?KjMaLP+~fb6yB(ziBQDA?>%! z_d-bfEpwa6rv0{wd^WorZkvLZ_>9?YQ&I^1#BEbr2z|jXrlJt~f?rH6A)Fcd)ie^q znW0}zYoTUsm&E>NItg`ZyNal%5c;0q%>W_vJ-?d~OxDgjW{LIVGP+|{Nl5f(cg%Vr z*m=in6M~(8m_0(U^AGcyQ0)e(`mT9fs7ZrJb=Q0#RFUfZpXO7cdQ|8CG+zqgoa#OE zoe<8c-ZMW7Aq{_---VEdzl?s)_BLoMf13~?w3WY2v=G{gaupUrTT!l9CYyHcYH9sA z?b_8rLL%+j)lCR#*RK9Tu*JBB3BeZQN)y8T)8$GR!u-?ankj@lbGzmXAHVL6G4|MGiLSG)}+AoA>nIP9;Aw0_jxsD6fqIKF}*J+_HbVfJWbxsKL zvk=!;LYSY0xULIfeirJwDTMi1sOzo}p8IpTTnkRmE?$6^|B82DuJg(J3c<#^Z z+8~7I{=Ba3LU``a=h`cT=l*=I*M%_R<#!zu!ibmObxH^$UIEuxA&hthT$h9};uUmV z6~c&D&~-xy&;5m5cZBfVU&v*i=Q83H6?TPM;=ZS_D_RKky0EK=5b9?USF8}~XAxJD z5c-~?t|~(4dy2a13gN_HF;`O|oER+TdQ=E!5{tXK2;od(aaSK9%wI~l1`A>SQo=P# z2O5Dx4u9--nozWH~)M8 z_xJp#pQq0!pZ8SNIdy6~RjI02XTW%0cfNHVjGrxQX|;m!vt=!;y!~~xHo|zj?PhI; z@pjwIdJ)EN>F924hw)oFx?6ACCZ+eV-bWtyka}4AVBACMVI72V52>eh7{)!Mp4L$q z_mFy7=6-vf=N?ios{!l<8qaH;0(+mv^IB)YxcB6<&WCaD$!E0@v)j72)!ELIdiJ)w z7?NA5x78oUt<>8Z0^?Syv_`_Xl`5^PVBAW5tZQN1N`0*9Fm9#3RxONMsjsyF#z*@q zYYB{x_EpxMFkZ|1S@*zrE$?SN0OPg1zx5c5*Yf_>(_;4g`K`C@Jefbg#qG!M8Co!) zi8^7Ab!eh4Jf2tGtBJbkxHaq9L=8G_A6(f)4YBsfG*_y!sekocVvT)(r@2y19f5HPAmoVPy1LG1V9-qG*r6-k6w#G^xmvDON z6l;NP^zNgxOQ%}&&@}xmQp0+mT{_F!Beq-}p=V9zSx3a|r%P_I4kmcW<%*v?nQtw8 zSjMAidP^5t8^k_xaCtXd-bd{rYsU94U2N&cY&+C`ciM+-c2&Eu&vfztdU-d$2uS zJ-3#^o@q~4&#k*)T?MtOKQYTY)FIt?Apdr)~Rl zr&Q@?tIuXO`%QPxTQkM%>)tO|^I*Jpd%;=+%1h4H&LUa`y{q$LXY-5al14Pg8|-mBIrF#aCzRqHGme~*{8&WG{$ zcxkJRZL(~)Tb+@&VEm5K?Uom|Z2X_d{B?$W%^HHdzgW}lAqzg5 zcv@M;s)Zez=ptJHJ20hXS=L$t`)W!nvO8hjydBCuwC;iR@pdD705+~&@3MW?W3XxM z`jb5kD=McaAFUT)r<9K_-fz7M^Yj>0cEH*R>)2yj!vofPw#nRnWbGHT=k_CO%L_b% z%T;V@b=k*OlO!7-)$-LRmP^bY@)PU&)QP;D6&ADea@O@PavmMyZmKT()Y>IxPvtY~ zJ=+S3=h78AD+@b)E?uFsK7~CvfSyaX4#9pufSyaXet?anv+~a^YpaxAa5bHke{L1Q z&Y>g87gl3fM>>*xVVwb6Pvd=QoeO)8#{1H01&frgXz`WR5w@&+4OuT3A0NK9`oZ}4 z@U=A|v26u>3@_5lV0;WO z(yL*-jEZ#}#>=Q!KMdn#)IdK8<7L!9KMUh!)KG7Q@iJ+RA?)PGrDR;t&+I&^xhtU@1t&CV<9^g>xX-RE`N_)Wc?b@w;e?EXtP zJyFc=zjW6#VcdV|u5W;G|D}gs1mpfo4}BYqk4HWAT`)c#_0%yKpVjr!55f4Xu9w~j z0b}9IM*#~8PbTMpe*?zK9U?)xcpscSx6L#jb{bc9cCgoM>*2v@Y z+bZ1&#w}Q-y|5vZJ}c{|`@^o9^bOe%+hi*J^+@D#d-m5s7`JDCeJzaJ)32w&xIO*4 z7RK#4K+lJ9dk)Y`Y?Bf$)OR3{OSn+4g>eZN>ic0_!a)5fj7u1(pMr4-7wP9=T*5{A z72BkQi}g-1?p>(zi*;Zpw=Um#RKI+%epSqVzwl7K6ULnPjrd? z6gJXN&q(V-u&e#_jI{m%#^+Rn!bl`h@Kwo=WX*1deR?hFf0t1KU*YhiC)J+OSNUI2TjvZnkRed>OD zDh(^IA{!&NsGywAXvgUZu+DTwJ5JAp@%t`9dLE45cM;NyV7F1;wR$OR1La+-?}F`W zH?e%YUI+W2-E^{tV0`6yf_?(VSDq*6%`o0GOw=hD?-?fQ?J({&PttF}xYs;MzYqI{ zdd8FWK3JiTo;}tFVV{_dg;Vrl*bin-`4oK=)}6k^n5xYIZkI&`7tyyEQ*{GakHSWd zY5J67d4;2kr|Gj`!O-$^rt9;?<`?|7-#X89-5U06zYS!a#q29eGxU0UJXw2Y=q+L^ z3o7S^%V+2#wy7)TE+Xsx5!Yp<8boTP27S~pYgL|%i|x6+V%VIR!D zv-~>!DXetzJ>|3Xk1+4#4dvJCh9BD{d=&m|`E1<=Hm~bsN3EU<>p#Ax#XS8L?Cee( z%Wu%lKjHE0(!+X&*vqO}zo*N?dRR{KRIi#B%5Ty$VCT=cguP=*qGZ?QgH|w)uyuRG5%V4~|EY=sm zczs!{yTcC9cv0O4c8JD{>Wg3#X07x5Mpwh;&DubA1&o*UEqW}Bm-H=qGVG7_>1van z1=~+&D!j2`aalYW$QfjOWLq;WgEzT z2jg!5mg#3<{0+b|y$#0O?Q*>X#@p?3{YTg*H|{FGUGIf`bK`EZPsFyVi^}rV3Vr>T zyc{Cx##*+WU)$!H!1nneHhcN4(1m{$qx&2`C|{vZhMm!IKUs6w-K{<=zeAq`yT8@f zWEC*Jwtc7W0OM=hcj}(7Xk=IUN?irJJF=T>5G*tHyYjpA2-xAVKavGt9sBPpU!}*v z`t{#UHbcywztwu+VSA1;RI}AOBWBOhYW<0A1skWHR<>Gy1xrnJk$n&AeWj_mThj}Y zxFrfMyRwk1KJ0mF-8K3o*c;TkYjkrlyY#hs6zs1(^VM2?L@c7-yXmBgwfc!~Wty^| zxJPfbt>881?&5p&Yp{2nrRpC24vgQ%bg$k6~-2Y zV){oIzu_sS>;281BYulhTsMUATb$zhR2Xk@_h}c5x48SX2gYmNdfgVrYu$R?6;{$~ zSNR6r8+LxL-DDTSO1teUzh7Sh>)CBL*(g|K&aUzY^cdJ(b9R$WggrTSSNVf_ChUc= zyUA{V-KTezKcpAIey4YnEfcesLqc!*{zO|R^cLF+cJ7Q@b?qr zJ*>ysMq9w#f`|1K*clxw>OHJy!*~n$t&YHW3;3=64J=Mu&LjGE*dJ)ic|@;)@z(LE zUJv7~<5B$xjIRYfrZ>U(TF_(qIoN?I=T$teUxIx#rJU>y81GS@(0_vQ9_0!B7Z`6j z8}-L9-f}kTuVB12KB>Qh@z(gHcKl$kFGc0M%73Swuv5x+lbrcqmw)v9Y2IFn>CB0M3F7IU>c5n&yG+)+>ZIk=Y zUe?QCyq>+RSHl|8@_R+cVW-madqqDCvv#$@8ov97smJ0yrvJp_@0{A^cS!R`MZmE=x<>&^GnqZ{S%CzwR~OI%ai#l;Absg z*NtHOjOH8qR2V;_`G$7G{zl91P3?i@SL`NhFJ`ydPTfeKXtSOARND&vO1+Yu+6615 zdEco$Fm9J!x-E>`WtZ*>+2y^hwK-AV+q%fMg4?OQw{>IK{nQJ3 zTb}{r^4`(s!nnM5bSoJ5g8ryG!nhaoN8Jm?`;b5BelXsL{7DanaXokI8W`7ew;m&A z*YjQN%|B7kcXfZ;vQUznC72#xoz?e z#XsxzFdpyEx(AHw`M&N8<9fcY2aDO$+@n>&iD~Z91-2FNJsEp+BN*S4u}7Z<<9hDZ zZWx!hSC_)LJwMRxVBDS`=x#9Xk^Mzi!njBF7d;Th$Ht5v2IFI6MqdugqvKyzUky8j zj(=G_2^P3&SNVtfI#}&hyUA{ZeK=`X`96I!?3+ou$(F(RUX}fN6^!py*{|a;zE|ad zPQdtHl>_=o7`Nv~`VTN}&yVz0*ppPxkM(P?B-Qg{{SIs;)$P(E56iiV0X-3NH)wiRWaxmvW2jFohvF1=@_iCc16Wu{VeQp?~00V^&Z$}|B8z5 z^l1&ayalR5!HSB%>-J(1b#>P@6-V?cJ5PFt%EZL@8Kb!c$~*+)o`*6UVcffLn9VTm zT{z5(Fz#LCne8y%>*txbVOv|TudvMfuwAVaWcy(!4S1qLn}e`(20TUf4UGHc#vFxl zzucJohSGus+`Gs(4Pe~6$Tv-4+`Fh}&Vq68qMm69<0EW=X#?XUY=P+lwnpZlm|g1<6Fynm zOqO(sS!|osrNk_Qaa~HxY8aPyl8M8(ypznsFy3dKY@USiKI>%jER2rJ}nQL1CzeBN!SpegAC^j*-!nj>dF?YhaT~0Cg!uX!Vrse?{-;>zX zJPzag4o@{t!}z|#Q%w@aR{>5lufq5$z-i_kF}t44%-kj?>eE;30pXk24=H@ZjLAo!mxp^A)(ZqKu&M+^)4o&9MQ)9McgtvBz$*UNC->^tq-VjNc@Et{E(5xAl4E znNv@+^?4>~TLCZk^USL-Uhe0aT`;~XeZF}Q#_R6+=0h0Y<<-)B3gf%HTAIJYxXnD~ z2N<`R$LQ0zbh|F4W|f$|-Ikh|Z3REkc%|kcSP5N?DK#5mJk2t*8OGBrGcUq;k5X>7 z!+4KUZr%~I%d0RGnw^;U3NypDf-7m76=p7M0!_2REQE1+t<0@3F0YkY3FGD7+T07{ z<=)yn2;*(Djd>i#+h!Z{42e2%d>E8UrG~1g#w#hcu-VB8CHrC!$!}xvF9n9r0ejjxQGZx0} z($P$Uaa}r^Suk#wPUc1!w@W9p7{=Q}XR{2(+e2rw8phj07ZZo^_Rz&V4CC#gt9cT} z+e26LER5&9o7oEEdGBU+h}rYr-E2AY#JqPm+iWX{(06Cu%?{Wt^xau^^G6uZUk|ev z#`D+1d<5h2dYUg_TwYJ}otRx-FSCq(srlHsS}(K8wt|VYjrB4y*nHZ?dYJ@l9bJL+ znvJkO&^qrme}HjaeC9suQE+xe8+s1al!cR{eGq;jPKs>XWGK} z?*0Cz3ykmH?{9j;_)dGj835xu?fvEw*wHq-iwBs?V9vIsYJeF7>o#$B@r7mr%s;VI zU1(;)_&p~B%{&;t=VYK+1Zzg`Il0Izg`L-(ev8}O1=~ySIl0)ZgMCczIl0(81movI z2AL;d{9MQ&vl+(ExeYcc7(eGW*ldUKb8bV-TQGjkZHRdv#^=*R%{~~PPY*Q*Vf>8y zCFU@UpK-s$@Nd8K6^SMlyNibzY}>%^DlRi~VS5MuNVX96H|kZ6GPlC=Z`w_^5_SRQU2g7$^`;)@<>o<{+ehy# zHjl&F)3-@im}g*Y1`ls> zW?I5tueZB+x@iOZOTAJx-E@JCxnOtk4C8~%x}a3eFau!x9;}&WD2(5OHPc)M+ zHOD*%CJp2FS~- zXLW=5494%Xy1^WV@%6JC%@G)1KfBS;EB$3Z!Pn2irWnT8&%)*u7+*h&m@{E~{VZZy zirMS#O=d}%y+)oszr58==FW1NrkvT#H}}|9u!Qccns4rht)V-s=9|Z0e15yYJO$(P z+XdzY7@yxRG_Sz;{C1()3EMT5zBe@Q!uC$3?+r~B#(SxoP43u`w3oWs9D?y)YO(n{ zjQ3KDja6Z{1aHMrQwZa&IBFWh_=x@+(;UV}^xv44Vs=a1Vh*>mTcUFG1+8u|{af4i zFwOfC^M#nbr7khLja?r1VwadA824hAm?khjqTg!Hfbmv*t2qzGz3ru@6^wh^OHC&j z_tI}OyZA@tNr|GZ@BarpwGIF?$}Co5OaVEWhRE2!`a|?{cHt+O_81?{ZTN z4^}Nfpg7I1FD$^0hXRWJDFBrdjf3@ic z<9F|`HiO0Ny4-E{*m+WyyUl(K$yXrnHV0wcYrflj1LHH(HRdRc&rH{t{0r>XY(jDL^lUeg7}XRYgu55{M$>&yTcFQb?l z3gb45nag0jjN)cAjF(Z|On`AO{XR1T#=Z3W%siNUQ)m{#|wLV~;f$>@E17@3;y&N7iojaabCmu9j+oT8opy?0e9{hu5 z2#mLths;PAZz~U(t6;poB+RuiUSASsI*iX~A2zixKBIluEP!!){?;skaeMyOtP->9 z`G{%L=|nvrF`dOea&mc(7_V)PCY`#sdc^FgGvwpuojOB4ZuZm}@^Le+^NDFbX{Ly+ zpx>Xnu+@`>cJlQ1axs_i%rP@u!ZRk;)n4oPE}>`5LomKW<5{y2#!GXH*$m^Qxy8H) z<2x;$GuvT&r^R#TZ5ZEa@w|B-#&=pgZ}!7pqdP5LFb82D(VZ4Am~UWwr$y2nh4Gyh zNt55rt|#AVkunWne5XaqG==e<7B8B!V0@>=i>4)vzZczV+Q9gG(XFP7ZL-~NGd|?; zJs{hRAIA59Y%@b)d_U1k=295nPxO)*4J)AD{mW)N>=f$VziejMCMCRL=8COUZ*&{o z>J_tt&MEj#poKlBw0hN?)5ErldWKu=Ft3W)_u}j{@m`!~uOU0lL$=8pveUHpO1nr2 zZ=3F7_Ke=6otWl(W`>wO&G$^LZ8FXG%;R;2 z++&`uGvpqVtTW^u^Lp3@l-xESJuhfXRi5~O~H^|X~=!%l{$I*&6_{7 z-F1fCZ@#LNcffr2GgE!I*7Frl^MIKqX4m>7Gv{Zvpw5sVnXmhvXtR&a_dhdTbz+(y zo9o2vcKO8IBxaZJiTMqNyqenO6LV{wA#-MRogs53jv-g7+gs&K0(OsMb*oR!#yUfO zW;P@5Qpe)r&&)0{yYz!*Z=E3zngbZ}Ln{5C`J~Q}pPR#VhWy+d!H|7v$j{ABb@IM2 z1^w)~J>L;;^@ZsxX3yW3W-#(LIrbEPY1Y-r`^r32XS}b>fjW6#o3HAO_qFNOU)q}P z^`j>qOh4GO{pg7YGZ^OSx5V*RQv>Tn_$9fzn2f zZ_G`wFH1)ke`9We@iWWcniVj9X8BvQ78aqs_utG0*zI&Y`kQ$a#&)GGUsbcf#o%MT)|8B0SllOy}f;=AY2lHs1yd&nB zI^!KNT?U+(=26o}%r5V!iPXva(JVn8m-nN2-_Dce@RQjGnO^{`|A0 zJ}&sj$m(A7u!w5YPAQ`vxbh!!@2tnUJdBZH^8d*&4pljp$Gx}P|8!cvhUfHgnbYQ> z6Q6%xlSYjk>hAW98s({x)Jp$RJ+JS{;D)#I>?N9{bF7uxn!1 z*^VFk%zf8mz1IK9ZS8-uEPKh`I)<0jsdTK->db4oO*qX{uU8%W>`*+ULye$wr93%v zvD8v(J&pY&Pa#jH;825Q&%jIn*b?M5N2}Au^AzlLW6xy%+-4l7_Wb_i@#yF0Vr%Jq z&HCBd*}HPqW*_6~roTLb|54UkJ`!m)lh%r3M>>0&9MQ6F8?}?>B43@`hu7!#=}1?g z+?OlmR7dGJSYO>lN4-MTWwcU7>U>J6O{6bsmst0>d7?yWNm(=PVXhv@W7)k6d#>$c z@&Du!|5wWTHT#NxW%|En+`rM%$&;rmj8Sh`<&69+CMu_tb0cJ++}>-?{JXk#ja0Z z>Cs&+M{s+{kJ@wYzrIX=IfXvdf3VMOEty{}^GoNvbYARG*HX_jPvZ2erL*|+3zYt| zYq^%%Tg&Zc_XAHHsq4m#dgd4Bv-Vi_HQs+V?riE&9J|K*pATc_{_i=~pE!j2S*IRpk!fBp5lZHIDZ?UIVcW-kdLj7bJ^4HY)m(%|>k-Ag2Xm-$xk6>9Kh5Vzv(}vQxkjFP zSeg3S}9vVPt4 z^Qb=cq_ugko+szC)-NIsIpWy4zpnm|_xRs7r~ke687kLde%a=~+>_f!?V+^x9@`iF z`p;j=R=~s4agDYGtpYNgUzYppBma1H>(?#cUqAhS5BYy%3)t7kTFl{n0U#eZ3!|Fh zjenN@sXq^I_x$bDj%<+rm7N~Bf`_?IreF7S-PZWeKi3`0{=B4&r&%}t%P9nA)mP`J zYt%BwIQk#2HaM3R({EJpbo`W_ ztwvIsuY#18s)(dhW%vYrreCVG3Kvz<^=Tfah~8p2h$6R+8%OB}Q*NR6m7l!mJ=Iup zo2$aWH#FasbB&`h4O!n&V%>IQBl?Y-EgkY{m_gyj^fvIW?aLi$wXH)tM>&mE-?2-^ z-K7rn@Y3fVy{agEv&TjBR$(r2mkM1mjNYAl!_+a3h~l>!bGef#vUKVVj;uO&%#@ze4bm z!>RSc9Ta)qddo48rm){JOr|qR=4gz}(J+~#VKNsJBzJ;DCP?Hoy`cU4JZ`0E-V7OQ zu8g%nwTKwU0@b_gCd&P|?;y2AJ=`^&=h53be3*9!4PT#X_|mLz>E{o5iEp%iN6!+i zl_{@PTj&?B*UI!aNQsZglsCzgH^?v>B)7z|t;5CE7Ma>M8Ec#RpzkDWhkV{4pWl%w zETD9ddPl~+L*3Jrej|YDW*kK{<(I8JH03{2%1dpd)nhh2y(+_WmtlN*MbDG-Q+EebO`Q0VAyMyPe zkBl`?#u_H^J~CDx8Ecf}j*;96k~>OrM@g<ls}Tj z()C6Q%ga|yQQbsn<~FQ8PZ&zk&aI)&ZA*|s9!u_j;|Nd_1lfF7uD61E9s4dU(TOWZ@J!Z<18wR z-`25!>JZIaBJ+EPOl<*`vb)|LGS^FFE|$pLEs=Ry;`mF&-g--GBX4cts|Zu8Z;^}O2)W;?3eeOxcC&+d75K^KQV^a!ON^xasHkWw}}j_6kl zHae1>UM)yd!YdDQ$M;cLh29WZsXIK1Au)luN&GN2%rfT88;r zhH)4k*GXxy(_wgAhv9KcDAL%uR!ZC;>1M~h){h07>CNbzJ}&7NNxznKqonSMoEr`F zpmBK}+u-1B`4O4ICRu`8q|M)>NZ9#^4D&T@m5b;zFZV~J&9jtyn{%6tm2>1;|5)Im z`rPMqQ<|VS?_G10yV2=0zn%AEfnRdt6iGV2m$8OWWS4V@nKt!ZXV8>hzSlX@lz3_H zO?5cxbmUdiFD)*R5*JVl@1}L5-sM((XWm8qob?@fyeyn~`Qhdixo`5>l=f}MxveXm z^*37Y(we-{%Ju9_pYJZ~L22>4%K9aFuXI>K>D+cJD1B(^>iVbUebD#$`csYj#?FQ1 zvVSO-{X<&yZMU&7O>6s8g*&9S??}t+k(SvZZL&k!!JYS0{hJDA)4b%X*=AGe8AbbL z_%3v8Dx=Tb!UttdJ}l!NmbEBC!&g!+Z{2P4+AbJSmdRNhqyqc-^7A>bK(A$5ctbeJ^tzGG=<_b5bhDX0ZZr+w zebKn$l&Ky!sW_C^ciaq$v|LnMygaXmbrYrMj$KR<{{5HD=6AlO^m$~T6~$BYvYl4b z=Q}#YDdl$|NAl9`_>d{PDfffE zduaH6G_@$TRkk>4UZm+1$#1cIPc8OY@%M(Gsr#Ou388Jxl+Z6*d~f)-Zg`JTLXYRR z?K!?)V`%~2Klf7r*+aen&-)$nU+ywhciDK7+qYFUqt&)-h&l3Y%jy} zQNDM>gnUlqT|9eqaUzd@lOd6}Y{2N^jTE2VaC2UVP75ggJH35$bKZsYOxfnV(mDJ& zN0II_ZudOiHa%2IKBb#VA8*(;e{lETH;kzM7rfliXK}d^RXAuz!!G&!R8xw^I?&KZ z!}IStKRxa%8j{E5w2`Do8}^YY50p6?CUewB=BSU%(J09smB&Z+QBwM-yv}3aZ8V04 zKh$Uf4ZkVx2pwTB&7UFT&X6r}f~2SEzxSS>=g(hy`57ht{9CR+rzD~S?FO4TO_P7i zmeZ2_vnDs9U%BnjDPP6&UYy^)WTW-ng07VML*5eZb?^~6*RyZQ0;!49Dh%9QQesuk zy|-wA)N_c;-2$nt+Zs*VLKoV;9w=#RwTRqX)Yj_V_1+@xf#lP4s{C6^zL)7twfyv4 z;8d&6fR9Q>=J%O!u%vt5n~~l1hFCYurMF<`@m^@7bzfPf$|>$;c^vIJsgrmLjVUdg zdiqIAXgd2HcSyRH(rDfWX@?Ec4r^s*h`;pB%~W<~{A?Xns@gp5oQiETGf1BvA$y}t>C&8;v*+G%L_2T&_k6A&VdH=B7 z`mmR`WCym9vZ?o-vYblUbjmw2ZexdTRo@ZMKdsfiQ`*biZO(g%epQQ)o2qF8IyYO; zl&-U?&(6wIY4!P84d~bC?xJ{q>&d1C>O1o~rAN$Ll&bvQlosT3q$vL_8pfNyhdytU z$g317P&;Ipo%vtV=TqzPkj?9H+*OaqJ*OVWTh=>FX?eZxDQ#2lM@lCY@Q_mqc*q$A zJmfNo+#!)w5?Nco8CYN+X}l<`fA}2 zN_P}aqI75B&6K`V7^C#v!p)TKDf}~~nZh3^-Cx+eSp)S+VK+(-77nBItHSA&9xhx; z>34+*N{iNizTAD?zDIHi;L+Rk6 z+bA7Y^c1BvMekD@D>_2yhN7ltQp*&bP3a>=Z7F@Cs5hmXiY}q_nWC|jZYiogvq04p zbNi1f=JpR1bDQ5GkyR2|E0NP0d`aulsD=;GSf4cdjM9UR8c@Vla=}@&CX`%Cp9hy* zN$IeX8z`+QSx4!plH^$)dM2$_&8wtKuBuSo*M@nr`mOMEy7!5_g?d|9rcQ6meu3&N z?4~XfR;o*d7plp^OVp#n%fQhp)z(kr)vAS+A>q=>sBl$foH$**)ifb~Uu6oO7Jsxd z3(tvfsZ-& zp8z}vh9v%6pD;WEMkPM4G6s)>35hSPOu|#(HsW|{r?liB>YG743+5#5sG^HaG9ON2 ztvad71$ToUiJw*FgY$1H)+$d`03HNG67O6UhDX4t#QjwiUf2@qaqv8)$#o%!;A@O;Y zNq7oOOPtmdcoxh_d{rggK48}ybP{XTeU&b_8}vwgOO+Sy1N{`ncIGB+5`hiJ!3QS9!wikF7 z%t`#)Dmv)e^#`5ATD7yv1$ToUiRTUU!hN7$;_C+n;6X4XaYt1c9s#2gr}YOO2NM$S zeNhsg0@D)TS(Slj!JNeN2GXTuyZ)e)SgY0#biv)AN8*kuFWd+ECH`$y03HNG5~uwY zJOV}~-fTb&9tRT=Z__^sPl0KP@3|-o&xv1mu_{KrK_{_RJzD94yFrh{8xQireV||B zWrG6nAQ+N(zd>Pm1dK}j^Fc9q985@j)!-yN1*Rqb;NT2A3+5z#@eoG?yZ$cF4SGQz z7yyG{7>s~%FbSr>444H~L$nv@0^Ohw41hr}3`W2h7zdMJ3e136P&Goipd0jpK9EkX zWjzdn5ikbE!6cXhGhh~^uWIb|8FYbe&TU&R6fZ&A_wZKH@Fvo3_jqs(m{;8L-;}w1~H;3GJ9G)YI); zh`YfSl0W1E<_a|je7(IF`982xhAZjFT%r1O3?Lo^M@#_lH@DLHn3O37DUm@8C|E&;@Y;AqL8+J(77CAx$WkAU+f|J^Rk6{>017~*koz2slimAOJK z>Y7A61#Xr6r@At^T{DPh!F`hdMOWqu)uNlDi9P==&<(aA-l7I|WAbwLBJKk#C4W;l zrpzbeL2$I>f7XpD^NDx_oG#1M~z>m`41cP7tA67dwcRq`L`&gA*XAf5&H zN&X+Zt5dLiL5p~c+StPlZy~<8rx)%6D>FNSy= zTrc^r`k1`lBoR-6TO~i|V{&_E5YK}9B>$q`Om1)06!QgI#9P$Oy_wwJF2vnn3(4Qo zo5}6%McfBgO8%kVOxYe04}zm5|H4Wpw|5xv2p9w7U<%BDSx}vddV?;|4SGQz7yyG{ z7>s~1Fb*cc6qo_CAbkmMZ||T5xSstaicOphx0=sP@8rpkLzKtAp^6_@3%8JOV}~PS@|?aWEnA zM=O)?6quGcZC~&#n3MP!)#@zN8*~z7KLK}x9*KWd?S=b5zr>GJ2jD?4B=J~v1RfQC zvN{Hjg9(Y7p-FfOOiR31bq1aVa}w`Ytz4)#=p@#vVbw0U8}vy0s%kIX2l^%6x;g+4 zf+30DS{;T*z^KG&eSycpgv4omfv3Q<#J5*x;8`#y@jp~6H|h^MiF6&Z+68xm9*MtR z>4p11zr^=c2H-(3B=J**hv5-0Dsj*7I6NWVcX$e(7Qc9S7M>FyH{5ZyT~8;Gk9%&o zNBq%BAKWiKWq1%C5}z|X0*{I>8Xkuy#P1lMgr~r?#2+7?foH*-#GfCoTA0INS^OfqseqZFm441Va-4syYmhfKiEWua3dvU_#=wzk{d1w8UvY2hV~z zi5HDf=b-+elUS>ojc~!;phx1K5ni|t^h-Qe9e@YHki@+s!te+fm3YmF7(5OpBtCUS z5}pFn5??kV1J8mviEkL8&PDw}C$UyNHNpjVgC2>$Ho^<{fqjU4UDPl6AC3qh9t1-Y z|J#TNJSy&}iNWJwLgFPgNq7oOOZ<$Q3_J_wB;K}0orn5^PGYUY69>e7?OCTCJc{&QHigsiNWJwLgG`ZlkgOnmiUd;8F&`VN&MLwbw273I*Iaq z7u*ecBu?LV!F`}#;@fKi@E{nH_@0_DJOV}~ey}D6kAn$`AFWBkQ(#)+>qchaSuiK@ zUYDwts6Xf=)~fd}b;CX4vo7<(eV||BCyxrigJ4MFkBth$BVbhG{>x+VIGB)l?(!r& z1*Ro_>lGPz7R*V!-IdCNdV@}4t$O!L7u*ecBt9qLh5JCi#Lo@};6X4X@#lkKcm#|} zeAHDjcpOYf{JX1?@D!Mq_}!y3@GO{|V z!7vyBV_+Oif+;WqW|V z!7vyBV_*_Y6S*Igf#<{@tyFF7@|?t4HD$O9?h#*A>4p2nsow|>iBrD;9s#2gzww$F zJPsx#zWACXJO!pD-fTn`o)hRfXfda3AQG_!Hv;@E{nH_@D`4cm#|}oR0tSIGB+5$ZL}D6quIyw-Yk( zESQt{_G;Au^#)y_8}x!cFaQR@Fc<-2U>r<=888c~j&`{&&s~1Fb*cc6qo_Cpz4frK^N!-y`T>afI%<}M!*=D1T&!Of_4MF zU;qq*F)$7$!4#MQv!LpV`hzae4f?z%1zKj`2Ys z7z86=987^((9r|qgFY|-2Ei~G0b^hsOoAye17<r<>DKG;2N zm;_T`2F!x066Jy}&<%RQ02l^iU=mD$Sy1)CbU_#B2ECvU41i%U2Dr<>DKGt1_Fbg_{*yFiD50SSYAKWj#urdG-f+301_wMir7?t?a${0Kj zCM3RaQWBm5(-MEQG6TKr2t(06pp#gu991s38}vy0P+u?H2l^#`?a%-`2!}l)^h;2Nm;_T`2F!wLILZfIpd0iM*U)~#3-^J3!~^gk7(zS@kAP9cWAHebka*k4 zNq7oOBc6e0!JNcLOjaXMZ_r6xqh?OFc^|kF{0VG5#f9PBAYJK_@oe5V+2&60r^#Ln z=L7vR{NO18cn}OB9)?H2sKjYM3y*^d#FOw8m_|GU&w@FL-!MhhV7@^oagBOuiVN-$ zuRqlb_kn(iztuDV4}u}Y!|(_gMLY(Ng9(XGn3{yAz_i5QYMOy(!5rdhB}A984gdgr~qX;#qhOu12BWpp&>p zO_=I}yFrh{X}y5^K)=Lky?_V75aJPd6dr@e!35$-cnVBQJbyZKy}D|87V(_K>Ad`M z)EjgX*QiO;nd{Y#=`O_iE$w`NuSfFtP4~k6@Blmn55uGI7(4+_!qe~!JO@`-*yTBi zYt+8!F1QEoh5N zLzL|a?h&W5;mJ2*5zHhp^%C3hC^n!lk8r67O03H&*VpV1;Bhb^@#|(L;VCdJ@wb|0 z;W@Zt43-mdjXE&R4flw@)zk;~!-Mb;JOYo3ADG5mukMvT^ALu7dGoi&n=5n`-3^qF&6bFa(lbs9=H$ghX>&ycmy7W$KY`=A@Kv# zlJFFmmN>0%@GO`^TwR0p0dx{&eSo_`kHo*ej>+4(7jYlxmwejq!-HT5@i06BMkW6B zbxhfBARY%3lK)oIBs>MC5zoN0U=DFL4)X&#i84QMH|UXghgnRSAH;p2U-D^w;6X4X z@d>lS@CX={IIRc7^=kX97~*j-A^9{v@D!LvJOj_cRS5F|I*BqLa5v~d+za=Ce#8Ut zAQ+PP*Vi$5zQc$|z^LR?KN%he6No3_DKIVZ{j-?s)w$Pa5YK`+$?tMKbG@2&y}B0j z1v-f`UvM|*LEH=XfqujT@E{mMJPeP3QN&~L1Uv~(!!z(4oG!{pKfy_q`oZ0x2XQal z2l^2Yz=L22@i06BMiGy}<6r{uBs>MCB_6&$1J8mv#MK0}FX$w$QQ_-da5v~d+za=C ze#8UtAQ(bC43EMSLRzm8Ps20t99&IAy+9{X+7<2wJ&1eZKG2VN03HNGh=<`3Fp78# z9tRVMC*f&$2A&0Th^tAcH|Qivz2R=qgSZ#&1O12x;6X5icmy7W$KY`=fp`+00@H|R z;8`$-xSEW5gHEE<8}0@@hflZJPYO!S2Iz6&`Ff-6Yd5*h@F2EZT~1|wh$jDtxq1!ll3 zsAi#j&;`0dFX#gUU=R$05ikbE!6cXhw-NdKnhZP(s_Rh?&;`0dFX#gUU=R$05im-m z@5$!G;Bhb^@z3WZ;VCdJ@gsAxa5WqC0bQUQ^nyMx00zMjk;@OmBVbhGpU;WG<6uJK zN9H8qDKGp`oJI<0pnm2Oo16N z3#z%8F6aW?pbrdyK`;zPz!(?@lVA$WfLTz@L%E;}bc0^d2L`|(7zQI?42*+GFa>77 zEU0ck`JfAQgI>@F2EZT~1|wh$jDtxq1!h5YBgzF`pd0jpJ}>|V!7vyBV_+Oif+;Wq zWJ;mF)$7$!4#MQv!Ggt@U45)sC z@j)*b0K;GmOoADZUIroCoeT7WF)#^cKzg0MJv`_I17H}8fk`j}s#`HW=mi5{7>t2Q zFaxTk7$5Y40Wb{4zzsxRPm=I$@C;nthUtM`FaU|~;fiooxF%c|R#nL-oDt3nSA?s=HQ~Cjx>E8B zXN0rD72&FIO?a#CxqKPntZ+rRDqIt;3#+T-e8L&wtZ+rRDqIt;3#;!-e&LL8R=6Tu z6|M=_h1J!PUpOP26|M+Zg=@lfVRen<7tRQ)Yb9JbBb*hk3fF||!s4t_W9!Yr=J5CMVrcLsRk$Wx7gl#le&LL8R=6Tu6|M=_h1E}7{)})| zxGG!|R(HvHgfqff;fiooxF%c|RzH>e!dc;pa8OPl0bHC%Pa7DN(TobMftD2lwI3t`Dt_W9!Yr=J5^?>9T&Io6P zE5cRbns8lM{Y>%;XN0qU_=7G!Bb*hk_~8$^_^fb6xGG!|t_$S7^s&GxXF06hj`GqsWS>cLsRk$Wx7gmqC{2Ae_a8lg zLfPxg2xo;W!d2nAuzFnTC!7(^3Ri?{!gXQwYsn{^5zY$Nh1C<1PBS-xQI3t`Dt_W9!Yr=J5{^XbIKf)Q|tZ+rRDqIt; z3#(@&zi>u4D_jw-3fKJb-@ANO;hJz=SUo4@3TK3~!WH4Fa80-_to|VRg)_og;fioo zxF%c|R?ka*;f!!rxFTE?t_j!u_!s2*gloceVfCVvFPst13Ri@y!ZqQ#aQ2Tbe?_<| zTobMftCyr6!ZqQ#u&PTvgfqff;fiooxF%c|Rxe9_;f!!rxFTE?t_jzL)t@B4a7H*Q zToJAdt5;n5tZ+rRDqIt;3#&g%`NA3DtZ+rRDqIt;3#(Tpzi>u4D_jw-3fF||!s;(B ze_dF;CglldgtNjG;i_;=xGt>zD*1&o!gXQ(;EsEqg)_oc;hJz=SiK?Xg)_og;fioo zxF%c|R&Ppv;f!!rxFTE?t_jzL)!$tHtZ+rRDqIt;3#+#zy>LaiDqIt;3#-3N{e&~Z zS>cLsU0A&>>4h`GRpFX&U0D4?>LXkct_s(L>%!_CDPK4voE5GJSA}cBbz${S$uFD{ z&I(tAtHL$my0Cgz@(X8#v%(eOs&GxXF0B6L@>hhb!ZqQ#uzF9zXN0rD72&FIO}H*>{wA(jAKFSdBb*hk2v>z`!drPRUq(19ToJAc*M#fBO1pen z;fiooxF%c|RxwF0ToJAc*M#fB{OM75J;E8`tZ+rRF02xgUN|FM6|M=_g;i403ulD0 z!WH4Fa80-_tWuI+I3t`Dt_atKRa(*uXN0rD72&$D>X7up8R4vOMYt+l6Rr!ZQIcOc zBg~(>we4CFt_s(L>%wZZ+YX$MmQ^65v~f?gzLg;jN}*2 z2xo;W!d2m#a9vn!DEWmm!dc;pa8%wZBgK5E?(^->4Y=FS>cLsO}H+sc9nd>8R4vOMY!sR@9xr9gsZ|e;kvMz z?$Yh7j#kI2i`1=5#QseEoX7DfZ`k{`cb)gF_jhkky-MGupVF`EWNcJy@7Uq7a_p?w zo3Sn9`^Jxqe=UAT{CDy9<6{z^P8^mvJ#k**TZyX@cO-tD_;W%fJCZY!1Igo(HzZ$3 z{wevNTDnnwqmwr}Yokjxx@w~zZglTP zk8bqwMjewTP1`yd}hk$r|di>raTo_qf|m|ppt4sl~Uu?7_|{nylukDe7RgvFcWvs3mGsb)?!%EmNDTUbTfE--=2Ip5^abh`O^??XtNZmO z>S2AU`h~ts{Z?PDp3zsRx~{6f=quG<_4m|2^;POU{eATxeYN@@eU19BzE+KiU8lyy zu2&OcH>k~HH>#~-H>uCWZdTjJexRnueyH}2-JHT76bseg?6!8E0QmNNLQ0}M{y)nIj*!8)PcZmQm-*Gy+jleity2xooni3I zdA|TB&ougq;|+#u^7l0+Hl8-&kF59=ctQLb(48fE_RUW-DKEAqPZ<0oS`}UcUHPsi zF8s{3{~+95y9;+|Tn$~_Tz!t+?>$mpk^A_6nf{x*m^%D#a)sL=dMPw0F&~^r)@zw(K7EdN@nvp7GZg zn!Zs#$l&$Xnz_3(e30oOVT*D0;NH~Ml@l&u^72l?zdK;?k*N#7fuh0fZ7*_X`I9}1 zD|ugQb6g4T?866{e&}NVVRPNTv#HNz7LPy9=+nP!@W*=^{EO93T8p>wF(%~dnZ^cQ zGuP$xrka|B%UORNTs_^{!}W3Jb#-uO z54Yqi2X@mwm-HM7zM3_7%^5x5W^sezdR}C&;t+d9r`fAmZST?3HvCQ-{)!FB*tS|| z-#hMFTphyg`ADz1#+`clILjo9?n+nLc6-kDf!%FupJ-e7X4~2?Sv@so@}8y*UJ^5{ zbe(PU>DIoTVDH5Pr~V@|jZlBM*}iAp)!nw%l>D5VDulSoACE7 zj+tllg^LWnVcTJi)q7V=$bzE`PEVNYb?y1d9wy`~^9?>^-?pwt{lBT_8MMIr(+!T9 zXYj&B2H%)#aE;Z`db&OteO}x%KEvMMtp`l~ubKM|%9*pTY3&L7ehVC&W5VyVcy0bt zLfpNG_DS~y$#ZI-ovmk^ykF=wy(`?uj_x$Ax3}#H->@maVeiYYBX>XDdnI}Aw|-Q( zw$W>G^&hkPTGG4r|8>@!-Jz?M>+P;q;a=zNRMA?Ya6Q9!_CR}=cBbH%5Lg%>CWT-eq^M zM|v){PntUtK1;gyK0^NY&qeea-Fw!(dBg8_Z?PX{21yd$eL_V;OF@?~xts zxM}{Z*QmoWtBt3(iM8QBu*ZbQ3;QZw4Z2Eugx+~{$&x`9(uKmYaoA60uFJce1&*`C~O=xB;UjJuJe8#B7mgd0V=t8-_WdVncm)(nG} z9dGc#6$bB&8}#d7Y^>+O5rg}8g_YVKlPUvjbG zT+ZT!bA|8DrnbdSS#Ga!(4ap?HrCRW{E$s^r%iLpF$1J=W9{cd^>Hb0KdMCR&Fj{I zpX^~;JKWCC>~sp@pF8jjFnr&m?HqnCT+Q8^E_{vQ76^~m-1{OtUUMzr#`XW$$Mnw$ zgJ)3(H@h-Y%iO-3X@O(+Gi~DLd7^gS<(*`o0;gS18w%aKa6MgYIHjvwc)aY=hwqWA ziOYMg9f^cXIMa?S?hDmH7r#xN|M$N1m|aW{TrgnJ`PK8SU%ip_tJm*^F51!Lns4!* zPTPMXcllBKbboU2cc|5<(@dJV_Ss)-Ez;>W*CPe<&T`M%mu(t%jU$as+*9+keRf_+ znL3=Xo2!X=Uqr`E|C=#L^clR>zJtO&Sr<+D;hr3}58<8=?!&J4x?V9-A9mO4V#9L_ zBlTW4*Ytnehh6^}sVBR$hcWzq3ETfS?E7LQ`|sWk?k%&aeQSryjOzF7NOs0N+Xrm= zcRz35O>WNi+jg$Nc?hj3wMr|q64C)`yBgxD(X5GRRz*^Tj{!AnA|2?lpk`fUGlpjHQw&tqL@C-egHdFl{QtA(t_cxn--)uF7&cxo}IS^e1) zy#&;1DQiQXIt3470JR#Vrk*N*nl;95bP?3- zn^=l2gIcYjrk+|0YIPhn_0&30vvPG5`b1Exlc=euP6o9)g_?S*0%~;{HTBf#pk|e; z2mKXLt23#or@jhm^)$w_F-2iHJBUj_8n?TK~-Ph1R0JZudSL3N$K+Q_t zIq2I!t$xhacR{AbL-vw&*Q*|NwZcwXxxF(M^z>CoLb4{MAfm%Jl zHF>NEUxt2=Yx2}XpjHoaO&;sSSD+u^nmqLjP_u$~75bN;R*!K_p86H2)vviGPdx!@ z^(0s3si#1#p61Ft^;=N0@^~})cc50!a%CRtkUvB}$Evi)dgQI>7q~u8y$EXcN3PFP zFM(Rsxjv7z$~)12;`%)G3aDARyc_*0sM#ugFZwl5tJk?oPrU(Z^(I&8slS0*y~R~} z>hGXdZ*!HN`Uj}hJ6xrw{t0SULLWuH2Ws^`SLvw_K&}3*9!Gx&YV{wk)l(mVT7AqF zd+NWSR-bUio>Jb^XwQ2FtwF6~-m~a9s8zyy4xI$GN_o$t)1X!z-izo_pjM;3m(Ux4 z*f;NG^b`>L=DmX61k|kIzlz=r)M|6@HS`vsR-f`-M{fyY>%2G7TZ7m-?=AE;pjMyp z-bQZ=YV}#~9rSjfW}Cyi=18OzP8;$M+ zwVLgXLC*oTn(K{4&jYoZ?~O-yfm$8tO++6AYIU$T3B3T+>JV=VdLgLQB5xD)p`cca zz0J_wpk|eO3-nSDyXtL;J_5w9dRwEv0Ag3YZO})9*i~;^^cO+ws<$0F3u0Hj?a|9Y z?5Z~v-3ww@y&cgjK&@7KJE2#BTJ?FmpuYrawc6Va-49|{z3J!zs9AZZ71gnzRz+`b zbP3d|?9D(AgV7Er5Oy%PFIpjNlB zL&j4-2DQ4~TZ_H})ap)e9r`CAHr6`Nno` z=qEvJop%BHZy>hLyAb_%5L@S6g#HJJt@AEH{}a^eUGFmVzd+3{jmy#RgIayyU4i~L zsMUwwmFWL~T7BeQh5jE9yXRev{x68#^R7iJeJ$G4*P}J4Rb1bQPJmh^_08xMh##nb zi0%Nfb^2EH2B21B^lj)3L3}@bJ9<2b@2BrXPXx7^r0+sc2DO@^??!J7YPE^J7riNn z@2BraZw})7=?BoC0POJqf?7@0kD_+~v3vS4^fVB=ryob} z3}W~66X;z*?4EuSy*r5A(@&%K0I_@e8T4Ktc27Tx-Ur0)>F3bKUI1eE^qc5~Aa+l` zg+3I-?&-JD-5_>Pzk^;1YIfedi#{CG>InTF`bbc#FX#`@M}b-$tv^H`18Vg}{SkT@ zs8v>fjLw0YojaePdqAyvwWmFm2en$EW9XG2zNJo}`#^k4okFh$@hx=+dH}=*>e1)| zhz-+0aEddgZPtr8}v6o{7Jnn`aBSSQg4U;CWt?&w?}^q)a*!_ zivBi;tSR7 zB>Eu`KT{ut{yB)BsgFVb0>sbM%h10B@iTP}{VPzb$8`_-*PvEUX!?};4T#UFSE8Q+ z@i}!L`nMoHr(TWz9f;4V2hhI<@i}z?{RdF1=k>AZ7eK9E)Ft#EL3~a1wnq6w=qCW;TyVcG|e*$WyVi%x2P%9m~ z5FG=t!?BCd2@pFRy9AvAvBR;;&>bM-@z~|)(IDgT*cIq8Amj1amFTe`HaT_`dOV0t zj$MtO2r?dzU5lOsVv}Rnqc;Yz$*~*Jn}XQn*v;t8L2PpDhv-j%*v#0i=siGeX6!cf zULZCzb~}0>5Stmh6TL5p&5YfJ-XFwf#_mREKx}60Ui2&wn;E+wJsZSk#vVY=1+kg2 z2hsCEY-a3X^noDb@z^8igF(jQu}9H|fQ-jukD(WVjK^b-qZfmW$74^Rmw=4NV^5+F z1MwSUPos|j@f%~$puYg(H^!bt9}VI+#-2le5yWqdJ&(?U_>Hj_(aS;n#@I{fUJ#oZ zdl|hF#Ae1`LHB{!%-E~w)gU%A_8NKs#Ae1`M;AbBX6#M$u^=`x_7=JXYBd~t8@&e9 zYHjQt^l_k8>tgSsj|a6nG4>w%Bv7l9V;`VT0U7hgK15#uGUknaguW8QF2z1Ze;>py z#Xdn_17eqAxclll5W5tMp>F`OOR)s{CJ?(6OQC-NVwYka=vzSSQfxH(M<8}7HU|A; z5W5r`i@pQIF2%;9e*$8cViVCn1+h!9N$7h(>{4tB`aTf56x#${1F=i7&Covsu}iTn z&<}ywrP!9}pM&^gv8~aMg7{;xZP1T__+znc(T{`pW3lbfPk{JivF*`Mf?7Qln~HuK z)atjf9nsH#*rM1@=--2kb7Q-pUjnf?vE9%wgIc{3n~wf7h|P)ZiT(?y)obj~_S9cN z#<{T>=r=%ozu120zk&FEu>;V52l4%4GtvJ5@%>_*=zoIvez7^|e}VXZv3cnCL2OQ} z3;iL8&50d^{s_e8#1^1G2C+G@h3HQ}#<1~2(P@w|Y`hyi3dFCAFGX(v;@8CwM{fvf zH8y@EdK{?L`1n!i37}RJ`6R_-WbH5#Cy=2g4mOI9=$n;J&CVG ze+txU%XlApD^RPgX z7eMS-{A%WG>F9)$>@f*>-AmiWo&FB>%|k zK}~uV^erIvHvTU9M<6yf{vP@c5E~o+0R0mX8yo)+{ZkMd8~+G>4~UJ8 ze~i8l#Ky)yLDxWRY~15()}Mjc*mw;65Qx7QPoRGR;_t;%=wE{Pd+`qRuR#30_-OR6 zLHxb=81!#I{Jr>C^iv@IUVJ?Iw;=vrd?NaHAT~BW3H^Hze=j}-{Ra?#FTM%-1rUEP zz8U(DpjI!%w?NlHtzM3AiT)Fa9gc5}{xgUjj&Fnh3y2+#Z;Spbh#ih^hkgUZ_ls|j zehb9+i%&(r4dVO7cSOGf;`_ySLca^*`^9%bzX#&`#dkx00Ah#Z)6pM-jJxA|qW=eE z+#TN={a=uAcYFp~C1#+##C~WEGT)du038RJZ%oWYCqZm=q7$74vDJw==usfHIx!Eu z0f?Ih<#2R zj{X#geNG&S-U`G%CyqjY8pJ*)jzND0#6BmMp+5^^pA$Ls=RoXpq6htX5c{0SqjvzY z&xw`jX(0AF(TCm{#6Blhqjv?h+AA@D-W$|vpF{yY1H|?wjz#YeVtW%MbOyxsCWg_o zKx}VfEqXS{++$)LdLGE!W8wsK7s%XW;w1DzAY<^vDd+_tWAMbO=!GET?!@WnZjf`&rm^i3f4C-Fn{4?yfs z;#Tx6AoeG58~R5e{$ApC^p8PoQQ}VY9U!(SaToe0AhsxRH~Oa_wkUBg`W_Hll(-*# zABZhVJbAo^fn-KZpj3CTaYz~WD30<$Qnel1HC=S z8boq5dMe1;YjO;FM-ZPXITpPah)E1(5MtayRs`Amg>kwX&Oo0C;?E@aL!S)d&m<2(S3vATawhsT5c`nqM1L8?J|yR$zXI|s zC+DFr0(q8`UFb_dp5^30=*vK!<>UhNAhsHAv>bhmt*nJPa~Vp3I{k z0eNPVE76aFJhRC@^kX2;Y;raFagb*=Ie>lw!9bE(Lv7JnyL+(VK(3_ft2cKLzsMPyGDIop9gvGr|w4Y0P@~X-HV| zTT&mPDtxj>mdF{DuF&5#NSAz(BA;@H&Pww z^FaKK)M)fKLB>j{G3alB%%!KsqQ4C?Zc2?uUkoyCN=-yx3Nmg=O+tSMWZaaRg8nYZ zxGA*>x(Z^KQoNDW)gX2$wFUZG5WAGx5`8_0ElO<--kjP7yd$+O;dg@UuSji&z6)gS zFSR}TZjiOV)Kv7nAZvfA9ntrLto@~SLO%fFd!%+jKL}#eQoEra2C-?W>F7s5Y+7nh z^rIl-oz&jw-++vFQZvv`f%qG#{m{P!@i$TjpnnJAW29!H{{S+^Np+%M02$+?=Ai!w zGR8^GL)SsZHK{K2pFyo&O&x^(3y4pWT7dp5h)KOEYK*lwxW$6C_v1zFs`oADHE!Bfo z=^nI~&Z9MmO-rvt$3bjbx(}TMv194g=usecEIokU0K|@^3+N3&>{$9(^f(aPl`f$- z0vXGshtZQk>{xm&dSehfmR^V69K?>LPe6YP#Ezv;LT?3P$I_>uKMi8X(x;+717f?< zr=vdyV!P63pg#{{uhM6tr-9h3^w-ckgN#$sXQ6imnMX>WgWerv9w~h;dJhnrmOdZ7 z7l=(uUx3~R#HOV$MDGh?$I=&}Gaz;>eF=IN$oM6F8G1H|O-o;no)2Qv(pR7l1o55H zSE3IFv2W?C(1(E7xAfKMMIiPqeJy%1h|-_kdt4+F7p>6_6H(MN;WxAbl3FM`;&^zG;@$lOu-PV{mRTbI5I-3wyt(s!d*fY`e9z35dSK2`dD z^p`;FUitxaKZxB+KZqU#v3u!<(L*41FZ~F*2x9lrkD|*Ub4TgN&}%?!VES?NaUeD@ z{RH}W5ML|(B>F@UdzgM2eKLqWOh1FJfcRSJXVIsD*v9m8=r4oV#`N>(uYlOb^o!`P zg4o9NOX#nI*v9nB=(9m=WBL{JH$d!O`c?F|LF``oHT12{Q>$qkh!Duhv*wX#%}44 z&^Lit#q`JMAApSA(x0Gj0rA$-Y~N8o0vWrdW9T1)jNQ@+^c^5$w{!~q6Ogf6x&!@F zkg;2OH2NNpv0Hi!`aY1cTY4m);Tm8i?U{T9f)PJ zV<6+cj(O+=$hfbg3!MTP_jMeE?f@D0bu2)S1{wEtEJTk18TWM@iXICx?(67Aj|Um| zbu2|s1lgOMBhj0H>{aVH3cVS~UbT*6&|84)RqI%W-V$VN*pUOb?dSow z@5qBwJ600A1Bm79=tEBfv78;N(K~}!&W-`}t{|4Pqk!HW#Bz2Vi{1moa(0x^dx2Qa zj$!mZAeOUZEqY&2tNlCHp$`DH%5YwgCy2G|I0Zbo<5X~A$LZkWjx)fe z9cO}Pc6^PLUj=!tJI+FX9pt(0I0t<;$o{B~bJ6F5?2qa=AALT^{-}-%&=-Krv2W^M-o4(7-V}B%Ox0QaEnU?& z=?C-+yf(LC1!~vW+*mGla_pzEr((y)Z;1agK0i@PoRGLYu}yMna<}9m$=>8Qlb0sH zmwYJstK@H!vr`AB?oa(Z_3P9Q9lLk*ca%Gh@3^Sr_oM5h|2le`4R+mNpACMy!MHJ- zjM;g^KW+HNhX34f&#~8yJ#*Z-<1QL^#kfC@`|r37#uvw*Fn;-j)f3K}aPfpIC;WTD ztcg=6pEdcnlj9Y>ElwS+*QWTw$NsDGODFW&;NRg>cAIJr#sncsWv5J8WDdjW`ld`f z&4iIX_*a~=^gwekHVEN+gDKxEn!{hPll)Qka{rS3(2udB`B&^rew_cmW@qmc{QnI* zd7tF}Q|w88n*YCLH}5n2{~bGnpJm7F@7W#u96MP5!0y`T*;V@j|6gRs=^y$35J5IUXN%YjR)=S(Gh$`d3CpaJ71f^nU&8+{^Z!=< zKgs`h_`gM>%zRs!S+An{Bme)CAb)ZOb00I*+5EpRIbB~dYP!Cj{}1#3*-=IH;i$6u z1m0wHS#3FbZ+%#@sOF=O8$Dg0$^Y}w*NmQ_o*I3;t&caEvzR&_H&iH=P31UPTFM7)Cqai7`^x!6D~^-H*7NPWY?o-=ce8=68HjGz z3du!<_`!W8%YI36yfR;2 zHkZ4ZFAmWe%H6ASyQor|u!Y5y(`FTh2Yc3a=1S%M{Ir>+!Ch2$zGu;Hd+lCyYS-y| zpgOxhv+w?UEnC)K=*jh$IP+k6w_Vj-vSxQx2j$nnk6|JTTjaJl8yL8Fiy;R#ePcvtUM%mCgy}M4IzRTX`=~MeI zDD)2Z=l8d#?kaW8v}d!TQ!VP|7WI{=X8+7ZU3}Qmd5G#>S1RWRrgbe;U&t2=bBp=> ztnMX?)uM87Nx?m7_LwFcF6Ldpl7b6bq82VyYs|B~Y?(b@XU?7t>h4=P7;2MQG{0J0 z;#-!UUa)U)Xt+E(SI*g7i*suOy&zxC^_mFNM!~^?+)$uRlTw*tz8nOZv@Jowb+&|? z+?|D?bxnDj0tWmVU<%ZtTro#LzSx~FFYN2>iQWLypQdpVdnJp8m-qMe_)XgA^rdO@ z@`L#zQMN-Aii=kFb*~%jaXq1NXkrg3lxO8v6pHz!Wf$KRASq_9piZF#!Lf;7oL^H| zo$sAl_7gM(m=sHgXyb5-rT~+ovzTvA(G*})6b1*e0O3+Pn}bZMgL&!}4q-ry;b_#T zO|VIg5$r4GOO13*0VYLPuj|jf(%u*dBugu@ya({vdexC=noqKbtt@nrgi1V_@)^k|7*k?ZeYp6glN2pJ0EOhL|eN;$!S ziRtX`<6wt`SxM|3Sc&P(nO-h2!GXzR9FaBoAjmX!OOVt> zGE)b?%*NvcfQgDx8-hWY1FyY^bwyp<{VbHy(k~wCT9Y(U$1$AmGbk3QTw*IOZ%^0wrmzRA17*VU%o$*0GA}1#P|`>(9T>m%zwc~W18Q{ z(fIJ&I2t=Qcw0u}!f(p9vHoi^8X0~?Mq|UT$7pQ$)z~Js>7^KrkG=|{X~M6;Xlz$+ zG|apKqoIx0VKgrE8jMB;Z^3BPNN>FnQ?|V4qUqYc+M>y@$nCDtzS^Rx8!xtKT+=%( z8r^uKMdO;^TG9BH_fs@M^P4CdAA0XZBSWUufAK^UwY){530xK0wPo;Ph-UI%2hkY+ zbr6jSRk!Wg8;zPXXh!X`aj5YHN~Pi4U{5}p3VYfvxVtdi zHr)6S?PF#R_01_33&l>}f6>!)<0B5!VC~`!8PO*TgrM6j{4DpDmx_D(5=N#9QA2K7F5tGg0_A?5P+%MyWMngMu?ZcTQEAxIH z?knL;v`=zauGnYpbNg7a+wCK}nQR#$U&tc1&l`;CMu-l1@9k4C_cKr!Y#%p!u+%<6 z>{0tjXOY^+9g<(WzG!B~h6;Uy<@TB97IAia``5LPWv-6#Q@gv`-BTE9bF-JMYZp56 zc&1nUG2RGCm^Ex4vxM>fVEd?`tBw#oSY#&8j9l8sS@w!4M}x#QLs zy|maDZH-x&m9`Pi=`o&z9hc<#qj_ic_ZQZV7~3^iDl;t-&93oeYp|z(xHmsS zZ0jv)m*4i45%M3F$66NJUD8nBh;fVTln}o3h$*bsb})-n#{Z1gDR9i9QM`3m^sO9r zbMet=^U!qWhWhCKGG7}_6CUnHW97xR{zPV|V<-7#QFMgs2=(b=q0H;D?bR+Sl=|Ao z9E=4YITp*uOsjR_qn9CG=6chZ`671`AKhq-KY=&5uOIg;8b5p3Ee#l>KP$f~x2CVqCKa=l?SjSp z+5uy<=+08Rl5(XsDVgSK6D-4?wsCgas7;>Gkf&`vXRF#q1@1 zXQV`8pq8wn0amd(I6JqlO;I+LTdi-OAmoVhWcL+%y9V1Q4Avi_jU6mLM5BV0hiFvO zRn9C&6EN{NkZTj(W%gz)v?J7LCVBFs5pvt35$>)>!@Ej$T0JkOF`B?lBaf7Q;ffV3 z`bBdc+&9qICOGVp~<_J~PBPenApo1R^7 zlF;C8z3I#*tioX1S}s|I8)ElYMQgBxRsa4@X1Uv3-Qq%_P3XvzK6dUqdJ41ED;j#> z+BShROO5?NvYg6&I~I0?O?`i*^Aa`W|@tb%h}J!aLjbzXbQL3 zP$;&EvR$QJggka5#@kx4^d3E%>% zRXBx)SUT@j%r_il*sRmrezV)d7Svd-vc-iCO`Uk&tj})af&&xN>ayDukwBAD)|y;x-6EDfbJLqX zoTzPtDXHxmmMyn^4DP#GGBbNz=wyh+`GLY3)8WwgAa-*Mro-%cVc)FTeW=X7NIQdS z7N>Za*clUSlJeKA!n=#jo?0gVOE$UL|68_dRiF+j3^JC&VB2uq2eTE=>czZ-`Udi5 z0b@ST0H>Rmw<{KAK1xE&WxF*wdz~VKU7{gNAyE_&4HS1=lK9)FqL$mmKl<&! za%{ipRLbljRMym(u4TqOuGbi0b}t1XZYj`)i8NJ@ECkvF(NL4tZ(UoYDZ44aq`e{eB#u{FWL>;hv7yW(drJv819D$*KeDicg- z1*w`t%rMo?Aq6K2duNSIEi00?4#xR%i;%9t8;3m&Sqiq`*}_)Yv6PiV{_f!5)UtBv z?v7i_Mn{5p=qn8Wlmd(<`9#HcU!R5 zX_GVs@V0BjQk(gOQsd;|g;1NdDPTotnbbUifin zxNi~~Yqz#Wp|xC_C45{qEoZ70Ok3I{jiW(-Te@1bx~H_uuGT8p(>NvTCgz&~b`_ZW zZ#~J74PBBeasn4!vWX5Ztend<11l5u)Vw*&W(Kxzv)W_=xo6l%CYg8w?7g7__@AAa z6`)4@bPizl%Qnnh1e2YtYxQ@n9HcIM_>ot`C3qmuJBkC7B)mXvFSRMarErVU%D4@O z=a*yr?c%gr8`6skL&IiQb`WWDjy%$l5=@WyKPC#E0@K52s=i=(T>0CQT0;HaVk#U| zXkNY?=%RlK_G=<0la?1~j?R9A?)A&#S7Z&3O{2Dz{AG9BLcxK#Mz`#4!$q3MEp)qW z{_wHA=*AXXcgx$X!`m|3Eu1xOx7$V=E_`vGu}PjS!J!jy*=A#TILOpIc&Ne=rgCi~ zq+f^AnzM(G&6r_sU$GQ+7*sGluFUOYcx}H8qILP8i2kD7td41IH;H4L!{18anpHOZ z<89gNFpH!?g0dfJuE_Yb&h9y7!|>TyG6@BQb{*LA^D5R$Tjf=`+TzHcGQLv~g_DKeJfOt!sq&C7Ltm2160z zgWK?O-*PrkltZxxn!P}7K_L_>JJ!{#b@Z$yb`{w6I;YGN=~Um~D&|i4(#Rdk|bhp{XnKOrv-Q#3Ge{1ZpagUJuC@vIg z(za~1u_;@_OuEJ-VB@^4Vfo|CDqEk_v^Q^eVz}f~h{Ys{!J7(Zz+5z!*AlYEe5t3p zb8E~1&Y4Sl?ZL(#ThqpoG_;KNY*M?Q$0l>iT!!rOv7x>WOsOAW5;E>JyMAm!Uz_m8 zrXN>*Q4#ZC*UcS~a3kW%!k(J7P+Uaj8vNZ_~On(awWKJPC zHg#^hEy-S0`xv=#K^Z|^-2gfW&zp}`Ox>El3!R2rfw$q>Z8m1Y`U7?#?T4C4B-_n` zP`O^Q1JlHon)LRaad@scXb$*v6c22V-Q9kR9!-ibC}B(3 z*5ke?ZVE1i)5z5aIYi7ezNh(c+)hm_cy_)RKD70n)1SAWbGaOL;C|?EzQ|Ia zErNGv$tgxpST-|JXD_d~&Wt$xePQ-KM|O+ZJJ&vxX)+dN%${G>Uy!D=FGyRGStN9~ z-3Ze&A{)wVbem8=gWF!_3b8xQ#1Wa5EBCCDPVcnq_D-8?T3}Ojm3)>vyr8c{jmc{k zbj-Kz<`oqL&g~yAtuljwrGrK1#hBJw!@_paxHHD1T-0rpyBZ_R(_lk_UTcpi!^|cG zY2A}%4;%Kn5!x75zwJV?O}p#t$)X`L5R_a4x#L99w@Zh!Urga6vIJ{o z;FWZnn=0dU+xfwTZGXqM~*Zk+wE*bDWUa_<)*RO*2iF@6s zp0>M_)gk$^@h}_non}RV<|y-uvR5OcPUY|6u!CT~&L!W~Q*(w^VOxr1Dhw?<7{jq- zRc>%$(f%lcEhn;v(Y8-C)U;rDGoww`6c9W@SoDJ#9rdezizKpVlEID5=ZN7}ui3l8&l*f)%cQ;7(2&gpnP;UX z$TVoXfv2B*q`02OpwlF^FOW88wG$$KS)o%0;XShRlW#fAM0Y63l0s0P-2>`s?_`f7 zQ~8j!kSlBs>0VVB?(gmHDGo1hj&N0OSRrx`H6IaTn}>m?>n=tF{mYD$obTjJU{@s8 z`BR}-=P=kpqZ?H1DcS`47CW+|)s}-(8Ej&;B{T&Dm2C=L!or{R&1Mw_uqVdXU|oZS zG{uO{kh$t$8q63GTXJ)VqzN{``bioA!T3;_A5^i0a+A$I$gV+~x^ZNlrhIPDSciE$ z4wz44Ah4y@9kQlt?y z=7t(aY-$J{@F|jQGP?|DW^rr-$V<+)j;~GAH8u;|sL-LkhbPQhJWbxuJm&tCjy=~xHU#mqnw{_IXFAztGN+(l%8_{yG>!^ExJlJC zZDWgT4w2K(>n|)fBT`p0Zo9MFW^W&pvzxkohl0(q z@{3Z=Tr{5ST^qCh%B&?>!xjo-Zr;uLgu?7(w0U}EAQy@X-UHl9^9wenQ{wXZ(lkTp z`zqn*vxt zcja|043?DC%(j!1{s!+xIvTQZz~oWcJW0Ii%r_SJBYDQP^4)7tBvY~rSMb7I$+u8` zoVBnRjzμq5~k3H_QHPqPu)$lhdg!U>q$>gx@j;&6Ew~!faduV<F(l56pkUW|u=zp?xsH z)MHZuf1ucz!*8*Jpr+`McjLC3v`y70q?-op57s9~Dr!BcnBZJbtlL4po&?g7)|0|D z)_M|znruC(LJiZlNm`ce+NR-J+lGhAb~9*gQ#H-IwN2q#t8J9DQ`U#3X*E4c_8!Kn$+?qQ_YacReA?|1E zLg(z|l^2nyGtBAktqO%nxXD69tfzjSadkBu5G_n3`e49N#UF| zmd%7^b3n_xX4bk!BUu;5`0Va0PV1tC4y{LK$AqDH=bQ!sX2d85&Ovg{C)4yrrcdR7 z2}4ol7nnu*lNfYLy9m>m#|T2Y8V!oK9RxSca0H=^Nsb^WnCA#W{Hcy0KxR9F<1Tks zgX7Q+Gdq@`;klYn@AO06)%!<5#hI7)!+f_sU-UzQRD5OXhb=eX0B{!5`0jbOw?(A0 z9&+FwK{;@bk{tM}!*Up$$3HH)89K&QJ$ds<8RxS*7wwn1_SEKc6nA7??Z#2Te7mcb zEgxRN_oIzI*zLCXxQP*0d9!kBk_0E005hIy4O`UhcFjo=e)!ntoy}^f{rbyoGF#C{ zd92s5fyv6C6oztcX@;8h*)^I_)$Df+c5OIZ;m#b7K5xawC4}y2YZR8bHK^$sYmIcx z+!{)sGQ*hGU}r8{LqnEUqQc`3>fODzkEPCF@q(4)b$sB(7^R0f$`@6*5@X}-qZgmhu?V^EZ&MF#e#>CN3&KC^~Lg7FFYE37Z5t6>PTN>h9&=v>zsZd1vB#~` z5B8C@{nC9|(eDCGziJ9-+2*;c{6IY8;^1=*qvx3~KI~7&o1@n0xKLE+x70(S@{{J$ zEYf-uG^aBXSksa30zQM#tm-TL+iGp5o+73B&`MG z|MN@eE;v`RcY!U$JU48RVJg8qy8N7aN%7k@%>ib)J`^t##k2cz>`CTVcgPZPkL*v0 zn|EI{%7)synIAlmY8Yk0=<8f>-Ue7tno)a=e1dQ&ptZ~mNwS>JX&q2b|%qs(~PHZWUTN62j|EymI> zEOa<8U+!AumNr76yct7Bf%R#6H-{2XNXX9mFPV}u`^t%PB{vh9%8tR6^tp<~ku{*O`E1`Q5!@)H$}m#9B;?@BT` zo4>`7Ti*0BMoIPgzn8$-=I{Fgjx3tHmP8Fa5Y26+`iC}xnA3){9o6Q$A|ZI5Mq65UVM$I3paeC zLT00H$-EhyIE3fGDO0Xp)hW3@CsAtMOoZifZDECZCj}vabqS)HL+GzI#$TYc2j;f&Cd0dsBl06BBxZ z8z~}zv~(m46K=kNG;hOF>qaZnnaxnPgo77+L@GTzbZjah`|BcGuv}_3KTCpeId(%; zq$e3m&KYeloz0*6=;OdNrS*3FfWWFXh4xDF_AlIyd5f+l=)8gaQq0iK=BcYRmN$}nIO{(?F+T)+ z+xaeu1*M^)8zlyYr?C{#S) zeVEluuG4LZq#A6{mau{_?HBs{4|EO82U&P&xW7vfg!sQC9R#?yK8K9KB$sR(430y4 zSQ=r$/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 }^x=S?k%OR>PTJK*RY2&X&sfV{u#Ox)^M< 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 Get-InfisicalSecret - Retrieves a single Infisical secret by name from the active session's project and environment. + Lists or retrieves Infisical secrets within a project, environment, and optional folder path. Get InfisicalSecret - Fetches a single secret by name. Project, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection but can be overridden per call. Optional flags request reference-expansion, import inclusion, or a specific historical version. + Default (List parameter set) enumerates secrets under the active session's project and environment, optionally recursing through subfolders and filtering by metadata or tag slugs. When -SecretName is supplied (Single parameter set) the cmdlet returns one secret by name; -Version and -Type tune the single-record fetch. ProjectId, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection in both modes. Notes - The returned InfisicalSecret stores the value as SecureString; call .GetPlainTextValue() to materialize the cleartext value only when strictly required. + Use -Recursive together with -SecretPath to walk an entire folder subtree in List mode. Pipe the result into ConvertTo-InfisicalSecretDictionary for hashtable-style lookup. The returned InfisicalSecret stores the value as SecureString; call .GetPlainTextValue() to materialize the cleartext value only when strictly required. EXAMPLE 1 - Get-InfisicalSecret -SecretName 'DATABASE_URL' - Retrieves the DATABASE_URL secret from the project and environment pinned by Connect-Infisical. - - - EXAMPLE 2 - $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalSecretParameters.SecretName = 'DATABASE_URL' -$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment -$GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" -$GetInfisicalSecretParameters.ExpandSecretReferences = $True -$GetInfisicalSecretParameters.IncludeImports = $True -$GetInfisicalSecretParameters.Verbose = $True - -$GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters - Retrieves a single secret from a script-specific subpath with secret-reference expansion and folder imports enabled. - - - - - - - Get-InfisicalSecrets - Lists Infisical secrets within a project, environment, and optional folder path. - Get - InfisicalSecrets - - - Enumerates secrets under the active session's project and environment, optionally recursing through subfolders. Supports metadata-based filtering, tag-slug filtering, secret-reference expansion, and personal-override inclusion. - - - Notes - - Use -Recursive together with -SecretPath to walk an entire folder subtree. Pipe the result into ConvertTo-InfisicalSecretDictionary for hashtable-style lookup. - - - - - EXAMPLE 1 - Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + Get-InfisicalSecret -SecretPath '/Windows' -Recursive Lists every secret under /Windows in the active project and environment. EXAMPLE 2 - $GetInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalSecretsParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalSecretsParameters.Environment = $ConnectInfisicalParameters.Environment -$GetInfisicalSecretsParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" -$GetInfisicalSecretsParameters.Recursive = $True -$GetInfisicalSecretsParameters.ExpandSecretReferences = $True -$GetInfisicalSecretsParameters.IncludeImports = $True -$GetInfisicalSecretsParameters.IncludePersonalOverrides = $True -$GetInfisicalSecretsParameters.Verbose = $True + Get-InfisicalSecret -SecretName 'DATABASE_URL' + Retrieves the DATABASE_URL secret from the project and environment pinned by Connect-Infisical. + + + EXAMPLE 3 + $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalSecretParameters.Recursive = $True +$GetInfisicalSecretParameters.ExpandSecretReferences = $True +$GetInfisicalSecretParameters.IncludeImports = $True +$GetInfisicalSecretParameters.IncludePersonalOverrides = $True +$GetInfisicalSecretParameters.Verbose = $True -$GetInfisicalSecretsResult = Get-InfisicalSecrets @GetInfisicalSecretsParameters +$GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters Lists secrets under a script-specific subpath with imports, personal overrides, and reference expansion enabled. @@ -181,7 +147,7 @@ $GetInfisicalSecretsResult = Get-InfisicalSecrets @GetInfisicalSecretsParameters EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags -ProjectId $ConnectInfisicalParameters.ProjectId + $GetInfisicalTagResult = Get-InfisicalTag -ProjectId $ConnectInfisicalParameters.ProjectId $NewInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $NewInfisicalSecretParameters.SecretName = 'API_KEY' @@ -190,7 +156,7 @@ $NewInfisicalSecretParameters.SecretComment = 'Issued by deployment pipeline' $NewInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $NewInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment $NewInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" -$NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagsResult[0].Id) +$NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagResult[0].Id) $NewInfisicalSecretParameters.Verbose = $True $NewInfisicalSecretResult = New-InfisicalSecret @NewInfisicalSecretParameters @@ -286,7 +252,7 @@ $RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretPara InfisicalSecret - Server-side duplicates an array of secret IDs into a destination environment (and optional destination path), with switches that control whether the value, comment, tags, and metadata are copied. Use Get-InfisicalSecrets followed by selection of the desired Id values to feed -SecretId. + Server-side duplicates an array of secret IDs into a destination environment (and optional destination path), with switches that control whether the value, comment, tags, and metadata are copied. Use Get-InfisicalSecret followed by selection of the desired Id values to feed -SecretId. Notes @@ -297,15 +263,15 @@ $RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretPara EXAMPLE 1 - Get-InfisicalSecrets | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue + Get-InfisicalSecret | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue Copies all secrets from the active environment into 'staging', including their values. EXAMPLE 2 - $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath '/Windows' -Recursive $CopyInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretsResult.Id +$CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretResult.Id $CopyInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $CopyInfisicalSecretParameters.SourceEnvironment = $ConnectInfisicalParameters.Environment $CopyInfisicalSecretParameters.SourceSecretPath = '/Windows' @@ -343,15 +309,15 @@ $CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters EXAMPLE 1 - Get-InfisicalSecrets | ConvertTo-InfisicalSecretDictionary -AsPlainText + Get-InfisicalSecret | ConvertTo-InfisicalSecretDictionary -AsPlainText Builds a plain-text dictionary of every secret in the active environment. EXAMPLE 2 - $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ConvertToInfisicalSecretDictionaryParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretsResult +$ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretResult $ConvertToInfisicalSecretDictionaryParameters.DuplicateKeyBehavior = 'LastWins' $ConvertToInfisicalSecretDictionaryParameters.AsPlainText = $True $ConvertToInfisicalSecretDictionaryParameters.Verbose = $True @@ -381,15 +347,15 @@ $ConvertToInfisicalSecretDictionaryResult = ConvertTo-InfisicalSecretDictionary EXAMPLE 1 - Get-InfisicalSecrets | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force + Get-InfisicalSecret | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force Writes the active environment's secrets to a .env file. EXAMPLE 2 - $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ExportInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretsResult +$ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretResult $ExportInfisicalSecretsParameters.Format = 'EnvironmentVariables' $ExportInfisicalSecretsParameters.Scope = 'Process' $ExportInfisicalSecretsParameters.Force = $True @@ -401,71 +367,43 @@ $ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsP - - - Get-InfisicalProjects - Lists Infisical projects accessible to the current identity. - Get - InfisicalProjects - - - Returns every project the active session can see. The cmdlet requires an active InfisicalConnection but takes no parameters; project visibility is governed by Infisical's role assignments. - - - Notes - - The result is an array of InfisicalProject objects; pipe into Where-Object or Select-Object to filter by Slug, Name, or Id. - - - - - EXAMPLE 1 - Get-InfisicalProjects - Lists every project the current session can see. - - - EXAMPLE 2 - $GetInfisicalProjectsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalProjectsParameters.Verbose = $True - -$GetInfisicalProjectsResult = Get-InfisicalProjects @GetInfisicalProjectsParameters | Where-Object { $_.Slug -ilike 'platform-*' } - Lists projects and filters down to those whose slug begins with 'platform-'. - - - - Get-InfisicalProject - Retrieves a single Infisical project by its identifier. + Lists or retrieves Infisical projects accessible to the current identity. Get InfisicalProject - Retrieves one project by Id. If -ProjectId is not supplied, the cmdlet falls back to the ProjectId pinned on the active InfisicalConnection. + Default (List parameter set) returns every project the active session can see; project visibility is governed by Infisical's role assignments. When -ProjectId is supplied (Single parameter set) the cmdlet returns the one matching record. Notes - The cmdlet accepts pipeline input by property name; objects emitted by Get-InfisicalProjects can be piped in directly to refresh a single record. + The List-mode result is an array of InfisicalProject objects; pipe into Where-Object or Select-Object to filter by Slug, Name, or Id. The cmdlet accepts pipeline input by property name on -ProjectId. EXAMPLE 1 Get-InfisicalProject - Retrieves the project pinned by the active session. + Lists every project the current session can see. EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects + Get-InfisicalProject -ProjectId $ConnectInfisicalParameters.ProjectId + Retrieves the canonical record for the project pinned by the active session. + + + EXAMPLE 3 + $GetInfisicalProjectListResult = Get-InfisicalProject | Where-Object { $_.Slug -ilike 'platform-*' } $GetInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult[0].Id +$GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectListResult[0].Id $GetInfisicalProjectParameters.Verbose = $True $GetInfisicalProjectResult = Get-InfisicalProject @GetInfisicalProjectParameters - Looks up the first project in the list and retrieves its full record. + Filters the project list to slugs that begin with 'platform-' and refetches the first match by id. @@ -532,10 +470,10 @@ $NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $UpdateInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$UpdateInfisicalProjectParameters.ProjectId = $GetInfisicalProjectResult.Id $UpdateInfisicalProjectParameters.Name = 'Platform Telemetry (v2)' $UpdateInfisicalProjectParameters.Description = 'Migrated to v2 pipeline' $UpdateInfisicalProjectParameters.AutoCapitalization = $False @@ -571,10 +509,10 @@ $UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectP EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'sandbox-temp' } + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'sandbox-temp' } $RemoveInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$RemoveInfisicalProjectParameters.ProjectId = $GetInfisicalProjectResult.Id $RemoveInfisicalProjectParameters.PassThru = $True $RemoveInfisicalProjectParameters.Confirm = $False $RemoveInfisicalProjectParameters.Verbose = $True @@ -585,75 +523,44 @@ $RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectP - - - Get-InfisicalEnvironments - Lists environments defined on an Infisical project. - Get - InfisicalEnvironments - - - Returns all environments configured on a project. -ProjectId defaults to the session-pinned project id when omitted. - - - Notes - - Each InfisicalEnvironment carries both Id and Slug; downstream cmdlets accept either form on -Environment-like parameters. - - - - - EXAMPLE 1 - Get-InfisicalEnvironments - Lists environments for the session-pinned project. - - - EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } - -$GetInfisicalEnvironmentsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalEnvironmentsParameters.ProjectId = $GetInfisicalProjectsResult.Id -$GetInfisicalEnvironmentsParameters.Verbose = $True - -$GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments @GetInfisicalEnvironmentsParameters - Resolves a project by slug and lists every environment defined on it. - - - - Get-InfisicalEnvironment - Retrieves a single Infisical environment by slug or id. + Lists or retrieves Infisical environments defined on a project. Get InfisicalEnvironment - Returns one environment record by slug or id (-EnvironmentSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + Default (List parameter set) returns every environment configured on the session-pinned project. When -EnvironmentSlugOrId is supplied (Single parameter set) the cmdlet returns one environment by slug or id. -ProjectId defaults to the session-pinned project in both modes. Notes - Accepts pipeline input by property name so InfisicalEnvironment objects from Get-InfisicalEnvironments can be refreshed directly. + Each InfisicalEnvironment carries both Id and Slug; downstream cmdlets accept either form on -Environment-like parameters. Accepts pipeline input by property name on -EnvironmentSlugOrId. EXAMPLE 1 + Get-InfisicalEnvironment + Lists every environment defined on the session-pinned project. + + + EXAMPLE 2 Get-InfisicalEnvironment -EnvironmentSlugOrId 'dev' Retrieves the 'dev' environment from the session-pinned project. - EXAMPLE 2 - $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'dev' } + EXAMPLE 3 + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $GetInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalEnvironmentParameters.EnvironmentSlugOrId = $GetInfisicalEnvironmentsResult.Slug -$GetInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalEnvironmentParameters.EnvironmentSlugOrId = 'dev' +$GetInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectResult.Id $GetInfisicalEnvironmentParameters.Verbose = $True $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironmentParameters - Looks up the dev environment by slug and re-fetches the canonical record by slug or id. + Resolves a project by slug and re-fetches the dev environment record by slug under that project. @@ -682,10 +589,10 @@ $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironme EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $NewInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$NewInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectsResult.Id +$NewInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectResult.Id $NewInfisicalEnvironmentParameters.Name = 'Staging' $NewInfisicalEnvironmentParameters.Slug = 'staging' $NewInfisicalEnvironmentParameters.Position = 20 @@ -721,10 +628,10 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme EXAMPLE 2 - $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'staging' } + $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment | Where-Object { $_.Slug -eq 'staging' } $UpdateInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id $UpdateInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $UpdateInfisicalEnvironmentParameters.Name = 'Pre-Production' $UpdateInfisicalEnvironmentParameters.Slug = 'preprod' @@ -761,10 +668,10 @@ $UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisical EXAMPLE 2 - $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'sandbox' } + $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment | Where-Object { $_.Slug -eq 'sandbox' } $RemoveInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id $RemoveInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $RemoveInfisicalEnvironmentParameters.PassThru = $True $RemoveInfisicalEnvironmentParameters.Confirm = $False @@ -776,70 +683,39 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical - - - Get-InfisicalFolders - Lists Infisical folders at a given secret path. - Get - InfisicalFolders - - - Enumerates folders directly under the supplied -Path within the active project and environment. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. - - - Notes - - This is a non-recursive listing of immediate subfolders. To enumerate secrets across a folder subtree use Get-InfisicalSecrets -Recursive. - - - - - EXAMPLE 1 - Get-InfisicalFolders -Path '/Windows' - Lists every folder directly under /Windows in the active project and environment. - - - EXAMPLE 2 - $GetInfisicalFoldersParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalFoldersParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalFoldersParameters.Environment = $ConnectInfisicalParameters.Environment -$GetInfisicalFoldersParameters.Path = "/Windows/$($CallingScriptPath.BaseName)" -$GetInfisicalFoldersParameters.Verbose = $True - -$GetInfisicalFoldersResult = Get-InfisicalFolders @GetInfisicalFoldersParameters - Lists folders under a script-specific subpath using the session-pinned project and environment. - - - - Get-InfisicalFolder - Retrieves a single Infisical folder by name or id. + Lists or retrieves Infisical folders at a given secret path. Get InfisicalFolder - Returns one folder record by name or id (-FolderNameOrId) under the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. + Default (List parameter set) enumerates folders directly under the supplied -Path within the active project and environment. When -FolderNameOrId is supplied (Single parameter set) the cmdlet returns one folder by name or id under -Path. -ProjectId, -Environment, and -Path default to the session-pinned values in both modes. Notes - Accepts pipeline input by property name so InfisicalFolder objects from Get-InfisicalFolders can be refreshed directly. + List mode is a non-recursive listing of immediate subfolders. To enumerate secrets across a folder subtree use Get-InfisicalSecret -Recursive. Accepts pipeline input by property name on -FolderNameOrId. EXAMPLE 1 + Get-InfisicalFolder -Path '/Windows' + Lists every folder directly under /Windows in the active project and environment. + + + EXAMPLE 2 Get-InfisicalFolder -FolderNameOrId 'Deployments' -Path '/Windows' Retrieves the Deployments folder under /Windows in the active project and environment. - EXAMPLE 2 - $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + EXAMPLE 3 + $GetInfisicalFolderListResult = Get-InfisicalFolder -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } $GetInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFoldersResult.Id +$GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFolderListResult.Id $GetInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $GetInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment $GetInfisicalFolderParameters.Path = '/Windows' @@ -912,10 +788,10 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters EXAMPLE 2 - $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + $GetInfisicalFolderResult = Get-InfisicalFolder -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } $UpdateInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$UpdateInfisicalFolderParameters.FolderId = $GetInfisicalFolderResult.Id $UpdateInfisicalFolderParameters.Name = 'Deployments-Archive' $UpdateInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $UpdateInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment @@ -952,10 +828,10 @@ $UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderPara EXAMPLE 2 - $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq $CallingScriptPath.BaseName } + $GetInfisicalFolderResult = Get-InfisicalFolder -Path '/Windows' | Where-Object { $_.Name -eq $CallingScriptPath.BaseName } $RemoveInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFolderResult.Id $RemoveInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $RemoveInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment $RemoveInfisicalFolderParameters.Path = '/Windows' @@ -969,75 +845,44 @@ $RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderPara - - - Get-InfisicalTags - Lists Infisical tags defined on a project. - Get - InfisicalTags - - - Returns every tag configured on a project. -ProjectId defaults to the session-pinned project id when omitted. - - - Notes - - Tag Ids returned here are the values to pass on -TagIds when creating or updating secrets. - - - - - EXAMPLE 1 - Get-InfisicalTags - Lists every tag defined on the session-pinned project. - - - EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } - -$GetInfisicalTagsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalTagsParameters.ProjectId = $GetInfisicalProjectsResult.Id -$GetInfisicalTagsParameters.Verbose = $True - -$GetInfisicalTagsResult = Get-InfisicalTags @GetInfisicalTagsParameters - Resolves a project by slug and lists every tag defined on it. - - - - Get-InfisicalTag - Retrieves a single Infisical tag by slug or id. + Lists or retrieves Infisical tags defined on a project. Get InfisicalTag - Returns one tag record by slug or id (-TagSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + Default (List parameter set) returns every tag configured on the project. When -TagSlugOrId is supplied (Single parameter set) the cmdlet returns the one matching record. -ProjectId defaults to the session-pinned project in both modes. Notes - Accepts pipeline input by property name so InfisicalTag objects from Get-InfisicalTags can be refreshed directly. + Tag Ids returned here are the values to pass on -TagIds when creating or updating secrets. Accepts pipeline input by property name on -TagSlugOrId. EXAMPLE 1 + Get-InfisicalTag + Lists every tag defined on the session-pinned project. + + + EXAMPLE 2 Get-InfisicalTag -TagSlugOrId 'critical' Retrieves the 'critical' tag from the session-pinned project. - EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + EXAMPLE 3 + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $GetInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalTagParameters.TagSlugOrId = $GetInfisicalTagsResult.Slug -$GetInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalTagParameters.TagSlugOrId = 'critical' +$GetInfisicalTagParameters.ProjectId = $GetInfisicalProjectResult.Id $GetInfisicalTagParameters.Verbose = $True $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters - Filters tags to the critical slug and refetches the canonical record. + Resolves a project by slug and refetches the 'critical' tag from that project. @@ -1103,10 +948,10 @@ $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + $GetInfisicalTagResult = Get-InfisicalTag | Where-Object { $_.Slug -eq 'critical' } $UpdateInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$UpdateInfisicalTagParameters.TagId = $GetInfisicalTagResult.Id $UpdateInfisicalTagParameters.Slug = 'critical-v2' $UpdateInfisicalTagParameters.Name = 'Critical (v2)' $UpdateInfisicalTagParameters.Color = '#FFA500' @@ -1143,10 +988,10 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical-v2' } + $GetInfisicalTagResult = Get-InfisicalTag | Where-Object { $_.Slug -eq 'critical-v2' } $RemoveInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$RemoveInfisicalTagParameters.TagId = $GetInfisicalTagResult.Id $RemoveInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $RemoveInfisicalTagParameters.PassThru = $True $RemoveInfisicalTagParameters.Confirm = $False @@ -1197,40 +1042,45 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get - Get-InfisicalCertificates - Lists Infisical certificates in a project, with optional filters and automatic paging. + Get-InfisicalCertificate + Lists or retrieves Infisical certificates in a project, with optional filters and automatic paging. Get - InfisicalCertificates + InfisicalCertificate - Enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId. -Limit and -Offset drive a single page; pages are walked automatically until exhausted unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + Default (List parameter set) enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId; -Limit and -Offset drive a single page and pages are walked automatically until exhausted unless -NoAutoPage is supplied. When -SerialNumber is supplied (Single parameter set) the cmdlet returns one certificate record. -ProjectId defaults to the session-pinned project in both modes. Notes - For advanced filtering (validity window, key algorithm, extended key usage, etc.) use Search-InfisicalCertificate instead. + For advanced filtering (validity window, key algorithm, extended key usage, etc.) use Search-InfisicalCertificate instead. Single mode returns metadata only; to obtain certificate and chain PEM material use ConvertTo-InfisicalCertificate or Export-InfisicalCertificate. Accepts pipeline input by property name on -SerialNumber. EXAMPLE 1 - Get-InfisicalCertificates -Status 'active' + Get-InfisicalCertificate -Status 'active' Lists every active certificate in the session-pinned project. EXAMPLE 2 + Get-InfisicalCertificate -SerialNumber '7A:F2:1B:...:9E' + Retrieves the certificate record for the supplied serial number. + + + EXAMPLE 3 $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } -$GetInfisicalCertificatesParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalCertificatesParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalCertificatesParameters.CommonName = $env:COMPUTERNAME -$GetInfisicalCertificatesParameters.FriendlyName = 'web-tier' -$GetInfisicalCertificatesParameters.Status = 'active' -$GetInfisicalCertificatesParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) -$GetInfisicalCertificatesParameters.Limit = 100 -$GetInfisicalCertificatesParameters.Verbose = $True +$GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME +$GetInfisicalCertificateParameters.FriendlyName = 'web-tier' +$GetInfisicalCertificateParameters.Status = 'active' +$GetInfisicalCertificateParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) +$GetInfisicalCertificateParameters.Limit = 100 +$GetInfisicalCertificateParameters.Verbose = $True -$GetInfisicalCertificatesResult = Get-InfisicalCertificates @GetInfisicalCertificatesParameters +$GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCertificateParameters Resolves the issuing CA, then lists active certificates scoped to that CA, the local hostname, and the 'web-tier' friendly name. @@ -1238,36 +1088,42 @@ $GetInfisicalCertificatesResult = Get-InfisicalCertificates @GetInfisicalCertifi - Get-InfisicalCertificate - Retrieves a single Infisical certificate by serial number. + Get-InfisicalPkiSubscriber + Lists or retrieves Infisical PKI subscribers in a project. Get - InfisicalCertificate + InfisicalPkiSubscriber - Returns one certificate record by -SerialNumber. Accepts pipeline input by property name so InfisicalCertificate objects from list/search cmdlets can be re-fetched directly. + Default (List parameter set) returns every PKI subscriber configured on the project. When -Name is supplied (ByName parameter set) the cmdlet returns one subscriber by its slug. -ProjectId defaults to the session-pinned project in both modes. Notes - This returns metadata only. To obtain certificate and chain PEM material use ConvertTo-InfisicalCertificate or Export-InfisicalCertificate. + The -Name parameter is the subscriber slug; aliases SubscriberName and Slug are accepted. Pass the slug returned here on -PkiSubscriberSlug when calling Request-InfisicalCertificate. Accepts pipeline input by property name on -Name. EXAMPLE 1 - Get-InfisicalCertificate -SerialNumber '7A:F2:1B:...:9E' - Retrieves the certificate record for the supplied serial number. + Get-InfisicalPkiSubscriber + Lists every PKI subscriber defined on the session-pinned project. EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + Get-InfisicalPkiSubscriber -Name 'mecm' + Retrieves the 'mecm' PKI subscriber from the session-pinned project. + + + EXAMPLE 3 + $GetInfisicalPkiSubscriberListResult = Get-InfisicalPkiSubscriber | Where-Object { $_.Name -ilike 'mecm*' } -$GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber -$GetInfisicalCertificateParameters.Verbose = $True +$GetInfisicalPkiSubscriberParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalPkiSubscriberParameters.Name = $GetInfisicalPkiSubscriberListResult[0].Name +$GetInfisicalPkiSubscriberParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalPkiSubscriberParameters.Verbose = $True -$GetInfisicalCertificateResult = Get-InfisicalCertificate @GetInfisicalCertificateParameters - Selects the active certificate whose common name matches the host and refetches its canonical record. +$GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSubscriberParameters + Filters subscribers whose name starts with 'mecm' and refetches the canonical record for the first match. @@ -1388,10 +1244,10 @@ $RequestInfisicalCertificateResult = Request-InfisicalCertificate @RequestInfisi EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $ConvertToInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ConvertToInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ConvertToInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificateResult[0].SerialNumber $ConvertToInfisicalCertificateParameters.NoPrivateKey = $False $ConvertToInfisicalCertificateParameters.IncludeChain = $True $ConvertToInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable @@ -1427,10 +1283,10 @@ $ConvertToInfisicalCertificateResult = ConvertTo-InfisicalCertificate @ConvertTo EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $ExportInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ExportInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ExportInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificateResult[0].SerialNumber $ExportInfisicalCertificateParameters.Path = "C:\Temp\$($env:COMPUTERNAME).pfx" $ExportInfisicalCertificateParameters.Format = 'Pfx' $ExportInfisicalCertificateParameters.Password = (Read-Host -AsSecureString -Prompt 'PFX password') @@ -1468,10 +1324,10 @@ $ExportInfisicalCertificateResult = Export-InfisicalCertificate @ExportInfisical EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $InstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$InstallInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$InstallInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificateResult[0].SerialNumber $InstallInfisicalCertificateParameters.StoreName = 'My' $InstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' $InstallInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet -bor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet @@ -1510,10 +1366,10 @@ $InstallInfisicalCertificateResult = Install-InfisicalCertificate @InstallInfisi EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'revoked' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'revoked' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $UninstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UninstallInfisicalCertificateParameters.InfisicalCertificate = $GetInfisicalCertificatesResult[0] +$UninstallInfisicalCertificateParameters.InfisicalCertificate = $GetInfisicalCertificateResult[0] $UninstallInfisicalCertificateParameters.StoreName = 'My' $UninstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' $UninstallInfisicalCertificateParameters.Force = $True diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index dc9fb90..8540047 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -81,77 +81,43 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters Get-InfisicalSecret - Retrieves a single Infisical secret by name from the active session's project and environment. + Lists or retrieves Infisical secrets within a project, environment, and optional folder path. Get InfisicalSecret - Fetches a single secret by name. Project, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection but can be overridden per call. Optional flags request reference-expansion, import inclusion, or a specific historical version. + Default (List parameter set) enumerates secrets under the active session's project and environment, optionally recursing through subfolders and filtering by metadata or tag slugs. When -SecretName is supplied (Single parameter set) the cmdlet returns one secret by name; -Version and -Type tune the single-record fetch. ProjectId, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection in both modes. Notes - The returned InfisicalSecret stores the value as SecureString; call .GetPlainTextValue() to materialize the cleartext value only when strictly required. + Use -Recursive together with -SecretPath to walk an entire folder subtree in List mode. Pipe the result into ConvertTo-InfisicalSecretDictionary for hashtable-style lookup. The returned InfisicalSecret stores the value as SecureString; call .GetPlainTextValue() to materialize the cleartext value only when strictly required. EXAMPLE 1 - Get-InfisicalSecret -SecretName 'DATABASE_URL' - Retrieves the DATABASE_URL secret from the project and environment pinned by Connect-Infisical. - - - EXAMPLE 2 - $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalSecretParameters.SecretName = 'DATABASE_URL' -$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment -$GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" -$GetInfisicalSecretParameters.ExpandSecretReferences = $True -$GetInfisicalSecretParameters.IncludeImports = $True -$GetInfisicalSecretParameters.Verbose = $True - -$GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters - Retrieves a single secret from a script-specific subpath with secret-reference expansion and folder imports enabled. - - - - - - - Get-InfisicalSecrets - Lists Infisical secrets within a project, environment, and optional folder path. - Get - InfisicalSecrets - - - Enumerates secrets under the active session's project and environment, optionally recursing through subfolders. Supports metadata-based filtering, tag-slug filtering, secret-reference expansion, and personal-override inclusion. - - - Notes - - Use -Recursive together with -SecretPath to walk an entire folder subtree. Pipe the result into ConvertTo-InfisicalSecretDictionary for hashtable-style lookup. - - - - - EXAMPLE 1 - Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + Get-InfisicalSecret -SecretPath '/Windows' -Recursive Lists every secret under /Windows in the active project and environment. EXAMPLE 2 - $GetInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalSecretsParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalSecretsParameters.Environment = $ConnectInfisicalParameters.Environment -$GetInfisicalSecretsParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" -$GetInfisicalSecretsParameters.Recursive = $True -$GetInfisicalSecretsParameters.ExpandSecretReferences = $True -$GetInfisicalSecretsParameters.IncludeImports = $True -$GetInfisicalSecretsParameters.IncludePersonalOverrides = $True -$GetInfisicalSecretsParameters.Verbose = $True + Get-InfisicalSecret -SecretName 'DATABASE_URL' + Retrieves the DATABASE_URL secret from the project and environment pinned by Connect-Infisical. + + + EXAMPLE 3 + $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" +$GetInfisicalSecretParameters.Recursive = $True +$GetInfisicalSecretParameters.ExpandSecretReferences = $True +$GetInfisicalSecretParameters.IncludeImports = $True +$GetInfisicalSecretParameters.IncludePersonalOverrides = $True +$GetInfisicalSecretParameters.Verbose = $True -$GetInfisicalSecretsResult = Get-InfisicalSecrets @GetInfisicalSecretsParameters +$GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters Lists secrets under a script-specific subpath with imports, personal overrides, and reference expansion enabled. @@ -181,7 +147,7 @@ $GetInfisicalSecretsResult = Get-InfisicalSecrets @GetInfisicalSecretsParameters EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags -ProjectId $ConnectInfisicalParameters.ProjectId + $GetInfisicalTagResult = Get-InfisicalTag -ProjectId $ConnectInfisicalParameters.ProjectId $NewInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $NewInfisicalSecretParameters.SecretName = 'API_KEY' @@ -190,7 +156,7 @@ $NewInfisicalSecretParameters.SecretComment = 'Issued by deployment pipeline' $NewInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $NewInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment $NewInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" -$NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagsResult[0].Id) +$NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagResult[0].Id) $NewInfisicalSecretParameters.Verbose = $True $NewInfisicalSecretResult = New-InfisicalSecret @NewInfisicalSecretParameters @@ -286,7 +252,7 @@ $RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretPara InfisicalSecret - Server-side duplicates an array of secret IDs into a destination environment (and optional destination path), with switches that control whether the value, comment, tags, and metadata are copied. Use Get-InfisicalSecrets followed by selection of the desired Id values to feed -SecretId. + Server-side duplicates an array of secret IDs into a destination environment (and optional destination path), with switches that control whether the value, comment, tags, and metadata are copied. Use Get-InfisicalSecret followed by selection of the desired Id values to feed -SecretId. Notes @@ -297,15 +263,15 @@ $RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretPara EXAMPLE 1 - Get-InfisicalSecrets | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue + Get-InfisicalSecret | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue Copies all secrets from the active environment into 'staging', including their values. EXAMPLE 2 - $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath '/Windows' -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath '/Windows' -Recursive $CopyInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretsResult.Id +$CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretResult.Id $CopyInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $CopyInfisicalSecretParameters.SourceEnvironment = $ConnectInfisicalParameters.Environment $CopyInfisicalSecretParameters.SourceSecretPath = '/Windows' @@ -343,15 +309,15 @@ $CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters EXAMPLE 1 - Get-InfisicalSecrets | ConvertTo-InfisicalSecretDictionary -AsPlainText + Get-InfisicalSecret | ConvertTo-InfisicalSecretDictionary -AsPlainText Builds a plain-text dictionary of every secret in the active environment. EXAMPLE 2 - $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ConvertToInfisicalSecretDictionaryParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretsResult +$ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretResult $ConvertToInfisicalSecretDictionaryParameters.DuplicateKeyBehavior = 'LastWins' $ConvertToInfisicalSecretDictionaryParameters.AsPlainText = $True $ConvertToInfisicalSecretDictionaryParameters.Verbose = $True @@ -381,15 +347,15 @@ $ConvertToInfisicalSecretDictionaryResult = ConvertTo-InfisicalSecretDictionary EXAMPLE 1 - Get-InfisicalSecrets | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force + Get-InfisicalSecret | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force Writes the active environment's secrets to a .env file. EXAMPLE 2 - $GetInfisicalSecretsResult = Get-InfisicalSecrets -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ExportInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretsResult +$ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretResult $ExportInfisicalSecretsParameters.Format = 'EnvironmentVariables' $ExportInfisicalSecretsParameters.Scope = 'Process' $ExportInfisicalSecretsParameters.Force = $True @@ -401,71 +367,43 @@ $ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsP - - - Get-InfisicalProjects - Lists Infisical projects accessible to the current identity. - Get - InfisicalProjects - - - Returns every project the active session can see. The cmdlet requires an active InfisicalConnection but takes no parameters; project visibility is governed by Infisical's role assignments. - - - Notes - - The result is an array of InfisicalProject objects; pipe into Where-Object or Select-Object to filter by Slug, Name, or Id. - - - - - EXAMPLE 1 - Get-InfisicalProjects - Lists every project the current session can see. - - - EXAMPLE 2 - $GetInfisicalProjectsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalProjectsParameters.Verbose = $True - -$GetInfisicalProjectsResult = Get-InfisicalProjects @GetInfisicalProjectsParameters | Where-Object { $_.Slug -ilike 'platform-*' } - Lists projects and filters down to those whose slug begins with 'platform-'. - - - - Get-InfisicalProject - Retrieves a single Infisical project by its identifier. + Lists or retrieves Infisical projects accessible to the current identity. Get InfisicalProject - Retrieves one project by Id. If -ProjectId is not supplied, the cmdlet falls back to the ProjectId pinned on the active InfisicalConnection. + Default (List parameter set) returns every project the active session can see; project visibility is governed by Infisical's role assignments. When -ProjectId is supplied (Single parameter set) the cmdlet returns the one matching record. Notes - The cmdlet accepts pipeline input by property name; objects emitted by Get-InfisicalProjects can be piped in directly to refresh a single record. + The List-mode result is an array of InfisicalProject objects; pipe into Where-Object or Select-Object to filter by Slug, Name, or Id. The cmdlet accepts pipeline input by property name on -ProjectId. EXAMPLE 1 Get-InfisicalProject - Retrieves the project pinned by the active session. + Lists every project the current session can see. EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects + Get-InfisicalProject -ProjectId $ConnectInfisicalParameters.ProjectId + Retrieves the canonical record for the project pinned by the active session. + + + EXAMPLE 3 + $GetInfisicalProjectListResult = Get-InfisicalProject | Where-Object { $_.Slug -ilike 'platform-*' } $GetInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult[0].Id +$GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectListResult[0].Id $GetInfisicalProjectParameters.Verbose = $True $GetInfisicalProjectResult = Get-InfisicalProject @GetInfisicalProjectParameters - Looks up the first project in the list and retrieves its full record. + Filters the project list to slugs that begin with 'platform-' and refetches the first match by id. @@ -532,10 +470,10 @@ $NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $UpdateInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$UpdateInfisicalProjectParameters.ProjectId = $GetInfisicalProjectResult.Id $UpdateInfisicalProjectParameters.Name = 'Platform Telemetry (v2)' $UpdateInfisicalProjectParameters.Description = 'Migrated to v2 pipeline' $UpdateInfisicalProjectParameters.AutoCapitalization = $False @@ -571,10 +509,10 @@ $UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectP EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'sandbox-temp' } + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'sandbox-temp' } $RemoveInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalProjectParameters.ProjectId = $GetInfisicalProjectsResult.Id +$RemoveInfisicalProjectParameters.ProjectId = $GetInfisicalProjectResult.Id $RemoveInfisicalProjectParameters.PassThru = $True $RemoveInfisicalProjectParameters.Confirm = $False $RemoveInfisicalProjectParameters.Verbose = $True @@ -585,75 +523,44 @@ $RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectP - - - Get-InfisicalEnvironments - Lists environments defined on an Infisical project. - Get - InfisicalEnvironments - - - Returns all environments configured on a project. -ProjectId defaults to the session-pinned project id when omitted. - - - Notes - - Each InfisicalEnvironment carries both Id and Slug; downstream cmdlets accept either form on -Environment-like parameters. - - - - - EXAMPLE 1 - Get-InfisicalEnvironments - Lists environments for the session-pinned project. - - - EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } - -$GetInfisicalEnvironmentsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalEnvironmentsParameters.ProjectId = $GetInfisicalProjectsResult.Id -$GetInfisicalEnvironmentsParameters.Verbose = $True - -$GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments @GetInfisicalEnvironmentsParameters - Resolves a project by slug and lists every environment defined on it. - - - - Get-InfisicalEnvironment - Retrieves a single Infisical environment by slug or id. + Lists or retrieves Infisical environments defined on a project. Get InfisicalEnvironment - Returns one environment record by slug or id (-EnvironmentSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + Default (List parameter set) returns every environment configured on the session-pinned project. When -EnvironmentSlugOrId is supplied (Single parameter set) the cmdlet returns one environment by slug or id. -ProjectId defaults to the session-pinned project in both modes. Notes - Accepts pipeline input by property name so InfisicalEnvironment objects from Get-InfisicalEnvironments can be refreshed directly. + Each InfisicalEnvironment carries both Id and Slug; downstream cmdlets accept either form on -Environment-like parameters. Accepts pipeline input by property name on -EnvironmentSlugOrId. EXAMPLE 1 + Get-InfisicalEnvironment + Lists every environment defined on the session-pinned project. + + + EXAMPLE 2 Get-InfisicalEnvironment -EnvironmentSlugOrId 'dev' Retrieves the 'dev' environment from the session-pinned project. - EXAMPLE 2 - $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'dev' } + EXAMPLE 3 + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $GetInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalEnvironmentParameters.EnvironmentSlugOrId = $GetInfisicalEnvironmentsResult.Slug -$GetInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalEnvironmentParameters.EnvironmentSlugOrId = 'dev' +$GetInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectResult.Id $GetInfisicalEnvironmentParameters.Verbose = $True $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironmentParameters - Looks up the dev environment by slug and re-fetches the canonical record by slug or id. + Resolves a project by slug and re-fetches the dev environment record by slug under that project. @@ -682,10 +589,10 @@ $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironme EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $NewInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$NewInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectsResult.Id +$NewInfisicalEnvironmentParameters.ProjectId = $GetInfisicalProjectResult.Id $NewInfisicalEnvironmentParameters.Name = 'Staging' $NewInfisicalEnvironmentParameters.Slug = 'staging' $NewInfisicalEnvironmentParameters.Position = 20 @@ -721,10 +628,10 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme EXAMPLE 2 - $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'staging' } + $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment | Where-Object { $_.Slug -eq 'staging' } $UpdateInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id $UpdateInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $UpdateInfisicalEnvironmentParameters.Name = 'Pre-Production' $UpdateInfisicalEnvironmentParameters.Slug = 'preprod' @@ -761,10 +668,10 @@ $UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisical EXAMPLE 2 - $GetInfisicalEnvironmentsResult = Get-InfisicalEnvironments | Where-Object { $_.Slug -eq 'sandbox' } + $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment | Where-Object { $_.Slug -eq 'sandbox' } $RemoveInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentsResult.Id +$RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id $RemoveInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $RemoveInfisicalEnvironmentParameters.PassThru = $True $RemoveInfisicalEnvironmentParameters.Confirm = $False @@ -776,70 +683,39 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical - - - Get-InfisicalFolders - Lists Infisical folders at a given secret path. - Get - InfisicalFolders - - - Enumerates folders directly under the supplied -Path within the active project and environment. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. - - - Notes - - This is a non-recursive listing of immediate subfolders. To enumerate secrets across a folder subtree use Get-InfisicalSecrets -Recursive. - - - - - EXAMPLE 1 - Get-InfisicalFolders -Path '/Windows' - Lists every folder directly under /Windows in the active project and environment. - - - EXAMPLE 2 - $GetInfisicalFoldersParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalFoldersParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalFoldersParameters.Environment = $ConnectInfisicalParameters.Environment -$GetInfisicalFoldersParameters.Path = "/Windows/$($CallingScriptPath.BaseName)" -$GetInfisicalFoldersParameters.Verbose = $True - -$GetInfisicalFoldersResult = Get-InfisicalFolders @GetInfisicalFoldersParameters - Lists folders under a script-specific subpath using the session-pinned project and environment. - - - - Get-InfisicalFolder - Retrieves a single Infisical folder by name or id. + Lists or retrieves Infisical folders at a given secret path. Get InfisicalFolder - Returns one folder record by name or id (-FolderNameOrId) under the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. + Default (List parameter set) enumerates folders directly under the supplied -Path within the active project and environment. When -FolderNameOrId is supplied (Single parameter set) the cmdlet returns one folder by name or id under -Path. -ProjectId, -Environment, and -Path default to the session-pinned values in both modes. Notes - Accepts pipeline input by property name so InfisicalFolder objects from Get-InfisicalFolders can be refreshed directly. + List mode is a non-recursive listing of immediate subfolders. To enumerate secrets across a folder subtree use Get-InfisicalSecret -Recursive. Accepts pipeline input by property name on -FolderNameOrId. EXAMPLE 1 + Get-InfisicalFolder -Path '/Windows' + Lists every folder directly under /Windows in the active project and environment. + + + EXAMPLE 2 Get-InfisicalFolder -FolderNameOrId 'Deployments' -Path '/Windows' Retrieves the Deployments folder under /Windows in the active project and environment. - EXAMPLE 2 - $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + EXAMPLE 3 + $GetInfisicalFolderListResult = Get-InfisicalFolder -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } $GetInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFoldersResult.Id +$GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFolderListResult.Id $GetInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $GetInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment $GetInfisicalFolderParameters.Path = '/Windows' @@ -912,10 +788,10 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters EXAMPLE 2 - $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } + $GetInfisicalFolderResult = Get-InfisicalFolder -Path '/Windows' | Where-Object { $_.Name -eq 'Deployments' } $UpdateInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$UpdateInfisicalFolderParameters.FolderId = $GetInfisicalFolderResult.Id $UpdateInfisicalFolderParameters.Name = 'Deployments-Archive' $UpdateInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $UpdateInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment @@ -952,10 +828,10 @@ $UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderPara EXAMPLE 2 - $GetInfisicalFoldersResult = Get-InfisicalFolders -Path '/Windows' | Where-Object { $_.Name -eq $CallingScriptPath.BaseName } + $GetInfisicalFolderResult = Get-InfisicalFolder -Path '/Windows' | Where-Object { $_.Name -eq $CallingScriptPath.BaseName } $RemoveInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFoldersResult.Id +$RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFolderResult.Id $RemoveInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $RemoveInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment $RemoveInfisicalFolderParameters.Path = '/Windows' @@ -969,75 +845,44 @@ $RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderPara - - - Get-InfisicalTags - Lists Infisical tags defined on a project. - Get - InfisicalTags - - - Returns every tag configured on a project. -ProjectId defaults to the session-pinned project id when omitted. - - - Notes - - Tag Ids returned here are the values to pass on -TagIds when creating or updating secrets. - - - - - EXAMPLE 1 - Get-InfisicalTags - Lists every tag defined on the session-pinned project. - - - EXAMPLE 2 - $GetInfisicalProjectsResult = Get-InfisicalProjects | Where-Object { $_.Slug -eq 'platform-telemetry' } - -$GetInfisicalTagsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalTagsParameters.ProjectId = $GetInfisicalProjectsResult.Id -$GetInfisicalTagsParameters.Verbose = $True - -$GetInfisicalTagsResult = Get-InfisicalTags @GetInfisicalTagsParameters - Resolves a project by slug and lists every tag defined on it. - - - - Get-InfisicalTag - Retrieves a single Infisical tag by slug or id. + Lists or retrieves Infisical tags defined on a project. Get InfisicalTag - Returns one tag record by slug or id (-TagSlugOrId). -ProjectId defaults to the session-pinned project when omitted. + Default (List parameter set) returns every tag configured on the project. When -TagSlugOrId is supplied (Single parameter set) the cmdlet returns the one matching record. -ProjectId defaults to the session-pinned project in both modes. Notes - Accepts pipeline input by property name so InfisicalTag objects from Get-InfisicalTags can be refreshed directly. + Tag Ids returned here are the values to pass on -TagIds when creating or updating secrets. Accepts pipeline input by property name on -TagSlugOrId. EXAMPLE 1 + Get-InfisicalTag + Lists every tag defined on the session-pinned project. + + + EXAMPLE 2 Get-InfisicalTag -TagSlugOrId 'critical' Retrieves the 'critical' tag from the session-pinned project. - EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + EXAMPLE 3 + $GetInfisicalProjectResult = Get-InfisicalProject | Where-Object { $_.Slug -eq 'platform-telemetry' } $GetInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalTagParameters.TagSlugOrId = $GetInfisicalTagsResult.Slug -$GetInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalTagParameters.TagSlugOrId = 'critical' +$GetInfisicalTagParameters.ProjectId = $GetInfisicalProjectResult.Id $GetInfisicalTagParameters.Verbose = $True $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters - Filters tags to the critical slug and refetches the canonical record. + Resolves a project by slug and refetches the 'critical' tag from that project. @@ -1103,10 +948,10 @@ $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical' } + $GetInfisicalTagResult = Get-InfisicalTag | Where-Object { $_.Slug -eq 'critical' } $UpdateInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UpdateInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$UpdateInfisicalTagParameters.TagId = $GetInfisicalTagResult.Id $UpdateInfisicalTagParameters.Slug = 'critical-v2' $UpdateInfisicalTagParameters.Name = 'Critical (v2)' $UpdateInfisicalTagParameters.Color = '#FFA500' @@ -1143,10 +988,10 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters EXAMPLE 2 - $GetInfisicalTagsResult = Get-InfisicalTags | Where-Object { $_.Slug -eq 'critical-v2' } + $GetInfisicalTagResult = Get-InfisicalTag | Where-Object { $_.Slug -eq 'critical-v2' } $RemoveInfisicalTagParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$RemoveInfisicalTagParameters.TagId = $GetInfisicalTagsResult.Id +$RemoveInfisicalTagParameters.TagId = $GetInfisicalTagResult.Id $RemoveInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId $RemoveInfisicalTagParameters.PassThru = $True $RemoveInfisicalTagParameters.Confirm = $False @@ -1197,40 +1042,45 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get - Get-InfisicalCertificates - Lists Infisical certificates in a project, with optional filters and automatic paging. + Get-InfisicalCertificate + Lists or retrieves Infisical certificates in a project, with optional filters and automatic paging. Get - InfisicalCertificates + InfisicalCertificate - Enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId. -Limit and -Offset drive a single page; pages are walked automatically until exhausted unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + Default (List parameter set) enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId; -Limit and -Offset drive a single page and pages are walked automatically until exhausted unless -NoAutoPage is supplied. When -SerialNumber is supplied (Single parameter set) the cmdlet returns one certificate record. -ProjectId defaults to the session-pinned project in both modes. Notes - For advanced filtering (validity window, key algorithm, extended key usage, etc.) use Search-InfisicalCertificate instead. + For advanced filtering (validity window, key algorithm, extended key usage, etc.) use Search-InfisicalCertificate instead. Single mode returns metadata only; to obtain certificate and chain PEM material use ConvertTo-InfisicalCertificate or Export-InfisicalCertificate. Accepts pipeline input by property name on -SerialNumber. EXAMPLE 1 - Get-InfisicalCertificates -Status 'active' + Get-InfisicalCertificate -Status 'active' Lists every active certificate in the session-pinned project. EXAMPLE 2 + Get-InfisicalCertificate -SerialNumber '7A:F2:1B:...:9E' + Retrieves the certificate record for the supplied serial number. + + + EXAMPLE 3 $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } -$GetInfisicalCertificatesParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalCertificatesParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalCertificatesParameters.CommonName = $env:COMPUTERNAME -$GetInfisicalCertificatesParameters.FriendlyName = 'web-tier' -$GetInfisicalCertificatesParameters.Status = 'active' -$GetInfisicalCertificatesParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) -$GetInfisicalCertificatesParameters.Limit = 100 -$GetInfisicalCertificatesParameters.Verbose = $True +$GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME +$GetInfisicalCertificateParameters.FriendlyName = 'web-tier' +$GetInfisicalCertificateParameters.Status = 'active' +$GetInfisicalCertificateParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) +$GetInfisicalCertificateParameters.Limit = 100 +$GetInfisicalCertificateParameters.Verbose = $True -$GetInfisicalCertificatesResult = Get-InfisicalCertificates @GetInfisicalCertificatesParameters +$GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCertificateParameters Resolves the issuing CA, then lists active certificates scoped to that CA, the local hostname, and the 'web-tier' friendly name. @@ -1238,36 +1088,42 @@ $GetInfisicalCertificatesResult = Get-InfisicalCertificates @GetInfisicalCertifi - Get-InfisicalCertificate - Retrieves a single Infisical certificate by serial number. + Get-InfisicalPkiSubscriber + Lists or retrieves Infisical PKI subscribers in a project. Get - InfisicalCertificate + InfisicalPkiSubscriber - Returns one certificate record by -SerialNumber. Accepts pipeline input by property name so InfisicalCertificate objects from list/search cmdlets can be re-fetched directly. + Default (List parameter set) returns every PKI subscriber configured on the project. When -Name is supplied (ByName parameter set) the cmdlet returns one subscriber by its slug. -ProjectId defaults to the session-pinned project in both modes. Notes - This returns metadata only. To obtain certificate and chain PEM material use ConvertTo-InfisicalCertificate or Export-InfisicalCertificate. + The -Name parameter is the subscriber slug; aliases SubscriberName and Slug are accepted. Pass the slug returned here on -PkiSubscriberSlug when calling Request-InfisicalCertificate. Accepts pipeline input by property name on -Name. EXAMPLE 1 - Get-InfisicalCertificate -SerialNumber '7A:F2:1B:...:9E' - Retrieves the certificate record for the supplied serial number. + Get-InfisicalPkiSubscriber + Lists every PKI subscriber defined on the session-pinned project. EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + Get-InfisicalPkiSubscriber -Name 'mecm' + Retrieves the 'mecm' PKI subscriber from the session-pinned project. + + + EXAMPLE 3 + $GetInfisicalPkiSubscriberListResult = Get-InfisicalPkiSubscriber | Where-Object { $_.Name -ilike 'mecm*' } -$GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber -$GetInfisicalCertificateParameters.Verbose = $True +$GetInfisicalPkiSubscriberParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalPkiSubscriberParameters.Name = $GetInfisicalPkiSubscriberListResult[0].Name +$GetInfisicalPkiSubscriberParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalPkiSubscriberParameters.Verbose = $True -$GetInfisicalCertificateResult = Get-InfisicalCertificate @GetInfisicalCertificateParameters - Selects the active certificate whose common name matches the host and refetches its canonical record. +$GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSubscriberParameters + Filters subscribers whose name starts with 'mecm' and refetches the canonical record for the first match. @@ -1388,10 +1244,10 @@ $RequestInfisicalCertificateResult = Request-InfisicalCertificate @RequestInfisi EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $ConvertToInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ConvertToInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ConvertToInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificateResult[0].SerialNumber $ConvertToInfisicalCertificateParameters.NoPrivateKey = $False $ConvertToInfisicalCertificateParameters.IncludeChain = $True $ConvertToInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable @@ -1427,10 +1283,10 @@ $ConvertToInfisicalCertificateResult = ConvertTo-InfisicalCertificate @ConvertTo EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $ExportInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$ExportInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$ExportInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificateResult[0].SerialNumber $ExportInfisicalCertificateParameters.Path = "C:\Temp\$($env:COMPUTERNAME).pfx" $ExportInfisicalCertificateParameters.Format = 'Pfx' $ExportInfisicalCertificateParameters.Password = (Read-Host -AsSecureString -Prompt 'PFX password') @@ -1468,10 +1324,10 @@ $ExportInfisicalCertificateResult = Export-InfisicalCertificate @ExportInfisical EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'active' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $InstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$InstallInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificatesResult[0].SerialNumber +$InstallInfisicalCertificateParameters.SerialNumber = $GetInfisicalCertificateResult[0].SerialNumber $InstallInfisicalCertificateParameters.StoreName = 'My' $InstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' $InstallInfisicalCertificateParameters.KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet -bor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet @@ -1510,10 +1366,10 @@ $InstallInfisicalCertificateResult = Install-InfisicalCertificate @InstallInfisi EXAMPLE 2 - $GetInfisicalCertificatesResult = Get-InfisicalCertificates -Status 'revoked' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } + $GetInfisicalCertificateResult = Get-InfisicalCertificate -Status 'revoked' | Where-Object { $_.CommonName -eq $env:COMPUTERNAME } $UninstallInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$UninstallInfisicalCertificateParameters.InfisicalCertificate = $GetInfisicalCertificatesResult[0] +$UninstallInfisicalCertificateParameters.InfisicalCertificate = $GetInfisicalCertificateResult[0] $UninstallInfisicalCertificateParameters.StoreName = 'My' $UninstallInfisicalCertificateParameters.StoreLocation = 'LocalMachine' $UninstallInfisicalCertificateParameters.Force = $True diff --git a/README.md b/README.md index 835c2b5..01b3b5b 100644 --- a/README.md +++ b/README.md @@ -26,14 +26,17 @@ Import-Module -Name .\Module\PSInfisicalAPI ## Cmdlets -| Cmdlet | Purpose | -| ------------------------------------- | -------------------------------------------------------------------------- | -| `Connect-Infisical` | Establish a session using Universal Auth or a pre-issued access token. | -| `Disconnect-Infisical` | Clear the current session. | -| `Get-InfisicalSecrets` | List secrets at a given path / environment. | -| `Get-InfisicalSecret` | Retrieve a single secret by name. | -| `ConvertTo-InfisicalSecretDictionary` | Convert secret objects into a `Hashtable` keyed by `SecretKey`. | -| `Export-InfisicalSecrets` | Export secrets to JSON, YAML, XML, or `.env` format. | +The module exports 34 cmdlets. Discovery cmdlets (`Get-Infisical*`) use a `List` (default) / single-record parameter-set pair: invoking without the identity parameter returns the collection, supplying the identity parameter returns one record. + +| Area | Cmdlets | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Session | `Connect-Infisical`, `Disconnect-Infisical` | +| Secrets | `Get-InfisicalSecret`, `New-InfisicalSecret`, `Update-InfisicalSecret`, `Remove-InfisicalSecret`, `Copy-InfisicalSecret`, `ConvertTo-InfisicalSecretDictionary`, `Export-InfisicalSecrets` | +| Projects | `Get-InfisicalProject`, `New-InfisicalProject`, `Update-InfisicalProject`, `Remove-InfisicalProject` | +| Environments | `Get-InfisicalEnvironment`, `New-InfisicalEnvironment`, `Update-InfisicalEnvironment`, `Remove-InfisicalEnvironment` | +| Folders | `Get-InfisicalFolder`, `New-InfisicalFolder`, `Update-InfisicalFolder`, `Remove-InfisicalFolder` | +| Tags | `Get-InfisicalTag`, `New-InfisicalTag`, `Update-InfisicalTag`, `Remove-InfisicalTag` | +| PKI | `Get-InfisicalCertificateAuthority`, `Get-InfisicalPkiSubscriber`, `Get-InfisicalCertificate`, `Search-InfisicalCertificate`, `Request-InfisicalCertificate`, `ConvertTo-InfisicalCertificate`, `Install-InfisicalCertificate`, `Uninstall-InfisicalCertificate`, `Export-InfisicalCertificate` | Use `Get-Help -Full` for parameter details and `Get-Help about_PSInfisicalAPI` for the module overview. @@ -51,7 +54,7 @@ $connection = Connect-Infisical ` -ClientSecret $secureSecret ` -PassThru -Get-InfisicalSecrets -SecretPath '/' +Get-InfisicalSecret -SecretPath '/' Disconnect-Infisical ``` @@ -96,7 +99,7 @@ Sensitive values (`ClientSecret`, `AccessToken`) are read directly into a read-o [Environment]::SetEnvironmentVariable('INFISICAL_CLIENT_SECRET', 'super-secret-value', 'User') Connect-Infisical -Get-InfisicalSecrets +Get-InfisicalSecret ``` ### Mixed example (explicit values override discovery) @@ -119,6 +122,55 @@ pwsh -NoProfile -ExecutionPolicy Bypass -File .\build.ps1 -RunTests The script builds the binary, runs unit tests, publishes binaries into `Module/PSInfisicalAPI/bin/`, regenerates the manifest, and validates that the module imports. +## Extending the module + +### Adding a new API endpoint + +All HTTP routes live in two files under `src/PSInfisicalAPI/Endpoints/`: + +- `InfisicalEndpointNames.cs` declares a `const string` identifier for each endpoint. +- `InfisicalEndpointRegistry.cs` maps each identifier to one or more `InfisicalEndpointDefinition` records grouped by resource (`RegisterAuthentication`, `RegisterSecrets`, `RegisterPki`, etc.). + +To add a route: + +1. Add a constant in `InfisicalEndpointNames.cs` (e.g., `public const string ListPkiSubscribers = "ListPkiSubscribers";`). +2. In the matching `Register` method, call `Add(map, new InfisicalEndpointDefinition { ... })` with `Name`, `Resource`, `Version`, `Method`, `Template`, and the `RequiresAuthorization` / `ContainsSecretMaterialInRequest` / `ContainsSecretMaterialInResponse` flags. Use `{placeholder}` tokens in `Template`; they are substituted from the `pathParameters` dictionary passed by the caller. +3. If the same logical operation has more than one upstream path (legacy + current), register both definitions under the same `Name` — `InvokeWithCandidateFallback` tries each in order until one succeeds. +4. Invoke the endpoint from the appropriate client (`InfisicalPkiClient`, `InfisicalSecretsClient`, etc.) via `_invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.XYZ, "XYZ", pathParameters, query, body)`. + +### Adding a new cmdlet + +Cmdlets live in `src/PSInfisicalAPI/Cmdlets/` and derive from `InfisicalCmdletBase`, which exposes `HttpClient`, `Logger`, `ResolveProjectId`, and `ThrowTerminatingForException`. Follow the consolidated discovery pattern when the cmdlet supports both list and single-record retrieval: + +```csharp +[Cmdlet(VerbsCommon.Get, "InfisicalPkiSubscriber", DefaultParameterSetName = "List")] +[OutputType(typeof(InfisicalPkiSubscriber))] +public sealed class GetInfisicalPkiSubscriberCmdlet : InfisicalCmdletBase +{ + [Parameter(ParameterSetName = "ByName", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("SubscriberName", "Slug")] + public string Name { get; set; } + + [Parameter] public string ProjectId { get; set; } + + protected override void ProcessRecord() { /* dispatch on ParameterSetName */ } +} +``` + +After adding (or removing) a cmdlet: + +1. Update `build.ps1` in **two** places — the `CmdletsToExport` array inside the generated manifest block, and the `$expectedCmds` array used by `Test-ModuleImports`. Both must list the same cmdlets; the build fails fast if they drift. +2. Add a `` entry in `Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml`. Each entry must include a non-empty `` synopsis (do not let it start with the cmdlet name — the validation gate rejects PowerShell's auto-generated fallback), a non-empty `` body, and at least one `` with a non-empty `` block. +3. For consolidated `List` / single-record cmdlets, ship **three examples**: two straight-line invocations (one per parameter set) and one `OrderedDictionary` splat. The splat must construct the dictionary with `OrdinalIgnoreCase` so parameter names round-trip case-insensitively: + + ```powershell + $Params = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) + $Params.ProjectId = (Get-InfisicalProject | Select-Object -First 1).Id + $Result = Get-InfisicalPkiSubscriber @Params + ``` +4. Add a `## Unreleased` entry to `CHANGELOG.md` describing the change (mark removals of public cmdlets or parameters as **BREAKING**). +5. Run `./build.ps1 -RunTests`. The script enforces the cmdlet list, runs the xUnit suite, and verifies that every exported cmdlet has a valid synopsis, description, and at least one non-empty example. + ## Continuous integration `.gitea/workflows/publish-psgallery.yml` publishes the module to the PowerShell Gallery whenever a pull request is merged into `main`. The workflow expects a repository secret named `PSGALLERY_API_KEY` containing a valid Gallery API key. diff --git a/build.ps1 b/build.ps1 index b928622..26088be 100644 --- a/build.ps1 +++ b/build.ps1 @@ -100,7 +100,6 @@ function Write-Manifest { CmdletsToExport = @( 'Connect-Infisical', 'Disconnect-Infisical', - 'Get-InfisicalSecrets', 'Get-InfisicalSecret', 'New-InfisicalSecret', 'Update-InfisicalSecret', @@ -108,29 +107,25 @@ function Write-Manifest { 'Copy-InfisicalSecret', 'ConvertTo-InfisicalSecretDictionary', 'Export-InfisicalSecrets', - 'Get-InfisicalProjects', 'Get-InfisicalProject', 'New-InfisicalProject', 'Update-InfisicalProject', 'Remove-InfisicalProject', - 'Get-InfisicalEnvironments', 'Get-InfisicalEnvironment', 'New-InfisicalEnvironment', 'Update-InfisicalEnvironment', 'Remove-InfisicalEnvironment', - 'Get-InfisicalFolders', 'Get-InfisicalFolder', 'New-InfisicalFolder', 'Update-InfisicalFolder', 'Remove-InfisicalFolder', - 'Get-InfisicalTags', 'Get-InfisicalTag', 'New-InfisicalTag', 'Update-InfisicalTag', 'Remove-InfisicalTag', 'Get-InfisicalCertificateAuthority', + 'Get-InfisicalPkiSubscriber', 'Get-InfisicalCertificate', - 'Get-InfisicalCertificates', 'Search-InfisicalCertificate', 'Request-InfisicalCertificate', 'ConvertTo-InfisicalCertificate', @@ -201,7 +196,7 @@ if (`$cmds.Count -eq 0) { throw "No cmdlets were exported by the PSInfisicalAPI module." } -`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecrets','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProjects','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironments','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolders','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTags','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalCertificate','Get-InfisicalCertificates','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') +`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') foreach (`$expected in `$expectedCmds) { if (-not (Get-Command -Name `$expected -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { throw "Cmdlet not found: `$expected" diff --git a/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs b/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs index e048a6a..95c8232 100644 --- a/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs +++ b/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs @@ -115,17 +115,15 @@ namespace PSInfisicalAPI.Tests } [Fact] - public void Candidates_For_SignCertificateBySubscriber_Include_Pki_And_CertManager() + public void SignCertificateBySubscriber_Uses_Pki_Subscribers_Template() { IReadOnlyList candidates = InfisicalEndpointRegistry.GetCandidates(InfisicalEndpointNames.SignCertificateBySubscriber); - Assert.Contains(candidates, c => c.Template == "/api/v1/pki/pki-subscribers/{subscriberName}/sign-certificate"); - Assert.Contains(candidates, c => c.Template == "/api/v1/cert-manager/pki-subscribers/{subscriberName}/sign-certificate"); - foreach (InfisicalEndpointDefinition candidate in candidates) - { - Assert.Equal("POST", candidate.Method); - Assert.True(candidate.RequiresAuthorization); - Assert.True(candidate.ContainsSecretMaterialInResponse); - } + Assert.Single(candidates); + InfisicalEndpointDefinition only = candidates[0]; + Assert.Equal("/api/v1/pki/subscribers/{subscriberName}/sign-certificate", only.Template); + Assert.Equal("POST", only.Method); + Assert.True(only.RequiresAuthorization); + Assert.True(only.ContainsSecretMaterialInResponse); } [Fact] diff --git a/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs b/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs index 9ecd5c9..dae7d4b 100644 --- a/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs +++ b/src/PSInfisicalAPI.Tests/PkiEndpointRegistryTests.cs @@ -12,7 +12,7 @@ namespace PSInfisicalAPI.Tests private static readonly Assembly ModuleAssembly = typeof(PSInfisicalAPI.Connections.InfisicalConnection).Assembly; [Fact] - public void GetInfisicalCertificate_Cmdlet_Is_Singular_With_Mandatory_SerialNumber() + public void GetInfisicalCertificate_Cmdlet_Is_Singular_With_SerialNumber_In_Single_ParameterSet() { Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.GetInfisicalCertificateCmdlet", true); Assert.True(typeof(PSInfisicalAPI.Cmdlets.InfisicalCmdletBase).IsAssignableFrom(cmdletType)); @@ -27,6 +27,13 @@ namespace PSInfisicalAPI.Tests Assert.Equal(VerbsCommon.Get, cmdletData.ConstructorArguments[0].Value); Assert.Equal("InfisicalCertificate", cmdletData.ConstructorArguments[1].Value); + string defaultParameterSetName = null; + foreach (CustomAttributeNamedArgument named in cmdletData.NamedArguments) + { + if (named.MemberName == "DefaultParameterSetName") { defaultParameterSetName = (string)named.TypedValue.Value; break; } + } + Assert.Equal("List", defaultParameterSetName); + PropertyInfo serialProp = cmdletType.GetProperty("SerialNumber"); Assert.NotNull(serialProp); @@ -38,33 +45,27 @@ namespace PSInfisicalAPI.Tests Assert.NotNull(parameterAttr); bool mandatory = false; + string parameterSetName = null; foreach (CustomAttributeNamedArgument named in parameterAttr.NamedArguments) { - if (named.MemberName == "Mandatory") { mandatory = (bool)named.TypedValue.Value; break; } + if (named.MemberName == "Mandatory") { mandatory = (bool)named.TypedValue.Value; } + else if (named.MemberName == "ParameterSetName") { parameterSetName = (string)named.TypedValue.Value; } } Assert.True(mandatory); + Assert.Equal("Single", parameterSetName); } [Fact] - public void GetInfisicalCertificates_Cmdlet_Is_Registered_For_Listing() + public void GetInfisicalCertificate_Cmdlet_Exposes_List_Filter_Properties() { - Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.GetInfisicalCertificatesCmdlet", true); - Assert.True(typeof(PSInfisicalAPI.Cmdlets.InfisicalCmdletBase).IsAssignableFrom(cmdletType)); - - CustomAttributeData cmdletData = null; - foreach (CustomAttributeData candidate in cmdletType.GetCustomAttributesData()) - { - if (candidate.AttributeType == typeof(CmdletAttribute)) { cmdletData = candidate; break; } - } - Assert.NotNull(cmdletData); - Assert.Equal(VerbsCommon.Get, cmdletData.ConstructorArguments[0].Value); - Assert.Equal("InfisicalCertificates", cmdletData.ConstructorArguments[1].Value); - + Type cmdletType = ModuleAssembly.GetType("PSInfisicalAPI.Cmdlets.GetInfisicalCertificateCmdlet", true); Assert.NotNull(cmdletType.GetProperty("CommonName")); Assert.NotNull(cmdletType.GetProperty("FriendlyName")); Assert.NotNull(cmdletType.GetProperty("CaId")); Assert.NotNull(cmdletType.GetProperty("Limit")); Assert.NotNull(cmdletType.GetProperty("Offset")); + Assert.NotNull(cmdletType.GetProperty("NoAutoPage")); + Assert.NotNull(cmdletType.GetProperty("List")); } [Fact] diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs index df5970c..91a91e8 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs @@ -6,14 +6,24 @@ using PSInfisicalAPI.Pki; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalCertificate")] + [Cmdlet(VerbsCommon.Get, "InfisicalCertificate", DefaultParameterSetName = "List")] [OutputType(typeof(InfisicalCertificate))] public sealed class GetInfisicalCertificateCmdlet : InfisicalCmdletBase { - [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Parameter(ParameterSetName = "Single", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] [Alias("Id", "Identifier")] public string SerialNumber { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + [Parameter(ParameterSetName = "List")] public string ProjectId { get; set; } + [Parameter(ParameterSetName = "List")] public string CommonName { get; set; } + [Parameter(ParameterSetName = "List")] public string FriendlyName { get; set; } + [Parameter(ParameterSetName = "List")] public string Status { get; set; } + [Parameter(ParameterSetName = "List")] public string[] CaId { get; set; } + [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } + [Parameter(ParameterSetName = "List")] public int? Offset { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter NoAutoPage { get; set; } + protected override void ProcessRecord() { try @@ -21,10 +31,57 @@ namespace PSInfisicalAPI.Cmdlets InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - InfisicalCertificate cert = client.RetrieveCertificate(connection, SerialNumber); - if (cert != null) + if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) { - WriteObject(cert); + InfisicalCertificate cert = client.RetrieveCertificate(connection, SerialNumber); + if (cert != null) + { + WriteObject(cert); + } + + return; + } + + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + InfisicalCertificateSearchQuery query = new InfisicalCertificateSearchQuery + { + ProjectId = resolvedProjectId, + CommonName = CommonName, + FriendlyName = FriendlyName, + Status = Status, + CaIds = CaId, + Limit = Limit ?? 100, + Offset = Offset ?? 0 + }; + + int requestedLimit = query.Limit ?? 100; + int emitted = 0; + while (true) + { + InfisicalCertificateSearchResult page = client.SearchCertificates(connection, query); + if (page == null || page.Certificates == null || page.Certificates.Length == 0) + { + break; + } + + foreach (InfisicalCertificate cert in page.Certificates) + { + WriteObject(cert); + emitted++; + } + + if (NoAutoPage.IsPresent || page.Certificates.Length < requestedLimit) + { + break; + } + + if (page.TotalCount > 0 && emitted >= page.TotalCount) + { + break; + } + + query.Offset = (query.Offset ?? 0) + page.Certificates.Length; } } catch (Exception exception) diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs deleted file mode 100644 index 7c90278..0000000 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatesCmdlet.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Management.Automation; -using PSInfisicalAPI.Connections; -using PSInfisicalAPI.Models; -using PSInfisicalAPI.Pki; - -namespace PSInfisicalAPI.Cmdlets -{ - [Cmdlet(VerbsCommon.Get, "InfisicalCertificates")] - [OutputType(typeof(InfisicalCertificate))] - public sealed class GetInfisicalCertificatesCmdlet : InfisicalCmdletBase - { - [Parameter] public string ProjectId { get; set; } - [Parameter] public string CommonName { get; set; } - [Parameter] public string FriendlyName { get; set; } - [Parameter] public string Status { get; set; } - [Parameter] public string[] CaId { get; set; } - [Parameter] public int? Limit { get; set; } - [Parameter] public int? Offset { get; set; } - [Parameter] public SwitchParameter NoAutoPage { get; set; } - - protected override void ProcessRecord() - { - try - { - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - - InfisicalCertificateSearchQuery query = new InfisicalCertificateSearchQuery - { - ProjectId = resolvedProjectId, - CommonName = CommonName, - FriendlyName = FriendlyName, - Status = Status, - CaIds = CaId, - Limit = Limit ?? 100, - Offset = Offset ?? 0 - }; - - int requestedLimit = query.Limit ?? 100; - int emitted = 0; - while (true) - { - InfisicalCertificateSearchResult page = client.SearchCertificates(connection, query); - if (page == null || page.Certificates == null || page.Certificates.Length == 0) - { - break; - } - - foreach (InfisicalCertificate cert in page.Certificates) - { - WriteObject(cert); - emitted++; - } - - if (NoAutoPage.IsPresent || page.Certificates.Length < requestedLimit) - { - break; - } - - if (page.TotalCount > 0 && emitted >= page.TotalCount) - { - break; - } - - query.Offset = (query.Offset ?? 0) + page.Certificates.Length; - } - } - catch (Exception exception) - { - ThrowTerminatingForException("GetInfisicalCertificatesCmdlet", "GetCertificates", exception); - } - } - } -} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs index 728ec32..a871c16 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs @@ -6,16 +6,18 @@ using PSInfisicalAPI.Models; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalEnvironment")] + [Cmdlet(VerbsCommon.Get, "InfisicalEnvironment", DefaultParameterSetName = "List")] [OutputType(typeof(InfisicalEnvironment))] public sealed class GetInfisicalEnvironmentCmdlet : InfisicalCmdletBase { - [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(ParameterSetName = "Single", Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] [Alias("Slug", "Id", "Environment")] public string EnvironmentSlugOrId { get; set; } [Parameter] public string ProjectId { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + protected override void ProcessRecord() { try @@ -23,15 +25,27 @@ namespace PSInfisicalAPI.Cmdlets InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalEnvironmentClient client = new InfisicalEnvironmentClient(HttpClient, Logger); - InfisicalEnvironment env = client.Retrieve(connection, resolvedProjectId, EnvironmentSlugOrId); - if (env != null) + + if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) + { + InfisicalEnvironment env = client.Retrieve(connection, resolvedProjectId, EnvironmentSlugOrId); + if (env != null) + { + WriteObject(env); + } + + return; + } + + InfisicalEnvironment[] envs = client.List(connection, resolvedProjectId); + foreach (InfisicalEnvironment env in envs) { WriteObject(env); } } catch (Exception exception) { - ThrowTerminatingForException("GetInfisicalEnvironmentCmdlet", "RetrieveEnvironment", exception); + ThrowTerminatingForException("GetInfisicalEnvironmentCmdlet", "GetEnvironment", exception); } } } diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentsCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentsCmdlet.cs deleted file mode 100644 index 2128cda..0000000 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentsCmdlet.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Management.Automation; -using PSInfisicalAPI.Connections; -using PSInfisicalAPI.Environments; -using PSInfisicalAPI.Models; - -namespace PSInfisicalAPI.Cmdlets -{ - [Cmdlet(VerbsCommon.Get, "InfisicalEnvironments")] - [OutputType(typeof(InfisicalEnvironment))] - public sealed class GetInfisicalEnvironmentsCmdlet : InfisicalCmdletBase - { - [Parameter] public string ProjectId { get; set; } - - protected override void ProcessRecord() - { - try - { - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - InfisicalEnvironmentClient client = new InfisicalEnvironmentClient(HttpClient, Logger); - InfisicalEnvironment[] envs = client.List(connection, resolvedProjectId); - foreach (InfisicalEnvironment env in envs) - { - WriteObject(env); - } - } - catch (Exception exception) - { - ThrowTerminatingForException("GetInfisicalEnvironmentsCmdlet", "ListEnvironments", exception); - } - } - } -} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs index 22ff5ee..8a1e644 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs @@ -6,11 +6,11 @@ using PSInfisicalAPI.Models; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalFolder")] + [Cmdlet(VerbsCommon.Get, "InfisicalFolder", DefaultParameterSetName = "List")] [OutputType(typeof(InfisicalFolder))] public sealed class GetInfisicalFolderCmdlet : InfisicalCmdletBase { - [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(ParameterSetName = "Single", Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] [Alias("Name", "Id")] public string FolderNameOrId { get; set; } @@ -18,6 +18,8 @@ namespace PSInfisicalAPI.Cmdlets [Parameter] public string Environment { get; set; } [Parameter] public string Path { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + protected override void ProcessRecord() { try @@ -27,15 +29,27 @@ namespace PSInfisicalAPI.Cmdlets string resolvedEnvironment = ResolveEnvironment(connection, Environment); string resolvedPath = ResolveSecretPath(connection, Path); InfisicalFolderClient client = new InfisicalFolderClient(HttpClient, Logger); - InfisicalFolder folder = client.Retrieve(connection, resolvedProjectId, resolvedEnvironment, resolvedPath, FolderNameOrId); - if (folder != null) + + if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) + { + InfisicalFolder folder = client.Retrieve(connection, resolvedProjectId, resolvedEnvironment, resolvedPath, FolderNameOrId); + if (folder != null) + { + WriteObject(folder); + } + + return; + } + + InfisicalFolder[] folders = client.List(connection, resolvedProjectId, resolvedEnvironment, resolvedPath); + foreach (InfisicalFolder folder in folders) { WriteObject(folder); } } catch (Exception exception) { - ThrowTerminatingForException("GetInfisicalFolderCmdlet", "RetrieveFolder", exception); + ThrowTerminatingForException("GetInfisicalFolderCmdlet", "GetFolder", exception); } } } diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalFoldersCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalFoldersCmdlet.cs deleted file mode 100644 index 4c3b2a6..0000000 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalFoldersCmdlet.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Management.Automation; -using PSInfisicalAPI.Connections; -using PSInfisicalAPI.Folders; -using PSInfisicalAPI.Models; - -namespace PSInfisicalAPI.Cmdlets -{ - [Cmdlet(VerbsCommon.Get, "InfisicalFolders")] - [OutputType(typeof(InfisicalFolder))] - public sealed class GetInfisicalFoldersCmdlet : InfisicalCmdletBase - { - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } - [Parameter] public string Path { get; set; } - - protected override void ProcessRecord() - { - try - { - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedPath = ResolveSecretPath(connection, Path); - InfisicalFolderClient client = new InfisicalFolderClient(HttpClient, Logger); - InfisicalFolder[] folders = client.List(connection, resolvedProjectId, resolvedEnvironment, resolvedPath); - foreach (InfisicalFolder folder in folders) - { - WriteObject(folder); - } - } - catch (Exception exception) - { - ThrowTerminatingForException("GetInfisicalFoldersCmdlet", "ListFolders", exception); - } - } - } -} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs new file mode 100644 index 0000000..bcd2eab --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs @@ -0,0 +1,50 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalPkiSubscriber", DefaultParameterSetName = "List")] + [OutputType(typeof(InfisicalPkiSubscriber))] + public sealed class GetInfisicalPkiSubscriberCmdlet : InfisicalCmdletBase + { + [Parameter(ParameterSetName = "ByName", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("SubscriberName", "Slug")] + public string Name { get; set; } + + [Parameter] public string ProjectId { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + if (string.Equals(ParameterSetName, "ByName", StringComparison.Ordinal)) + { + InfisicalPkiSubscriber subscriber = client.GetPkiSubscriber(connection, Name, resolvedProjectId); + if (subscriber != null) + { + WriteObject(subscriber); + } + + return; + } + + InfisicalPkiSubscriber[] all = client.ListPkiSubscribers(connection, resolvedProjectId); + foreach (InfisicalPkiSubscriber subscriber in all) + { + WriteObject(subscriber); + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalPkiSubscriberCmdlet", "GetPkiSubscriber", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs index 93ec71e..fa251fc 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs @@ -6,30 +6,44 @@ using PSInfisicalAPI.Projects; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalProject")] + [Cmdlet(VerbsCommon.Get, "InfisicalProject", DefaultParameterSetName = "List")] [OutputType(typeof(InfisicalProject))] public sealed class GetInfisicalProjectCmdlet : InfisicalCmdletBase { - [Parameter(ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(ParameterSetName = "Single", Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] [Alias("Id")] public string ProjectId { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + protected override void ProcessRecord() { try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalProjectClient client = new InfisicalProjectClient(HttpClient, Logger); - InfisicalProject project = client.Retrieve(connection, resolvedProjectId); - if (project != null) + + if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) + { + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + InfisicalProject project = client.Retrieve(connection, resolvedProjectId); + if (project != null) + { + WriteObject(project); + } + + return; + } + + InfisicalProject[] projects = client.List(connection); + foreach (InfisicalProject project in projects) { WriteObject(project); } } catch (Exception exception) { - ThrowTerminatingForException("GetInfisicalProjectCmdlet", "RetrieveProject", exception); + ThrowTerminatingForException("GetInfisicalProjectCmdlet", "GetProject", exception); } } } diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectsCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectsCmdlet.cs deleted file mode 100644 index fa6150a..0000000 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectsCmdlet.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Management.Automation; -using PSInfisicalAPI.Connections; -using PSInfisicalAPI.Models; -using PSInfisicalAPI.Projects; - -namespace PSInfisicalAPI.Cmdlets -{ - [Cmdlet(VerbsCommon.Get, "InfisicalProjects")] - [OutputType(typeof(InfisicalProject))] - public sealed class GetInfisicalProjectsCmdlet : InfisicalCmdletBase - { - protected override void ProcessRecord() - { - try - { - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - InfisicalProjectClient client = new InfisicalProjectClient(HttpClient, Logger); - InfisicalProject[] projects = client.List(connection); - - foreach (InfisicalProject project in projects) - { - WriteObject(project); - } - } - catch (Exception exception) - { - ThrowTerminatingForException("GetInfisicalProjectsCmdlet", "ListProjects", exception); - } - } - } -} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs index 2493296..49eee51 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; using System.Management.Automation; using PSInfisicalAPI.Connections; using PSInfisicalAPI.Models; @@ -6,55 +8,101 @@ using PSInfisicalAPI.Secrets; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalSecret")] + [Cmdlet(VerbsCommon.Get, "InfisicalSecret", DefaultParameterSetName = "List")] [OutputType(typeof(InfisicalSecret))] public sealed class GetInfisicalSecretCmdlet : InfisicalCmdletBase { - [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(ParameterSetName = "Single", Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] public string SecretName { get; set; } [Parameter] public string ProjectId { get; set; } [Parameter] public string Environment { get; set; } [Parameter] public string SecretPath { get; set; } [Parameter] public string ApiVersion { get; set; } - [Parameter] public int? Version { get; set; } - [Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; [Parameter] public SwitchParameter ViewSecretValue { get; set; } = SwitchParameter.Present; [Parameter] public SwitchParameter ExpandSecretReferences { get; set; } [Parameter] public SwitchParameter IncludeImports { get; set; } + [Parameter(ParameterSetName = "Single")] public int? Version { get; set; } + [Parameter(ParameterSetName = "Single")] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; + + [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter Recursive { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter IncludePersonalOverrides { get; set; } + [Parameter(ParameterSetName = "List")] public Hashtable MetadataFilter { get; set; } + [Parameter(ParameterSetName = "List")] public string[] TagSlugs { get; set; } + protected override void ProcessRecord() { try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalSecretsClient client = new InfisicalSecretsClient(HttpClient, Logger); - InfisicalRetrieveSecretQuery query = new InfisicalRetrieveSecretQuery + if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) + { + InfisicalRetrieveSecretQuery query = new InfisicalRetrieveSecretQuery + { + SecretName = SecretName, + ProjectId = ResolveProjectId(connection, ProjectId), + Environment = ResolveEnvironment(connection, Environment), + SecretPath = ResolveSecretPath(connection, SecretPath), + ApiVersion = ResolveApiVersion(connection, ApiVersion), + Version = Version, + Type = Type.ToString(), + ViewSecretValue = ViewSecretValue.IsPresent, + ExpandSecretReferences = ExpandSecretReferences.IsPresent, + IncludeImports = IncludeImports.IsPresent + }; + + InfisicalSecret secret = client.Retrieve(connection, query); + if (secret != null) + { + WriteObject(secret); + } + + return; + } + + InfisicalListSecretsQuery listQuery = new InfisicalListSecretsQuery { - SecretName = SecretName, ProjectId = ResolveProjectId(connection, ProjectId), Environment = ResolveEnvironment(connection, Environment), SecretPath = ResolveSecretPath(connection, SecretPath), ApiVersion = ResolveApiVersion(connection, ApiVersion), - Version = Version, - Type = Type.ToString(), - ViewSecretValue = ViewSecretValue.IsPresent, + Recursive = Recursive.IsPresent, + IncludeImports = IncludeImports.IsPresent, + IncludePersonalOverrides = IncludePersonalOverrides.IsPresent, ExpandSecretReferences = ExpandSecretReferences.IsPresent, - IncludeImports = IncludeImports.IsPresent + ViewSecretValue = ViewSecretValue.IsPresent, + MetadataFilter = ToStringDictionary(MetadataFilter), + TagSlugs = TagSlugs }; - InfisicalSecretsClient client = new InfisicalSecretsClient(HttpClient, Logger); - InfisicalSecret secret = client.Retrieve(connection, query); - - if (secret != null) + InfisicalSecret[] secrets = client.List(connection, listQuery); + foreach (InfisicalSecret secret in secrets) { WriteObject(secret); } } catch (Exception exception) { - ThrowTerminatingForException("GetInfisicalSecretCmdlet", "RetrieveSecret", exception); + ThrowTerminatingForException("GetInfisicalSecretCmdlet", "GetSecret", exception); } } + + private static Dictionary ToStringDictionary(Hashtable hashtable) + { + if (hashtable == null) { return null; } + + Dictionary result = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (DictionaryEntry entry in hashtable) + { + if (entry.Key == null) { continue; } + result[entry.Key.ToString()] = entry.Value != null ? entry.Value.ToString() : null; + } + + return result; + } } } diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretsCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretsCmdlet.cs deleted file mode 100644 index 599b8a9..0000000 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretsCmdlet.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Management.Automation; -using PSInfisicalAPI.Connections; -using PSInfisicalAPI.Models; -using PSInfisicalAPI.Secrets; - -namespace PSInfisicalAPI.Cmdlets -{ - [Cmdlet(VerbsCommon.Get, "InfisicalSecrets")] - [OutputType(typeof(InfisicalSecret))] - public sealed class GetInfisicalSecretsCmdlet : InfisicalCmdletBase - { - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } - [Parameter] public string SecretPath { get; set; } - [Parameter] public string ApiVersion { get; set; } - [Parameter] public SwitchParameter Recursive { get; set; } - [Parameter] public SwitchParameter IncludeImports { get; set; } - [Parameter] public SwitchParameter IncludePersonalOverrides { get; set; } - [Parameter] public SwitchParameter ExpandSecretReferences { get; set; } - [Parameter] public SwitchParameter ViewSecretValue { get; set; } = SwitchParameter.Present; - [Parameter] public Hashtable MetadataFilter { get; set; } - [Parameter] public string[] TagSlugs { get; set; } - - protected override void ProcessRecord() - { - try - { - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - - InfisicalListSecretsQuery query = new InfisicalListSecretsQuery - { - ProjectId = ResolveProjectId(connection, ProjectId), - Environment = ResolveEnvironment(connection, Environment), - SecretPath = ResolveSecretPath(connection, SecretPath), - ApiVersion = ResolveApiVersion(connection, ApiVersion), - Recursive = Recursive.IsPresent, - IncludeImports = IncludeImports.IsPresent, - IncludePersonalOverrides = IncludePersonalOverrides.IsPresent, - ExpandSecretReferences = ExpandSecretReferences.IsPresent, - ViewSecretValue = ViewSecretValue.IsPresent, - MetadataFilter = ToStringDictionary(MetadataFilter), - TagSlugs = TagSlugs - }; - - InfisicalSecretsClient client = new InfisicalSecretsClient(HttpClient, Logger); - InfisicalSecret[] secrets = client.List(connection, query); - - foreach (InfisicalSecret secret in secrets) - { - WriteObject(secret); - } - } - catch (Exception exception) - { - ThrowTerminatingForException("GetInfisicalSecretsCmdlet", "RetrieveSecrets", exception); - } - } - - private static Dictionary ToStringDictionary(Hashtable hashtable) - { - if (hashtable == null) { return null; } - - Dictionary result = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (DictionaryEntry entry in hashtable) - { - if (entry.Key == null) { continue; } - result[entry.Key.ToString()] = entry.Value != null ? entry.Value.ToString() : null; - } - - return result; - } - } -} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs index 8c7837f..60ce541 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs @@ -6,16 +6,18 @@ using PSInfisicalAPI.Tags; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalTag")] + [Cmdlet(VerbsCommon.Get, "InfisicalTag", DefaultParameterSetName = "List")] [OutputType(typeof(InfisicalTag))] public sealed class GetInfisicalTagCmdlet : InfisicalCmdletBase { - [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(ParameterSetName = "Single", Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] [Alias("Slug", "Id")] public string TagSlugOrId { get; set; } [Parameter] public string ProjectId { get; set; } + [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + protected override void ProcessRecord() { try @@ -23,15 +25,27 @@ namespace PSInfisicalAPI.Cmdlets InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalTagClient client = new InfisicalTagClient(HttpClient, Logger); - InfisicalTag tag = client.Retrieve(connection, resolvedProjectId, TagSlugOrId); - if (tag != null) + + if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) + { + InfisicalTag tag = client.Retrieve(connection, resolvedProjectId, TagSlugOrId); + if (tag != null) + { + WriteObject(tag); + } + + return; + } + + InfisicalTag[] tags = client.List(connection, resolvedProjectId); + foreach (InfisicalTag tag in tags) { WriteObject(tag); } } catch (Exception exception) { - ThrowTerminatingForException("GetInfisicalTagCmdlet", "RetrieveTag", exception); + ThrowTerminatingForException("GetInfisicalTagCmdlet", "GetTag", exception); } } } diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagsCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagsCmdlet.cs deleted file mode 100644 index a4b736c..0000000 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagsCmdlet.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Management.Automation; -using PSInfisicalAPI.Connections; -using PSInfisicalAPI.Models; -using PSInfisicalAPI.Tags; - -namespace PSInfisicalAPI.Cmdlets -{ - [Cmdlet(VerbsCommon.Get, "InfisicalTags")] - [OutputType(typeof(InfisicalTag))] - public sealed class GetInfisicalTagsCmdlet : InfisicalCmdletBase - { - [Parameter] public string ProjectId { get; set; } - - protected override void ProcessRecord() - { - try - { - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - InfisicalTagClient client = new InfisicalTagClient(HttpClient, Logger); - InfisicalTag[] tags = client.List(connection, resolvedProjectId); - foreach (InfisicalTag tag in tags) - { - WriteObject(tag); - } - } - catch (Exception exception) - { - ThrowTerminatingForException("GetInfisicalTagsCmdlet", "ListTags", exception); - } - } - } -} diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index 22f08bf..a4b70de 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -51,5 +51,8 @@ namespace PSInfisicalAPI.Endpoints public const string GetCertificateBundle = "GetCertificateBundle"; public const string SignCertificateBySubscriber = "SignCertificateBySubscriber"; public const string SignCertificateByCa = "SignCertificateByCa"; + + public const string ListPkiSubscribers = "ListPkiSubscribers"; + public const string GetPkiSubscriber = "GetPkiSubscriber"; } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index 2bd0f58..24d9131 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -596,18 +596,7 @@ namespace PSInfisicalAPI.Endpoints Resource = "Pki", Version = "v1", Method = "POST", - Template = "/api/v1/pki/pki-subscribers/{subscriberName}/sign-certificate", - RequiresAuthorization = true, - ContainsSecretMaterialInResponse = true - }); - - Add(map, new InfisicalEndpointDefinition - { - Name = InfisicalEndpointNames.SignCertificateBySubscriber, - Resource = "Pki", - Version = "v1", - Method = "POST", - Template = "/api/v1/cert-manager/pki-subscribers/{subscriberName}/sign-certificate", + Template = "/api/v1/pki/subscribers/{subscriberName}/sign-certificate", RequiresAuthorization = true, ContainsSecretMaterialInResponse = true }); @@ -633,6 +622,26 @@ namespace PSInfisicalAPI.Endpoints RequiresAuthorization = true, ContainsSecretMaterialInResponse = true }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.ListPkiSubscribers, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/projects/{projectId}/pki-subscribers", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GetPkiSubscriber, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/pki/subscribers/{subscriberName}", + RequiresAuthorization = true + }); } public static InfisicalEndpointDefinition Get(string name) diff --git a/src/PSInfisicalAPI/Models/InfisicalPkiSubscriber.cs b/src/PSInfisicalAPI/Models/InfisicalPkiSubscriber.cs new file mode 100644 index 0000000..66a1953 --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalPkiSubscriber.cs @@ -0,0 +1,37 @@ +using System; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalPkiSubscriber + { + public string Id { get; set; } + public string ProjectId { get; set; } + public string CaId { get; set; } + public string Name { get; set; } + public string CommonName { get; set; } + public string Status { get; set; } + public string Ttl { get; set; } + public string[] SubjectAlternativeNames { get; set; } + public string[] KeyUsages { get; set; } + public string[] ExtendedKeyUsages { get; set; } + public bool? EnableAutoRenewal { get; set; } + public int? AutoRenewalPeriodInDays { get; set; } + public string LastOperationStatus { get; set; } + public string LastOperationMessage { get; set; } + public DateTimeOffset? LastOperationAtUtc { get; set; } + public DateTimeOffset? CreatedAtUtc { get; set; } + public DateTimeOffset? UpdatedAtUtc { get; set; } + public InfisicalPkiSubscriberProperties Properties { get; set; } + } + + public sealed class InfisicalPkiSubscriberProperties + { + public string AzureTemplateType { get; set; } + public string Organization { get; set; } + public string OrganizationalUnit { get; set; } + public string Country { get; set; } + public string State { get; set; } + public string Locality { get; set; } + public string EmailAddress { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index ff8de17..a098cf0 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -270,6 +270,74 @@ namespace PSInfisicalAPI.Pki }; } + public InfisicalPkiSubscriber[] ListPkiSubscribers(InfisicalConnection connection, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + + try + { + _logger.Information(Component, "Attempting to list Infisical PKI subscribers. Please Wait..."); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.ListPkiSubscribers, "ListPkiSubscribers", pathParameters, null, null); + string body = response.Body; + response.Clear(); + + List source = ParsePkiSubscriberListBody(body); + InfisicalPkiSubscriber[] mapped = InfisicalPkiSubscriberMapper.MapMany(source, resolvedProjectId); + _logger.Information(Component, "Infisical PKI subscriber list retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical PKI subscriber list retrieval failed."); + throw; + } + } + + public InfisicalPkiSubscriber GetPkiSubscriber(InfisicalConnection connection, string subscriberName, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(subscriberName)) { throw new InfisicalConfigurationException("SubscriberName is required."); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + Dictionary pathParameters = new Dictionary { { "subscriberName", subscriberName } }; + List> query = new List> { new KeyValuePair("projectId", resolvedProjectId) }; + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve Infisical PKI subscriber '", subscriberName, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.GetPkiSubscriber, "GetPkiSubscriber", pathParameters, query, null); + InfisicalPkiSubscriberResponseDto dto = _serializer.Deserialize(response.Body); + response.Clear(); + + InfisicalPkiSubscriber mapped = InfisicalPkiSubscriberMapper.Map(dto, resolvedProjectId); + _logger.Information(Component, "Infisical PKI subscriber retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical PKI subscriber retrieval failed."); + throw; + } + } + + private List ParsePkiSubscriberListBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Array) + { + return token.ToObject>(); + } + + InfisicalPkiSubscriberListResponseDto wrapper = token.ToObject(); + return wrapper != null ? wrapper.Subscribers : null; + } + public InfisicalCertificateBundle GetCertificateBundle(InfisicalConnection connection, string serialNumber) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberDtos.cs new file mode 100644 index 0000000..b424535 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberDtos.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace PSInfisicalAPI.Pki +{ + internal sealed class InfisicalPkiSubscriberResponseDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("projectId")] public string ProjectId { get; set; } + [JsonProperty("caId")] public string CaId { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("commonName")] public string CommonName { get; set; } + [JsonProperty("status")] public string Status { get; set; } + [JsonProperty("ttl")] public string Ttl { get; set; } + [JsonProperty("subjectAlternativeNames")] public List SubjectAlternativeNames { get; set; } + [JsonProperty("keyUsages")] public List KeyUsages { get; set; } + [JsonProperty("extendedKeyUsages")] public List ExtendedKeyUsages { get; set; } + [JsonProperty("enableAutoRenewal")] public bool? EnableAutoRenewal { get; set; } + [JsonProperty("autoRenewalPeriodInDays")] public int? AutoRenewalPeriodInDays { get; set; } + [JsonProperty("lastOperationStatus")] public string LastOperationStatus { get; set; } + [JsonProperty("lastOperationMessage")] public string LastOperationMessage { get; set; } + [JsonProperty("lastOperationAt")] public string LastOperationAt { get; set; } + [JsonProperty("createdAt")] public string CreatedAt { get; set; } + [JsonProperty("updatedAt")] public string UpdatedAt { get; set; } + [JsonProperty("properties")] public InfisicalPkiSubscriberPropertiesDto Properties { get; set; } + } + + internal sealed class InfisicalPkiSubscriberPropertiesDto + { + [JsonProperty("azureTemplateType")] public string AzureTemplateType { get; set; } + [JsonProperty("organization")] public string Organization { get; set; } + [JsonProperty("organizationalUnit")] public string OrganizationalUnit { get; set; } + [JsonProperty("country")] public string Country { get; set; } + [JsonProperty("state")] public string State { get; set; } + [JsonProperty("locality")] public string Locality { get; set; } + [JsonProperty("emailAddress")] public string EmailAddress { get; set; } + } + + internal sealed class InfisicalPkiSubscriberListResponseDto + { + [JsonProperty("subscribers")] public List Subscribers { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberMapper.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberMapper.cs new file mode 100644 index 0000000..1e0284c --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiSubscriberMapper.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Pki +{ + internal static class InfisicalPkiSubscriberMapper + { + public static InfisicalPkiSubscriber Map(InfisicalPkiSubscriberResponseDto dto, string fallbackProjectId) + { + if (dto == null) + { + return null; + } + + return new InfisicalPkiSubscriber + { + Id = dto.Id, + ProjectId = !string.IsNullOrEmpty(dto.ProjectId) ? dto.ProjectId : fallbackProjectId, + CaId = dto.CaId, + Name = dto.Name, + CommonName = dto.CommonName, + Status = dto.Status, + Ttl = dto.Ttl, + SubjectAlternativeNames = dto.SubjectAlternativeNames != null ? dto.SubjectAlternativeNames.ToArray() : null, + KeyUsages = dto.KeyUsages != null ? dto.KeyUsages.ToArray() : null, + ExtendedKeyUsages = dto.ExtendedKeyUsages != null ? dto.ExtendedKeyUsages.ToArray() : null, + EnableAutoRenewal = dto.EnableAutoRenewal, + AutoRenewalPeriodInDays = dto.AutoRenewalPeriodInDays, + LastOperationStatus = dto.LastOperationStatus, + LastOperationMessage = dto.LastOperationMessage, + LastOperationAtUtc = ParseTimestamp(dto.LastOperationAt), + CreatedAtUtc = ParseTimestamp(dto.CreatedAt), + UpdatedAtUtc = ParseTimestamp(dto.UpdatedAt), + Properties = MapProperties(dto.Properties) + }; + } + + public static InfisicalPkiSubscriber[] MapMany(IEnumerable items, string fallbackProjectId) + { + if (items == null) + { + return Array.Empty(); + } + + List results = new List(); + foreach (InfisicalPkiSubscriberResponseDto dto in items) + { + InfisicalPkiSubscriber mapped = Map(dto, fallbackProjectId); + if (mapped != null) + { + results.Add(mapped); + } + } + + return results.ToArray(); + } + + private static InfisicalPkiSubscriberProperties MapProperties(InfisicalPkiSubscriberPropertiesDto dto) + { + if (dto == null) + { + return null; + } + + return new InfisicalPkiSubscriberProperties + { + AzureTemplateType = dto.AzureTemplateType, + Organization = dto.Organization, + OrganizationalUnit = dto.OrganizationalUnit, + Country = dto.Country, + State = dto.State, + Locality = dto.Locality, + EmailAddress = dto.EmailAddress + }; + } + + private static DateTimeOffset? ParseTimestamp(string value) + { + if (string.IsNullOrEmpty(value)) + { + return null; + } + + DateTimeOffset parsed; + if (DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out parsed)) + { + return parsed; + } + + return null; + } + } +} From a34db831d8bf6e603d1c678c953b9704f1939871 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 15:15:32 -0400 Subject: [PATCH 04/27] Rebuild against commit 2489b7a; expand README cmdlets table with per-cmdlet synopses Refreshed Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll and Module/PSInfisicalAPI/PSInfisicalAPI.psd1 so the embedded BuildCommitHash matches the now-checked-in source (was 51bf819, now 2489b7a). CHANGELOG gains the 2026.06.04.1915 build stamp. README cmdlets section now lists all 34 cmdlets grouped by Session/Secrets/Projects/Environments/Folders/Tags/PKI, each with the synopsis pulled verbatim from Get-Help to keep the two surfaces in sync. --- CHANGELOG.md | 6 ++ Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 4 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 284672 -> 284672 bytes README.md | 77 ++++++++++++++++--- 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4efa7a4..db532ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.1915 + +- Build produced from commit 2489b7adca98. + +## Unreleased (carried forward) + ## 2026.06.04.1911 - Build produced from commit 51bf819c37e5. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 20bb1bb..6298fc6 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.1911' + ModuleVersion = '2026.06.04.1915' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -55,7 +55,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '51bf819c37e5' + CommitHash = '2489b7adca98' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index bb515ee94a1250e90b37e81975835b4e95007007..1135d8ae83d210b7ce116953a8b0588b70624a9d 100644 GIT binary patch delta 343 zcmZqJAlR@$a6$)*!OZ$YjXkYBj9Yt{Ze3ukZco3+v_1VIb1IX-yFhFEPZEp0XB%jJ z+UmrX+}85t~$42;b541mZ)&(PA) zR2x}oin*D&d5XD(k-1S)N}@@saf(S|ijlEpqJh!&HddB2PnL7fx~5G3;Kvdm@P^f> zpVN4@$K3T_)5R_Rmrf7xXDL&FidMixf$Bvz8oUp7i2VK0#^UX??a%yKRxq(wv$HY0 zVz1slHHamikl=1*papC}IQ@O9s-(KyeeGs0mPyC5Sb>HqsDf|FqZ#} E0Qnwjs{jB1 diff --git a/README.md b/README.md index 01b3b5b..8dd5838 100644 --- a/README.md +++ b/README.md @@ -28,15 +28,74 @@ Import-Module -Name .\Module\PSInfisicalAPI The module exports 34 cmdlets. Discovery cmdlets (`Get-Infisical*`) use a `List` (default) / single-record parameter-set pair: invoking without the identity parameter returns the collection, supplying the identity parameter returns one record. -| Area | Cmdlets | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Session | `Connect-Infisical`, `Disconnect-Infisical` | -| Secrets | `Get-InfisicalSecret`, `New-InfisicalSecret`, `Update-InfisicalSecret`, `Remove-InfisicalSecret`, `Copy-InfisicalSecret`, `ConvertTo-InfisicalSecretDictionary`, `Export-InfisicalSecrets` | -| Projects | `Get-InfisicalProject`, `New-InfisicalProject`, `Update-InfisicalProject`, `Remove-InfisicalProject` | -| Environments | `Get-InfisicalEnvironment`, `New-InfisicalEnvironment`, `Update-InfisicalEnvironment`, `Remove-InfisicalEnvironment` | -| Folders | `Get-InfisicalFolder`, `New-InfisicalFolder`, `Update-InfisicalFolder`, `Remove-InfisicalFolder` | -| Tags | `Get-InfisicalTag`, `New-InfisicalTag`, `Update-InfisicalTag`, `Remove-InfisicalTag` | -| PKI | `Get-InfisicalCertificateAuthority`, `Get-InfisicalPkiSubscriber`, `Get-InfisicalCertificate`, `Search-InfisicalCertificate`, `Request-InfisicalCertificate`, `ConvertTo-InfisicalCertificate`, `Install-InfisicalCertificate`, `Uninstall-InfisicalCertificate`, `Export-InfisicalCertificate` | +### Session + +| Cmdlet | Purpose | +| ---------------------- | -------------------------------------------------------------------------------------------------- | +| `Connect-Infisical` | Establishes an authenticated session with an Infisical server and stores it for use by subsequent cmdlets. | +| `Disconnect-Infisical` | Clears the current Infisical session from the module-level session manager. | + +### Secrets + +| Cmdlet | Purpose | +| ------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `Get-InfisicalSecret` | Lists or retrieves Infisical secrets within a project, environment, and optional folder path. | +| `New-InfisicalSecret` | Creates a new Infisical secret, with support for SecureString values and bulk creation. | +| `Update-InfisicalSecret` | Updates an existing Infisical secret value, comment, name, or tags. | +| `Remove-InfisicalSecret` | Deletes one or many Infisical secrets by name. | +| `Copy-InfisicalSecret` | Duplicates one or more secrets into a different environment or secret path. | +| `ConvertTo-InfisicalSecretDictionary` | Converts a stream of InfisicalSecret objects into a name-keyed Dictionary of SecureString or plain text values. | +| `Export-InfisicalSecrets` | Exports InfisicalSecret objects to disk or environment variables in a chosen file format. | + +### Projects + +| Cmdlet | Purpose | +| ------------------------- | -------------------------------------------------------------------------------------------------- | +| `Get-InfisicalProject` | Lists or retrieves Infisical projects accessible to the current identity. | +| `New-InfisicalProject` | Creates a new Infisical project in the active organization. | +| `Update-InfisicalProject` | Updates the name, description, or auto-capitalization flag on an existing project. | +| `Remove-InfisicalProject` | Deletes an Infisical project. | + +### Environments + +| Cmdlet | Purpose | +| ----------------------------- | -------------------------------------------------------------------------------------------------- | +| `Get-InfisicalEnvironment` | Lists or retrieves Infisical environments defined on a project. | +| `New-InfisicalEnvironment` | Creates a new environment on an Infisical project. | +| `Update-InfisicalEnvironment` | Updates the name, slug, or sort order of an existing Infisical environment. | +| `Remove-InfisicalEnvironment` | Deletes an Infisical environment from a project. | + +### Folders + +| Cmdlet | Purpose | +| ------------------------ | -------------------------------------------------------------------------------------------------- | +| `Get-InfisicalFolder` | Lists or retrieves Infisical folders at a given secret path. | +| `New-InfisicalFolder` | Creates a new Infisical folder under the supplied parent path. | +| `Update-InfisicalFolder` | Renames an existing Infisical folder. | +| `Remove-InfisicalFolder` | Deletes an Infisical folder and all secrets it contains. | + +### Tags + +| Cmdlet | Purpose | +| --------------------- | -------------------------------------------------------------------------------------------------- | +| `Get-InfisicalTag` | Lists or retrieves Infisical tags defined on a project. | +| `New-InfisicalTag` | Creates a new Infisical tag on a project. | +| `Update-InfisicalTag` | Updates the slug, name, or color of an existing Infisical tag. | +| `Remove-InfisicalTag` | Deletes an Infisical tag from a project. | + +### PKI + +| Cmdlet | Purpose | +| ----------------------------------- | -------------------------------------------------------------------------------------------------- | +| `Get-InfisicalCertificateAuthority` | Lists or retrieves Infisical internal Certificate Authorities. | +| `Get-InfisicalPkiSubscriber` | Lists or retrieves Infisical PKI subscribers in a project. | +| `Get-InfisicalCertificate` | Lists or retrieves Infisical certificates in a project, with optional filters and automatic paging. | +| `Search-InfisicalCertificate` | Searches Infisical certificates with advanced filters and automatic paging. | +| `Request-InfisicalCertificate` | Requests a new Infisical certificate (local CSR + sign) or reuses a still-valid existing one. | +| `ConvertTo-InfisicalCertificate` | Materializes an X509Certificate2 from an Infisical certificate record, bundle, or serial number. | +| `Install-InfisicalCertificate` | Installs an Infisical certificate (and optional chain) into a Windows certificate store. | +| `Uninstall-InfisicalCertificate` | Removes a certificate from a Windows certificate store by thumbprint, subject, or pipeline input. | +| `Export-InfisicalCertificate` | Exports an Infisical certificate to disk in PEM, PFX, or CER format. | Use `Get-Help -Full` for parameter details and `Get-Help about_PSInfisicalAPI` for the module overview. From 29cbac4d13d15d9c0e8573502bd820d93d4a7e4a Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 15:17:30 -0400 Subject: [PATCH 05/27] Build artifacts for a34db83 Rebuild outputs only: Module DLL and manifest now embed BuildCommitHash=a34db831d8bf, matching the source commit they were produced from. CHANGELOG gains the 2026.06.04.1917 build stamp. No source changes. --- CHANGELOG.md | 6 ++++++ Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 4 ++-- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 284672 -> 284672 bytes 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db532ff..e7a80cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.1917 + +- Build produced from commit a34db831d8bf. + +## Unreleased (carried forward) + ## 2026.06.04.1915 - Build produced from commit 2489b7adca98. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 6298fc6..5aa9919 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.1915' + ModuleVersion = '2026.06.04.1917' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -55,7 +55,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '2489b7adca98' + CommitHash = 'a34db831d8bf' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index 1135d8ae83d210b7ce116953a8b0588b70624a9d..d386262ac7533d2ac84730814d7eb384a5cd1a7f 100644 GIT binary patch delta 345 zcmZqJAlR@$a6$)5qqEYy#-7$5#;rX}w=OW&wx?fY+Ma%qIgN>5c3Io{WL4)41xsd> zv8Zj>e&;f?mLX4~u}Mmjg|T6ZMN-;yAyyU>M{_*`1_oP31`8ttBQre%ATrT2v@|r= zMpkN;YGz=ZVwh}ZZjo$hYMf+gZeWsTXlZO|VQ#p+os}iklf`7Q^vCHR{8$16w!MkE z?siStxs#vC=aAL>py>hrEM*E%QR9Uu<4m2z-;zb3OQK`!j!*6-?~4>}(9L z*lV{>4PuFBWHjIYHJHVnG1#0zn<0_Gn8Ac0g&~Q-0?0B1vMhk?GzK$HD}OcFqmw}sIi?fjO9Ng E0Nrk5>;M1& delta 345 zcmZqJAlR@$a6$)*!OZ$YjXkYBj9Yt{Ze3ukZco3+v_1VIa~czWptb!ciN)Tt4YWRO zbzHQPMrL{jKxCq4XlZDw zjjS}q+|1lO#oWTk+$bp}(InM4#UwGs$k;N`z{q@iJ1a}7C(F5KT~nri@M8%Oc*APc z&uKi{WA6H|>EaguOQ#3;vy>@7MJr&UK=mRU4c-SkME?G0WAS#{_GkVqE11};+1VIg zu~%=O8pIOM$Y{F#YcPvDW3VZMHiHp^34;ZLB|{Q}IYS~t3PUoGv;>Nz0QqJ>Yz}5w z0M(fTaT1W12-K0vU<_oLfOQxF*_J?-0Z7gC{!kWIR#OH&27}3lj2hb+!&v?^0sy%3 BX378n From 0f8f44afdb386fa53ba30689494dd37411e947a2 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 15:20:34 -0400 Subject: [PATCH 06/27] Add build.ps1 -CommitArtifacts switch for source/artifact lockstep commits New switch stages and commits only the three build-output paths (Module/PSInfisicalAPI/bin/**, Module/PSInfisicalAPI/PSInfisicalAPI.psd1, CHANGELOG.md) with a message referencing the embedded BuildCommitHash. Mutually exclusive with -CommitOnSuccess. README and CHANGELOG updated to document the recommended two-commit workflow. --- CHANGELOG.md | 10 ++++++---- README.md | 10 ++++++++++ build.ps1 | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7a80cf..21d7fb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,29 +6,31 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +- `build.ps1` gains a `-CommitArtifacts` switch that, after a successful build, stages and commits only the build outputs (`Module/PSInfisicalAPI/bin/**`, `Module/PSInfisicalAPI/PSInfisicalAPI.psd1`, and the auto-inserted `CHANGELOG.md` build stamp) with a message that references the source commit whose hash is now embedded in `BuildCommitHash`. The switch is mutually exclusive with the older broader `-CommitOnSuccess` (which still uses `git add -A`). README extended with a "Committing source and build artifacts in lockstep" section describing the recommended two-commit workflow. + ## 2026.06.04.1917 - Build produced from commit a34db831d8bf. -## Unreleased (carried forward) +## Unreleased (carried forward) ## 2026.06.04.1915 - Build produced from commit 2489b7adca98. -## Unreleased (carried forward) +## Unreleased (carried forward) ## 2026.06.04.1911 - Build produced from commit 51bf819c37e5. -## Unreleased (carried forward) +## Unreleased (carried forward) ## 2026.06.04.1906 - Build produced from commit 51bf819c37e5. -## Unreleased (carried forward) +## Unreleased (carried forward) - **BREAKING**: Removed the plural-noun discovery cmdlets `Get-InfisicalProjects`, `Get-InfisicalEnvironments`, `Get-InfisicalFolders`, `Get-InfisicalTags`, `Get-InfisicalSecrets`, and `Get-InfisicalCertificates`. Their behavior is now folded into the corresponding singular cmdlets via a `List` (default) / single-record parameter set pair, matching the existing `Get-InfisicalCertificateAuthority` precedent. Callers should drop the trailing `s`; invocation without the identity parameter (`-ProjectId`, `-EnvironmentSlugOrId`, `-FolderNameOrId`, `-TagSlugOrId`, `-SecretName`, `-SerialNumber`) now returns the list, and supplying the identity parameter returns the single record. No back-compat aliases were added. - Added `Get-InfisicalPkiSubscriber` with `List` (default) and `ByName` parameter sets, backed by new `InfisicalPkiClient.ListPkiSubscribers` and `GetPkiSubscriber` methods, an `InfisicalPkiSubscriber` model, and corresponding DTOs/mapper. Use the emitted `Name` (slug) on `Request-InfisicalCertificate -PkiSubscriberSlug`. diff --git a/README.md b/README.md index 8dd5838..9ce60c7 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,16 @@ After adding (or removing) a cmdlet: 4. Add a `## Unreleased` entry to `CHANGELOG.md` describing the change (mark removals of public cmdlets or parameters as **BREAKING**). 5. Run `./build.ps1 -RunTests`. The script enforces the cmdlet list, runs the xUnit suite, and verifies that every exported cmdlet has a valid synopsis, description, and at least one non-empty example. +### Committing source and build artifacts in lockstep + +The embedded `BuildCommitHash` in `Module/PSInfisicalAPI/PSInfisicalAPI.psd1` and the bundled DLL is captured from `git rev-parse HEAD` at build time. To keep the embedded hash truthful, commit source and build artifacts as two ordered commits: + +1. Stage and commit your source changes first. Suppose this produces commit `S`. +2. Run `./build.ps1 -RunTests -CommitArtifacts`. The build picks up `S` as `HEAD`, embeds it as `BuildCommitHash`, then stages and commits **only** the build outputs (`Module/PSInfisicalAPI/bin/**`, `Module/PSInfisicalAPI/PSInfisicalAPI.psd1`, and the `CHANGELOG.md` build-stamp insertion). The commit message references `S` so the binary commit always traces back to its source. +3. `git push`. + +`-CommitArtifacts` only touches the three artifact paths above; any other dirty files in your working tree are left alone. Use the older `-CommitOnSuccess` switch only when you intentionally want a single commit covering everything (`git add -A` + `git commit -m "Build "`); the two switches are mutually exclusive. + ## Continuous integration `.gitea/workflows/publish-psgallery.yml` publishes the module to the PowerShell Gallery whenever a pull request is merged into `main`. The workflow expects a repository secret named `PSGALLERY_API_KEY` containing a valid Gallery API key. diff --git a/build.ps1 b/build.ps1 index 26088be..301e5ac 100644 --- a/build.ps1 +++ b/build.ps1 @@ -15,9 +15,15 @@ param( [switch]$CommitOnSuccess, + [switch]$CommitArtifacts, + [switch]$Force ) +if ($CommitOnSuccess.IsPresent -and $CommitArtifacts.IsPresent) { + throw "-CommitOnSuccess and -CommitArtifacts are mutually exclusive." +} + $ErrorActionPreference = 'Stop' Set-StrictMode -Version Latest @@ -390,4 +396,30 @@ if ($CommitOnSuccess.IsPresent) { if ($LASTEXITCODE -ne 0) { throw "git commit failed." } } +if ($CommitArtifacts.IsPresent) { + Write-Step "Committing build artifacts (embedded BuildCommitHash=$commitHash)" + $artifactPaths = @( + [System.IO.Path]::Combine('Module', 'PSInfisicalAPI', 'bin'), + [System.IO.Path]::Combine('Module', 'PSInfisicalAPI', 'PSInfisicalAPI.psd1'), + 'CHANGELOG.md' + ) + + foreach ($artifactPath in $artifactPaths) { + & git -C $RepositoryRoot.FullName add -- $artifactPath + if ($LASTEXITCODE -ne 0) { throw "git add '$artifactPath' failed." } + } + + $stagedOutput = & git -C $RepositoryRoot.FullName diff --cached --name-only + if ($LASTEXITCODE -ne 0) { throw "git diff --cached failed." } + $stagedFiles = @($stagedOutput | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) + if ($stagedFiles.Count -eq 0) { + Write-Step "No build artifact changes to commit." + } else { + $subject = "Build artifacts for $commitHash" + $body = "Auto-generated by build.ps1 -CommitArtifacts. Build $buildVersion. Module DLL and manifest embed BuildCommitHash=$commitHash, matching the source commit they were produced from." + & git -C $RepositoryRoot.FullName commit -m $subject -m $body + if ($LASTEXITCODE -ne 0) { throw "git commit failed." } + } +} + Write-Step "Build complete." From 8e7ab3570a0f342f3adf673ffdb4941d9905db69 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 15:20:55 -0400 Subject: [PATCH 07/27] Build artifacts for 0f8f44afdb38 Auto-generated by build.ps1 -CommitArtifacts. Build 2026.06.04.1920. Module DLL and manifest embed BuildCommitHash=0f8f44afdb38, matching the source commit they were produced from. --- CHANGELOG.md | 6 ++++++ Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 4 ++-- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 284672 -> 284672 bytes 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d7fb3..283dc4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.1920 + +- Build produced from commit 0f8f44afdb38. + +## Unreleased (carried forward) + - `build.ps1` gains a `-CommitArtifacts` switch that, after a successful build, stages and commits only the build outputs (`Module/PSInfisicalAPI/bin/**`, `Module/PSInfisicalAPI/PSInfisicalAPI.psd1`, and the auto-inserted `CHANGELOG.md` build stamp) with a message that references the source commit whose hash is now embedded in `BuildCommitHash`. The switch is mutually exclusive with the older broader `-CommitOnSuccess` (which still uses `git add -A`). README extended with a "Committing source and build artifacts in lockstep" section describing the recommended two-commit workflow. ## 2026.06.04.1917 diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 5aa9919..da15a74 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.1917' + ModuleVersion = '2026.06.04.1920' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -55,7 +55,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = 'a34db831d8bf' + CommitHash = '0f8f44afdb38' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index d386262ac7533d2ac84730814d7eb384a5cd1a7f..1b68389ed03f96fcc91a8cfd685ef53dd47d0460 100644 GIT binary patch delta 353 zcmZqJAlR@$a6$*mFO75e8hcuM7`OH?-MYZo(4KygX?yxb=2Rwu%&SN33|hTiyKT07 zo+{oPx&6*%W-UV=gEWgY6O+WWlq6$|=|Ze5#!f~CdIk&(wu}rGMg~S^dImsbqGxDn zWT1_#)+{a2)Ho^8*uc!f(!|mvCB@j>#LzI+(!@N`XnQ*=OR6V}_vG!Hr+@Hc2@o(n zHse_Oa$eu|V>@^1eb#+4J;0x(OaUrtdmJhXRByaGhuyY4xns7gHaCRa6riHUC!wMs^@qRMytWYdCZFee@YVKb{wyn)*lXF@ z7+$g0Zl4;&63fVJ$Y8$xYcPu|V4 From 5e6364f9e00031a05b76593917e62550cd867969 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 16:43:44 -0400 Subject: [PATCH 08/27] Surface Infisical API error body in thrown exceptions Parse the JSON envelope (message/error/reqId) returned by 4xx/5xx responses and include the human-readable message in the InfisicalApiException message itself, plus new ApiErrorMessage and ApiRequestId properties. InfisicalErrorDetails and the error handler propagate the new fields so PowerShell error records and the logger surface the server-side reason instead of an opaque status line. --- CHANGELOG.md | 4 +- .../Errors/InfisicalApiErrorEnvelope.cs | 119 ++++++++++++++++++ .../Errors/InfisicalErrorDetails.cs | 2 + .../Errors/InfisicalErrorHandler.cs | 12 ++ .../Errors/InfisicalException.cs | 2 + .../Http/InfisicalApiInvoker.cs | 7 +- .../Secrets/InfisicalSecretsClient.cs | 7 +- 7 files changed, 144 insertions(+), 9 deletions(-) create mode 100644 src/PSInfisicalAPI/Errors/InfisicalApiErrorEnvelope.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 283dc4a..c5bfbdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +- Infisical API error responses are now parsed to surface the server-side `message`, `error`, and `reqId` fields. The 4xx/5xx exception message includes the human-readable explanation (e.g. "The project is of type secret-manager") instead of an opaque `Infisical API returned 400 (Bad Request)`. The `InfisicalApiException` gains `ApiErrorMessage` and `ApiRequestId` properties; `InfisicalErrorDetails` carries the same fields so PowerShell error records and logger output expose them. + ## 2026.06.04.1920 - Build produced from commit 0f8f44afdb38. -## Unreleased (carried forward) +## Unreleased (carried forward) - `build.ps1` gains a `-CommitArtifacts` switch that, after a successful build, stages and commits only the build outputs (`Module/PSInfisicalAPI/bin/**`, `Module/PSInfisicalAPI/PSInfisicalAPI.psd1`, and the auto-inserted `CHANGELOG.md` build stamp) with a message that references the source commit whose hash is now embedded in `BuildCommitHash`. The switch is mutually exclusive with the older broader `-CommitOnSuccess` (which still uses `git add -A`). README extended with a "Committing source and build artifacts in lockstep" section describing the recommended two-commit workflow. diff --git a/src/PSInfisicalAPI/Errors/InfisicalApiErrorEnvelope.cs b/src/PSInfisicalAPI/Errors/InfisicalApiErrorEnvelope.cs new file mode 100644 index 0000000..831a1ed --- /dev/null +++ b/src/PSInfisicalAPI/Errors/InfisicalApiErrorEnvelope.cs @@ -0,0 +1,119 @@ +using System; +using Newtonsoft.Json.Linq; + +namespace PSInfisicalAPI.Errors +{ + internal static class InfisicalApiErrorEnvelope + { + public static void Enrich(InfisicalApiException exception, string body) + { + if (exception == null || string.IsNullOrEmpty(body)) + { + return; + } + + string trimmed = body.TrimStart(); + if (trimmed.Length == 0 || (trimmed[0] != '{' && trimmed[0] != '[')) + { + return; + } + + JObject obj; + try + { + JToken token = JToken.Parse(body); + if (token.Type != JTokenType.Object) { return; } + obj = (JObject)token; + } + catch (Exception) + { + return; + } + + string message = ReadString(obj, "message"); + string error = ReadString(obj, "error"); + string reqId = ReadString(obj, "reqId"); + + if (!string.IsNullOrEmpty(message)) { exception.ApiErrorMessage = message; } + if (!string.IsNullOrEmpty(error) && string.IsNullOrEmpty(exception.ApiErrorCode)) { exception.ApiErrorCode = error; } + if (!string.IsNullOrEmpty(reqId)) { exception.ApiRequestId = reqId; } + } + + public static string BuildExceptionMessage(int statusCode, string reasonPhrase, string body) + { + string baseMessage = string.Concat( + "Infisical API returned ", + statusCode.ToString(System.Globalization.CultureInfo.InvariantCulture), + " (", reasonPhrase ?? string.Empty, ")."); + + string apiMessage = null; + string apiError = null; + string reqId = null; + + if (!string.IsNullOrEmpty(body)) + { + string trimmed = body.TrimStart(); + if (trimmed.Length > 0 && trimmed[0] == '{') + { + try + { + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Object) + { + JObject obj = (JObject)token; + apiMessage = ReadString(obj, "message"); + apiError = ReadString(obj, "error"); + reqId = ReadString(obj, "reqId"); + } + } + catch (Exception) + { + } + } + } + + if (string.IsNullOrEmpty(apiMessage) && string.IsNullOrEmpty(apiError) && string.IsNullOrEmpty(reqId)) + { + return baseMessage; + } + + System.Text.StringBuilder builder = new System.Text.StringBuilder(baseMessage); + if (!string.IsNullOrEmpty(apiMessage)) + { + builder.Append(' ').Append(apiMessage); + } + + if (!string.IsNullOrEmpty(apiError) || !string.IsNullOrEmpty(reqId)) + { + builder.Append(" ["); + bool needsSeparator = false; + if (!string.IsNullOrEmpty(apiError)) + { + builder.Append("error=").Append(apiError); + needsSeparator = true; + } + + if (!string.IsNullOrEmpty(reqId)) + { + if (needsSeparator) { builder.Append("; "); } + builder.Append("reqId=").Append(reqId); + } + + builder.Append(']'); + } + + return builder.ToString(); + } + + private static string ReadString(JObject obj, string name) + { + JToken token; + if (obj.TryGetValue(name, StringComparison.OrdinalIgnoreCase, out token) && token != null && token.Type == JTokenType.String) + { + return (string)token; + } + + return null; + } + } +} diff --git a/src/PSInfisicalAPI/Errors/InfisicalErrorDetails.cs b/src/PSInfisicalAPI/Errors/InfisicalErrorDetails.cs index c02a0ae..2cd0aca 100644 --- a/src/PSInfisicalAPI/Errors/InfisicalErrorDetails.cs +++ b/src/PSInfisicalAPI/Errors/InfisicalErrorDetails.cs @@ -10,6 +10,8 @@ namespace PSInfisicalAPI.Errors public int? StatusCode { get; set; } public string ReasonPhrase { get; set; } public string ApiErrorCode { get; set; } + public string ApiErrorMessage { get; set; } + public string ApiRequestId { get; set; } public string SanitizedBody { get; set; } public int? LineNumber { get; set; } public int? LinePosition { get; set; } diff --git a/src/PSInfisicalAPI/Errors/InfisicalErrorHandler.cs b/src/PSInfisicalAPI/Errors/InfisicalErrorHandler.cs index 0da799e..33bc109 100644 --- a/src/PSInfisicalAPI/Errors/InfisicalErrorHandler.cs +++ b/src/PSInfisicalAPI/Errors/InfisicalErrorHandler.cs @@ -26,6 +26,8 @@ namespace PSInfisicalAPI.Errors details.StatusCode = apiException.StatusCode; details.ReasonPhrase = apiException.ReasonPhrase; details.ApiErrorCode = apiException.ApiErrorCode; + details.ApiErrorMessage = apiException.ApiErrorMessage; + details.ApiRequestId = apiException.ApiRequestId; details.SanitizedBody = apiException.SanitizedBody; details.EndpointName = apiException.EndpointName; details.RequestMethod = apiException.RequestMethod; @@ -70,6 +72,16 @@ namespace PSInfisicalAPI.Errors logger.Error(Component, string.Concat("API Error Code: ", details.ApiErrorCode)); } + if (!string.IsNullOrEmpty(details.ApiErrorMessage)) + { + logger.Error(Component, string.Concat("API Error Message: ", details.ApiErrorMessage)); + } + + if (!string.IsNullOrEmpty(details.ApiRequestId)) + { + logger.Error(Component, string.Concat("API Request Id: ", details.ApiRequestId)); + } + if (details.LineNumber.HasValue) { logger.Error(Component, string.Concat("Line: ", details.LineNumber.Value.ToString(CultureInfo.InvariantCulture))); diff --git a/src/PSInfisicalAPI/Errors/InfisicalException.cs b/src/PSInfisicalAPI/Errors/InfisicalException.cs index 88979e9..98f2c1f 100644 --- a/src/PSInfisicalAPI/Errors/InfisicalException.cs +++ b/src/PSInfisicalAPI/Errors/InfisicalException.cs @@ -33,6 +33,8 @@ namespace PSInfisicalAPI.Errors public int StatusCode { get; set; } public string ReasonPhrase { get; set; } public string ApiErrorCode { get; set; } + public string ApiErrorMessage { get; set; } + public string ApiRequestId { get; set; } public string SanitizedBody { get; set; } public string EndpointName { get; set; } public string RequestMethod { get; set; } diff --git a/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs b/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs index ffd988e..a3e2b1a 100644 --- a/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs +++ b/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs @@ -135,15 +135,14 @@ namespace PSInfisicalAPI.Http private static InfisicalApiException BuildApiException(InfisicalHttpResponse response, InfisicalEndpointDefinition definition) { - InfisicalApiException exception = new InfisicalApiException(string.Concat( - "Infisical API returned ", - response.StatusCode.ToString(CultureInfo.InvariantCulture), - " (", response.ReasonPhrase ?? string.Empty, ").")); + string message = InfisicalApiErrorEnvelope.BuildExceptionMessage(response.StatusCode, response.ReasonPhrase, response.Body); + InfisicalApiException exception = new InfisicalApiException(message); exception.StatusCode = response.StatusCode; exception.ReasonPhrase = response.ReasonPhrase; exception.EndpointName = definition.Name; exception.RequestMethod = definition.Method; exception.SanitizedBody = response.Body; + InfisicalApiErrorEnvelope.Enrich(exception, response.Body); return exception; } } diff --git a/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs b/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs index 8e4161b..fb386ac 100644 --- a/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs +++ b/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs @@ -625,15 +625,14 @@ namespace PSInfisicalAPI.Secrets private static InfisicalApiException BuildApiException(InfisicalHttpResponse response, InfisicalEndpointDefinition definition) { - InfisicalApiException exception = new InfisicalApiException(string.Concat( - "Infisical API returned ", - response.StatusCode.ToString(CultureInfo.InvariantCulture), - " (", response.ReasonPhrase ?? string.Empty, ").")); + string message = InfisicalApiErrorEnvelope.BuildExceptionMessage(response.StatusCode, response.ReasonPhrase, response.Body); + InfisicalApiException exception = new InfisicalApiException(message); exception.StatusCode = response.StatusCode; exception.ReasonPhrase = response.ReasonPhrase; exception.EndpointName = definition.Name; exception.RequestMethod = definition.Method; exception.SanitizedBody = response.Body; + InfisicalApiErrorEnvelope.Enrich(exception, response.Body); return exception; } From 2140ffe8ff6a84f45f36d4e6b763e6042cdce4f6 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 16:49:56 -0400 Subject: [PATCH 09/27] Add Get-InfisicalCertificateProfile cmdlet Covers GET /api/v1/cert-manager/certificate-profiles (List default with optional -Limit, -Offset, -IncludeConfigs) and GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId} (ById). New InfisicalCertificateProfile model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages with polymorphic string-or-array shapes flattened) and embedded CA/policy/apiConfig summaries. Manifest, build expected list, and MAML help updated. --- CHANGELOG.md | 1 + .../en-US/PSInfisicalAPI.dll-Help.xml | 42 +++++ build.ps1 | 3 +- .../GetInfisicalCertificateProfileCmdlet.cs | 57 +++++++ .../Endpoints/InfisicalEndpointNames.cs | 3 + .../Endpoints/InfisicalEndpointRegistry.cs | 20 +++ .../Models/InfisicalCertificateProfile.cs | 58 +++++++ .../Pki/InfisicalCertificateProfileDtos.cs | 66 ++++++++ .../Pki/InfisicalCertificateProfileMapper.cs | 155 ++++++++++++++++++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 89 ++++++++++ 10 files changed, 493 insertions(+), 1 deletion(-) create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs create mode 100644 src/PSInfisicalAPI/Models/InfisicalCertificateProfile.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificateProfileDtos.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificateProfileMapper.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index c5bfbdb..3c0b34b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased - Infisical API error responses are now parsed to surface the server-side `message`, `error`, and `reqId` fields. The 4xx/5xx exception message includes the human-readable explanation (e.g. "The project is of type secret-manager") instead of an opaque `Infisical API returned 400 (Bad Request)`. The `InfisicalApiException` gains `ApiErrorMessage` and `ApiRequestId` properties; `InfisicalErrorDetails` carries the same fields so PowerShell error records and logger output expose them. +- `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. ## 2026.06.04.1920 diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index 8540047..15a12f8 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -1128,6 +1128,48 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu + + + Get-InfisicalCertificateProfile + Lists or retrieves Infisical certificate profiles in a project. + Get + InfisicalCertificateProfile + + + Default (List parameter set) returns every certificate profile configured on the project via /api/v1/cert-manager/certificate-profiles, with optional -Limit, -Offset, and -IncludeConfigs. When -ProfileId is supplied (ById parameter set) the cmdlet returns one profile by its id. -ProjectId defaults to the session-pinned project in both modes. + + + Notes + + Profiles bind a CA and a certificate policy and surface defaults (TtlDays, KeyAlgorithm, KeyUsages, ExtendedKeyUsages). Use the returned profile Id when wiring profile-based issuance against Request-InfisicalCertificate. + + + + + EXAMPLE 1 + Get-InfisicalCertificateProfile + Lists every certificate profile defined on the session-pinned project. + + + EXAMPLE 2 + Get-InfisicalCertificateProfile -ProfileId '8257641e-c808-454e-ac92-8dc920be865f' + Retrieves a single certificate profile by id from the session-pinned project. + + + EXAMPLE 3 + $GetInfisicalCertificateProfileListResult = Get-InfisicalCertificateProfile | Where-Object { $_.Slug -ieq 'codesigning' } + +$GetInfisicalCertificateProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateProfileParameters.ProfileId = $GetInfisicalCertificateProfileListResult[0].Id +$GetInfisicalCertificateProfileParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateProfileParameters.Verbose = $True + +$GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfisicalCertificateProfileParameters + Filters profiles whose slug equals 'codesigning' and refetches the canonical record for the first match using a splatted parameter set. + + + + Search-InfisicalCertificate diff --git a/build.ps1 b/build.ps1 index 301e5ac..d5db70a 100644 --- a/build.ps1 +++ b/build.ps1 @@ -131,6 +131,7 @@ function Write-Manifest { 'Remove-InfisicalTag', 'Get-InfisicalCertificateAuthority', 'Get-InfisicalPkiSubscriber', + 'Get-InfisicalCertificateProfile', 'Get-InfisicalCertificate', 'Search-InfisicalCertificate', 'Request-InfisicalCertificate', @@ -202,7 +203,7 @@ if (`$cmds.Count -eq 0) { throw "No cmdlets were exported by the PSInfisicalAPI module." } -`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') +`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') foreach (`$expected in `$expectedCmds) { if (-not (Get-Command -Name `$expected -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { throw "Cmdlet not found: `$expected" diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs new file mode 100644 index 0000000..7f20258 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs @@ -0,0 +1,57 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalCertificateProfile", DefaultParameterSetName = "List")] + [OutputType(typeof(InfisicalCertificateProfile))] + public sealed class GetInfisicalCertificateProfileCmdlet : InfisicalCmdletBase + { + [Parameter(ParameterSetName = "ById", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Id", "CertificateProfileId")] + public string ProfileId { get; set; } + + [Parameter] public string ProjectId { get; set; } + + [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } + + [Parameter(ParameterSetName = "List")] public int? Offset { get; set; } + + [Parameter(ParameterSetName = "List")] public SwitchParameter IncludeConfigs { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) + { + InfisicalCertificateProfile profile = client.GetCertificateProfile(connection, ProfileId, resolvedProjectId); + if (profile != null) + { + WriteObject(profile); + } + + return; + } + + bool? includeConfigs = MyInvocation.BoundParameters.ContainsKey("IncludeConfigs") ? (bool?)IncludeConfigs.IsPresent : null; + InfisicalCertificateProfile[] all = client.ListCertificateProfiles(connection, resolvedProjectId, Limit, Offset, includeConfigs); + foreach (InfisicalCertificateProfile profile in all) + { + WriteObject(profile); + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalCertificateProfileCmdlet", "GetCertificateProfile", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index a4b70de..779bba9 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -54,5 +54,8 @@ namespace PSInfisicalAPI.Endpoints public const string ListPkiSubscribers = "ListPkiSubscribers"; public const string GetPkiSubscriber = "GetPkiSubscriber"; + + public const string ListCertificateProfiles = "ListCertificateProfiles"; + public const string GetCertificateProfile = "GetCertificateProfile"; } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index 24d9131..e1ae4fe 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -642,6 +642,26 @@ namespace PSInfisicalAPI.Endpoints Template = "/api/v1/pki/subscribers/{subscriberName}", RequiresAuthorization = true }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.ListCertificateProfiles, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/certificate-profiles", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GetCertificateProfile, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/certificate-profiles/{certificateProfileId}", + RequiresAuthorization = true + }); } public static InfisicalEndpointDefinition Get(string name) diff --git a/src/PSInfisicalAPI/Models/InfisicalCertificateProfile.cs b/src/PSInfisicalAPI/Models/InfisicalCertificateProfile.cs new file mode 100644 index 0000000..0497414 --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalCertificateProfile.cs @@ -0,0 +1,58 @@ +using System; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalCertificateProfile + { + public string Id { get; set; } + public string ProjectId { get; set; } + public string CaId { get; set; } + public string CertificatePolicyId { get; set; } + public string Slug { get; set; } + public string Description { get; set; } + public string EnrollmentType { get; set; } + public string IssuerType { get; set; } + public string EstConfigId { get; set; } + public string ApiConfigId { get; set; } + public string AcmeConfigId { get; set; } + public string ScepConfigId { get; set; } + public DateTimeOffset? CreatedAtUtc { get; set; } + public DateTimeOffset? UpdatedAtUtc { get; set; } + public InfisicalCertificateProfileDefaults Defaults { get; set; } + public InfisicalCertificateAuthoritySummary CertificateAuthority { get; set; } + public InfisicalCertificatePolicySummary CertificatePolicy { get; set; } + public InfisicalCertificateProfileApiConfig ApiConfig { get; set; } + } + + public sealed class InfisicalCertificateProfileDefaults + { + public int? TtlDays { get; set; } + public string KeyAlgorithm { get; set; } + public string SignatureAlgorithm { get; set; } + public string[] KeyUsages { get; set; } + public string[] ExtendedKeyUsages { get; set; } + } + + public sealed class InfisicalCertificateAuthoritySummary + { + public string Id { get; set; } + public string Status { get; set; } + public string Name { get; set; } + public bool? IsExternal { get; set; } + public string ExternalType { get; set; } + } + + public sealed class InfisicalCertificatePolicySummary + { + public string Id { get; set; } + public string ProjectId { get; set; } + public string Name { get; set; } + } + + public sealed class InfisicalCertificateProfileApiConfig + { + public string Id { get; set; } + public bool? AutoRenew { get; set; } + public int? RenewBeforeDays { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificateProfileDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificateProfileDtos.cs new file mode 100644 index 0000000..8c9fb32 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificateProfileDtos.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace PSInfisicalAPI.Pki +{ + internal sealed class InfisicalCertificateProfileResponseDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("projectId")] public string ProjectId { get; set; } + [JsonProperty("caId")] public string CaId { get; set; } + [JsonProperty("certificatePolicyId")] public string CertificatePolicyId { get; set; } + [JsonProperty("slug")] public string Slug { get; set; } + [JsonProperty("description")] public string Description { get; set; } + [JsonProperty("enrollmentType")] public string EnrollmentType { get; set; } + [JsonProperty("issuerType")] public string IssuerType { get; set; } + [JsonProperty("estConfigId")] public string EstConfigId { get; set; } + [JsonProperty("apiConfigId")] public string ApiConfigId { get; set; } + [JsonProperty("acmeConfigId")] public string AcmeConfigId { get; set; } + [JsonProperty("scepConfigId")] public string ScepConfigId { get; set; } + [JsonProperty("createdAt")] public string CreatedAt { get; set; } + [JsonProperty("updatedAt")] public string UpdatedAt { get; set; } + [JsonProperty("defaults")] public InfisicalCertificateProfileDefaultsDto Defaults { get; set; } + [JsonProperty("certificateAuthority")] public InfisicalCertificateAuthoritySummaryDto CertificateAuthority { get; set; } + [JsonProperty("certificatePolicy")] public InfisicalCertificatePolicySummaryDto CertificatePolicy { get; set; } + [JsonProperty("apiConfig")] public InfisicalCertificateProfileApiConfigDto ApiConfig { get; set; } + } + + internal sealed class InfisicalCertificateProfileDefaultsDto + { + [JsonProperty("ttlDays")] public int? TtlDays { get; set; } + [JsonProperty("keyAlgorithm")] public string KeyAlgorithm { get; set; } + [JsonProperty("signatureAlgorithm")] public string SignatureAlgorithm { get; set; } + [JsonProperty("keyUsages")] public JToken KeyUsagesRaw { get; set; } + [JsonProperty("extendedKeyUsages")] public JToken ExtendedKeyUsagesRaw { get; set; } + } + + internal sealed class InfisicalCertificateAuthoritySummaryDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("status")] public string Status { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("isExternal")] public bool? IsExternal { get; set; } + [JsonProperty("externalType")] public string ExternalType { get; set; } + } + + internal sealed class InfisicalCertificatePolicySummaryDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("projectId")] public string ProjectId { get; set; } + [JsonProperty("name")] public string Name { get; set; } + } + + internal sealed class InfisicalCertificateProfileApiConfigDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("autoRenew")] public bool? AutoRenew { get; set; } + [JsonProperty("renewBeforeDays")] public int? RenewBeforeDays { get; set; } + } + + internal sealed class InfisicalCertificateProfileListResponseDto + { + [JsonProperty("certificateProfiles")] public List CertificateProfiles { get; set; } + [JsonProperty("totalCount")] public int? TotalCount { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificateProfileMapper.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificateProfileMapper.cs new file mode 100644 index 0000000..7550ff1 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificateProfileMapper.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Linq; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Pki +{ + internal static class InfisicalCertificateProfileMapper + { + public static InfisicalCertificateProfile Map(InfisicalCertificateProfileResponseDto dto, string fallbackProjectId) + { + if (dto == null) + { + return null; + } + + return new InfisicalCertificateProfile + { + Id = dto.Id, + ProjectId = !string.IsNullOrEmpty(dto.ProjectId) ? dto.ProjectId : fallbackProjectId, + CaId = dto.CaId, + CertificatePolicyId = dto.CertificatePolicyId, + Slug = dto.Slug, + Description = dto.Description, + EnrollmentType = dto.EnrollmentType, + IssuerType = dto.IssuerType, + EstConfigId = dto.EstConfigId, + ApiConfigId = dto.ApiConfigId, + AcmeConfigId = dto.AcmeConfigId, + ScepConfigId = dto.ScepConfigId, + CreatedAtUtc = ParseTimestamp(dto.CreatedAt), + UpdatedAtUtc = ParseTimestamp(dto.UpdatedAt), + Defaults = MapDefaults(dto.Defaults), + CertificateAuthority = MapCa(dto.CertificateAuthority), + CertificatePolicy = MapPolicy(dto.CertificatePolicy), + ApiConfig = MapApiConfig(dto.ApiConfig) + }; + } + + public static InfisicalCertificateProfile[] MapMany(IEnumerable items, string fallbackProjectId) + { + if (items == null) + { + return Array.Empty(); + } + + List results = new List(); + foreach (InfisicalCertificateProfileResponseDto dto in items) + { + InfisicalCertificateProfile mapped = Map(dto, fallbackProjectId); + if (mapped != null) + { + results.Add(mapped); + } + } + + return results.ToArray(); + } + + private static InfisicalCertificateProfileDefaults MapDefaults(InfisicalCertificateProfileDefaultsDto dto) + { + if (dto == null) + { + return null; + } + + return new InfisicalCertificateProfileDefaults + { + TtlDays = dto.TtlDays, + KeyAlgorithm = dto.KeyAlgorithm, + SignatureAlgorithm = dto.SignatureAlgorithm, + KeyUsages = FlattenStringOrStringArray(dto.KeyUsagesRaw), + ExtendedKeyUsages = FlattenStringOrStringArray(dto.ExtendedKeyUsagesRaw) + }; + } + + private static InfisicalCertificateAuthoritySummary MapCa(InfisicalCertificateAuthoritySummaryDto dto) + { + if (dto == null) + { + return null; + } + + return new InfisicalCertificateAuthoritySummary + { + Id = dto.Id, + Status = dto.Status, + Name = dto.Name, + IsExternal = dto.IsExternal, + ExternalType = dto.ExternalType + }; + } + + private static InfisicalCertificatePolicySummary MapPolicy(InfisicalCertificatePolicySummaryDto dto) + { + if (dto == null) + { + return null; + } + + return new InfisicalCertificatePolicySummary + { + Id = dto.Id, + ProjectId = dto.ProjectId, + Name = dto.Name + }; + } + + private static InfisicalCertificateProfileApiConfig MapApiConfig(InfisicalCertificateProfileApiConfigDto dto) + { + if (dto == null) + { + return null; + } + + return new InfisicalCertificateProfileApiConfig + { + Id = dto.Id, + AutoRenew = dto.AutoRenew, + RenewBeforeDays = dto.RenewBeforeDays + }; + } + + internal static string[] FlattenStringOrStringArray(JToken token) + { + if (token == null || token.Type == JTokenType.Null) { return null; } + if (token.Type == JTokenType.String) { return new[] { (string)token }; } + if (token.Type == JTokenType.Array) + { + List items = new List(); + foreach (JToken child in (JArray)token) + { + if (child != null && child.Type == JTokenType.String) { items.Add((string)child); } + } + + return items.ToArray(); + } + + return null; + } + + private static DateTimeOffset? ParseTimestamp(string value) + { + if (string.IsNullOrEmpty(value)) { return null; } + DateTimeOffset parsed; + if (DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out parsed)) + { + return parsed; + } + + return null; + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index a098cf0..da03488 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -338,6 +338,95 @@ namespace PSInfisicalAPI.Pki return wrapper != null ? wrapper.Subscribers : null; } + public InfisicalCertificateProfile[] ListCertificateProfiles(InfisicalConnection connection, string projectId, int? limit, int? offset, bool? includeConfigs) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + List> query = new List> + { + new KeyValuePair("projectId", resolvedProjectId) + }; + if (limit.HasValue) { query.Add(new KeyValuePair("limit", limit.Value.ToString(CultureInfo.InvariantCulture))); } + if (offset.HasValue) { query.Add(new KeyValuePair("offset", offset.Value.ToString(CultureInfo.InvariantCulture))); } + if (includeConfigs.HasValue) { query.Add(new KeyValuePair("includeConfigs", includeConfigs.Value ? "true" : "false")); } + + try + { + _logger.Information(Component, "Attempting to list Infisical certificate profiles. Please Wait..."); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.ListCertificateProfiles, "ListCertificateProfiles", null, query, null); + string body = response.Body; + response.Clear(); + + List source = ParseCertificateProfileListBody(body); + InfisicalCertificateProfile[] mapped = InfisicalCertificateProfileMapper.MapMany(source, resolvedProjectId); + _logger.Information(Component, "Infisical certificate profile list retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate profile list retrieval failed."); + throw; + } + } + + public InfisicalCertificateProfile GetCertificateProfile(InfisicalConnection connection, string certificateProfileId, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(certificateProfileId)) { throw new InfisicalConfigurationException("CertificateProfileId is required."); } + + Dictionary pathParameters = new Dictionary { { "certificateProfileId", certificateProfileId } }; + List> query = null; + if (!string.IsNullOrEmpty(projectId)) + { + query = new List> { new KeyValuePair("projectId", projectId) }; + } + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve Infisical certificate profile '", certificateProfileId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.GetCertificateProfile, "GetCertificateProfile", pathParameters, query, null); + string body = response.Body; + response.Clear(); + + InfisicalCertificateProfileResponseDto inner = ParseCertificateProfileSingleBody(body); + string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; + InfisicalCertificateProfile mapped = InfisicalCertificateProfileMapper.Map(inner, fallbackProjectId); + _logger.Information(Component, "Infisical certificate profile retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate profile retrieval failed."); + throw; + } + } + + private List ParseCertificateProfileListBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Array) + { + return token.ToObject>(); + } + + InfisicalCertificateProfileListResponseDto wrapper = token.ToObject(); + return wrapper != null ? wrapper.CertificateProfiles : null; + } + + private InfisicalCertificateProfileResponseDto ParseCertificateProfileSingleBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type != JTokenType.Object) { return null; } + JObject obj = (JObject)token; + + if (obj["certificateProfile"] is JObject inner) { return inner.ToObject(); } + return obj.ToObject(); + } + public InfisicalCertificateBundle GetCertificateBundle(InfisicalConnection connection, string serialNumber) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } From 9efdafb7fb577fa81b574f31806b732777b45651 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 16:53:52 -0400 Subject: [PATCH 10/27] Add Get-InfisicalCertificatePolicy cmdlet Covers GET /api/v1/cert-manager/certificate-policies (List default with optional -Limit, -Offset) and GET /api/v1/cert-manager/certificate-policies/{certificatePolicyId} (ById). New InfisicalCertificatePolicy model surfaces subject, SANs, key usages, extended key usages, algorithms, and validity. Polymorphic string-or-array fields (allowed/required/keyAlgorithm) are normalized to arrays; sans is normalized whether the API returns an object or an array. Manifest, build expected list, and MAML help updated. --- CHANGELOG.md | 1 + .../en-US/PSInfisicalAPI.dll-Help.xml | 42 ++++++ build.ps1 | 3 +- .../GetInfisicalCertificatePolicyCmdlet.cs | 54 +++++++ .../Endpoints/InfisicalEndpointNames.cs | 3 + .../Endpoints/InfisicalEndpointRegistry.cs | 20 +++ .../Models/InfisicalCertificatePolicy.cs | 50 +++++++ .../Pki/InfisicalCertificatePolicyDtos.cs | 58 ++++++++ .../Pki/InfisicalCertificatePolicyMapper.cs | 138 ++++++++++++++++++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 88 +++++++++++ 10 files changed, 456 insertions(+), 1 deletion(-) create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs create mode 100644 src/PSInfisicalAPI/Models/InfisicalCertificatePolicy.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyDtos.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyMapper.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c0b34b..0f1f8a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos - Infisical API error responses are now parsed to surface the server-side `message`, `error`, and `reqId` fields. The 4xx/5xx exception message includes the human-readable explanation (e.g. "The project is of type secret-manager") instead of an opaque `Infisical API returned 400 (Bad Request)`. The `InfisicalApiException` gains `ApiErrorMessage` and `ApiRequestId` properties; `InfisicalErrorDetails` carries the same fields so PowerShell error records and logger output expose them. - `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. +- `Get-InfisicalCertificatePolicy` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-policies` (optional `-Limit`, `-Offset`); ById binds to `GET /api/v1/cert-manager/certificate-policies/{certificatePolicyId}`. New `InfisicalCertificatePolicy` model surfaces subject, SANs, key usages, extended key usages, algorithms, and validity. Polymorphic string-or-array fields (`allowed`, `required`, `keyAlgorithm`) are normalized to arrays; `sans` is normalized whether the API returns an object or an array. ## 2026.06.04.1920 diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index 15a12f8..0501b7c 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -1170,6 +1170,48 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi + + + Get-InfisicalCertificatePolicy + Lists or retrieves Infisical certificate policies in a project. + Get + InfisicalCertificatePolicy + + + Default (List parameter set) returns every certificate policy configured on the project via /api/v1/cert-manager/certificate-policies, with optional -Limit and -Offset. When -PolicyId is supplied (ById parameter set) the cmdlet returns one policy by its id. -ProjectId defaults to the session-pinned project in both modes. + + + Notes + + Policies define the allowed/required subject, SANs, key usages, extended key usages, key algorithms, signature algorithm, and validity windows that certificate profiles enforce. Each profile binds exactly one policy via its CertificatePolicyId. + + + + + EXAMPLE 1 + Get-InfisicalCertificatePolicy + Lists every certificate policy defined on the session-pinned project. + + + EXAMPLE 2 + Get-InfisicalCertificatePolicy -PolicyId '3e69306a-e7c1-4fd2-a140-7fb300e53c43' + Retrieves a single certificate policy by id from the session-pinned project. + + + EXAMPLE 3 + $GetInfisicalCertificatePolicyListResult = Get-InfisicalCertificatePolicy | Where-Object { $_.Name -ieq 'codesigning' } + +$GetInfisicalCertificatePolicyParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificatePolicyParameters.PolicyId = $GetInfisicalCertificatePolicyListResult[0].Id +$GetInfisicalCertificatePolicyParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificatePolicyParameters.Verbose = $True + +$GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisicalCertificatePolicyParameters + Filters policies whose name equals 'codesigning' and refetches the canonical record for the first match using a splatted parameter set. + + + + Search-InfisicalCertificate diff --git a/build.ps1 b/build.ps1 index d5db70a..8d035ba 100644 --- a/build.ps1 +++ b/build.ps1 @@ -132,6 +132,7 @@ function Write-Manifest { 'Get-InfisicalCertificateAuthority', 'Get-InfisicalPkiSubscriber', 'Get-InfisicalCertificateProfile', + 'Get-InfisicalCertificatePolicy', 'Get-InfisicalCertificate', 'Search-InfisicalCertificate', 'Request-InfisicalCertificate', @@ -203,7 +204,7 @@ if (`$cmds.Count -eq 0) { throw "No cmdlets were exported by the PSInfisicalAPI module." } -`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') +`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificatePolicy','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') foreach (`$expected in `$expectedCmds) { if (-not (Get-Command -Name `$expected -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { throw "Cmdlet not found: `$expected" diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs new file mode 100644 index 0000000..01b59bb --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs @@ -0,0 +1,54 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalCertificatePolicy", DefaultParameterSetName = "List")] + [OutputType(typeof(InfisicalCertificatePolicy))] + public sealed class GetInfisicalCertificatePolicyCmdlet : InfisicalCmdletBase + { + [Parameter(ParameterSetName = "ById", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Id", "CertificatePolicyId")] + public string PolicyId { get; set; } + + [Parameter] public string ProjectId { get; set; } + + [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } + + [Parameter(ParameterSetName = "List")] public int? Offset { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) + { + InfisicalCertificatePolicy policy = client.GetCertificatePolicy(connection, PolicyId, resolvedProjectId); + if (policy != null) + { + WriteObject(policy); + } + + return; + } + + InfisicalCertificatePolicy[] all = client.ListCertificatePolicies(connection, resolvedProjectId, Limit, Offset); + foreach (InfisicalCertificatePolicy policy in all) + { + WriteObject(policy); + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalCertificatePolicyCmdlet", "GetCertificatePolicy", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index 779bba9..78f934d 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -57,5 +57,8 @@ namespace PSInfisicalAPI.Endpoints public const string ListCertificateProfiles = "ListCertificateProfiles"; public const string GetCertificateProfile = "GetCertificateProfile"; + + public const string ListCertificatePolicies = "ListCertificatePolicies"; + public const string GetCertificatePolicy = "GetCertificatePolicy"; } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index e1ae4fe..985bab4 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -662,6 +662,26 @@ namespace PSInfisicalAPI.Endpoints Template = "/api/v1/cert-manager/certificate-profiles/{certificateProfileId}", RequiresAuthorization = true }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.ListCertificatePolicies, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/certificate-policies", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GetCertificatePolicy, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/certificate-policies/{certificatePolicyId}", + RequiresAuthorization = true + }); } public static InfisicalEndpointDefinition Get(string name) diff --git a/src/PSInfisicalAPI/Models/InfisicalCertificatePolicy.cs b/src/PSInfisicalAPI/Models/InfisicalCertificatePolicy.cs new file mode 100644 index 0000000..5708648 --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalCertificatePolicy.cs @@ -0,0 +1,50 @@ +using System; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalCertificatePolicy + { + public string Id { get; set; } + public string ProjectId { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public InfisicalCertificatePolicySubject Subject { get; set; } + public InfisicalCertificatePolicySan[] Sans { get; set; } + public InfisicalCertificatePolicyUsages KeyUsages { get; set; } + public InfisicalCertificatePolicyUsages ExtendedKeyUsages { get; set; } + public InfisicalCertificatePolicyAlgorithms Algorithms { get; set; } + public InfisicalCertificatePolicyValidity Validity { get; set; } + public DateTimeOffset? CreatedAtUtc { get; set; } + public DateTimeOffset? UpdatedAtUtc { get; set; } + } + + public sealed class InfisicalCertificatePolicySubject + { + public string Type { get; set; } + public string[] Allowed { get; set; } + } + + public sealed class InfisicalCertificatePolicySan + { + public string Type { get; set; } + public string[] Allowed { get; set; } + public string[] Required { get; set; } + } + + public sealed class InfisicalCertificatePolicyUsages + { + public string[] Allowed { get; set; } + public string[] Required { get; set; } + } + + public sealed class InfisicalCertificatePolicyAlgorithms + { + public string Signature { get; set; } + public string[] KeyAlgorithms { get; set; } + } + + public sealed class InfisicalCertificatePolicyValidity + { + public string Max { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyDtos.cs new file mode 100644 index 0000000..485ea5a --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyDtos.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace PSInfisicalAPI.Pki +{ + internal sealed class InfisicalCertificatePolicyResponseDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("projectId")] public string ProjectId { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("description")] public string Description { get; set; } + [JsonProperty("subject")] public InfisicalCertificatePolicySubjectDto Subject { get; set; } + [JsonProperty("sans")] public JToken SansRaw { get; set; } + [JsonProperty("keyUsages")] public InfisicalCertificatePolicyUsagesDto KeyUsages { get; set; } + [JsonProperty("extendedKeyUsages")] public InfisicalCertificatePolicyUsagesDto ExtendedKeyUsages { get; set; } + [JsonProperty("algorithms")] public InfisicalCertificatePolicyAlgorithmsDto Algorithms { get; set; } + [JsonProperty("validity")] public InfisicalCertificatePolicyValidityDto Validity { get; set; } + [JsonProperty("createdAt")] public string CreatedAt { get; set; } + [JsonProperty("updatedAt")] public string UpdatedAt { get; set; } + } + + internal sealed class InfisicalCertificatePolicySubjectDto + { + [JsonProperty("type")] public string Type { get; set; } + [JsonProperty("allowed")] public JToken AllowedRaw { get; set; } + } + + internal sealed class InfisicalCertificatePolicySanDto + { + [JsonProperty("type")] public string Type { get; set; } + [JsonProperty("allowed")] public JToken AllowedRaw { get; set; } + [JsonProperty("required")] public JToken RequiredRaw { get; set; } + } + + internal sealed class InfisicalCertificatePolicyUsagesDto + { + [JsonProperty("allowed")] public JToken AllowedRaw { get; set; } + [JsonProperty("required")] public JToken RequiredRaw { get; set; } + } + + internal sealed class InfisicalCertificatePolicyAlgorithmsDto + { + [JsonProperty("signature")] public string Signature { get; set; } + [JsonProperty("keyAlgorithm")] public JToken KeyAlgorithmRaw { get; set; } + } + + internal sealed class InfisicalCertificatePolicyValidityDto + { + [JsonProperty("max")] public string Max { get; set; } + } + + internal sealed class InfisicalCertificatePolicyListResponseDto + { + [JsonProperty("certificatePolicies")] public List CertificatePolicies { get; set; } + [JsonProperty("totalCount")] public int? TotalCount { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyMapper.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyMapper.cs new file mode 100644 index 0000000..69d3f74 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificatePolicyMapper.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json.Linq; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Pki +{ + internal static class InfisicalCertificatePolicyMapper + { + public static InfisicalCertificatePolicy Map(InfisicalCertificatePolicyResponseDto dto, string fallbackProjectId) + { + if (dto == null) + { + return null; + } + + return new InfisicalCertificatePolicy + { + Id = dto.Id, + ProjectId = !string.IsNullOrEmpty(dto.ProjectId) ? dto.ProjectId : fallbackProjectId, + Name = dto.Name, + Description = dto.Description, + Subject = MapSubject(dto.Subject), + Sans = MapSans(dto.SansRaw), + KeyUsages = MapUsages(dto.KeyUsages), + ExtendedKeyUsages = MapUsages(dto.ExtendedKeyUsages), + Algorithms = MapAlgorithms(dto.Algorithms), + Validity = MapValidity(dto.Validity), + CreatedAtUtc = ParseTimestamp(dto.CreatedAt), + UpdatedAtUtc = ParseTimestamp(dto.UpdatedAt) + }; + } + + public static InfisicalCertificatePolicy[] MapMany(IEnumerable items, string fallbackProjectId) + { + if (items == null) + { + return Array.Empty(); + } + + List results = new List(); + foreach (InfisicalCertificatePolicyResponseDto dto in items) + { + InfisicalCertificatePolicy mapped = Map(dto, fallbackProjectId); + if (mapped != null) + { + results.Add(mapped); + } + } + + return results.ToArray(); + } + + private static InfisicalCertificatePolicySubject MapSubject(InfisicalCertificatePolicySubjectDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificatePolicySubject + { + Type = dto.Type, + Allowed = InfisicalCertificateProfileMapper.FlattenStringOrStringArray(dto.AllowedRaw) + }; + } + + private static InfisicalCertificatePolicySan[] MapSans(JToken token) + { + if (token == null || token.Type == JTokenType.Null) { return null; } + + List results = new List(); + if (token.Type == JTokenType.Array) + { + foreach (JToken child in (JArray)token) + { + InfisicalCertificatePolicySan mapped = MapSanObject(child); + if (mapped != null) { results.Add(mapped); } + } + } + else if (token.Type == JTokenType.Object) + { + InfisicalCertificatePolicySan mapped = MapSanObject(token); + if (mapped != null) { results.Add(mapped); } + } + + return results.Count > 0 ? results.ToArray() : null; + } + + private static InfisicalCertificatePolicySan MapSanObject(JToken token) + { + if (token == null || token.Type != JTokenType.Object) { return null; } + InfisicalCertificatePolicySanDto dto = token.ToObject(); + if (dto == null) { return null; } + return new InfisicalCertificatePolicySan + { + Type = dto.Type, + Allowed = InfisicalCertificateProfileMapper.FlattenStringOrStringArray(dto.AllowedRaw), + Required = InfisicalCertificateProfileMapper.FlattenStringOrStringArray(dto.RequiredRaw) + }; + } + + private static InfisicalCertificatePolicyUsages MapUsages(InfisicalCertificatePolicyUsagesDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificatePolicyUsages + { + Allowed = InfisicalCertificateProfileMapper.FlattenStringOrStringArray(dto.AllowedRaw), + Required = InfisicalCertificateProfileMapper.FlattenStringOrStringArray(dto.RequiredRaw) + }; + } + + private static InfisicalCertificatePolicyAlgorithms MapAlgorithms(InfisicalCertificatePolicyAlgorithmsDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificatePolicyAlgorithms + { + Signature = dto.Signature, + KeyAlgorithms = InfisicalCertificateProfileMapper.FlattenStringOrStringArray(dto.KeyAlgorithmRaw) + }; + } + + private static InfisicalCertificatePolicyValidity MapValidity(InfisicalCertificatePolicyValidityDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificatePolicyValidity { Max = dto.Max }; + } + + private static DateTimeOffset? ParseTimestamp(string value) + { + if (string.IsNullOrEmpty(value)) { return null; } + DateTimeOffset parsed; + if (DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out parsed)) + { + return parsed; + } + + return null; + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index da03488..50efb1e 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -427,6 +427,94 @@ namespace PSInfisicalAPI.Pki return obj.ToObject(); } + public InfisicalCertificatePolicy[] ListCertificatePolicies(InfisicalConnection connection, string projectId, int? limit, int? offset) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + List> query = new List> + { + new KeyValuePair("projectId", resolvedProjectId) + }; + if (limit.HasValue) { query.Add(new KeyValuePair("limit", limit.Value.ToString(CultureInfo.InvariantCulture))); } + if (offset.HasValue) { query.Add(new KeyValuePair("offset", offset.Value.ToString(CultureInfo.InvariantCulture))); } + + try + { + _logger.Information(Component, "Attempting to list Infisical certificate policies. Please Wait..."); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.ListCertificatePolicies, "ListCertificatePolicies", null, query, null); + string body = response.Body; + response.Clear(); + + List source = ParseCertificatePolicyListBody(body); + InfisicalCertificatePolicy[] mapped = InfisicalCertificatePolicyMapper.MapMany(source, resolvedProjectId); + _logger.Information(Component, "Infisical certificate policy list retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate policy list retrieval failed."); + throw; + } + } + + public InfisicalCertificatePolicy GetCertificatePolicy(InfisicalConnection connection, string certificatePolicyId, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(certificatePolicyId)) { throw new InfisicalConfigurationException("CertificatePolicyId is required."); } + + Dictionary pathParameters = new Dictionary { { "certificatePolicyId", certificatePolicyId } }; + List> query = null; + if (!string.IsNullOrEmpty(projectId)) + { + query = new List> { new KeyValuePair("projectId", projectId) }; + } + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve Infisical certificate policy '", certificatePolicyId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.GetCertificatePolicy, "GetCertificatePolicy", pathParameters, query, null); + string body = response.Body; + response.Clear(); + + InfisicalCertificatePolicyResponseDto inner = ParseCertificatePolicySingleBody(body); + string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; + InfisicalCertificatePolicy mapped = InfisicalCertificatePolicyMapper.Map(inner, fallbackProjectId); + _logger.Information(Component, "Infisical certificate policy retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate policy retrieval failed."); + throw; + } + } + + private List ParseCertificatePolicyListBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Array) + { + return token.ToObject>(); + } + + InfisicalCertificatePolicyListResponseDto wrapper = token.ToObject(); + return wrapper != null ? wrapper.CertificatePolicies : null; + } + + private InfisicalCertificatePolicyResponseDto ParseCertificatePolicySingleBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type != JTokenType.Object) { return null; } + JObject obj = (JObject)token; + + if (obj["certificatePolicy"] is JObject inner) { return inner.ToObject(); } + return obj.ToObject(); + } + public InfisicalCertificateBundle GetCertificateBundle(InfisicalConnection connection, string serialNumber) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } From c9c8a8446b01a792151dccaae62a8729b9cb6825 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 16:56:40 -0400 Subject: [PATCH 11/27] Add -Kind switch to Get-InfisicalCertificateAuthority List parameter set gains -Kind Internal|Acme|Any. Internal (default) preserves current behavior against /api/v1/cert-manager/ca/internal. Any binds to the generic /api/v1/cert-manager/ca endpoint returning both internal and ACME CAs. Acme uses the generic endpoint and client-side filters to type=acme. ById retrieval is unchanged and still resolves against the internal CA endpoint. The existing InfisicalCertificateAuthority model already exposes a Type property to distinguish entries when -Kind Any is used. MAML help updated. --- CHANGELOG.md | 1 + .../en-US/PSInfisicalAPI.dll-Help.xml | 13 ++++--- .../GetInfisicalCertificateAuthorityCmdlet.cs | 34 ++++++++++++++++++- .../Endpoints/InfisicalEndpointNames.cs | 2 ++ .../Endpoints/InfisicalEndpointRegistry.cs | 10 ++++++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 30 ++++++++++++++++ 6 files changed, 85 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f1f8a2..5bb41c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos - Infisical API error responses are now parsed to surface the server-side `message`, `error`, and `reqId` fields. The 4xx/5xx exception message includes the human-readable explanation (e.g. "The project is of type secret-manager") instead of an opaque `Infisical API returned 400 (Bad Request)`. The `InfisicalApiException` gains `ApiErrorMessage` and `ApiRequestId` properties; `InfisicalErrorDetails` carries the same fields so PowerShell error records and logger output expose them. - `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. - `Get-InfisicalCertificatePolicy` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-policies` (optional `-Limit`, `-Offset`); ById binds to `GET /api/v1/cert-manager/certificate-policies/{certificatePolicyId}`. New `InfisicalCertificatePolicy` model surfaces subject, SANs, key usages, extended key usages, algorithms, and validity. Polymorphic string-or-array fields (`allowed`, `required`, `keyAlgorithm`) are normalized to arrays; `sans` is normalized whether the API returns an object or an array. +- `Get-InfisicalCertificateAuthority` gains a `-Kind` parameter on the List parameter set with values `Internal` (default, preserves prior behavior against `/api/v1/cert-manager/ca/internal`), `Any` (binds to the generic `/api/v1/cert-manager/ca` endpoint which returns both internal and ACME CAs), and `Acme` (uses the generic endpoint and client-side filters to ACME issuers only). ById retrieval is unchanged and still resolves against the internal CA endpoint. ## 2026.06.04.1920 diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index 0501b7c..82c903b 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -1006,17 +1006,17 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters Get-InfisicalCertificateAuthority - Lists or retrieves Infisical internal Certificate Authorities. + Lists or retrieves Infisical Certificate Authorities. Get InfisicalCertificateAuthority - When -CaId is supplied (ById parameter set) returns a single CA. Otherwise (List parameter set) returns every internal CA visible in the project. -ProjectId defaults to the session-pinned project when omitted. + When -CaId is supplied (ById parameter set) returns a single internal CA. Otherwise (List parameter set) returns CAs scoped by -Kind: Internal (default, /api/v1/cert-manager/ca/internal), Any (/api/v1/cert-manager/ca returning both internal and ACME), or Acme (filters the generic endpoint to ACME issuers only). -ProjectId defaults to the session-pinned project when omitted. Notes - Only internal CAs are surfaced; external/ACME issuers are not enumerated by this cmdlet. CA Ids returned here are the values to pass on -CertificateAuthorityId to Request-InfisicalCertificate. + ByID retrieval currently always resolves against the internal CA endpoint. CA Ids returned here are the values to pass on -CertificateAuthorityId to Request-InfisicalCertificate. The Type property distinguishes 'internal' from 'acme' when -Kind Any is used. @@ -1027,6 +1027,11 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters EXAMPLE 2 + Get-InfisicalCertificateAuthority -Kind Any + Lists every CA (internal and ACME) visible in the session-pinned project; inspect the Type property to distinguish them. + + + EXAMPLE 3 $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } $GetInfisicalCertificateAuthorityParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) @@ -1035,7 +1040,7 @@ $GetInfisicalCertificateAuthorityParameters.ProjectId = $ConnectInfisicalParamet $GetInfisicalCertificateAuthorityParameters.Verbose = $True $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @GetInfisicalCertificateAuthorityParameters - Filters the CA list by friendly name and then re-fetches the canonical CA record by id. + Filters the CA list by friendly name and then re-fetches the canonical CA record by id using a splatted parameter set. diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs index bd90777..3857d9a 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs @@ -16,6 +16,10 @@ namespace PSInfisicalAPI.Cmdlets [Parameter] public string ProjectId { get; set; } + [Parameter(ParameterSetName = "List")] + [ValidateSet("Internal", "Acme", "Any")] + public string Kind { get; set; } = "Internal"; + protected override void ProcessRecord() { try @@ -34,7 +38,20 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalCertificateAuthority[] all = client.ListInternalCertificateAuthorities(connection, ProjectId); + InfisicalCertificateAuthority[] all; + if (string.Equals(Kind, "Internal", StringComparison.OrdinalIgnoreCase)) + { + all = client.ListInternalCertificateAuthorities(connection, ProjectId); + } + else + { + all = client.ListAllCertificateAuthorities(connection, ProjectId); + if (string.Equals(Kind, "Acme", StringComparison.OrdinalIgnoreCase)) + { + all = FilterByType(all, "acme"); + } + } + foreach (InfisicalCertificateAuthority ca in all) { WriteObject(ca); @@ -45,5 +62,20 @@ namespace PSInfisicalAPI.Cmdlets ThrowTerminatingForException("GetInfisicalCertificateAuthorityCmdlet", "GetCertificateAuthority", exception); } } + + private static InfisicalCertificateAuthority[] FilterByType(InfisicalCertificateAuthority[] source, string type) + { + if (source == null || source.Length == 0) { return Array.Empty(); } + System.Collections.Generic.List kept = new System.Collections.Generic.List(); + foreach (InfisicalCertificateAuthority ca in source) + { + if (ca != null && string.Equals(ca.Type, type, StringComparison.OrdinalIgnoreCase)) + { + kept.Add(ca); + } + } + + return kept.ToArray(); + } } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index 78f934d..7ccdd03 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -60,5 +60,7 @@ namespace PSInfisicalAPI.Endpoints public const string ListCertificatePolicies = "ListCertificatePolicies"; public const string GetCertificatePolicy = "GetCertificatePolicy"; + + public const string ListCertificateAuthorities = "ListCertificateAuthorities"; } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index 985bab4..06abc80 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -682,6 +682,16 @@ namespace PSInfisicalAPI.Endpoints Template = "/api/v1/cert-manager/certificate-policies/{certificatePolicyId}", RequiresAuthorization = true }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.ListCertificateAuthorities, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/ca", + RequiresAuthorization = true + }); } public static InfisicalEndpointDefinition Get(string name) diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index 50efb1e..65e52b2 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -91,6 +91,36 @@ namespace PSInfisicalAPI.Pki } } + public InfisicalCertificateAuthority[] ListAllCertificateAuthorities(InfisicalConnection connection, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + List> query = new List> + { + new KeyValuePair("projectId", resolvedProjectId) + }; + + try + { + _logger.Information(Component, "Attempting to list Infisical certificate authorities. Please Wait..."); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.ListCertificateAuthorities, "ListCertificateAuthorities", null, query, null); + string body = response.Body; + response.Clear(); + + List source = ParseCaListBody(body); + InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, resolvedProjectId); + _logger.Information(Component, "Infisical certificate authority list retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate authority list retrieval failed."); + throw; + } + } + public InfisicalCertificate RetrieveCertificate(InfisicalConnection connection, string identifier) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } From ebabd6cf26d66541cccf1c826f6120297428368f Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:02:03 -0400 Subject: [PATCH 12/27] Add profile-based issuance to Request-InfisicalCertificate New ByProfile parameter set bound by -CertificateProfileId (alias ProfileId) POSTs to /api/v1/cert-manager/certificates with the profile id, the locally generated CSR, and an attributes envelope (subject fields, ttl, notBefore, notAfter, keyUsages, extendedKeyUsages). The wrapped response is unwrapped into the existing InfisicalSignedCertificate so reuse, install, chain-completion and key-protection paths remain unchanged. Issuance that returns without a certificate (e.g. status pending_approval) raises a configuration exception that surfaces the reported status and message. Ttl/NotBefore/NotAfter/KeyUsage/ExtendedKeyUsage parameters are now shared by ByCa and ByProfile. MAML help and existing parameter-set test updated. --- CHANGELOG.md | 1 + .../en-US/PSInfisicalAPI.dll-Help.xml | 8 ++- .../CsrAndRequestCmdletTests.cs | 1 + .../RequestInfisicalCertificateCmdlet.cs | 27 +++++++-- .../Endpoints/InfisicalEndpointNames.cs | 1 + .../Endpoints/InfisicalEndpointRegistry.cs | 11 ++++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 60 +++++++++++++++++++ .../Pki/InfisicalSignCertificateDtos.cs | 40 +++++++++++++ 8 files changed, 142 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bb41c8..dee5a69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos - `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. - `Get-InfisicalCertificatePolicy` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-policies` (optional `-Limit`, `-Offset`); ById binds to `GET /api/v1/cert-manager/certificate-policies/{certificatePolicyId}`. New `InfisicalCertificatePolicy` model surfaces subject, SANs, key usages, extended key usages, algorithms, and validity. Polymorphic string-or-array fields (`allowed`, `required`, `keyAlgorithm`) are normalized to arrays; `sans` is normalized whether the API returns an object or an array. - `Get-InfisicalCertificateAuthority` gains a `-Kind` parameter on the List parameter set with values `Internal` (default, preserves prior behavior against `/api/v1/cert-manager/ca/internal`), `Any` (binds to the generic `/api/v1/cert-manager/ca` endpoint which returns both internal and ACME CAs), and `Acme` (uses the generic endpoint and client-side filters to ACME issuers only). ById retrieval is unchanged and still resolves against the internal CA endpoint. +- `Request-InfisicalCertificate` gains a `ByProfile` parameter set bound by the new `-CertificateProfileId` parameter (alias `ProfileId`). The cmdlet generates a local keypair and CSR as usual, then POSTs to `/api/v1/cert-manager/certificates` with the profile id, the CSR, and a subject/attribute envelope (commonName, organization, organizationalUnit, country, state, locality, ttl, notBefore, notAfter, keyUsages, extendedKeyUsages). The wrapped response (`{certificate:{certificate,certificateChain,issuingCaCertificate,serialNumber,certificateId,privateKey}, certificateRequestId, status, message}`) is unwrapped into the existing `InfisicalSignedCertificate` shape so the install / reuse / chain-completion paths continue to work unchanged. Issuance that returns without a certificate (e.g. status `pending_approval`) raises a configuration exception that surfaces the reported status and message. ## 2026.06.04.1920 diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index 82c903b..799d13e 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -1269,7 +1269,7 @@ $SearchInfisicalCertificateResult = Search-InfisicalCertificate @SearchInfisical InfisicalCertificate - Generates a keypair locally, builds a CSR, and submits it for signing either via a PKI subscriber (-PkiSubscriberSlug, default parameter set) or by direct CA signing (-CertificateAuthorityId). On subsequent runs an existing certificate whose CN matches and whose remaining lifetime exceeds -RenewalThresholdDays is reused; pass -Force to always issue or -AllowRenewal to allow rotation inside the threshold. Optional flags install the leaf (-Install) and chain (-InstallChain) into a Windows certificate store, and control private-key protection (-PrivateKeyProtection, -PersistKey, -MachineKey, -PrivateKeyPath, -KeyStorageFlags). Honors -WhatIf and -Confirm. + Generates a keypair locally, builds a CSR, and submits it for signing via one of three parameter sets: a PKI subscriber (-PkiSubscriberSlug, default), direct CA signing (-CertificateAuthorityId), or a certificate profile (-CertificateProfileId, POSTs to /api/v1/cert-manager/certificates with the profile bound). On subsequent runs an existing certificate whose CN matches and whose remaining lifetime exceeds -RenewalThresholdDays is reused; pass -Force to always issue or -AllowRenewal to allow rotation inside the threshold. Optional flags install the leaf (-Install) and chain (-InstallChain) into a Windows certificate store, and control private-key protection (-PrivateKeyProtection, -PersistKey, -MachineKey, -PrivateKeyPath, -KeyStorageFlags). Honors -WhatIf and -Confirm. Notes @@ -1306,6 +1306,12 @@ $RequestInfisicalCertificateParameters.Verbose = $True $RequestInfisicalCertificateResult = Request-InfisicalCertificate @RequestInfisicalCertificateParameters Issues (or renews within 30 days) a 3072-bit RSA certificate for the local FQDN, installs the leaf and chain into LocalMachine\My with a non-exportable machine-bound persistent key. + + EXAMPLE 3 + $Profile = Get-InfisicalCertificateProfile | Where-Object { $_.Slug -eq 'web-tier-profile' } +Request-InfisicalCertificate -CertificateProfileId $Profile.Id -CommonName 'web01.contoso.com' -Ttl '90d' + Issues a certificate via the modern profile API (POST /api/v1/cert-manager/certificates). The profile binds the CA, policy, and defaults so no subscriber is required. + diff --git a/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs b/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs index 95c8232..48f32ab 100644 --- a/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs +++ b/src/PSInfisicalAPI.Tests/CsrAndRequestCmdletTests.cs @@ -158,6 +158,7 @@ namespace PSInfisicalAPI.Tests Assert.NotNull(cmdletType.GetProperty("PkiSubscriberSlug")); Assert.NotNull(cmdletType.GetProperty("CertificateAuthorityId")); + Assert.NotNull(cmdletType.GetProperty("CertificateProfileId")); Assert.NotNull(cmdletType.GetProperty("Subject")); Assert.NotNull(cmdletType.GetProperty("CommonName")); Assert.NotNull(cmdletType.GetProperty("DnsName")); diff --git a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs index 1fc3b09..7f0ac2e 100644 --- a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs @@ -23,6 +23,10 @@ namespace PSInfisicalAPI.Cmdlets [Alias("CaId")] public string CertificateAuthorityId { get; set; } + [Parameter(ParameterSetName = "ByProfile", Mandatory = true, Position = 0)] + [Alias("ProfileId")] + public string CertificateProfileId { get; set; } + [Parameter] public string ProjectId { get; set; } [Parameter] public IDictionary Subject { get; set; } [Parameter] public string CommonName { get; set; } @@ -38,13 +42,18 @@ namespace PSInfisicalAPI.Cmdlets [Parameter] public int KeySize { get; set; } = 2048; [Parameter] public InfisicalEcCurve Curve { get; set; } = InfisicalEcCurve.P256; - [Parameter(ParameterSetName = "ByCa")] public string Ttl { get; set; } - [Parameter(ParameterSetName = "ByCa")] public string NotBefore { get; set; } - [Parameter(ParameterSetName = "ByCa")] public string NotAfter { get; set; } + [Parameter(ParameterSetName = "ByCa")] + [Parameter(ParameterSetName = "ByProfile")] public string Ttl { get; set; } + [Parameter(ParameterSetName = "ByCa")] + [Parameter(ParameterSetName = "ByProfile")] public string NotBefore { get; set; } + [Parameter(ParameterSetName = "ByCa")] + [Parameter(ParameterSetName = "ByProfile")] public string NotAfter { get; set; } [Parameter(ParameterSetName = "ByCa")] public string FriendlyName { get; set; } [Parameter(ParameterSetName = "ByCa")] public string PkiCollectionId { get; set; } - [Parameter(ParameterSetName = "ByCa")] public string[] KeyUsage { get; set; } - [Parameter(ParameterSetName = "ByCa")] public string[] ExtendedKeyUsage { get; set; } + [Parameter(ParameterSetName = "ByCa")] + [Parameter(ParameterSetName = "ByProfile")] public string[] KeyUsage { get; set; } + [Parameter(ParameterSetName = "ByCa")] + [Parameter(ParameterSetName = "ByProfile")] public string[] ExtendedKeyUsage { get; set; } [Parameter] public SwitchParameter Install { get; set; } [Parameter] public StoreName StoreName { get; set; } = StoreName.My; @@ -104,7 +113,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - string target = string.Concat("PKI subscriber '", PkiSubscriberSlug ?? "(n/a)", "' or CA '", CertificateAuthorityId ?? "(n/a)", "' for CN=", csrSubject.CommonName); + string target = string.Concat("PKI subscriber '", PkiSubscriberSlug ?? "(n/a)", "', CA '", CertificateAuthorityId ?? "(n/a)", "', or profile '", CertificateProfileId ?? "(n/a)", "' for CN=", csrSubject.CommonName); if (!ShouldProcess(target, "Request new certificate")) { return; } InfisicalCsrOptions csrOptions = new InfisicalCsrOptions { KeyAlgorithm = KeyAlgorithm, RsaKeySize = KeySize, EcCurve = Curve }; @@ -198,6 +207,12 @@ namespace PSInfisicalAPI.Cmdlets return client.SignCertificateBySubscriber(connection, PkiSubscriberSlug, projectId, csrPem); } + if (string.Equals(ParameterSetName, "ByProfile", StringComparison.Ordinal)) + { + InfisicalCsrSubject subject = InfisicalCertificateRequestHelpers.MergeSubject(Subject, CommonName, Country, State, Locality, Organization, OrganizationalUnit, EmailAddress); + return client.IssueCertificateByProfile(connection, CertificateProfileId, csrPem, subject.CommonName, subject.Organization, subject.OrganizationalUnit, subject.Country, subject.State, subject.Locality, Ttl, NotBefore, NotAfter, KeyUsage, ExtendedKeyUsage); + } + return client.SignCertificateByCa(connection, CertificateAuthorityId, csrPem, CommonName, null, Ttl, NotBefore, NotAfter, FriendlyName, PkiCollectionId, KeyUsage, ExtendedKeyUsage); } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index 7ccdd03..fa32617 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -51,6 +51,7 @@ namespace PSInfisicalAPI.Endpoints public const string GetCertificateBundle = "GetCertificateBundle"; public const string SignCertificateBySubscriber = "SignCertificateBySubscriber"; public const string SignCertificateByCa = "SignCertificateByCa"; + public const string IssueCertificateByProfile = "IssueCertificateByProfile"; public const string ListPkiSubscribers = "ListPkiSubscribers"; public const string GetPkiSubscriber = "GetPkiSubscriber"; diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index 06abc80..242a202 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -623,6 +623,17 @@ namespace PSInfisicalAPI.Endpoints ContainsSecretMaterialInResponse = true }); + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.IssueCertificateByProfile, + Resource = "Pki", + Version = "v1", + Method = "POST", + Template = "/api/v1/cert-manager/certificates", + RequiresAuthorization = true, + ContainsSecretMaterialInResponse = true + }); + Add(map, new InfisicalEndpointDefinition { Name = InfisicalEndpointNames.ListPkiSubscribers, diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index 65e52b2..03f76e7 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -300,6 +300,66 @@ namespace PSInfisicalAPI.Pki }; } + public InfisicalSignedCertificate IssueCertificateByProfile(InfisicalConnection connection, string profileId, string csrPem, string commonName, string organization, string organizationalUnit, string country, string state, string locality, string ttl, string notBefore, string notAfter, IEnumerable keyUsages, IEnumerable extendedKeyUsages) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(profileId)) { throw new InfisicalConfigurationException("CertificateProfileId is required."); } + if (string.IsNullOrEmpty(csrPem)) { throw new InfisicalConfigurationException("CSR is required."); } + + InfisicalIssueCertificateAttributesDto attributes = new InfisicalIssueCertificateAttributesDto + { + CommonName = commonName, + Organization = organization, + OrganizationalUnit = organizationalUnit, + Country = country, + State = state, + Locality = locality, + Ttl = ttl, + NotBefore = notBefore, + NotAfter = notAfter, + KeyUsages = keyUsages != null ? new List(keyUsages) : null, + ExtendedKeyUsages = extendedKeyUsages != null ? new List(extendedKeyUsages) : null + }; + + InfisicalIssueCertificateByProfileRequestDto request = new InfisicalIssueCertificateByProfileRequestDto + { + ProfileId = profileId, + Csr = csrPem, + Attributes = attributes + }; + string body = _serializer.Serialize(request); + + try + { + _logger.Information(Component, string.Concat("Attempting to issue certificate via profile '", profileId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.InvokeWithCandidateFallback(connection, InfisicalEndpointNames.IssueCertificateByProfile, "IssueCertificateByProfile", null, null, body); + InfisicalIssueCertificateResponseDto dto = _serializer.Deserialize(response.Body); + response.Clear(); + + if (dto == null || dto.Certificate == null || string.IsNullOrEmpty(dto.Certificate.Certificate)) + { + string status = dto != null ? dto.Status : "unknown"; + string message = dto != null ? dto.Message : null; + throw new InfisicalConfigurationException(string.Concat("Certificate was not issued (status='", status ?? "unknown", "'", string.IsNullOrEmpty(message) ? "" : string.Concat(", message='", message, "'"), "). The certificate profile may require manual approval or additional validation.")); + } + + InfisicalSignedCertificate signed = new InfisicalSignedCertificate + { + SerialNumber = dto.Certificate.SerialNumber, + CertificatePem = dto.Certificate.Certificate, + CertificateChainPem = dto.Certificate.CertificateChain, + IssuingCaCertificatePem = dto.Certificate.IssuingCaCertificate + }; + _logger.Information(Component, "Infisical certificate issuance (profile) was successful."); + return signed; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate issuance (profile) failed."); + throw; + } + } + public InfisicalPkiSubscriber[] ListPkiSubscribers(InfisicalConnection connection, string projectId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } diff --git a/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs index e6a82eb..71d3647 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalSignCertificateDtos.cs @@ -30,4 +30,44 @@ namespace PSInfisicalAPI.Pki [JsonProperty("issuingCaCertificate")] public string IssuingCaCertificate { get; set; } [JsonProperty("serialNumber")] public string SerialNumber { get; set; } } + + internal sealed class InfisicalIssueCertificateByProfileRequestDto + { + [JsonProperty("profileId")] public string ProfileId { get; set; } + [JsonProperty("csr", NullValueHandling = NullValueHandling.Ignore)] public string Csr { get; set; } + [JsonProperty("attributes", NullValueHandling = NullValueHandling.Ignore)] public InfisicalIssueCertificateAttributesDto Attributes { get; set; } + } + + internal sealed class InfisicalIssueCertificateAttributesDto + { + [JsonProperty("commonName", NullValueHandling = NullValueHandling.Ignore)] public string CommonName { get; set; } + [JsonProperty("organization", NullValueHandling = NullValueHandling.Ignore)] public string Organization { get; set; } + [JsonProperty("organizationalUnit", NullValueHandling = NullValueHandling.Ignore)] public string OrganizationalUnit { get; set; } + [JsonProperty("country", NullValueHandling = NullValueHandling.Ignore)] public string Country { get; set; } + [JsonProperty("state", NullValueHandling = NullValueHandling.Ignore)] public string State { get; set; } + [JsonProperty("locality", NullValueHandling = NullValueHandling.Ignore)] public string Locality { get; set; } + [JsonProperty("ttl", NullValueHandling = NullValueHandling.Ignore)] public string Ttl { get; set; } + [JsonProperty("notBefore", NullValueHandling = NullValueHandling.Ignore)] public string NotBefore { get; set; } + [JsonProperty("notAfter", NullValueHandling = NullValueHandling.Ignore)] public string NotAfter { get; set; } + [JsonProperty("keyUsages", NullValueHandling = NullValueHandling.Ignore)] public List KeyUsages { get; set; } + [JsonProperty("extendedKeyUsages", NullValueHandling = NullValueHandling.Ignore)] public List ExtendedKeyUsages { get; set; } + } + + internal sealed class InfisicalIssueCertificateResponseDto + { + [JsonProperty("certificate")] public InfisicalIssueCertificateInnerDto Certificate { get; set; } + [JsonProperty("certificateRequestId")] public string CertificateRequestId { get; set; } + [JsonProperty("status")] public string Status { get; set; } + [JsonProperty("message")] public string Message { get; set; } + } + + internal sealed class InfisicalIssueCertificateInnerDto + { + [JsonProperty("certificate")] public string Certificate { get; set; } + [JsonProperty("certificateChain")] public string CertificateChain { get; set; } + [JsonProperty("issuingCaCertificate")] public string IssuingCaCertificate { get; set; } + [JsonProperty("serialNumber")] public string SerialNumber { get; set; } + [JsonProperty("certificateId")] public string CertificateId { get; set; } + [JsonProperty("privateKey")] public string PrivateKey { get; set; } + } } From 3754de74f6c819de7da809daaf07f05a31fdd4ba Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:11:56 -0400 Subject: [PATCH 13/27] Treat profile pending-approval as warning instead of throw Issuance via Request-InfisicalCertificate -CertificateProfileId no longer throws when the API responds without a certificate body (e.g. status pending_approval / pending_validation). InfisicalPkiClient.IssueCertificateByProfile now logs a warning and returns an InfisicalSignedCertificate populated only with Status, StatusMessage, and CertificateRequestId. New Status, StatusMessage, CertificateRequestId properties on InfisicalSignedCertificate and InfisicalCertificateResult propagate the lifecycle state. The cmdlet short-circuits when CertificatePem is empty: it skips key build, install, chain install, and private-key write, scrubs PrivateKeyPem, and emits a status-only result so callers can poll or trigger approval. Whether issuance is immediate is dictated by the certificate policy bound to the profile. --- CHANGELOG.md | 2 +- .../Cmdlets/RequestInfisicalCertificateCmdlet.cs | 9 +++++++++ .../Models/InfisicalCertificateResult.cs | 3 +++ .../Models/InfisicalSignedCertificate.cs | 3 +++ .../Pki/InfisicalCertificateRequestHelpers.cs | 3 +++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 14 ++++++++++++-- 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dee5a69..b41a5e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos - `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. - `Get-InfisicalCertificatePolicy` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-policies` (optional `-Limit`, `-Offset`); ById binds to `GET /api/v1/cert-manager/certificate-policies/{certificatePolicyId}`. New `InfisicalCertificatePolicy` model surfaces subject, SANs, key usages, extended key usages, algorithms, and validity. Polymorphic string-or-array fields (`allowed`, `required`, `keyAlgorithm`) are normalized to arrays; `sans` is normalized whether the API returns an object or an array. - `Get-InfisicalCertificateAuthority` gains a `-Kind` parameter on the List parameter set with values `Internal` (default, preserves prior behavior against `/api/v1/cert-manager/ca/internal`), `Any` (binds to the generic `/api/v1/cert-manager/ca` endpoint which returns both internal and ACME CAs), and `Acme` (uses the generic endpoint and client-side filters to ACME issuers only). ById retrieval is unchanged and still resolves against the internal CA endpoint. -- `Request-InfisicalCertificate` gains a `ByProfile` parameter set bound by the new `-CertificateProfileId` parameter (alias `ProfileId`). The cmdlet generates a local keypair and CSR as usual, then POSTs to `/api/v1/cert-manager/certificates` with the profile id, the CSR, and a subject/attribute envelope (commonName, organization, organizationalUnit, country, state, locality, ttl, notBefore, notAfter, keyUsages, extendedKeyUsages). The wrapped response (`{certificate:{certificate,certificateChain,issuingCaCertificate,serialNumber,certificateId,privateKey}, certificateRequestId, status, message}`) is unwrapped into the existing `InfisicalSignedCertificate` shape so the install / reuse / chain-completion paths continue to work unchanged. Issuance that returns without a certificate (e.g. status `pending_approval`) raises a configuration exception that surfaces the reported status and message. +- `Request-InfisicalCertificate` gains a `ByProfile` parameter set bound by the new `-CertificateProfileId` parameter (alias `ProfileId`). The cmdlet generates a local keypair and CSR as usual, then POSTs to `/api/v1/cert-manager/certificates` with the profile id, the CSR, and a subject/attribute envelope (commonName, organization, organizationalUnit, country, state, locality, ttl, notBefore, notAfter, keyUsages, extendedKeyUsages). The wrapped response (`{certificate:{certificate,certificateChain,issuingCaCertificate,serialNumber,certificateId,privateKey}, certificateRequestId, status, message}`) is unwrapped into the existing `InfisicalSignedCertificate` shape so the install / reuse / chain-completion paths continue to work unchanged. Issuance that returns without a certificate body (e.g. status `pending_approval` or `pending_validation`) is logged as a warning and the cmdlet emits a status-only `InfisicalCertificateResult` (new `Status`, `StatusMessage`, `CertificateRequestId` properties) instead of throwing; install / chain / private-key-write steps are skipped in that case. Whether issuance is immediate or pending is dictated by the certificate policy bound to the profile (auto-approve vs. manual review and any required validation). ## 2026.06.04.1920 diff --git a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs index 7f0ac2e..58eed3b 100644 --- a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs @@ -121,6 +121,15 @@ namespace PSInfisicalAPI.Cmdlets InfisicalSignedCertificate signed = SignCertificate(client, connection, resolvedProjectId, csr.CsrPem); signed.PrivateKeyPem = csr.PrivateKeyPem; + if (string.IsNullOrEmpty(signed.CertificatePem)) + { + Logger.Warning(Component, string.Concat("Issuance returned without a certificate (status='", signed.Status ?? "unknown", "'", string.IsNullOrEmpty(signed.StatusMessage) ? "" : string.Concat(", message='", signed.StatusMessage, "'"), string.IsNullOrEmpty(signed.CertificateRequestId) ? "" : string.Concat(", certificateRequestId='", signed.CertificateRequestId, "'"), "). Install / chain / key-write steps are skipped; emitting status-only result.")); + InfisicalCertificateResult pending = InfisicalCertificateRequestHelpers.BuildResult(null, signed); + pending.PrivateKeyPem = null; + WriteObject(pending); + return; + } + X509KeyStorageFlags resolvedFlags = ResolveEffectiveKeyStorageFlags(); X509Certificate2 cert = PemCertificateBuilder.Build(signed.CertificatePem, signed.PrivateKeyPem, signed.CertificateChainPem, resolvedFlags); diff --git a/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs b/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs index 38dd62a..7dc5404 100644 --- a/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs +++ b/src/PSInfisicalAPI/Models/InfisicalCertificateResult.cs @@ -13,6 +13,9 @@ namespace PSInfisicalAPI.Models public string CertificatePem { get; set; } public string CertificateChainPem { get; set; } public string PrivateKeyPem { get; set; } + public string Status { get; set; } + public string StatusMessage { get; set; } + public string CertificateRequestId { get; set; } public override string ToString() { diff --git a/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs b/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs index e40d62f..24b1a91 100644 --- a/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs +++ b/src/PSInfisicalAPI/Models/InfisicalSignedCertificate.cs @@ -7,6 +7,9 @@ namespace PSInfisicalAPI.Models public string CertificateChainPem { get; set; } public string IssuingCaCertificatePem { get; set; } public string PrivateKeyPem { get; set; } + public string Status { get; set; } + public string StatusMessage { get; set; } + public string CertificateRequestId { get; set; } public override string ToString() { diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs index 15c296b..4395c75 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificateRequestHelpers.cs @@ -220,6 +220,9 @@ namespace PSInfisicalAPI.Pki result.CertificatePem = signed.CertificatePem; result.CertificateChainPem = signed.CertificateChainPem; result.PrivateKeyPem = signed.PrivateKeyPem; + result.Status = signed.Status; + result.StatusMessage = signed.StatusMessage; + result.CertificateRequestId = signed.CertificateRequestId; } List chainCerts = signed != null ? CollectChainCertificates(signed) : new List(); diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index 03f76e7..e3e06b6 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -340,7 +340,14 @@ namespace PSInfisicalAPI.Pki { string status = dto != null ? dto.Status : "unknown"; string message = dto != null ? dto.Message : null; - throw new InfisicalConfigurationException(string.Concat("Certificate was not issued (status='", status ?? "unknown", "'", string.IsNullOrEmpty(message) ? "" : string.Concat(", message='", message, "'"), "). The certificate profile may require manual approval or additional validation.")); + string requestId = dto != null ? dto.CertificateRequestId : null; + _logger.Warning(Component, string.Concat("Profile issuance did not return a certificate (status='", status ?? "unknown", "'", string.IsNullOrEmpty(message) ? "" : string.Concat(", message='", message, "'"), string.IsNullOrEmpty(requestId) ? "" : string.Concat(", certificateRequestId='", requestId, "'"), "). The profile may require manual approval or additional validation; returning a status-only result.")); + return new InfisicalSignedCertificate + { + Status = status, + StatusMessage = message, + CertificateRequestId = requestId + }; } InfisicalSignedCertificate signed = new InfisicalSignedCertificate @@ -348,7 +355,10 @@ namespace PSInfisicalAPI.Pki SerialNumber = dto.Certificate.SerialNumber, CertificatePem = dto.Certificate.Certificate, CertificateChainPem = dto.Certificate.CertificateChain, - IssuingCaCertificatePem = dto.Certificate.IssuingCaCertificate + IssuingCaCertificatePem = dto.Certificate.IssuingCaCertificate, + Status = dto.Status, + StatusMessage = dto.Message, + CertificateRequestId = dto.CertificateRequestId }; _logger.Information(Component, "Infisical certificate issuance (profile) was successful."); return signed; From b375ebc9b3d9879fcdf2774a990dad80b8e23805 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:12:34 -0400 Subject: [PATCH 14/27] Build artifacts for 3754de74f6c8 Auto-generated by build.ps1 -CommitArtifacts. Build 2026.06.04.2112. Module DLL and manifest embed BuildCommitHash=3754de74f6c8, matching the source commit they were produced from. --- CHANGELOG.md | 22 ++-- Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 6 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 284672 -> 322048 bytes .../bin/en-US/PSInfisicalAPI.dll-Help.xml | 105 +++++++++++++++++- 4 files changed, 118 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b41a5e6..27598d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.2112 + +- Build produced from commit 3754de74f6c8. + +## Unreleased (carried forward) + - Infisical API error responses are now parsed to surface the server-side `message`, `error`, and `reqId` fields. The 4xx/5xx exception message includes the human-readable explanation (e.g. "The project is of type secret-manager") instead of an opaque `Infisical API returned 400 (Bad Request)`. The `InfisicalApiException` gains `ApiErrorMessage` and `ApiRequestId` properties; `InfisicalErrorDetails` carries the same fields so PowerShell error records and logger output expose them. - `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. - `Get-InfisicalCertificatePolicy` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-policies` (optional `-Limit`, `-Offset`); ById binds to `GET /api/v1/cert-manager/certificate-policies/{certificatePolicyId}`. New `InfisicalCertificatePolicy` model surfaces subject, SANs, key usages, extended key usages, algorithms, and validity. Polymorphic string-or-array fields (`allowed`, `required`, `keyAlgorithm`) are normalized to arrays; `sans` is normalized whether the API returns an object or an array. @@ -47,7 +53,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos - **BREAKING**: Removed the plural-noun discovery cmdlets `Get-InfisicalProjects`, `Get-InfisicalEnvironments`, `Get-InfisicalFolders`, `Get-InfisicalTags`, `Get-InfisicalSecrets`, and `Get-InfisicalCertificates`. Their behavior is now folded into the corresponding singular cmdlets via a `List` (default) / single-record parameter set pair, matching the existing `Get-InfisicalCertificateAuthority` precedent. Callers should drop the trailing `s`; invocation without the identity parameter (`-ProjectId`, `-EnvironmentSlugOrId`, `-FolderNameOrId`, `-TagSlugOrId`, `-SecretName`, `-SerialNumber`) now returns the list, and supplying the identity parameter returns the single record. No back-compat aliases were added. - Added `Get-InfisicalPkiSubscriber` with `List` (default) and `ByName` parameter sets, backed by new `InfisicalPkiClient.ListPkiSubscribers` and `GetPkiSubscriber` methods, an `InfisicalPkiSubscriber` model, and corresponding DTOs/mapper. Use the emitted `Name` (slug) on `Request-InfisicalCertificate -PkiSubscriberSlug`. - **Bug fix**: `Request-InfisicalCertificate -PkiSubscriberSlug ...` was returning 404 because the registry's `SignCertificateBySubscriber` endpoint pointed at `/api/v1/pki/pki-subscribers/{subscriberName}/sign-certificate` and `/api/v1/cert-manager/pki-subscribers/...`. Per Infisical's `v1/index.ts`, the subscriber router is mounted at `/pki/subscribers`, so the single correct path is `/api/v1/pki/subscribers/{subscriberName}/sign-certificate`. The redundant `cert-manager` template was removed; the PKI endpoint registry tests were updated to match. -- Updated MAML help in `Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml`: the six consolidated cmdlets and the new `Get-InfisicalPkiSubscriber` each ship three examples — two straight-line invocations (one per parameter set) plus one `OrderedDictionary` splat example. All in-text references to the removed plural cmdlets across other cmdlets' examples were updated to the singular form. +- Updated MAML help in `Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml`: the six consolidated cmdlets and the new `Get-InfisicalPkiSubscriber` each ship three examples — two straight-line invocations (one per parameter set) plus one `OrderedDictionary` splat example. All in-text references to the removed plural cmdlets across other cmdlets' examples were updated to the singular form. - `build.ps1`: `CmdletsToExport` and the `Test-ModuleImports` expected cmdlet list were updated to drop the six plural cmdlets and add `Get-InfisicalPkiSubscriber` (total: 34 exported cmdlets). ## 2026.06.04.1825 @@ -125,9 +131,9 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos - List/single CA and single certificate response parsing now tolerate raw arrays, wrapper objects (`{certificate: {...}}`, `{certificates: [...]}`), and nested `configuration` blocks. `InfisicalCaMapper` reads CA detail fields from `configuration` first, falling back to top-level. - `RetrieveCertificate(connection, identifier)` added on `InfisicalPkiClient`. - **New cmdlets**: - - **`Get-InfisicalCertificate`** — single-record retrieval by `-SerialNumber`/`-Id` (mandatory positional). - - **`Get-InfisicalCertificates`** — listing with light filtering (`-CommonName`, `-FriendlyName`, `-Status`, `-CaId`, `-Limit`, `-Offset`, `-NoAutoPage`). Auto-paginates by default. - - **`Request-InfisicalCertificate`** — generates a keypair locally (private key never leaves the device), submits a PKCS#10 CSR to either `pki-subscribers/{name}/sign-certificate` (`-PkiSubscriberSlug`) or `ca/{caId}/sign-certificate` (`-CertificateAuthorityId`), and returns a single `InfisicalCertificateResult` object with the leaf and chain pre-classified. The result exposes `Leaf : X509Certificate2`, `Intermediates : X509Certificate2[]`, `Root : X509Certificate2` (nullable), `Chain : X509Certificate2[]` (ordered leaf → intermediates → root, deduplicated by thumbprint), plus pass-through `SerialNumber`, `CertificatePem`, `CertificateChainPem`, and `PrivateKeyPem`. Supports `-Subject` (`IDictionary` with `CN`/`C`/`ST`/`L`/`O`/`OU`/`E` keys) merged with individual `-CommonName`/`-Country`/etc. parameters (individual params win), `-DnsName`/`-IpAddress` SANs (auto-populated from local FQDN when omitted). Idempotency: scans the local `X509Store` for an existing certificate matching `CN` and an Infisical-known serial number; returns the existing certificate wrapped in an `InfisicalCertificateResult` whose `Intermediates`/`Root`/`Chain` are populated by walking the local trust stores via `X509Chain` (no network calls, revocation checks disabled), and whose `CertificatePem`/`CertificateChainPem` are reconstructed from the resolved certs. Reuse is short-circuited unless `-Force` or `-AllowRenewal` (with optional `-RenewalThresholdDays`, default 30) requests a new one. Installation: `-Install` adds the leaf to `-StoreName`/`-StoreLocation` (default `My`/`CurrentUser`); `-InstallChain` additionally places intermediates into `CertificateAuthority` and self-signed roots into `Root` for the same `-StoreLocation`. `-KeyStorageFlags` is passed through to `X509Certificate2` import. + - **`Get-InfisicalCertificate`** — single-record retrieval by `-SerialNumber`/`-Id` (mandatory positional). + - **`Get-InfisicalCertificates`** — listing with light filtering (`-CommonName`, `-FriendlyName`, `-Status`, `-CaId`, `-Limit`, `-Offset`, `-NoAutoPage`). Auto-paginates by default. + - **`Request-InfisicalCertificate`** — generates a keypair locally (private key never leaves the device), submits a PKCS#10 CSR to either `pki-subscribers/{name}/sign-certificate` (`-PkiSubscriberSlug`) or `ca/{caId}/sign-certificate` (`-CertificateAuthorityId`), and returns a single `InfisicalCertificateResult` object with the leaf and chain pre-classified. The result exposes `Leaf : X509Certificate2`, `Intermediates : X509Certificate2[]`, `Root : X509Certificate2` (nullable), `Chain : X509Certificate2[]` (ordered leaf → intermediates → root, deduplicated by thumbprint), plus pass-through `SerialNumber`, `CertificatePem`, `CertificateChainPem`, and `PrivateKeyPem`. Supports `-Subject` (`IDictionary` with `CN`/`C`/`ST`/`L`/`O`/`OU`/`E` keys) merged with individual `-CommonName`/`-Country`/etc. parameters (individual params win), `-DnsName`/`-IpAddress` SANs (auto-populated from local FQDN when omitted). Idempotency: scans the local `X509Store` for an existing certificate matching `CN` and an Infisical-known serial number; returns the existing certificate wrapped in an `InfisicalCertificateResult` whose `Intermediates`/`Root`/`Chain` are populated by walking the local trust stores via `X509Chain` (no network calls, revocation checks disabled), and whose `CertificatePem`/`CertificateChainPem` are reconstructed from the resolved certs. Reuse is short-circuited unless `-Force` or `-AllowRenewal` (with optional `-RenewalThresholdDays`, default 30) requests a new one. Installation: `-Install` adds the leaf to `-StoreName`/`-StoreLocation` (default `My`/`CurrentUser`); `-InstallChain` additionally places intermediates into `CertificateAuthority` and self-signed roots into `Root` for the same `-StoreLocation`. `-KeyStorageFlags` is passed through to `X509Certificate2` import. - **Multi-algorithm CSR support** on `Request-InfisicalCertificate` via split parameters: `-KeyAlgorithm` (`Rsa`/`Ecdsa`/`Ed25519`, default `Rsa`), `-KeySize` (`2048`/`3072`/`4096`, default `2048`, applies to RSA only), `-Curve` (`P256`/`P384`, default `P256`, applies to ECDSA only). Signature algorithms are picked automatically: SHA256WITHRSA for RSA, SHA256WITHECDSA / SHA384WITHECDSA for ECDSA P-256/P-384, and Ed25519 (pure-EdDSA) for Ed25519. The underlying `InfisicalCsrBuilder.Build(subject, dns, ip, options)` API was updated to take an `InfisicalCsrOptions` object in place of the prior `keySize` int. - **Sign-certificate endpoint registrations**: `SignCertificateBySubscriber` and `SignCertificateByCa` registered with both `/api/v1/pki/...` and `/api/v1/cert-manager/...` candidate paths and marked `ContainsSecretMaterialInResponse = true`. @@ -149,7 +155,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased (carried forward) -- **CI — Gitea artifact upload fix**: Replaced `actions/upload-artifact@v4` and `actions/download-artifact@v4` with the Gitea-compatible forks `christopherhx/gitea-upload-artifact@v4` and `christopherhx/gitea-download-artifact@v4` in `.gitea/workflows/publish-psgallery.yml`. The upstream v4 actions abort on Gitea because Gitea is detected as GHES, which the upstream v4 actions do not support (see [go-gitea/gitea#28853](https://github.com/go-gitea/gitea/issues/28853)). +- **CI — Gitea artifact upload fix**: Replaced `actions/upload-artifact@v4` and `actions/download-artifact@v4` with the Gitea-compatible forks `christopherhx/gitea-upload-artifact@v4` and `christopherhx/gitea-download-artifact@v4` in `.gitea/workflows/publish-psgallery.yml`. The upstream v4 actions abort on Gitea because Gitea is detected as GHES, which the upstream v4 actions do not support (see [go-gitea/gitea#28853](https://github.com/go-gitea/gitea/issues/28853)). ## 2026.06.04.0123 @@ -157,7 +163,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased (carried forward) -- **M10 polish — formatting, type metadata, and PKI route aliases**: +- **M10 polish — formatting, type metadata, and PKI route aliases**: - Added default table views and `DefaultDisplayPropertySet` entries for `InfisicalCertificateAuthority`, `InfisicalCertificate`, and `InfisicalCertificateBundle` in the module `Format.ps1xml` / `Types.ps1xml`. - Realigned PKI endpoint registry to current Infisical paths: `ListInternalCertificateAuthorities` and `RetrieveInternalCertificateAuthority` now use `/api/v1/cert-manager/ca/internal[/{caId}]` as primary, with legacy `/api/v1/pki/ca/internal[/{caId}]` retained as a fallback alias. `GetCertificateBundle` and `RetrieveCertificate` similarly carry `cert-manager` fallback aliases. - `InfisicalApiInvoker.InvokeWithCandidateFallback` walks the candidate list and falls back on `404`/`405`, used by `InfisicalPkiClient` so older self-hosted Infisical instances are tolerated transparently. @@ -168,7 +174,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased (carried forward) -- **M10 — PKI Internal CAs, Certificates & Windows Store integration**: +- **M10 — PKI Internal CAs, Certificates & Windows Store integration**: - **`Get-InfisicalCertificateAuthority`** lists internal certificate authorities for the current project, or returns a single CA with `-CaId`. - **`Search-InfisicalCertificate`** wraps `POST /api/v1/projects/{projectId}/certificates/search` with rich filters (`-CommonName`, `-FriendlyName`, `-Search`, `-Status`, `-CaId`, `-ProfileId`, `-ApplicationId`, `-EnrollmentType`, `-KeyAlgorithm`, `-SignatureAlgorithm`, `-Source`, `-NotAfterFrom/To`, `-NotBeforeFrom/To`, `-SortBy/-SortOrder`, `-Limit/-Offset`). Auto-paginates unless `-NoAutoPage` is set. - **`ConvertTo-InfisicalCertificate`** accepts an `InfisicalCertificate`, `InfisicalCertificateBundle`, or `-SerialNumber`, fetches the bundle endpoint when needed, and emits a `System.Security.Cryptography.X509Certificates.X509Certificate2` with the private key attached. `-NoPrivateKey` skips key parsing; `-IncludeChain` additionally emits intermediates; `-KeyStorageFlags` controls import behavior. @@ -195,7 +201,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## 2026.06.03.2207 - Build produced from commit 09c3d5c68bbc. -- **M9 — Bulk, Duplicate & Inheritance**: +- **M9 — Bulk, Duplicate & Inheritance**: - **Bulk parameter sets** added to `New-InfisicalSecret`, `Update-InfisicalSecret`, and `Remove-InfisicalSecret` accepting `-Secrets Hashtable[]`; client methods `CreateBatch`/`UpdateBatch`/`DeleteBatch` wrap `POST|PATCH|DELETE /api/v3/secrets/batch/raw`. - **`Copy-InfisicalSecret`** cmdlet added, wrapping `POST /api/v4/secrets/duplicate` with source/destination environment + path parameters and per-attribute copy toggles. - **Connection inheritance** centralized in `InfisicalCmdletBase` (`ResolveProjectId`/`ResolveEnvironment`/`ResolveSecretPath`/`ResolveApiVersion`/`ResolveOrganizationId`). Explicit parameters always win; missing values fall back to the active connection and emit a `-Verbose` line. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index da15a74..1095688 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.1920' + ModuleVersion = '2026.06.04.2112' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -37,6 +37,8 @@ 'Remove-InfisicalTag', 'Get-InfisicalCertificateAuthority', 'Get-InfisicalPkiSubscriber', + 'Get-InfisicalCertificateProfile', + 'Get-InfisicalCertificatePolicy', 'Get-InfisicalCertificate', 'Search-InfisicalCertificate', 'Request-InfisicalCertificate', @@ -55,7 +57,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '0f8f44afdb38' + CommitHash = '3754de74f6c8' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index 1b68389ed03f96fcc91a8cfd685ef53dd47d0460..ae5bd63efa059af72dfb1a735740278ab3943d3f 100644 GIT binary patch literal 322048 zcmd442b>>8{r|uBDf?-6Nj|yD-K9VRBs4kEpTl7amYgoFf;-U28^ zDN+FO8-F9*v{C^bz9f>()E=;^CX*&vvJp1?K;MyO8tcngsD>)*b(!{sj>?0cGcmH!*t zcvldA3kY{R5rq4)Bt-we^|L`U?1CU0?A+gNar+a3AfIs0v%h&_fATR09d``-Z@xmz zanoy!<89u+`%aE((E$LB8*$VNeXV}A>UDjxYjSkZ5e|D<_T|Bszs3_jAsfnky$wM{fv~pIlp; zdm4x4)Le;L-o4L`BQ8BHdG`^z(3@`S8BuU!IdNBSZc@Q5g9uplo+&VbnH$f+|sdY*wI9v1L^IU({lH^Lx=946q4l5)_`;s#=dEZq`kb&9IEC=r-$!MI&Rll%AGkx_(56*=VCwa8zX+7t|+z4}nJVlWQwz z{7CT>$^uz$ai1f^*EuROZXIIpVW7Zdg+ElqD5|y&THtSZ_ZRl2E zTeo^5)i-h1ln{nU+*5FihNHfd#&zB1zm7%ndMY(s;xU! zY%leU40D$?=e0uUP360D9lMuuA;tR5w(ez9b4jC2_wuRqJQV;A_CN)II@SXf0B&m@ zr~niUr~niVr~s4FeCz5=InERB zq|-ga{C-cEQcuO&�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%0As0TFagFg%U}YGJ1m0< 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%0DSpzshYU|Fl&7Dz~}( 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 literal 284672 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 z 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 Le^>wiqXhmRsXa$Y diff --git a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml index 8540047..799d13e 100644 --- a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml @@ -1006,17 +1006,17 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters Get-InfisicalCertificateAuthority - Lists or retrieves Infisical internal Certificate Authorities. + Lists or retrieves Infisical Certificate Authorities. Get InfisicalCertificateAuthority - When -CaId is supplied (ById parameter set) returns a single CA. Otherwise (List parameter set) returns every internal CA visible in the project. -ProjectId defaults to the session-pinned project when omitted. + When -CaId is supplied (ById parameter set) returns a single internal CA. Otherwise (List parameter set) returns CAs scoped by -Kind: Internal (default, /api/v1/cert-manager/ca/internal), Any (/api/v1/cert-manager/ca returning both internal and ACME), or Acme (filters the generic endpoint to ACME issuers only). -ProjectId defaults to the session-pinned project when omitted. Notes - Only internal CAs are surfaced; external/ACME issuers are not enumerated by this cmdlet. CA Ids returned here are the values to pass on -CertificateAuthorityId to Request-InfisicalCertificate. + ByID retrieval currently always resolves against the internal CA endpoint. CA Ids returned here are the values to pass on -CertificateAuthorityId to Request-InfisicalCertificate. The Type property distinguishes 'internal' from 'acme' when -Kind Any is used. @@ -1027,6 +1027,11 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters EXAMPLE 2 + Get-InfisicalCertificateAuthority -Kind Any + Lists every CA (internal and ACME) visible in the session-pinned project; inspect the Type property to distinguish them. + + + EXAMPLE 3 $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } $GetInfisicalCertificateAuthorityParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) @@ -1035,7 +1040,7 @@ $GetInfisicalCertificateAuthorityParameters.ProjectId = $ConnectInfisicalParamet $GetInfisicalCertificateAuthorityParameters.Verbose = $True $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @GetInfisicalCertificateAuthorityParameters - Filters the CA list by friendly name and then re-fetches the canonical CA record by id. + Filters the CA list by friendly name and then re-fetches the canonical CA record by id using a splatted parameter set. @@ -1128,6 +1133,90 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu + + + Get-InfisicalCertificateProfile + Lists or retrieves Infisical certificate profiles in a project. + Get + InfisicalCertificateProfile + + + Default (List parameter set) returns every certificate profile configured on the project via /api/v1/cert-manager/certificate-profiles, with optional -Limit, -Offset, and -IncludeConfigs. When -ProfileId is supplied (ById parameter set) the cmdlet returns one profile by its id. -ProjectId defaults to the session-pinned project in both modes. + + + Notes + + Profiles bind a CA and a certificate policy and surface defaults (TtlDays, KeyAlgorithm, KeyUsages, ExtendedKeyUsages). Use the returned profile Id when wiring profile-based issuance against Request-InfisicalCertificate. + + + + + EXAMPLE 1 + Get-InfisicalCertificateProfile + Lists every certificate profile defined on the session-pinned project. + + + EXAMPLE 2 + Get-InfisicalCertificateProfile -ProfileId '8257641e-c808-454e-ac92-8dc920be865f' + Retrieves a single certificate profile by id from the session-pinned project. + + + EXAMPLE 3 + $GetInfisicalCertificateProfileListResult = Get-InfisicalCertificateProfile | Where-Object { $_.Slug -ieq 'codesigning' } + +$GetInfisicalCertificateProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateProfileParameters.ProfileId = $GetInfisicalCertificateProfileListResult[0].Id +$GetInfisicalCertificateProfileParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateProfileParameters.Verbose = $True + +$GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfisicalCertificateProfileParameters + Filters profiles whose slug equals 'codesigning' and refetches the canonical record for the first match using a splatted parameter set. + + + + + + + Get-InfisicalCertificatePolicy + Lists or retrieves Infisical certificate policies in a project. + Get + InfisicalCertificatePolicy + + + Default (List parameter set) returns every certificate policy configured on the project via /api/v1/cert-manager/certificate-policies, with optional -Limit and -Offset. When -PolicyId is supplied (ById parameter set) the cmdlet returns one policy by its id. -ProjectId defaults to the session-pinned project in both modes. + + + Notes + + Policies define the allowed/required subject, SANs, key usages, extended key usages, key algorithms, signature algorithm, and validity windows that certificate profiles enforce. Each profile binds exactly one policy via its CertificatePolicyId. + + + + + EXAMPLE 1 + Get-InfisicalCertificatePolicy + Lists every certificate policy defined on the session-pinned project. + + + EXAMPLE 2 + Get-InfisicalCertificatePolicy -PolicyId '3e69306a-e7c1-4fd2-a140-7fb300e53c43' + Retrieves a single certificate policy by id from the session-pinned project. + + + EXAMPLE 3 + $GetInfisicalCertificatePolicyListResult = Get-InfisicalCertificatePolicy | Where-Object { $_.Name -ieq 'codesigning' } + +$GetInfisicalCertificatePolicyParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificatePolicyParameters.PolicyId = $GetInfisicalCertificatePolicyListResult[0].Id +$GetInfisicalCertificatePolicyParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificatePolicyParameters.Verbose = $True + +$GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisicalCertificatePolicyParameters + Filters policies whose name equals 'codesigning' and refetches the canonical record for the first match using a splatted parameter set. + + + + Search-InfisicalCertificate @@ -1180,7 +1269,7 @@ $SearchInfisicalCertificateResult = Search-InfisicalCertificate @SearchInfisical InfisicalCertificate - Generates a keypair locally, builds a CSR, and submits it for signing either via a PKI subscriber (-PkiSubscriberSlug, default parameter set) or by direct CA signing (-CertificateAuthorityId). On subsequent runs an existing certificate whose CN matches and whose remaining lifetime exceeds -RenewalThresholdDays is reused; pass -Force to always issue or -AllowRenewal to allow rotation inside the threshold. Optional flags install the leaf (-Install) and chain (-InstallChain) into a Windows certificate store, and control private-key protection (-PrivateKeyProtection, -PersistKey, -MachineKey, -PrivateKeyPath, -KeyStorageFlags). Honors -WhatIf and -Confirm. + Generates a keypair locally, builds a CSR, and submits it for signing via one of three parameter sets: a PKI subscriber (-PkiSubscriberSlug, default), direct CA signing (-CertificateAuthorityId), or a certificate profile (-CertificateProfileId, POSTs to /api/v1/cert-manager/certificates with the profile bound). On subsequent runs an existing certificate whose CN matches and whose remaining lifetime exceeds -RenewalThresholdDays is reused; pass -Force to always issue or -AllowRenewal to allow rotation inside the threshold. Optional flags install the leaf (-Install) and chain (-InstallChain) into a Windows certificate store, and control private-key protection (-PrivateKeyProtection, -PersistKey, -MachineKey, -PrivateKeyPath, -KeyStorageFlags). Honors -WhatIf and -Confirm. Notes @@ -1217,6 +1306,12 @@ $RequestInfisicalCertificateParameters.Verbose = $True $RequestInfisicalCertificateResult = Request-InfisicalCertificate @RequestInfisicalCertificateParameters Issues (or renews within 30 days) a 3072-bit RSA certificate for the local FQDN, installs the leaf and chain into LocalMachine\My with a non-exportable machine-bound persistent key. + + EXAMPLE 3 + $Profile = Get-InfisicalCertificateProfile | Where-Object { $_.Slug -eq 'web-tier-profile' } +Request-InfisicalCertificate -CertificateProfileId $Profile.Id -CommonName 'web01.contoso.com' -Ttl '90d' + Issues a certificate via the modern profile API (POST /api/v1/cert-manager/certificates). The profile binds the CA, policy, and defaults so no subscriber is required. + From 80454576b84d2ae77030d0c34c285fca7c495fc7 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:40:32 -0400 Subject: [PATCH 15/27] Add InfisicalScepMdmProfile model with ToSyncMl() builder POCO mirrors the Windows ClientCertificateInstall/SCEP CSP node set (ServerURL, Challenge, SubjectName, SubjectAlternativeNames, EKUMapping, KeyUsage, KeyLength, KeyAlgorithm, HashAlgorithm, KeyProtection, ContainerName, ValidPeriod, ValidPeriodUnits, RetryCount, RetryDelay, TemplateName, CAThumbprint, CustomTextToShowInPrompt) plus a Scope hint (Device or User) and a UniqueId for the CSP path segment. ToSyncMl() builds an Atomic SyncBody of Replace operations and a trailing Exec on Install/Enroll using XDocument, serializes through XmlWriter with explicit settings (UTF-8 no BOM, indented, no BOM, Replace newline handling), then round-trip-validates through XmlReader before returning the string. --- .../Models/InfisicalScepMdmProfile.cs | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/PSInfisicalAPI/Models/InfisicalScepMdmProfile.cs diff --git a/src/PSInfisicalAPI/Models/InfisicalScepMdmProfile.cs b/src/PSInfisicalAPI/Models/InfisicalScepMdmProfile.cs new file mode 100644 index 0000000..7c591f1 --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalScepMdmProfile.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Linq; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalScepMdmProfile + { + private const string SyncMlMetInfNamespace = "syncml:metinf"; + + public string UniqueId { get; set; } + public string Scope { get; set; } + + public string ServerUrl { get; set; } + public string Challenge { get; set; } + + public string SubjectName { get; set; } + public string SubjectAlternativeNames { get; set; } + public string EkuMapping { get; set; } + public int? KeyUsage { get; set; } + + public int? KeyLength { get; set; } + public string KeyAlgorithm { get; set; } + public string HashAlgorithm { get; set; } + public int? KeyProtection { get; set; } + public string ContainerName { get; set; } + + public string ValidPeriod { get; set; } + public int? ValidPeriodUnits { get; set; } + public int? RetryCount { get; set; } + public int? RetryDelay { get; set; } + + public string TemplateName { get; set; } + public string CAThumbprint { get; set; } + public string CustomTextToShowInPrompt { get; set; } + + public string SourceProfileId { get; set; } + public string SourceProfileSlug { get; set; } + + public string ToSyncMl() + { + if (string.IsNullOrEmpty(UniqueId)) { throw new InvalidOperationException("UniqueId is required."); } + if (string.IsNullOrEmpty(ServerUrl)) { throw new InvalidOperationException("ServerUrl is required."); } + + string scopeSegment = string.Equals(Scope, "User", StringComparison.OrdinalIgnoreCase) ? "./User" : "./Device"; + string nodeBase = string.Concat(scopeSegment, "/Vendor/MSFT/ClientCertificateInstall/SCEP/", UniqueId, "/Install/"); + + List nodes = new List(); + AddString(nodes, "ServerURL", ServerUrl); + AddString(nodes, "Challenge", Challenge); + AddString(nodes, "SubjectName", SubjectName); + AddString(nodes, "SubjectAlternativeNames", SubjectAlternativeNames); + AddString(nodes, "EKUMapping", EkuMapping); + AddInt(nodes, "KeyUsage", KeyUsage); + AddInt(nodes, "KeyLength", KeyLength); + AddString(nodes, "KeyAlgorithm", KeyAlgorithm); + AddString(nodes, "HashAlgorithm", HashAlgorithm); + AddInt(nodes, "KeyProtection", KeyProtection); + AddString(nodes, "ContainerName", ContainerName); + AddString(nodes, "ValidPeriod", ValidPeriod); + AddInt(nodes, "ValidPeriodUnits", ValidPeriodUnits); + AddInt(nodes, "RetryCount", RetryCount); + AddInt(nodes, "RetryDelay", RetryDelay); + AddString(nodes, "TemplateName", TemplateName); + AddString(nodes, "CAThumbprint", CAThumbprint); + AddString(nodes, "CustomTextToShowInPrompt", CustomTextToShowInPrompt); + + XDocument document = new XDocument(new XDeclaration("1.0", "utf-8", null)); + XElement syncBody = new XElement("SyncBody"); + XElement atomic = new XElement("Atomic", new XElement("CmdID", "1")); + + int cmdId = 2; + foreach (CspNode node in nodes) + { + XElement meta = new XElement("Meta", new XElement(XName.Get("Format", SyncMlMetInfNamespace), node.Format)); + XElement item = new XElement("Item", + new XElement("Target", new XElement("LocURI", string.Concat(nodeBase, node.Suffix))), + meta, + new XElement("Data", node.Value)); + atomic.Add(new XElement("Replace", new XElement("CmdID", cmdId.ToString(System.Globalization.CultureInfo.InvariantCulture)), item)); + cmdId++; + } + + XElement enrollItem = new XElement("Item", + new XElement("Target", new XElement("LocURI", string.Concat(nodeBase, "Enroll"))), + new XElement("Meta", new XElement(XName.Get("Format", SyncMlMetInfNamespace), "node"))); + atomic.Add(new XElement("Exec", new XElement("CmdID", cmdId.ToString(System.Globalization.CultureInfo.InvariantCulture)), enrollItem)); + + syncBody.Add(atomic); + document.Add(syncBody); + + XmlWriterSettings writerSettings = new XmlWriterSettings + { + Indent = true, + IndentChars = " ", + NewLineHandling = NewLineHandling.Replace, + Encoding = new UTF8Encoding(false), + OmitXmlDeclaration = false, + CloseOutput = false + }; + + string serialized; + using (MemoryStream buffer = new MemoryStream()) + { + using (XmlWriter writer = XmlWriter.Create(buffer, writerSettings)) + { + document.Save(writer); + } + serialized = writerSettings.Encoding.GetString(buffer.ToArray()); + } + + using (StringReader stringReader = new StringReader(serialized)) + { + XmlReaderSettings readerSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit, XmlResolver = null }; + using (XmlReader reader = XmlReader.Create(stringReader, readerSettings)) + { + XDocument.Load(reader); + } + } + + return serialized; + } + + private static void AddString(List nodes, string suffix, string value) + { + if (string.IsNullOrEmpty(value)) { return; } + nodes.Add(new CspNode { Suffix = suffix, Value = value, Format = "chr" }); + } + + private static void AddInt(List nodes, string suffix, int? value) + { + if (!value.HasValue) { return; } + nodes.Add(new CspNode { Suffix = suffix, Value = value.Value.ToString(System.Globalization.CultureInfo.InvariantCulture), Format = "int" }); + } + + private sealed class CspNode + { + public string Suffix; + public string Value; + public string Format; + } + } +} From d0eeb19f2de58dd4f8ec86b4e3db1fb538e0d865 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:41:52 -0400 Subject: [PATCH 16/27] Add Get-InfisicalScepMdmProfile cmdlet Maps an InfisicalCertificateProfile (pipeline-bound) to an InfisicalScepMdmProfile model. ServerUrl defaults to {baseUri}/scep/{profileId}/pkiclient.exe derived from the active connection. UniqueId defaults to a sanitized slug. Challenge is accepted as SecureString and decrypted with SecureStringToGlobalAllocUnicode (zero/free on exit). KeyAlgorithm and EkuMapping are inherited from the source profile defaults when not overridden. --- .../GetInfisicalScepMdmProfileCmdlet.cs | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs new file mode 100644 index 0000000..8621151 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs @@ -0,0 +1,152 @@ +using System; +using System.Globalization; +using System.Management.Automation; +using System.Net; +using System.Runtime.InteropServices; +using System.Security; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalScepMdmProfile")] + [OutputType(typeof(InfisicalScepMdmProfile))] + public sealed class GetInfisicalScepMdmProfileCmdlet : InfisicalCmdletBase + { + private const string Component = "GetInfisicalScepMdmProfileCmdlet"; + + [Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0)] + [Alias("Profile", "CertificateProfile")] + public InfisicalCertificateProfile InputObject { get; set; } + + [Parameter(Mandatory = true)] + public SecureString Challenge { get; set; } + + [Parameter] public string UniqueId { get; set; } + [Parameter] public string ServerUrl { get; set; } + + [Parameter] + [ValidateSet("Device", "User")] + public string Scope { get; set; } = "Device"; + + [Parameter] public string SubjectName { get; set; } + [Parameter] public string SubjectAlternativeNames { get; set; } + [Parameter] public string EkuMapping { get; set; } + [Parameter] public int? KeyUsage { get; set; } + + [Parameter] public int? KeyLength { get; set; } + [Parameter] public string KeyAlgorithm { get; set; } + [Parameter] public string HashAlgorithm { get; set; } + [Parameter] public int? KeyProtection { get; set; } + [Parameter] public string ContainerName { get; set; } + + [Parameter] public string ValidPeriod { get; set; } + [Parameter] public int? ValidPeriodUnits { get; set; } + [Parameter] public int? RetryCount { get; set; } + [Parameter] public int? RetryDelay { get; set; } + + [Parameter] public string TemplateName { get; set; } + [Parameter] public string CAThumbprint { get; set; } + [Parameter] public string CustomTextToShowInPrompt { get; set; } + + protected override void ProcessRecord() + { + try + { + if (InputObject == null) { throw new InvalidOperationException("InputObject is required."); } + if (string.IsNullOrEmpty(InputObject.Id)) { throw new InvalidOperationException("InputObject.Id is required."); } + + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + string resolvedServerUrl = !string.IsNullOrEmpty(ServerUrl) ? ServerUrl : BuildDefaultServerUrl(connection, InputObject.Id); + string resolvedUniqueId = !string.IsNullOrEmpty(UniqueId) ? UniqueId : SanitizeForCspId(!string.IsNullOrEmpty(InputObject.Slug) ? InputObject.Slug : InputObject.Id); + + InfisicalCertificateProfileDefaults defaults = InputObject.Defaults; + string resolvedKeyAlgorithm = !string.IsNullOrEmpty(KeyAlgorithm) ? KeyAlgorithm : MapKeyAlgorithm(defaults != null ? defaults.KeyAlgorithm : null); + string resolvedEku = !string.IsNullOrEmpty(EkuMapping) ? EkuMapping : JoinEkuOids(defaults != null ? defaults.ExtendedKeyUsages : null); + + InfisicalScepMdmProfile result = new InfisicalScepMdmProfile + { + UniqueId = resolvedUniqueId, + Scope = Scope, + ServerUrl = resolvedServerUrl, + Challenge = SecureStringToPlainText(Challenge), + SubjectName = SubjectName, + SubjectAlternativeNames = SubjectAlternativeNames, + EkuMapping = resolvedEku, + KeyUsage = KeyUsage, + KeyLength = KeyLength, + KeyAlgorithm = resolvedKeyAlgorithm, + HashAlgorithm = HashAlgorithm, + KeyProtection = KeyProtection, + ContainerName = ContainerName, + ValidPeriod = ValidPeriod, + ValidPeriodUnits = ValidPeriodUnits, + RetryCount = RetryCount, + RetryDelay = RetryDelay, + TemplateName = TemplateName, + CAThumbprint = CAThumbprint, + CustomTextToShowInPrompt = CustomTextToShowInPrompt, + SourceProfileId = InputObject.Id, + SourceProfileSlug = InputObject.Slug + }; + + Logger.Verbose(Component, string.Concat("Built SCEP MDM profile for source profile '", InputObject.Slug ?? InputObject.Id, "' targeting ", result.ServerUrl, " (UniqueId=", result.UniqueId, ", Scope=", result.Scope, ").")); + WriteObject(result); + } + catch (Exception exception) + { + ThrowTerminatingForException(Component, "GetScepMdmProfile", exception); + } + } + + private static string BuildDefaultServerUrl(InfisicalConnection connection, string profileId) + { + if (connection == null || connection.BaseUri == null) { throw new InvalidOperationException("Active Infisical connection is required to derive ServerUrl."); } + string baseUrl = connection.BaseUri.GetLeftPart(UriPartial.Authority); + return string.Concat(baseUrl, "/scep/", profileId, "/pkiclient.exe"); + } + + private static string SanitizeForCspId(string input) + { + if (string.IsNullOrEmpty(input)) { return "Infisical"; } + char[] buffer = new char[input.Length]; + for (int i = 0; i < input.Length; i++) + { + char c = input[i]; + buffer[i] = (char.IsLetterOrDigit(c) || c == '-' || c == '_') ? c : '_'; + } + return new string(buffer); + } + + private static string MapKeyAlgorithm(string fromDefaults) + { + if (string.IsNullOrEmpty(fromDefaults)) { return null; } + if (fromDefaults.IndexOf("rsa", StringComparison.OrdinalIgnoreCase) >= 0) { return "RSA"; } + if (fromDefaults.IndexOf("ec", StringComparison.OrdinalIgnoreCase) >= 0) { return "ECDSA_P256"; } + return null; + } + + private static string JoinEkuOids(string[] values) + { + if (values == null || values.Length == 0) { return null; } + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + bool first = true; + foreach (string v in values) + { + if (string.IsNullOrEmpty(v)) { continue; } + if (!first) { sb.Append('+'); } + sb.Append(v); + first = false; + } + return sb.Length > 0 ? sb.ToString() : null; + } + + private static string SecureStringToPlainText(SecureString value) + { + if (value == null) { return null; } + IntPtr ptr = Marshal.SecureStringToGlobalAllocUnicode(value); + try { return Marshal.PtrToStringUni(ptr); } + finally { if (ptr != IntPtr.Zero) { Marshal.ZeroFreeGlobalAllocUnicode(ptr); } } + } + } +} From 4bcdf372d4bb07aab295200e1c5f7334f6d00d06 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:42:34 -0400 Subject: [PATCH 17/27] Add Export-InfisicalScepMdmProfile cmdlet Writes the SyncML payload from InfisicalScepMdmProfile.ToSyncMl() to disk as UTF-8 (no BOM). Honors -WhatIf, auto-creates the target directory, and follows the project rule for -Force: if the file exists without -Force, logs a warning and returns instead of throwing. Optional -PassThru emits the resulting FileInfo. --- .../ExportInfisicalScepMdmProfileCmdlet.cs | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/PSInfisicalAPI/Cmdlets/ExportInfisicalScepMdmProfileCmdlet.cs diff --git a/src/PSInfisicalAPI/Cmdlets/ExportInfisicalScepMdmProfileCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/ExportInfisicalScepMdmProfileCmdlet.cs new file mode 100644 index 0000000..3daef68 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/ExportInfisicalScepMdmProfileCmdlet.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using System.Management.Automation; +using System.Text; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsData.Export, "InfisicalScepMdmProfile", SupportsShouldProcess = true)] + [OutputType(typeof(FileInfo))] + public sealed class ExportInfisicalScepMdmProfileCmdlet : InfisicalCmdletBase + { + private const string Component = "ExportInfisicalScepMdmProfileCmdlet"; + + [Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0)] + [Alias("Profile", "ScepProfile")] + public InfisicalScepMdmProfile InputObject { get; set; } + + [Parameter(Mandatory = true, Position = 1)] + public string Path { get; set; } + + [Parameter] public SwitchParameter Force { get; set; } + [Parameter] public SwitchParameter PassThru { get; set; } + + protected override void ProcessRecord() + { + try + { + if (InputObject == null) { throw new InvalidOperationException("InputObject is required."); } + + string resolvedPath = SessionState.Path.GetUnresolvedProviderPathFromPSPath(Path); + if (File.Exists(resolvedPath) && !Force.IsPresent) + { + Logger.Warning(Component, string.Concat("File '", resolvedPath, "' already exists. Pass -Force to overwrite. Skipping export.")); + return; + } + + if (!ShouldProcess(resolvedPath, "Write SyncML SCEP MDM profile")) + { + return; + } + + string directory = System.IO.Path.GetDirectoryName(resolvedPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + Logger.Verbose(Component, string.Concat("Created directory '", directory, "'.")); + } + + string syncMl = InputObject.ToSyncMl(); + File.WriteAllText(resolvedPath, syncMl, new UTF8Encoding(false)); + + Logger.Information(Component, string.Concat("Wrote SCEP MDM profile to '", resolvedPath, "' (UniqueId=", InputObject.UniqueId, ").")); + if (PassThru.IsPresent) + { + WriteObject(new FileInfo(resolvedPath)); + } + } + catch (Exception exception) + { + ThrowTerminatingForException(Component, "ExportScepMdmProfile", exception); + } + } + } +} From d5afe6cccba6662a7b5e1b9640e2e988f6a9d4b3 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:44:23 -0400 Subject: [PATCH 18/27] Add Write-InfisicalScepMdmProfileToWmi cmdlet Submits an InfisicalScepMdmProfile to the local MDM Bridge WMI provider (root/cimv2/mdm/dmmap, MDM_ClientCertificateInstall_SCEP02 by default). Builds a property hashtable mirroring the CSP node set and invokes New-CimInstance via InvokeCommand.InvokeScript so no new package references are required. Guards: throws PlatformNotSupportedException off Windows; Device-scope enrollment requires an elevated session unless -SkipElevationCheck is passed; supports -WhatIf; -PassThru emits the returned CIM instance. --- ...WriteInfisicalScepMdmProfileToWmiCmdlet.cs | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/PSInfisicalAPI/Cmdlets/WriteInfisicalScepMdmProfileToWmiCmdlet.cs diff --git a/src/PSInfisicalAPI/Cmdlets/WriteInfisicalScepMdmProfileToWmiCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/WriteInfisicalScepMdmProfileToWmiCmdlet.cs new file mode 100644 index 0000000..87bbbdb --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/WriteInfisicalScepMdmProfileToWmiCmdlet.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Globalization; +using System.Management.Automation; +using System.Text; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommunications.Write, "InfisicalScepMdmProfileToWmi", SupportsShouldProcess = true)] + [OutputType(typeof(PSObject))] + public sealed class WriteInfisicalScepMdmProfileToWmiCmdlet : InfisicalCmdletBase + { + private const string Component = "WriteInfisicalScepMdmProfileToWmiCmdlet"; + + [Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0)] + [Alias("Profile", "ScepProfile")] + public InfisicalScepMdmProfile InputObject { get; set; } + + [Parameter] public string Namespace { get; set; } = "root/cimv2/mdm/dmmap"; + [Parameter] public string ClassName { get; set; } = "MDM_ClientCertificateInstall_SCEP02"; + [Parameter] public SwitchParameter SkipElevationCheck { get; set; } + [Parameter] public SwitchParameter PassThru { get; set; } + + protected override void ProcessRecord() + { + try + { + if (InputObject == null) { throw new InvalidOperationException("InputObject is required."); } + if (string.IsNullOrEmpty(InputObject.UniqueId)) { throw new InvalidOperationException("InputObject.UniqueId is required."); } + if (string.IsNullOrEmpty(InputObject.ServerUrl)) { throw new InvalidOperationException("InputObject.ServerUrl is required."); } + + if (Environment.OSVersion.Platform != PlatformID.Win32NT) + { + throw new PlatformNotSupportedException("Write-InfisicalScepMdmProfileToWmi requires Windows (MDM Bridge WMI provider)."); + } + + bool deviceScope = !string.Equals(InputObject.Scope, "User", StringComparison.OrdinalIgnoreCase); + if (deviceScope && !SkipElevationCheck.IsPresent && !IsElevated()) + { + throw new UnauthorizedAccessException("Device-scope SCEP enrollment requires an elevated session (run as Administrator or SYSTEM). Pass -SkipElevationCheck to bypass this guard."); + } + + string parentId = string.Concat("./Vendor/MSFT/ClientCertificateInstall/SCEP/", InputObject.UniqueId); + Hashtable properties = BuildProperties(InputObject, parentId); + string target = string.Concat(Namespace, " ", ClassName, " ParentID=", parentId); + if (!ShouldProcess(target, "New-CimInstance MDM SCEP enrollment")) + { + return; + } + + Logger.Verbose(Component, string.Concat("Creating CIM instance in namespace '", Namespace, "' for class '", ClassName, "' with ParentID '", parentId, "'.")); + Collection results = InvokeNewCimInstance(Namespace, ClassName, properties); + + Logger.Information(Component, string.Concat("Submitted SCEP MDM profile '", InputObject.UniqueId, "' to MDM Bridge WMI provider (results=", results != null ? results.Count : 0, ").")); + if (PassThru.IsPresent && results != null) + { + foreach (PSObject result in results) { WriteObject(result); } + } + } + catch (Exception exception) + { + ThrowTerminatingForException(Component, "WriteScepMdmProfileToWmi", exception); + } + } + + private bool IsElevated() + { + try + { + Collection results = InvokeCommand.InvokeScript("[bool]([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)"); + if (results == null || results.Count == 0 || results[0] == null || results[0].BaseObject == null) { return false; } + return Convert.ToBoolean(results[0].BaseObject, CultureInfo.InvariantCulture); + } + catch (Exception ex) + { + Logger.Verbose(Component, string.Concat("Elevation check failed; assuming non-elevated. ", ex.Message)); + return false; + } + } + + private Collection InvokeNewCimInstance(string ns, string className, Hashtable properties) + { + Dictionary variables = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "ns", ns }, + { "class", className }, + { "props", properties } + }; + + foreach (KeyValuePair kv in variables) + { + SessionState.PSVariable.Set(kv.Key, kv.Value); + } + + try + { + return InvokeCommand.InvokeScript("New-CimInstance -Namespace $ns -ClassName $class -Property $props -ErrorAction Stop"); + } + finally + { + foreach (KeyValuePair kv in variables) + { + SessionState.PSVariable.Remove(kv.Key); + } + } + } + + private static Hashtable BuildProperties(InfisicalScepMdmProfile profile, string parentId) + { + Hashtable h = new Hashtable(StringComparer.OrdinalIgnoreCase); + h["ParentID"] = parentId; + h["InstanceID"] = "Install"; + + AddString(h, "ServerURL", profile.ServerUrl); + AddString(h, "Challenge", profile.Challenge); + AddString(h, "SubjectName", profile.SubjectName); + AddString(h, "SubjectAlternativeNames", profile.SubjectAlternativeNames); + AddString(h, "EKUMapping", profile.EkuMapping); + AddInt(h, "KeyUsage", profile.KeyUsage); + AddInt(h, "KeyLength", profile.KeyLength); + AddString(h, "KeyAlgorithm", profile.KeyAlgorithm); + AddString(h, "HashAlgorithm", profile.HashAlgorithm); + AddInt(h, "KeyProtection", profile.KeyProtection); + AddString(h, "ContainerName", profile.ContainerName); + AddString(h, "ValidPeriod", profile.ValidPeriod); + AddInt(h, "ValidPeriodUnits", profile.ValidPeriodUnits); + AddInt(h, "RetryCount", profile.RetryCount); + AddInt(h, "RetryDelay", profile.RetryDelay); + AddString(h, "TemplateName", profile.TemplateName); + AddString(h, "CAThumbprint", profile.CAThumbprint); + AddString(h, "CustomTextToShowInPrompt", profile.CustomTextToShowInPrompt); + + return h; + } + + private static void AddString(Hashtable h, string key, string value) + { + if (string.IsNullOrEmpty(value)) { return; } + h[key] = value; + } + + private static void AddInt(Hashtable h, string key, int? value) + { + if (!value.HasValue) { return; } + h[key] = value.Value; + } + } +} From 183fb48c32ce18a4ba919e40500b4240a6616206 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:47:00 -0400 Subject: [PATCH 19/27] Wire SCEP MDM cmdlets into manifest, build, help, and docs Adds Get-/Export-/Write-InfisicalScepMdmProfile(ToWmi) to CmdletsToExport in the module manifest and to the build.ps1 manifest template and expected-cmdlet probe. Adds MAML help entries (description, notes, two examples each with an OrderedDictionary splat) for all three cmdlets. Updates README's cmdlet count from 34 to 37 and the cmdlet table with one-line descriptions. CHANGELOG entry summarizes the new feature, the default SCEP URL pattern, the elevation/platform guards, and the export-vs-throw rule for -Force. --- CHANGELOG.md | 6 +- Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 5 +- .../en-US/PSInfisicalAPI.dll-Help.xml | 115 ++++++++++++++++++ README.md | 5 +- build.ps1 | 7 +- 5 files changed, 133 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27598d3..db4ee9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,15 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +- `Get-InfisicalScepMdmProfile` added. Projects an `InfisicalCertificateProfile` (pipeline-bound) into a new `InfisicalScepMdmProfile` model that mirrors the Windows `ClientCertificateInstall/SCEP` CSP node set. `-ServerUrl` defaults to `{baseUri}/scep/{profileId}/pkiclient.exe` derived from the active connection (the `pkiclient.exe` suffix is the RFC 8894 / Cisco SCEP client compatibility holdover, not a server-side executable). `-UniqueId` defaults to a sanitized slug. `-Challenge` is a `SecureString` decrypted only when materializing the model. `KeyAlgorithm` and `EkuMapping` are inherited from the source profile defaults unless overridden. +- `Export-InfisicalScepMdmProfile` added. Serializes the model via `InfisicalScepMdmProfile.ToSyncMl()` (XDocument build, XmlWriter emit, XmlReader round-trip validation) and writes the result to `-Path` as UTF-8 without BOM. Auto-creates the target directory, honors `-WhatIf`/`-Confirm`, and follows the project rule for `-Force`: if the destination exists without `-Force`, the cmdlet logs a warning and returns instead of throwing. `-PassThru` emits the resulting `FileInfo`. +- `Write-InfisicalScepMdmProfileToWmi` added. Submits the same model to the local MDM Bridge WMI provider by invoking `New-CimInstance -Namespace root/cimv2/mdm/dmmap -ClassName MDM_ClientCertificateInstall_SCEP02 -Property ` through the host runspace (no new package references). Guards: throws `PlatformNotSupportedException` off Windows; device-scope enrollment requires an elevated session unless `-SkipElevationCheck` is passed; supports `-WhatIf`/`-Confirm`; `-PassThru` emits the returned CIM instance. Override `-ClassName` when targeting a different SCEP CSP version on the host. + ## 2026.06.04.2112 - Build produced from commit 3754de74f6c8. -## Unreleased (carried forward) +## Unreleased (carried forward) - Infisical API error responses are now parsed to surface the server-side `message`, `error`, and `reqId` fields. The 4xx/5xx exception message includes the human-readable explanation (e.g. "The project is of type secret-manager") instead of an opaque `Infisical API returned 400 (Bad Request)`. The `InfisicalApiException` gains `ApiErrorMessage` and `ApiRequestId` properties; `InfisicalErrorDetails` carries the same fields so PowerShell error records and logger output expose them. - `Get-InfisicalCertificateProfile` added with `List` (default) and `ById` parameter sets. List binds to `GET /api/v1/cert-manager/certificate-profiles` (optional `-Limit`, `-Offset`, `-IncludeConfigs`); ById binds to `GET /api/v1/cert-manager/certificate-profiles/{certificateProfileId}`. New `InfisicalCertificateProfile` model surfaces ca/policy ids, slug, enrollment type, per-profile defaults (ttl, key/extended key usages), and the embedded CA/policy/apiConfig summaries. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 1095688..89e2f80 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -45,7 +45,10 @@ 'ConvertTo-InfisicalCertificate', 'Install-InfisicalCertificate', 'Uninstall-InfisicalCertificate', - 'Export-InfisicalCertificate' + 'Export-InfisicalCertificate', + 'Get-InfisicalScepMdmProfile', + 'Export-InfisicalScepMdmProfile', + 'Write-InfisicalScepMdmProfileToWmi' ) AliasesToExport = @() VariablesToExport = @() diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index 799d13e..ffdcffb 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -1477,6 +1477,121 @@ $UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @Uninstall + + + Get-InfisicalScepMdmProfile + Builds an Infisical SCEP MDM profile model from a certificate profile, suitable for SyncML export or local MDM enrollment. + Get + InfisicalScepMdmProfile + + + Projects an InfisicalCertificateProfile (pipeline-bound) into an InfisicalScepMdmProfile that mirrors the Windows ClientCertificateInstall/SCEP CSP node set. -Challenge is accepted as a SecureString and decrypted into the model only at write-time. -ServerUrl defaults to {baseUri}/scep/{profileId}/pkiclient.exe derived from the active connection. -UniqueId defaults to a sanitized form of the source profile slug. KeyAlgorithm and EkuMapping are inherited from the source profile defaults unless overridden. + + + Notes + + The SCEP endpoint URL ends in 'pkiclient.exe' for RFC 8894 / Cisco SCEP client compatibility. The source profile must have SCEP enrollment enabled on the server side for enrollment to succeed; this cmdlet does not validate that. + + + + + EXAMPLE 1 + Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId | Get-InfisicalScepMdmProfile -Challenge (Read-Host -AsSecureString 'SCEP challenge') + Builds a default SCEP MDM profile with the server URL inferred from the active connection. + + + EXAMPLE 2 + $GetInfisicalScepMdmProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalScepMdmProfileParameters.InputObject = (Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId) +$GetInfisicalScepMdmProfileParameters.Challenge = (Read-Host -AsSecureString 'SCEP challenge') +$GetInfisicalScepMdmProfileParameters.UniqueId = 'WindowsClientAuth' +$GetInfisicalScepMdmProfileParameters.Scope = 'Device' +$GetInfisicalScepMdmProfileParameters.SubjectName = "CN=$($env:COMPUTERNAME)" +$GetInfisicalScepMdmProfileParameters.KeyLength = 2048 +$GetInfisicalScepMdmProfileParameters.HashAlgorithm = 'SHA256' +$GetInfisicalScepMdmProfileParameters.ValidPeriod = 'Years' +$GetInfisicalScepMdmProfileParameters.ValidPeriodUnits = 1 +$GetInfisicalScepMdmProfileParameters.Verbose = $True +$GetInfisicalScepMdmProfileResult = Get-InfisicalScepMdmProfile @GetInfisicalScepMdmProfileParameters + Builds a device-scope SCEP MDM profile with explicit subject and key parameters for downstream export or local enrollment. + + + + + + + Export-InfisicalScepMdmProfile + Writes an InfisicalScepMdmProfile to disk as a SyncML payload suitable for MDM delivery. + Export + InfisicalScepMdmProfile + + + Serializes the supplied InfisicalScepMdmProfile via ToSyncMl() and writes the result to -Path as UTF-8 (no BOM). Auto-creates the target directory. If the file exists and -Force is not specified the cmdlet logs a warning and returns instead of throwing. Honors -WhatIf and -Confirm. -PassThru emits the resulting FileInfo. + + + Notes + + The generated SyncML is round-trip-validated through XmlReader before being written. Pair with Write-InfisicalScepMdmProfileToWmi to apply the same model to the local MDM Bridge instead of exporting to a file. + + + + + EXAMPLE 1 + $Profile | Export-InfisicalScepMdmProfile -Path 'C:\Temp\scep.syncml' -Force + Writes the SyncML payload for the supplied SCEP MDM profile, overwriting any existing file. + + + EXAMPLE 2 + $ExportInfisicalScepMdmProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ExportInfisicalScepMdmProfileParameters.InputObject = $Profile +$ExportInfisicalScepMdmProfileParameters.Path = "C:\ProgramData\Infisical\scep-$($Profile.UniqueId).syncml" +$ExportInfisicalScepMdmProfileParameters.Force = $True +$ExportInfisicalScepMdmProfileParameters.PassThru = $True +$ExportInfisicalScepMdmProfileParameters.Verbose = $True + +$ExportInfisicalScepMdmProfileResult = Export-InfisicalScepMdmProfile @ExportInfisicalScepMdmProfileParameters + Writes the SyncML payload to a per-profile path under ProgramData and returns the resulting FileInfo. + + + + + + + Write-InfisicalScepMdmProfileToWmi + Submits an InfisicalScepMdmProfile to the local Windows MDM Bridge WMI provider to trigger SCEP enrollment. + Write + InfisicalScepMdmProfileToWmi + + + Creates a new CIM instance under the MDM Bridge namespace (default: root/cimv2/mdm/dmmap, class MDM_ClientCertificateInstall_SCEP02) by invoking New-CimInstance through the host runspace. Honors -WhatIf and -Confirm. -PassThru emits the resulting CIM instance. Throws PlatformNotSupportedException off Windows. Device-scope enrollment requires an elevated session; pass -SkipElevationCheck to bypass the guard. + + + Notes + + The MDM Bridge WMI provider runs the enrollment asynchronously; success here means the enrollment was submitted, not that a certificate has been issued. Inspect the corresponding ClientCertificateInstall/SCEP/<UniqueId>/Install nodes for status. Override -ClassName when targeting a different SCEP CSP version on the host. + + + + + EXAMPLE 1 + $Profile | Write-InfisicalScepMdmProfileToWmi -PassThru + Submits the SCEP MDM profile to the local MDM Bridge and emits the created CIM instance. + + + EXAMPLE 2 + $WriteInfisicalScepMdmProfileToWmiParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$WriteInfisicalScepMdmProfileToWmiParameters.InputObject = $Profile +$WriteInfisicalScepMdmProfileToWmiParameters.Namespace = 'root/cimv2/mdm/dmmap' +$WriteInfisicalScepMdmProfileToWmiParameters.ClassName = 'MDM_ClientCertificateInstall_SCEP02' +$WriteInfisicalScepMdmProfileToWmiParameters.SkipElevationCheck = $False +$WriteInfisicalScepMdmProfileToWmiParameters.PassThru = $True +$WriteInfisicalScepMdmProfileToWmiParameters.Verbose = $True + +$WriteInfisicalScepMdmProfileToWmiResult = Write-InfisicalScepMdmProfileToWmi @WriteInfisicalScepMdmProfileToWmiParameters + Submits a device-scope SCEP enrollment through the MDM Bridge and returns the CIM instance for downstream inspection. + + + diff --git a/README.md b/README.md index 9ce60c7..f155e8c 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Import-Module -Name .\Module\PSInfisicalAPI ## Cmdlets -The module exports 34 cmdlets. Discovery cmdlets (`Get-Infisical*`) use a `List` (default) / single-record parameter-set pair: invoking without the identity parameter returns the collection, supplying the identity parameter returns one record. +The module exports 37 cmdlets. Discovery cmdlets (`Get-Infisical*`) use a `List` (default) / single-record parameter-set pair: invoking without the identity parameter returns the collection, supplying the identity parameter returns one record. ### Session @@ -96,6 +96,9 @@ The module exports 34 cmdlets. Discovery cmdlets (`Get-Infisical*`) use a `List` | `Install-InfisicalCertificate` | Installs an Infisical certificate (and optional chain) into a Windows certificate store. | | `Uninstall-InfisicalCertificate` | Removes a certificate from a Windows certificate store by thumbprint, subject, or pipeline input. | | `Export-InfisicalCertificate` | Exports an Infisical certificate to disk in PEM, PFX, or CER format. | +| `Get-InfisicalScepMdmProfile` | Projects an Infisical certificate profile into a Windows SCEP MDM profile model. | +| `Export-InfisicalScepMdmProfile` | Writes a SCEP MDM profile to disk as a SyncML payload suitable for MDM delivery. | +| `Write-InfisicalScepMdmProfileToWmi`| Submits a SCEP MDM profile to the local MDM Bridge WMI provider to trigger enrollment. | Use `Get-Help -Full` for parameter details and `Get-Help about_PSInfisicalAPI` for the module overview. diff --git a/build.ps1 b/build.ps1 index 8d035ba..7be9ead 100644 --- a/build.ps1 +++ b/build.ps1 @@ -139,7 +139,10 @@ function Write-Manifest { 'ConvertTo-InfisicalCertificate', 'Install-InfisicalCertificate', 'Uninstall-InfisicalCertificate', - 'Export-InfisicalCertificate' + 'Export-InfisicalCertificate', + 'Get-InfisicalScepMdmProfile', + 'Export-InfisicalScepMdmProfile', + 'Write-InfisicalScepMdmProfileToWmi' ) AliasesToExport = @() VariablesToExport = @() @@ -204,7 +207,7 @@ if (`$cmds.Count -eq 0) { throw "No cmdlets were exported by the PSInfisicalAPI module." } -`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificatePolicy','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate') +`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificatePolicy','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate','Get-InfisicalScepMdmProfile','Export-InfisicalScepMdmProfile','Write-InfisicalScepMdmProfileToWmi') foreach (`$expected in `$expectedCmds) { if (-not (Get-Command -Name `$expected -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { throw "Cmdlet not found: `$expected" From 485ee8a7dd6a202eaab02ae8f2305e034a808c7f Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 17:47:39 -0400 Subject: [PATCH 20/27] Build artifacts for 183fb48c32ce Auto-generated by build.ps1 -CommitArtifacts. Build 2026.06.04.2147. Module DLL and manifest embed BuildCommitHash=183fb48c32ce, matching the source commit they were produced from. --- CHANGELOG.md | 6 + Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 4 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 322048 -> 340480 bytes .../bin/en-US/PSInfisicalAPI.dll-Help.xml | 115 ++++++++++++++++++ 4 files changed, 123 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db4ee9e..cd3c41e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.2147 + +- Build produced from commit 183fb48c32ce. + +## Unreleased (carried forward) + - `Get-InfisicalScepMdmProfile` added. Projects an `InfisicalCertificateProfile` (pipeline-bound) into a new `InfisicalScepMdmProfile` model that mirrors the Windows `ClientCertificateInstall/SCEP` CSP node set. `-ServerUrl` defaults to `{baseUri}/scep/{profileId}/pkiclient.exe` derived from the active connection (the `pkiclient.exe` suffix is the RFC 8894 / Cisco SCEP client compatibility holdover, not a server-side executable). `-UniqueId` defaults to a sanitized slug. `-Challenge` is a `SecureString` decrypted only when materializing the model. `KeyAlgorithm` and `EkuMapping` are inherited from the source profile defaults unless overridden. - `Export-InfisicalScepMdmProfile` added. Serializes the model via `InfisicalScepMdmProfile.ToSyncMl()` (XDocument build, XmlWriter emit, XmlReader round-trip validation) and writes the result to `-Path` as UTF-8 without BOM. Auto-creates the target directory, honors `-WhatIf`/`-Confirm`, and follows the project rule for `-Force`: if the destination exists without `-Force`, the cmdlet logs a warning and returns instead of throwing. `-PassThru` emits the resulting `FileInfo`. - `Write-InfisicalScepMdmProfileToWmi` added. Submits the same model to the local MDM Bridge WMI provider by invoking `New-CimInstance -Namespace root/cimv2/mdm/dmmap -ClassName MDM_ClientCertificateInstall_SCEP02 -Property ` through the host runspace (no new package references). Guards: throws `PlatformNotSupportedException` off Windows; device-scope enrollment requires an elevated session unless `-SkipElevationCheck` is passed; supports `-WhatIf`/`-Confirm`; `-PassThru` emits the returned CIM instance. Override `-ClassName` when targeting a different SCEP CSP version on the host. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 89e2f80..770a190 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.2112' + ModuleVersion = '2026.06.04.2147' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -60,7 +60,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '3754de74f6c8' + CommitHash = '183fb48c32ce' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index ae5bd63efa059af72dfb1a735740278ab3943d3f..b6e72de8a16bac2b8988d64d93e9cab8c8b638b7 100644 GIT binary patch literal 340480 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 literal 322048 zcmd442b>>8{r|uBDf?-6Nj|yD-K9VRBs4kEpTl7amYgoFf;-U28^ zDN+FO8-F9*v{C^bz9f>()E=;^CX*&vvJp1?K;MyO8tcngsD>)*b(!{sj>?0cGcmH!*t zcvldA3kY{R5rq4)Bt-we^|L`U?1CU0?A+gNar+a3AfIs0v%h&_fATR09d``-Z@xmz zanoy!<89u+`%aE((E$LB8*$VNeXV}A>UDjxYjSkZ5e|D<_T|Bszs3_jAsfnky$wM{fv~pIlp; zdm4x4)Le;L-o4L`BQ8BHdG`^z(3@`S8BuU!IdNBSZc@Q5g9uplo+&VbnH$f+|sdY*wI9v1L^IU({lH^Lx=946q4l5)_`;s#=dEZq`kb&9IEC=r-$!MI&Rll%AGkx_(56*=VCwa8zX+7t|+z4}nJVlWQwz z{7CT>$^uz$ai1f^*EuROZXIIpVW7Zdg+ElqD5|y&THtSZ_ZRl2E zTeo^5)i-h1ln{nU+*5FihNHfd#&zB1zm7%ndMY(s;xU! zY%leU40D$?=e0uUP360D9lMuuA;tR5w(ez9b4jC2_wuRqJQV;A_CN)II@SXf0B&m@ zr~niUr~niVr~s4FeCz5=InERB zq|-ga{C-cEQcuO&�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%0As0TFagFg%U}YGJ1m0< zFqT^e6JV^c3?{%>X&Fp_ai?W40mdrJU;>QQmcaxVYb=8aF!C*f2{6`L1`}YcvkWG{ zxXUt_0OM}UU;>PLEQ1L!)>{S>U~I4qCcxNe8BBn2uVpX+#wN>P0*w1Cg9$M1w+tr0 z*lZb0fboE3FoCXL2JgY>Fs0xGv16#y=quZ2bVqHcfQRBO(0K6A;Rz1kov67`Xo3VFQ?!ro9*yx4Zv80-@@NFgeHJ0#x>}17U8%k6p@GSaK z4%V*NYzjZU#3fK}c!1nwkcWEADH&+Nzc~KkwSqCF16?@=uiw2_{D6lT#DxI;qP9N>8;OQvZIWDTYV!hp34Y z;}eVde}u)j;uB4Cbz%cfq#v?x3s?NN( zfIHA)t^oD=K+$Pvj$(H40h4H62Lb+;L%Xf;dmO*?YzL3dK$*X980DAd63RysJPj;SD{vD zb6yd*C!9Ci;U2by*=Cp7(ERdO5mV9W*3+oV4r)`I7#gUqQXeBpou58DaVD9(0-<(n zN!rH8nvt%+2;?xvSdZ6N9+_D`JJwk$Z=Omf{ga;Cpl+xi{Os3hdGfXY0fl2-Oa_2w z^a$DKo6T*FfBCxpR5HE0mR!qAPx_n=vYS{C`;bjiL=kN!F{%S~)PC3%B z9E)F?pYd3s@I_bnqHj5LWROW2yy&WkCx$AI)?o0=(*g&cd0N)shn6a?3gz=?brEvZ zKM2H+>zKeAV~b@l0meg?!2}pvErSU#wpj)fU~IPxCct>uGME745zAl#j7Kel2{3k8 z1`}XBW*JO?@wjC$0mc)S!2}pjS_TtfJY^Y7fbq0tFagF+%U}YGU6#QF7|&P+6JR`R z8BBn&+cKB{V~=Gp0gI!1-$t-ooV{SzZLp0bSon2rU1${-jl2Dph_<_Iv2{fD=3-42 z?+J|oc84qNE%^tDHFRh*t`#+S#dS90 z;uWvs=(GVkuo3UCUGH6=s?aC>JID1up=!n5sf!@iB2aPFM|@DNi<&jB)S^Wc)^qC z8bsqYOrmQM{jH(v5dFQO>k<8fq3aWkSJfzeL!$9g8qqfsE!(u45Ka4;oi83gXAO}F zSms{KU;>QiErSU#Ua$-%z}ROQOn~vCWiSE8OP0X|82c@Q3A6`2mtKap!ahsP1^

|{SZW4^SJpmJs>xUOVsS)@^wLBv}?=QajW31#b#WKTMLtt_ikZj5&ER(6C7PC zg6=8K6U|#B%#BaDAA6^wu#YnbHeQ~{hzNeXj`c0wr|^??Ul^7EydyYJJy+J%_&gkv zcoE^OMGr*BM~2?hk(cGVIRz(=z1=J7$F8fWtodiKCy}3mV+Do%Bdm}mlvQvG6tADK zj#mlz?*p}DlWIUa|0aP)|Dk^7QEia`>Cl$FAcVXVpHwxPd89tarYlZbvsLa`~hOWXop*51*{5}iCV8(2V7G#9e11vCj$U zQkQQ4hqrM!7@`01>pT^|6$S8TsX~rr`EM9g9$KRvkWG{c-=CX z0OJkIU_$D>8o%g5On~vR zWiSE8Ny}h@?aiY)U=ZA2KI)|AoArv&NWrU1rA#OP#`&@!=NgNL$UPb{f-&`c2 zhY<8j4#u>|C0*p^Ag9$J`wG1ZMrp?@eX_%h1-i2xfBJ-?G6_`8jL)>-d4zw;mKcP!q zzI!;_z~Q|J{qR8-8d7SbfWSPrV@L@;N4<9LC>@{^`)J+|XJ5<#$eE*x&{D#kR}Mzv zok3w{g8B77i!#}Nf$x|OM=|DfH;LSX$Y4qWeAZZ2k-*Mi$^dx9EeNb^qk|~} z^y#X=W56aumM!f1veEny0XsSfnLMar47OyL@4totq0I!v5`2e>D1j>F#^QKPZ_2C$ z94-L`2QDE(){sAA<}2dy?|=gEjYZ$@a70FzNXn^?=8cIBi}a%~Ixp`E_{o8OvvJ*N zBE$IuZT?RTeHNMcKO;KAf0lmW2fIMOftZrG;-X1)ky2eU^d+LdCR)Bl`*#WGfK!*I z_1AesC5Dmb>NrvKkn$T46<>pG*NU|WFFUAOH=#n4Nw5P*;128tDe;L>2~nZ1XPf0S zt+|cyL?RV`xD-CB4Bqn+i^X~b^ll6--W|Aryx8+)uCURKpd6efgCk_n3(9~Sg^QAE zmcw)2UbNQ7J+Uyy`Xb4^QcOUErSU#E?Nc?V0>j6On`C8GMKQP4H1`Z1QTF^u-Q z{43@}y#LV4o=xZ`E*eFlm16LdnQDY9!NMh@X%k3R#1^C92!9fO5+l!aiHDDw-U`J7 z6kJwo4+NEdBLp=zwcD3ZAMM?4QOc7FFwuGf~B&y~SANr^5XWzza{OwXRF` zR28Sd^Nc@w7voLX68)80PSr>*QDRea$&#DqknNOS9w1gy;HJ51LPcmz<;0&d9pA7btJe4~Q&fubfvf62ct0hEp<-IImy^ zKO%#YHiKIWMk0fG1vztmawh+-U?h@f%`cey&rb0kEEtL8r?25ayafd__{CXX0wRMc30T?Q3#JUv2R#Gj7Lja}A1eRQi$hAGEd5U#!FM|NbZH=F2^0}rpn3TVw?0~><<+O0jX=C!^UffSEZXvL zj*7=CE4RFx2(ai}4%WJvq|11WS-!Sd?s#W}$_lPVg4(eYY(pGJhCbx>C*V5%Xb7*5 z*STgW6l1!qLd@9LSs4TDwI4Vu>UM%O$kb6%Nc?Ln~3b)A7a=XhG}s|k)S}>u@3HOaNV?f9rU4L!4%U-WW#L- zRhsL3ooIPXTpTk*0z@IeV&QrckPUm(VAwETFN?<+IFvpHL0}~Equuk!B*Zkr#Uh@y z6>K?wab)gH$nxGe+Ejt_p(@-sA=OHx;M5C|y1`ng%rzs3>4>YD=19|t5&q>!A!{tB zK$Almg{pG^S~XV`ssMIhAZq153FqGc?bvfuo6f-E$x$FjUW*GE04j208;G}RmKH8- z1Dv9e4G`DYEo1`;z%$|yhz(TB`JVa~eeED95c*cNoF9ozhq?yY<=y_JP(eC=C-JY` zM>{PW3CcsFx3?^)q5Rqadm;fWyGME6vXBkX@k!Bf8gz_?;4`a)ur?*K@ zrA1GfxCna6zzP~mcc|}d!l>4 zOPHHZP~A*_ex3EqYam)6i8$5a7rI0+4yYxtWE$r!eL zegvThyk_}~lT>hZr14U z;*%%4oQWqeX$;*;|DeYPz4qzo$Plkys$ROFfPNO4KQ=U{zOAEA#$ zp#49?e>iCRYtgNJ3oYC8qJgK>saB&}?HaXf;?^9em#VP{TbI$BjLWlw~KOJYWq^~dUR9u!`ytJW0kf&+ONgZz$lE_?*ATeSoK<2_2@=rl!n(zUom zRl+~j2`z)a?>Z14og+epWMg8?V~jbYXX|+R&WBqs=I6 z!{Ja4+cDq8^rdE$Po3F)I(gMaS4@~!z1558Ma?OEzUgp0;XKiNRBx{uir6UiU2CFG zXiC|T)4!@I<+25RIz_3lNuzp4sVcoFyal0G<+Pc#4(VN#=2K4jC13Rshq*C*IyF_p zvPts3%<0v>Pp59oiBjio%^&Jj#n;?D#jAdDHJ<2If7hdMdRGc>Z$#nU-6?eEPu*o9p&AU#HRbO`+wk}rPI_BFUv8q$OHttweXU=L@ zta@SDxUsQn>jmew&rt(w2Jt5;QDM!6kaN8!Dk=FXdmj_XO` zV5Ik|$6HffTFxQueb<{fS99V!qIR5q>?h2#N>U}8v z1G#kV`%U|FN>DqRQOek{RC;1v(rVRg3Mf9KvZbkXwQpHi!7@IG^aL(~)z+N(vA6A{!{zlO$Qq;a6>lexNsnQ&v*= zTkjU#ysFf2qFYU9fn6u<+L9HWguO+n2S-l=XC{YbmyuoloJ}eBwQmFK{b?l8Dct&Z zqLsbsnV}SZKZU}hu)QcXv|;|xD0S0HvMBcy((nWRgQ(p+wwx0U$U9K0wbh3(_ z)4ue?szuD1J6(hCXL<-|uWH1a>55v!s*PR9>RxO^c6g-@g^x4++O)2)tDD(YCyq*k zCCq>|#;S>HtFZw^j+>GHEH&QiO0}U9_!@wT>2!+w}382aS3B{^1jLP*T6sIaO zDmj=?g2L>Gl${3=DvtYtIY4bk62g}S)n=r>I=UAewk1_PE-zwCuWl4qU(H3z2iJC7 z*Fcq0jTk*Q>Wy4NO*zlY{S0c&X!rm^>1q_CE`119Qxh5e)SpldHHFds+X&U7y*Vgh zR$oGO@trq98wL}qrxq}JXAq$#^i>kXg$*Ipmd>67I>hC5pxr${4>IaP`{RHvFzQWr zD?oKQ&prz4L!fb-=Rk#%g@HchxMAudqi~jNwEBTj7N;Di{$!nP8A+v2RTdGqeh)57hL&MQ3O0qWnE&;|4+Lb-zpT~zRK06jg3&=pnDH3w+k@8~EOR8q4c8UjR9@2o232J=^EN^gbz?@6EOm}n4jFzs8^=K=8+Qif(^gJ*WR*bg(6% zeT?E%_H0VIU(lH;gkIG}Jd{hqB0_KI1P}H8g~JIQ)g?Tn&rw4SD$gl%IptAZnbFG& zDejnV;vrqH;TAigTQYiq^?6Q@Vzi2DbV*O;Jo|EuF6&(6qEy=+BT08SEXDhxkl5PsL2gfB|#V066)Zp8Ae)KQdXsYW@Mtdg{n(kW5s0^1d!?m8#pIpLB*S(CY&!ChmTrV^Fb~T|j zt~VLI#prI=hm1aJMR6NkpD^0CkkBUA7eM${&={)U!>+$LZs-z*7a|$4IEdBb^WKHhd5=J`!O%gPGd&w#{?7Y-sdHY>^FLU>jpqCb1wTj>~DP> z=oQXo22x_i6SR_1qWcKvvT;%Oq4*w$`?!~^;LwQfLmL2{;Op*19Og#%hm3w&MyRCw z6r=i$2~~1`!=(=zPAJ9wJIC!?G-?_l?1)63&-5dd?)HWg+TEW}U3WP~jrtO*=dQ@8 z?_feVxvMZ*J&4fF?rPz4aNX3Agqpc;3a55xGx|R>2{mN&{wRZP4kx{Q52O&+B%Jhe zevOH1$|*12VNf$hH8__x?*A|f6V#beX+d4N^sNmZo!&sTarfZ3I+G3R%_V$3f>00l z)NqZ`XZL(`dUMs&J%iC`pqZ}T?)i+iGaBT+i&4#96gSAdo{?M7y^J1XG{n7y(OJH3 zhq}^ydq1NI0|||HA7nJP51|R}*BCuNm{7p| zCZnr^2u*gs%eCD*lF&5wNiJ_fk4ubBb8Ww$KxmHp3XoDK^9k()qE`8-`=e7Ds9o+q zIAz-rgbuh%L{K~Qzol#M2I`=@EThaZ233rp>y|XznVY9yaVIl6HFsxjRrf3IbVk3< zA@s4kJ)>LZ6Z+KMhtVDL2%U2eWptIV`_`QYq*U)&J9Ce#@7!}at`W!m$Ozx{Xiag- zb1%o;bvxza5j2rYDB^jHBN4`O zEFC!>G4sJfp*0!Z6QbMz3<*D9>s}?Kqcg&w5738BOqP zWz>XI20S|$-Nm`&dR}DIpHZIYFr(Eh=YyW4D5}wWjGptfX0(-aIpFETD2q!t>>18z z7o#JdiHs_9%D3@^igKC7C7kly#VCJRwXO}+XPyTcy~F5p&(|~U?Qk=qGWyI;Q(;W90$GO8kWt76m z6ZScy(XeLR*@T^S#D#~Qcf>`6ec_0U3j5L#S0wDBBQ7TFk|QoQ?6M;+F6@dUESE*35zJ=!gYEPp_H(qj_cCHN;-Vs+LtfC{XW>{rL z;apzru&R!f^};fWbeZE@I@eQ4Z5okOrIM;RrVPT5MpUSxRqvv6JzCX|r?5&n3XddF z*tRN#;}R&`#A%*LCpw?Qo~c!FZ8HuRmdyk`k;B3{T+6AX%1)|rO}QtFQO?UUDQr=x z4r1RbN%XPm6!s}Y;qZ!$z+cJ|w&RpedB$W=Y!26=S!xr|;jwKHn%Z3}gH~-g=N6oE zT3RQh%uVZw(By91Hm^MFnp87NN8j;@_bZw2vUAjb@abX--7G-Z?1Ccp>SEI zrY4Qa^F~rRQ<@r?_I1`PEp1#-{=%{M6{ogHOPl-;Y0}d25Zk8=X`@{xh0Rha{5pn0 zljnAB!6O`QMzYnJQhw+BP0lO16qAD~{rgH(FB3bPuX?uxN%b^`soY0~)gVp`k5{{y zK2eG|7phR$sXUFD-&7#_S024@=Mj4y#}-W_zLDJM-;{33GUe_}qclGiBT1b3{Id*3 zPE)#59#gK7!IbXQSAPY>T^d5UAsQ{C`x&TLsQcuthYMcMt@{bnmpEURo3=#rtgm- z{%j5p@;FwDbzYmt!?oNNPgN(IsZfR5Vj$0+N$EtFVVPTV=+x45o=KgWxsdV>(x+#g zLb$Z_CkUPL_vaDP)b8O7%J~3?TY1LW$KiJz9_GGwiDmny0`)sn$J)h-?p>Pd65uei zBGCicPGXpD&h-1$h<}vn*4*!mK9}-UE*^oW@*L`HFQ-*k%s7X#mRGxoaDDO>gwJpo z?Yj#4-WtCkbk^P2VKk?A(%)oJ4u)^&uUXqZPI-Xk{4n`Xq)E>rojBz&_OpfU-`U?y zdrjwjJZwL&bL%|H;TIe_Wowb!)JN~080FVl1X|FMTEC?!yu!pw>k4y;094Aae-zSbVR z-XGkjs`Q*w)ss=R=Nuo0Q{5R=EkD{_1N?A=TA5Lz@Car`-4D6Pz3(G?`=&w$(l;$j z_8(K0uFdDZxdY*i$My>;b&=Ba8mCrG>l@t~8BANmbDkqoXdG~k2D`a+I&+&I;qfqq zN1itd_0!~(Mkw(dkJZjv6t1JG*CJoDpk`XsZ3oQ^TTNk8rn`1%hulp2&g5~!ghpmF zY8jcGqldACC)j$OwQ%;(ZQNT;&oyJF$+>E3CzNRN|7ZCNms_x`Zpf!P_b;Q{7}nU0 zWcY)}Z5lVMo&43VH}ufEGllb)Q+U=xVacHsM%+x{kdD1kO5v9M|9W1avGEyRe>!{g z|DAbZa4hw>*&J@<@Iwywa_FqPv1ilz|99qYrzFOfQn&~CgMG7L>lg{m+NNU00Mx6k zZwSKm$)gZH!(p^<9O!#%1Q0s&H#KTijM~CU$1un64K1^Pk5Zahz^SGGlab#kPm8pv zknsB&GZ9{?HW%TRvI`Lw9{Ja^acLT+;~i;)^uv}Mq_ePQR*+wQj$~d2j}09$wn%t9*o7B^|`S< za~JRx-$gphGS?cP$@P2}4?z-pU-k&-!oCYVDXiRvLU;DT zs`XUcTCY{Dr0$;oCPKP9D>!SH97i+z8eXdp=Gk*8dw#~1KLN?N_?93xo>!I6@EWOq z7OkjLN>ezmI9(gTGnz?b(o<}~Qf}nkGJ11bY!1&{PP;Aa>DuS}0J80>@+m^67s#1g zyBf55xlwFd+Id`iDV_Sxq;i)K?k@Q)!m`DwUN4pX5%g8Q%iF{2YBPuSWes%X9zCx( z^-xpy;k>HPVSW#mKb19>%l94oxi1^tJ^si=M9?TSEHz z4fQ=)>~Dk(GAJ~*-9OEfY<-W;Yn?sRj8ulxf%VXWHD;{nD%(b%%B0nh<@B7>zRO%s z&pG2bT*_eRzP0rJ|gkn7$e!rOLB&N4bBl?r!6dvMm4~Hi>{4_xPdsdM3zw8ib* zD~UJGGPtTCkIbpX8o@I&fP3`fijP#SshWpXNRC%S zmR3%#sVYqwjXwK*JF?G?ohh8QoWc(vZI?OGkg&^~KN?Zkvm=G%ySDNaF8u*B`()5a zOJ!;G9rud|vxvTz$C(4gh&G;EQ=|8?QX%cq(wPW%Ce=h}M$R?WiN7+n9>Q}KiFRjD z|E*M&X3ssis*-9tq7nFu6KJ+N!adh`FO6Tz_%n@uOj)WN<+Ha8g`+YloSaHwYAl5$ zi5*?tomwULoKtQkg)a?lh1jK~Y4$e~zRA)WIn6kBDV@@o+8Jq${AG(@n{#t_JLGx3 z6NM9Mx5HJYUe_C!=-QXcwhPwOtfowj2Jnb&WLVBRG<vN!C>ix3Y;fPYT zqg#?m18dSKwEkh5TTRXiyX zr@dX5ihpQ1fWpmPAHM@IWvR4h7wxmiuHQPNuISIRs zmk7tJ)(>9=di;WQ2w!k*KsaE|w^i}3Km*)afO9`MTcRIwq7Rt?)a&4OMl*0KJOmjz%Xk68= z{R!m%H12WmoQ5{Vtv`Vd5*EuW+PfR#2Vwg8umr!9T24#EW@Fm<> zL61jd>yj!-(7uQ`?Dwu9XlUDPT}q`28rwDw`@L%j>QygWmsa%!4XPKXN~`9Ac8|%{ zWmG#s2gbxU)VJ?N(L42_o%Q zRqj;NMx@(43TXRn|vRuT%M}XQpJT`HWVnxT9vKaso{dYS`~-4?8Xb4&>~y6S5pMdX%VN|tJ#9~ z+#07ls6~R_y7gjg2X&{QDYs zAnL`P)ImYii*Hp&1W_-(RlO_d+4*t0vpOZ{jrkX2JFD}8zJ;#4sILY64PAFpKM7hJ zXq?(r{UvBqpbb!X4Qls=5o0`^Q@g36g7Q3lfJz#~R^DAzlsFncyDK`7gRY~N?yhPI zqCVC`H4sF7tcPkLi27Jh)m{+wv7V}%AnIeiR6jw~$9kz@265@V)mVwEiuUWRCJD+! z`}M~2W+TfV&9ikMwLp*;?bk=GFo<*MtJX=}XSqXD`>IWXzRn#Bv`tXanNw2xsV4-L znK>J1k3pPEf3;uYsNMUk*91|!_gBXSk?jsp9|viad^q9C&Q;VM^9zt;Jw zBh>AJCb!-Qv`o-5V+Rx+sn!VEKQ>*BR2vQA+Ky6NB#vr3O6?FtwH>9N5k$2et@a6` z+KyI-1yOCssJ8@BZO5n&1W|3X)hB|ew%O`SK~&qZ>RUln+p+3bK~&puO4l;FrrM6f z;b5Zq`q_HCN)WWCKHf%AWdxBX{Hlr|(u7}S3L;HRP;~^6CMKxH2C*h4s@4)mnwY5m zBZxFHQS}r=nh2L_`h;%kpJuirKHdVbMi1ac|9Th}+nWo+oM0%O7P75Nv zOjlnBq7f`tT@gehSg!inAeMTD`di{i>KQ7$wrL}hdWMPh2pCGcAd1|{LT8++EPYR;d=zR5@ zAhM+e>VP1!r3LB@L1aq{)d@jlOAFOWL7(M5l)6Zr74&uP<3N`U;yNr=KS&%&wpjfk zh$LIA!s?hdBFUDh7(pc25|t!~BwMP=3nIyus#HNF*)mmK5J|R7)fZH~cDBAlH4{|7 zb{y`q+6nqBcTeha)kVL2pL{i_W)(Rr2SE+jik<_cyRzaWT9!XuT9vAd=?z=#{4PwdGsFx&eLW}&=HR@GC zb6RW!Iwq*+;{4Qn^`W3qi#Gy&CTMLSKXt9TC}>k)BhdGPT6ywQ*QwtGb@6Nja^t{6 zbLWQl-c=EUBB<_n;f-_CepL6nR9QiXQTMx5RY9jv_q$b=p!=6(>w8pPLC-IVQ}?JQ zg7Tr4^{S1ahoP7C>Q+I=5Vt|~67&_~HmE^@zC$0|s749;8+~k}nkcAL+x*mf)pSAC z+inE9UC_qWXHqw*rGlPXeHI9BxCLu_pW4WXR{j@L?^6frQQRu^*YK9=eszoy-3NS^ zx>?n~$;5rq;IGsNR7XK{SMZ>^L(t@yFy9vSnxG?rINw966^@#uJO_Hp`L?RvE^+D+by?8Z zmT~$~^@E_?mKS3mReuUfotdAyLxu4f8w(>E&fEwTE9m)gar!ZpBefxQ#$H1ib*;eL~e2bPTrpglaBm`KWZ?ld7G)Zd7d`ysUx0g%K%}1{8e? z9vFjaPfAx$DZH3QaojteR@oA_7~}lYDo4;=80Vi>c%_U|vUYc>`GQEhJJoVQq}^R= ztsv6wF11MzY4;hmRS;?S8TEu9((bcrw;T^|>I@(sSx7L8PVU)Kx*G-M#8}L8RTi%G1!)k6P?`6)lKb?0Hq(AlA|gs+`1; zmR?ZFf=Ej*sA_^}Hr%J`38L9>pK2P0~`Gapi~8pK*UtlpM5($Zn|fgsY-VfCpXT2H*Hz7$03iC5Kkf=Gj} zsb2+=247PyoUubTNE&=yMF}DezOE7lkp|yTWdxB1-%wQrkp_>bOhKfGIbLvMyWFhC&UxLU&&MPn8>!Myo7IIz{6+{;Dg(@M4EaVGSQ4m?d1?3Y&R&YVp z6!ckcW8asmfuOH*TLHB&h$XwI+DjZsc2RW|M3P-p{REL@U#X#jNV2cgSV1J&B{fM9 zNp?x)2_nfZs|A8cvde0PAX?LYt=0*mHSO2xK0%-5cJy6Q+XQ``+YRVRgIMZs)EsMiIN)ZeP(f=KFb)yINJ>hIL&f=KG`)FnYA_4n$kAd>of^@pG*CJZQg zRe742HhKxi=U!DY2C-y6sNxbwlKr5{2_ngUP$_~AL$V)LH9@qh{88N`h*p(9siuNx zRr!;;MG&nje^#9Z(W>%i)kn}V#QmZM3!+u!FKUb+T2=n40)l8&`Ky{Ch*p)qsd<8E zRr#B`L(nQJUKh#5l?!>zM5B0d9i&&Tcsh$<|6V~N_s+R<9 z$GZG4^{SxfurB{g9TP;F|66@1h&2DV`ph8KuF@BSC_Y8$syM_3eFe{6`uSYCWDA3a zwjAm6=nq>N^i7i-pI1k;HRybk*}e!}qn$x-w_WCo(l2x{=wREsebKsiCxcG5eaIK9 zTXi<*P?INoar#_WLaS7zZ-jB`n7F%S_S=rpk6&=(<9VAo8#_(>a33!`e*G z6!dwoY~5VX7xaCvIMrM)7j(H>wr-)<3i`8K98TfcBxpTkX{omg+5%Zx>L&!zOxa5B z7DO{;E4^RPqut_kYyFy_m%CkzZLNla%>j@$a zcF;`?;u1RQwi4$XcSl-BeXF3G#;pVDEoe;c9clm3g9J^@T?aJUAkL+eo+xn{wKk`9 z($fVssI?8~c0mu%-kf%;UMlFB+1r5D7{s}B)*B?QDQ4!*`awarVrK5FcL<^yb>7R~Gbgw~as<25||!bsa`@ zcl~%;Z~cd${MEbD`siUpsJvBb%%nqUef4EQbU)osXW~Q?l7;HmU)K>t_3N)23kpNr z0Nq+p65x6UG z^e=*DqowiPt6@gFYtho9bflp9@Pm!k@q*T%H;&e&1tkxI*Iic@RBsr(?m9!zup;of z>)L{*7J=7Y-)sw#iRW)VWrEYCu0NXmqWO zK+g*z?dIr%f=IhL`luk%?j-%LAkyw6eOeG%-DG`U5Lw-1eMJyi-4y+kAhNnC`fovG zbyIctaMNOBbyIbmAhNn?x}+eox@o$SAhNpYI!zE+-E>_`5cQ5+-B1wqj$GYR5Lwm? z-9Zpp)(qWU5LxR?-Cqz{>r6dd5Ls)U9w&&bHBV0wMAkD)&k{t|GfOWLL{>LjuM|X9 zH(TE=h%9T4zF!bo)*St?Aex=#>Zb(J>@-*J6-2Ys?fPXwG&|j{j|eK??ReTe{f?j- z-97+1We{8Ie0@&hz8QZeZN9!ND9ZmO(2s)t%082}K>sPoJN8Q;?+9)q&SjyFH7H{D z+N)^`b&{ZCYkvi*Am|VG)wD$#kI(S8Fv9Km6{vj?c&}-q@I$u8}==1P6m9O^- zdKKlZ)h`Qr59O`ZM+Ciz^495h1f52C>+~r>N3rg?OP>>T2J4=?^w)yA!piT~KMEQF zE5BR+C8!?ievkH!A)PIZXpg$zql*fnkzu_qA&5qX^}3=Uvg8fgCx|S0gRUuvMxu?n zfgl=*HtH6FsK?!_+Y6!|cdzay=XRDFD@^!xN!L5;^(0-7wS z1LE%2d4dKb?tZ;c5RFos^$I~WN^RD62^xgB2lRb{rXubEyfPr^<_c5F-mRI zKL{F&QEHq1Q&7AcUT__TQ--OHQr+-^>sUc!T=0VHBtf%W@Pg|Kg6?qVr#_-n1+8^& z1garu4o0^}b$vlAF}gjfn+w{AeJne4J3-s9k7bAMD(K6G+4?cvSJ3YbThNQEF2+8tCkdL?J2UkOJyX!~-gST$2)ZyPTR*9n3;JaY&W_US1l7ySOnpjk z64XAg4$wA1z0r@J)=vnUjDGaA-Xmx=;&$r&f*wQMPW`$d8ohVv^m>9hK(pf@p^KCAx_M5FL-?HOy@h(_VvIz|wU!h3XaK{N{Q(d7-| z(d{{%B5~Oh)6<{R)dbC)SO@4PK`$-6L+{m11--QtZxQHQ4B}j#*PSKq)y7TJpVz$w zebBfy&|pW(7xZX}qn`SLo+yZV>I*to5cSl3`gTFoQ}^j*f*!*v{YAY-&>pPPU(_1~ z(Wvo~-Xe%bjhFOef+jD>Ox>@a5j1B(9iSHly@G1mDwPT~*NbP6LX*sxt*W*C`$6YStA*Bg$*Ku^<{zUej#^ZLBq*={FGvbcu34(SY?uec)DEU@+!S!50^=^e1TrU;$4(^uT z)T;%3j=QBd^#(y2*S)156qJbT-qJe+?ZkC&>s^8l;<~r>K0%dMX6s}6kf6+!IBizH zC8*p8_`UV}f-*+H@2x)(@SH}zb0GfDLmlpJJXL!MNWkD}?h8J9C2pX^oUT|Go(AZV*g6o?N;?h6Rtr*ej zqGS38dgBBtoz@dQ(?8Oli3WXIcX;|q-Hegh19?i%VPsYpr}bh%w7NL0R|%rk#Tk8% zAX;6V(GLis_53IL5ka(`|3vQ;ME9GY>gNT~{pP3o6+w+=k5B(h9~IPg_9US91U1Xv7L5;_+0Qy-_2gIGze+wFnxN|xpVA^5Di@LkS z(cQ~M-Cq#hyivsPxG&&-_ZGiT47IrEG(q(iyong}-z<(6w2h(o#Mng`-gZo8I(IF#G2WYCj2 z7MHWs5-@P-}M;OoI<(plEZWz=}^9RYt>u(8rJBU}Q9D5&#SE(HP5QzJ&w2yn4X1LA(0({2soew)+o49Yt$Pg#%M3siJm zA)-N`or{CY`q`sECl{9_iU*CKSH7&jJp;60UIbAR=uq9NWdrQxpwo4uh}Ig?Z7`R; z32vQ9SIlL<1L{k@A9S!M}6}Ef8jZ;?G?hoRW z6}Cr!xaSnHCxE!;6tSm)IAzb^0_O-rnnlh&3kZ~IO(@x9S>lh;f3 z6wvId@05MX?mfx46>5I4Y&CoQGdf*1%035LS@l}k`t}V_mtl9yHn3~NoBNK({93lL z-3)XsCeq!+-U&)>YzN2MY0oG}a8uivZ0=h*Eq`!xyZ98QBy0PSV!1 z2;x~t7yB59XCYne&p1uxk;#o*n`x=O6A#wH{5YIy5?4LnA3+ZM*0r4!Po9&*? zr8LdWvykq#KZs``-R*)Po`v+VgFrkB>0y@v@hqgL9R}iANKd;eh{v;Db{!CpXT9tu zAfAQ1Vz&bEEaVlt6KHz%R>8gPo}fk5I}r^8rI1@6dn9Nxx%IIpfnIFdD!8vb9rRMu zPDJxTr`xp(?q@FpU24~fCH|& zXCVXaGa#OY46-kPcos6qz6#=5$YA?B5YIve+dmo7W5E#ncert@8)B;&rjEGP4YB<| zybe9o&JW^s=%IEXh}WTq*`+|d4n52c1@Suca61yj>(ImP+8}4rPLUPty{sKxjhn1bcp>8AEFJT^gKV_nv8JZtS|?$@Vc&qn9=X zPqBN?GHyj@z8gH%o&u^m^yA<}d-iPO79Mjxc$R%Z(-P}?gKvUo+Z*Sw+Y&3L;{D+H z_C-xe)~w;b1TU}~&NcTPYFy5}(0)^sd8@w2zHP{QagbNJCHBF2>~oqGyd+n-W%kMW zh8mLFN_$t5p@;hXg~qM_{K#@C_9{)&tT{t! zm0N4ySY$%E)xAl%^>(QxhWwp&?l&f=)gR8`Lp)ywdOu6DR=qv_A$`(`OlaC(hgi_ ze7;@r#qt;Ihnf~zjb>FS|FvE1b#_a#>UOVO{u_HVh<7(!v{NkF0kKYW&CUo#qIroU-!epcPELqPnjx?x9x zYB!;|uN?(y+=S-7c4JV>!3E2FYqtOm8XQE_0mSR&x9sj9UN668_XqKM`E7eRh}X++ z+Y>;8NUQwLo(h^uTIF~4T+m3;$nMxnKnqACyJN2b?W8>1wch}ppgi2Qw}QT>=h!`a z7br&r&1mg(Q0|Ge&&tjKm86-*efv`o&qBVp&x3dt^1Xc-#Iuke>{}q7h5TSY03{4+ zUjBjo7&L!STO#>}E^FNiezbEMa^ED)<3~F$=m}{aKibcOcufAuE&<{(`6s&qh{xog z?MfgXlYh2rf%y6G&~6Cg=fgw0If$PRzu4_T{CxPu?grxL!>@K<5I-M&wTFRtoPT7G z1MxWj$ev*icUbw~?Asf;TzIW(Lis0l zt5l{WYsaA3Uu#OLPKpUvZ0`Anq$}F%ZOS{@!9Fh}ZnR z#Uv1~`TL0JAYSwL5%WQ;o8}P9K&+eQ5GkPcw6DZhq=E*}z7k*Y4v70-PO%5X{V%6D z0OJ1V5l2DX|2*Q1Azey-;sV@w#nVq*0r85bpZE^ME1v%1M-Z=g`itK|*Xh0hq24q# zX4UYw0)!ukS6Fk2{2*Ro%_Ra2>DY6NQgGvUk-0?(h~Gu#7Lg#X={zC|#5J8qGzJwJ zy10B^(E=1abR|&-Lpp|hqC4EUrt^t@Ag<|rVmOHVUw$zj#QiV7m=R_Ka``>dS1H>(>us8+cmQ`4s2XV_P zA})crWfc*(K-{vP7e9cwWj!w*gSdsfAe_ynj<|)qAaa7Zg#?PcAZ{Un;(0^51cO8g zxP4T8ZTTQk9(1<)Mxsifne-02sHh2ANAIAEiiRM5<`fgnK>W-pCfb9}(|BE6#DT8S zyra12Ye>ibq8JJ{Zl5oTu^?`rFN(<^Zl5K@ED*QP5@HdE+h<9!3dHTRq<9^~?X#44 z3&icSlz0ymL2va+i~XSb^j5F5_z1+S{AI)m5U=u=5$6o)RF@SOHL;GlrF>aoz0D=R z#5&z@&$4mvpXtm^cZ#75Yv2aPdf!S%C}} zVk`SJUy_FlUl8jP5h4$WN6ZLO1jPD8Me!nt^@)n2Jc#!fyd+)%@&1CBL`@LyFQ_CM zfOvmFCD9DT`wJ?Ib|BtgP+7!*xKBrlJ|OPXkzy!__ZL(VV?n&Xpo*9b;{63x#Vio- zFQ_UOfp~vGHL(iB`wOax*Fn6$pt^Vq#QO`Xi}yg>25X4@AZ~*-#77`*1vSM95VwMw z;v9&_x%V64G_=6>x=pzo`=^LO+mcBpn+%$;{62; zL{|{+FK8%wgLr>ILoo!z`wJS0F(BSw&`7)r;{64U#Y_t5|#QO_ciRvI;Wo#|#fq0d%wTK1r{(?554T$#_v=LoEyuYBWcm>4!3)+go zp!%{^a62&?)K+#PN&xjHxAr0tG@9Jniv^$=y0a{LOFN<}cW8~IByb1b>+&YNu zpiSh~QS1ZlCAW^^kfy`d%KEepCTMK|IgtB8q@`p3_B?0CC^!D$0YnZ*~=xK>P+SPSgbP8@M>p5X56aH_;5lV?j63 z9>lv4yNfsw??UV@`hvLs^$*i%df@h-%kVm63(A@&lBK)egFmv{}t zyAWRyuY(3r|9eHe4Px!0w|Ec4+C^{i0f@DWKH?(~YZraQNf2uneZ@HtYZrY*CWyzZ ze&QyG$E<$hdl2tJ>@R)=@h-&vLTop6#G1zdkpsk<#{iKB#G1!IQ5eLU$3XESh{x7J zq8y0F)4g5Vy~vq7R7M=P)q@ z#O-sK7^}&&&*383xasyeTx^6-PUmp36~yTrE_Q{}SWyAQZwkkWN+5nyI8M|8Rh@LD{CLq2)L_!LM9o27Bkz}= zAlifcM?NI#2C6X7sxVRX1yvuYh=zfp$!(Gt2Z|#%ItdOmcSOz#@nSaUwGp|A7K46V zRH#CNcnxGP4kX$D;(C8oyba=de^u-RalKC#AAq>tCyOJ7bm>kJC*j5;!xV82#3REL zkqIi5vyi8MWP^x-;OU9K_GrRzF3q2@!RnwA`HZD z$CrqzAbvZ(RMY|S+wrBM35eg0FB7dm{C0eq=mg@oJExRMoCiDjUo(OH;M@$emkBjrh@qGc&eCd zNT+O*SOPar*(R|X#3|b(-T-mWc~fiwanE^E>;iGhHj6Y6r);yxFr;I6OPqom$MBZ; z0>m-AB`$&Z?fBc`TM)k;e_Q+jV!d^Xcm!g-b&GIz>pIdgY!$wS++lTVcyASXKvnDB z_1Y?mfPNX$p~5!tA}GhuZbaolU(KxH{f>AEbZzEcuXjXE(6DA5D!eNifF?BSM$`<% zPwnlZ9f+UW+eI9RpV~V_9}qvacZi`Nermrb#)9~%{hpW%;-~gbF$=^`?VVx~h+D`m zu?oa3WS4jyv?QXRYqxj{v@ycp+AZD#@#@GPu^+^%BYVV0nv5o}S6nu3x;*!aTky#> zwpaWB;u_m49)q~v_X%f@=__3C`$SF;q8=#O>?@QA?9aXPW3`+;lqA#6bAubf$@sAWmnRm;~ZVskrh`**jC=P%)4~N825a;2LI0NF*^su-9 z;?eZ5xC-LY^ds>dh)2_p#7~+`-j9gFd$Zd75mDTb{+{xP2nKQ9kBEvOPD_TU4&t$?kRBy#N+NM@d=3E z?tCgf2l3mTPsKMNe!Fv8TnF*nozvnTh~Ms<5f4H9cIS+s!&K;Rnw#J5d?vg>{C4Lv zkqeYZwF>@R6atl1orsEoxZcl-vLLSavmye-^?puN1982d6ZJp|gZftZLd1aP4;oC= z#*pp-=S63@@!OsAq8EtY?wl8cK)kyAr5FX`)#WcmJcw79FNhf+UR}N*l0ZEF`${Ya z@%-;Au@=Phzpuq65YPX<7Vm<1{`Za83*!0TH{u|O-|k!#$3Xmc=c4$`kj_!2_zG^^ zr!&P>5Vz}0aR*a4qhX1B!qATG08;xLH6T)!*fYKsI zRk$Z|fifZ|5IqOtvrO)bVjw=tc2o>$=)@h0erdpXf|(Bh%%EBq?!570w1jI(El-8*Z$1InH|^*18<$0}yLn()kF)T9`TP z&N&ckUCPM>-KP7zoSPswxp_I?gIFVTJHLWhBXc_E&P)(%5dO{r5NiLsGo^!6~Fqc>}CZ4NM#2J{*fiAHg&b?eA$eExiLC06znX2iUi{mTqOb2m%C7eVM z$5+ak1>*S1ICDT8U$8SzQ&NHL{ccw%@2u3sJ?!g&a~)K+@o2yH&RtM=;~_*3pSq1MQ|e`hj!vV$Y3@p+!->2>_I%nw>jZ#u%%>f+ zP9f0qv=Y_PDGDl2D^VStvY?K${9T=#a8UfLo1RWiHPHLj{9T=$x}ZzdZhAU9F@|(o z>f*G9+s|RMU0s|`AQkSix;VW+t*X(x0%stoXEl0P;EV!ss^gqVAWn6hGXqqXa@)hP zD`d3u@T76OT4Pzr1ZVT7h8ES_5Hi^*eul~X#={J!wI=gsInn6^;?XV9=>=l_Wu`L_ z#QMujXB3D>w^`045RY!NoEadV(Y+_|(}X=MIQ>fGu!-0`U&8 z1_A}ajh(KCV;qB zmOE2HTr10+xgZ~!cdT%hfC|vOV}-NEkk0K&=MA`V%2qmCK%BCb&MpwAY?YG+;*_m& zGC-WN*PK%zPT6bDc@U>;wQ~u?DO>H_GNfZ)<2=yByUI?7tZ@#0&b7k3%DxU+>ja-= zGT%(T?)2Am%~fjFosbPq>^XKb8rd68J59#z4d-e$w~fz6eZFs_b5FZ1vF_IRF(lP# z`GpR}ojLaRkWEep(05~H=q9HJsP@F1p>I0uo-#T=UQ%}=0x0*@oSxyWn z&rDj+a@v3%wxIPar}I;vG=qNMc?HBfi1s^!K)i!!zcU&%lU83paN9F%Ns02No4m(z+MSs)W zUOj?Ke&o18`FcbU1%S5EI^PkeAm~F{=R4vQ1+iX`;gkWfUXbC0gQk*R@Uc@Bw3PIM zkDa=PbXz*=G|{xg$~U4@=uxNPB~Hr{E3N7)p`SSJD~5K24hcQ!#A{k;9bGs+^i#+0 zD!ZAQKJDZOaZR6g0zq8UXPi<`eNs)IaY7C0*gtb3pAoJ8IJKYAj)2ddCeLU}=sBnR zGny6pr8C};o3(^*oGBpI625WffLKeo=qv_t-ClH7gSc)poedza+e~K*i0k%}vlGO1 zd&x-yaot{aj)1ssFFU6|T(?)8FF;(kSDZ^AuA{5Yw;-;gtIiJ~uA^(tBM{foHOIN8 zOIMfDb;tJ^(e7_2?=#vFaKm}w87b>qr{puDlQf->XS5^WmQ&>!DeF6@_A{dO2`Bm) z?FhKzv^Jz$hGON&xrP4J2Rfqj({JW1z>h$fS;VVo{_R1Iy;^b?T&W#KcgK1zc@#pQ9y}Dj{CYULDH-ih5qIg zxM8S!oi(9PoUNd{H8zFX(*3P*yINy!sF!Sa%Mky1R!-UMHj~k;{AGeBqge&WL=bCM z0dfI|HLF~51&B4PTyh2I2Q!;Ish1*9AF-i*^k0fw~C zg0djo%7&c}EhvLPkzp5!%79WQoewP}!$3PGT_mb%NQd&AtOGZmc|RwkL0p2*$yT5x z7sXdSw&3(*%WkZNW-wIvK{EN=vHCXdMRXFYiYd8}}+Vsw*zWf5zlHS?WmzO~9oc^u`@>@`WoHsoUR(C?9E>?Eb0glnM={kX)XV-Ktq4k*_AR*40Rk(qwegMsmKUCGKi7$A>kNCkPc7?`rnI_Zf8q4)?yI(Ppd~O4kSd4jb9$tM1BgI zIzBlpMqUPOoc~5xtaQ9ge3fbsay669Ky^mnFVR9C1YM}{R#;1UPm_tgwQT6-`wm+T zn!X#>T9)!=qO*Xz?+t4!8-fC7rG>SVCqXYRI3L_z9`s?KrX*gL#|-H<__90$;x_oQ z{0hYFrGvZ*;`Y)(-T`rY=_r2!aeL_~pMbc%bdp{};6%f~SS6K%%&6iejWHe|o?GlQUtw3GoOsUXKb_BgL zCy}Tps2;sr>MjR>TF|?t?s6pPROplnJ>*2t*P)3-(?R^cqosm z#QnCHOa*1mIUe?k+y=Tc=QPniO$V(5p~~tloA_~=C0L^qnbrpwDn5oOJy%x!^_Jfl za(`6)d{}RJ9dx$(MWTD42^Fu0^^p%jGb(;ZXc^vdgUsw1b`57p_uNTqRpq*5@gXJ~QM^w6l8z(D+=Fd1y6a~6D^my2K*$DL0(9=XMKpUOoVH4!bpxw@Cq8^$|Jxr7{3TBn{ zL^yN&h*zm5%Op_kiABSw$mO7z ziKU3vf_OxkDmQ_6M42kz1#!=rCijB4=S-6aLEIas%VQw!jnn04pjX3=hs}^*fo6xD zCb|aV@=TO>KwO@Q@}VYEo-<|T!d#vSbgqAe@R>4C5kuiIk>Rssp63k}m{&J^uIvul z)4gu^d^uE;>9-5ySVOwsE|9N+xZf_2vp~Emwoonv@v7KDxeCOqVvFQ@5U+|Yl5c@{ zRcx``0peA$#d1H0^S(qL265h($P=K@dQHNY%Cn#v^;!^J)MWC$Oa{Kd`7>j|GFdH< zDao2wuYLG3*TdW|d#3ZR-^ zBO^eZvSe8e#3@Ub^+3FzC`HDAct25!Yy;viEY`}-ApXK)t$YQmRt-oxP8$nNK{bi%v2I6u_mAgS)E~)ZE5T|pK{20XP z+$2wfIGu0GFF~BnH{}&gCM}!g#uu~FvRQ65%OFn67I_QAY1twlJiTw&@vyD(G3eB=(?sqPoHCQnZPHybE1lb< zzajVcr1Nc)1wcNOmTfW!#OZuT(hoxD7Rl*+M}~p84ZbU@fVd65E9+`9@okrnjhn8c z?b0b_LP?_dwo6~odeSks%e)|tZ-*=b;`nyR5+K$w-;?D*JSTZiRs!(|y;If%@d&+B zHUx1xcgbcTPUkM!QIkpMZdti>R=Mn!wG8Rm^={b^#Ix(&vN?#;xkt7KaXRbeX%`>LUZAN1j)xtP13}3HP7{p+l^lOO?4X?frY zk`>=c>8ojqyGyU>;U{G&(46UWh?*F(CbnHjGy(LQ&&u%Aav7*v;>z&PxJ6u!oQO9jhk-CnR1z?XoR33 zh;_G1avO+sw@Y#lh@X^~<%b}CQeKuvLEpXfX809(8uaL;ZA2G9-COJmzbdbQMzq*Z z^c{$2J=f%qAfEMHlfQ#lce^fCm@ZE@>u%SjABc6g8!|tLb+;Qb5XAb+O<4-W`pZoj z3S!;uTNw#r-R)ahSCgr~Te4I*$CqHusc|U$mTVGXs9}v7-gl(CqM;kjJ`KMkXJ|6| z#2vZXkRH$O$PFMK&+f=AAYQAyD|do;t@5r+197XnCy#)*)!mb)K)jB5Uw#4NbjpbK)Op{6HBRRZsRyrTa@rK+y z&OeeKG@tf({w6noHqai=-{clh=GY72zssGV@5Wvy zN(1pe&L{E+i1%?mk*7dhN0#~m#C2q;OCYWzm--gOb>vb%fcUv$t4APyuGq?n)VX!@ zb44g$5I+d9njrq|Jf#|HGG*OQnIh-n~=?h}Znx>J*6Eu3Mc4@$NovbqU0~`@GdH5SN*c`T@jc z=A#~KGHJ=7=2y!~OAfWnko$MKFNaD7`IAnYL#2W^OkcGP#9{iXJs=)Ya;gtOJfh@O z$26JvJgP_atoS^tzae*L3e%&8gZfdJ9yI~P@%gE#Adb&Z%>{A2`>Q1&u6KX62E=_c zK)nItz8Rplf;gSI)GiRGGnYE3$)q#4im#EC&fIE-A+1a0R`WremfUJNh{MdIQa~JL z9<^DM2{W&XsF@XJURBMI?qhjXT@d%NyebC7zrdGIwFdDo@a0pTL0m5RRWA^yCBGU3 z;&LgVMuE6o3aEGx_lJUN28jDZL6rpJ{!mCQ2XTKWq}GDCKRl;4fw(_Br``o|-V3X} zAkKSXbx@PZdl9ugDl6|r)ILM*$6oZdOdSL%H@z)W$3dLG=hbH*&foLuYY@lxg1QFc z_+C)=G@1AU)r{I%@dc{+hTJ2lj|Hk_pjp(%0#ypA8LjUIsZ>xuTHg&)?|?4TysD_$ z1A0vJs-o%uh|^h29R+bZi>Wi9s*`>QFRm_t8ch0y=qiZk#V@MwKs+ygQT+tsFEdK0 z-$DFkMhWFrN9V}RUuKk4ejxrbqogVT;x98wsX!2anNdoW2Ju%SrBx`1zY-~}s(|<_ zkus__h`$mkqoP6lMMqiH62xD0lvN!;B`bIG3syZq;g!o+!D;~LrLmp-%Bc~cx?{^& z<j^))n&>1?xv4UC(x=6BuN(L>Z6C6X-MoNgOd zm{n1!x~7hngm?0LNqIo)!pm4Msr;a=$O*8?Nx3v{f zT}=g*Z>@;tf*z8_Swk%Wc`Z0iv<4JGZZ*{#pgN?D)>KZ-?}1WIRJ z<*vtdWX6els!3y}1Z&ygoDucZIgodQ0ulAq_Gsf)lS;6$ayK!QT%$xpW0gOK$>_VW zs(~T>e27&|K|B`3s&*i5OHEZ*5VxhKst<_Af@W$6h{u9vYAlFP25zoi1@Xzi&DAUr zuaUJ-3qia_)k z5Py^1UgZYy3BNC^=RkbI@5`zmRUgDB^>$LR zAU>(LlWGg%lX^R=E+9Usx3lUE;*)y2sKFpUske(71LBi?n;k;SN-9f%u6&NbLY| zFCL`!gIE(EtPX=%6CbQjfLMbcqRxU?gCC+Uf_TE1kpC zB12j;9;Q}-STi1`UI%enhO4(goR;D0JrL(%gxU|{Jd98ufmk~nsZM}cI~=LbfmmxE zr7nV4YaXR;YclB^tyZ`-jE*oMyt&rj&HQu0pfIyQSXB|onzEt5YK4Gs!u>X zqaCZxg7}w6$Ej~X{7a zT>^0(y{f(iahbiUegJVDO;(RUTt}0Y(@y8s%^Lg^XGm-J ziRvPVwfjVM6U2RGrn(Q}zA{t&3gY%MOW7SvZn?e8QaM08+nud)gLt+(TNMUzdCpPA zL0q15REQ>%&bjJ{anmb9bJa;r*StBtx$2xD*NGZ+Bj&0e9kX(jr21h80gqattd}V_s8@KwO)v zRdW#6=4$mai1)axQQbhi$7PM`2jV?0$!Zvg_qZgh@t}Oorc_8#Q$V4#$0bG00r4J} zwQ4bl_qeQ8t3kZSWu4jp;yo_w)D}=Z(rwnOogm)hvRJ`I>IjJ6NWZR58PfHz zL45%?-hHz{WrBG3%?9-?h<9?mp}q(4POdl9BhWzFg}+gWuBJT4(=Pmt%GZ#NAywtk zMBfe8=@*fzdc?8MCDxq!qa!w{eW2F$XGFZMx^`nXvkU4S71@Ky)cZTCmLXm5@2F#% zj0U(voyq2Nhq{o>=ML4or%stp%PuuolL>Q|8f{32xl1{{vV87UzM72By(+gM?Q^ec zkj>|Q)ij&W{i-}!!+D_u>==JuhQ4L3g*eSx6f(PYZy zfZCtU=K*yXK66;z{0^v$Y;FhDDY$Vc2i4En+zzQHe;{{nPUmE+3i&*wx@a<`dsw~l z2O5;k=V3J?o7+cf{vT*rHlH6UpFUY7aYW_%0~OX}Vn3o1`)2vfP)UEFRho>?4CSFk z$*1k*V^v6#N%hC7sHVwQPb!y>)r;AD9#x^)d>&QQeRSTJSSuoqD*8-Y(`&Ajh+~ST zOhhKkB|iD4M;VkFEi8)P@AT+U7x9YpdL+K)@SM$5cmGi75&UKmy(-%|L4lb zknVA3RW7)72=#ZJRfRx3LvMP{s$wAiHvXI{3*v9%H|n>2cVp{jxQ(evmFRS(2_ zN6xDl5bqs1ui6;Wv45#L|ABgIGUf86dOe%l1+^7!TrL;XlWcBZDfd8AM_is?sd}1B zoA_EagB#!XwK|o}?HhF=+kM}tf`hW^=%OmFX)^s{Xg9x$YM61;^^mE?fw&$r)f5od z!zDEv#Px7VEe3HtTvo4vxE?O64Tf|{Tv2cTfp%%)lGqY)g`SNri+?Z0w$}9GYoFG9 zo#yk$Ye8f2-`b=!pu-8Qmm@7pT1Wf-t*gJAUD=P+e$-$1aam)B^1bcq{8yW|yKzq6 z);XOqBJ28(De?DrSq-ZB``cCvDy9D@o$>Yg-bt<4HT!k@Ic#IhLt%W~pd$O+Ga>6b zXu;oJ|1oxU{kP4(OW@BXz^(Ub+u+vw^g6rG-NV@aWBTg#KXT3P^WWG1|15z&kNk%g za%(Y9f$Z0o9?gvXf9~3}!#{^`yRu~ot8fc`UaYRf&x@90=oPcIl1wk_g(ObT@gY2N zUi4+3d&zWJ=i0LQa&@+!P0y^SY36I8!*Q$*jX5+ELO7-0ws^c17*Wl0=Wk2kX*k)R zfL(M7&GW8)I}S6tDyOjVpPq^QG;}QE=ZltEsWPGc&u?R9R59bp*W)<-|MS!QUzx(} zI>TXVOSZL?+L+7wYyIKhW%$3N1hUs`_S($;oc*tCY5z!Ee?QHgn{mk-)8rz%`HzJE zzt_*-FPZG+V6IImnf#_q;(q;rorQ*22X`{((TvchJvpD*Z{Wn1hjEOvFYtAwjF{_nYR_%5p_J=bh2-vSPy zg?=U)n>LNu^_LiS9jveG)@2(uZR=FUtZPn#Nr_3b@$>YWXDCnSCjWcu{qLvT)a-`A zT!x{fQ8-q?QCuc$+SaeJPp@4T`*c~6RD-sjp9*V8PWErY=MZci0-Z#q$A7NNX~PwsCYjm)1?nk+NDe;kMnMbQ`x-zqe(1TO~=K@v#y}&&gpW4zw&^YZRF- z%k&x(V;L`wC3|SxN0ja(Ub+Xlbr15^J;+DLl0(Pht7FNjL-rtK6K3}OX652(uCx3I z>(i;6ixp%_>x!Q57}vZyRVJK2mlE4&zxQd$RHHufwB-MMSA!m$ccT@Xdi?KNyZHO< z{I6X9{;2p@cm3bCFRn*U9zTWEU-yWSx)t%Y%kt7=LU!~2c4_=OcmFPdf0w}jy%I31 z)5iSo%^mB*q-RF(==#rIm+H>mYh2k^!`AfTcNPT)a2iZ{YUp`NSFM*C zpUKtO^_Zf16qUH8kf zm)1_wQJ&z6SNw#?-8-{p{wv ziT`N5o4W?;+Q}Y*vEeppqYW1i=j)Nwq6BPsW@PJkfB%{`W^!lxT^?F%6<8DIdADsf z9>IAuDa^Y5V@k{@#HMWxqP#pEkxXdW$EYkD2R{GVUi0U;{t=t(vHT zDN4QIkA26iW1F|Pr)lNkkFG^?aDOyCi~T6;KlbzA@oqP(Uu5qQf2{ZHrTSObMf9`A zyjkFDm-UaBTqg8ZBGRT7W$t}y!}fm_*FS5|W1!0#qSxn**QjzYNQd+1c>i&mzg<24cm4jm1fG_FS%oe9PX8HiA-U#0(R^nacHZ_vND^)~JD4Iool1dmiqzLp+H9oF=Gttp%{XoL(Pkon+{ak^d2m*uK#MMZY1{r2Q6Gfb*qzhs>j5m#Z%Q%FiK} zx3hThF|ye&K6N#r5U#jd>2Nyg9QDvSYNd13O6Q`#cI~fi`fHnlPH45sHkVSOJzU>4 zUf(svDxM@=Q>@2P+sQRgY*TBt)uVQXUD}yg{SvhbE`e=g*VLcvRdns5QoTsuWvvvfwp;|Z60VFU!;daIHv7=b!j}-_FS{gVwVI3bRaf8D zMBmj)+t<~1)zx=()UG|WYk%$9QM-23uEVwKc^J1BS0mTdnf+XST-8Fq@)}~TtWRG6I$REMuA>n* z$j@fqyJQZg{`rm@tNfxnMfdtdhsTE`r*Fe@?j$E7vYdOlvtoQ5 z`ZbwKi^AL~&TDfb-Hlv)8q+~aL!y0*LTjVW=+F*QEX&VY#*TQgUIG{?+ZG{E80wVtrltC>GT_rY;Mu! zK5gFD<~D5>9?Pz8_j^M3>b~aUG32%m;eoEf$GXfj$)>i?ZSCh58VwrKHP`!XUFJ8* zwYiT&BR}QKmAg`!cO<2!hfgS({m7n2_50*!m``)LepZ@yd+nM^Hm~})^j&dev(P6_ zo|w48XNYXtdyP*Y8Q4%+eJBkd_;}mZ=$D=k>KG4F2`{I%5#0NbPk_Cw=}~g!x(Kkp zoBK7{Tpxdh%t4Xt+A;d5&o*(LTJkn=zy7au?H~4pOf^g9h;$`X@0O#Wog;Qejxn;( z9NU-s!Wwt59+86eh?HRsima3~gW7quoW44pd2Ajr3R8M$Orw1HkjbM#kiFHnu6F|E zLRks2KBBKglCR}LZ69<%6V&M19XsNK2F1-kA% zudeqt>Mu8Pa;v+Ovk|${IRRuA@ie!0Of2qMP9gYP!TPRX9ZP9@T1{%1vggo7-rOde zdbWwd^IChVk)JE{WbC3#hI5o*eK)tSr@h_1I(?gOx1(=0+uKFz(;4hkCIdwio9nl< zD{=7&Pifb$Gr#bp%eyr$QfM#IxScNfJpVZR?o2k@Pv?{SD$jAzbzL&kR}HFJ1C4x~0nx8|9(vX-x|H4Y60&e1WcG ztCu8`e?uU_o?NY@U#8?yC0&*sUDxlv%oCf}8e{()*4A%~ZMUOeSb_c96FQM=j@WMG ze>jDfNV$H+FG-f5aD4TztGU$M{f79t6n_!zQv4;fOSNCfCjWXJj}=S(O1mQKmvgt$ zCBRRF1AZNK3HQ*o-(S~YM_t+-b=?I}m^VEI)k`#T^4OK+KV17~z2b;}s=iLO8%)3H zNwxV`mQwA^7B@ZH$o`4{Zu@QxpMc%=4|HnxZo4jh5xm z$Se?AF(6X;)U6u8;~SmxWA~`tD%pCz!bS$%V?iT6XP0_iVqI0)OyRM>GGVE14C9CW~L+9sOPyRRM z+D!hp+mGq_-bQWL_iop1d$TqRI^NNf?dIy;-k;@auBJ@8kSocV8QDyxP?+=uk~Ryf z9^?I8nN$wSO0j(w-Oja5Brg7*%(^2V=3LW8Jh^yDROwU1L{n4&fM?GbWzSeT>4n;yRvaiS(Is#}hj!a$-S2`fu`9YXSOb}!r@ei5%-lRdTK^0Z34_+;Nucy^%JV?y zWsHcbc{EQVwa-&|l2nO?-TYF_lTqh!n|MA{=6I~*O>ts}io7XgudHfT;ul*Prvp zx#rio>*bLDD=tTHE;6i~0|pfEC7U(wRCQ(0O1kDzB1znDKy@T|tl*N_R3M4`>?@E* z-t`~1yV<_Ko9zd? z*?zd2?MJ&GlR4h)D&)4}-HObOKJ0U|5BuEe!#S~OzOL-c*VTOa-deuwv##%BN?|MC9ECjAGT%TlTjh)-b4Jbi_AP8^_<5l;3-CCVNY!`13m4@EbbXeW+~4+GJ`!E$qezNlNsT;L}q1= zDD1JSd5V)+%TtHUx}J_?HuQ`mvx#R3naw=g$ZX{~MrJ$DcVu?-fCCv%3U5}C6-jmezv=|tut z&ss88>fca~7q%4)?tInIi05(o~0 zEUoQtHmL=Uf^4Miw?}sc$3gbd_OVUk!3mIw+TIhL3{HVe)%N+K)4=JF2TAs$^2pHc zlVdKzJ`?h$wqFoK3t>7R-XzCa>tX`IL6D`j{nnT$a3jroV!DFkAp25Yoan^w7KyVObX>Fe;wiY-FvXQng z9orQg2iZs4&x=j~Cu)w2O$MhxrfPdnbQ(AvGDF)_I{{}x-qiM`qiL&!X(y20B*$6d z(ShI~$kN(ACbkwh3bK*5Zxb5_?xQ&_HXfV+nW*gt#wLSPAXBwHl`}XUGDF)hh`9*P zguJQk<6`Lrw@EjoH_369}^t~ZlrlZOdPn6=IOBs;6%+Oo2GzMHD|=6 zgEKUzH_Zg!)ZC+)i}p5i|Mn(1&hl#>1TL+a;s-aXaH{4vo2P>h zlGOc1+fzDVe^Yal7B2e6Tc?BMIIBl98rU_L*6i0j3fxF@OmrN$kLCq23E)J{(_@pt zDUhk!zGTxha5`j$w%-$T5u6EmQ`=|6(8hIBUy$A;$64u31HnO%rL}#JX0^akkd3sx zU-PcuILJQQ{%(tSZ~|naw%-$z3{HVe)%HzVq=C~RGqnAi%`bv8A#ZB?^rjZ=$KY~x zL3)$q@(lzBL6+9`e$8uvqaYh;`@1c=g5x0jX!|`e@!$l=L~XyYWimJgGF970v`Pb~ zLuP1u>M!6-$eY@JdMrJ3P5L3dNshDPVgtcJkfpW#!j`qbQIL(aeMGCS;5f)W+I~Sy zJU9U|QQK4d0jEHwYWvfz(!lAE8QMNB_98eF@}{<5*pimHP5L3dNshB3S_OiGAWLie z1u?b2QIL(a{q)$b;5f)W+MdQMZ~|nawtusEGB^b?RokaGO#`PxW@!5Xtuw(lHG8$O zaw6T3-XzCaHKGH-L6D`j{p)RNfukTBY5RR`x`N{%`)K=fZQ{WRkcrxUV%ubJ3S_Fb zFWoK;oDP|x?JKvt2+oAOsqMdM=OWdc+dV0iT9V?YWi7}k$gYraknxZSkSUO9km-;Y zAu}N@Ka>|_AY>3^6l7P(ILLU&1juB_6v#BlbjXX4nUI!0;)M)?tOXeb*%dMlG66Cf zG6gaXG9B_FWF{oNMl$UgG7vHdvKC|%WLL;I$au&E$YjVA$TY}w$cvDfkXA0l4;cs< z1X&9*3bHF?9ArFX0%Qtg8e}@;MaWD@QujDqY683!2;nE;s#nF6_v#hsjaa@7_;6y=4d?#1KMQq+4Ve5g`F&hiXCy!?4Is2$NJBwgy8I zkR=Qu)rJ5~WET(-s5T%B5oAX;sg}(V*+m3Jszu;8vZ;uOh@88g`tZK}zBzdP&ULPH z{Nw)I_qV#bo~o|?&Qn#5F$enr^%|VxmS5zjyu>`|htwNziCb=~DK9bGS0m~zxZEwT zS5sbMZm7o8+wdW`{P)$AmzasWCe%CdRkwWlt|`;cLl4Tc?;FgC%go|kQ(j{3*tJZ( z0(-^uK7miJ!l~jilkA!@Jzx67^g2Iac@54Hmzil(Q>Oc07Y9vmf5`F%Tp}(rr%z3p z9*3qlXx8s3$Bm9f}H{cR+nfcwGDbvrVDGr)Z zhea%J!68>4*()Zu;jpVuIxHb~;E1blysuf8;{ba^UGE%LCRbputKZS@ldG`L)sLJR zkZZ8+>czuDasxJ9{g%BWatjW*`pt*OAA-YfxxTmL4ty1kxaBt=Zq{eNVGj0)u0N40 za0A%umNy1`aurU6eQx=A0|B`P=fJvKK6#))UILr0K6M}>x8QO(9M z+yM5v<+J*IauxQu`rQ72T!VF2zkVPjH(=A%?;U87hg|;kK$|@5@+$)!@`%eH4tQV4 z#@i#N^MMMv*X5o2tK>eHy;(JK-R04<8sw(S6KA!^LoRPPD<-$$u&evC5^@KQxca`c z%my4k*dq>_U{;x2fxWJN;w+zBg?+Am&a8l3gLPML420wcY`Xf)fr#9KL$0oVPHw|t zS64qLci@PtUp32ok@3SGanP)oRVG(pudClX%O_W1pQ}$E2*@>9clBpxh2#coy86hh zh}?ohu5M??)TV;-Hy6yG*XYUROVSwok6Y-Nf|1X`fqu z;_QHW4c1-#oY@U>)8&h2N8}b9a`hj~j>&B}?CLkqPRJcN;_5$}Z8l>3utyv;&(AKC zE3ntq-<<7}tFX`2Kb{?sYq0L>p9?~A12$cKiy$Jm;E=0(12MS`hh2U3frQ+FBd)$z zU^Zs_ut#*y!^job>*{(QMy|p>SDzUK~r-Ma|3b>)?Izi<3n--HeFqPliY$suD&Q}lZRdY)A0$p14mrl%rl!ZZrCHH ze}~HC3hZ_Do%?-q752G$Z+}3p!Mdw2oe`27u<7cn&x^<{IOOW<&5OxxIPB^xW+mhf z9C7t~XPGZEe%K=pnvLg`$rae^>f6lo$yM0r>bl+}*I?b%b-hV$z^1F~`h(npL#{q; zUQBMoVOPIp?}XfeBd$Jep4p7?!ya+a>_4weuE1VbpEl1YS7D#4?>{df*I?b%gLxsj z0h_Kqd7woea(UjonB0cLu72vggxrB6u0A&~Ut!#^M|9^6xdMA#UFQwC3j18$n-!32 zusCbcV3xXfxWK& z_`E8)&*k6E3&=HCclCGXh2#coy85jCh}?ohu0FRvCb!|RtDE@=xdTUB{gnZ;1>=T2 zqK^CgGPweKU46s(KDi3}Tz#wg0l5b2u0DAnBsXBw)t{Laky~)c)mO}l$!$37>i5p- zkVjlzt=~*$+^|O+G>w5WxdMA#y|>>dS7D#4SLX-h8mznee)B_e12$b<*OlZJ9CCGC zPm_}#;^?&*nws%wht@NhgBHB8Vq3rMz95A*oF!0 zK(jU5g=JWQKCHq3)?f%5FoG@Eh6(II^HsJB%di4{ScL(s!4NiJ1Y0nMZJ59gG~2L! z=)*oS?Y{xJ?()w4A-UFT%6kH{@Jj-)zVD zVUIXy)>=>|S75KJ>plRv3j17L_W{T?SaWpV}fy86tMd~y}`x%#3YAlG2s)lWJtBsXBw)f)p5xdn$@{eshC zavKi2`l28qci@Pt|LJ(MOEzu~_K1VVo?IqZV6Uss9Pr6i*yrlsKP@2FVBOWtypY_0 z5p2O2wqXK0(D;lGmSF|@unKE1gbf(M7K~vVCa?odmF>bZtiUP^U=4<_0VCLgF>J#Q zG`q4rScVno!zv754K`o|TQG)gn7|G+Q`s&oLmvh(gb|FP*)3bY3@gxwRT#h;3}FLC zum#(&1HEb4b}Fz616YG0Y`_S%U<}(ZfgNae=Xk&}tUw=DVE}6|gbf(M7K~vVCa?p| zbhZ!6umXKpg#oO=5H?^0TQG)gn7|G+d$4_2h85_;Dhyx^hOhx6*n%-^!vuDq>0|q_ z3@gxwRak=|Y`_S%U<}(ZfgNb}WV^5oE6|5k7{D3~VFO061!LHT3G6`A&-P(nOz#Vq z$rb3sDhyx^hOhx6*n%-^!vuDq*^6<&GOR!!R$%~ZFoX>l!4`~R8z!&=&E9MumSF|@ zunGfMgCT6d2)1Ah+c1G0X!c?Iuna5EhgBFr{qo!WULu4I7{L~dVH+l}1I@l{AC_SS z`mhQESc451!4`~R8z!&=&DYp2tUw=DVE}6|gbf(M7Hq=~^!CfPQ-M_&z#0r;14gg~ zW7viX>_D?W`vc3c0)1G80j$9gHedu>FotcIzz)=Z1eE>02$o?5`mhQESc4&KzzDWr z4BIe)9cT_@`>+fv(1%qRz#0r;14gg~W7viX>_Br6+lOW7!vKabf-M-sHcVg#nuB?N zScVno!vKabf-y{>IfVCvWmthetik}+UEW--)VHF0j21D3@ z5p2O2wqXK0(9B@_una5EhgBHB8Vq3rMz95A*oF!0Kyw(|hh=6geo2Qk@71-&pUZpq z2jsfT`tMxGO_zK7BXSE4x%!)@#pE_jUR1R534YMH5kGMj9?4KunjwK zL`=Vz-VxdMd&Knj#T9a|%f0Ej#v=}zk7ks~y)Nr_(&Q@abM?n(1mqg5ySjb{O>V%ZtLyn8xdn$@eah)E zxebS1{f_>G+<_ymKC+iNiq8-Bh=XRz>1A>S`mhQESc4&KzzDWr4BIe)9cYeb9Iy;4 z(1%qRz#4482)1Ah+c1G0XpUjKumXKpg#oO=5H?^0TQG)gn7|Gk5wBGL_v)N4Vw%h3 z3hbrsldG_gdO)thx~o5ZdPr`-CiND1$mPGE9+TT}*wxoql(7ou!K>kuixOVnfg`M! zvAQVZJb3jYb1cUh_J~)ScNdk(71&F?O73&{rAYy~2J6&AasxK04>_)PMohg8hh6=M zGZJzKj=1{J8Jc9czsnx%5#8rPuE1XERdOG>My|U&dU1o?WO<7`L~fIZU7oTy<#MxZ zafkYdtG5<=-{3qE)A3Zuz2rVvhat&B}Og$lY;0Sdym*WC^M0Z@s71&GN zCs$z~^?+Q1byvTAaY$~!rmG)uMnrDGAy@x+aZGN*VOO6PCgctrarHApb3EgRJ>r%6 zH_FQ73hZ_DmnQk-D(s^kkZZ6`JtQ|^lX^sM!6E7~xebS1ee~jl+<_ym-db$tF@D%1 zy5mo-z+UP;xeEKJ2jm*8QxC}v*mU*l!j#L6*NCXM;E-GX(xjN&hQqEtrjc@m`BEdH z-hm@-`LssL+*GB%H`(XhEKiE)zyc{b(hC9LUNNFk%wHqE=;-Hywr%P54-wHlM?cX%VQem1dfB~ zjsv-u?34Rk{-}|1xtZ~;y2~$33R&KCc}ycB54rqNBjs{)^0#8@!>+DzkVnWm2<|xa zi0=F%_qsf$;gkDZKKolKmz&qV6;Q9cy2e9py8KZir8|$P54pO|6P72`M_hhslKCd% z5ZyS)y=0%2rDgGXpXGKG$6yI5Q+SVAIvFJ~QQ>)t4qk z)LU@KEmwadx8X4LgxrB6)Xizxc0Jf5y7QM@f$6_{n$~@C74}gN$Te7}9+DfdNj)OB z;E=1I8OG!`9Cme`cjOKnp{~ilJ8mBA5#9L771-M|Ar`uE1Vb-(qP>w?EXYu+J^m z{*db~AH6grH(=A%bzX_f%_B=A>Mc0rmTN!AZ8%IlA$Q;ib+d^5fIXty4{`dPr`-CiRHifA?yFv-F>b-qT4>Xms})H~!6vbU6R zh;AI@UYFN9yGrhJxp8)lTz7f+>;}2%^4N1)HBu5kGT4RCEnSLM|9&M_mZpRK5~s* zcX^AYDbx3DP;a{WOOsmUA#zM^!(r+PdBo+N&&hbrIp!S3C0=QA%`&+HdtH6QW|iFM z^3`XiOy_w4^%|_Z<+@%WH(--`L~g+$>M^+uhp8vz4jiFwn%THL*dwOLwM?$SUg|!% z3j3%BED)KVXmO_Jdr3KCHq3 z)?f%5FoG=@!!}G{2kQR}BKvy)%di4{ScL(s!4NiJ1Y0nMZJ59g)IULyZ6B6l1^TcG z16YG0Y`_S%;E*_I_H4%FHXL^KnavJ)#N}g~>AxeBUhjCY3@gxwRT#h;3}FK{#dP}- zxdn$@eP%Nzx8bm>AKOgG9ca#HT(Ar)(1%qRz#0r;14gg~+c1G0Xf9y8umY>F1{*Mj zZJ59gG#B!Iuna4(3IkY!A#A`1wqOj~Fo7MYe|9GOTwz{x&%wzR=))=uU=4<_0VCLg zF>J#GcA&YKalkUHKp$3N0BbOW4H&@|jA0vgp#INZvi*l;Sb;vQ!T{D_2pcehEf~W# zOkfAl!4`~R8z!&=&E;$#mSF|@unGfMgCT6d2)1AwCa?p|ciAp1 z!wU3a6$Y>dL)d^3Y{3||VF&6Tl*-O;ScVno!zv754Ti7*BiMp5Y{LY0p!pu#hhkOzcV+he6~Dz*p9umXKpg#oO=5H?^0TQG)gm_T!Nw%s!HVE{uI!5AjcT*La%hXD*>1Y?*$ z6R|$@VE{uI!5Ajcv{)bdFn}S9Uq8%gFoH2mVENW;Js$=zgb|FPxsB~W9|kajF-)Mjo$bH? zMlgm6G1QTfPXFce{ z0ERGz2{aF|9`s=VLm0srCeZwp^`Q>~7{Um~FoEVl)`va}UK|^(<_XY; z0SsXTW0*kmDC%|2$jYhXD*>1Y?*${Zm!henTGy zFoY3|q4@>tK_3P%gb|Ek0?p&B4}BQG5JoVD3DiG{nvEO!Fn}>kpm~DVLmvh(gb|Ek z0?m`G4}BQG5JoVD2{cc!KJ;M#Lm0srCeS?1`p|~~3}FOgn0#7)CR;y-2{g}Ubsq*W zgb|Ek0?l)b2L>>N5sYC1_0Q>MpBwaH07DqT7$(p>&-&1Z5sYC1&98Yq^kD!)7{M4O z(7eF<(1+n~vw8$$m_YM8)`LC_Uq8#~FoH2Of8_NrfFX=v3=?Qx zV?F4@0ERGz2{f;>9`s=VLl{BxU%VdrFn}S9UEwU z(ENq%K_3P%gb|Ek0?l7pANnwW(RcUAH{4+9v&2*xmh z=3~}}J`7;^DL=_x7r_`N&=@cKK0+S`FoY3|VFHcE`p|~~3}FOgm_TD$ANnwW;ivUN z_PPLuFoH2mpegdc(1!sGVFY8CKvQCU=)(YpFoH2mpc%#b(1!sGVf5+p9`+B0FoH2m zpjn0YhdvBo2qRb?oxR?N0SsXT<4>2bn!P@R5sYC1%^1c3eHg$HMlgm6G^?>b^kD!) z7{M4O(2Qk$=)(xcpDtfLdz}vh7{Um~Fo9+q?+<+#zz{|-h6yyEV}0nu0ERGv@uzuw zwq6VqXx8BUpbrBW!U)DNfo4LsegtEfK(i+A4}BQJ1e%Gw4*D>FA&g)Q6KK|Aedxmg zhA@ILOrV*>`Y?nMj9~)J+Poh6Fn}>kpjn64Lmvh(gb|Ek0{wNf^#d5f2*xmh{(8I~ zhA@ILOrZHZx#xQ|q1J;K=3}6T&7{dexU(D7IVFY8CK(k@?x@e<}F-)M@m~lWK1~7yXj9~)J zCae#A7{CxlFop>kuJ`7+8BN)R3nk`r#`Y?bYjG&p!>!A+=7{Um~ zFoFJ*Z2bU+FoH2mpuZ)rharq$3=?R!Vtmkt0gPb+&DOjghA@ILOrZHHuZKPiU~7{Um~Fo9+V)`va} zUx#xQ|q7uJV93}6T& z7{de_pY@>+0~o>x#xQ}V%KFfU0SsXTW0-uJcg@yMpqa}1K_3P%gb|Ek0?lr$4}BQG z5JoVD2{hAKANnwWA&g)Q6KHm4edxmghA@ILOrV+0`p|~~3}FOgm_V}!>%$1fFoC9z z*Fhf!FoY3|VFJybtPgz{!0^-M{n_h$7{CxlFop><`)2C}FoY3|VFJz97$5Xu07DqT7$(r{$NJER0SsXTW0*j*KkGvu z1~7yPGzai{=)(YpFoH2mpgAyGKRhU71Y?*$b1>V1J`7+8BN)R3nnPG0`Y?bYj9>!I zp{xge7{Cyk8n1&s3}6T&m_YM&)`LC_U@oHp`>Y+Y#oQ{n?Q)0YzL{H=do#Cwe#iWbd^3Mn z{@3}x=f@PjP&l}-q;O&3n!;^`UlfwUzY2xoHpP1Jo5dd%e^XqgR4pA)T3WigbZzPW z(%(yKj@o6^Eu)?t^}(opdyecmwWrnda?h(hYpn9^Rjym*`BmOrW%TIvM{hfNuhBC` zFC2a8=<7#6HTvDrYpuHds(q^-yXulvzq{(Kt3JKzYpecy)%C_q8ME7%lgIpH%$U_S zS#8JFYOBp#ZE&?4R=ahz&BpFI_KdMtkNx@BC&s=r_QSDjt-j6b`>YSI=a1WOTrlp0am{fTkNfes`^UXF?zM5FKDXiLj`-a1pL^nSozK1gx!m|^Aa{jsNHP!WvW7n6t)r*0^Vl7uI-fjd#{qWx`q$rcBsv!U+?a6K(^`jZLN>j8aJstX`@MBo-}3B zwv%$kGkLR$DVSAF(X3`lW}F#g){xuKj5WPxb+f4|o0-pI*Z+t#e^ zZD+Rkwl_O^JD8ok9rZ=tSznf2%n_b%j`FIe?(J%h^QM})-frf2Z+A1_n{K}4?P1RL z`pmbzJS-`wsUVD9n`F+cGRHTQZm%rCve%yZs=`IR@z{Mwss z5-%`+^lIh}@9XBT-W>CH?!xatHGA9R%)a&;W`8@^9B7X>2itk( z5If)0?E-VWJ;9u4Pc$dnZ<>YnWOJrH)imuwbCEsGEVqN^Mti!s!!9z9*fY#yHZ+gh zhI!7OYhJR;%&Yc%^I!G?^PauX{LNlu-nSQuXoBMOWG;!_;^KkA-Gn{+MJfC~oyqJ5&{4V#b>Exa>ujYPb-poC3-pT#ijL*Md zdh@?Alk+c{ujXGeJLG?BcFF(F?3I7n?3e$&**~9{1M(enVEzwgApb`blC;Uo!MgC=Jww0B)zTU;@EBANrJZA89`Dv%WE6v_N z8%b6_dg(t@&-Oj5XRpadn2jwP&%$XR>y;0GqpuRZ)njVeso|EdoPe`?$ zPc?hb#C?Jfx=;M3J<|7l$7ybEdi1uOp1$(Vi#L>Cc?=uupT7Q#sp%)a^Xcg;e>XSv z*UnA-uXauK+GDo{VcNg|L=VI z|8k$>cij2&Pj~)2;Le|HJl)+R>r~lyeEUPwb7S&>sopRu)$G%G^nmmX>FyZM3|2Ls z?0vf5VTZZ>s$X$hsyj_NNSY5*J;0qs*;cl6Tgl#e2iJ45cgVK>=mF^&m@Qq~b#+hxsdpy~8voT~_?>>@S9WYbJ=h%5Q=_=ny zb(_nMlUDMnc8~Kaw-=|nJ!-hUc)gU4v+T6v>VI&b+Oh6f?c@ILWc!khq5F6y^V4+~ zAHP6bInrsirC8TU7_`^dx#7HVwIp1VYP&(3E{yT^b3 z^mHrP-d(aZedk{~y~zCqxzXt#oK_a3-<@ICd!O4U_1QkIn3DSM?v%dIEl#)JH}$W( z^K+u}k2$}^1!;Zrqf*_WknV4GJnz{#t-SEHR3CAFZM#3O?z8%e#pk7CIR6sq;^VK7 z9_jQSCtV}I^`+NIyZ1di52v`-cl+_KlGQW+vODt+a`n~RIG;Oyh2HJibJJteJ)Z3R z*~HCNy1(z)=hb$f+WGGM*~{ssPUkx99^1i#ck2DOx$HjaqZhQ(kxzR}dc6C5yU(H@ zxlvu~G#g3wd1XgtdVhK(4|dz_9%r^RtGs%C`kL&_*<$_^+Df)x**Ew9%=z$wwsOl( zscye-s;?iK>O|)sbAILXA^YyH+?TRmx|RDLt$SK}o;wGa>6Lq@ z^*5cy3*J&CJLkKPN%q-gM<&}=b|m-ND_!@*`RTW~`@7t9$M&-96LH;a>{jV3H+A#R z?oac@dGBf6ock2IN4xUAWaA%o>W6xLcKqKvE`85T8I|iQ*{Hg|-PtF#z;*lXadv-$ z^6uM|eY3Kjmc8@T6LMcQCVT(?Ji?W?`~TfmkKX5c*EzGJcbhvVpEZViU5{G%d;Nc= z52wB8$m3J({s#Tu>BBP%=^1{y)2p0zoIdEZ`#j9f!0glfzw@`UdnDPpF~NOP4(sif1mr|llk!GmAX2)DUxE9s*bY%lGZ=1W)Zw2R%Dlbt`=Nd9*^?Jm3R zuC0tcVK3>Q&P{z~ztn%$@z1vPBlm5}zF*lGva==oTl0&9(!WPp-{@X?TwmHls_t8v zT}frH={^oCAKTCFgy|>JeKbC+6K-Bi&-w1Hyg2Uw?c;yH6L#-K_utcOPMe)S+01#a zyOQeOR<>?-$KZc<{XRn@`SjXkw*1Q1@7?eA>Gk^&dgZ@QI9_^1{v>Jlb$YhNY@FHA z%kECB{F$!W_09UMPj=<^S@~1D(9J?$aWnrPOin-LL-ssfqdN4|^r~uYH(#3KW-n(h zOXrHO@0jYOEz`e@^&QjKXRpa#pDpb^ZrNURpFeM{bQZ0A*JZ`2-_jU9IP%-l?)wtm z@3xbh@qX6QF@qOt-E+>kLV8@^HPUFi>!cS>NymTlv=#E3oSTk+l><`E{>nt|FYKZ2 zJ2Gj@^t+JlN# z_gQK7o-4n@`|c{KwlsZZ_WCQ_4EfCS(#pZ^3bZsO_1T@PY*c?e?>DO4v-9tzuWtQE zY4$z3=AyKI)QNwRe*bH!-+Xa;w*27OKT98XYyEbWv`0PIO!q6hZXC`(B)L#^1Fx8-F&QY=jq1`G4Ob z8{z-#d`@3;^R$0Sv%hHB*ba8*VYZd8xIN11*$ge48)SXss$#mQ*>zcVjkavd^gXA$ zBb=?(y)>Kktz3Wp#B{CI+$WVS&9-}kn@?ty?0m@fI$N5ZhuPBZwX(k2y;k=p`zv>} zubrE2ap%)h{q!DJ+LN<)K4WTH|DAiywa3_PKD}4=QrCF0S6+V9C@uZr*{ezK**X2B zx<8{&zPg6$3-@1J+I`Nf{26tBrx>~G4Bh+KeFVDiw`6mn?C()_{%1!ZyDxX+uIafw zX0WU=WOqkD>&WcBLwW=jPD}SayHERBe+AZXeJp#Q>@1zv_1SfgGh5pI%4}@i_q(#! zcYj9NNV0WTao4Ba?{I;;GceDcW5&(lv!z!o-c8{#VzSiiz#(8GTbgf~hBmL6TiL$c-*qP>`^J?^>DK=+D%DT6&qk7Vo0ac={CBQ!yT75? z_xDEk*RA_}zG89u{@wf7-C?@Vhwd{un-gZ|#%G<$+5ToryYCQw);XNrG5%jYle4qv zv(D#i>)qP@7pnU&$ky&J&S(7v$^O1%f2Tq>ALxG1|A}{ZmX6ssJqNPa*C(fc-LfYy zvAg4!%{~18-z%*dWzy%UJyPqQrFv$xo~T+qQ!S}JMr!p$wMTxe)at3~X!&tct0${t zv;J|Qmdz|6Xe>0Lo)zj8V@)fDo6W4X* zH;`IAaa~V-BdOI>*Y)K$ky<@@t;l~#YV`zm1NqIQR!?C!l;2!x^(1y<`N>jirfCgN zPknpkr|YS(XZDa<)2H=3v!~RWey!)}sqp6Vduu(<>?5^iUp>q9%-5vW?5F3sp4ne& z_3U^X`2(fa9Hb}9o;g@*%^_w7`9q~v&y{zQKTK-POtXvp;Zkb`OjUlC)atqORQW(^ zO-&>9%-5yX%+W|aJ&~R+f22n0nWLmu&!_w4>r!j<1XunzsWsowNIf%GYR&N)sb}U% zt$xLDfcyzktN*g*Ao*`ft^SYG50O7bYR#z{sb>~St)6?&ls{c+%_5D|GiOMxS*($I zCX`z9EsfMOOQcrM$mhtPCAH>kjnp&eNUdp_qvg+)TC+^!^~|@W)|{vDdggqo)wA`v z@)t_2xk%&n%*9e`F43qx^Bt)*mub|Veu;6S{CCYs@>fW$p2?pgf2Gu#?`!Oyxk_ry z)!GBkTqCu5X1_?jCAH=U+5^ulms)eJX~G}$J!gu+#aY-BPRH30xw7kJOrb&8719 zNv*kG`{d~t1eeP{sD1KGEVZVsee(31lPl#P(mr|SVW~BbXrDa&66G5C$FxtL`MK2U z_Xo@6e<8KzaqW|5ekrx)N$rzoo|0PgjP}ek&q}R%PJ8B=UrDWgw{VmEuccQ1f$opx zeXh1&U-;VFSVxNy(nLlT2u0VD?dtVO^^4o{3=pwMtiTwuPRl4^E&bqrRs0qtMZei zR=*N@O@1AzHS2nB$gd~0=JVc&{Q6S$I`2*Sid4PMds}`3sWo5p-j&}_YRyL8U*tEI zTC<7wo_w#=nlE|p%Wo>RW;5>t`L9T=+1&e3ehaBJlf94Rr%0{Y()(C`E2%YGd!NXE zRcg&Pp8jXHl~}W#my_RKYRwK_L4HT6)o)Zv@;ghd*~ROT_odeC>W!A4Dz#=eZ;bpj zsWrQMW96qyt$r*yPQFiS^@GOo^8He4_VOmk?=7`vA8(@kzEW$x=1r2{PioEn-a7IJ zNUeS&v!47xQuS4DefdMB>Z@Kw{xGTfs<(ms;ZpTgZ$tT6QuS4DWBEX;zUuYLe_g7+ z>TN22gj9Xi+f4o_sWnG?o68>~wfZg2Wcg#IR=>&FQvMrK^;K_c`FT>S-{JXGqm!y=n5H)S8Aj zUH)5AYnFI@@@GobZ@qr`v!vFX?=^UQap)?DEY$bV02&6VD4`R_}uxyq}_UoExf z8gGt#Bvp^~j+9?6Rgd+KmcLG_9_!WRua{bLgLj<#kkpzRy}9x$q*lLankRpgR6W*P zAb*S0np?dSNi*C z$v+`gzx6JVe@bf2)80k$&q&qlyi4TYlB(Bvm&(5*Rj>0dm;bX=z0SKr{;yJN-t(@M z|C`jB_r0s+|1P!W1MeF7e@LzQ&}+&6Q)*W6}Rp0ZjmpAr$dCv~X zTd6g9yF$JowWerqk}pX$541m)?~$t4*<0mTm0B~#-Y&nIRC7Ojr~Ejn=6?2W`SDU~ zCfIxA*OXc_(cUM&meiU__5t~|rJDQM2j$n5YVK#-@}HNgAKHiHD^m4C`-uDoQuRao znEZxPYc{pR@?Vy!@7c%YzamxNvrouxAywbAPsvY_s_)rnwmaN96aGs_)r1<@c4U@7cHI_misc*>~j+kgD(5zsMgXwfaro zd-8`!tvS@bFF!+S&0+Qf`I%B{4!0l54@j+V>1j*(v=RS&dd zXQi5R+PeI&q?&Wue^+LPov zQq4K-De|vMt$EEZlz&}n^}EwS`4Oo#f3l0@-;`SOmR&6Ww$z$;Y(xHCsWpGLOXU9| zwdSvOsr-9V%{lGa^6yJE=d?}v52TuN+GX+|N;T)S=gEI0wdP;;0{M@nR=;z-Nd6P4 z)q|o-AzzZJ59h9w?~&?yJa?7+XsNEpbJxg^k?MLp z*ODJARZq?>mmeopPtIK@KVGWq@!a+D6Qt_Nxgq(rr0U7J74mCK)su5K$*(I_PtN^V z{_|4x-rTM78%i}7&D}1)u~c)>+@12hQq4tkcgt@o)irqT9{J6rx(3hPC%?H=*WkGa z=N^;aL8_jd8$1SJtx1XRM+^q=jHd3st@O0kl$CTKAd|| zem|+M>vO-AKTxXPn|oRQ5UF}^?iKkNQuWVVNB&5u`e*J{`J<)kpSjoM>r(a4+#B-8 zN!34dBl2^l>Yuqc<>yJ&KXY%(FOaH#=H8V*QL6r#`-}WZQuWW=d-A79)jxCZ%P*9w zf95`rACy}C2Kqz!MN(_d$bBTgSZYm}`&hmqRWHqbBELkcUYgT%-z=3{b5<@Vf3{TD z?74#cxl;AmTuJ`hQuWwekNo*k_1N5K`3t4$vAHqw7fUsV%#D@5RH|$C+&KBmrMhO% zjhDYds%!S#1oUin{2)vt1!%0DSpzshYU|Fl&7Dz~}( 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 diff --git a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml index 799d13e..ffdcffb 100644 --- a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml @@ -1477,6 +1477,121 @@ $UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @Uninstall + + + Get-InfisicalScepMdmProfile + Builds an Infisical SCEP MDM profile model from a certificate profile, suitable for SyncML export or local MDM enrollment. + Get + InfisicalScepMdmProfile + + + Projects an InfisicalCertificateProfile (pipeline-bound) into an InfisicalScepMdmProfile that mirrors the Windows ClientCertificateInstall/SCEP CSP node set. -Challenge is accepted as a SecureString and decrypted into the model only at write-time. -ServerUrl defaults to {baseUri}/scep/{profileId}/pkiclient.exe derived from the active connection. -UniqueId defaults to a sanitized form of the source profile slug. KeyAlgorithm and EkuMapping are inherited from the source profile defaults unless overridden. + + + Notes + + The SCEP endpoint URL ends in 'pkiclient.exe' for RFC 8894 / Cisco SCEP client compatibility. The source profile must have SCEP enrollment enabled on the server side for enrollment to succeed; this cmdlet does not validate that. + + + + + EXAMPLE 1 + Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId | Get-InfisicalScepMdmProfile -Challenge (Read-Host -AsSecureString 'SCEP challenge') + Builds a default SCEP MDM profile with the server URL inferred from the active connection. + + + EXAMPLE 2 + $GetInfisicalScepMdmProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalScepMdmProfileParameters.InputObject = (Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId) +$GetInfisicalScepMdmProfileParameters.Challenge = (Read-Host -AsSecureString 'SCEP challenge') +$GetInfisicalScepMdmProfileParameters.UniqueId = 'WindowsClientAuth' +$GetInfisicalScepMdmProfileParameters.Scope = 'Device' +$GetInfisicalScepMdmProfileParameters.SubjectName = "CN=$($env:COMPUTERNAME)" +$GetInfisicalScepMdmProfileParameters.KeyLength = 2048 +$GetInfisicalScepMdmProfileParameters.HashAlgorithm = 'SHA256' +$GetInfisicalScepMdmProfileParameters.ValidPeriod = 'Years' +$GetInfisicalScepMdmProfileParameters.ValidPeriodUnits = 1 +$GetInfisicalScepMdmProfileParameters.Verbose = $True +$GetInfisicalScepMdmProfileResult = Get-InfisicalScepMdmProfile @GetInfisicalScepMdmProfileParameters + Builds a device-scope SCEP MDM profile with explicit subject and key parameters for downstream export or local enrollment. + + + + + + + Export-InfisicalScepMdmProfile + Writes an InfisicalScepMdmProfile to disk as a SyncML payload suitable for MDM delivery. + Export + InfisicalScepMdmProfile + + + Serializes the supplied InfisicalScepMdmProfile via ToSyncMl() and writes the result to -Path as UTF-8 (no BOM). Auto-creates the target directory. If the file exists and -Force is not specified the cmdlet logs a warning and returns instead of throwing. Honors -WhatIf and -Confirm. -PassThru emits the resulting FileInfo. + + + Notes + + The generated SyncML is round-trip-validated through XmlReader before being written. Pair with Write-InfisicalScepMdmProfileToWmi to apply the same model to the local MDM Bridge instead of exporting to a file. + + + + + EXAMPLE 1 + $Profile | Export-InfisicalScepMdmProfile -Path 'C:\Temp\scep.syncml' -Force + Writes the SyncML payload for the supplied SCEP MDM profile, overwriting any existing file. + + + EXAMPLE 2 + $ExportInfisicalScepMdmProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$ExportInfisicalScepMdmProfileParameters.InputObject = $Profile +$ExportInfisicalScepMdmProfileParameters.Path = "C:\ProgramData\Infisical\scep-$($Profile.UniqueId).syncml" +$ExportInfisicalScepMdmProfileParameters.Force = $True +$ExportInfisicalScepMdmProfileParameters.PassThru = $True +$ExportInfisicalScepMdmProfileParameters.Verbose = $True + +$ExportInfisicalScepMdmProfileResult = Export-InfisicalScepMdmProfile @ExportInfisicalScepMdmProfileParameters + Writes the SyncML payload to a per-profile path under ProgramData and returns the resulting FileInfo. + + + + + + + Write-InfisicalScepMdmProfileToWmi + Submits an InfisicalScepMdmProfile to the local Windows MDM Bridge WMI provider to trigger SCEP enrollment. + Write + InfisicalScepMdmProfileToWmi + + + Creates a new CIM instance under the MDM Bridge namespace (default: root/cimv2/mdm/dmmap, class MDM_ClientCertificateInstall_SCEP02) by invoking New-CimInstance through the host runspace. Honors -WhatIf and -Confirm. -PassThru emits the resulting CIM instance. Throws PlatformNotSupportedException off Windows. Device-scope enrollment requires an elevated session; pass -SkipElevationCheck to bypass the guard. + + + Notes + + The MDM Bridge WMI provider runs the enrollment asynchronously; success here means the enrollment was submitted, not that a certificate has been issued. Inspect the corresponding ClientCertificateInstall/SCEP/<UniqueId>/Install nodes for status. Override -ClassName when targeting a different SCEP CSP version on the host. + + + + + EXAMPLE 1 + $Profile | Write-InfisicalScepMdmProfileToWmi -PassThru + Submits the SCEP MDM profile to the local MDM Bridge and emits the created CIM instance. + + + EXAMPLE 2 + $WriteInfisicalScepMdmProfileToWmiParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$WriteInfisicalScepMdmProfileToWmiParameters.InputObject = $Profile +$WriteInfisicalScepMdmProfileToWmiParameters.Namespace = 'root/cimv2/mdm/dmmap' +$WriteInfisicalScepMdmProfileToWmiParameters.ClassName = 'MDM_ClientCertificateInstall_SCEP02' +$WriteInfisicalScepMdmProfileToWmiParameters.SkipElevationCheck = $False +$WriteInfisicalScepMdmProfileToWmiParameters.PassThru = $True +$WriteInfisicalScepMdmProfileToWmiParameters.Verbose = $True + +$WriteInfisicalScepMdmProfileToWmiResult = Write-InfisicalScepMdmProfileToWmi @WriteInfisicalScepMdmProfileToWmiParameters + Submits a device-scope SCEP enrollment through the MDM Bridge and returns the CIM instance for downstream inspection. + + + From a195901a10f10a058d3317675f3b5d5325e6657a Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 19:34:43 -0400 Subject: [PATCH 21/27] feat(pki): add Certificate Application + Enrollment models and client methods Adds InfisicalCertificateApplication and InfisicalCertificateApplicationEnrollment models (with SCEP/EST/ACME/API sub-blocks) and DTO/mapper layer. Mapper computes the SHA-1 RA certificate thumbprint from the enrollment PEM so it can be fed directly into MDM payloads. InfisicalPkiClient gains ListCertificateApplications, GetCertificateApplication, GetCertificateApplicationByName, ListCertificateApplicationProfiles, GetCertificateApplicationEnrollment, and GenerateScepDynamicChallenge. InfisicalApiInvoker accepts an optional extraHeaders argument so callers can attach x-infisical-project-id and override Accept (used by the plain-text SCEP challenge endpoint). New endpoint names and registry entries cover /api/v1/cert-manager/applications/** and /scep/applications/**/profiles/**/challenge. --- .../Endpoints/InfisicalEndpointNames.cs | 8 + .../Endpoints/InfisicalEndpointRegistry.cs | 61 +++++ .../Http/InfisicalApiInvoker.cs | 22 +- .../Models/InfisicalCertificateApplication.cs | 31 +++ ...fisicalCertificateApplicationEnrollment.cs | 55 +++++ .../InfisicalCertificateApplicationDtos.cs | 92 +++++++ .../InfisicalCertificateApplicationMapper.cs | 175 ++++++++++++++ src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 227 ++++++++++++++++++ 8 files changed, 666 insertions(+), 5 deletions(-) create mode 100644 src/PSInfisicalAPI/Models/InfisicalCertificateApplication.cs create mode 100644 src/PSInfisicalAPI/Models/InfisicalCertificateApplicationEnrollment.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationDtos.cs create mode 100644 src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationMapper.cs diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs index fa32617..678514f 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointNames.cs @@ -63,5 +63,13 @@ namespace PSInfisicalAPI.Endpoints public const string GetCertificatePolicy = "GetCertificatePolicy"; public const string ListCertificateAuthorities = "ListCertificateAuthorities"; + + public const string ListCertificateApplications = "ListCertificateApplications"; + public const string GetCertificateApplication = "GetCertificateApplication"; + public const string GetCertificateApplicationByName = "GetCertificateApplicationByName"; + public const string ListCertificateApplicationProfiles = "ListCertificateApplicationProfiles"; + public const string GetCertificateApplicationEnrollment = "GetCertificateApplicationEnrollment"; + + public const string GenerateScepDynamicChallenge = "GenerateScepDynamicChallenge"; } } diff --git a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs index 242a202..e3f5ac4 100644 --- a/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs +++ b/src/PSInfisicalAPI/Endpoints/InfisicalEndpointRegistry.cs @@ -703,6 +703,67 @@ namespace PSInfisicalAPI.Endpoints Template = "/api/v1/cert-manager/ca", RequiresAuthorization = true }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.ListCertificateApplications, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/applications", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GetCertificateApplication, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/applications/{applicationId}", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GetCertificateApplicationByName, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/applications/by-name/{name}", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.ListCertificateApplicationProfiles, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/applications/{applicationId}/profiles", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GetCertificateApplicationEnrollment, + Resource = "Pki", + Version = "v1", + Method = "GET", + Template = "/api/v1/cert-manager/applications/{applicationId}/profiles/{profileId}/enrollment", + RequiresAuthorization = true + }); + + Add(map, new InfisicalEndpointDefinition + { + Name = InfisicalEndpointNames.GenerateScepDynamicChallenge, + Resource = "Pki", + Version = "v1", + Method = "POST", + Template = "/scep/applications/{applicationId}/profiles/{profileId}/challenge", + RequiresAuthorization = true, + ContainsSecretMaterialInResponse = true + }); } public static InfisicalEndpointDefinition Get(string name) diff --git a/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs b/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs index a3e2b1a..7e88cf7 100644 --- a/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs +++ b/src/PSInfisicalAPI/Http/InfisicalApiInvoker.cs @@ -23,7 +23,8 @@ namespace PSInfisicalAPI.Http string operationName, IDictionary pathParameters, IEnumerable> queryParameters, - string body) + string body, + IDictionary extraHeaders = null) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (string.IsNullOrEmpty(endpointName)) { throw new ArgumentNullException(nameof(endpointName)); } @@ -31,7 +32,7 @@ namespace PSInfisicalAPI.Http InfisicalEndpointDefinition definition = InfisicalEndpointRegistry.Get(endpointName); Uri uri = InfisicalUriBuilder.Build(connection.BaseUri, definition, pathParameters, queryParameters); - InfisicalHttpResponse response = ExecuteAuthorized(connection, definition, operationName, uri, body); + InfisicalHttpResponse response = ExecuteAuthorized(connection, definition, operationName, uri, body, extraHeaders); if (response.StatusCode >= 200 && response.StatusCode < 300) { @@ -49,7 +50,8 @@ namespace PSInfisicalAPI.Http string operationName, IDictionary pathParameters, IEnumerable> queryParameters, - string body) + string body, + IDictionary extraHeaders = null) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (string.IsNullOrEmpty(endpointName)) { throw new ArgumentNullException(nameof(endpointName)); } @@ -61,7 +63,7 @@ namespace PSInfisicalAPI.Http { InfisicalEndpointDefinition definition = candidates[index]; Uri uri = InfisicalUriBuilder.Build(connection.BaseUri, definition, pathParameters, queryParameters); - InfisicalHttpResponse response = ExecuteAuthorized(connection, definition, operationName, uri, body); + InfisicalHttpResponse response = ExecuteAuthorized(connection, definition, operationName, uri, body, extraHeaders); if (response.StatusCode >= 200 && response.StatusCode < 300) { @@ -95,7 +97,8 @@ namespace PSInfisicalAPI.Http InfisicalEndpointDefinition definition, string operationName, Uri uri, - string body) + string body, + IDictionary extraHeaders = null) { Dictionary headers = new Dictionary(StringComparer.OrdinalIgnoreCase); headers["Accept"] = "application/json"; @@ -118,6 +121,15 @@ namespace PSInfisicalAPI.Http }); } + if (extraHeaders != null) + { + foreach (KeyValuePair entry in extraHeaders) + { + if (string.IsNullOrEmpty(entry.Key)) { continue; } + headers[entry.Key] = entry.Value; + } + } + InfisicalHttpRequest request = new InfisicalHttpRequest { OperationName = operationName, diff --git a/src/PSInfisicalAPI/Models/InfisicalCertificateApplication.cs b/src/PSInfisicalAPI/Models/InfisicalCertificateApplication.cs new file mode 100644 index 0000000..170e366 --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalCertificateApplication.cs @@ -0,0 +1,31 @@ +using System; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalCertificateApplication + { + public string Id { get; set; } + public string ProjectId { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public int? ProfileCount { get; set; } + public int? MemberCount { get; set; } + public int? CertificateCount { get; set; } + public DateTimeOffset? CreatedAtUtc { get; set; } + public DateTimeOffset? UpdatedAtUtc { get; set; } + } + + public sealed class InfisicalCertificateApplicationProfileAttachment + { + public string ApplicationId { get; set; } + public string ProfileId { get; set; } + public string ProfileSlug { get; set; } + public string ProfileDescription { get; set; } + public string ApiConfigId { get; set; } + public string EstConfigId { get; set; } + public string AcmeConfigId { get; set; } + public string ScepConfigId { get; set; } + public DateTimeOffset? CreatedAtUtc { get; set; } + public DateTimeOffset? UpdatedAtUtc { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Models/InfisicalCertificateApplicationEnrollment.cs b/src/PSInfisicalAPI/Models/InfisicalCertificateApplicationEnrollment.cs new file mode 100644 index 0000000..1a5a9ef --- /dev/null +++ b/src/PSInfisicalAPI/Models/InfisicalCertificateApplicationEnrollment.cs @@ -0,0 +1,55 @@ +using System; + +namespace PSInfisicalAPI.Models +{ + public sealed class InfisicalCertificateApplicationEnrollment + { + public string ApplicationId { get; set; } + public string ProfileId { get; set; } + public InfisicalCertificateApplicationApiEnrollment Api { get; set; } + public InfisicalCertificateApplicationEstEnrollment Est { get; set; } + public InfisicalCertificateApplicationAcmeEnrollment Acme { get; set; } + public InfisicalCertificateApplicationScepEnrollment Scep { get; set; } + public bool ApiConfigured { get { return Api != null; } } + public bool EstConfigured { get; set; } + public bool AcmeConfigured { get; set; } + public bool ScepConfigured { get; set; } + } + + public sealed class InfisicalCertificateApplicationApiEnrollment + { + public string Id { get; set; } + public bool? AutoRenew { get; set; } + public int? RenewBeforeDays { get; set; } + } + + public sealed class InfisicalCertificateApplicationEstEnrollment + { + public string Id { get; set; } + public bool? DisableBootstrapCaValidation { get; set; } + public string EstEndpointUrl { get; set; } + } + + public sealed class InfisicalCertificateApplicationAcmeEnrollment + { + public string Id { get; set; } + public bool? SkipDnsOwnershipVerification { get; set; } + public bool? SkipEabBinding { get; set; } + public string DirectoryUrl { get; set; } + } + + public sealed class InfisicalCertificateApplicationScepEnrollment + { + public string Id { get; set; } + public string ChallengeType { get; set; } + public bool? IncludeCaCertInResponse { get; set; } + public bool? AllowCertBasedRenewal { get; set; } + public int? DynamicChallengeExpiryMinutes { get; set; } + public int? DynamicChallengeMaxPending { get; set; } + public string ScepEndpointUrl { get; set; } + public string ChallengeEndpointUrl { get; set; } + public string RaCertificatePem { get; set; } + public string RaCertificateThumbprint { get; set; } + public DateTimeOffset? RaCertExpiresAtUtc { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationDtos.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationDtos.cs new file mode 100644 index 0000000..356c616 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationDtos.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace PSInfisicalAPI.Pki +{ + internal sealed class InfisicalCertificateApplicationResponseDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("projectId")] public string ProjectId { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("description")] public string Description { get; set; } + [JsonProperty("profileCount")] public int? ProfileCount { get; set; } + [JsonProperty("memberCount")] public int? MemberCount { get; set; } + [JsonProperty("certificateCount")] public int? CertificateCount { get; set; } + [JsonProperty("createdAt")] public string CreatedAt { get; set; } + [JsonProperty("updatedAt")] public string UpdatedAt { get; set; } + } + + internal sealed class InfisicalCertificateApplicationListResponseDto + { + [JsonProperty("applications")] public List Applications { get; set; } + [JsonProperty("total")] public int? Total { get; set; } + } + + internal sealed class InfisicalCertificateApplicationProfileAttachmentDto + { + [JsonProperty("applicationId")] public string ApplicationId { get; set; } + [JsonProperty("profileId")] public string ProfileId { get; set; } + [JsonProperty("profileSlug")] public string ProfileSlug { get; set; } + [JsonProperty("profileDescription")] public string ProfileDescription { get; set; } + [JsonProperty("apiConfigId")] public string ApiConfigId { get; set; } + [JsonProperty("estConfigId")] public string EstConfigId { get; set; } + [JsonProperty("acmeConfigId")] public string AcmeConfigId { get; set; } + [JsonProperty("scepConfigId")] public string ScepConfigId { get; set; } + [JsonProperty("createdAt")] public string CreatedAt { get; set; } + [JsonProperty("updatedAt")] public string UpdatedAt { get; set; } + } + + internal sealed class InfisicalCertificateApplicationProfilesResponseDto + { + [JsonProperty("profiles")] public List Profiles { get; set; } + } + + internal sealed class InfisicalCertificateApplicationEnrollmentResponseDto + { + [JsonProperty("applicationId")] public string ApplicationId { get; set; } + [JsonProperty("profileId")] public string ProfileId { get; set; } + [JsonProperty("api")] public InfisicalCertificateApplicationApiEnrollmentDto Api { get; set; } + [JsonProperty("est")] public InfisicalCertificateApplicationEstEnrollmentDto Est { get; set; } + [JsonProperty("acme")] public InfisicalCertificateApplicationAcmeEnrollmentDto Acme { get; set; } + [JsonProperty("scep")] public InfisicalCertificateApplicationScepEnrollmentDto Scep { get; set; } + [JsonProperty("estConfigured")] public bool? EstConfigured { get; set; } + [JsonProperty("acmeConfigured")] public bool? AcmeConfigured { get; set; } + [JsonProperty("scepConfigured")] public bool? ScepConfigured { get; set; } + } + + internal sealed class InfisicalCertificateApplicationApiEnrollmentDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("autoRenew")] public bool? AutoRenew { get; set; } + [JsonProperty("renewBeforeDays")] public int? RenewBeforeDays { get; set; } + } + + internal sealed class InfisicalCertificateApplicationEstEnrollmentDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("disableBootstrapCaValidation")] public bool? DisableBootstrapCaValidation { get; set; } + [JsonProperty("estEndpointUrl")] public string EstEndpointUrl { get; set; } + } + + internal sealed class InfisicalCertificateApplicationAcmeEnrollmentDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("skipDnsOwnershipVerification")] public bool? SkipDnsOwnershipVerification { get; set; } + [JsonProperty("skipEabBinding")] public bool? SkipEabBinding { get; set; } + [JsonProperty("directoryUrl")] public string DirectoryUrl { get; set; } + } + + internal sealed class InfisicalCertificateApplicationScepEnrollmentDto + { + [JsonProperty("id")] public string Id { get; set; } + [JsonProperty("challengeType")] public string ChallengeType { get; set; } + [JsonProperty("includeCaCertInResponse")] public bool? IncludeCaCertInResponse { get; set; } + [JsonProperty("allowCertBasedRenewal")] public bool? AllowCertBasedRenewal { get; set; } + [JsonProperty("dynamicChallengeExpiryMinutes")] public int? DynamicChallengeExpiryMinutes { get; set; } + [JsonProperty("dynamicChallengeMaxPending")] public int? DynamicChallengeMaxPending { get; set; } + [JsonProperty("scepEndpointUrl")] public string ScepEndpointUrl { get; set; } + [JsonProperty("challengeEndpointUrl")] public string ChallengeEndpointUrl { get; set; } + [JsonProperty("raCertificatePem")] public string RaCertificatePem { get; set; } + [JsonProperty("raCertExpiresAt")] public string RaCertExpiresAt { get; set; } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationMapper.cs b/src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationMapper.cs new file mode 100644 index 0000000..7798243 --- /dev/null +++ b/src/PSInfisicalAPI/Pki/InfisicalCertificateApplicationMapper.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using PSInfisicalAPI.Models; + +namespace PSInfisicalAPI.Pki +{ + internal static class InfisicalCertificateApplicationMapper + { + public static InfisicalCertificateApplication Map(InfisicalCertificateApplicationResponseDto dto, string fallbackProjectId) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplication + { + Id = dto.Id, + ProjectId = !string.IsNullOrEmpty(dto.ProjectId) ? dto.ProjectId : fallbackProjectId, + Name = dto.Name, + Description = dto.Description, + ProfileCount = dto.ProfileCount, + MemberCount = dto.MemberCount, + CertificateCount = dto.CertificateCount, + CreatedAtUtc = ParseTimestamp(dto.CreatedAt), + UpdatedAtUtc = ParseTimestamp(dto.UpdatedAt) + }; + } + + public static InfisicalCertificateApplication[] MapMany(IEnumerable items, string fallbackProjectId) + { + if (items == null) { return Array.Empty(); } + List results = new List(); + foreach (InfisicalCertificateApplicationResponseDto dto in items) + { + InfisicalCertificateApplication mapped = Map(dto, fallbackProjectId); + if (mapped != null) { results.Add(mapped); } + } + + return results.ToArray(); + } + + public static InfisicalCertificateApplicationProfileAttachment MapAttachment(InfisicalCertificateApplicationProfileAttachmentDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplicationProfileAttachment + { + ApplicationId = dto.ApplicationId, + ProfileId = dto.ProfileId, + ProfileSlug = dto.ProfileSlug, + ProfileDescription = dto.ProfileDescription, + ApiConfigId = dto.ApiConfigId, + EstConfigId = dto.EstConfigId, + AcmeConfigId = dto.AcmeConfigId, + ScepConfigId = dto.ScepConfigId, + CreatedAtUtc = ParseTimestamp(dto.CreatedAt), + UpdatedAtUtc = ParseTimestamp(dto.UpdatedAt) + }; + } + + public static InfisicalCertificateApplicationProfileAttachment[] MapAttachments(IEnumerable items) + { + if (items == null) { return Array.Empty(); } + List results = new List(); + foreach (InfisicalCertificateApplicationProfileAttachmentDto dto in items) + { + InfisicalCertificateApplicationProfileAttachment mapped = MapAttachment(dto); + if (mapped != null) { results.Add(mapped); } + } + + return results.ToArray(); + } + + public static InfisicalCertificateApplicationEnrollment MapEnrollment(InfisicalCertificateApplicationEnrollmentResponseDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplicationEnrollment + { + ApplicationId = dto.ApplicationId, + ProfileId = dto.ProfileId, + Api = MapApi(dto.Api), + Est = MapEst(dto.Est), + Acme = MapAcme(dto.Acme), + Scep = MapScep(dto.Scep), + EstConfigured = dto.EstConfigured.GetValueOrDefault(), + AcmeConfigured = dto.AcmeConfigured.GetValueOrDefault(), + ScepConfigured = dto.ScepConfigured.GetValueOrDefault() + }; + } + + private static InfisicalCertificateApplicationApiEnrollment MapApi(InfisicalCertificateApplicationApiEnrollmentDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplicationApiEnrollment { Id = dto.Id, AutoRenew = dto.AutoRenew, RenewBeforeDays = dto.RenewBeforeDays }; + } + + private static InfisicalCertificateApplicationEstEnrollment MapEst(InfisicalCertificateApplicationEstEnrollmentDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplicationEstEnrollment { Id = dto.Id, DisableBootstrapCaValidation = dto.DisableBootstrapCaValidation, EstEndpointUrl = dto.EstEndpointUrl }; + } + + private static InfisicalCertificateApplicationAcmeEnrollment MapAcme(InfisicalCertificateApplicationAcmeEnrollmentDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplicationAcmeEnrollment { Id = dto.Id, SkipDnsOwnershipVerification = dto.SkipDnsOwnershipVerification, SkipEabBinding = dto.SkipEabBinding, DirectoryUrl = dto.DirectoryUrl }; + } + + private static InfisicalCertificateApplicationScepEnrollment MapScep(InfisicalCertificateApplicationScepEnrollmentDto dto) + { + if (dto == null) { return null; } + return new InfisicalCertificateApplicationScepEnrollment + { + Id = dto.Id, + ChallengeType = dto.ChallengeType, + IncludeCaCertInResponse = dto.IncludeCaCertInResponse, + AllowCertBasedRenewal = dto.AllowCertBasedRenewal, + DynamicChallengeExpiryMinutes = dto.DynamicChallengeExpiryMinutes, + DynamicChallengeMaxPending = dto.DynamicChallengeMaxPending, + ScepEndpointUrl = dto.ScepEndpointUrl, + ChallengeEndpointUrl = dto.ChallengeEndpointUrl, + RaCertificatePem = dto.RaCertificatePem, + RaCertificateThumbprint = ComputeThumbprint(dto.RaCertificatePem), + RaCertExpiresAtUtc = ParseTimestamp(dto.RaCertExpiresAt) + }; + } + + internal static string ComputeThumbprint(string pem) + { + if (string.IsNullOrEmpty(pem)) { return null; } + try + { + byte[] der = Convert.FromBase64String(StripPemArmor(pem)); + using (X509Certificate2 cert = new X509Certificate2(der)) + { + return cert.Thumbprint; + } + } + catch + { + return null; + } + } + + private static string StripPemArmor(string pem) + { + StringBuilder sb = new StringBuilder(pem.Length); + using (StringReader reader = new StringReader(pem)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + string trimmed = line.Trim(); + if (trimmed.Length == 0) { continue; } + if (trimmed.StartsWith("-----", StringComparison.Ordinal)) { continue; } + sb.Append(trimmed); + } + } + + return sb.ToString(); + } + + private static DateTimeOffset? ParseTimestamp(string value) + { + if (string.IsNullOrEmpty(value)) { return null; } + DateTimeOffset parsed; + if (DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out parsed)) + { + return parsed; + } + + return null; + } + } +} diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index e3e06b6..cda0afc 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -640,6 +640,233 @@ namespace PSInfisicalAPI.Pki } } + public InfisicalCertificateApplication[] ListCertificateApplications(InfisicalConnection connection, string projectId, int? limit, int? offset) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + List> query = new List>(); + if (limit.HasValue) { query.Add(new KeyValuePair("limit", limit.Value.ToString(CultureInfo.InvariantCulture))); } + if (offset.HasValue) { query.Add(new KeyValuePair("offset", offset.Value.ToString(CultureInfo.InvariantCulture))); } + + Dictionary headers = BuildProjectHeader(resolvedProjectId); + + try + { + _logger.Information(Component, "Attempting to list Infisical certificate applications. Please Wait..."); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.ListCertificateApplications, "ListCertificateApplications", null, query, null, headers); + string body = response.Body; + response.Clear(); + + List source = ParseApplicationListBody(body); + InfisicalCertificateApplication[] mapped = InfisicalCertificateApplicationMapper.MapMany(source, resolvedProjectId); + _logger.Information(Component, "Infisical certificate application list retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate application list retrieval failed."); + throw; + } + } + + public InfisicalCertificateApplication GetCertificateApplication(InfisicalConnection connection, string applicationId, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(applicationId)) { throw new InfisicalConfigurationException("ApplicationId is required."); } + + Dictionary pathParameters = new Dictionary { { "applicationId", applicationId } }; + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + Dictionary headers = !string.IsNullOrEmpty(resolvedProjectId) ? BuildProjectHeader(resolvedProjectId) : null; + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve Infisical certificate application '", applicationId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.GetCertificateApplication, "GetCertificateApplication", pathParameters, null, null, headers); + string body = response.Body; + response.Clear(); + + InfisicalCertificateApplicationResponseDto inner = ParseApplicationSingleBody(body); + InfisicalCertificateApplication mapped = InfisicalCertificateApplicationMapper.Map(inner, resolvedProjectId); + _logger.Information(Component, "Infisical certificate application retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate application retrieval failed."); + throw; + } + } + + public InfisicalCertificateApplication GetCertificateApplicationByName(InfisicalConnection connection, string name, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(name)) { throw new InfisicalConfigurationException("ApplicationName is required."); } + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + + Dictionary pathParameters = new Dictionary { { "name", name } }; + Dictionary headers = BuildProjectHeader(resolvedProjectId); + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve Infisical certificate application '", name, "' by name. Please Wait...")); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.GetCertificateApplicationByName, "GetCertificateApplicationByName", pathParameters, null, null, headers); + string body = response.Body; + response.Clear(); + + InfisicalCertificateApplicationResponseDto inner = ParseApplicationSingleBody(body); + InfisicalCertificateApplication mapped = InfisicalCertificateApplicationMapper.Map(inner, resolvedProjectId); + _logger.Information(Component, "Infisical certificate application (by name) retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate application (by name) retrieval failed."); + throw; + } + } + + public InfisicalCertificateApplicationProfileAttachment[] ListCertificateApplicationProfiles(InfisicalConnection connection, string applicationId, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(applicationId)) { throw new InfisicalConfigurationException("ApplicationId is required."); } + + Dictionary pathParameters = new Dictionary { { "applicationId", applicationId } }; + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + Dictionary headers = !string.IsNullOrEmpty(resolvedProjectId) ? BuildProjectHeader(resolvedProjectId) : null; + + try + { + _logger.Information(Component, string.Concat("Attempting to list profile attachments for Infisical certificate application '", applicationId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.ListCertificateApplicationProfiles, "ListCertificateApplicationProfiles", pathParameters, null, null, headers); + string body = response.Body; + response.Clear(); + + List source = ParseApplicationProfilesBody(body); + InfisicalCertificateApplicationProfileAttachment[] mapped = InfisicalCertificateApplicationMapper.MapAttachments(source); + _logger.Information(Component, "Infisical certificate application profile attachment listing was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate application profile attachment listing failed."); + throw; + } + } + + public InfisicalCertificateApplicationEnrollment GetCertificateApplicationEnrollment(InfisicalConnection connection, string applicationId, string profileId, string projectId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(applicationId)) { throw new InfisicalConfigurationException("ApplicationId is required."); } + if (string.IsNullOrEmpty(profileId)) { throw new InfisicalConfigurationException("ProfileId is required."); } + + Dictionary pathParameters = new Dictionary + { + { "applicationId", applicationId }, + { "profileId", profileId } + }; + string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); + Dictionary headers = !string.IsNullOrEmpty(resolvedProjectId) ? BuildProjectHeader(resolvedProjectId) : null; + + try + { + _logger.Information(Component, string.Concat("Attempting to retrieve enrollment for application '", applicationId, "' / profile '", profileId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.GetCertificateApplicationEnrollment, "GetCertificateApplicationEnrollment", pathParameters, null, null, headers); + InfisicalCertificateApplicationEnrollmentResponseDto dto = _serializer.Deserialize(response.Body); + response.Clear(); + + InfisicalCertificateApplicationEnrollment mapped = InfisicalCertificateApplicationMapper.MapEnrollment(dto); + _logger.Information(Component, "Infisical certificate application enrollment retrieval was successful."); + return mapped; + } + catch (Exception) + { + _logger.Error(Component, "Infisical certificate application enrollment retrieval failed."); + throw; + } + } + + public string GenerateScepDynamicChallenge(InfisicalConnection connection, string applicationId, string profileId) + { + if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + if (string.IsNullOrEmpty(applicationId)) { throw new InfisicalConfigurationException("ApplicationId is required."); } + if (string.IsNullOrEmpty(profileId)) { throw new InfisicalConfigurationException("ProfileId is required."); } + + Dictionary pathParameters = new Dictionary + { + { "applicationId", applicationId }, + { "profileId", profileId } + }; + Dictionary headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Accept", "text/plain" } + }; + + try + { + _logger.Information(Component, string.Concat("Attempting to generate SCEP dynamic challenge for application '", applicationId, "' / profile '", profileId, "'. Please Wait...")); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.GenerateScepDynamicChallenge, "GenerateScepDynamicChallenge", pathParameters, null, string.Empty, headers); + string body = response.Body != null ? response.Body.Trim() : null; + response.Clear(); + + if (string.IsNullOrEmpty(body)) { throw new InfisicalApiException("SCEP dynamic challenge response was empty."); } + _logger.Information(Component, "Infisical SCEP dynamic challenge generation was successful."); + return body; + } + catch (Exception) + { + _logger.Error(Component, "Infisical SCEP dynamic challenge generation failed."); + throw; + } + } + + private static Dictionary BuildProjectHeader(string projectId) + { + return new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "x-infisical-project-id", projectId } + }; + } + + private List ParseApplicationListBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Array) + { + return token.ToObject>(); + } + + InfisicalCertificateApplicationListResponseDto wrapper = token.ToObject(); + return wrapper != null ? wrapper.Applications : null; + } + + private InfisicalCertificateApplicationResponseDto ParseApplicationSingleBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type != JTokenType.Object) { return null; } + JObject obj = (JObject)token; + + if (obj["application"] is JObject inner) { return inner.ToObject(); } + return obj.ToObject(); + } + + private List ParseApplicationProfilesBody(string body) + { + if (string.IsNullOrEmpty(body)) { return null; } + JToken token = JToken.Parse(body); + if (token.Type == JTokenType.Array) + { + return token.ToObject>(); + } + + InfisicalCertificateApplicationProfilesResponseDto wrapper = token.ToObject(); + return wrapper != null ? wrapper.Profiles : null; + } + internal static InfisicalCertificateSearchRequestDto BuildSearchRequest(InfisicalCertificateSearchQuery query) { return new InfisicalCertificateSearchRequestDto From 148a09f0d9379c0276aa82b7c2199b2173294a62 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 19:34:50 -0400 Subject: [PATCH 22/27] feat(cmdlets): add Get-InfisicalCertificateApplication, Get-InfisicalCertificateApplicationEnrollment, New-InfisicalScepDynamicChallenge Get-InfisicalCertificateApplication exposes List/ById/ByName parameter sets over /api/v1/cert-manager/applications. Get-InfisicalCertificateApplicationEnrollment returns the per-application/profile enrollment block (API/EST/ACME/SCEP) with the computed RA cert thumbprint. New-InfisicalScepDynamicChallenge wraps POST /scep/applications/{appId}/profiles/{profileId}/challenge and returns the minted challenge as a SecureString (default) or string (-AsPlainText), surfacing plan-restriction and not-configured errors as descriptive ErrorRecords. --- ...etInfisicalCertificateApplicationCmdlet.cs | 61 +++++++++++++++++++ ...lCertificateApplicationEnrollmentCmdlet.cs | 43 +++++++++++++ .../NewInfisicalScepDynamicChallengeCmdlet.cs | 49 +++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs create mode 100644 src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs create mode 100644 src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs new file mode 100644 index 0000000..9636eb7 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs @@ -0,0 +1,61 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalCertificateApplication", DefaultParameterSetName = "List")] + [OutputType(typeof(InfisicalCertificateApplication))] + public sealed class GetInfisicalCertificateApplicationCmdlet : InfisicalCmdletBase + { + [Parameter(ParameterSetName = "ById", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Id", "ApplicationId")] + public string Id { get; set; } + + [Parameter(ParameterSetName = "ByName", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Name", "ApplicationName")] + public string ApplicationName { get; set; } + + [Parameter] public string ProjectId { get; set; } + + [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } + + [Parameter(ParameterSetName = "List")] public int? Offset { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) + { + InfisicalCertificateApplication app = client.GetCertificateApplication(connection, Id, resolvedProjectId); + if (app != null) { WriteObject(app); } + return; + } + + if (string.Equals(ParameterSetName, "ByName", StringComparison.Ordinal)) + { + InfisicalCertificateApplication app = client.GetCertificateApplicationByName(connection, ApplicationName, resolvedProjectId); + if (app != null) { WriteObject(app); } + return; + } + + InfisicalCertificateApplication[] all = client.ListCertificateApplications(connection, resolvedProjectId, Limit, Offset); + foreach (InfisicalCertificateApplication app in all) + { + WriteObject(app); + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalCertificateApplicationCmdlet", "GetCertificateApplication", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs new file mode 100644 index 0000000..378ce6b --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs @@ -0,0 +1,43 @@ +using System; +using System.Management.Automation; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.Get, "InfisicalCertificateApplicationEnrollment")] + [OutputType(typeof(InfisicalCertificateApplicationEnrollment))] + public sealed class GetInfisicalCertificateApplicationEnrollmentCmdlet : InfisicalCmdletBase + { + [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Id", "ApplicationId")] + public string ApplicationId { get; set; } + + [Parameter(Mandatory = true, Position = 1, ValueFromPipelineByPropertyName = true)] + [Alias("CertificateProfileId")] + public string ProfileId { get; set; } + + [Parameter] public string ProjectId { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + string resolvedProjectId = ResolveProjectId(connection, ProjectId); + + InfisicalCertificateApplicationEnrollment enrollment = client.GetCertificateApplicationEnrollment(connection, ApplicationId, ProfileId, resolvedProjectId); + if (enrollment != null) + { + WriteObject(enrollment); + } + } + catch (Exception exception) + { + ThrowTerminatingForException("GetInfisicalCertificateApplicationEnrollmentCmdlet", "GetCertificateApplicationEnrollment", exception); + } + } + } +} diff --git a/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs new file mode 100644 index 0000000..8534252 --- /dev/null +++ b/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs @@ -0,0 +1,49 @@ +using System; +using System.Management.Automation; +using System.Security; +using PSInfisicalAPI.Connections; +using PSInfisicalAPI.Pki; + +namespace PSInfisicalAPI.Cmdlets +{ + [Cmdlet(VerbsCommon.New, "InfisicalScepDynamicChallenge")] + [OutputType(typeof(SecureString))] + [OutputType(typeof(string))] + public sealed class NewInfisicalScepDynamicChallengeCmdlet : InfisicalCmdletBase + { + [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] + [Alias("Id", "ApplicationId")] + public string ApplicationId { get; set; } + + [Parameter(Mandatory = true, Position = 1, ValueFromPipelineByPropertyName = true)] + [Alias("CertificateProfileId")] + public string ProfileId { get; set; } + + [Parameter] public SwitchParameter AsPlainText { get; set; } + + protected override void ProcessRecord() + { + try + { + InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + + string challenge = client.GenerateScepDynamicChallenge(connection, ApplicationId, ProfileId); + if (AsPlainText.IsPresent) + { + WriteObject(challenge); + return; + } + + SecureString secure = new SecureString(); + foreach (char c in challenge) { secure.AppendChar(c); } + secure.MakeReadOnly(); + WriteObject(secure); + } + catch (Exception exception) + { + ThrowTerminatingForException("NewInfisicalScepDynamicChallengeCmdlet", "GenerateScepDynamicChallenge", exception); + } + } + } +} From 3c39a99b9a4cfa136a8d1f6a043efb77f23fd11f Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 19:35:16 -0400 Subject: [PATCH 23/27] feat(scep): rework Get-InfisicalScepMdmProfile into FromEnrollment/FromProfile/Manual parameter sets FromEnrollment (new default) consumes an InfisicalCertificateApplicationEnrollment and auto-fills ServerUrl from scep.scepEndpointUrl, CAThumbprint from the RA certificate thumbprint, and mints a fresh dynamic challenge automatically when challengeType=dynamic and -Challenge is not supplied. FromProfile preserves the legacy projection from an InfisicalCertificateProfile but now requires -ApplicationId so the server URL is built against /scep/applications/{appId}/profiles/{profileId}/pkiclient.exe. Manual requires explicit -ServerUrl, -Challenge, and -UniqueId. Module manifest, help XML, and build.ps1 expectedCmds list updated to register the three new cmdlets. CHANGELOG updated. --- CHANGELOG.md | 14 +- Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 7 +- .../en-US/PSInfisicalAPI.dll-Help.xml | 113 +++++++++++- build.ps1 | 5 +- .../GetInfisicalScepMdmProfileCmdlet.cs | 171 +++++++++++++----- 5 files changed, 257 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3c41e..e45fce7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,23 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.2305 + +- Build produced from commit 485ee8a7dd6a. + +## Unreleased (carried forward) + +- `Get-InfisicalCertificateApplication` added with `List` (default), `ById`, and `ByName` parameter sets. Binds to `/api/v1/cert-manager/applications` (list) and `/api/v1/cert-manager/applications/{applicationId}` / `/by-name/{name}` for single retrieval. Requests carry the `x-infisical-project-id` header so the certificate-manager scope resolves correctly. New `InfisicalCertificateApplication` model surfaces id, project, name, description, and counts. +- `Get-InfisicalCertificateApplicationEnrollment` added. Returns the API/EST/ACME/SCEP enrollment configuration for an application/profile pair (`GET /api/v1/cert-manager/applications/{applicationId}/profiles/{profileId}/enrollment`). The new `InfisicalCertificateApplicationEnrollment` model includes sub-blocks for each enrollment protocol; the SCEP block computes a SHA-1 `RaCertificateThumbprint` from the RA certificate PEM so it can be fed directly into MDM payloads. +- `New-InfisicalScepDynamicChallenge` added. Wraps `POST /scep/applications/{applicationId}/profiles/{profileId}/challenge` and returns the minted challenge as a `SecureString` (default) or string (`-AsPlainText`). The endpoint is gated by the dynamic-challenge feature on the target Infisical instance and by the calling identity's permission on `certificate-application-enrollment`. +- `Get-InfisicalScepMdmProfile` reworked into three parameter sets. `FromEnrollment` (new default) consumes an `InfisicalCertificateApplicationEnrollment` and auto-resolves `ServerUrl` from `scep.scepEndpointUrl`, `CAThumbprint` from the RA certificate, and the SCEP challenge (auto-minting when `challengeType=dynamic` and `-Challenge` is not supplied). `FromProfile` keeps the legacy projection from an `InfisicalCertificateProfile`, now requires `-ApplicationId`, and the default server URL is built against `/scep/applications/{appId}/profiles/{profileId}/pkiclient.exe`. `Manual` requires explicit `-ServerUrl`, `-Challenge`, and `-UniqueId`. +- `InfisicalApiInvoker` accepts an optional `extraHeaders` argument so callers can attach the `x-infisical-project-id` header and override `Accept` for plain-text responses (used by the new SCEP challenge endpoint). + ## 2026.06.04.2147 - Build produced from commit 183fb48c32ce. -## Unreleased (carried forward) +## Unreleased (carried forward) - `Get-InfisicalScepMdmProfile` added. Projects an `InfisicalCertificateProfile` (pipeline-bound) into a new `InfisicalScepMdmProfile` model that mirrors the Windows `ClientCertificateInstall/SCEP` CSP node set. `-ServerUrl` defaults to `{baseUri}/scep/{profileId}/pkiclient.exe` derived from the active connection (the `pkiclient.exe` suffix is the RFC 8894 / Cisco SCEP client compatibility holdover, not a server-side executable). `-UniqueId` defaults to a sanitized slug. `-Challenge` is a `SecureString` decrypted only when materializing the model. `KeyAlgorithm` and `EkuMapping` are inherited from the source profile defaults unless overridden. - `Export-InfisicalScepMdmProfile` added. Serializes the model via `InfisicalScepMdmProfile.ToSyncMl()` (XDocument build, XmlWriter emit, XmlReader round-trip validation) and writes the result to `-Path` as UTF-8 without BOM. Auto-creates the target directory, honors `-WhatIf`/`-Confirm`, and follows the project rule for `-Force`: if the destination exists without `-Force`, the cmdlet logs a warning and returns instead of throwing. `-PassThru` emits the resulting `FileInfo`. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 770a190..107de99 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.2147' + ModuleVersion = '2026.06.04.2305' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -46,6 +46,9 @@ 'Install-InfisicalCertificate', 'Uninstall-InfisicalCertificate', 'Export-InfisicalCertificate', + 'Get-InfisicalCertificateApplication', + 'Get-InfisicalCertificateApplicationEnrollment', + 'New-InfisicalScepDynamicChallenge', 'Get-InfisicalScepMdmProfile', 'Export-InfisicalScepMdmProfile', 'Write-InfisicalScepMdmProfileToWmi' @@ -60,7 +63,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '183fb48c32ce' + CommitHash = '485ee8a7dd6a' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index ffdcffb..c39f22b 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -1477,33 +1477,130 @@ $UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @Uninstall + + + Get-InfisicalCertificateApplication + Lists or retrieves an Infisical Certificate Manager Application from the active project. + Get + InfisicalCertificateApplication + + + Reads Infisical certificate-manager Applications (the join target used by EST/ACME/SCEP profile attachments) using the active connection's project scope. The List parameter set returns all applications visible to the caller; the ById and ByName sets return a single application. ProjectId falls back to the active connection when omitted. + + + + EXAMPLE 1 + Get-InfisicalCertificateApplication + Lists certificate-manager applications for the active project. + + + EXAMPLE 2 + Get-InfisicalCertificateApplication -ApplicationName 'workstation-mdm' + Retrieves a single application by name. + + + EXAMPLE 3 + $GetInfisicalCertificateApplicationParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateApplicationParameters.Id = $ApplicationId +$GetInfisicalCertificateApplicationParameters.ProjectId = $ProjectId +$GetInfisicalCertificateApplicationParameters.Verbose = $True + +$GetInfisicalCertificateApplicationResult = Get-InfisicalCertificateApplication @GetInfisicalCertificateApplicationParameters + Retrieves a single application by id from an explicit project. + + + + + + + Get-InfisicalCertificateApplicationEnrollment + Retrieves the API/EST/ACME/SCEP enrollment configuration attached to an application/profile pair. + Get + InfisicalCertificateApplicationEnrollment + + + Returns the InfisicalCertificateApplicationEnrollment for the given application and certificate profile, including any configured SCEP sub-block (server URL, RA certificate PEM, computed SHA-1 RaCertificateThumbprint, challenge type, and challenge endpoint URL when dynamic). + + + + EXAMPLE 1 + Get-InfisicalCertificateApplicationEnrollment -ApplicationId $AppId -ProfileId $ProfileId + Fetches the enrollment configuration for an application/profile pair. + + + EXAMPLE 2 + $GetInfisicalCertificateApplicationEnrollmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateApplicationEnrollmentParameters.ApplicationId = $ApplicationId +$GetInfisicalCertificateApplicationEnrollmentParameters.ProfileId = $ProfileId +$GetInfisicalCertificateApplicationEnrollmentParameters.Verbose = $True + +$GetInfisicalCertificateApplicationEnrollmentResult = Get-InfisicalCertificateApplicationEnrollment @GetInfisicalCertificateApplicationEnrollmentParameters + Retrieves the enrollment configuration and feeds it downstream to Get-InfisicalScepMdmProfile. + + + + + + + New-InfisicalScepDynamicChallenge + Generates a one-time SCEP challenge from an application/profile that is configured with dynamic challenge mode. + New + InfisicalScepDynamicChallenge + + + POSTs to /scep/applications/{applicationId}/profiles/{profileId}/challenge and returns the minted challenge as a SecureString. Use -AsPlainText to return a string instead. Requires the active machine identity to have read access on certificate-application-enrollment, and the target SCEP profile must be set to challengeType=dynamic. Dynamic challenges are an Enterprise-tier feature on managed Infisical deployments. + + + + EXAMPLE 1 + $Challenge = New-InfisicalScepDynamicChallenge -ApplicationId $AppId -ProfileId $ProfileId + Mints a single-use SCEP challenge and stores it as a SecureString. + + + EXAMPLE 2 + $NewInfisicalScepDynamicChallengeParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalScepDynamicChallengeParameters.ApplicationId = $ApplicationId +$NewInfisicalScepDynamicChallengeParameters.ProfileId = $ProfileId +$NewInfisicalScepDynamicChallengeParameters.AsPlainText = $True +$NewInfisicalScepDynamicChallengeParameters.Verbose = $True + +$NewInfisicalScepDynamicChallengeResult = New-InfisicalScepDynamicChallenge @NewInfisicalScepDynamicChallengeParameters + Mints a plain-text challenge for use in environments where SecureString is inconvenient. + + + + Get-InfisicalScepMdmProfile - Builds an Infisical SCEP MDM profile model from a certificate profile, suitable for SyncML export or local MDM enrollment. + Builds an Infisical SCEP MDM profile model from an application enrollment, certificate profile, or fully manual inputs. Get InfisicalScepMdmProfile - Projects an InfisicalCertificateProfile (pipeline-bound) into an InfisicalScepMdmProfile that mirrors the Windows ClientCertificateInstall/SCEP CSP node set. -Challenge is accepted as a SecureString and decrypted into the model only at write-time. -ServerUrl defaults to {baseUri}/scep/{profileId}/pkiclient.exe derived from the active connection. -UniqueId defaults to a sanitized form of the source profile slug. KeyAlgorithm and EkuMapping are inherited from the source profile defaults unless overridden. + Produces an InfisicalScepMdmProfile that mirrors the Windows ClientCertificateInstall/SCEP CSP node set. FromEnrollment (default) consumes an InfisicalCertificateApplicationEnrollment and auto-fills ServerUrl from scep.scepEndpointUrl and CAThumbprint from the RA certificate; if the enrollment is configured for dynamic challenge mode, a fresh challenge is minted automatically when -Challenge is not supplied. FromProfile keeps the legacy projection from an InfisicalCertificateProfile and now requires -ApplicationId so the server URL can be built against /scep/applications/{appId}/profiles/{profileId}/pkiclient.exe. Manual requires explicit -ServerUrl, -Challenge, and -UniqueId. Notes - The SCEP endpoint URL ends in 'pkiclient.exe' for RFC 8894 / Cisco SCEP client compatibility. The source profile must have SCEP enrollment enabled on the server side for enrollment to succeed; this cmdlet does not validate that. + The SCEP endpoint URL ends in 'pkiclient.exe' for RFC 8894 / Cisco SCEP client compatibility. SecureString -Challenge is decrypted into the model only at write-time. EXAMPLE 1 - Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId | Get-InfisicalScepMdmProfile -Challenge (Read-Host -AsSecureString 'SCEP challenge') - Builds a default SCEP MDM profile with the server URL inferred from the active connection. + Get-InfisicalCertificateApplicationEnrollment -ApplicationId $AppId -ProfileId $ProfileId | Get-InfisicalScepMdmProfile + Builds a SCEP MDM profile from an enrollment, auto-resolving ServerUrl, CAThumbprint, and (for dynamic mode) the challenge. EXAMPLE 2 + Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId | Get-InfisicalScepMdmProfile -ApplicationId $AppId -Challenge (Read-Host -AsSecureString 'SCEP challenge') + Builds a profile from a certificate profile (legacy path) with an explicit application id and static challenge. + + + EXAMPLE 3 $GetInfisicalScepMdmProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalScepMdmProfileParameters.InputObject = (Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId) -$GetInfisicalScepMdmProfileParameters.Challenge = (Read-Host -AsSecureString 'SCEP challenge') +$GetInfisicalScepMdmProfileParameters.EnrollmentObject = $Enrollment $GetInfisicalScepMdmProfileParameters.UniqueId = 'WindowsClientAuth' $GetInfisicalScepMdmProfileParameters.Scope = 'Device' $GetInfisicalScepMdmProfileParameters.SubjectName = "CN=$($env:COMPUTERNAME)" @@ -1514,7 +1611,7 @@ $GetInfisicalScepMdmProfileParameters.ValidPeriodUnits = 1 $GetInfisicalScepMdmProfileParameters.Verbose = $True $GetInfisicalScepMdmProfileResult = Get-InfisicalScepMdmProfile @GetInfisicalScepMdmProfileParameters - Builds a device-scope SCEP MDM profile with explicit subject and key parameters for downstream export or local enrollment. + Builds a device-scope SCEP MDM profile from an enrollment with overridden subject and key parameters. diff --git a/build.ps1 b/build.ps1 index 7be9ead..5e70b47 100644 --- a/build.ps1 +++ b/build.ps1 @@ -140,6 +140,9 @@ function Write-Manifest { 'Install-InfisicalCertificate', 'Uninstall-InfisicalCertificate', 'Export-InfisicalCertificate', + 'Get-InfisicalCertificateApplication', + 'Get-InfisicalCertificateApplicationEnrollment', + 'New-InfisicalScepDynamicChallenge', 'Get-InfisicalScepMdmProfile', 'Export-InfisicalScepMdmProfile', 'Write-InfisicalScepMdmProfileToWmi' @@ -207,7 +210,7 @@ if (`$cmds.Count -eq 0) { throw "No cmdlets were exported by the PSInfisicalAPI module." } -`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificatePolicy','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate','Get-InfisicalScepMdmProfile','Export-InfisicalScepMdmProfile','Write-InfisicalScepMdmProfileToWmi') +`$expectedCmds = @('Connect-Infisical','Disconnect-Infisical','Get-InfisicalSecret','New-InfisicalSecret','Update-InfisicalSecret','Remove-InfisicalSecret','Copy-InfisicalSecret','ConvertTo-InfisicalSecretDictionary','Export-InfisicalSecrets','Get-InfisicalProject','New-InfisicalProject','Update-InfisicalProject','Remove-InfisicalProject','Get-InfisicalEnvironment','New-InfisicalEnvironment','Update-InfisicalEnvironment','Remove-InfisicalEnvironment','Get-InfisicalFolder','New-InfisicalFolder','Update-InfisicalFolder','Remove-InfisicalFolder','Get-InfisicalTag','New-InfisicalTag','Update-InfisicalTag','Remove-InfisicalTag','Get-InfisicalCertificateAuthority','Get-InfisicalPkiSubscriber','Get-InfisicalCertificateProfile','Get-InfisicalCertificatePolicy','Get-InfisicalCertificate','Search-InfisicalCertificate','Request-InfisicalCertificate','ConvertTo-InfisicalCertificate','Install-InfisicalCertificate','Uninstall-InfisicalCertificate','Export-InfisicalCertificate','Get-InfisicalCertificateApplication','Get-InfisicalCertificateApplicationEnrollment','New-InfisicalScepDynamicChallenge','Get-InfisicalScepMdmProfile','Export-InfisicalScepMdmProfile','Write-InfisicalScepMdmProfileToWmi') foreach (`$expected in `$expectedCmds) { if (-not (Get-Command -Name `$expected -Module PSInfisicalAPI -ErrorAction SilentlyContinue)) { throw "Cmdlet not found: `$expected" diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs index 8621151..59336e0 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalScepMdmProfileCmdlet.cs @@ -6,24 +6,39 @@ using System.Runtime.InteropServices; using System.Security; using PSInfisicalAPI.Connections; using PSInfisicalAPI.Models; +using PSInfisicalAPI.Pki; namespace PSInfisicalAPI.Cmdlets { - [Cmdlet(VerbsCommon.Get, "InfisicalScepMdmProfile")] + [Cmdlet(VerbsCommon.Get, "InfisicalScepMdmProfile", DefaultParameterSetName = "FromEnrollment")] [OutputType(typeof(InfisicalScepMdmProfile))] public sealed class GetInfisicalScepMdmProfileCmdlet : InfisicalCmdletBase { private const string Component = "GetInfisicalScepMdmProfileCmdlet"; - [Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0)] + [Parameter(ParameterSetName = "FromEnrollment", Mandatory = true, ValueFromPipeline = true, Position = 0)] + [Alias("Enrollment")] + public InfisicalCertificateApplicationEnrollment EnrollmentObject { get; set; } + + [Parameter(ParameterSetName = "FromProfile", Mandatory = true, ValueFromPipeline = true, Position = 0)] [Alias("Profile", "CertificateProfile")] public InfisicalCertificateProfile InputObject { get; set; } - [Parameter(Mandatory = true)] + [Parameter(ParameterSetName = "FromProfile", Mandatory = true)] + [Alias("AppId")] + public string ApplicationId { get; set; } + + [Parameter(ParameterSetName = "FromEnrollment")] + [Parameter(ParameterSetName = "FromProfile")] + [Parameter(ParameterSetName = "Manual", Mandatory = true)] public SecureString Challenge { get; set; } + [Parameter(ParameterSetName = "Manual", Mandatory = true)] + [Parameter(ParameterSetName = "FromProfile")] + [Parameter(ParameterSetName = "FromEnrollment")] + public string ServerUrl { get; set; } + [Parameter] public string UniqueId { get; set; } - [Parameter] public string ServerUrl { get; set; } [Parameter] [ValidateSet("Device", "User")] @@ -53,45 +68,21 @@ namespace PSInfisicalAPI.Cmdlets { try { - if (InputObject == null) { throw new InvalidOperationException("InputObject is required."); } - if (string.IsNullOrEmpty(InputObject.Id)) { throw new InvalidOperationException("InputObject.Id is required."); } - InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedServerUrl = !string.IsNullOrEmpty(ServerUrl) ? ServerUrl : BuildDefaultServerUrl(connection, InputObject.Id); - string resolvedUniqueId = !string.IsNullOrEmpty(UniqueId) ? UniqueId : SanitizeForCspId(!string.IsNullOrEmpty(InputObject.Slug) ? InputObject.Slug : InputObject.Id); - InfisicalCertificateProfileDefaults defaults = InputObject.Defaults; - string resolvedKeyAlgorithm = !string.IsNullOrEmpty(KeyAlgorithm) ? KeyAlgorithm : MapKeyAlgorithm(defaults != null ? defaults.KeyAlgorithm : null); - string resolvedEku = !string.IsNullOrEmpty(EkuMapping) ? EkuMapping : JoinEkuOids(defaults != null ? defaults.ExtendedKeyUsages : null); - - InfisicalScepMdmProfile result = new InfisicalScepMdmProfile + if (string.Equals(ParameterSetName, "FromEnrollment", StringComparison.Ordinal)) { - UniqueId = resolvedUniqueId, - Scope = Scope, - ServerUrl = resolvedServerUrl, - Challenge = SecureStringToPlainText(Challenge), - SubjectName = SubjectName, - SubjectAlternativeNames = SubjectAlternativeNames, - EkuMapping = resolvedEku, - KeyUsage = KeyUsage, - KeyLength = KeyLength, - KeyAlgorithm = resolvedKeyAlgorithm, - HashAlgorithm = HashAlgorithm, - KeyProtection = KeyProtection, - ContainerName = ContainerName, - ValidPeriod = ValidPeriod, - ValidPeriodUnits = ValidPeriodUnits, - RetryCount = RetryCount, - RetryDelay = RetryDelay, - TemplateName = TemplateName, - CAThumbprint = CAThumbprint, - CustomTextToShowInPrompt = CustomTextToShowInPrompt, - SourceProfileId = InputObject.Id, - SourceProfileSlug = InputObject.Slug - }; + WriteObject(BuildFromEnrollment(connection)); + return; + } - Logger.Verbose(Component, string.Concat("Built SCEP MDM profile for source profile '", InputObject.Slug ?? InputObject.Id, "' targeting ", result.ServerUrl, " (UniqueId=", result.UniqueId, ", Scope=", result.Scope, ").")); - WriteObject(result); + if (string.Equals(ParameterSetName, "FromProfile", StringComparison.Ordinal)) + { + WriteObject(BuildFromProfile(connection)); + return; + } + + WriteObject(BuildManual(connection)); } catch (Exception exception) { @@ -99,11 +90,109 @@ namespace PSInfisicalAPI.Cmdlets } } - private static string BuildDefaultServerUrl(InfisicalConnection connection, string profileId) + private InfisicalScepMdmProfile BuildFromEnrollment(InfisicalConnection connection) + { + if (EnrollmentObject == null) { throw new InvalidOperationException("EnrollmentObject is required."); } + if (string.IsNullOrEmpty(EnrollmentObject.ApplicationId)) { throw new InvalidOperationException("EnrollmentObject.ApplicationId is required."); } + if (string.IsNullOrEmpty(EnrollmentObject.ProfileId)) { throw new InvalidOperationException("EnrollmentObject.ProfileId is required."); } + + InfisicalCertificateApplicationScepEnrollment scep = EnrollmentObject.Scep; + if (scep == null) { throw new InvalidOperationException("Enrollment does not have SCEP configured."); } + + string resolvedServerUrl = FirstNonEmpty(ServerUrl, scep.ScepEndpointUrl, BuildDefaultServerUrl(connection, EnrollmentObject.ApplicationId, EnrollmentObject.ProfileId)); + string resolvedUniqueId = !string.IsNullOrEmpty(UniqueId) ? UniqueId : SanitizeForCspId(EnrollmentObject.ProfileId); + string resolvedThumbprint = !string.IsNullOrEmpty(CAThumbprint) ? CAThumbprint : scep.RaCertificateThumbprint; + string resolvedChallenge = ResolveChallengeFromEnrollment(connection, scep); + + InfisicalScepMdmProfile result = NewProfileShell(resolvedUniqueId, resolvedServerUrl, resolvedChallenge, resolvedThumbprint, null, null); + result.SourceProfileId = EnrollmentObject.ProfileId; + Logger.Verbose(Component, string.Concat("Built SCEP MDM profile from enrollment for application '", EnrollmentObject.ApplicationId, "' / profile '", EnrollmentObject.ProfileId, "' targeting ", result.ServerUrl, " (UniqueId=", result.UniqueId, ", Scope=", result.Scope, ", ChallengeType=", scep.ChallengeType ?? "", ").")); + return result; + } + + private InfisicalScepMdmProfile BuildFromProfile(InfisicalConnection connection) + { + if (InputObject == null) { throw new InvalidOperationException("InputObject is required."); } + if (string.IsNullOrEmpty(InputObject.Id)) { throw new InvalidOperationException("InputObject.Id is required."); } + if (string.IsNullOrEmpty(ApplicationId)) { throw new InvalidOperationException("ApplicationId is required when binding by certificate profile."); } + if (Challenge == null) { throw new InvalidOperationException("Challenge is required when building from a certificate profile."); } + + string resolvedServerUrl = !string.IsNullOrEmpty(ServerUrl) ? ServerUrl : BuildDefaultServerUrl(connection, ApplicationId, InputObject.Id); + string resolvedUniqueId = !string.IsNullOrEmpty(UniqueId) ? UniqueId : SanitizeForCspId(!string.IsNullOrEmpty(InputObject.Slug) ? InputObject.Slug : InputObject.Id); + InfisicalCertificateProfileDefaults defaults = InputObject.Defaults; + string resolvedKeyAlgorithm = !string.IsNullOrEmpty(KeyAlgorithm) ? KeyAlgorithm : MapKeyAlgorithm(defaults != null ? defaults.KeyAlgorithm : null); + string resolvedEku = !string.IsNullOrEmpty(EkuMapping) ? EkuMapping : JoinEkuOids(defaults != null ? defaults.ExtendedKeyUsages : null); + + InfisicalScepMdmProfile result = NewProfileShell(resolvedUniqueId, resolvedServerUrl, SecureStringToPlainText(Challenge), CAThumbprint, resolvedKeyAlgorithm, resolvedEku); + result.SourceProfileId = InputObject.Id; + result.SourceProfileSlug = InputObject.Slug; + Logger.Verbose(Component, string.Concat("Built SCEP MDM profile for source profile '", InputObject.Slug ?? InputObject.Id, "' targeting ", result.ServerUrl, " (UniqueId=", result.UniqueId, ", Scope=", result.Scope, ").")); + return result; + } + + private InfisicalScepMdmProfile BuildManual(InfisicalConnection connection) + { + if (string.IsNullOrEmpty(UniqueId)) { throw new InvalidOperationException("UniqueId is required in Manual mode."); } + string resolvedChallenge = SecureStringToPlainText(Challenge); + InfisicalScepMdmProfile result = NewProfileShell(UniqueId, ServerUrl, resolvedChallenge, CAThumbprint, KeyAlgorithm, EkuMapping); + Logger.Verbose(Component, string.Concat("Built SCEP MDM profile in Manual mode targeting ", result.ServerUrl, " (UniqueId=", result.UniqueId, ", Scope=", result.Scope, ").")); + return result; + } + + private InfisicalScepMdmProfile NewProfileShell(string uniqueId, string serverUrl, string challenge, string thumbprint, string keyAlgorithm, string ekuMapping) + { + return new InfisicalScepMdmProfile + { + UniqueId = uniqueId, + Scope = Scope, + ServerUrl = serverUrl, + Challenge = challenge, + SubjectName = SubjectName, + SubjectAlternativeNames = SubjectAlternativeNames, + EkuMapping = ekuMapping, + KeyUsage = KeyUsage, + KeyLength = KeyLength, + KeyAlgorithm = keyAlgorithm, + HashAlgorithm = HashAlgorithm, + KeyProtection = KeyProtection, + ContainerName = ContainerName, + ValidPeriod = ValidPeriod, + ValidPeriodUnits = ValidPeriodUnits, + RetryCount = RetryCount, + RetryDelay = RetryDelay, + TemplateName = TemplateName, + CAThumbprint = thumbprint, + CustomTextToShowInPrompt = CustomTextToShowInPrompt + }; + } + + private string ResolveChallengeFromEnrollment(InfisicalConnection connection, InfisicalCertificateApplicationScepEnrollment scep) + { + if (Challenge != null) { return SecureStringToPlainText(Challenge); } + + string challengeType = scep.ChallengeType ?? string.Empty; + if (string.Equals(challengeType, "dynamic", StringComparison.OrdinalIgnoreCase)) + { + InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); + Logger.Verbose(Component, "Minting SCEP dynamic challenge for enrollment."); + return client.GenerateScepDynamicChallenge(connection, EnrollmentObject.ApplicationId, EnrollmentObject.ProfileId); + } + + throw new InvalidOperationException(string.Concat("Enrollment uses challengeType '", challengeType, "'. Supply -Challenge with the configured static challenge password.")); + } + + private static string BuildDefaultServerUrl(InfisicalConnection connection, string applicationId, string profileId) { if (connection == null || connection.BaseUri == null) { throw new InvalidOperationException("Active Infisical connection is required to derive ServerUrl."); } string baseUrl = connection.BaseUri.GetLeftPart(UriPartial.Authority); - return string.Concat(baseUrl, "/scep/", profileId, "/pkiclient.exe"); + return string.Concat(baseUrl, "/scep/applications/", applicationId, "/profiles/", profileId, "/pkiclient.exe"); + } + + private static string FirstNonEmpty(params string[] values) + { + if (values == null) { return null; } + foreach (string value in values) { if (!string.IsNullOrEmpty(value)) { return value; } } + return null; } private static string SanitizeForCspId(string input) From fb27ab8a85038f6abcf7e187b7194a5a041a990a Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 19:35:49 -0400 Subject: [PATCH 24/27] Build artifacts for 3c39a99b9a4c Auto-generated by build.ps1 -CommitArtifacts. Build 2026.06.04.2335. Module DLL and manifest embed BuildCommitHash=3c39a99b9a4c, matching the source commit they were produced from. --- CHANGELOG.md | 6 + Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 4 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 340480 -> 371712 bytes .../bin/en-US/PSInfisicalAPI.dll-Help.xml | 113 ++++++++++++++++-- 4 files changed, 113 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e45fce7..60c7c35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.04.2335 + +- Build produced from commit 3c39a99b9a4c. + +## Unreleased (carried forward) + ## 2026.06.04.2305 - Build produced from commit 485ee8a7dd6a. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 107de99..0f9f952 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.2305' + ModuleVersion = '2026.06.04.2335' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -63,7 +63,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '485ee8a7dd6a' + CommitHash = '3c39a99b9a4c' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index b6e72de8a16bac2b8988d64d93e9cab8c8b638b7..babeb120fc24376439c50159cd7ef13b0ce8da17 100644 GIT binary patch literal 371712 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%0A?9L2mrPLga9zx076Ka!TXE4QOe8; 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 literal 340480 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 diff --git a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml index ffdcffb..c39f22b 100644 --- a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml @@ -1477,33 +1477,130 @@ $UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @Uninstall + + + Get-InfisicalCertificateApplication + Lists or retrieves an Infisical Certificate Manager Application from the active project. + Get + InfisicalCertificateApplication + + + Reads Infisical certificate-manager Applications (the join target used by EST/ACME/SCEP profile attachments) using the active connection's project scope. The List parameter set returns all applications visible to the caller; the ById and ByName sets return a single application. ProjectId falls back to the active connection when omitted. + + + + EXAMPLE 1 + Get-InfisicalCertificateApplication + Lists certificate-manager applications for the active project. + + + EXAMPLE 2 + Get-InfisicalCertificateApplication -ApplicationName 'workstation-mdm' + Retrieves a single application by name. + + + EXAMPLE 3 + $GetInfisicalCertificateApplicationParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateApplicationParameters.Id = $ApplicationId +$GetInfisicalCertificateApplicationParameters.ProjectId = $ProjectId +$GetInfisicalCertificateApplicationParameters.Verbose = $True + +$GetInfisicalCertificateApplicationResult = Get-InfisicalCertificateApplication @GetInfisicalCertificateApplicationParameters + Retrieves a single application by id from an explicit project. + + + + + + + Get-InfisicalCertificateApplicationEnrollment + Retrieves the API/EST/ACME/SCEP enrollment configuration attached to an application/profile pair. + Get + InfisicalCertificateApplicationEnrollment + + + Returns the InfisicalCertificateApplicationEnrollment for the given application and certificate profile, including any configured SCEP sub-block (server URL, RA certificate PEM, computed SHA-1 RaCertificateThumbprint, challenge type, and challenge endpoint URL when dynamic). + + + + EXAMPLE 1 + Get-InfisicalCertificateApplicationEnrollment -ApplicationId $AppId -ProfileId $ProfileId + Fetches the enrollment configuration for an application/profile pair. + + + EXAMPLE 2 + $GetInfisicalCertificateApplicationEnrollmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$GetInfisicalCertificateApplicationEnrollmentParameters.ApplicationId = $ApplicationId +$GetInfisicalCertificateApplicationEnrollmentParameters.ProfileId = $ProfileId +$GetInfisicalCertificateApplicationEnrollmentParameters.Verbose = $True + +$GetInfisicalCertificateApplicationEnrollmentResult = Get-InfisicalCertificateApplicationEnrollment @GetInfisicalCertificateApplicationEnrollmentParameters + Retrieves the enrollment configuration and feeds it downstream to Get-InfisicalScepMdmProfile. + + + + + + + New-InfisicalScepDynamicChallenge + Generates a one-time SCEP challenge from an application/profile that is configured with dynamic challenge mode. + New + InfisicalScepDynamicChallenge + + + POSTs to /scep/applications/{applicationId}/profiles/{profileId}/challenge and returns the minted challenge as a SecureString. Use -AsPlainText to return a string instead. Requires the active machine identity to have read access on certificate-application-enrollment, and the target SCEP profile must be set to challengeType=dynamic. Dynamic challenges are an Enterprise-tier feature on managed Infisical deployments. + + + + EXAMPLE 1 + $Challenge = New-InfisicalScepDynamicChallenge -ApplicationId $AppId -ProfileId $ProfileId + Mints a single-use SCEP challenge and stores it as a SecureString. + + + EXAMPLE 2 + $NewInfisicalScepDynamicChallengeParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) +$NewInfisicalScepDynamicChallengeParameters.ApplicationId = $ApplicationId +$NewInfisicalScepDynamicChallengeParameters.ProfileId = $ProfileId +$NewInfisicalScepDynamicChallengeParameters.AsPlainText = $True +$NewInfisicalScepDynamicChallengeParameters.Verbose = $True + +$NewInfisicalScepDynamicChallengeResult = New-InfisicalScepDynamicChallenge @NewInfisicalScepDynamicChallengeParameters + Mints a plain-text challenge for use in environments where SecureString is inconvenient. + + + + Get-InfisicalScepMdmProfile - Builds an Infisical SCEP MDM profile model from a certificate profile, suitable for SyncML export or local MDM enrollment. + Builds an Infisical SCEP MDM profile model from an application enrollment, certificate profile, or fully manual inputs. Get InfisicalScepMdmProfile - Projects an InfisicalCertificateProfile (pipeline-bound) into an InfisicalScepMdmProfile that mirrors the Windows ClientCertificateInstall/SCEP CSP node set. -Challenge is accepted as a SecureString and decrypted into the model only at write-time. -ServerUrl defaults to {baseUri}/scep/{profileId}/pkiclient.exe derived from the active connection. -UniqueId defaults to a sanitized form of the source profile slug. KeyAlgorithm and EkuMapping are inherited from the source profile defaults unless overridden. + Produces an InfisicalScepMdmProfile that mirrors the Windows ClientCertificateInstall/SCEP CSP node set. FromEnrollment (default) consumes an InfisicalCertificateApplicationEnrollment and auto-fills ServerUrl from scep.scepEndpointUrl and CAThumbprint from the RA certificate; if the enrollment is configured for dynamic challenge mode, a fresh challenge is minted automatically when -Challenge is not supplied. FromProfile keeps the legacy projection from an InfisicalCertificateProfile and now requires -ApplicationId so the server URL can be built against /scep/applications/{appId}/profiles/{profileId}/pkiclient.exe. Manual requires explicit -ServerUrl, -Challenge, and -UniqueId. Notes - The SCEP endpoint URL ends in 'pkiclient.exe' for RFC 8894 / Cisco SCEP client compatibility. The source profile must have SCEP enrollment enabled on the server side for enrollment to succeed; this cmdlet does not validate that. + The SCEP endpoint URL ends in 'pkiclient.exe' for RFC 8894 / Cisco SCEP client compatibility. SecureString -Challenge is decrypted into the model only at write-time. EXAMPLE 1 - Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId | Get-InfisicalScepMdmProfile -Challenge (Read-Host -AsSecureString 'SCEP challenge') - Builds a default SCEP MDM profile with the server URL inferred from the active connection. + Get-InfisicalCertificateApplicationEnrollment -ApplicationId $AppId -ProfileId $ProfileId | Get-InfisicalScepMdmProfile + Builds a SCEP MDM profile from an enrollment, auto-resolving ServerUrl, CAThumbprint, and (for dynamic mode) the challenge. EXAMPLE 2 + Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId | Get-InfisicalScepMdmProfile -ApplicationId $AppId -Challenge (Read-Host -AsSecureString 'SCEP challenge') + Builds a profile from a certificate profile (legacy path) with an explicit application id and static challenge. + + + EXAMPLE 3 $GetInfisicalScepMdmProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalScepMdmProfileParameters.InputObject = (Get-InfisicalCertificateProfile -CertificateProfileId $ProfileId) -$GetInfisicalScepMdmProfileParameters.Challenge = (Read-Host -AsSecureString 'SCEP challenge') +$GetInfisicalScepMdmProfileParameters.EnrollmentObject = $Enrollment $GetInfisicalScepMdmProfileParameters.UniqueId = 'WindowsClientAuth' $GetInfisicalScepMdmProfileParameters.Scope = 'Device' $GetInfisicalScepMdmProfileParameters.SubjectName = "CN=$($env:COMPUTERNAME)" @@ -1514,7 +1611,7 @@ $GetInfisicalScepMdmProfileParameters.ValidPeriodUnits = 1 $GetInfisicalScepMdmProfileParameters.Verbose = $True $GetInfisicalScepMdmProfileResult = Get-InfisicalScepMdmProfile @GetInfisicalScepMdmProfileParameters - Builds a device-scope SCEP MDM profile with explicit subject and key parameters for downstream export or local enrollment. + Builds a device-scope SCEP MDM profile from an enrollment with overridden subject and key parameters. From 7ae5d4a59de402c772afe1aab0d197efa336843c Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 20:20:54 -0400 Subject: [PATCH 25/27] fix(cmdlets): remove self-aliases that broke parameter binding on three new cmdlets Get-InfisicalCertificateApplication declared [Alias("Id", "ApplicationId")] on its Id parameter and Get-InfisicalCertificateApplicationEnrollment / New-InfisicalScepDynamicChallenge declared [Alias("Id", "ApplicationId")] on their ApplicationId parameter. PowerShell rejects an [Alias] entry whose value matches the parameter's own name with ParameterNameConflictsWithAlias at registration time, leaving the cmdlets unusable. Removed the self-referential alias from each. --- CHANGELOG.md | 12 ++++++++++-- .../GetInfisicalCertificateApplicationCmdlet.cs | 4 ++-- ...nfisicalCertificateApplicationEnrollmentCmdlet.cs | 2 +- .../NewInfisicalScepDynamicChallengeCmdlet.cs | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60c7c35..83d2519 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,17 +6,25 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.05.0015 + +- Build produced from commit fb27ab8a8503. + +## Unreleased (carried forward) + +- Fixed `ParameterNameConflictsWithAlias` registration error on `Get-InfisicalCertificateApplication`, `Get-InfisicalCertificateApplicationEnrollment`, and `New-InfisicalScepDynamicChallenge`. The cmdlets each declared an `[Alias]` entry that matched the parameter's own name, which PowerShell rejects at bind time and made the cmdlets unusable. + ## 2026.06.04.2335 - Build produced from commit 3c39a99b9a4c. -## Unreleased (carried forward) +## Unreleased (carried forward) ## 2026.06.04.2305 - Build produced from commit 485ee8a7dd6a. -## Unreleased (carried forward) +## Unreleased (carried forward) - `Get-InfisicalCertificateApplication` added with `List` (default), `ById`, and `ByName` parameter sets. Binds to `/api/v1/cert-manager/applications` (list) and `/api/v1/cert-manager/applications/{applicationId}` / `/by-name/{name}` for single retrieval. Requests carry the `x-infisical-project-id` header so the certificate-manager scope resolves correctly. New `InfisicalCertificateApplication` model surfaces id, project, name, description, and counts. - `Get-InfisicalCertificateApplicationEnrollment` added. Returns the API/EST/ACME/SCEP enrollment configuration for an application/profile pair (`GET /api/v1/cert-manager/applications/{applicationId}/profiles/{profileId}/enrollment`). The new `InfisicalCertificateApplicationEnrollment` model includes sub-blocks for each enrollment protocol; the SCEP block computes a SHA-1 `RaCertificateThumbprint` from the RA certificate PEM so it can be fed directly into MDM payloads. diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs index 9636eb7..11bfb2e 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs @@ -11,11 +11,11 @@ namespace PSInfisicalAPI.Cmdlets public sealed class GetInfisicalCertificateApplicationCmdlet : InfisicalCmdletBase { [Parameter(ParameterSetName = "ById", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] - [Alias("Id", "ApplicationId")] + [Alias("ApplicationId")] public string Id { get; set; } [Parameter(ParameterSetName = "ByName", Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] - [Alias("Name", "ApplicationName")] + [Alias("Name")] public string ApplicationName { get; set; } [Parameter] public string ProjectId { get; set; } diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs index 378ce6b..426e1a2 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs @@ -11,7 +11,7 @@ namespace PSInfisicalAPI.Cmdlets public sealed class GetInfisicalCertificateApplicationEnrollmentCmdlet : InfisicalCmdletBase { [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] - [Alias("Id", "ApplicationId")] + [Alias("Id")] public string ApplicationId { get; set; } [Parameter(Mandatory = true, Position = 1, ValueFromPipelineByPropertyName = true)] diff --git a/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs index 8534252..abaee4e 100644 --- a/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/NewInfisicalScepDynamicChallengeCmdlet.cs @@ -12,7 +12,7 @@ namespace PSInfisicalAPI.Cmdlets public sealed class NewInfisicalScepDynamicChallengeCmdlet : InfisicalCmdletBase { [Parameter(Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true)] - [Alias("Id", "ApplicationId")] + [Alias("Id")] public string ApplicationId { get; set; } [Parameter(Mandatory = true, Position = 1, ValueFromPipelineByPropertyName = true)] From cffda99591c918dc091d1e739d40ebe899747d24 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 21:16:52 -0400 Subject: [PATCH 26/27] refactor!(scoping): mandate explicit -ProjectId/-Environment; add -Type/-IncludeRoles to Get-InfisicalProject BREAKING CHANGES - Connect-Infisical no longer accepts -ProjectId, -Environment, or -SecretPath. - InfisicalConnection no longer carries ProjectId, Environment, or DefaultSecretPath. - Every cmdlet that previously inherited those fields now requires -ProjectId and/or -Environment as Mandatory=true. -SecretPath / -Path remain optional and default to "/" at the client layer. - INFISICAL_PROJECT_ID, INFISICAL_ENVIRONMENT, INFISICAL_SECRET_PATH env-var scanning removed from Connect-Infisical. - Resolve{ProjectId,Environment,SecretPath} helpers removed from InfisicalCmdletBase. ResolveOrganizationId retained. ADDED - Get-InfisicalProject -Type filters the list by product surface (secret-manager, cert-manager, kms, ssh, secret-scanning, pam, ai) with IntelliSense via ValidateSet. - Get-InfisicalProject -IncludeRoles switch maps to includeRoles=true/false query parameter (always sent). RATIONALE - Implicit connection scoping caused 400 Bad Request when the active connection's ProjectId belonged to a different product surface than the cmdlet's target (e.g. secret-manager project id passed to /cert-manager/*). - Explicit parameters make scope unambiguous and make scripts portable across projects. - The new -Type filter on Get-InfisicalProject lets callers discover the correct project id for each subsequent CRUD invocation without needing connection-level inheritance. INTERNAL - All client classes (Secrets / Folders / Environments / Tags / Projects / Pki) now receive scoping as explicit arguments rather than reading the InfisicalConnection object. - Client-layer SecretPath / Path defaulting to "/" is preserved via FirstNonEmpty(...). - Help XML updated to remove all "session-pinned" / "active connection" phrasing; OrderedDictionary splatting examples now include the mandatory parameters. - 216/216 unit tests passing. --- .../en-US/PSInfisicalAPI.dll-Help.xml | 228 +++++++++--------- .../CmdletBaseInheritanceTests.cs | 81 +------ .../InfisicalEnvironmentPatternTests.cs | 32 --- .../InfisicalEnvironmentResolver.cs | 18 -- .../Cmdlets/ConnectInfisicalCmdlet.cs | 27 --- .../Cmdlets/CopyInfisicalSecretCmdlet.cs | 13 +- ...etInfisicalCertificateApplicationCmdlet.cs | 9 +- ...lCertificateApplicationEnrollmentCmdlet.cs | 5 +- .../GetInfisicalCertificateAuthorityCmdlet.cs | 2 +- .../Cmdlets/GetInfisicalCertificateCmdlet.cs | 6 +- .../GetInfisicalCertificatePolicyCmdlet.cs | 7 +- .../GetInfisicalCertificateProfileCmdlet.cs | 7 +- .../Cmdlets/GetInfisicalEnvironmentCmdlet.cs | 7 +- .../Cmdlets/GetInfisicalFolderCmdlet.cs | 11 +- .../GetInfisicalPkiSubscriberCmdlet.cs | 7 +- .../Cmdlets/GetInfisicalProjectCmdlet.cs | 11 +- .../Cmdlets/GetInfisicalSecretCmdlet.cs | 16 +- .../Cmdlets/GetInfisicalTagCmdlet.cs | 7 +- .../Cmdlets/InfisicalCmdletBase.cs | 15 -- .../Cmdlets/NewInfisicalEnvironmentCmdlet.cs | 5 +- .../Cmdlets/NewInfisicalFolderCmdlet.cs | 9 +- .../Cmdlets/NewInfisicalSecretCmdlet.cs | 19 +- .../Cmdlets/NewInfisicalTagCmdlet.cs | 5 +- .../RemoveInfisicalEnvironmentCmdlet.cs | 5 +- .../Cmdlets/RemoveInfisicalFolderCmdlet.cs | 9 +- .../Cmdlets/RemoveInfisicalProjectCmdlet.cs | 9 +- .../Cmdlets/RemoveInfisicalSecretCmdlet.cs | 19 +- .../Cmdlets/RemoveInfisicalTagCmdlet.cs | 5 +- .../RequestInfisicalCertificateCmdlet.cs | 7 +- .../SearchInfisicalCertificateCmdlet.cs | 5 +- .../UpdateInfisicalEnvironmentCmdlet.cs | 5 +- .../Cmdlets/UpdateInfisicalFolderCmdlet.cs | 9 +- .../Cmdlets/UpdateInfisicalProjectCmdlet.cs | 7 +- .../Cmdlets/UpdateInfisicalSecretCmdlet.cs | 19 +- .../Cmdlets/UpdateInfisicalTagCmdlet.cs | 5 +- .../Connections/InfisicalConnection.cs | 7 +- .../InfisicalEnvironmentClient.cs | 37 +-- .../Folders/InfisicalFolderClient.cs | 54 ++--- src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs | 86 +++---- .../Projects/InfisicalProjectClient.cs | 14 +- .../Secrets/InfisicalSecretsClient.cs | 110 ++++----- src/PSInfisicalAPI/Tags/InfisicalTagClient.cs | 37 +-- 42 files changed, 379 insertions(+), 617 deletions(-) diff --git a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml index c39f22b..5d82499 100644 --- a/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/en-US/PSInfisicalAPI.dll-Help.xml @@ -9,7 +9,7 @@ Infisical - Authenticates against an Infisical instance using one of the supported auth providers (UniversalAuth, Token, JWT, OIDC, LDAP, Azure, GCP IAM) and stores the resulting connection in the module-level session manager. Subsequent cmdlets pick up the connection automatically. If parameters such as BaseUri, OrganizationId, ProjectId, Environment, ClientId, or ClientSecret are not supplied, the cmdlet attempts to resolve them from a curated list of environment-variable name patterns across Process, User, and Machine scopes. + Authenticates against an Infisical instance using one of the supported auth providers (UniversalAuth, Token, JWT, OIDC, LDAP, Azure, GCP IAM) and stores the resulting connection in the module-level session manager. Subsequent cmdlets pick up the connection automatically. If parameters such as BaseUri, OrganizationId, ClientId, or ClientSecret are not supplied, the cmdlet attempts to resolve them from a curated list of environment-variable name patterns across Process, User, and Machine scopes. The connection no longer carries a default ProjectId, Environment, or SecretPath; downstream cmdlets accept those as explicit (mandatory where applicable) parameters. Notes @@ -21,7 +21,7 @@ EXAMPLE 1 - Connect-Infisical -BaseUri 'https://app.infisical.com' -ClientId $ClientId -ClientSecret $ClientSecret -OrganizationId $OrgId -ProjectId $ProjectId -Environment 'dev' + Connect-Infisical -BaseUri 'https://app.infisical.com' -ClientId $ClientId -ClientSecret $ClientSecret -OrganizationId $OrgId Performs a Universal-Auth machine-identity login and stores the resulting session for subsequent cmdlets. @@ -29,11 +29,8 @@ $ConnectInfisicalParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $ConnectInfisicalParameters.BaseUri = 'https://app.infisical.com' $ConnectInfisicalParameters.OrganizationId = $OrganizationId -$ConnectInfisicalParameters.ProjectId = $ProjectId -$ConnectInfisicalParameters.Environment = 'dev' $ConnectInfisicalParameters.ClientId = $ClientId $ConnectInfisicalParameters.ClientSecret = $ClientSecret -$ConnectInfisicalParameters.SecretPath = '/' $ConnectInfisicalParameters.ApiVersion = 'v4' $ConnectInfisicalParameters.PassThru = $True $ConnectInfisicalParameters.Verbose = $True @@ -86,7 +83,7 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters InfisicalSecret - Default (List parameter set) enumerates secrets under the active session's project and environment, optionally recursing through subfolders and filtering by metadata or tag slugs. When -SecretName is supplied (Single parameter set) the cmdlet returns one secret by name; -Version and -Type tune the single-record fetch. ProjectId, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection in both modes. + Default (List parameter set) enumerates secrets under the supplied project and environment, optionally recursing through subfolders and filtering by metadata or tag slugs. When -SecretName is supplied (Single parameter set) the cmdlet returns one secret by name; -Version and -Type tune the single-record fetch. -ProjectId and -Environment are mandatory in both modes; -SecretPath defaults to '/' and -ApiVersion defaults to the value pinned on the active InfisicalConnection. Notes @@ -97,8 +94,8 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters EXAMPLE 1 - Get-InfisicalSecret -SecretPath '/Windows' -Recursive - Lists every secret under /Windows in the active project and environment. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath '/Windows' -Recursive + Lists every secret under /Windows in the dev environment of the specified project. EXAMPLE 2 @@ -108,8 +105,8 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters EXAMPLE 3 $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretParameters.ProjectId = $ProjectId +$GetInfisicalSecretParameters.Environment = 'dev' $GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $GetInfisicalSecretParameters.Recursive = $True $GetInfisicalSecretParameters.ExpandSecretReferences = $True @@ -142,19 +139,19 @@ $GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters EXAMPLE 1 - New-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'super-secret-value' - Creates a single shared secret in the active project/environment. + New-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'super-secret-value' -ProjectId $ProjectId -Environment 'dev' + Creates a single shared secret in the specified project/environment. EXAMPLE 2 - $GetInfisicalTagResult = Get-InfisicalTag -ProjectId $ConnectInfisicalParameters.ProjectId + $GetInfisicalTagResult = Get-InfisicalTag -ProjectId $ProjectId $NewInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $NewInfisicalSecretParameters.SecretName = 'API_KEY' $NewInfisicalSecretParameters.SecretValue = 'super-secret-value' $NewInfisicalSecretParameters.SecretComment = 'Issued by deployment pipeline' -$NewInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$NewInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalSecretParameters.ProjectId = $ProjectId +$NewInfisicalSecretParameters.Environment = 'dev' $NewInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagResult[0].Id) $NewInfisicalSecretParameters.Verbose = $True @@ -184,8 +181,8 @@ $NewInfisicalSecretResult = New-InfisicalSecret @NewInfisicalSecretParameters EXAMPLE 1 - Update-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'rotated-value' - Rotates the API_KEY secret in the active project/environment. + Update-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'rotated-value' -ProjectId $ProjectId -Environment 'dev' + Rotates the API_KEY secret in the specified project/environment. EXAMPLE 2 @@ -194,8 +191,8 @@ $UpdateInfisicalSecretParameters.SecretName = 'API_KEY' $UpdateInfisicalSecretParameters.NewSecretName = 'API_KEY_V2' $UpdateInfisicalSecretParameters.SecretValue = 'rotated-value' $UpdateInfisicalSecretParameters.SecretComment = 'Rotated by scheduled job' -$UpdateInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$UpdateInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$UpdateInfisicalSecretParameters.ProjectId = $ProjectId +$UpdateInfisicalSecretParameters.Environment = 'dev' $UpdateInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $UpdateInfisicalSecretParameters.Verbose = $True @@ -224,15 +221,15 @@ $UpdateInfisicalSecretResult = Update-InfisicalSecret @UpdateInfisicalSecretPara EXAMPLE 1 - Remove-InfisicalSecret -SecretName 'API_KEY_V1' -Confirm:$False + Remove-InfisicalSecret -SecretName 'API_KEY_V1' -ProjectId $ProjectId -Environment 'dev' -Confirm:$False Deletes a single secret without prompting. EXAMPLE 2 $RemoveInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RemoveInfisicalSecretParameters.SecretNames = @('LEGACY_KEY_1','LEGACY_KEY_2','LEGACY_KEY_3') -$RemoveInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$RemoveInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalSecretParameters.ProjectId = $ProjectId +$RemoveInfisicalSecretParameters.Environment = 'dev' $RemoveInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $RemoveInfisicalSecretParameters.PassThru = $True $RemoveInfisicalSecretParameters.Confirm = $False @@ -263,17 +260,17 @@ $RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretPara EXAMPLE 1 - Get-InfisicalSecret | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue - Copies all secrets from the active environment into 'staging', including their values. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -ProjectId $ProjectId -SourceEnvironment 'dev' -DestinationEnvironment 'staging' -CopySecretValue + Copies all secrets from dev into staging, including their values. EXAMPLE 2 - $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath '/Windows' -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath '/Windows' -Recursive $CopyInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretResult.Id -$CopyInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$CopyInfisicalSecretParameters.SourceEnvironment = $ConnectInfisicalParameters.Environment +$CopyInfisicalSecretParameters.ProjectId = $ProjectId +$CopyInfisicalSecretParameters.SourceEnvironment = 'dev' $CopyInfisicalSecretParameters.SourceSecretPath = '/Windows' $CopyInfisicalSecretParameters.DestinationEnvironment = 'staging' $CopyInfisicalSecretParameters.DestinationSecretPath = '/Windows' @@ -285,7 +282,7 @@ $CopyInfisicalSecretParameters.CopyMetadata = $True $CopyInfisicalSecretParameters.Verbose = $True $CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters - Promotes every Windows secret from the active environment into staging with full value/comment/tag/metadata propagation. + Promotes every Windows secret from dev into staging with full value/comment/tag/metadata propagation. @@ -309,12 +306,12 @@ $CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters EXAMPLE 1 - Get-InfisicalSecret | ConvertTo-InfisicalSecretDictionary -AsPlainText - Builds a plain-text dictionary of every secret in the active environment. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' | ConvertTo-InfisicalSecretDictionary -AsPlainText + Builds a plain-text dictionary of every secret in the dev environment of the specified project. EXAMPLE 2 - $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ConvertToInfisicalSecretDictionaryParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretResult @@ -347,12 +344,12 @@ $ConvertToInfisicalSecretDictionaryResult = ConvertTo-InfisicalSecretDictionary EXAMPLE 1 - Get-InfisicalSecret | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force - Writes the active environment's secrets to a .env file. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force + Writes the dev environment's secrets for the specified project to a .env file. EXAMPLE 2 - $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ExportInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretResult @@ -375,7 +372,7 @@ $ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsP InfisicalProject - Default (List parameter set) returns every project the active session can see; project visibility is governed by Infisical's role assignments. When -ProjectId is supplied (Single parameter set) the cmdlet returns the one matching record. + Default (List parameter set) returns every project the active session can see; project visibility is governed by Infisical's role assignments. -Type filters the list to a single product surface (secret-manager, cert-manager, kms, ssh, secret-scanning, pam, ai). -IncludeRoles asks the server to return the caller's role bindings on each project. When -ProjectId is supplied (Single parameter set) the cmdlet returns the one matching record. Notes @@ -391,19 +388,24 @@ $ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsP EXAMPLE 2 - Get-InfisicalProject -ProjectId $ConnectInfisicalParameters.ProjectId - Retrieves the canonical record for the project pinned by the active session. + Get-InfisicalProject -ProjectId $ProjectId + Retrieves the canonical record for a single project by id. EXAMPLE 3 - $GetInfisicalProjectListResult = Get-InfisicalProject | Where-Object { $_.Slug -ilike 'platform-*' } + Get-InfisicalProject -Type 'cert-manager' -IncludeRoles + Lists every Certificate Manager project visible to the session, including the caller's role bindings. + + + EXAMPLE 4 + $GetInfisicalProjectListResult = Get-InfisicalProject -Type 'secret-manager' | Where-Object { $_.Slug -ilike 'platform-*' } $GetInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectListResult[0].Id $GetInfisicalProjectParameters.Verbose = $True $GetInfisicalProjectResult = Get-InfisicalProject @GetInfisicalProjectParameters - Filters the project list to slugs that begin with 'platform-' and refetches the first match by id. + Filters Secret Manager projects to slugs that begin with 'platform-' and refetches the first match by id. @@ -454,7 +456,7 @@ $NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters InfisicalProject - Updates mutable attributes on a project. -ProjectId defaults to the pinned session project when omitted. Only parameters that are bound are sent to the server. Honors -WhatIf and -Confirm. + Updates mutable attributes on a project. -ProjectId is required. Only parameters that are bound are sent to the server. Honors -WhatIf and -Confirm. Notes @@ -466,7 +468,7 @@ $NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters EXAMPLE 1 Update-InfisicalProject -Name 'Platform Telemetry (v2)' - Renames the session-pinned project. + Renames the supplied project. EXAMPLE 2 @@ -493,7 +495,7 @@ $UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectP InfisicalProject - Deletes a project by Id. Defaults to the session-pinned project when -ProjectId is omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed project id. + Deletes a project by Id. -ProjectId is required. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed project id. Notes @@ -505,7 +507,7 @@ $UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectP EXAMPLE 1 Remove-InfisicalProject -Confirm:$False - Deletes the session-pinned project without prompting. + Deletes the supplied project without prompting. EXAMPLE 2 @@ -531,7 +533,7 @@ $RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectP InfisicalEnvironment - Default (List parameter set) returns every environment configured on the session-pinned project. When -EnvironmentSlugOrId is supplied (Single parameter set) the cmdlet returns one environment by slug or id. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every environment configured on the supplied project. When -EnvironmentSlugOrId is supplied (Single parameter set) the cmdlet returns one environment by slug or id. -ProjectId is required in both modes. Notes @@ -543,12 +545,12 @@ $RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectP EXAMPLE 1 Get-InfisicalEnvironment - Lists every environment defined on the session-pinned project. + Lists every environment defined on the supplied project. EXAMPLE 2 Get-InfisicalEnvironment -EnvironmentSlugOrId 'dev' - Retrieves the 'dev' environment from the session-pinned project. + Retrieves the 'dev' environment from the supplied project. EXAMPLE 3 @@ -573,7 +575,7 @@ $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironme InfisicalEnvironment - Creates an environment with the supplied display name and slug, optionally setting its sort -Position. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + Creates an environment with the supplied display name and slug, optionally setting its sort -Position. -ProjectId is required. Honors -WhatIf and -Confirm. Notes @@ -585,7 +587,7 @@ $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironme EXAMPLE 1 New-InfisicalEnvironment -Name 'Staging' -Slug 'staging' - Adds a Staging environment to the session-pinned project. + Adds a Staging environment to the supplied project. EXAMPLE 2 @@ -612,7 +614,7 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme InfisicalEnvironment - Updates an environment identified by -EnvironmentId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + Updates an environment identified by -EnvironmentId. -ProjectId is required. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. Notes @@ -624,7 +626,7 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme EXAMPLE 1 Update-InfisicalEnvironment -EnvironmentId $EnvId -Name 'Pre-Production' - Renames an environment in the session-pinned project. + Renames an environment in the supplied project. EXAMPLE 2 @@ -632,7 +634,7 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme $UpdateInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id -$UpdateInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalEnvironmentParameters.ProjectId = $ProjectId $UpdateInfisicalEnvironmentParameters.Name = 'Pre-Production' $UpdateInfisicalEnvironmentParameters.Slug = 'preprod' $UpdateInfisicalEnvironmentParameters.Position = 25 @@ -652,7 +654,7 @@ $UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisical InfisicalEnvironment - Removes an environment by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed environment id. + Removes an environment by Id. -ProjectId is required. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed environment id. Notes @@ -672,7 +674,7 @@ $UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisical $RemoveInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id -$RemoveInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalEnvironmentParameters.ProjectId = $ProjectId $RemoveInfisicalEnvironmentParameters.PassThru = $True $RemoveInfisicalEnvironmentParameters.Confirm = $False $RemoveInfisicalEnvironmentParameters.Verbose = $True @@ -691,7 +693,7 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical InfisicalFolder - Default (List parameter set) enumerates folders directly under the supplied -Path within the active project and environment. When -FolderNameOrId is supplied (Single parameter set) the cmdlet returns one folder by name or id under -Path. -ProjectId, -Environment, and -Path default to the session-pinned values in both modes. + Default (List parameter set) enumerates folders directly under the supplied -Path within the project and environment. When -FolderNameOrId is supplied (Single parameter set) the cmdlet returns one folder by name or id under -Path. -ProjectId and -Environment are required in both modes; -Path defaults to '/'. Notes @@ -702,13 +704,13 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical EXAMPLE 1 - Get-InfisicalFolder -Path '/Windows' - Lists every folder directly under /Windows in the active project and environment. + Get-InfisicalFolder -ProjectId $ProjectId -Environment 'dev' -Path '/Windows' + Lists every folder directly under /Windows in the supplied project and environment. EXAMPLE 2 - Get-InfisicalFolder -FolderNameOrId 'Deployments' -Path '/Windows' - Retrieves the Deployments folder under /Windows in the active project and environment. + Get-InfisicalFolder -FolderNameOrId 'Deployments' -ProjectId $ProjectId -Environment 'dev' -Path '/Windows' + Retrieves the Deployments folder under /Windows in the supplied project and environment. EXAMPLE 3 @@ -716,8 +718,8 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical $GetInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFolderListResult.Id -$GetInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalFolderParameters.ProjectId = $ProjectId +$GetInfisicalFolderParameters.Environment = 'dev' $GetInfisicalFolderParameters.Path = '/Windows' $GetInfisicalFolderParameters.Verbose = $True @@ -735,7 +737,7 @@ $GetInfisicalFolderResult = Get-InfisicalFolder @GetInfisicalFolderParametersInfisicalFolder - Creates a folder with the supplied -Name beneath the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + Creates a folder with the supplied -Name beneath the supplied -Path. -ProjectId and -Environment are required; -Path defaults to '/'. Honors -WhatIf and -Confirm. Notes @@ -746,20 +748,20 @@ $GetInfisicalFolderResult = Get-InfisicalFolder @GetInfisicalFolderParameters EXAMPLE 1 - New-InfisicalFolder -Name 'Deployments' -Path '/Windows' - Creates the Deployments folder under /Windows in the active project and environment. + New-InfisicalFolder -Name 'Deployments' -ProjectId $ProjectId -Environment 'dev' -Path '/Windows' + Creates the Deployments folder under /Windows in the supplied project and environment. EXAMPLE 2 $NewInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $NewInfisicalFolderParameters.Name = $CallingScriptPath.BaseName -$NewInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$NewInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalFolderParameters.ProjectId = $ProjectId +$NewInfisicalFolderParameters.Environment = 'dev' $NewInfisicalFolderParameters.Path = '/Windows' $NewInfisicalFolderParameters.Verbose = $True $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters - Creates a script-named folder under /Windows using the session-pinned project and environment. + Creates a script-named folder under /Windows in the supplied project and environment. @@ -772,7 +774,7 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParametersInfisicalFolder - Renames a folder identified by -FolderId to the supplied -Name. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + Renames a folder identified by -FolderId to the supplied -Name. -ProjectId and -Environment are required; -Path defaults to '/'. Honors -WhatIf and -Confirm. Notes @@ -784,7 +786,7 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters EXAMPLE 1 Update-InfisicalFolder -FolderId $FolderId -Name 'Deployments-Archive' - Renames a folder in the session-pinned project/environment. + Renames a folder in the supplied project/environment. EXAMPLE 2 @@ -793,8 +795,8 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParametersInfisicalFolder - Removes a folder by Id from the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed folder id. + Removes a folder by Id from the supplied -Path. -ProjectId and -Environment are required; -Path defaults to '/'. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed folder id. Notes @@ -824,7 +826,7 @@ $UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderPara EXAMPLE 1 Remove-InfisicalFolder -FolderId $FolderId -Confirm:$False - Deletes a folder from the session-pinned project/environment without prompting. + Deletes a folder from the supplied project/environment without prompting. EXAMPLE 2 @@ -832,8 +834,8 @@ $UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderPara $RemoveInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFolderResult.Id -$RemoveInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$RemoveInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalFolderParameters.ProjectId = $ProjectId +$RemoveInfisicalFolderParameters.Environment = 'dev' $RemoveInfisicalFolderParameters.Path = '/Windows' $RemoveInfisicalFolderParameters.PassThru = $True $RemoveInfisicalFolderParameters.Confirm = $False @@ -853,7 +855,7 @@ $RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderPara InfisicalTag - Default (List parameter set) returns every tag configured on the project. When -TagSlugOrId is supplied (Single parameter set) the cmdlet returns the one matching record. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every tag configured on the project. When -TagSlugOrId is supplied (Single parameter set) the cmdlet returns the one matching record. -ProjectId is required in both modes. Notes @@ -865,12 +867,12 @@ $RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderPara EXAMPLE 1 Get-InfisicalTag - Lists every tag defined on the session-pinned project. + Lists every tag defined on the supplied project. EXAMPLE 2 Get-InfisicalTag -TagSlugOrId 'critical' - Retrieves the 'critical' tag from the session-pinned project. + Retrieves the 'critical' tag from the supplied project. EXAMPLE 3 @@ -895,7 +897,7 @@ $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters InfisicalTag - Creates a tag with the supplied -Slug, optional -Name and -Color. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + Creates a tag with the supplied -Slug, optional -Name and -Color. -ProjectId is required. Honors -WhatIf and -Confirm. Notes @@ -907,7 +909,7 @@ $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters EXAMPLE 1 New-InfisicalTag -Slug 'critical' -Name 'Critical' -Color '#FF0000' - Creates a red Critical tag in the session-pinned project. + Creates a red Critical tag in the supplied project. EXAMPLE 2 @@ -915,7 +917,7 @@ $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters $NewInfisicalTagParameters.Slug = 'critical' $NewInfisicalTagParameters.Name = 'Critical' $NewInfisicalTagParameters.Color = '#FF0000' -$NewInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalTagParameters.ProjectId = $ProjectId $NewInfisicalTagParameters.Verbose = $True $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters @@ -932,7 +934,7 @@ $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters InfisicalTag - Updates a tag identified by -TagId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + Updates a tag identified by -TagId. -ProjectId is required. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. Notes @@ -944,7 +946,7 @@ $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters EXAMPLE 1 Update-InfisicalTag -TagId $TagId -Color '#FFA500' - Changes the display color of a tag in the session-pinned project. + Changes the display color of a tag in the supplied project. EXAMPLE 2 @@ -955,7 +957,7 @@ $UpdateInfisicalTagParameters.TagId = $GetInfisicalTagResult.Id $UpdateInfisicalTagParameters.Slug = 'critical-v2' $UpdateInfisicalTagParameters.Name = 'Critical (v2)' $UpdateInfisicalTagParameters.Color = '#FFA500' -$UpdateInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalTagParameters.ProjectId = $ProjectId $UpdateInfisicalTagParameters.Verbose = $True $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters @@ -972,7 +974,7 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParametersInfisicalTag - Removes a tag by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed tag id. + Removes a tag by Id. -ProjectId is required. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed tag id. Notes @@ -984,7 +986,7 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters EXAMPLE 1 Remove-InfisicalTag -TagId $TagId -Confirm:$False - Deletes a tag from the session-pinned project without prompting. + Deletes a tag from the supplied project without prompting. EXAMPLE 2 @@ -992,7 +994,7 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParametersInfisicalCertificateAuthority - When -CaId is supplied (ById parameter set) returns a single internal CA. Otherwise (List parameter set) returns CAs scoped by -Kind: Internal (default, /api/v1/cert-manager/ca/internal), Any (/api/v1/cert-manager/ca returning both internal and ACME), or Acme (filters the generic endpoint to ACME issuers only). -ProjectId defaults to the session-pinned project when omitted. + When -CaId is supplied (ById parameter set) returns a single internal CA. Otherwise (List parameter set) returns CAs scoped by -Kind: Internal (default, /api/v1/cert-manager/ca/internal), Any (/api/v1/cert-manager/ca returning both internal and ACME), or Acme (filters the generic endpoint to ACME issuers only). -ProjectId is required. Notes @@ -1023,12 +1025,12 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters EXAMPLE 1 Get-InfisicalCertificateAuthority - Lists every internal CA visible in the session-pinned project. + Lists every internal CA visible in the supplied project. EXAMPLE 2 Get-InfisicalCertificateAuthority -Kind Any - Lists every CA (internal and ACME) visible in the session-pinned project; inspect the Type property to distinguish them. + Lists every CA (internal and ACME) visible in the supplied project; inspect the Type property to distinguish them. EXAMPLE 3 @@ -1036,7 +1038,7 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters @@ -1053,7 +1055,7 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get InfisicalCertificate - Default (List parameter set) enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId; -Limit and -Offset drive a single page and pages are walked automatically until exhausted unless -NoAutoPage is supplied. When -SerialNumber is supplied (Single parameter set) the cmdlet returns one certificate record. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId; -Limit and -Offset drive a single page and pages are walked automatically until exhausted unless -NoAutoPage is supplied. When -SerialNumber is supplied (Single parameter set) the cmdlet returns one certificate record. -ProjectId is required in both modes. Notes @@ -1065,7 +1067,7 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get EXAMPLE 1 Get-InfisicalCertificate -Status 'active' - Lists every active certificate in the session-pinned project. + Lists every active certificate in the supplied project. EXAMPLE 2 @@ -1077,7 +1079,7 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } $GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateParameters.ProjectId = $ProjectId $GetInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME $GetInfisicalCertificateParameters.FriendlyName = 'web-tier' $GetInfisicalCertificateParameters.Status = 'active' @@ -1099,7 +1101,7 @@ $GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCerti InfisicalPkiSubscriber - Default (List parameter set) returns every PKI subscriber configured on the project. When -Name is supplied (ByName parameter set) the cmdlet returns one subscriber by its slug. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every PKI subscriber configured on the project. When -Name is supplied (ByName parameter set) the cmdlet returns one subscriber by its slug. -ProjectId is required in both modes. Notes @@ -1111,12 +1113,12 @@ $GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCerti EXAMPLE 1 Get-InfisicalPkiSubscriber - Lists every PKI subscriber defined on the session-pinned project. + Lists every PKI subscriber defined on the supplied project. EXAMPLE 2 Get-InfisicalPkiSubscriber -Name 'mecm' - Retrieves the 'mecm' PKI subscriber from the session-pinned project. + Retrieves the 'mecm' PKI subscriber from the supplied project. EXAMPLE 3 @@ -1124,7 +1126,7 @@ $GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCerti $GetInfisicalPkiSubscriberParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalPkiSubscriberParameters.Name = $GetInfisicalPkiSubscriberListResult[0].Name -$GetInfisicalPkiSubscriberParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalPkiSubscriberParameters.ProjectId = $ProjectId $GetInfisicalPkiSubscriberParameters.Verbose = $True $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSubscriberParameters @@ -1141,7 +1143,7 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu InfisicalCertificateProfile - Default (List parameter set) returns every certificate profile configured on the project via /api/v1/cert-manager/certificate-profiles, with optional -Limit, -Offset, and -IncludeConfigs. When -ProfileId is supplied (ById parameter set) the cmdlet returns one profile by its id. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every certificate profile configured on the project via /api/v1/cert-manager/certificate-profiles, with optional -Limit, -Offset, and -IncludeConfigs. When -ProfileId is supplied (ById parameter set) the cmdlet returns one profile by its id. -ProjectId is required in both modes. Notes @@ -1153,12 +1155,12 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu EXAMPLE 1 Get-InfisicalCertificateProfile - Lists every certificate profile defined on the session-pinned project. + Lists every certificate profile defined on the supplied project. EXAMPLE 2 Get-InfisicalCertificateProfile -ProfileId '8257641e-c808-454e-ac92-8dc920be865f' - Retrieves a single certificate profile by id from the session-pinned project. + Retrieves a single certificate profile by id from the supplied project. EXAMPLE 3 @@ -1166,7 +1168,7 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu $GetInfisicalCertificateProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalCertificateProfileParameters.ProfileId = $GetInfisicalCertificateProfileListResult[0].Id -$GetInfisicalCertificateProfileParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateProfileParameters.ProjectId = $ProjectId $GetInfisicalCertificateProfileParameters.Verbose = $True $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfisicalCertificateProfileParameters @@ -1183,7 +1185,7 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi InfisicalCertificatePolicy - Default (List parameter set) returns every certificate policy configured on the project via /api/v1/cert-manager/certificate-policies, with optional -Limit and -Offset. When -PolicyId is supplied (ById parameter set) the cmdlet returns one policy by its id. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every certificate policy configured on the project via /api/v1/cert-manager/certificate-policies, with optional -Limit and -Offset. When -PolicyId is supplied (ById parameter set) the cmdlet returns one policy by its id. -ProjectId is required in both modes. Notes @@ -1195,12 +1197,12 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi EXAMPLE 1 Get-InfisicalCertificatePolicy - Lists every certificate policy defined on the session-pinned project. + Lists every certificate policy defined on the supplied project. EXAMPLE 2 Get-InfisicalCertificatePolicy -PolicyId '3e69306a-e7c1-4fd2-a140-7fb300e53c43' - Retrieves a single certificate policy by id from the session-pinned project. + Retrieves a single certificate policy by id from the supplied project. EXAMPLE 3 @@ -1208,7 +1210,7 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi $GetInfisicalCertificatePolicyParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalCertificatePolicyParameters.PolicyId = $GetInfisicalCertificatePolicyListResult[0].Id -$GetInfisicalCertificatePolicyParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificatePolicyParameters.ProjectId = $ProjectId $GetInfisicalCertificatePolicyParameters.Verbose = $True $GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisicalCertificatePolicyParameters @@ -1225,7 +1227,7 @@ $GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisi InfisicalCertificate - Performs a server-side search across certificates with filters for friendly name, common name, free-text search, status, CA/profile/application/enrollment scope, key/signature algorithm, source, and validity window (-NotBeforeFrom/-NotBeforeTo/-NotAfterFrom/-NotAfterTo). Results are paged automatically unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + Performs a server-side search across certificates with filters for friendly name, common name, free-text search, status, CA/profile/application/enrollment scope, key/signature algorithm, source, and validity window (-NotBeforeFrom/-NotBeforeTo/-NotAfterFrom/-NotAfterTo). Results are paged automatically unless -NoAutoPage is supplied. -ProjectId is required. Notes @@ -1244,7 +1246,7 @@ $GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisi $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } $SearchInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$SearchInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$SearchInfisicalCertificateParameters.ProjectId = $ProjectId $SearchInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME $SearchInfisicalCertificateParameters.Status = 'active' $SearchInfisicalCertificateParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) @@ -1287,7 +1289,7 @@ $SearchInfisicalCertificateResult = Search-InfisicalCertificate @SearchInfisical EXAMPLE 2 $RequestInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RequestInfisicalCertificateParameters.PkiSubscriberSlug = 'web-tier' -$RequestInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RequestInfisicalCertificateParameters.ProjectId = $ProjectId $RequestInfisicalCertificateParameters.CommonName = ([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName $RequestInfisicalCertificateParameters.DnsName = @(([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName, $env:COMPUTERNAME) $RequestInfisicalCertificateParameters.KeyAlgorithm = 'Rsa' @@ -1480,22 +1482,22 @@ $UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @Uninstall Get-InfisicalCertificateApplication - Lists or retrieves an Infisical Certificate Manager Application from the active project. + Lists or retrieves an Infisical Certificate Manager Application from the supplied project. Get InfisicalCertificateApplication - Reads Infisical certificate-manager Applications (the join target used by EST/ACME/SCEP profile attachments) using the active connection's project scope. The List parameter set returns all applications visible to the caller; the ById and ByName sets return a single application. ProjectId falls back to the active connection when omitted. + Reads Infisical certificate-manager Applications (the join target used by EST/ACME/SCEP profile attachments) for the supplied project. The List parameter set returns all applications visible to the caller; the ById and ByName sets return a single application. -ProjectId is required. EXAMPLE 1 - Get-InfisicalCertificateApplication - Lists certificate-manager applications for the active project. + Get-InfisicalCertificateApplication -ProjectId $ProjectId + Lists certificate-manager applications for the supplied project. EXAMPLE 2 - Get-InfisicalCertificateApplication -ApplicationName 'workstation-mdm' + Get-InfisicalCertificateApplication -ApplicationName 'workstation-mdm' -ProjectId $ProjectId Retrieves a single application by name. diff --git a/src/PSInfisicalAPI.Tests/CmdletBaseInheritanceTests.cs b/src/PSInfisicalAPI.Tests/CmdletBaseInheritanceTests.cs index 6ae42cd..92840be 100644 --- a/src/PSInfisicalAPI.Tests/CmdletBaseInheritanceTests.cs +++ b/src/PSInfisicalAPI.Tests/CmdletBaseInheritanceTests.cs @@ -5,7 +5,6 @@ using System.Reflection; using PSInfisicalAPI.Cmdlets; using PSInfisicalAPI.Connections; using PSInfisicalAPI.Logging; -using PSInfisicalAPI.Models; using Xunit; namespace PSInfisicalAPI.Tests @@ -26,21 +25,6 @@ namespace PSInfisicalAPI.Tests [Cmdlet(VerbsCommon.Get, "TestCmdlet")] private sealed class TestCmdlet : InfisicalCmdletBase { - public string CallResolveProjectId(InfisicalConnection connection, string explicitValue) - { - return ResolveProjectId(connection, explicitValue); - } - - public string CallResolveEnvironment(InfisicalConnection connection, string explicitValue) - { - return ResolveEnvironment(connection, explicitValue); - } - - public string CallResolveSecretPath(InfisicalConnection connection, string explicitValue) - { - return ResolveSecretPath(connection, explicitValue); - } - public string CallResolveApiVersion(InfisicalConnection connection, string explicitValue) { return ResolveApiVersion(connection, explicitValue); @@ -65,60 +49,11 @@ namespace PSInfisicalAPI.Tests return new InfisicalConnection { BaseUri = new Uri("https://app.example.com"), - ProjectId = "proj-conn", - Environment = "prod-conn", - DefaultSecretPath = "/db", OrganizationId = "org-conn", PinnedApiVersion = "v3" }; } - [Fact] - public void Explicit_Value_Overrides_Connection_And_Does_Not_Log() - { - RecordingLogger logger = new RecordingLogger(); - TestCmdlet cmdlet = CreateCmdletWith(logger); - - string resolved = cmdlet.CallResolveProjectId(ConnectionWithDefaults(), "explicit-proj"); - Assert.Equal("explicit-proj", resolved); - Assert.Empty(logger.VerboseEntries); - } - - [Fact] - public void Missing_Value_Inherits_From_Connection_And_Logs() - { - RecordingLogger logger = new RecordingLogger(); - TestCmdlet cmdlet = CreateCmdletWith(logger); - - string resolved = cmdlet.CallResolveProjectId(ConnectionWithDefaults(), null); - Assert.Equal("proj-conn", resolved); - Assert.Single(logger.VerboseEntries); - Assert.Contains("Inherited ProjectId", logger.VerboseEntries[0]); - Assert.Contains("proj-conn", logger.VerboseEntries[0]); - } - - [Fact] - public void ResolveSecretPath_Defaults_To_Root_When_Connection_Has_No_Default() - { - RecordingLogger logger = new RecordingLogger(); - TestCmdlet cmdlet = CreateCmdletWith(logger); - - InfisicalConnection bareConnection = new InfisicalConnection { BaseUri = new Uri("https://app.example.com") }; - string resolved = cmdlet.CallResolveSecretPath(bareConnection, null); - Assert.Equal("/", resolved); - } - - [Fact] - public void ResolveSecretPath_Inherits_From_Connection_When_Set() - { - RecordingLogger logger = new RecordingLogger(); - TestCmdlet cmdlet = CreateCmdletWith(logger); - - string resolved = cmdlet.CallResolveSecretPath(ConnectionWithDefaults(), null); - Assert.Equal("/db", resolved); - Assert.Contains(logger.VerboseEntries, v => v.Contains("SecretPath") && v.Contains("/db")); - } - [Fact] public void ResolveApiVersion_Prefers_PinnedApiVersion_From_Connection() { @@ -130,14 +65,24 @@ namespace PSInfisicalAPI.Tests } [Fact] - public void ResolveEnvironment_And_ResolveOrganizationId_Inherit() + public void ResolveOrganizationId_Inherits_From_Connection_And_Logs() { RecordingLogger logger = new RecordingLogger(); TestCmdlet cmdlet = CreateCmdletWith(logger); - Assert.Equal("prod-conn", cmdlet.CallResolveEnvironment(ConnectionWithDefaults(), null)); Assert.Equal("org-conn", cmdlet.CallResolveOrganizationId(ConnectionWithDefaults(), null)); - Assert.Equal(2, logger.VerboseEntries.Count); + Assert.Single(logger.VerboseEntries); + Assert.Contains("OrganizationId", logger.VerboseEntries[0]); + } + + [Fact] + public void ResolveOrganizationId_Explicit_Value_Wins_And_Does_Not_Log() + { + RecordingLogger logger = new RecordingLogger(); + TestCmdlet cmdlet = CreateCmdletWith(logger); + + Assert.Equal("explicit-org", cmdlet.CallResolveOrganizationId(ConnectionWithDefaults(), "explicit-org")); + Assert.Empty(logger.VerboseEntries); } } } diff --git a/src/PSInfisicalAPI.Tests/InfisicalEnvironmentPatternTests.cs b/src/PSInfisicalAPI.Tests/InfisicalEnvironmentPatternTests.cs index 1bedc43..babd0f0 100644 --- a/src/PSInfisicalAPI.Tests/InfisicalEnvironmentPatternTests.cs +++ b/src/PSInfisicalAPI.Tests/InfisicalEnvironmentPatternTests.cs @@ -26,26 +26,6 @@ namespace PSInfisicalAPI.Tests Assert.True(MatchesAny(name, InfisicalEnvironmentResolver.OrganizationIdPatterns), "Expected match for " + name); } - [Theory] - [InlineData("INFISICAL_PROJECT_ID")] - [InlineData("INFISICAL_WORKSPACE_ID")] - [InlineData("CLOUDINIT_INFISICAL_PROJECTID")] - public void ProjectIdPatterns_Match_Expected_Names(string name) - { - Assert.True(MatchesAny(name, InfisicalEnvironmentResolver.ProjectIdPatterns), "Expected match for " + name); - } - - [Theory] - [InlineData("INFISICAL_ENVIRONMENT")] - [InlineData("INFISICAL_ENVIRONMENT_NAME")] - [InlineData("INFISICAL_ENV")] - [InlineData("INFISICAL_ENV_SLUG")] - [InlineData("CLOUDINIT_INFISICAL_ENVIRONMENT")] - public void EnvironmentPatterns_Match_Expected_Names(string name) - { - Assert.True(MatchesAny(name, InfisicalEnvironmentResolver.EnvironmentPatterns), "Expected match for " + name); - } - [Theory] [InlineData("INFISICAL_CLIENT_ID")] [InlineData("INFISICAL_UNIVERSAL_AUTH_CLIENT_ID")] @@ -78,15 +58,6 @@ namespace PSInfisicalAPI.Tests Assert.True(MatchesAny(name, InfisicalEnvironmentResolver.AccessTokenPatterns), "Expected match for " + name); } - [Theory] - [InlineData("INFISICAL_SECRET_PATH")] - [InlineData("INFISICAL_DEFAULT_SECRET_PATH")] - [InlineData("CLOUDINIT_INFISICAL_SECRETPATH")] - public void SecretPathPatterns_Match_Expected_Names(string name) - { - Assert.True(MatchesAny(name, InfisicalEnvironmentResolver.SecretPathPatterns), "Expected match for " + name); - } - [Theory] [InlineData("INFISICAL_SECRET_PATH")] [InlineData("INFISICAL_DEFAULT_SECRET_PATH")] @@ -108,9 +79,6 @@ namespace PSInfisicalAPI.Tests Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.AccessTokenPatterns)); Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.BaseUriPatterns)); Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.OrganizationIdPatterns)); - Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.ProjectIdPatterns)); - Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.EnvironmentPatterns)); - Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.SecretPathPatterns)); Assert.False(MatchesAny(name, InfisicalEnvironmentResolver.ApiVersionPatterns)); } diff --git a/src/PSInfisicalAPI/Authentication/InfisicalEnvironmentResolver.cs b/src/PSInfisicalAPI/Authentication/InfisicalEnvironmentResolver.cs index dee5c0d..0e091c4 100644 --- a/src/PSInfisicalAPI/Authentication/InfisicalEnvironmentResolver.cs +++ b/src/PSInfisicalAPI/Authentication/InfisicalEnvironmentResolver.cs @@ -33,18 +33,6 @@ namespace PSInfisicalAPI.Authentication new Regex(@".*INFISICAL.*ORG(ANIZATION)?.*ID.*", DefaultRegexOptions) }; - public static readonly Regex[] ProjectIdPatterns = new[] - { - new Regex(@".*INFISICAL.*(PROJECT|WORKSPACE).*ID.*", DefaultRegexOptions) - }; - - public static readonly Regex[] EnvironmentPatterns = new[] - { - new Regex(@".*INFISICAL.*ENV(IRONMENT)?.*NAME.*", DefaultRegexOptions), - new Regex(@".*INFISICAL.*ENV(IRONMENT)?.*SLUG.*", DefaultRegexOptions), - new Regex(@".*INFISICAL.*ENV(IRONMENT)?.*", DefaultRegexOptions) - }; - public static readonly Regex[] ClientIdPatterns = new[] { new Regex(@".*INFISICAL.*CLIENT.*ID.*", DefaultRegexOptions), @@ -64,12 +52,6 @@ namespace PSInfisicalAPI.Authentication new Regex(@".*INFISICAL.*TOKEN.*", DefaultRegexOptions) }; - public static readonly Regex[] SecretPathPatterns = new[] - { - new Regex(@".*INFISICAL.*SECRET.*PATH.*", DefaultRegexOptions), - new Regex(@".*INFISICAL.*DEFAULT.*PATH.*", DefaultRegexOptions) - }; - public static readonly Regex[] ApiVersionPatterns = new[] { new Regex(@".*INFISICAL.*API.*VERSION.*", DefaultRegexOptions) diff --git a/src/PSInfisicalAPI/Cmdlets/ConnectInfisicalCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/ConnectInfisicalCmdlet.cs index 08834df..d199fb9 100644 --- a/src/PSInfisicalAPI/Cmdlets/ConnectInfisicalCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/ConnectInfisicalCmdlet.cs @@ -28,12 +28,6 @@ namespace PSInfisicalAPI.Cmdlets [Parameter] public string OrganizationId { get; set; } - [Parameter] - public string ProjectId { get; set; } - - [Parameter] - public string Environment { get; set; } - [Parameter(ParameterSetName = ParameterSetUniversalAuth)] public string ClientId { get; set; } @@ -62,9 +56,6 @@ namespace PSInfisicalAPI.Cmdlets [Parameter(Mandatory = true, ParameterSetName = ParameterSetLdap)] public SecureString Password { get; set; } - [Parameter] - public string SecretPath { get; set; } = "/"; - [Parameter] public string ApiVersion { get; set; } = "v4"; @@ -185,9 +176,6 @@ namespace PSInfisicalAPI.Cmdlets PinnedApiVersion = apiVersionExplicitlyBound ? ApiVersion : null, AuthType = authType, OrganizationId = OrganizationId, - ProjectId = ProjectId, - Environment = Environment, - DefaultSecretPath = string.IsNullOrEmpty(SecretPath) ? "/" : SecretPath, ConnectedAtUtc = DateTimeOffset.UtcNow, ExpiresAtUtc = authResult.ExpiresAtUtc, IsConnected = true, @@ -215,8 +203,6 @@ namespace PSInfisicalAPI.Cmdlets bool needsScan = BaseUri == null || string.IsNullOrWhiteSpace(OrganizationId) || - string.IsNullOrWhiteSpace(ProjectId) || - string.IsNullOrWhiteSpace(Environment) || (tokenSet && (AccessToken == null || AccessToken.Length == 0)) || (universalSet && string.IsNullOrWhiteSpace(ClientId)) || (universalSet && (ClientSecret == null || ClientSecret.Length == 0)); @@ -242,8 +228,6 @@ namespace PSInfisicalAPI.Cmdlets } OrganizationId = InfisicalEnvironmentResolver.ResolveString("OrganizationId", InfisicalEnvironmentResolver.OrganizationIdPatterns, OrganizationId, Logger); - ProjectId = InfisicalEnvironmentResolver.ResolveString("ProjectId", InfisicalEnvironmentResolver.ProjectIdPatterns, ProjectId, Logger); - Environment = InfisicalEnvironmentResolver.ResolveString("Environment", InfisicalEnvironmentResolver.EnvironmentPatterns, Environment, Logger); if (tokenSet) { @@ -255,15 +239,6 @@ namespace PSInfisicalAPI.Cmdlets ClientSecret = InfisicalEnvironmentResolver.ResolveSecureString("ClientSecret", InfisicalEnvironmentResolver.ClientSecretPatterns, ClientSecret, Logger); } - if (!MyInvocation.BoundParameters.ContainsKey("SecretPath")) - { - string resolvedPath = InfisicalEnvironmentResolver.ResolveString("SecretPath", InfisicalEnvironmentResolver.SecretPathPatterns, null, Logger); - if (!string.IsNullOrWhiteSpace(resolvedPath)) - { - SecretPath = resolvedPath; - } - } - if (!MyInvocation.BoundParameters.ContainsKey("ApiVersion")) { string resolvedVersion = InfisicalEnvironmentResolver.ResolveString("ApiVersion", InfisicalEnvironmentResolver.ApiVersionPatterns, null, Logger); @@ -280,8 +255,6 @@ namespace PSInfisicalAPI.Cmdlets if (BaseUri == null) { missing.Add("BaseUri"); } if (string.IsNullOrWhiteSpace(OrganizationId)) { missing.Add("OrganizationId"); } - if (string.IsNullOrWhiteSpace(ProjectId)) { missing.Add("ProjectId"); } - if (string.IsNullOrWhiteSpace(Environment)) { missing.Add("Environment"); } if (string.Equals(ParameterSetName, ParameterSetToken, StringComparison.Ordinal)) { diff --git a/src/PSInfisicalAPI/Cmdlets/CopyInfisicalSecretCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/CopyInfisicalSecretCmdlet.cs index ce4baea..ea85a76 100644 --- a/src/PSInfisicalAPI/Cmdlets/CopyInfisicalSecretCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/CopyInfisicalSecretCmdlet.cs @@ -18,9 +18,9 @@ namespace PSInfisicalAPI.Cmdlets public string DestinationEnvironment { get; set; } [Parameter] public string DestinationSecretPath { get; set; } - [Parameter] public string SourceEnvironment { get; set; } + [Parameter(Mandatory = true)] public string SourceEnvironment { get; set; } [Parameter] public string SourceSecretPath { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public string ApiVersion { get; set; } [Parameter] public SwitchParameter OverwriteExisting { get; set; } [Parameter] public SwitchParameter CopySecretValue { get; set; } @@ -35,9 +35,6 @@ namespace PSInfisicalAPI.Cmdlets if (SecretId == null || SecretId.Length == 0) { return; } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedSourceEnv = ResolveEnvironment(connection, SourceEnvironment); - string resolvedSourcePath = ResolveSecretPath(connection, SourceSecretPath); string resolvedApiVersion = ResolveApiVersion(connection, ApiVersion); string target = string.Concat(SecretId.Length, " secret(s) -> ", DestinationEnvironment); @@ -45,10 +42,10 @@ namespace PSInfisicalAPI.Cmdlets InfisicalDuplicateSecretsRequest request = new InfisicalDuplicateSecretsRequest { - ProjectId = resolvedProjectId, - SourceEnvironment = resolvedSourceEnv, + ProjectId = ProjectId, + SourceEnvironment = SourceEnvironment, DestinationEnvironment = DestinationEnvironment, - SourceSecretPath = resolvedSourcePath, + SourceSecretPath = SourceSecretPath, DestinationSecretPath = DestinationSecretPath, SecretIds = SecretId, ApiVersion = resolvedApiVersion, diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs index 11bfb2e..9fa6433 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationCmdlet.cs @@ -18,7 +18,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Name")] public string ApplicationName { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } @@ -30,23 +30,22 @@ namespace PSInfisicalAPI.Cmdlets { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) { - InfisicalCertificateApplication app = client.GetCertificateApplication(connection, Id, resolvedProjectId); + InfisicalCertificateApplication app = client.GetCertificateApplication(connection, Id, ProjectId); if (app != null) { WriteObject(app); } return; } if (string.Equals(ParameterSetName, "ByName", StringComparison.Ordinal)) { - InfisicalCertificateApplication app = client.GetCertificateApplicationByName(connection, ApplicationName, resolvedProjectId); + InfisicalCertificateApplication app = client.GetCertificateApplicationByName(connection, ApplicationName, ProjectId); if (app != null) { WriteObject(app); } return; } - InfisicalCertificateApplication[] all = client.ListCertificateApplications(connection, resolvedProjectId, Limit, Offset); + InfisicalCertificateApplication[] all = client.ListCertificateApplications(connection, ProjectId, Limit, Offset); foreach (InfisicalCertificateApplication app in all) { WriteObject(app); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs index 426e1a2..6001970 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateApplicationEnrollmentCmdlet.cs @@ -18,7 +18,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("CertificateProfileId")] public string ProfileId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } protected override void ProcessRecord() { @@ -26,9 +26,8 @@ namespace PSInfisicalAPI.Cmdlets { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - InfisicalCertificateApplicationEnrollment enrollment = client.GetCertificateApplicationEnrollment(connection, ApplicationId, ProfileId, resolvedProjectId); + InfisicalCertificateApplicationEnrollment enrollment = client.GetCertificateApplicationEnrollment(connection, ApplicationId, ProfileId, ProjectId); if (enrollment != null) { WriteObject(enrollment); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs index 3857d9a..d712ac4 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateAuthorityCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id")] public string CaId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] [ValidateSet("Internal", "Acme", "Any")] diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs index 91a91e8..a9b98d7 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateCmdlet.cs @@ -15,7 +15,7 @@ namespace PSInfisicalAPI.Cmdlets public string SerialNumber { get; set; } [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } - [Parameter(ParameterSetName = "List")] public string ProjectId { get; set; } + [Parameter(ParameterSetName = "List", Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] public string CommonName { get; set; } [Parameter(ParameterSetName = "List")] public string FriendlyName { get; set; } [Parameter(ParameterSetName = "List")] public string Status { get; set; } @@ -42,11 +42,9 @@ namespace PSInfisicalAPI.Cmdlets return; } - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - InfisicalCertificateSearchQuery query = new InfisicalCertificateSearchQuery { - ProjectId = resolvedProjectId, + ProjectId = ProjectId, CommonName = CommonName, FriendlyName = FriendlyName, Status = Status, diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs index 01b59bb..0472507 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificatePolicyCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id", "CertificatePolicyId")] public string PolicyId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } @@ -26,11 +26,10 @@ namespace PSInfisicalAPI.Cmdlets { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) { - InfisicalCertificatePolicy policy = client.GetCertificatePolicy(connection, PolicyId, resolvedProjectId); + InfisicalCertificatePolicy policy = client.GetCertificatePolicy(connection, PolicyId, ProjectId); if (policy != null) { WriteObject(policy); @@ -39,7 +38,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalCertificatePolicy[] all = client.ListCertificatePolicies(connection, resolvedProjectId, Limit, Offset); + InfisicalCertificatePolicy[] all = client.ListCertificatePolicies(connection, ProjectId, Limit, Offset); foreach (InfisicalCertificatePolicy policy in all) { WriteObject(policy); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs index 7f20258..02cf1ae 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalCertificateProfileCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id", "CertificateProfileId")] public string ProfileId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] public int? Limit { get; set; } @@ -28,11 +28,10 @@ namespace PSInfisicalAPI.Cmdlets { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); if (string.Equals(ParameterSetName, "ById", StringComparison.Ordinal)) { - InfisicalCertificateProfile profile = client.GetCertificateProfile(connection, ProfileId, resolvedProjectId); + InfisicalCertificateProfile profile = client.GetCertificateProfile(connection, ProfileId, ProjectId); if (profile != null) { WriteObject(profile); @@ -42,7 +41,7 @@ namespace PSInfisicalAPI.Cmdlets } bool? includeConfigs = MyInvocation.BoundParameters.ContainsKey("IncludeConfigs") ? (bool?)IncludeConfigs.IsPresent : null; - InfisicalCertificateProfile[] all = client.ListCertificateProfiles(connection, resolvedProjectId, Limit, Offset, includeConfigs); + InfisicalCertificateProfile[] all = client.ListCertificateProfiles(connection, ProjectId, Limit, Offset, includeConfigs); foreach (InfisicalCertificateProfile profile in all) { WriteObject(profile); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs index a871c16..c6b4013 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalEnvironmentCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Slug", "Id", "Environment")] public string EnvironmentSlugOrId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } @@ -23,12 +23,11 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalEnvironmentClient client = new InfisicalEnvironmentClient(HttpClient, Logger); if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) { - InfisicalEnvironment env = client.Retrieve(connection, resolvedProjectId, EnvironmentSlugOrId); + InfisicalEnvironment env = client.Retrieve(connection, ProjectId, EnvironmentSlugOrId); if (env != null) { WriteObject(env); @@ -37,7 +36,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalEnvironment[] envs = client.List(connection, resolvedProjectId); + InfisicalEnvironment[] envs = client.List(connection, ProjectId); foreach (InfisicalEnvironment env in envs) { WriteObject(env); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs index 8a1e644..2e877c6 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalFolderCmdlet.cs @@ -14,8 +14,8 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Name", "Id")] public string FolderNameOrId { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string Path { get; set; } [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } @@ -25,14 +25,11 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedPath = ResolveSecretPath(connection, Path); InfisicalFolderClient client = new InfisicalFolderClient(HttpClient, Logger); if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) { - InfisicalFolder folder = client.Retrieve(connection, resolvedProjectId, resolvedEnvironment, resolvedPath, FolderNameOrId); + InfisicalFolder folder = client.Retrieve(connection, ProjectId, Environment, Path, FolderNameOrId); if (folder != null) { WriteObject(folder); @@ -41,7 +38,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalFolder[] folders = client.List(connection, resolvedProjectId, resolvedEnvironment, resolvedPath); + InfisicalFolder[] folders = client.List(connection, ProjectId, Environment, Path); foreach (InfisicalFolder folder in folders) { WriteObject(folder); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs index bcd2eab..5cfebda 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalPkiSubscriberCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("SubscriberName", "Slug")] public string Name { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } protected override void ProcessRecord() { @@ -22,11 +22,10 @@ namespace PSInfisicalAPI.Cmdlets { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); if (string.Equals(ParameterSetName, "ByName", StringComparison.Ordinal)) { - InfisicalPkiSubscriber subscriber = client.GetPkiSubscriber(connection, Name, resolvedProjectId); + InfisicalPkiSubscriber subscriber = client.GetPkiSubscriber(connection, Name, ProjectId); if (subscriber != null) { WriteObject(subscriber); @@ -35,7 +34,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalPkiSubscriber[] all = client.ListPkiSubscribers(connection, resolvedProjectId); + InfisicalPkiSubscriber[] all = client.ListPkiSubscribers(connection, ProjectId); foreach (InfisicalPkiSubscriber subscriber in all) { WriteObject(subscriber); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs index fa251fc..4ab1598 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalProjectCmdlet.cs @@ -16,6 +16,12 @@ namespace PSInfisicalAPI.Cmdlets [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } + [Parameter(ParameterSetName = "List")] + [ValidateSet("secret-manager", "cert-manager", "kms", "ssh", "secret-scanning", "pam", "ai")] + public string Type { get; set; } + + [Parameter(ParameterSetName = "List")] public SwitchParameter IncludeRoles { get; set; } + protected override void ProcessRecord() { try @@ -25,8 +31,7 @@ namespace PSInfisicalAPI.Cmdlets if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) { - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - InfisicalProject project = client.Retrieve(connection, resolvedProjectId); + InfisicalProject project = client.Retrieve(connection, ProjectId); if (project != null) { WriteObject(project); @@ -35,7 +40,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalProject[] projects = client.List(connection); + InfisicalProject[] projects = client.List(connection, Type, IncludeRoles.IsPresent); foreach (InfisicalProject project in projects) { WriteObject(project); diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs index 49eee51..724a4d3 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalSecretCmdlet.cs @@ -15,8 +15,8 @@ namespace PSInfisicalAPI.Cmdlets [Parameter(ParameterSetName = "Single", Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] public string SecretName { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string SecretPath { get; set; } [Parameter] public string ApiVersion { get; set; } [Parameter] public SwitchParameter ViewSecretValue { get; set; } = SwitchParameter.Present; @@ -44,9 +44,9 @@ namespace PSInfisicalAPI.Cmdlets InfisicalRetrieveSecretQuery query = new InfisicalRetrieveSecretQuery { SecretName = SecretName, - ProjectId = ResolveProjectId(connection, ProjectId), - Environment = ResolveEnvironment(connection, Environment), - SecretPath = ResolveSecretPath(connection, SecretPath), + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, ApiVersion = ResolveApiVersion(connection, ApiVersion), Version = Version, Type = Type.ToString(), @@ -66,9 +66,9 @@ namespace PSInfisicalAPI.Cmdlets InfisicalListSecretsQuery listQuery = new InfisicalListSecretsQuery { - ProjectId = ResolveProjectId(connection, ProjectId), - Environment = ResolveEnvironment(connection, Environment), - SecretPath = ResolveSecretPath(connection, SecretPath), + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, ApiVersion = ResolveApiVersion(connection, ApiVersion), Recursive = Recursive.IsPresent, IncludeImports = IncludeImports.IsPresent, diff --git a/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs index 60ce541..eefe56d 100644 --- a/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/GetInfisicalTagCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Slug", "Id")] public string TagSlugOrId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter(ParameterSetName = "List")] public SwitchParameter List { get; set; } @@ -23,12 +23,11 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalTagClient client = new InfisicalTagClient(HttpClient, Logger); if (string.Equals(ParameterSetName, "Single", StringComparison.Ordinal)) { - InfisicalTag tag = client.Retrieve(connection, resolvedProjectId, TagSlugOrId); + InfisicalTag tag = client.Retrieve(connection, ProjectId, TagSlugOrId); if (tag != null) { WriteObject(tag); @@ -37,7 +36,7 @@ namespace PSInfisicalAPI.Cmdlets return; } - InfisicalTag[] tags = client.List(connection, resolvedProjectId); + InfisicalTag[] tags = client.List(connection, ProjectId); foreach (InfisicalTag tag in tags) { WriteObject(tag); diff --git a/src/PSInfisicalAPI/Cmdlets/InfisicalCmdletBase.cs b/src/PSInfisicalAPI/Cmdlets/InfisicalCmdletBase.cs index 4a3c37b..4e35b17 100644 --- a/src/PSInfisicalAPI/Cmdlets/InfisicalCmdletBase.cs +++ b/src/PSInfisicalAPI/Cmdlets/InfisicalCmdletBase.cs @@ -46,21 +46,6 @@ namespace PSInfisicalAPI.Cmdlets ThrowTerminatingError(record); } - protected string ResolveProjectId(InfisicalConnection connection, string explicitValue) - { - return ResolveValue("ProjectId", explicitValue, connection != null ? connection.ProjectId : null, null); - } - - protected string ResolveEnvironment(InfisicalConnection connection, string explicitValue) - { - return ResolveValue("Environment", explicitValue, connection != null ? connection.Environment : null, null); - } - - protected string ResolveSecretPath(InfisicalConnection connection, string explicitValue) - { - return ResolveValue("SecretPath", explicitValue, connection != null ? connection.DefaultSecretPath : null, "/"); - } - protected string ResolveApiVersion(InfisicalConnection connection, string explicitValue) { string fromConnection = connection != null ? (!string.IsNullOrEmpty(connection.PinnedApiVersion) ? connection.PinnedApiVersion : connection.ApiVersion) : null; diff --git a/src/PSInfisicalAPI/Cmdlets/NewInfisicalEnvironmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/NewInfisicalEnvironmentCmdlet.cs index 6a00664..ad11bef 100644 --- a/src/PSInfisicalAPI/Cmdlets/NewInfisicalEnvironmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/NewInfisicalEnvironmentCmdlet.cs @@ -12,7 +12,7 @@ namespace PSInfisicalAPI.Cmdlets { [Parameter(Mandatory = true, Position = 0)] public string Name { get; set; } [Parameter(Mandatory = true, Position = 1)] public string Slug { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public int? Position { get; set; } protected override void ProcessRecord() @@ -25,9 +25,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalEnvironmentClient client = new InfisicalEnvironmentClient(HttpClient, Logger); - InfisicalEnvironment env = client.Create(connection, resolvedProjectId, Name, Slug, Position); + InfisicalEnvironment env = client.Create(connection, ProjectId, Name, Slug, Position); if (env != null) { WriteObject(env); diff --git a/src/PSInfisicalAPI/Cmdlets/NewInfisicalFolderCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/NewInfisicalFolderCmdlet.cs index f31ff1d..46b6f97 100644 --- a/src/PSInfisicalAPI/Cmdlets/NewInfisicalFolderCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/NewInfisicalFolderCmdlet.cs @@ -11,8 +11,8 @@ namespace PSInfisicalAPI.Cmdlets public sealed class NewInfisicalFolderCmdlet : InfisicalCmdletBase { [Parameter(Mandatory = true, Position = 0)] public string Name { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string Path { get; set; } protected override void ProcessRecord() @@ -25,11 +25,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedPath = ResolveSecretPath(connection, Path); InfisicalFolderClient client = new InfisicalFolderClient(HttpClient, Logger); - InfisicalFolder folder = client.Create(connection, resolvedProjectId, resolvedEnvironment, Name, resolvedPath); + InfisicalFolder folder = client.Create(connection, ProjectId, Environment, Name, Path); if (folder != null) { WriteObject(folder); diff --git a/src/PSInfisicalAPI/Cmdlets/NewInfisicalSecretCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/NewInfisicalSecretCmdlet.cs index 2d8962a..2b41f51 100644 --- a/src/PSInfisicalAPI/Cmdlets/NewInfisicalSecretCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/NewInfisicalSecretCmdlet.cs @@ -28,8 +28,8 @@ namespace PSInfisicalAPI.Cmdlets public IDictionary[] Secrets { get; set; } [Parameter] public string SecretComment { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string SecretPath { get; set; } [Parameter] public string ApiVersion { get; set; } [Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; @@ -41,9 +41,6 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedSecretPath = ResolveSecretPath(connection, SecretPath); string resolvedApiVersion = ResolveApiVersion(connection, ApiVersion); if (string.Equals(ParameterSetName, "Bulk", StringComparison.Ordinal)) @@ -54,9 +51,9 @@ namespace PSInfisicalAPI.Cmdlets InfisicalBulkCreateSecretsRequest bulk = new InfisicalBulkCreateSecretsRequest { - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = resolvedSecretPath, + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, ApiVersion = resolvedApiVersion, Secrets = InfisicalBulkSecretConverter.ToCreateItems(Secrets) }; @@ -82,9 +79,9 @@ namespace PSInfisicalAPI.Cmdlets SecretName = SecretName, SecretValue = plainValue, SecretComment = SecretComment, - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = resolvedSecretPath, + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, Type = Type.ToString(), ApiVersion = resolvedApiVersion, SkipMultilineEncoding = SkipMultilineEncoding.IsPresent ? (bool?)true : null, diff --git a/src/PSInfisicalAPI/Cmdlets/NewInfisicalTagCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/NewInfisicalTagCmdlet.cs index bf26869..3014fcb 100644 --- a/src/PSInfisicalAPI/Cmdlets/NewInfisicalTagCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/NewInfisicalTagCmdlet.cs @@ -13,7 +13,7 @@ namespace PSInfisicalAPI.Cmdlets [Parameter(Mandatory = true, Position = 0)] public string Slug { get; set; } [Parameter] public string Name { get; set; } [Parameter] public string Color { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } protected override void ProcessRecord() { @@ -25,9 +25,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalTagClient client = new InfisicalTagClient(HttpClient, Logger); - InfisicalTag tag = client.Create(connection, resolvedProjectId, Slug, Name, Color); + InfisicalTag tag = client.Create(connection, ProjectId, Slug, Name, Color); if (tag != null) { WriteObject(tag); diff --git a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalEnvironmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalEnvironmentCmdlet.cs index 2716bc4..48b3c24 100644 --- a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalEnvironmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalEnvironmentCmdlet.cs @@ -12,7 +12,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id")] public string EnvironmentId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public SwitchParameter PassThru { get; set; } protected override void ProcessRecord() @@ -25,9 +25,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalEnvironmentClient client = new InfisicalEnvironmentClient(HttpClient, Logger); - client.Delete(connection, resolvedProjectId, EnvironmentId); + client.Delete(connection, ProjectId, EnvironmentId); if (PassThru.IsPresent) { diff --git a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalFolderCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalFolderCmdlet.cs index 7dde5d7..597defc 100644 --- a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalFolderCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalFolderCmdlet.cs @@ -12,8 +12,8 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id")] public string FolderId { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string Path { get; set; } [Parameter] public SwitchParameter PassThru { get; set; } @@ -27,11 +27,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedPath = ResolveSecretPath(connection, Path); InfisicalFolderClient client = new InfisicalFolderClient(HttpClient, Logger); - client.Delete(connection, resolvedProjectId, resolvedEnvironment, FolderId, resolvedPath); + client.Delete(connection, ProjectId, Environment, FolderId, Path); if (PassThru.IsPresent) { diff --git a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalProjectCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalProjectCmdlet.cs index fbab178..86bf47a 100644 --- a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalProjectCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalProjectCmdlet.cs @@ -8,7 +8,7 @@ namespace PSInfisicalAPI.Cmdlets [Cmdlet(VerbsCommon.Remove, "InfisicalProject", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.High)] public sealed class RemoveInfisicalProjectCmdlet : InfisicalCmdletBase { - [Parameter(ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] [Alias("Id")] public string ProjectId { get; set; } @@ -19,19 +19,18 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - if (!ShouldProcess(resolvedProjectId, "Remove Infisical project")) + if (!ShouldProcess(ProjectId, "Remove Infisical project")) { return; } InfisicalProjectClient client = new InfisicalProjectClient(HttpClient, Logger); - client.Delete(connection, resolvedProjectId); + client.Delete(connection, ProjectId); if (PassThru.IsPresent) { - WriteObject(resolvedProjectId); + WriteObject(ProjectId); } } catch (Exception exception) diff --git a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalSecretCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalSecretCmdlet.cs index d2154c7..e02d6ab 100644 --- a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalSecretCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalSecretCmdlet.cs @@ -16,8 +16,8 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Names", "SecretKeys")] public string[] SecretNames { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string SecretPath { get; set; } [Parameter] public string ApiVersion { get; set; } [Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; @@ -28,9 +28,6 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedSecretPath = ResolveSecretPath(connection, SecretPath); string resolvedApiVersion = ResolveApiVersion(connection, ApiVersion); InfisicalSecretsClient client = new InfisicalSecretsClient(HttpClient, Logger); @@ -43,9 +40,9 @@ namespace PSInfisicalAPI.Cmdlets InfisicalBulkDeleteSecretsRequest bulk = new InfisicalBulkDeleteSecretsRequest { - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = resolvedSecretPath, + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, ApiVersion = resolvedApiVersion, SecretNames = SecretNames }; @@ -65,9 +62,9 @@ namespace PSInfisicalAPI.Cmdlets InfisicalDeleteSecretRequest request = new InfisicalDeleteSecretRequest { SecretName = SecretName, - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = resolvedSecretPath, + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, Type = Type.ToString(), ApiVersion = resolvedApiVersion }; diff --git a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalTagCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalTagCmdlet.cs index 96b3b7e..9280a22 100644 --- a/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalTagCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RemoveInfisicalTagCmdlet.cs @@ -12,7 +12,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id")] public string TagId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public SwitchParameter PassThru { get; set; } protected override void ProcessRecord() @@ -25,9 +25,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalTagClient client = new InfisicalTagClient(HttpClient, Logger); - client.Delete(connection, resolvedProjectId, TagId); + client.Delete(connection, ProjectId, TagId); if (PassThru.IsPresent) { diff --git a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs index 58eed3b..2a761de 100644 --- a/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/RequestInfisicalCertificateCmdlet.cs @@ -27,7 +27,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("ProfileId")] public string CertificateProfileId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public IDictionary Subject { get; set; } [Parameter] public string CommonName { get; set; } [Parameter] public string Country { get; set; } @@ -77,14 +77,13 @@ namespace PSInfisicalAPI.Cmdlets { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalCsrSubject csrSubject = InfisicalCertificateRequestHelpers.MergeSubject(Subject, CommonName, Country, State, Locality, Organization, OrganizationalUnit, EmailAddress); List dnsNames = BuildDnsNames(csrSubject); if (string.IsNullOrEmpty(csrSubject.CommonName) && dnsNames.Count > 0) { csrSubject.CommonName = dnsNames[0]; } if (string.IsNullOrEmpty(csrSubject.CommonName)) { throw new InvalidOperationException("Subject CommonName could not be determined and no DnsName was provided."); } - X509Certificate2 existing = TryFindExisting(client, connection, resolvedProjectId, csrSubject.CommonName); + X509Certificate2 existing = TryFindExisting(client, connection, ProjectId, csrSubject.CommonName); if (existing != null && !Force.IsPresent && !(AllowRenewal.IsPresent && InfisicalLocalCertificateLookup.IsRenewable(existing, RenewalThresholdDays))) { Logger.Information(Component, string.Concat("Reusing existing certificate (Thumbprint=", existing.Thumbprint, ", NotAfter=", existing.NotAfter.ToString("u"), ").")); @@ -118,7 +117,7 @@ namespace PSInfisicalAPI.Cmdlets InfisicalCsrOptions csrOptions = new InfisicalCsrOptions { KeyAlgorithm = KeyAlgorithm, RsaKeySize = KeySize, EcCurve = Curve }; InfisicalCsrResult csr = InfisicalCsrBuilder.Build(csrSubject, dnsNames, IpAddress, csrOptions); - InfisicalSignedCertificate signed = SignCertificate(client, connection, resolvedProjectId, csr.CsrPem); + InfisicalSignedCertificate signed = SignCertificate(client, connection, ProjectId, csr.CsrPem); signed.PrivateKeyPem = csr.PrivateKeyPem; if (string.IsNullOrEmpty(signed.CertificatePem)) diff --git a/src/PSInfisicalAPI/Cmdlets/SearchInfisicalCertificateCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/SearchInfisicalCertificateCmdlet.cs index 4b3d3d7..1bd04b5 100644 --- a/src/PSInfisicalAPI/Cmdlets/SearchInfisicalCertificateCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/SearchInfisicalCertificateCmdlet.cs @@ -11,7 +11,7 @@ namespace PSInfisicalAPI.Cmdlets [OutputType(typeof(InfisicalCertificate))] public sealed class SearchInfisicalCertificateCmdlet : InfisicalCmdletBase { - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public string FriendlyName { get; set; } [Parameter] public string CommonName { get; set; } [Parameter] public string Search { get; set; } @@ -39,10 +39,9 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalPkiClient client = new InfisicalPkiClient(HttpClient, Logger); - InfisicalCertificateSearchQuery query = BuildQuery(resolvedProjectId); + InfisicalCertificateSearchQuery query = BuildQuery(ProjectId); int requestedLimit = query.Limit ?? 100; query.Limit = requestedLimit; query.Offset = query.Offset ?? 0; diff --git a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalEnvironmentCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalEnvironmentCmdlet.cs index 76de675..d042e01 100644 --- a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalEnvironmentCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalEnvironmentCmdlet.cs @@ -14,7 +14,7 @@ namespace PSInfisicalAPI.Cmdlets [Alias("Id")] public string EnvironmentId { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } [Parameter] public string Name { get; set; } [Parameter] public string Slug { get; set; } [Parameter] public int? Position { get; set; } @@ -29,9 +29,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalEnvironmentClient client = new InfisicalEnvironmentClient(HttpClient, Logger); - InfisicalEnvironment env = client.Update(connection, resolvedProjectId, EnvironmentId, Name, Slug, Position); + InfisicalEnvironment env = client.Update(connection, ProjectId, EnvironmentId, Name, Slug, Position); if (env != null) { WriteObject(env); diff --git a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalFolderCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalFolderCmdlet.cs index bb5fe36..9305ae2 100644 --- a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalFolderCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalFolderCmdlet.cs @@ -15,8 +15,8 @@ namespace PSInfisicalAPI.Cmdlets public string FolderId { get; set; } [Parameter(Mandatory = true, Position = 1)] public string Name { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string Path { get; set; } protected override void ProcessRecord() @@ -29,11 +29,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedPath = ResolveSecretPath(connection, Path); InfisicalFolderClient client = new InfisicalFolderClient(HttpClient, Logger); - InfisicalFolder folder = client.Update(connection, resolvedProjectId, resolvedEnvironment, FolderId, Name, resolvedPath); + InfisicalFolder folder = client.Update(connection, ProjectId, Environment, FolderId, Name, Path); if (folder != null) { WriteObject(folder); diff --git a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalProjectCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalProjectCmdlet.cs index a76cb6b..3d929d0 100644 --- a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalProjectCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalProjectCmdlet.cs @@ -10,7 +10,7 @@ namespace PSInfisicalAPI.Cmdlets [OutputType(typeof(InfisicalProject))] public sealed class UpdateInfisicalProjectCmdlet : InfisicalCmdletBase { - [Parameter(ValueFromPipelineByPropertyName = true, Position = 0)] + [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position = 0)] [Alias("Id")] public string ProjectId { get; set; } @@ -23,15 +23,14 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - if (!ShouldProcess(resolvedProjectId, "Update Infisical project")) + if (!ShouldProcess(ProjectId, "Update Infisical project")) { return; } InfisicalProjectClient client = new InfisicalProjectClient(HttpClient, Logger); - InfisicalProject project = client.Update(connection, resolvedProjectId, Name, Description, AutoCapitalization); + InfisicalProject project = client.Update(connection, ProjectId, Name, Description, AutoCapitalization); if (project != null) { WriteObject(project); diff --git a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalSecretCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalSecretCmdlet.cs index 0449af7..30047b1 100644 --- a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalSecretCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalSecretCmdlet.cs @@ -26,8 +26,8 @@ namespace PSInfisicalAPI.Cmdlets [Parameter] public string NewSecretName { get; set; } [Parameter] public string SecretComment { get; set; } - [Parameter] public string ProjectId { get; set; } - [Parameter] public string Environment { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string Environment { get; set; } [Parameter] public string SecretPath { get; set; } [Parameter] public string ApiVersion { get; set; } [Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; @@ -39,9 +39,6 @@ namespace PSInfisicalAPI.Cmdlets try { InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); - string resolvedEnvironment = ResolveEnvironment(connection, Environment); - string resolvedSecretPath = ResolveSecretPath(connection, SecretPath); string resolvedApiVersion = ResolveApiVersion(connection, ApiVersion); if (string.Equals(ParameterSetName, "Bulk", StringComparison.Ordinal)) @@ -52,9 +49,9 @@ namespace PSInfisicalAPI.Cmdlets InfisicalBulkUpdateSecretsRequest bulk = new InfisicalBulkUpdateSecretsRequest { - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = resolvedSecretPath, + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, ApiVersion = resolvedApiVersion, Secrets = InfisicalBulkSecretConverter.ToUpdateItems(Secrets) }; @@ -81,9 +78,9 @@ namespace PSInfisicalAPI.Cmdlets NewSecretName = NewSecretName, SecretValue = plainValue, SecretComment = SecretComment, - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = resolvedSecretPath, + ProjectId = ProjectId, + Environment = Environment, + SecretPath = SecretPath, Type = Type.ToString(), ApiVersion = resolvedApiVersion, SkipMultilineEncoding = SkipMultilineEncoding.IsPresent ? (bool?)true : null, diff --git a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalTagCmdlet.cs b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalTagCmdlet.cs index 15aefe6..7b5f01c 100644 --- a/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalTagCmdlet.cs +++ b/src/PSInfisicalAPI/Cmdlets/UpdateInfisicalTagCmdlet.cs @@ -17,7 +17,7 @@ namespace PSInfisicalAPI.Cmdlets [Parameter] public string Slug { get; set; } [Parameter] public string Name { get; set; } [Parameter] public string Color { get; set; } - [Parameter] public string ProjectId { get; set; } + [Parameter(Mandatory = true)] public string ProjectId { get; set; } protected override void ProcessRecord() { @@ -29,9 +29,8 @@ namespace PSInfisicalAPI.Cmdlets } InfisicalConnection connection = InfisicalSessionManager.RequireCurrent(); - string resolvedProjectId = ResolveProjectId(connection, ProjectId); InfisicalTagClient client = new InfisicalTagClient(HttpClient, Logger); - InfisicalTag tag = client.Update(connection, resolvedProjectId, TagId, Slug, Name, Color); + InfisicalTag tag = client.Update(connection, ProjectId, TagId, Slug, Name, Color); if (tag != null) { WriteObject(tag); diff --git a/src/PSInfisicalAPI/Connections/InfisicalConnection.cs b/src/PSInfisicalAPI/Connections/InfisicalConnection.cs index ef4d04c..7e6362d 100644 --- a/src/PSInfisicalAPI/Connections/InfisicalConnection.cs +++ b/src/PSInfisicalAPI/Connections/InfisicalConnection.cs @@ -12,9 +12,6 @@ namespace PSInfisicalAPI.Connections public string PinnedApiVersion { get; set; } public InfisicalAuthType AuthType { get; set; } public string OrganizationId { get; set; } - public string ProjectId { get; set; } - public string Environment { get; set; } - public string DefaultSecretPath { get; set; } public DateTimeOffset ConnectedAtUtc { get; set; } public DateTimeOffset? ExpiresAtUtc { get; set; } public bool IsConnected { get; set; } @@ -26,8 +23,8 @@ namespace PSInfisicalAPI.Connections public override string ToString() { return string.Concat( - "Project=", ProjectId ?? "", - " Environment=", Environment ?? "", + "BaseUri=", BaseUri != null ? BaseUri.ToString() : "", + " AuthType=", AuthType.ToString(), " Connected=", IsConnected ? "true" : "false"); } } diff --git a/src/PSInfisicalAPI/Environments/InfisicalEnvironmentClient.cs b/src/PSInfisicalAPI/Environments/InfisicalEnvironmentClient.cs index 3a917bc..455852c 100644 --- a/src/PSInfisicalAPI/Environments/InfisicalEnvironmentClient.cs +++ b/src/PSInfisicalAPI/Environments/InfisicalEnvironmentClient.cs @@ -29,10 +29,9 @@ namespace PSInfisicalAPI.Environments public InfisicalEnvironment[] List(InfisicalConnection connection, string projectId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId } }; try { @@ -43,7 +42,7 @@ namespace PSInfisicalAPI.Environments InfisicalEnvironmentWorkspaceDto workspace = dto != null ? (dto.Workspace ?? dto.Project) : null; List envs = workspace != null ? workspace.Environments : null; - InfisicalEnvironment[] mapped = InfisicalEnvironmentMapper.MapMany(envs, resolvedProjectId); + InfisicalEnvironment[] mapped = InfisicalEnvironmentMapper.MapMany(envs, projectId); _logger.Information(Component, "Infisical environment list retrieval was successful."); return mapped; } @@ -57,11 +56,10 @@ namespace PSInfisicalAPI.Environments public InfisicalEnvironment Retrieve(InfisicalConnection connection, string projectId, string environmentSlugOrId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(environmentSlugOrId)) { throw new InfisicalConfigurationException("Environment is required."); } - InfisicalEnvironment[] all = List(connection, resolvedProjectId); + InfisicalEnvironment[] all = List(connection, projectId); foreach (InfisicalEnvironment env in all) { if (string.Equals(env.Id, environmentSlugOrId, StringComparison.OrdinalIgnoreCase) || @@ -77,12 +75,11 @@ namespace PSInfisicalAPI.Environments public InfisicalEnvironment Create(InfisicalConnection connection, string projectId, string name, string slug, int? position) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(name)) { throw new InfisicalConfigurationException("Name is required."); } if (string.IsNullOrEmpty(slug)) { throw new InfisicalConfigurationException("Slug is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId } }; InfisicalEnvironmentCreateRequestDto request = new InfisicalEnvironmentCreateRequestDto { Name = name, Slug = slug, Position = position }; string body = _serializer.Serialize(request); @@ -93,7 +90,7 @@ namespace PSInfisicalAPI.Environments InfisicalEnvironmentSingleResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalEnvironment mapped = InfisicalEnvironmentMapper.Map(dto != null ? dto.Environment : null, resolvedProjectId); + InfisicalEnvironment mapped = InfisicalEnvironmentMapper.Map(dto != null ? dto.Environment : null, projectId); _logger.Information(Component, "Infisical environment creation was successful."); return mapped; } @@ -107,11 +104,10 @@ namespace PSInfisicalAPI.Environments public InfisicalEnvironment Update(InfisicalConnection connection, string projectId, string environmentId, string name, string slug, int? position) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(environmentId)) { throw new InfisicalConfigurationException("EnvironmentId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId }, { "environmentId", environmentId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId }, { "environmentId", environmentId } }; InfisicalEnvironmentUpdateRequestDto request = new InfisicalEnvironmentUpdateRequestDto { Name = name, Slug = slug, Position = position }; string body = _serializer.Serialize(request); @@ -122,7 +118,7 @@ namespace PSInfisicalAPI.Environments InfisicalEnvironmentSingleResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalEnvironment mapped = InfisicalEnvironmentMapper.Map(dto != null ? dto.Environment : null, resolvedProjectId); + InfisicalEnvironment mapped = InfisicalEnvironmentMapper.Map(dto != null ? dto.Environment : null, projectId); _logger.Information(Component, "Infisical environment update was successful."); return mapped; } @@ -136,11 +132,10 @@ namespace PSInfisicalAPI.Environments public void Delete(InfisicalConnection connection, string projectId, string environmentId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(environmentId)) { throw new InfisicalConfigurationException("EnvironmentId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId }, { "environmentId", environmentId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId }, { "environmentId", environmentId } }; try { @@ -156,11 +151,5 @@ namespace PSInfisicalAPI.Environments } } - private static string FirstNonEmpty(params string[] values) - { - if (values == null) { return null; } - foreach (string value in values) { if (!string.IsNullOrEmpty(value)) { return value; } } - return null; - } } } diff --git a/src/PSInfisicalAPI/Folders/InfisicalFolderClient.cs b/src/PSInfisicalAPI/Folders/InfisicalFolderClient.cs index 4722add..88f4d06 100644 --- a/src/PSInfisicalAPI/Folders/InfisicalFolderClient.cs +++ b/src/PSInfisicalAPI/Folders/InfisicalFolderClient.cs @@ -29,16 +29,14 @@ namespace PSInfisicalAPI.Folders public InfisicalFolder[] List(InfisicalConnection connection, string projectId, string environment, string path) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(environment, connection.Environment); - string resolvedPath = FirstNonEmpty(path, connection.DefaultSecretPath, "/"); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(environment)) { throw new InfisicalConfigurationException("Environment is required."); } + string resolvedPath = FirstNonEmpty(path, "/"); List> queryParameters = new List> { - new KeyValuePair("workspaceId", resolvedProjectId), - new KeyValuePair("environment", resolvedEnvironment), + new KeyValuePair("workspaceId", projectId), + new KeyValuePair("environment", environment), new KeyValuePair("path", resolvedPath) }; @@ -49,7 +47,7 @@ namespace PSInfisicalAPI.Folders InfisicalFolderListResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalFolder[] mapped = InfisicalFolderMapper.MapMany(dto != null ? dto.Folders : null, resolvedProjectId, resolvedEnvironment); + InfisicalFolder[] mapped = InfisicalFolderMapper.MapMany(dto != null ? dto.Folders : null, projectId, environment); _logger.Information(Component, "Infisical folder list retrieval was successful."); return mapped; } @@ -80,17 +78,15 @@ namespace PSInfisicalAPI.Folders public InfisicalFolder Create(InfisicalConnection connection, string projectId, string environment, string name, string path) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(environment, connection.Environment); - string resolvedPath = FirstNonEmpty(path, connection.DefaultSecretPath, "/"); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(environment)) { throw new InfisicalConfigurationException("Environment is required."); } if (string.IsNullOrEmpty(name)) { throw new InfisicalConfigurationException("Name is required."); } + string resolvedPath = FirstNonEmpty(path, "/"); InfisicalFolderCreateRequestDto request = new InfisicalFolderCreateRequestDto { - WorkspaceId = resolvedProjectId, - Environment = resolvedEnvironment, + WorkspaceId = projectId, + Environment = environment, Name = name, Path = resolvedPath }; @@ -103,7 +99,7 @@ namespace PSInfisicalAPI.Folders InfisicalFolderSingleResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalFolder mapped = InfisicalFolderMapper.Map(dto != null ? dto.Folder : null, resolvedProjectId, resolvedEnvironment); + InfisicalFolder mapped = InfisicalFolderMapper.Map(dto != null ? dto.Folder : null, projectId, environment); _logger.Information(Component, "Infisical folder creation was successful."); return mapped; } @@ -117,19 +113,17 @@ namespace PSInfisicalAPI.Folders public InfisicalFolder Update(InfisicalConnection connection, string projectId, string environment, string folderId, string name, string path) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(environment, connection.Environment); - string resolvedPath = FirstNonEmpty(path, connection.DefaultSecretPath, "/"); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(environment)) { throw new InfisicalConfigurationException("Environment is required."); } if (string.IsNullOrEmpty(folderId)) { throw new InfisicalConfigurationException("FolderId is required."); } + string resolvedPath = FirstNonEmpty(path, "/"); if (string.IsNullOrEmpty(name)) { throw new InfisicalConfigurationException("Name is required."); } Dictionary pathParameters = new Dictionary { { "folderId", folderId } }; InfisicalFolderUpdateRequestDto request = new InfisicalFolderUpdateRequestDto { - WorkspaceId = resolvedProjectId, - Environment = resolvedEnvironment, + WorkspaceId = projectId, + Environment = environment, Name = name, Path = resolvedPath }; @@ -142,7 +136,7 @@ namespace PSInfisicalAPI.Folders InfisicalFolderSingleResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalFolder mapped = InfisicalFolderMapper.Map(dto != null ? dto.Folder : null, resolvedProjectId, resolvedEnvironment); + InfisicalFolder mapped = InfisicalFolderMapper.Map(dto != null ? dto.Folder : null, projectId, environment); _logger.Information(Component, "Infisical folder update was successful."); return mapped; } @@ -156,18 +150,16 @@ namespace PSInfisicalAPI.Folders public void Delete(InfisicalConnection connection, string projectId, string environment, string folderId, string path) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(environment, connection.Environment); - string resolvedPath = FirstNonEmpty(path, connection.DefaultSecretPath, "/"); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(environment)) { throw new InfisicalConfigurationException("Environment is required."); } if (string.IsNullOrEmpty(folderId)) { throw new InfisicalConfigurationException("FolderId is required."); } + string resolvedPath = FirstNonEmpty(path, "/"); Dictionary pathParameters = new Dictionary { { "folderId", folderId } }; List> queryParameters = new List> { - new KeyValuePair("workspaceId", resolvedProjectId), - new KeyValuePair("environment", resolvedEnvironment), + new KeyValuePair("workspaceId", projectId), + new KeyValuePair("environment", environment), new KeyValuePair("path", resolvedPath) }; diff --git a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs index cda0afc..2735cd6 100644 --- a/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs +++ b/src/PSInfisicalAPI/Pki/InfisicalPkiClient.cs @@ -47,8 +47,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); List source = ParseCaListBody(body); - string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; - InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, fallbackProjectId); + InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical internal certificate authority list retrieval was successful."); return mapped; } @@ -79,8 +78,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); InfisicalInternalCaResponseDto inner = ParseCaSingleBody(body); - string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; - InfisicalCertificateAuthority mapped = InfisicalCaMapper.Map(inner, fallbackProjectId); + InfisicalCertificateAuthority mapped = InfisicalCaMapper.Map(inner, projectId); _logger.Information(Component, "Infisical internal certificate authority retrieval was successful."); return mapped; } @@ -94,12 +92,11 @@ namespace PSInfisicalAPI.Pki public InfisicalCertificateAuthority[] ListAllCertificateAuthorities(InfisicalConnection connection, string projectId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } List> query = new List> { - new KeyValuePair("projectId", resolvedProjectId) + new KeyValuePair("projectId", projectId) }; try @@ -110,7 +107,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); List source = ParseCaListBody(body); - InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, resolvedProjectId); + InfisicalCertificateAuthority[] mapped = InfisicalCaMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical certificate authority list retrieval was successful."); return mapped; } @@ -136,7 +133,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); InfisicalCertificateResponseDto inner = ParseCertificateSingleBody(body); - InfisicalCertificate mapped = InfisicalCertificateMapper.Map(inner, connection.ProjectId); + InfisicalCertificate mapped = InfisicalCertificateMapper.Map(inner, null); _logger.Information(Component, "Infisical certificate retrieval was successful."); return mapped; } @@ -187,10 +184,9 @@ namespace PSInfisicalAPI.Pki { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (query == null) { throw new ArgumentNullException(nameof(query)); } - string resolvedProjectId = FirstNonEmpty(query.ProjectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(query.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + Dictionary pathParameters = new Dictionary { { "projectId", query.ProjectId } }; InfisicalCertificateSearchRequestDto request = BuildSearchRequest(query); string body = _serializer.Serialize(request); @@ -201,7 +197,7 @@ namespace PSInfisicalAPI.Pki InfisicalCertificateSearchResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalCertificate[] mapped = InfisicalCertificateMapper.MapMany(dto != null ? dto.Certificates : null, resolvedProjectId); + InfisicalCertificate[] mapped = InfisicalCertificateMapper.MapMany(dto != null ? dto.Certificates : null, query.ProjectId); int total = dto != null ? dto.TotalCount : mapped.Length; _logger.Information(Component, "Infisical certificate search was successful."); return new InfisicalCertificateSearchResult { Certificates = mapped, TotalCount = total }; @@ -218,13 +214,12 @@ namespace PSInfisicalAPI.Pki if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (string.IsNullOrEmpty(subscriberName)) { throw new InfisicalConfigurationException("SubscriberName is required."); } if (string.IsNullOrEmpty(csrPem)) { throw new InfisicalConfigurationException("CSR is required."); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } Dictionary pathParameters = new Dictionary { { "subscriberName", subscriberName } }; InfisicalSignCertificateBySubscriberRequestDto request = new InfisicalSignCertificateBySubscriberRequestDto { - ProjectId = resolvedProjectId, + ProjectId = projectId, Csr = csrPem }; string body = _serializer.Serialize(request); @@ -373,10 +368,9 @@ namespace PSInfisicalAPI.Pki public InfisicalPkiSubscriber[] ListPkiSubscribers(InfisicalConnection connection, string projectId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId } }; try { @@ -386,7 +380,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); List source = ParsePkiSubscriberListBody(body); - InfisicalPkiSubscriber[] mapped = InfisicalPkiSubscriberMapper.MapMany(source, resolvedProjectId); + InfisicalPkiSubscriber[] mapped = InfisicalPkiSubscriberMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical PKI subscriber list retrieval was successful."); return mapped; } @@ -401,11 +395,10 @@ namespace PSInfisicalAPI.Pki { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (string.IsNullOrEmpty(subscriberName)) { throw new InfisicalConfigurationException("SubscriberName is required."); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } Dictionary pathParameters = new Dictionary { { "subscriberName", subscriberName } }; - List> query = new List> { new KeyValuePair("projectId", resolvedProjectId) }; + List> query = new List> { new KeyValuePair("projectId", projectId) }; try { @@ -414,7 +407,7 @@ namespace PSInfisicalAPI.Pki InfisicalPkiSubscriberResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); - InfisicalPkiSubscriber mapped = InfisicalPkiSubscriberMapper.Map(dto, resolvedProjectId); + InfisicalPkiSubscriber mapped = InfisicalPkiSubscriberMapper.Map(dto, projectId); _logger.Information(Component, "Infisical PKI subscriber retrieval was successful."); return mapped; } @@ -441,12 +434,11 @@ namespace PSInfisicalAPI.Pki public InfisicalCertificateProfile[] ListCertificateProfiles(InfisicalConnection connection, string projectId, int? limit, int? offset, bool? includeConfigs) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } List> query = new List> { - new KeyValuePair("projectId", resolvedProjectId) + new KeyValuePair("projectId", projectId) }; if (limit.HasValue) { query.Add(new KeyValuePair("limit", limit.Value.ToString(CultureInfo.InvariantCulture))); } if (offset.HasValue) { query.Add(new KeyValuePair("offset", offset.Value.ToString(CultureInfo.InvariantCulture))); } @@ -460,7 +452,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); List source = ParseCertificateProfileListBody(body); - InfisicalCertificateProfile[] mapped = InfisicalCertificateProfileMapper.MapMany(source, resolvedProjectId); + InfisicalCertificateProfile[] mapped = InfisicalCertificateProfileMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical certificate profile list retrieval was successful."); return mapped; } @@ -491,8 +483,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); InfisicalCertificateProfileResponseDto inner = ParseCertificateProfileSingleBody(body); - string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; - InfisicalCertificateProfile mapped = InfisicalCertificateProfileMapper.Map(inner, fallbackProjectId); + InfisicalCertificateProfile mapped = InfisicalCertificateProfileMapper.Map(inner, projectId); _logger.Information(Component, "Infisical certificate profile retrieval was successful."); return mapped; } @@ -530,12 +521,11 @@ namespace PSInfisicalAPI.Pki public InfisicalCertificatePolicy[] ListCertificatePolicies(InfisicalConnection connection, string projectId, int? limit, int? offset) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } List> query = new List> { - new KeyValuePair("projectId", resolvedProjectId) + new KeyValuePair("projectId", projectId) }; if (limit.HasValue) { query.Add(new KeyValuePair("limit", limit.Value.ToString(CultureInfo.InvariantCulture))); } if (offset.HasValue) { query.Add(new KeyValuePair("offset", offset.Value.ToString(CultureInfo.InvariantCulture))); } @@ -548,7 +538,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); List source = ParseCertificatePolicyListBody(body); - InfisicalCertificatePolicy[] mapped = InfisicalCertificatePolicyMapper.MapMany(source, resolvedProjectId); + InfisicalCertificatePolicy[] mapped = InfisicalCertificatePolicyMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical certificate policy list retrieval was successful."); return mapped; } @@ -579,8 +569,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); InfisicalCertificatePolicyResponseDto inner = ParseCertificatePolicySingleBody(body); - string fallbackProjectId = !string.IsNullOrEmpty(projectId) ? projectId : connection.ProjectId; - InfisicalCertificatePolicy mapped = InfisicalCertificatePolicyMapper.Map(inner, fallbackProjectId); + InfisicalCertificatePolicy mapped = InfisicalCertificatePolicyMapper.Map(inner, projectId); _logger.Information(Component, "Infisical certificate policy retrieval was successful."); return mapped; } @@ -643,14 +632,13 @@ namespace PSInfisicalAPI.Pki public InfisicalCertificateApplication[] ListCertificateApplications(InfisicalConnection connection, string projectId, int? limit, int? offset) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } List> query = new List>(); if (limit.HasValue) { query.Add(new KeyValuePair("limit", limit.Value.ToString(CultureInfo.InvariantCulture))); } if (offset.HasValue) { query.Add(new KeyValuePair("offset", offset.Value.ToString(CultureInfo.InvariantCulture))); } - Dictionary headers = BuildProjectHeader(resolvedProjectId); + Dictionary headers = BuildProjectHeader(projectId); try { @@ -660,7 +648,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); List source = ParseApplicationListBody(body); - InfisicalCertificateApplication[] mapped = InfisicalCertificateApplicationMapper.MapMany(source, resolvedProjectId); + InfisicalCertificateApplication[] mapped = InfisicalCertificateApplicationMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical certificate application list retrieval was successful."); return mapped; } @@ -677,8 +665,7 @@ namespace PSInfisicalAPI.Pki if (string.IsNullOrEmpty(applicationId)) { throw new InfisicalConfigurationException("ApplicationId is required."); } Dictionary pathParameters = new Dictionary { { "applicationId", applicationId } }; - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - Dictionary headers = !string.IsNullOrEmpty(resolvedProjectId) ? BuildProjectHeader(resolvedProjectId) : null; + Dictionary headers = !string.IsNullOrEmpty(projectId) ? BuildProjectHeader(projectId) : null; try { @@ -688,7 +675,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); InfisicalCertificateApplicationResponseDto inner = ParseApplicationSingleBody(body); - InfisicalCertificateApplication mapped = InfisicalCertificateApplicationMapper.Map(inner, resolvedProjectId); + InfisicalCertificateApplication mapped = InfisicalCertificateApplicationMapper.Map(inner, projectId); _logger.Information(Component, "Infisical certificate application retrieval was successful."); return mapped; } @@ -703,11 +690,10 @@ namespace PSInfisicalAPI.Pki { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (string.IsNullOrEmpty(name)) { throw new InfisicalConfigurationException("ApplicationName is required."); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } Dictionary pathParameters = new Dictionary { { "name", name } }; - Dictionary headers = BuildProjectHeader(resolvedProjectId); + Dictionary headers = BuildProjectHeader(projectId); try { @@ -717,7 +703,7 @@ namespace PSInfisicalAPI.Pki response.Clear(); InfisicalCertificateApplicationResponseDto inner = ParseApplicationSingleBody(body); - InfisicalCertificateApplication mapped = InfisicalCertificateApplicationMapper.Map(inner, resolvedProjectId); + InfisicalCertificateApplication mapped = InfisicalCertificateApplicationMapper.Map(inner, projectId); _logger.Information(Component, "Infisical certificate application (by name) retrieval was successful."); return mapped; } @@ -734,8 +720,7 @@ namespace PSInfisicalAPI.Pki if (string.IsNullOrEmpty(applicationId)) { throw new InfisicalConfigurationException("ApplicationId is required."); } Dictionary pathParameters = new Dictionary { { "applicationId", applicationId } }; - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - Dictionary headers = !string.IsNullOrEmpty(resolvedProjectId) ? BuildProjectHeader(resolvedProjectId) : null; + Dictionary headers = !string.IsNullOrEmpty(projectId) ? BuildProjectHeader(projectId) : null; try { @@ -767,8 +752,7 @@ namespace PSInfisicalAPI.Pki { "applicationId", applicationId }, { "profileId", profileId } }; - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - Dictionary headers = !string.IsNullOrEmpty(resolvedProjectId) ? BuildProjectHeader(resolvedProjectId) : null; + Dictionary headers = !string.IsNullOrEmpty(projectId) ? BuildProjectHeader(projectId) : null; try { diff --git a/src/PSInfisicalAPI/Projects/InfisicalProjectClient.cs b/src/PSInfisicalAPI/Projects/InfisicalProjectClient.cs index a0c5e28..900f29a 100644 --- a/src/PSInfisicalAPI/Projects/InfisicalProjectClient.cs +++ b/src/PSInfisicalAPI/Projects/InfisicalProjectClient.cs @@ -27,13 +27,25 @@ namespace PSInfisicalAPI.Projects } public InfisicalProject[] List(InfisicalConnection connection) + { + return List(connection, null, false); + } + + public InfisicalProject[] List(InfisicalConnection connection, string type, bool includeRoles) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } + List> queryParameters = new List>(); + queryParameters.Add(new KeyValuePair("includeRoles", includeRoles ? "true" : "false")); + if (!string.IsNullOrEmpty(type)) + { + queryParameters.Add(new KeyValuePair("type", type)); + } + try { _logger.Information(Component, "Attempting to list Infisical projects. Please Wait..."); - InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.ListProjects, "ListProjects", null, null, null); + InfisicalHttpResponse response = _invoker.Invoke(connection, InfisicalEndpointNames.ListProjects, "ListProjects", null, queryParameters, null); InfisicalProjectListResponseDto dto = _serializer.Deserialize(response.Body); response.Clear(); diff --git a/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs b/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs index fb386ac..f13bc53 100644 --- a/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs +++ b/src/PSInfisicalAPI/Secrets/InfisicalSecretsClient.cs @@ -32,13 +32,11 @@ namespace PSInfisicalAPI.Secrets if (connection == null) { throw new ArgumentNullException(nameof(connection)); } if (query == null) { throw new ArgumentNullException(nameof(query)); } - string resolvedProjectId = FirstNonEmpty(query.ProjectId, connection.ProjectId); - List> queryParameters = new List>(); - AddIfNotNull(queryParameters, "workspaceId", resolvedProjectId); - AddIfNotNull(queryParameters, "projectId", resolvedProjectId); - AddIfNotNull(queryParameters, "environment", FirstNonEmpty(query.Environment, connection.Environment)); - AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, connection.DefaultSecretPath, "/")); + AddIfNotNull(queryParameters, "workspaceId", query.ProjectId); + AddIfNotNull(queryParameters, "projectId", query.ProjectId); + AddIfNotNull(queryParameters, "environment", query.Environment); + AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, "/")); queryParameters.Add(new KeyValuePair("recursive", query.Recursive ? "true" : "false")); if (query.IncludeImports.HasValue) { queryParameters.Add(new KeyValuePair("includeImports", query.IncludeImports.Value ? "true" : "false")); } if (query.IncludePersonalOverrides) { queryParameters.Add(new KeyValuePair("includePersonalOverrides", "true")); } @@ -96,13 +94,11 @@ namespace PSInfisicalAPI.Secrets Dictionary pathParameters = new Dictionary { { "secretName", query.SecretName } }; - string resolvedProjectId = FirstNonEmpty(query.ProjectId, connection.ProjectId); - List> queryParameters = new List>(); - AddIfNotNull(queryParameters, "workspaceId", resolvedProjectId); - AddIfNotNull(queryParameters, "projectId", resolvedProjectId); - AddIfNotNull(queryParameters, "environment", FirstNonEmpty(query.Environment, connection.Environment)); - AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, connection.DefaultSecretPath, "/")); + AddIfNotNull(queryParameters, "workspaceId", query.ProjectId); + AddIfNotNull(queryParameters, "projectId", query.ProjectId); + AddIfNotNull(queryParameters, "environment", query.Environment); + AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, "/")); AddIfNotNull(queryParameters, "type", string.IsNullOrEmpty(query.Type) ? "shared" : query.Type.ToLowerInvariant()); if (query.Version.HasValue) { queryParameters.Add(new KeyValuePair("version", query.Version.Value.ToString(CultureInfo.InvariantCulture))); } if (query.ViewSecretValue.HasValue) { queryParameters.Add(new KeyValuePair("viewSecretValue", query.ViewSecretValue.Value ? "true" : "false")); } @@ -143,17 +139,15 @@ namespace PSInfisicalAPI.Secrets if (string.IsNullOrEmpty(request.SecretName)) { throw new InfisicalConfigurationException("SecretName is required."); } if (request.SecretValue == null) { throw new InfisicalConfigurationException("SecretValue is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(request.Environment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.Environment)) { throw new InfisicalConfigurationException("Environment is required."); } Dictionary pathParameters = new Dictionary { { "secretName", request.SecretName } }; InfisicalSecretCreateRequestDto dtoRequest = new InfisicalSecretCreateRequestDto { - WorkspaceId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = FirstNonEmpty(request.SecretPath, connection.DefaultSecretPath, "/"), + WorkspaceId = request.ProjectId, + Environment = request.Environment, + SecretPath = FirstNonEmpty(request.SecretPath, "/"), Type = string.IsNullOrEmpty(request.Type) ? "shared" : request.Type.ToLowerInvariant(), SecretValue = request.SecretValue, SecretComment = request.SecretComment, @@ -186,17 +180,15 @@ namespace PSInfisicalAPI.Secrets if (request == null) { throw new ArgumentNullException(nameof(request)); } if (string.IsNullOrEmpty(request.SecretName)) { throw new InfisicalConfigurationException("SecretName is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(request.Environment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.Environment)) { throw new InfisicalConfigurationException("Environment is required."); } Dictionary pathParameters = new Dictionary { { "secretName", request.SecretName } }; InfisicalSecretUpdateRequestDto dtoRequest = new InfisicalSecretUpdateRequestDto { - WorkspaceId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = FirstNonEmpty(request.SecretPath, connection.DefaultSecretPath, "/"), + WorkspaceId = request.ProjectId, + Environment = request.Environment, + SecretPath = FirstNonEmpty(request.SecretPath, "/"), Type = string.IsNullOrEmpty(request.Type) ? "shared" : request.Type.ToLowerInvariant(), SecretValue = request.SecretValue, SecretComment = request.SecretComment, @@ -230,10 +222,8 @@ namespace PSInfisicalAPI.Secrets if (request == null) { throw new ArgumentNullException(nameof(request)); } if (request.Secrets == null || request.Secrets.Length == 0) { throw new InfisicalConfigurationException("At least one secret is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(request.Environment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.Environment)) { throw new InfisicalConfigurationException("Environment is required."); } List items = new List(request.Secrets.Length); foreach (InfisicalBulkCreateSecretItem item in request.Secrets) @@ -253,10 +243,10 @@ namespace PSInfisicalAPI.Secrets InfisicalSecretBatchCreateRequestDto dtoRequest = new InfisicalSecretBatchCreateRequestDto { - WorkspaceId = resolvedProjectId, - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = FirstNonEmpty(request.SecretPath, connection.DefaultSecretPath, "/"), + WorkspaceId = request.ProjectId, + ProjectId = request.ProjectId, + Environment = request.Environment, + SecretPath = FirstNonEmpty(request.SecretPath, "/"), Secrets = items }; string body = _serializer.Serialize(dtoRequest); @@ -285,10 +275,8 @@ namespace PSInfisicalAPI.Secrets if (request == null) { throw new ArgumentNullException(nameof(request)); } if (request.Secrets == null || request.Secrets.Length == 0) { throw new InfisicalConfigurationException("At least one secret is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(request.Environment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.Environment)) { throw new InfisicalConfigurationException("Environment is required."); } List items = new List(request.Secrets.Length); foreach (InfisicalBulkUpdateSecretItem item in request.Secrets) @@ -309,10 +297,10 @@ namespace PSInfisicalAPI.Secrets InfisicalSecretBatchUpdateRequestDto dtoRequest = new InfisicalSecretBatchUpdateRequestDto { - WorkspaceId = resolvedProjectId, - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = FirstNonEmpty(request.SecretPath, connection.DefaultSecretPath, "/"), + WorkspaceId = request.ProjectId, + ProjectId = request.ProjectId, + Environment = request.Environment, + SecretPath = FirstNonEmpty(request.SecretPath, "/"), Mode = request.Mode, Secrets = items }; @@ -342,10 +330,8 @@ namespace PSInfisicalAPI.Secrets if (request == null) { throw new ArgumentNullException(nameof(request)); } if (request.SecretNames == null || request.SecretNames.Length == 0) { throw new InfisicalConfigurationException("At least one secret name is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(request.Environment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.Environment)) { throw new InfisicalConfigurationException("Environment is required."); } List items = new List(request.SecretNames.Length); foreach (string name in request.SecretNames) @@ -356,10 +342,10 @@ namespace PSInfisicalAPI.Secrets InfisicalSecretBatchDeleteRequestDto dtoRequest = new InfisicalSecretBatchDeleteRequestDto { - WorkspaceId = resolvedProjectId, - ProjectId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = FirstNonEmpty(request.SecretPath, connection.DefaultSecretPath, "/"), + WorkspaceId = request.ProjectId, + ProjectId = request.ProjectId, + Environment = request.Environment, + SecretPath = FirstNonEmpty(request.SecretPath, "/"), Secrets = items }; string body = _serializer.Serialize(dtoRequest); @@ -384,13 +370,11 @@ namespace PSInfisicalAPI.Secrets if (request == null) { throw new ArgumentNullException(nameof(request)); } if (request.SecretIds == null || request.SecretIds.Length == 0) { throw new InfisicalConfigurationException("At least one SecretId is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedSourceEnv = FirstNonEmpty(request.SourceEnvironment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedSourceEnv)) { throw new InfisicalConfigurationException("SourceEnvironment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.SourceEnvironment)) { throw new InfisicalConfigurationException("SourceEnvironment is required."); } if (string.IsNullOrEmpty(request.DestinationEnvironment)) { throw new InfisicalConfigurationException("DestinationEnvironment is required."); } - string resolvedSourcePath = FirstNonEmpty(request.SourceSecretPath, connection.DefaultSecretPath, "/"); + string resolvedSourcePath = FirstNonEmpty(request.SourceSecretPath, "/"); string resolvedDestPath = FirstNonEmpty(request.DestinationSecretPath, resolvedSourcePath); InfisicalSecretDuplicateAttributesDto attributes = null; @@ -407,8 +391,8 @@ namespace PSInfisicalAPI.Secrets InfisicalSecretDuplicateRequestDto dtoRequest = new InfisicalSecretDuplicateRequestDto { - ProjectId = resolvedProjectId, - SourceEnvironment = resolvedSourceEnv, + ProjectId = request.ProjectId, + SourceEnvironment = request.SourceEnvironment, DestinationEnvironment = request.DestinationEnvironment, SourceSecretPath = resolvedSourcePath, DestinationSecretPath = resolvedDestPath, @@ -454,17 +438,15 @@ namespace PSInfisicalAPI.Secrets if (request == null) { throw new ArgumentNullException(nameof(request)); } if (string.IsNullOrEmpty(request.SecretName)) { throw new InfisicalConfigurationException("SecretName is required."); } - string resolvedProjectId = FirstNonEmpty(request.ProjectId, connection.ProjectId); - string resolvedEnvironment = FirstNonEmpty(request.Environment, connection.Environment); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - if (string.IsNullOrEmpty(resolvedEnvironment)) { throw new InfisicalConfigurationException("Environment is required."); } + if (string.IsNullOrEmpty(request.ProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(request.Environment)) { throw new InfisicalConfigurationException("Environment is required."); } Dictionary pathParameters = new Dictionary { { "secretName", request.SecretName } }; InfisicalSecretDeleteRequestDto dtoRequest = new InfisicalSecretDeleteRequestDto { - WorkspaceId = resolvedProjectId, - Environment = resolvedEnvironment, - SecretPath = FirstNonEmpty(request.SecretPath, connection.DefaultSecretPath, "/"), + WorkspaceId = request.ProjectId, + Environment = request.Environment, + SecretPath = FirstNonEmpty(request.SecretPath, "/"), Type = string.IsNullOrEmpty(request.Type) ? "shared" : request.Type.ToLowerInvariant() }; string body = _serializer.Serialize(dtoRequest); diff --git a/src/PSInfisicalAPI/Tags/InfisicalTagClient.cs b/src/PSInfisicalAPI/Tags/InfisicalTagClient.cs index 9430ae2..2eec1bf 100644 --- a/src/PSInfisicalAPI/Tags/InfisicalTagClient.cs +++ b/src/PSInfisicalAPI/Tags/InfisicalTagClient.cs @@ -29,10 +29,9 @@ namespace PSInfisicalAPI.Tags public InfisicalTag[] List(InfisicalConnection connection, string projectId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId } }; try { @@ -42,7 +41,7 @@ namespace PSInfisicalAPI.Tags response.Clear(); List source = dto != null ? (dto.WorkspaceTags ?? dto.Tags) : null; - InfisicalTag[] mapped = InfisicalTagMapper.MapMany(source, resolvedProjectId); + InfisicalTag[] mapped = InfisicalTagMapper.MapMany(source, projectId); _logger.Information(Component, "Infisical tag list retrieval was successful."); return mapped; } @@ -56,11 +55,10 @@ namespace PSInfisicalAPI.Tags public InfisicalTag Retrieve(InfisicalConnection connection, string projectId, string tagSlugOrId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(tagSlugOrId)) { throw new InfisicalConfigurationException("Tag slug or id is required."); } - InfisicalTag[] all = List(connection, resolvedProjectId); + InfisicalTag[] all = List(connection, projectId); foreach (InfisicalTag tag in all) { if (string.Equals(tag.Id, tagSlugOrId, StringComparison.OrdinalIgnoreCase) || @@ -76,11 +74,10 @@ namespace PSInfisicalAPI.Tags public InfisicalTag Create(InfisicalConnection connection, string projectId, string slug, string name, string color) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(slug)) { throw new InfisicalConfigurationException("Slug is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId } }; InfisicalTagCreateRequestDto request = new InfisicalTagCreateRequestDto { Slug = slug, Name = name, Color = color }; string body = _serializer.Serialize(request); @@ -92,7 +89,7 @@ namespace PSInfisicalAPI.Tags response.Clear(); InfisicalTagResponseDto inner = dto != null ? (dto.WorkspaceTag ?? dto.Tag) : null; - InfisicalTag mapped = InfisicalTagMapper.Map(inner, resolvedProjectId); + InfisicalTag mapped = InfisicalTagMapper.Map(inner, projectId); _logger.Information(Component, "Infisical tag creation was successful."); return mapped; } @@ -106,11 +103,10 @@ namespace PSInfisicalAPI.Tags public InfisicalTag Update(InfisicalConnection connection, string projectId, string tagId, string slug, string name, string color) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(tagId)) { throw new InfisicalConfigurationException("TagId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId }, { "tagId", tagId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId }, { "tagId", tagId } }; InfisicalTagUpdateRequestDto request = new InfisicalTagUpdateRequestDto { Slug = slug, Name = name, Color = color }; string body = _serializer.Serialize(request); @@ -122,7 +118,7 @@ namespace PSInfisicalAPI.Tags response.Clear(); InfisicalTagResponseDto inner = dto != null ? (dto.WorkspaceTag ?? dto.Tag) : null; - InfisicalTag mapped = InfisicalTagMapper.Map(inner, resolvedProjectId); + InfisicalTag mapped = InfisicalTagMapper.Map(inner, projectId); _logger.Information(Component, "Infisical tag update was successful."); return mapped; } @@ -136,11 +132,10 @@ namespace PSInfisicalAPI.Tags public void Delete(InfisicalConnection connection, string projectId, string tagId) { if (connection == null) { throw new ArgumentNullException(nameof(connection)); } - string resolvedProjectId = FirstNonEmpty(projectId, connection.ProjectId); - if (string.IsNullOrEmpty(resolvedProjectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } + if (string.IsNullOrEmpty(projectId)) { throw new InfisicalConfigurationException("ProjectId is required."); } if (string.IsNullOrEmpty(tagId)) { throw new InfisicalConfigurationException("TagId is required."); } - Dictionary pathParameters = new Dictionary { { "projectId", resolvedProjectId }, { "tagId", tagId } }; + Dictionary pathParameters = new Dictionary { { "projectId", projectId }, { "tagId", tagId } }; try { @@ -156,11 +151,5 @@ namespace PSInfisicalAPI.Tags } } - private static string FirstNonEmpty(params string[] values) - { - if (values == null) { return null; } - foreach (string value in values) { if (!string.IsNullOrEmpty(value)) { return value; } } - return null; - } } } From 56be777095e354ff93f5af071de52a5047245d1b Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 21:17:13 -0400 Subject: [PATCH 27/27] Build artifacts for cffda99591c9 Auto-generated by build.ps1 -CommitArtifacts. Build 2026.06.05.0117. Module DLL and manifest embed BuildCommitHash=cffda99591c9, matching the source commit they were produced from. --- CHANGELOG.md | 6 + Module/PSInfisicalAPI/PSInfisicalAPI.psd1 | 4 +- Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll | Bin 371712 -> 368640 bytes .../bin/en-US/PSInfisicalAPI.dll-Help.xml | 228 +++++++++--------- 4 files changed, 123 insertions(+), 115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83d2519..ff6b704 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos ## Unreleased +## 2026.06.05.0117 + +- Build produced from commit cffda99591c9. + +## Unreleased (carried forward) + ## 2026.06.05.0015 - Build produced from commit fb27ab8a8503. diff --git a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 index 0f9f952..a9c70cf 100644 --- a/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 +++ b/Module/PSInfisicalAPI/PSInfisicalAPI.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'PSInfisicalAPI.psm1' - ModuleVersion = '2026.06.04.2335' + ModuleVersion = '2026.06.05.0117' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' Author = 'Grace Solutions' CompanyName = 'Grace Solutions' @@ -63,7 +63,7 @@ LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' - CommitHash = '3c39a99b9a4c' + CommitHash = 'cffda99591c9' } } } \ No newline at end of file diff --git a/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll b/Module/PSInfisicalAPI/bin/PSInfisicalAPI.dll index babeb120fc24376439c50159cd7ef13b0ce8da17..fd0a3936bc5733656476fd03a12954acb6f69181 100644 GIT binary patch literal 368640 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
LRC0Ek#X2mtvO5CXsg3kU&Vp#_8hu*d>J09b4R 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
&_p+(PzsvpXzF%E za#&N{nR*^^!l<_^F9n^3UP_nGpJKzlEd2QdDLywi?-1#U3u|rtCv;y5YM(c z$&>#Z^NxbHdLy;gyrZD4-bEpv?eqZ(@ocA$QYeG%^%)9fu)V(O$~#{NJ+x$@%KRd22IA)a0JUQh1ILRWo=!pcHdeVjr(yXo^3;@M5#aOEAdyPi?` z!!f(-d7j*F+;-Q?DEzLwUP~dKJ@h6D@$8{@Q`n*Sr9MbuhvJv|74V>7|!>@}Eo?65dNEQFjtzj5bmKCX5a5t#?srrcE+BNTC((qmNQ( zh5P8URJF2$Li*|}RHL%PjqXs`h4__zL}3@=SNau&osIpp`2eUp)4u1aBt;vijz!Vbm3x(S6H zii34Dg&m4RbY}`X6o=^E6m}>M)q^PPP#mgbDeO=jroX1JLvfg%Mq!8Ia6Om84#nYm zDTN)1BlH>yI}}IgjTCk$j?_CT>`)x34^Y^l7^8osutPCMpP{frF;@RhVTWR@zD;3= z;wb%)!Vbkz`Xz-OigDU}dezM%>`;u;DJbkv9Iew+*r7ODXQ!}3ag6?y!VbkTx`->U ze8%gou41hR^Jav{>tT^NL#*X5KO=ms?pMRpohCEF$LV}EJw0qXKm2Q*x|Sz<{;KdP zdYP*Pt3tC4;R!l*ZG?Gu_-E(}RNjgZc#J z?jO__Da^;_>pv*W$L8z%)RkJvVGHy#>S?VLM*mWWMsV$R} z!xrg}sKb*_80Dt0uX3@@Phnr>VjVIT#lGdEnO zn^W`6+;Ew0Pgx_A!C+h^&)(OUgm|lSF}YZxr%q^uv_#-3Uk;kdKZOx>Q;S# z!aQ}WK1yN4xlNy;Fyh>%uTVG3zYE{4Z&OdpI}zLUBPyy*>WCfsCDo!$1|#!PU$@j@ zg=eQuL1Bewr_MlOp1MnCr!Y_5rSnplr|#B;Da=!M>tG7=qdmF|h56AQU6sNdZ?CRR zVUD*~H*@9X%8$BC6T~dmS{Iou;z!-4si*FdNh$X0oXtE{Y5jS`em&2XSNr$t^`6{u z!G67+!nk0+-bdkn#{qqW!u^f|`V@t-bWmTSP?iqrn-uPa{H*_?a4+O%{nC{e>q9!` z3pYL8oIa$-d2-`&NKd5@mqU6Eh4cNQ7gIRjFM2hFmgulvPoX6`tanftOC8bsD2%0! z=ww%3T#|L8<{#pctXq2We;Tm^PST5T7Ed+Dc#JI+gqH{Z7B2>r*v0pdM$G| zN%x_a)-rdK^bl%;*@=EekD`7tJJHYR2~^=pK@n&5bgJ~EaHDw?cAKBm%P8zNKd0AH zC==)PCJJTZyxvWrOkB_hDU^u|`WS`Y>7qVMp?A8duTtopF6lcIdZ$bJF@@gZvVKLO zx43LRmE@+9|9aizu-|n`>P_7fMj5FG=H2F3bPnp3dAIo$ozIn*)>rkQ=nrXqRmXVp zqnusU<0zD~t2%+ITi$%@P0yiFSFY(L6!sur*Q+V)LB6gxP)M^s^bQJX_J`i@%8Sbl zU8~K9xZKc(O;GS+lp)I(l zJ5Y${pSlNyc>bvex$@$9UuSCfA)fbjPEYO}=)TTJAujiIAcbT8rAtvb=3lykEAN;O z^dT?IZ3iFd-}sjpkv-7oDAchB`Wh8$o<4l2?@|fo>BEQm359fdq+e5r%Ofq@yRr5o zT^{RH6w>9f&P1U;JkdER)Q2bfGYa+LsSc!2AD-$E3iaWcE=Qq0Jk!-FT>Ia;E`@9V zTQ_s%UHfw#-0?$tKG$VD`D4u7>A9{#jW=_r=ejn9>wBRaQ@Fktx;2IKz0{p3obRRX z?aDjfD{VgIjy~K?>sQ+E$-myzu~#}Bb;#7QS2`Q@r&)h_tv{i(xj*(=7ow_|w)G!f zf@)>j)_-&ag?PTvl_|vYjjly~JgsWPzq%1sa9T~HRutB=-s+AN*0bK~o)n&Me5VIc zc)szS9!cT(M$0#r!t;%mZz_f78-;H+h36ZEZ!v{uEp6W_3eQ^FzV#HIwUoZ?6rQz| zzI_y)i&VZN6rPJzzEf1kisnmmzDrb}isnmmzME9cMDwLN-(S?^iRMdlzULI)ukZ7{ zrSN`zpU>CXE4wdh#|XbKfRbiD;P+*vwww3sr|{*W_M7+Xr|=b|@Dy)KUvUag@uu{J zQ+P*DDqkfE@90V8t4ZMxyZ7Us8C7a9Uq~3hxk3 z>l;BiWg^lC_~NMyWeQmVzA0306PC_5iwZVj>3oZ*{Y}k%L*Gj3x2ER4q3;I@qu30- zZ4^ea8GJuc7{zAv9i}jf&FDKxVHBImcag#EZAQ3Rd|9X;RwjpK_2s7at~_B>fGXC=-0|}TQI*Wy zz-+!Ss0pEEFZ9zfbH41G(LEk+J-)$-6 zdqUy6EroplP*~e8?2~=mxVXFIDy4nLD11kywC@~+@2G_Ou2T4pN~rHHh3}|@ z`5sgFj!KyCHH9_taG%}R%Ok9bhx<}dSQC%%Wu&ks9^uPL;XXncUp@-=5z6?2TzO@; ztZ&>`UirMbIzFPTFQMOu5?RhS$CE$LBJ=!%Z!uNOtZtR_t)_6lxV&#Yg}HWl-wq0M z?Fznq6z19$e96?u)67#1zEf1eY381r?=po}s*>*}g;uJP?*WBYs@1+uIaTQ-W3cY<*UsejeeN|sRS6)g~^F12irNr+eCq-2ART=1MoVoVuzI(2` zkwA5yHOM;yM!3~|ehMSp>b~?8dh|$NHVU;k()THak$9A^5QUL=l&>U(5qu3_1cecN z4PO-sv*en-S`=omPP{X4siZ~N0uAqRRMv%?~W}9SbXqs3vSF^S()BY$o>&{;7{#vtcnU$7x zf8XzCUOYHv_2_oJJ$n3p`FQw!?)&qd@62~*XLo1!Eaynd_F-S-GXzKA5>ow~8b)m+96>lG%q7tT80B4<}grlFZfNiPrukb9H#4btuVP zHJ@ZnBAKh^ldNMUW%Hb2J)QN*JZD%bOPcM?uzo}`+nZtioMh(te(M#Indkeh{AJlb zn0L@8TZ2jF9rVf89;DQ>4xDN2P5QMrT&MjcWpkNjZOi&(F0-udENQN&XIVQ)=8Afj z^(B&d*V<=&on+p%_F3O0nRl(HSU(_{cde&b|A%DWwa&KwlVskt&bD4Ay;E;*j-@Wo z_Gpsc-W;n)GVf?lwMLN4JK9sNF(h-$PP5)hGRN#RYk!itkLFs3kj#BF*P28!SMaA> zQ%L3t{&Z_P$y~voVa+0$EBG_4Gf3tN{!Hr}lDUFE)4G6U-qE_&B_#8X*0p?+c}MG6 z*OJUTTF=@bDZ3xevR=AE_Fe9Wv#eLMBvMw3?QPmSuxVwA*2XTD3US0w#M(Hz}NEOoUR z_aC_zk9~CFCDv+5*^-x88?ruG@-l1lfF&=p#$98^WlLUR9VBVJ8ZzxW6R)szhyL%; zVP*>}cBO8!g%y^2t&EdzL|$VpB$;nSUSlmGnR9ogwUlJe-IdmdNah=n*IL(+%r_#h zwbql&HzFI>CX)F^WW(A@x=?>3@;Yl9>3aQ*$m^_oN#+}otE`7e<{Oc#tVc=a8c88EXk6$T3t8nUNW+VO3IdutWjB#B_k^wu;f<>%0MdpRz8d&#d!P)}{e{cUfCrleV$s1ij>4R$<-l zefYFB0taBPlyBpS8X)V9C!~kFw<1`nY`7Y7JO&yY-y`OK!Km&yqK*v6Hr2KO}uL zx9_BTt)C27@;>XA^qrb}p>&@$Y=fC+w)M|hdr8Wkmp*4zB&|^YuDAXD!*OM||G;-hjRbt>*@ed(f)f zwEKAOunv&4LYZ+ptjn`L{Y`uQFNdrZq_a-f|8mG$P5R7SKlcS|1Ic{i{RQizB=cPG zMeBBwc`o>(byt?;ks4d~(Ra}Ju3T(=fiz+Klfz@{%OvyLOA_mGlKJf=iS;yTi+(Qu z7b_)g*RRF@Vs%L7dw>sHKPQ>*0X}T~CQGvQN38tKyZ8MOYpA3Z${f!}tlEISFIh9` zGsopi)|LT%k6POXjC<7T4Cwo^_0oWGU$!p3W%u^JV)>G??R~|1Xh2`f`U-t!doAlt zAC_@)KYZ2Nhh*-DuUg|s=6?8^br8wi4_~v!lg$0_nB|bn{qUG|T$bcWeBFBgYtmdv zW@ZOZ`nrCl%&9vzDV0~pTw-n?InUgF|B%<-E~v)fKdk)V{rZzDGS%eC_fDdDZJu*)qNI8Zq#-_3!_z%bsVlXPEPEFnjm+Kj**Y3@~rsBw%({C@aNBg zH)<X8rn;5PiLoSL@}v;&HiF$ttsEn%-AWHN6+e?FA>8ifQxe zM*U83*KIS0Y$n;9v-+;v=AGlN_l$pU_vRZlpX{E!R9|ZqRAGg=r><<6V`5tUzI*Pj z+c{;H%&GK)rf#m^3hLHgvwSuavxdB^A*Vul6*l+&u6xj&IbCYTb!H9OxpDUzbNi8N zOq;FY53dGa`x(ghddwCFUIz}m?a3!6+12L2_Vw4&d&xO$#&)UO^%=73nloF!sdUMC z-mMejmNJi^LGlPH$|Gp7Y-NaSWvFarn5?;%H4nUM&2I1BiyYV3yO$}b zc%#{i#k%cQzmfN$S?>pBR@rfT{ZTUYfn#?anWu*CKJu?0^~6QHkKvzM!$rm2Ysh9| zKC^o5z4`iOvWhv9U9Y*{ch_^&2hJ+HoxOX?&a3Rb#vAo``QKj8pMRGA-`@J)=lb6v z&*bL$yr3?SN9bxftIh3QSD62}+Wh;x@BT5Xe;k2-9D#ovfxpcWsOc-Qyc+j$^GcCz z@%5Fz%}lbNNoDQdW{ZDnE9Tu+UR94Uua*DZ+aHsk(|!IFb3D!1F4kizd8ris$~6z1 z$)XScHFF!dhU_zK^A2LyRcrRi_Wk-jNSA!3-7TMK_vowTQpr-jyc5Z;MgNi|vroLU z<^R~H+@(?v>m2y0_%WB5pIx4@+{`MQ;pmT<ZchlK%$gcKx*SpoJ`aRLE z<3F%B`w8`*8oRfC-?8f_)PH`NtoQHddVcq{dO>~RREd2N9aH+iRWItOpw{z+*Y0c5d>9akr&!ueau8OJub^B|Mc}~4}{qFXWJI(F) z9%)+hX+vI3?=!c@=}(sO>ilWucJ>T!wwPDnl20HfU14sI?=rpFOtSB#{B^T>qeeZv zZ1;TLsCE9&)}uc)R(HxLwC349FP|3bYmYyuzP2NWg{07(SE9SjPUcS>+;G4{^ zubB7RyFNECy~8sAN59^Ilq;kY-Z1&=5|3Hr=K~qpF8K&pQ^upK5taz zDS7podb&B<18<)w*N}gzU2%q4K703l|2r{n|!u9IWfhabu~(Q$Ew4Zb@YDUd)q6zGHuxJ)xm`iZ0*X8FKnFJ zqbnOeJ}CF|!jngrbBT(kzCCw<9`$?GlCdpy?Ma8`TI#*;pP<_dPjYg5b(t;d`en!F zs$J{X&CUhN{H-jr-FdpQW!;6jood}her}SiXQvuG-_NyWZ95BH*WIXZkH6>^z5GQp zP5sekk2<*PKNoDtjqm!8!pC*{-NLrq6#dsPAIKftHS$xjuCxk|=BDX2Je`{<>zONi zG+*{;rtHy7*^9-}yI3lVrQ&prJ?4VEIZ7AjFOpHqWYkqE`ot^xcfaj3E!4elI_(6t zTCJS6JwKx>n)>zp2EF|6^^yGe#&&+QzMa#z51gz24za9xv${R>^=)(9w#pW_$(pyz znzza_TcvkIE}A;NutV1Nh>Utf^`17T@R;0wOm2T$)^L?>Pf*{Mu^ZH7)4FmS^xR(2 z_w3=zK2vx`ulW((ntN?$VgF6~uMNsFlVq8C*JU$aEj*{!VCGr5Ykt>rvYzK;D=$d> z1*yCsm6xRQl2l%j%24KG*6^6rhsx1-RqE!R-M{-)neD53Y>(>7nKNo=&YV%N%JMr4 z(@&V!JxZU+Pv^$U`MjSjbAT)}HfPSdu{m?Z4$YaPcc|{2&@)MTC*{n3O_5R4WYkQl zPmxhmWYk>goiDwMrFX9M&XwMaq<5M0UM0O3N$*9{yFp#@kyrFzrT^(kzv~&Vmn>N0 zbLKY>IQn)@)pTnfP5D`)EGIWu|9+08T}SBOjD?y1+ogA_^lp{j8M&2{Z?$&FGL5domu<5ik!5zsGCSlr>|n{Su6x9KOqTq%tnC?D z@-bQRF_yV*|NcRDcbQ|pBsbxR({+8?u=%=OuOIu*$+ljQZFz+Q-nVX0Gxwj)M+UXz z879$>^gUIp>yDE@HmKG0^idxh^hDP?*Bqsu=-Phg9fNjuUA^_LLF04gcN@N>w|jB^ zRlT+eJzaToR=lLQ(p&7xn|t9ncv&c?mF!< z{qIMmvMx93jw_3uuC)`d*6jmVuP(03eedw~x=pYDNHN!a__DCLQP2G2#VBWfSH$?- z?wQ+^gHnq@vqB2JhAV=*GQuJO1*w4z70JlOLzsPw4hw-E010=zYr$)VIwt2g@>! zjIHVRu)&Vh9jVXImG=!Enm216C2cErYhm2rR_+yPKQHZ~C?(s{z zhivRV{p23CRNvQc8!|%AVO#MfxgTHBN4Qtt3!|6rKV+}`OLGs_z2?5yEB}+*r|8Nh zYmU?Hfs>`T@8BUj3*VgK>b85r*}DC5v}nkT+}5f045{RMPkVYuv-`y@Ck-`c`>5gp z@?3X-Jl7@az{zj#P4r`P|K3S5!zpq!rpeKmB*$Tr?0YqT(y)7qckB80sJpwrcleFH zGi7;4x1qjmj_O=Jc0$j589QHQ`+#2le%))1-uV2l?)+kJO-7B+2h+c%Z*TbcJ;j~+ z(eYHTc_#UO?+o2Lboh+?dF%EVp6IdqHzCOKb7lPp=bN>z+!NiGUsaIv@O{H~7B+u; zif(_gcKPtdvgA%Z>W1NS^zDtq+uh4Ier&j>Z#Sj=j9$jf@FJOEyZhA}6REd`ce6X=(nP%Z8K!z2wN!ocxi)-cnjDd$de1^R&KB z_$Rp^&ApJQpWHsN)W}~mwWJ#Pn*Lo0jr{%k_dZ{x@5ecX)p9mgb3LEBr&P^780{!k zdPdeBF6}Ig(XV2a9`iTA*5&JwX;0WxQk9<4)||dQR=1TNYvq%}D?P{E^;oIe)4Ar! z(#HJGYo69?c<){RR!Z_m6#hfE7hd&(u9(03TzNl}XIp^1U7f@AZ{w1`!R+-BcK_}tO>6$fwRs)6 zctkbVJL6-6Hpme$uaD7)&2ogd${D*&?$gb3R5#1{wxs7I^GvRvR~L-jE=!v0t6N9z z)VIGea!G#iZ9Qs9{;19R_k!muo6YUhbY+JuxkH{G8hTbes?qbk!(Se`uIIoLem~MY zyXqs8UpcM1N1#48#o5Cvn5_ir-m|Cfv9ZVeHiWibgS$th$LinQm_L5yBE6(pk7-NN zUb@F4vX#eV=HHf?KO!@KL}vbs^gg4vvOWKd%;cH;)mNQ3>N&l9ebftj`7r;gzLJ^H z^OB5xNzU6Bq^;&g>T|>C3i>X{H+w$1^dqC1Jr{l?8rABWF?s*)C-j>2?}?Mwqa{5r z-O!cG6-L&2)D!uYciuf}XQAg)pVRH)YabeAuJO$E&o^iM%cw5Be2=OY4qvABJh*W0 zZF>ywDwxOn-Lj8e1@q{33YY4~>>T|(w$Gk33ehL_7(S!0&$KO%3RG>bHi(w?rGMr zTDSJP^?MH0>v=jiO4_lyy*R&Bj>CR>Rf=W{G83opm_K*)PCfqxqYssR*;trgyLNP2pMf`w?)1z%*&eY|UY&m~`?#~vK77%T zNwVFYUGuMsN57)$J!+D^7V3MGXILw#hoT&FNKXUKIx-zPmvyKbS)3?nQA1J)*6x3=kahjq7ZACbyebfs6lYTc(R{vfl= zRfEhj*A6nvtRB?T?V&|eKfGw_lZvKp7fpRi@f*55w)idGPAfjG+rx*NB_|CvOWH%t zl5?fvN@c!O77jII7Z3f0-tO38-`BUF9%e>8Gt7)C_nO=L^_tt`dd(UR=rzk9)N7Wv zdtcV=RlURhN#7p+cHLey{7ButF#Igt{%rV4-M%z@t8QN&{*Z289saa#Rp}SH?JAYt z(yIoQ-mTlArDJqkD$UdFsM0dszPWUhZpW7H(rvl)xNi3={Y2`kUo4Q?C>gaZH={LIlKxsrp?@?(#-CkNcOt;HQ$LZEDtM!_ZikN8pxe@j+jKi>#9g|5 z^N26%cI=36>b5-MS>5h8;^nvLb8LjU@9rOA?z?>2~4h zmG97J&gi@J?bV|{tJ}4spVaM!(ZA5`hewYZS5->&tLJCEOFKmM9%R-i^)thZI?lhdI4zO!F_p29Y)y3b=YKYx^k#>>V zHnu5wcwa(pNgmUelH1skdbLk~Y$W4ySk(5b34LX91*=l8_1Rd(&#$q_cC{^G2doM21pXU{Mq`0PMLpE+pn&i zT_IN`ubyp_9jr|tH%N6hib0XC$5+?c~ zpBQA<{pyrC6>?Q_wa+2z%R=3M{%nt2mppGyKyFAb zoEnjvl5d}#kXw>JdTN{8k!+uqvp7Gs{p!c3RmfGzdi&&>WW9ZIU9#Rjxgl9^pS)Fj zxp}^l`pUTp^_FBk4{}HHxYKj`r^@E}t*Gr+_GuMzRq~HdbI3Kx)jp40mwf(gpB!LA z>htD=o*8r`co&Yf}I5 zX)f8ry41gRx=#+UA@!SQhvW#GQXhAEOir*R^_6o|avM8R|LCdupG{@+$D-C8=Q6p1 zRjL2@G@I;TP3m7e-6eZim-@}KeR6;esb6qLNRF^6_0pL!Il-3H_2Y%y#*WnI&CxHq z+5EAn?N>+4DU&N$mHGu|*klK5QZJq9l0B?TU7tVX02@-*=MOo;rqn-uW=u}7CG{ib zq~tbsq<+B}`or#Q{#exZtJ0Zeas{hWKYzAOcCaS(d2?K{hjppz=PPo64XLl38_S+2VL~g#{ff&FvbK^Y@`0Abh2M%tf2md)>3!SLmvawzn)l@i!jCnQ*5LDF`+D< z!!lOTMh9K=(8mBnj4;LoQ*5Ie$@Z~~6|~Vo7d;Fx#0XF(*N68A^j0HrS8p-$q#E+sq2n5u2(-jx+VP=&VN?wrygT8^^Vl9ny(%*F>(XEA^XXq9 z{hym^T(5pNwITg?%n#|`BK;GNHLh2e9NUzB{XUBR1RvI}QgZIeU z+J4oV@6bP4`ma3BxL$qXxSI5zIoqY*!+F|O>ZRk1>(znB*R}oXsrf$r0j|)lQl}qp zT(9mpzM<_`&&?0%k8q22mHNT)Msq$jwf*W#r^NIp_^@`B8a>UpUL8NJrR`V0oS)L) z#*Wkrr>e0WCoE`JsY|9A&Euh{)$be5F4JGZeYLC9Gt-RbcviLjYHgoQzk`#ttJEIT zjplgPwEfCC$EDxHdD>O#=;=l|UfO>3@8|gR2e?AJN?khLs2|U`=Lrp+&G{X&T!dS+ z`f+%IQI4CoUtPB#ra!@lwX4*VCm7|pY5UdY1#SADmHym`9jRY9U;Puu4GY>;>iZ`a zwf$<_f-?0A?koMKQfZPZqe;J)9@~SG~V3{f{s3sRy`1`e&bP zT(3TVazop%zP})(Kf*0qeO{hyl*ga8U%jv(ra!@lwX4*gGmYjvXleV^Zx*EVxA9r+ zDz$W`(VPbzZND0}P`!oYg9Ys>_1T$5a~>46{c4|uW%?_)uXdIC(M+Q`531UJ^^S!O z{gb8tEwhZ~{;Wy=VGCXQJ)Ec2=kY9~xj*Y#{rS*BpZ)+>XjiG`ETcRRYt8e2NPmP) zsgLQ4$qBZkuAi64ZR|+>x&>+cC&X36nwxqsoK}v38N9x-bs50}$qPAZp3(DjQ?u%7zzj}OuO?GfH*0kpF zl62Y-;8FB`5eWwzU1~u!SkPjn867YtAoKVSllJMXfn+ z%H#^}i&g2L&}Wk!oQyT;ul2cP59eWB`d2Ir$SbfR^_v$)e*I+~ndOX}C3o08kuk@~04RqtT_Sk(5bhtDmOD_E7feqTg(uqO5Ioa>T3 ztV{hz=lbLT8&dCH6p|xsO1-=&CMVdE`s76^xs4sE&s&rmm(9PZ?N^sBDw8W%mHLf~ zY_fwjsefXTOZKoX_2*~#kovI2AvwaP)Ze-|CMVdE`soW(avM8R zKWw3TC-X=B$KUk)uUk+iSFkGe%?oU@gEgriw%8?mSeN?Ii+yr{4XMvu9Fd!nhb@fB z3AUuZXmLtzV@K*M7OVZ4Hx{+}x@2*gT*0c;A6#sc9jrYM)+{TX7 z&%98*oB3l=+pqrX!V0-6c}u@dcCaS(V=r>a9@eG)(~Ep^fDNgyy*MOC*p&L=AB@Qf zwxs^;52oZccBFpcCF&sNjYVz0>b*vRVnKu@-{VIQcnOwoD)Gt_OlO3!{{pw{d*~7Zj zpP%KE18hiLzdn&8Y)ZYmFD570lDaoPCAYC7^_!Nd_b`7fYWvm4mX*mBtV;dp#WvZ& zn$%}5cF7*rrM_*MPY$pl^&QJ1a#QkzzL=a~OX{`0l-$OS)K|||hcIs}YWvk!mzBvC ztV&&fpM~sTP3m7==8`?EOZ};3J~_aK)W5ncBuChk`cunda)K?X|8QAKZevI4!xrWa z&E{X!_N$kcmB|&XO8s}sY_fwjslRxhOZKoX_2*~#k`?)n$+KYg-iCZF7-8apB!LA>dWg9xhXlU z$K(WCQopC3lH1skx_e<6)`!%meki?k&@fkk^1wq)ZrX=ENbQF^yCUwrQY3VlO3!{ zUC*EFVO{Enoa>VVY)Jj6b3<~3O{stEikO^WOX~W1fZRqko_S*#D`=yGE_&!=fFVX0 zV}dERQB7d`SV0Fp3^2k3+nAe}t*3$xdKh4Y3AQmeiSg*5hXF>IU>kEsFdiLr(L*0Y zY--KtRx!CHS%06D+>!jyBK5v({Y9<$xlx&1m8{>7kZY1pU+9uOtV{jDD|~W*4XHnJ zMM#dYDfOcl$K(WCQlGgvCAYC7_4XC&$ZVcDENc7J%U6`i6|72q&*e7R!J5?HwcI6p zSeN>-%YAZy4XID)3&{~SrC#fc$qBZke){s1+>w0Va%FRTwf*YC`DJod@>R=ia!vB~ z1s=IBdGm6g9AHE0k1q(x5jLfM$MTq*U`y%`EKkX8>_~k~pK>^^Sk&t4faPU!1*_B@ za!vBR=euMN>r(&La-SSvL+VSe49O8Tr9Rk?$qBZk-t^n#j^sVgS4S~lENc7J)SyhR zU{&fb1UA{hn$%Z)$R&GNmwNvEfZULL!LpDXVN>ewSrL;HY)M^zeok&hHKZBuChk`r}u}WeEYLj*{6|~Vo7d`Ybzz`!$u#LGH*>)=Epo<>*7+{DI#+YD=ZB*}P zf3S=dw9!EqJ@hfa5F?B+!4%u5PGP*P5T(`Q!j2j4{C!+o)!;eJo=I z9dyw{9|H_A!Wa`wv5jgL+r=_g&_)Mc^w7ruLyR!S1XFCI>SOy@#tPc#po<>*7+{DI z#+YCm)hTQj%UD4NUG&h$07Hy0#spJrqngcjv5Xb8(LonI^fAB?BaAV@6x*oguzf6J z1#NWDMGt)pFv1uUOtFpXRJMy{te}k!y69nmAx0Quf+@C9|07Oit{ZY##tPc#pocyN z7-EDmCYWLy)m*lV=C^Q~c~sCw2VL|qzz`#hF~Jnus7`0QSjGz4=%9-p`WRq{5yqHc zifvS9uzf6J1#NWDMGt)pFvJLBOfbbZsx#R>R?tBY1B@`iHs)OJFLcnu03(bs!4%u5 zJm!UEte}k!y6B;g0frc3it4OvJ7uh(jSjl#p^pKE7-5Vls(EY&ZFJGc07Hy0#spJr zqngk0!ZKFSMh9K=(8mBnj4;LoQ*5I;o9$y6D`=yGE_&!=fFVX0V}dERQJur~v5Xb8 z(LonI^fAB?BaAV@6x*m4uzf6J1#NWDMGxm|<$8!5V2BaMm|%)+R1290ma&31I_RQ@ zJ_ZiXxz z(9k{p!~%%j61HrLO;-DA~c9)W`I>WDo07ulD)m02@-* zpI?(BY)V~!eoaoWCH4HZDY=ausSm$aozMKSsO?wPzB0LjRjKRwlO3!{y}QpPdsvtH z-q-r%02@-j_u7!$lw9qL$t}tH-xZTPlJ)NmxPWHv9(u{<@ImBWyA*bIEm?x8XOgi&-wgmMp)|s+8Qu z4)xs9Y=4Vd*-vr>tJH0>gEgs7U*(cLtV?~vDxVx+L+U$MMdYUBZDV6{f-UMPxs4s_ z#mme*C$27Q<^3{NrM_*fO?I$G-6eZim-<<&ja$@%t9|MLHl+WF)e*TVdE3~8+@ilt z?$DpRoa3q8q@Gw^Ay*~qpHGl$WRF}Y2jm91i7ia&?~v6pwx`{so?TrgSFkGe4XbRj zgEgric)d&ZurBqBulLCTHl)7&`j8x9Q|eEwj>!qOq`qxzN^WC^y1F8pcMgkMIseEN ztWvkh4%VoiT>nC)lE%lH1sk`oz_0Is1V{ zt-0UJOT8}jo7Nb&sGVzk>J6zs zu{tC-CF}jrn(;C9meikEosv6}$E`8mseZji`8*D^o7Bj)MeP>#fwg7oRjH3#W0Px= zSFWv7_o+9?A-PG8$t`k9?vVAbB$el*qE?OF1arG#kIyQ>ZEl(^@h~-{X=d_ z9=9eYwJ6!Pt|1_t2usJ zd442U$u_x0cFA>e1Dn{w4i>M;)?39I*0F(+)*P=UIU%>mZE}a4Tgkk&o79VIE99!= zCssS;8rdV)C2t!WkQ?NP+$1OD7P*7PYt8o7uCHQE9Ji*94QyhpHT%^fr{s?07uOoM zs86p~4faPX&+p`_Wc|ECcF;u+eGIUnHLuqpIl`vY54=7mC)kpDygntju_JYT-FjU% zKl3+f%>ER$a=wr&Sfy^09jsAz$sX3Jo4@{Q)*E1hdPt72Nj)Yf*pmA8>r-+YJ5nEa zgZ{_ovi=+vwQ`)v6|72KKYx%NtVwT*0c;f49Ln_&9z4PiAAj(e{uz@)NQhZHL2_KhwNcp>iXyQnw2W!&*#A=sZ zC;Q|88&cmkHY7*bq#lzKY)M`3hgSB3dK){^uOA0%v;8P)H>ou@mC04f`uxytQ9rrK zre2e}o-esh_Q?S@q`qxzL~fE}a)K@DDY=au>iW+cWzREM)NWG8-()oVRi<9Ss`Njx z+9uZ|>+_iGVO{Fh&BiV2*qa0D4XMw)*|VOu96*cjqH)@ zqcixFw<9qMkY8mNxYcb^Rxcve!fHCiT+I6>^oFIpP+FdX0MK zh+91Bb*byuKXQW{k(=a%+#*RpkAV=gTIU%>mZE}a4 zyP554&FgE0T$QXppCH%B9=T2q$PIEtZjuvni`>E7Eo@gS`%SKr9deEAk?Z7u+#pBf zCOILu$Zc|mocl1_*UI+ERkA~_k&Sn%LvC@YdswI6CkNP|9+D$$Qjf_AwxoXaEp2i~ zvfi7G**tSt)NWEgzoksBU{&geec1dpJ9Ay;U`^`!`HAddow`pBut7Z}N7$qulM`%7 zUB3=!<#m918#~gkU(Y_meqd2+j(eG0!76o|>|l+$OZKoX_2X|cn(h1418hjY{(OfV zVN>e*b1HIzE$S(`jUB1$=hsc_2Nt#RdZCrq3+ffDO25ATAv;*3?vg#MQ}@XMHl%*e zhcmzY;gEWSP3hl%V@yu4CH3hWQ*s+SQvclsqq#m)o7peaee*JR&F9lKOY9H=55KQ|fK(NWVVrx3V8t)XIL4D_Es&lO3#4cgY_5 z7+{DI#+YD=ZB(~0FDzpPZFJB>9|H_A!UWrx3$yK1&_NeH^fAB?BaAV@Hg>f7-(hW3 z5&MHhZNFNvu}rRDRq8ixw8;*-=%J4Rh8SUt3AVIm9x1tv9jUL_s6NL0u&C`5~HtF~S%V zOtFpX4(5Snte}k!y6B;g0frc1j0vXLM)e7{k7cZ&jShO~V}Kz>7-NDdwox_NE|#%^ zHah5{hXIBdVT=i;*hck9wu@z~pp6c?=%J4Rh8SUt38vUaees$-uCam+dKh4Y3ARyf zV?9{L3fkzPiyrzIV2BaMm|%)+RG(t|SjGz4=%9-p`WRq{5yqHcifvSPv3)FK1#NWD zMGt)pFvJLBOfbbZs!y|hEMo<2bkIc)eGD+f2xCkz#Wt$Xuzf6J1#NWDMGt)pFvJLB zOtFpXZnleMte}k!y6B;gA;y?sifvT)ustke1#NWDMGt)pFvJLBOfbbZs?V~0EMo<2 zbkWBUV@y$P&(>E)8(s7<#28al_c9)BbkWBUV@y%q$9S~S#TZjmpJREn(M2Caj4?%Z zKjYCx7kvyd#uUpBWaDjg(Z>*DOfbbZs?TTZ$zd5QXrqHJdgx<-A;y@ZdXW7^8(s7< z#spJrquRlIv5Ypl=wpa6rl=lbKIo#4A;y@Z`a(8tKdrgWvB^`&F4@NrV@$F9#cVw` zy69twF{+sPqKz*47-EbmmJ_yzF8UZ^j47&rVY_Ifi#~=JV~Xlw#-oic`WRx2>Ji4F zjV}5aVvH&3KOiaB6J@l~MIS?qF-7$#A;y@Z{k3eoi#~=JV~XlAwud&l=wpa6rl`Koc(l<) zA47~WMfDBFql-R<7^8Ze< zS82`jR!EL9MfEM#gEqS8V~8=PsJ_j3w9!Q$LyR#+^&Q5ejV}5aVvH%4znhJ>(M2Ca zj4?&^6x&4`eGDzxVvH%O?=cQ-bkWBU zV@y#!!+5mOMIS?qF-7%##-oiP#+ah|0n4L}F8UZ^jOBmJ#@Xnik0HjGqDt8w+UTN> zA;y@Z{^Qm1dgG#xA;y@Z`ggX6HoE9zh%u(9o@G4R=%SAy#+agdj`3)ti#~=JV~XmB zj7J+?^fAO3)qgM!ZFJGc5MxYH{U64ojV}5aVv6cVj6)k;^fAO3Q&b(sqm3^57-Ebm zs^=MxHij5uit5KKk2bpKV~8=Ps9s<^+UTN>A;y@Z`U&IFMi+eyF~$_tPZ^Iky69tw zF{Y^glksSyi#~=JV~Xl$+4vA+Oi}%u^`nh0`WRx2DXJG4k2bpKV~8=PsD8nCw9!Q$ zLyR#+^%CRJMi+eyG2T`GWi~Fv7*j0&D(kn=MIS?qF-7%j#-WQoh8Sat>Sgu=ZFJGc z5MxYHy~23(F~k^CRKH<)w9!Q$LyR#+^;^cH`(Ii1F~k^CR4SLfA3+;k^fAO3Q&c&| zqm3^57-Nbm&p5QvMIS?qG2K<~%Erf-qUvV7Xrqfhh8Sats)zAtql-R<7-NdcVm#XD zV~8oLLD}*)y69twF{Y@BYzJ+0F~k^CRD&6ZHoE9zIwV_84P|+>(M2Caj4?$ujPYn= z+ROTf(~mZ~=wpa6rl?AcM;l%AF~k^CR3jLVHoE9zh%u(9Mlv34bkW~c-y>VjMIXam z^-)>Bk0HjGqS}+~p^Yy37-Ebms?m%`8~rzB^$=rBcez*Auf{MQZFJGc5MxYH?ag?! z(M2C)OtCyR8)u`7KE{}$`X{!7F8UZ^j47(OupM;K#}H#o(cLE-=VOR5rl`uy3vG1K z#}H#oQB@d^_Ad9$>Mr^iVvH%O{a6p$=%SAy#+agd8{^SN7yVuJam)*S3^B$ORh9Lk zjV}5aVvH%OcQPJrbkWBUV@!AT@1KniF~$_t0jwWwbkWBUV@%OKFdOeJZkCHoE9z zh%u(94rM&r=%SAy#+ah|=WKk6>bX7-EbmsuNi+ z+UTN>A;y@ZI*IXUql-R<7-NcR2IJ927kvydM*IEQI2U~kF~$_jGqdGwbkWBUV@y%a zVt#0&i#~=JV~VPe@o1xq{;v8d><{`FVvH%O*{m0R3^B$O)f|>b8(oYsMRh96qm3^5 z7-Ebm+NZHU=wpa6rfAP)dGs;F7*kZIGe5M^MIS?qF-3I-*DOi?XkduU^bF{Y@lV0pCBMITdC%UK?6 zbkWBUV@y$9$#}HUMIS?qF-7Gw9&L2d#}H#oQ3cs}7kvyd#uU|u*dE&GqK_%66)cZ7 zy69twF{Y@lV*E9kHoE9zh%u(9Rx%!KbkWBUV@y$9%XqZW#}H#oQ8gHc@wzOhsBWYm zZFDij7*ka18HYBy=ss7(OV_vvrTcc0O{ zsQa?+p!>G&&vk#jyVJdQ&-9+zJ=gW@==o{SuX>8szSb;jrS%2tn^u0%-h(QG4j!~< z(5gY(2fd|e7tbz!uK4w0S}YDedhqdsFCYBk;2}dM4w*4z$&jmtY#!1a(i-x^A-^8- zmZ3)sJ!j~(LvJ2>-_Xa0K0EZcL&pqz*RW%TojvTbVH<|sG3>!%-yPN&HmJAKdr0ru zz5l28)!sJ^-+y>*_&ZAPDcPlIrKP0}r6D86jhH*)|MGSwa8eX^->Wsbh^UAcEDLTp7FiH^2qDAnu#D{PEHk^niin8B6BG^cK2StaiFb@wj90wk72}>GjXkgH`B=|qdw$%r zN3T749o?&~*NR>nd)?ma#a?!0@5;fIBPu6WPOr>WF0Z_(a%1HqmH(<7+bt1#@A_WR_qx6h_x*d{ zfA;;dZ>Zmo`u(Ec?0)%vzwdW_zx(^W&~JOcFZ)IMSN7kv|4;i5>wiH18U3^UPwxM_ z{+s*X+5eILfA9Zl|9|)Yw10TO0Ru)4m^dIaV8ehv4S0IMa|6B{(0A8CyH4D7&8~mk z_4{4BRaI8iR4uAHx$5^-7gt?TbxqY@tDdUbTJ>?&7ggU?g?3BqW(!M%L_&l`g@}mm zA}V@{ZlX78Ptil{Ep`z@NZCj962B0YVi-9iMISLn^cCYoKQU4C7xiL*m?m}=Ges3Y zXTFN4Q7)Ts+DV zo)tsI3u0gK5=VN4BfTMpi+_pz#iwF~sIU&;t~*HVVvQ67tb;|BHHy&rA>ya}59{`| z4io!XhZAZ%LX5P=h-#}^v{++B)~dnH7$;7#judBDwcsR7!Yqr>CrNn#IT=9X`AilR6 zMMO4^ zQ7#c@$WC#EJWgzsOU2FdcyX&-CT^D}h&$wRahE(%+$~p#C*?_Ei(DyQkSB|mEbhahKSi`iXQfAF~D9U_O;IvN7!eJG4?rPoPDmCY+o#<+n0!6+n0+5 zd%bA2uMkw z{b#Ys{)@QYen8x6KPdieKO*k69~F<;kBO)4$Hf-=Z{l_PN%2qnDe<2DjQGg@yVzlG z5ntK=5Z~I*3K4ovBtp-N?x7b%W#~oGH}sOI3cV}_hF%eaLa&O0La&MOq1VMPL;n;L zLvM(qLvM=z4s8{`4*g3sgx(VKLT`&)=pC^r^l#A_+9pm2y(>-(y(dl$y)VuPeIRZO zeJK7K`baz(`j6NW+AdxQeJoxHeImAnJ{2E^c8E_xpNUUHUx*!{FU4n}uf+GEZ-fkg zE9~%hA{72!gu}v$ga=sB@UB)OJjm)E7UGa@2OT0rOL9#Uqo7pGFif zI9qX<=9ZHWLHAyzxOQ?4{FkP`27ik8h>ZuUI!9inc=nuM!eKQ^FW96wc#`7K*;C;j z)0E!zQblh|EE_%`x+!B?Xxe7lBc?2;XxmI~gnlmz2)_Yzv zR-fs%-=BNwDAn^bRBBs@Qv#;@?7wrp~$g3J%p*{M~w0=Ky_W z4>>{g-X2p`$^EXq+AZ&G;p#c6{Q61iia)tVl^nEO>1`({{rN=2HJ#VPIloo4RqKBC zpNpx-d%u}|O+BV&v#+;5{q>kT!PMrxnr2`B75TrdVdv%jE%dfwLrC>Qxt91#`j2JK zYsTu^sHa?R;jXxQCuP>1q^^aj;fGxP-Sz#`SKmLo==U^D2cZk7$sM zpU_7!HJGD+olqn>>QWq*7dA;J=TE$Pbo}?|_UY#oCmTAfcR{lzt zIb88+ZF?VVSGsS7qG`G5Pjhs0EOXqpvs9VO4^}Pl*0b|An0A_@d)s4Q#<%+lgCYuVsq2ZvFuNJf!Gvr|G2!FIVTd&w9mowf5Gz{nSrLfAeUSJ5TrUil{oH zjr!emj_&`bV=ASW&b>kF?V8?tUR&{Pmm20zj~*(7eML9ezq%5hpC15s>#q9h-foJY zYnqmCy-KCLc9v?1NxA7aD&?7DidW&DIV$DiI>jBH^t-Ed3&*SUJ!dG6J6Y9pY@On@ zy5us=zW=RCZq;v9Z;w5vuX~%m2X@ofeY`$L(;F}9bkjd4>$_`vLe*ogzPW1NJMiX{ zRPJNTcjtU>)HL_T`dKP{j(%#Y^!+(n-;<~7`||^>huEsjNmB6wTb;`v^tA=9j{VMzrCcdT`%2o?|qfh=j***=d9d|wsl`W48C&Y2f%DLbu6r8H`N ztk#EZR4LCbQXCgn=WF`&l_OQk@LwyA*`(;bUS2z}^qf(&|Iw?||4aI@<>TRvnm;~u z68h%r>!J7D&6B&IF7MTqI>n?L{fM>|({*}x-OeAKIFs7C>!-=v9&`UZpzj>7g*4ae zdVST*6J(yIa?jE8s~f2Q*3B9C@y0Ctd0hwmPCpmkyXbn|stuZ^CFXjWp1JpE)sv(3 zalP#{xhBQ?#ND`JDMvBqWo+I5&i$~8qih+kc*?I7Pis9KC7o-z9VH@!FL zP}Tl&ZK%>V%Ku#d@7Q5wi*8)5=zW6z|JdPqVSTr2UZeTG=3|=P`_OCC{BLdVUjMgm z>T>(epMHm#u3ylx9^qgmD|JYMshL0_O6W*x#<5T~QzWMqOp|^f> zM(OVAj`ixxx~UYCZnSwr4Lnt)n>UoV4gW81C2xD4U;Qa9ymj+e@Z*i*F!ff7K>u6m zG5wU8XU(+a|K+VTcX9qP6RcXs(Y>{b$d9uuVd2pk$+s4Lv zbC1>I;w?G?V@AQIjJF^BeOvymp{|IxH_E*=4%YX!_bB_X7{EFH@VAEdEWEyl88Mmr z$BfI?>2bRESgqO)H|aOjMC~DW=-#_skECj}AN#@-^$Z?yi0ZeGJR_#Zv^RTWgG#T} z<6nd5|5*FXmHJt}V!bM}e^l{u?Pr?yo0wQoglczsqcHm36YY;s zdC#a2q52smd#~CbZU~Kn-bj==qUkGh1x@_Te_y?&eE{P>l)Jn9_4x0cYjqDaj8SL3 zSohNT)5p-ND^6E&gY&LY=>xU5`Kv3G)qQ51;>1zPlbJS7<(e|4yvgh>bJ$#CO z7klqye_V0L=||FrOBYRr-pHG`wmYv=M=zH4rt0!g4W#>av zgDHQCwr|5PP`Ree{yHMvyg{XWrSH#gMk;NN`0<8I(XSl20d6?#T4CU}o{Oj+^Va;;DAk5H^|RnVuJPpk z>F?>@yGf4-Os+ZZ1W$^w45l|suDMrDdGB844f4$j)spwuJ_&oC^ABjwy5mrFx0rW_ z_iggO{RS~_1k+A`)cW&@s9e;@HbPy<|!r zw)mgqUUbph@RcLgedxUdKR^6^weN2}hTbQ_e+PQ4foZw%M!Y@my)NEZsPQDtwJ^`J z_pUQfoaqx2MSo(Vx-K(Te*w*0M!CKkR-^hvOi}${W>w0)(Kc%9Vd^nYWiL;Px8)|+ zThg@68=dxFHPaHa?;7oycx(8Z_7)P_UZu4EU~-q9BM&c(VFO0ibCr$tMhQAbtEcRo zGZjt5U{4(}*sdc6{&B8%e0{_rYOjMd|1m@LnE&c8`n5{m)DWXpr)oR-;591cH`>EI zUhj4BS?bMhtdP7`<(hMGj-|b+FFjE>V;NRN)zRn072h3eTB6R*A9?#B(G|a)IZJzJ z-aCBhIjVl|IeIOp_kQr++vct|_eQyU+nle-^~Uqd-NR;n=l}LjHg{3E``Nq^j@0ks zvvi+-GhJN^a|fEXdFg!@d*7sM_1m`Go7B8#%{zL5_I$i``t`-LRiEGgD|LsM@`sI7 zUV)iK{gaMG8!xMCNy+L8wca8IrHHfU!qO`*q)3uuu>vDXdN*<`)?dWYJ;dtkW2T9>O{fi}f0V(fd%=V$H^$=zS?` zv2J58^jOMTq6SLVhzvoGhf*BL9+s$uQv8xVEHME}){qQCPl8fRX3d8s>Yx-;SodLx zqo5R1#ewL0C|PSV5+@O|;QsHOmBahBjK_SSb0{zYg6DrD&mzmS}~NH81t( zg;0tdZM66m<>}}S+GvSIP>RL0(Gp9b6vxp zBq+tnw9#TkO#}M3w9yi$Kq*e8rIt7iN^v?ZwZs`viZf}cC00Wz*3eRml{hWvvsuk$ ziM3FQb7-$6&V^E}qrH~+J(S`+T5XB*p%fR;YKs*-i_sT}PV~i4ic4s_B`$?hTt?e1 zR`@JKucz&nxB^OXC1+rX4N!`!#7gu=D8)6Lhb1;aDX!%_EPf>R6!i6+hs6q^)6jq5 zJS=eol;S4N!(!FYYV<9fhb3->QryOQSgcE1i@u%nuvk@eF8U76#$vVFI`mzfjV11e zQv8{-vBbSliob9+mbec}aX)8ci3gw*4{|n^cnC`ISI))~4?`&);cP5cD_x0xjI*)C z<4}qx#MS60p%hPZPL_BEO7VBj$r4+j6#w9yELJ&fMnA_nS>kypS@U!g`b8+k%bb}d zUV&1)%9&Z>H7LdFoS7y52_@^I?m)i@rP#`uS*((}3;h-=sVwm}l;YownHgC;ruLCT|J84!TDL@GbqL9oTVkcfKq%Z zo*gNRmpcDhGZRj6CY@PKU`o|DkXMKSF z36x^6^$~gxC|O6g9sN@%#a`AY=>LLJ>}~Bp{|rj;bL(^TK2Y*W@t5d*p%lNczD5s& zk~L`GqK88%_P4%AkAPAfVDX)KN-^3> zqQ^kVy0&iUu~3Q{s|R`k*=%o-FYgMC{L2Rs5gI*4$IMEu9UIC>z$*M)K zgxFha0(upctRtL+J{3xq@7AGDhmy60N1@MzQmnS>(QBX-XIazHXG1C0S~Jk+K*=*u8B)=HzVfY?~83B3Vg zV_BPvjfGNNZ7o1w1EttxwVA;00;PD=Is^R}l;Uw~HTrK5duyGAeiBOYl(iQ9G?c8-JQw{wl&sZU zhyD;s@sV{N`ae*L?bZe8k0G|sx(NL##MW7tpg)7yI_om@7Z6)#tw(DMwY@NIT9f$aS@+Ncz#P^f8pu0mU zc9FNCdqOFC$=lJD5PK-^K=*~%LwOgvKg1r&d(gW=?4i6Dy&J?H%KOkif>QigK7bws zrTB?_2t63$`^ksVdqR9X`6&A55FbxIjvfl}@#GWeUqC5_$*0i!K`DmIXVCjYDMrXG z=mVe>2g+yB2SF)D%IDDsLn%hd7tx16DGrq{qYr~p94=o)9|5s@@^$nWh~1NKpvOY& zp4^Ha2eEtdE%cEPyC>g4{}SR)%5CUL5Pwp>hpvP8lkx-fQ4oJpeuS=v_>*!wdOF1J z$xqNTAa+mgK+lBOJ^49$7R2t!FVV9hc29ndo&&La@>_HYV)x|t=mv=0la|EpLF}Hi z(M=G$C&TCr#O}!`dI6NI7mlM_pcJh#iOxcNOW6&*5aL_P9_T!jqFwexcRRdt2=sc0eUk^GH$d#09Esitv2St|`WlFRlZT?Oh1fTFIQn`h#b!Ag{Rb$;4YC@2 zBgCJSHRzim{-hj_z7^t6%3Aavp%j0T6VP`+?3Sbe6Z!=x#fvh7ehEtPid=wx6-w5Rx1e8#Qv6e9(QiO0-joZ`TOmHA z%%k6iQoJKO(Eo;#b?1xG??P;>>_op0v9WR~`a_6~mCMlof!J8N9Q`rG#>y4wPa!r| zu0($Zv9WR$`U{9{v`;}tA-2&z4IPL0f%X~bB$T4UUXAVsrRZ*-h3)~dllEG4Pl%ng z&qY^4DSF%M(0!m3eeLtm{h$>6?F-NYAY)|vB6JmGjBHlHZ z=wT2a(!K>f9O6UTx1mQsd`SCt^nnl`(!K*d65>PJccDi?d`SBq^q~+R(!LjcIFx)B za36X!lzboX0J<77PPZRI*FeVU_QUA$ka4>GD7qFhPPZRNPk`7}`w8?Uh+VaxLf1j; zs{IW5D2QFPx1j4GcGZ3sJso0K?dQ=mAa>P$5j_)1G0T1#{VOQNZ2ML8uOYV7ejS~H zlJ6JZKsQ1u()L#LJjmGGehWPxGB&s0K_3elo7>ya%@7~beh=LW@geOG&}|SO(*6jY zgZPm4c62+$hqOOIFM{}x_73zCDEVIEbM$dgilz3K=;I-_)czWM0>qZu-=a^1jM?q) z(I-JER@%7x;$$erD%(c?7UECZVf3jGf6|VkPlwoBJB~gRVsGsvdJV+h+TGA+L&ofO z5A?ZEir?8i(d!`oq+N+V58_YSeb5&`#^!cE^yLu0(H?-l0%BL~D)a`3U9|_IH$v>H zy*v6Eh+VY@p|6G5ReLb{dWc=M_eB2zVpr|G&^JQts=YV*W{6$2hoEnT*j0NU^dBL1 z)!r9<2bAJYdl>pIh+VaZqyG%CtM&-=Um$kXJ`jCBWNdDaL_Y)>o7?gfcGhC0!`A--s6DY`Gj7Y!{# z_lMZk&~kJY#IA-`pa(+iYG@^TcgT1=v{aM2^mvH93av%gLhM!OT=WEpy$Y>EPlDL1(0S-Oh`kD3fIbRhuR<50>ml|k zbP0Mo#9oCiL(hQNtI&G%Oo$&Cx)MDL;s=JVLeGZyfuXC>b0D@WvWbaZRi$=9~inForU;;p*zqEA%0-!E_5E^ z2ZruJcR*}c=w9>^i0um9hdvHsyFw43kB8W<&_n1GAhs*?F#1G@?Fv1LJ_%yGLXV?Q zhQu2~PoPhM#2Z6Tp-+Rv8$-{a&w$vg&=&L>h`kCui#{9T3x%FXKM3)KLNB8K3W=wM zUPeC(iKm5LML!ND-^jd?N&@V&$qR>a^S0R2;Xgm6Kh+h=?1pNlYFAD8IZ-r9)EA%<~Ehxp? zp)b+zK;mqnuhH8eakkL6==UJce&~DjhmdDKWQBP4A_CsOxr;ukq6h(gq zdG?l5g00phHmd9a~Ry1oB*mE75Vta~30fbIeDox)YJ_IuM4A-C! zgN!}HDB+eGDM^A>t*}~J& zQy_7+@C@`+NSrM^6Fm(|F+DsBeKeF}MtC;*7>ErC&q1dkHYA)vH$ZGixB;Dp*pP4< z-2|~A;U;tjVnf0i^a6+t2`@mmKx|031)YW1kZ=~g5Mo2Z3(E>+LobKK)56QqD_@Cx)w$hb1R61@syPr|Fv zr$FpU_!RVM5PK3n4Sfb={vvz^dNpMJBD@-X7G(Y+d=`2w#1{&$MV|}tg~I2e*Fk)t z@H+H)5ML;K9{K`EY%P2N`XWedEqoFB63EyydKi2 z*21@-Z-@9u;oH!6KzyX|?dZFp6nBU3K;HwI%Lw0vz85l=5xxg~A7m~gd@uR|h`$uR z5B(6tUkX2fei-5}g&#sc2Jx4|52ODEiLHenML!9Nt%V;)KMnDn!cU<84)LABPoe(- z8Ha|SK|co>hlaPHUx185!_T5$g3N1#pGUs}vA5wD(XT`7ZTMyM8xVUNeigkHVsFE* zqu+wq+wdFccOdpQycN9-VsFE5!S}-Nkn%pn>V~(WKZID_@O$Y0Kq)>Be}Mi3O7Us< zBlHd^#b@E|=+7aRHv9?tD~OjB-huuG;$?+DM}G&I(TIGBwjeVak+0D<#LJ3&iw;A) ztjPE1C}f5=LU3OsAW^=Ejjn)1`66L-cZio2iK2Ibcv+D+x);RDiX_p!AzoIb8@eyV z%Zl_s_lHFMB0bT&LLz>VO7w0JYaHo={t=Yo$B};ML6FgFWB__FWb_)TLhlK&#*u;O zy&%>&vO9Wjh&7H3LJxtAUL%9i`#?sokv-A-LPoEVz0kuTqu0pZ=;4sjYh(y|1Z4CY z*#~_fWb_)@7d;X(dW{T2kAjR|Bg4^$LPoEV5$MCA6h}l3M307yULzyX)ey@Z8HKKa zSmwx~=fZ!l7go&@m#BQ@xwARb_3Jh~p@0Y+-k(;*&UWCD5y z#OsSpLeGMDeUUo!Y>3wvISM@oVzDFj=oG|aN2a42AQn3^1D%Fg?8r=X6U1UiW}!0> ziyfJbUI4M!kvZrVh{cYi&{>GZjx?YbLPo5SG`bx!VvRJR7eTCaB!ljRSn0?D^iqhG zjWGgIMFpD)a>qYaBTReG$YOM@~au0`6odFbmP);MwjdNaftM=nC& z02#4HEt#L*EJ+u}0RT{|K2`j$DcU6J*vSauxbch&7H}jlKtBjU$`T_d=|3 zzBR8QRfmq|nE$GJ});Mw-`fm{LH*!1rDTwzQxdZ(S z#QTlhh28?Oz>#~<&p|A3dn0e4zk`f$BU{lTx)p6j-$F}>CmekT z9fEkm(QW7mWTj2?J#-9Wd!rwqDa$J<-D;wl`Xd9uBd+(LU%A z5ZfE=hdvNud!qx;BO$goT7@13vAxlO=tCi%aCCR{5fD!}ItV=mG7A$Oj2;V_g^BKo z9tW9)iSC6y5;6-D-5dQ&$n0};2znyKD~|4io(%Ddqx+(#K)mAUF!WT2CmbD)J{sZ) zM@OKKfl|zj9*F*LNVG6I68$Skv@kjf{c9-2oamwG-#{r+(ZkVmp%e|#(db4<Mr+XXA(6xAc=WN5$YHb=-3*BwMkk>31svgoq;|MGWw3rL>~_seMe`ZPk`9u=xp?fkO*OP4*Iu{2w^mZJ{4kz zqYdcOArZo88hs{Y#2sxyuYruXqZ#zskQtfi0`xhM8JTDc`gf2SnP?XMd&rDTbRqhD z$c#)hkG>ExBNOdFUkq8{6J3nH6cR;@cA_tbL=mG)(N{nzu8b~2Z-7J*qs!47A@(-9 z0=*exZ=);GH$d!dbQSt$h`o)Tg1!}EZ=}_-%`T>Z&jh=^o2;%)lFF-#Gi9AFvLO%+LHbgH$KLN3~(aX?J zLF{dGJ^C4ly^UUp-U5j>M6W_W3yC&FuSP!)i8e$xp=twgV#i{)p(7AG7P}oCgZPuNJJ1P;O^e-yu7Hf_WA~tYKt}Yj zd(k~1Bl_5V=t{_lKK1~*4`f6idkEbRVt--}qkjsqKe0#A{{^u>vB%LrgV>+g6X>5q z>`&||^iasCJoXIw7m!hTYzuln$f!K_EP8*)s66&O`T)qNJoX~`AjqgZ_A>fli2aGZ ziar!#e`2qrkAV1lu{Y4w5PvVW6xVuYViRHm(C0vGLaYk? zJBSY!8;HIL;)BI_Yl%xB&vk4NdIRLSjtxd{gv<`a_C#L;nH`Ajg}xRtI}qC&eLZA$ zAT|X32gvL|Y#;QEkY_)(FZyQ4vm6_Sz6bIw$A+Wtg^W65BhXJnMxC(((SL`GI%6Zz z|A6>Bu~F#fAU;p*Q1lBBpC@)W`Xz|Z6B~_w1v2W4Rij^r_&Ko}^qUYrCpI4aFUUwU zR*QZIGSZAqKyQPLF=La^??e2YSRML9h@TTX3jH6*7&BIn{sc0{j7>-HfQ&I?Gti$y zY(i`%`WuK%h|NNO2eApU*=P};jke-*&=O)3;wf|pViV#G=m^9n#M9^)#3sa>&S z#)I)rI3&K5l%GQ^Kztb-6JJhBHRL&suRzy8p40eB^mxc~8efI3g*>P6Q_vG2*EijFND17*G(MuYlNu_%rAY5StL+g5C(R3Grvq z*Fc{4`19x+Ai^f$QUaA9{MrJ7%Kh&`frekR{SIMlMvey-;RD7Vq4;$ zp#KiBC-EKV=OFeZ{yF*uh&_paiGB$(Zi;`6eho5iihqm#C&Zq_zem3bu_19Qh7Ez( zkhqQB28mY1!|3-Qt8n8{^aqetxbZmpBgiV;coMxGVo&1T(4Ro;NxTPo2gIJld!j#w zQhX7wM1KjH9fd@5? z`<6HgT?4UiiF)*Shr*0W}+uS>|0_Mx(;IB60^}qLF`*%4!Ry< z-x4YGbclURG@xfdW+4-4^h`)RD$#_V1+jaH40<-i?j;tW=RoXUq6M9T*u6v+-2fTC zBo?A`knu|*k8X$9v_uDb5yYk?7NeIyY+3>@MjQvRX^Exi;~_RJu?&3z#HJ;dqfdm` zw8RSZNf4WsScyIvV$%|<(7%P)w8SasQz14jaT@w`h)qkJfj$%B!z5Ot*Fa)QiL=n> zLSjmZwdi$_m{Q_g^mz~;Cb14)lsFHrPh3Fy6%c!sxCp%gVy_aHpf^J7RpK)AH4q;r zu^xRb#D_^-iM}4#91Y+Nk z-O&3$>|3%2dS8f5OZG$$hs1W0mFN)=`y zav*v%#HJ;8M^{5^T5=G&24d5agVEz5HZ8d)x)x&7l6#>iKx|raZ}cRHO-l|z*FkJr zav$_j5Sy0V7hMmrX~|*e=@6Ti9FCp=v1!Q>=$R0kmOKzW3u4ofBhj-VHZ3^{JqKdb zl82&G5Sx}f9Nhr%<&vY(X^1bEtVTCMV(iHpbOsV*PmV_~fW+97wdfW|j6FF4orT2M zlatU3A+w^%I&>Z~E1EnC-2s^uP1d6qL*nhp>F7>KygfMsy%Z8}PtHUygUpI1XQ7uv zW<`^;(JLUcqRBbvm5>?FWD0!-B*va>K(B_x*pq4WS&$fevI)HwVh@uU^tljwm|TEf z2eF6A7W8?L7<)2{z5rqylMB%oLB@BKhF zS&%#feH+9NOs+=X3GoAyXQA(g_<_l_=s!dJz~s5;zd-!JhQ!a4x1ryKj4_k9 zqu+;&E0cGi{{xAiC+|Xk42hp7??HbGiJvF$MSliaF_OFw{RJeJo_qlP6=b}bdq8E;lRg^obRn-$NXW01I0#TIl0B$i(B zEV?@+mR|8ZdKXA6z2Zf5FGwuC;$?JiNc_CwRdjzy{Ji3I^sbQjdBq#(-5~Mvimm7$ zLE`5XZ=rt-v6&U`z#$de;Jy{_!C@62kh>ow;#BbwdVfg7sbV|&07%5C;uG{ikcd;o z4)np0bs!a=qYr_s1F85DeHbMARPi3>h=r{99$f>mkQG(}3kk816*jsS z5@o6g!>JWfIK3hckEuw)Sry&jnu;EjJPYzHSM)@$g*?j@mFROJ+yWN*npTq2lcE;Xd-)+whoe|m;8XTS+K04eUwj;?% zWn^e%Y$O*sE^<<2L*)9%t&!&)c-3dwo|K>D|3|-`=x&cl2J_`-9#)dcV|XYoA!(UHT5_+tT-zzKeJL?XIuv`tGjb zs&v&KszN97m3?$JzpP&P?>d`La0(mz9k$!0Bh_X%Pujt|C7aZyw_NpZ*Kbm3?C$%n$5)B z`KM9Lv~*aH@%LZ+y(8ISJ;1-$`L{jUhONk97utBHb3C(4IHdh)NT`zSG%;n?noatw~%#M z!<;!|Gx@gWRA+T_DxcTo)t)2vQ+rOyWgF7@{M2+qHrJ^3GRdmIaFt)*p3Ag0W#)CN zJe|_DLX$}OVf(8cYFZneI@wR{WRkn?HA0o`nz;XgI+eQiKS(KG<4khb-G+_S2VRnH z=x9%m?r5K%&1H^D>$9N}m5^?2&ordkb+@QCE@{i=+EwG&n4V9&edi?2$Yt8oQ|2vk zHoG407juUB+df<;nrYHoA-H^W42O>0L>I_GSSZfMVBTUBy( zwz)Z7*qTy5Dcv$RovUq~mo3StotjQH*0nZwmZsJ$>_|0d+DUC`OXboz&vDwbYU{{U zetvzrU8PUVs8;x!sZ#w7EtH+kFN=x5HV;)t z@n`AOn#TP`j2JdjJ$>SkN!iAZ=Ja9u(6#yM(fVjwR10pZ_IcS{OYK-OrJk#m$S zr`zi?jSc=QqHeIE97LbVl#aR0nTA5g7N3Ir(DCWkbdD^2hh%e87G&x>TN})+QQTCy zle6t((pHD-xnkwgcP)Z92W;7ISPqB1c$$>rl6;8RhlXLD?jm-H#!Qbs>rld zlXHqjwd-w_GrFNA%^f)}Qz%f9pi8u6N(*?lRepU#x~-%@NrEa-lW#96;N4dF*mkFN zMyWL3H0fMxs@ci#Y^vPRZEctk{kS*frL`D%};*>-Pn&!*FYRBPrqZwZ>>O`4j{ zXPXzLyQF4I3#qCwT1AuQG_Gq}TbDBR9H|{wXk0c|oo{0&RnfR?b7ML;8OvIibL#1m zG_SOT+KJ0s-`vsU?&00$qPuyjY)$K;OfK8n!o%&RtJ^auJsnWiIotYvsQu~>Am$RF@p>nF5 zGn|`~<8G)N&nY_Dr751%C11Br8$qYAF@bEf6;k!#wAFQrR2Mc>j&czfrQIae$z784 z{zXGEHO&*9cbguRq3dnSl$IRrO;9B`EvG?7skA9so}JFZsT4N4w4kJr$M(4C4aG*e zXSRJu{_myv(#R-jmq_ROL{gZW>c!4JDb(t(T$B_e7e1+wISP>ZWIlvhWY%d z&DW=!=P7534ZI*nX0tOhr<@knKOoGk3q$_OuE@u02kd~METYJ z)asN!t>9n!b4ndjf4s^yhgU#lYNxm*~&*dWim9uXpIr^?HT@xrGa@ zojQNM-xKtg@w$8dT)*$F04p?-|{KX26nLmejbWlr+h9@w$V1t4(i?$~y*EKppnc4&Mx3TDd z`SVI#FMoE?)$-?+x>NrAE{>DGK&eOM&-eI0{!Gt1zu*A*3w7~k`~^%Cg8I_+So}K` z{1ksq!B6q$c$yn{G{+b5?^tj={5hpwh(F(RZ@Z3$zm(VO@aJmB!=GGm8vHq)gZ`jG z9$&&=S<#d5=M`T4{+!~or(V_m{Ne)^obNtj!P%ZSyT5MdRqoH2kZBEQ$~Xdf0m-~t z=Vt@boy%A*n}A-XaSB10pnazhmR_vF&pxj}jZ*aZ-=F2a4*Xd)ttx~%7FP_nKcDYN zwKk;vrFfYKC7aiUzqlHxsepn%hugF!mt%;9@9591XMEU!hZU4Z_%L9P$yx5a?37ef zKpwHt>G{B%nkDV&R-D)JB_*iNiZropuolTu5jV6M1T z{AKGGWZG&{bI0Ji1?KBWR$z|Wb5cihd!`w4U%pt)f({~H#JBVmD`7=w#>A^)x#!SIQ>eH!Q!+d}3Q&Q~#spg(5lc(Lios}4yR-S|o z?(eMFlw3vy-?+De52R8j;_(DEP~8JN$)?V7dvc@sdtrJmAaM-#G%!QoWIA$)!&f~& z-LSx4Be6y2?c>jz#@tA=KUoh%lvPs)Zq(tBpkl_0SFUi`BD$usxwWl%jvvr~`ZN|J zH$4}S35Rr`WEV~?e8YC zbs#o4*NJu3w)%JUyq=ECG%~H=FEYA8Ev3@_mOpa}@5l}{eaM{s&dTW?_wQbCR@C+I z=XSkf{u0i^P^R{y)4W`>0Tp9K%H~bc6CgV)p$y2_)_mP!1{V4GnKr62_g&zz^w4P{ zD}vPc(tiew+tiqBOg7t|Z_lZ9E;^`CrnEa+@>gWuza3^(gg;wZoa$6t2HWAx-1^IS zJH_*~?W|Nb&pdEYr%uEPm{K;E7aTLN zdc5y%ne#ILpUS8);7-e^*$;Egjf3w$lKV(c%LZoZ2RbNE*=heC>YOKcs5Nx{JYEfq z8p`FGkZizStR}3>F{|#+D%cx;PGOR2T&9_^ia&pBhgplD9EUOK`Kd*jY(Obyr`IN!K7-KoO5A)=}n6&>=j9oaetiupIr& z@~yIYYPHk<&;+wGDWH(kA5*h|RX8SWw7NBwhr39}v;wLz9j^i^0h#PxCZ{xf5U{JK zhXQi-v{6gCF@s+nkUhGcRm*c(3>=Wxb(E!F`JIz8t--~)n*%CwZ^+ts3|QWz9Uae%oZMaX>~*ODfaMl8zkSn18q0wz63~Zt8Uvu#>sX12VJ^ zVkS12i4EFyYOAbH=lK2 zV^f_0P0*#xLfPN~3}J#ZJmWdjYqhPx1>Hpv{u6OmMEJAZ8Rl;Er`P87q(L&&I&r-Sv51bLETggB$O$k<2GgT z%*Q8XGN-27b9`tLc-X0o+XBwGBj28FQJ*dG)x-Sk;@Vak-_jOPl8{Qk?q!4idYz+x z2lYjZKlPW30}@B)i=PGgBI0Vw8XMW+ud6Wm&vzC6OdYTy<`tCZeFK*(VEod+T%T(i zSW3Oe12bH^>~AzNNPl8I@1`-G{&al{j7{^knLp3t)0qVr{vuL1ysk3|m&pl8W`S=eorX$0e&}q3$3!bG= zU!zUSDy3GZ*0!qeYm|j&*vH3Z0OwNuVU4LNq87C1)vH<%+SY&7&U#Uc&N51+nI$Va z(UB^(WIc<{EKN~mJiebU;oWXc6Q!bssT?Pg)#GsUjitcA6~DN2)_|M!FS?S#Vi=)6 zT4H=Nm0GebZZh9)5Rr9O%+NP%H}F3U&a3YT>vA*ZGc8lEzL?Q9>(Q6qQftGDTWSgG zq-IW+FSUxP>YUt>jc!bF%XB-l@70+W9ZO`Ctq&2j*hcRgn4u1#7vAV1M$JqX)Z-xPsQkTHRMpsa71-B#mLp!kszeI1VSAC?QP!N zVvgEREz!|?XhEzdt%dp&uo$><3w252ql?LE|H2o3(P)eU$!YOOgpu=o4E zfC8!!#T7xiDV|N0i%HS%1)b+^sGP3v1YN?Hs87?Z4KioyXq8^#G&^f{bfLfu{oJ~X z3JS$lJ%NjdbVb2AYM;V2EYzbvZ*VSjAx)Jt7q5__N|mOxIOoH#k7ubV%|p|YU8J5X zw5kBhYnB}81{JpoPoN4Tb`2Yd26rdM9QrE*Ot|`PK$u5GsBaVX{Hlst>*GwRFDxwL zvNJ*CekS84d%gfx-@USOLC3uHH@fY*p83p;7&STDO6-EyuujMIS6_c=JrxHm(~?#T zGmgY~aP;wMy%IxBdN?WSyv=$lebSC}Kiu?~X(x*+{E1Egz$sGrqQ==|{@77-^};P4 z*_OGylGQ^*CpjO)dMb7NR@K^oRCf<`IVLr>6iVxxPMujHK`&eJR4_(G&{e2Rv^jtE zF6t3hwoe?RsX9c9f~7RKhF(Nw?h7MTIo}d8UBI8J$`-DzTX#uNnW;wXB(m_C3fgySBgYnrOV zoq2Ifm8PhOrk=EM59A&B6?f{gp3PhicL|%hB*o2!qRhL|Bwg8j9Y1mp=ByJkE8U!0 zJZs<7r&rt*ggxCon89*eRnY20_0K7|ImNApW@k;DZnD$!ZaMF^s)egvSSF`iG6F(Ym>jqh1Jjvg$#xh3o7^nprKR8w%V+{JUcNJ#=NRxy{>9GT6V zgQGo9o9C7oqZiug7JFCT>8eW-=6TlTsi)udX5Ho&*5>Jb-3`@fwKh+uYJttse^m}2 zV5`+x(=dg&V7zb%`R7?Br?!<(spf$k-%(4)JejN3z-_9l)vNr9=Bn^g!g{BhRT*_8 zWodO`EtFwVzNp?%+3p*~EmxYNzmsxH`<4Qlv+KG*P#;*i&~ByfhHEL^6x9m#-Y={Y z)K!)w{L)<}XwImxXwaONyJafE0ITUl_sH%m-#v-q(m`E;XLG!H6%~8b+_&zY#b8>o z`jWMV<|iPE%L{dT)l=;(H`E98Zu7q3%*S-<`r6f{QfJ{#D(dpZt=7UX0Ej6I8uG*T z)Am*$( zYVk4O#S=4DJ9wXUeQWRJR?1qx4&LmDHeP5lx$mv`n=rDR0nd5ZrR0| z?lq$)%NH{J6S!zoS5TNcF`vk~3p$1S=&R>}Ymq5t6+YwWl3H+1)Y!m1k@4wvSLX_+ zu74_qd5^hS`n0-P(fDoHoE!_j_ySV*opMl=HPQ`rH`E!KHKaP-k;;I0?kBy!cUyTV z-fi740gFmarvzoV7DC;8=|*p5Du9zo^Hp&%Oo+AAAE|qj%(d|QaL$DY$SABp@zkr1 z?yXc=<#CxDpY?kRx%1#cT|ORi{lhQxF25F|I@HVtsNOcgf8AXL=f`xb^NR!Vii#bDF|cderA`QS;o6rY1E4D5ez-FfGIH@f4HmI@+0# zPzJG>X3W+&zbt4T9nw9)DzAP{Occ<#oh&5w@hJKbDnlc$dC-8PSt4tQwqw4_w&B63|MYLu6l?67mR_Qk(`1~MHkwIUQ=A5|YQ)LGxpd?HCY#gilCntmaD8f#awLtp z)a`Xwsq2;&x15fqunIirqIz+&?>#Sg55O0 zUC>UvL9J_2`!I#&>dESn)v2|7I<};4o^G02>#q0LqFHUJ%2|1!Q`KL!?ZyTR86^qE zDyuAGm6bB4PpLw$DeazN$%f+$i#}=^tAe^3w8dbzfCq2M+pDOTxmv#YG9-zMujxx!)ULjBvl2U^~2(( zI{oZev!Tu#LDiz)d^1wHR<)r{vG}QhJ}=K^+WiPYD3?jOy9exVehZBeUCCxmz9H3? zrgbSNU-=S_B=F}ZYDb2fOIaJ9T$(VA_2uS=^GcHQ-ZDkHk9 zYCYRx?>8B`FN0GFyR(i#eFQ0*v(5$4&V#N=EgmvAm=fv&IZu?E;oa8vsE){cQ?=pu zrRuu8KjKrY(Vwag&R8(hFyFLFf7fB!Wu&n%V^ZyuFgC_$V`Yq1-84y;sLdDtI=AAa zOrB0)U$tmL{cfc42;9VR%^msqYH&BbHD{b(bpaN!U@)h=M;&ggSITsd66&0Fiu=gv zE$UEFHMguWYcZW`99#JQ&zp68p`6;9o z^js&cgEHB<$MSAdla;E4)db=*jTp~y%r&T=o#K_;+Ng4z`_WA=MA7v@{GZ_HHUuOS zkkFHQLK_wg7V!ghn-;8uo|5H!Scso$7VewhI0m92a3O`5oNiZR0Uj@BhC^`1^mRMV zgl?Y`WDu<7(#vXfJfv`{`GQlfix$5W(x>3rtZAE%Wz0EM>eVN@h*A1{CZ$^W8B>vM zn==u!IBkBawJxWB*;H4pmsKbiKwXEz7e%^?;2d@Ne4iKT^8Qp+R@dUJj4M`KNC^0C zB(u~@O$#;`{Tp7b6B$@H3qGlWRBHOge5R!9b;ihDZ`wwR@-i-1*!gL;d8yUTBW$H! zy@lVrJf@{t%uIpt#DTI|Q$JUjcLN_9=_3@kbiX=_6N{;Nx3oHOH%`ejr-Q$RY63IV z9%^!?YvHbGsvOICx)$q_q)NGg;KFfB5|}qA{k>Tx8d~e~=CoOXs83k^ZRelYLX2-{ zt4+1AV4zt!0cqs;Vr<8oqE`_)39NkLgDq#ncj)QrgG#kfn_qMt%7;<<(t5p8l9Y|? zlB76lyP752g}T{l3J8VkkwG(Vj@522W$Sp!!3vu8nll8wv%CBk9?7 zTGp*ke-mb^FtWk?QK#v7pEzwTO=0<0M{{F+L#|_PX@+TX@jb=fZKYeJ=#C_oV|q;q z_cg4755`$AFUne9u5lkcx!g!fSUgj>`fbyPP9 zuHGBEWu+-j8Tb3SLXl#E8@$o=F>2PofQ%p4VUEDP!>_XNUeLQ1x7;)G+*W3Z7_kWD z>SN5(DD3}uo>$)8>J`9?T)Xr7)i!QnW2?DN#n6KJP){GrTwF6o(Vy=LGvgt2+(S=( z=)FDP=IQ;s+v@y-KjYIy%Vc>Ck2y}enobeQSedyD^xWI(Wt2K#A*ihjsVBT7 zL6z|InWuu{V{a1GAjenI=|EFLzYug^dXJu0-_RE8Ektp3b9CPc_0!C5WL@YvisEL8 zGp3{L!dTy85#1@p&54bS*9(Dq!O~3620!hgyG*ZPQBhglZFTjI52d#XTJ=>yt8T)b zD{QJP&!)bvT|Q7ZmcMXOv7?hsvx^v)1ta|t0 zoRt2Iwa|xruIK!J4U8Qu-qZUP=QxF01EB4;CymKR6P)&>=~**nmYg_?C#(2Cncu@y z_c$XS^$Y3+8^Ws-_uBc+R-Zv>is~wlTT)syFvC4)U~XHn2Df0rA;u}ss2^^omBgtF zQn$eQR982!@ZGMyZB?MoO;Gl&B!P8groP%bcdlNH4xDjeQK_c#yZ8+;_fA8&Rc*$ zeWuZU(!Du_2}jfjAv3jT%nVSDQ>%r%U;aT4j}VN#gw#rnbd7Y z1gY@dx4zT7+vY*gA$D)Fy5*elsW(}bRuiQi`L3xH?(%84xvBlhjh@zYdBHJD#!s55 zv9Z^}>Rv7`#pN1sC3Nk+M22&C`FgS~mrdwfN6evVxs#CZ#dI3jCw#P{{%Qpi{6)UNy1DoCD9_6aqNh#)ic9Ltp^4v)Q z=SJE|3Da3SDd6d{os{x)jB}?4_Y6aJ@9K%bLY}$;^Si8!2rNUt1*UuIHou1SKb7)$ zkby-@es(Fagt*SHgsRc2>g7Bl$}B&Y1{B$w7*DOv%8Zv`iNppLJggM{0l@#lGSGb>21QqUb zZv++L(Ke4}P^Rzs4Ju>|TKP(x4k=&29Ho4|rz^`B;yjE232LI}Jjxd`=TSc2Igj!M z%u&kcd(NYLAx~3{xhsD@BNCM_~0|w zSyHE`5D^hIENZ9Pot86|5l+Z7Qdrg2$Uom~PIa!cjdVilCG$oqG$~s6H@$T+wpb4q z)WfWY0a~z!Nl>XB?G5T<10tv`x}LoL7Qt+qH5i`kdc1u1e-SuTjU+IZc1&j_qmhYg+f6BivE2kGlI?ESnp?o#_Iz%j zPoAs7*?8{pLaOP9!j{``X66fNg{TEzJ*Y3Kz1NqY{wk!+b@J4eG3H2LGe;WZ=WG}Y z;%pd8;A|9D@;RGsYYN+WGY3Q1s3EO>PlmSqpZ4AbHqPrx6TC%=BB@77ESZ*MlQwNj zvD}uZw=Id$s?C?GNXtrMbX7^cW1}@BiQbQ4h*;FMD?M z`0Ky#bI(2ZoO91T_x^ICMy^ZK2?QIGhG;|Jy#gAV=Y?wK#dAyNaj92GpcCqjt%l-~ z5*>Wjm?dbOPHc#vxhNhtKB3;ZHVeK$Dp^P1uO)Z4=z)OqMHGj#51h^AHK+xer}}gN zvZ6S5c%aD1Uz+>6Pjs?8ABR2WVejOgO1Q2=rTQkRzT1DHMrw;<+Mo zI-aN_7mo#WG}pwVRe;1}J=qga@&Hs`Y%}W3|PVx z4Ylq-oX`X8HDZv7SZBKA zGSW{k{>8H0VeyB+IklG{)L?MM9tZ zWqsI`n0F}S+mwV!h6^CNp%Pq75*A=#D?-@T<47Y&b&-hJv7vqTYtk?%249xu`*9vU zm+wq76yG)RlDrQud$IQW#}-Kzm#AoTI1#1p==_Xxm~D^-PBSI0LeIdrJ z_aWV#6S2s})NI3tX}vy?yVWu4R|jW1L%bURvgiFybKG09ZWf5 z;xdlNj8tT!I90R+27`Fgg4e|$K0YF@o>;s$Z-b&ljiqF{tJNoMjVS7UkQ(6m46Z6C z7Oyx!t+gz6_k;GRUYas&xeKDK9>wkt$PI$=e)3t)bjkh>dTB{2x(?Y*$! zRC8P3S`$l#7BwDIv{NXsvT0n=UFC^%%Yy&_oUa$J4C)g80+#6)uMEaSV`2aka|!jy zDFbgX%kZDcPe;kS><(j#gH$9ly{5p?#OIr00E-zf3=;N2I>um{?n+xb$bO7q(;Zk; zcth)}4iQuwFNy`?CzrrVizRp2tu)d&hp4{jG7lD(IZyQENpLQGVOoyvq@oLM94wsHaThh%Q=!7^=#lh8#pgQ?^AokU*u}94v$p1eoHf=V6XSBnB)I z2Vu`Uf2d!TE(*WC@udNO8({JPp1s zMKljAyeLZbh>ZwHI1)Q;Q`6PG;n^~;8Cl>V5AGT zC_KiZi)JqqD+D=uG3-q=2E1Du27}Pf$_pBkUmQfCchD;ZF=9b|$d?zNf#wYVcpSx- zH!j@rjN;r9MTX9oTB)59iA$gzN9GcG5OWx}Lco({p``X3iwS-ZLwyJpFi!#|^q5GR zW%r?zS7M+6vvu&oXyaVSBM0mP7mD9$xxWN-=WMPpi@7+p2}}U6MHgj>3!T6rSzC18 z{(>0tbJh=VY#MY9rVY%v&#eX#_J~jr_8g1DxWGj z1lAMKRRV>=p6bINEW0_EaU@#4JA*IQ^PmM3Or9_`W8+x%aZ(D0@UKo+w&>lZZVG;Y z6c*g2E_uUHObI|+a<95H5d=8aLBI`m5W&$70)bkimsBM1pf=q^v}&W;GxyF`-Meel zh1sTiXZK{#vAD!nYq1lssPvzRWKOqlEqDk5X{3ifaSajVInRq>>=p4`ga+@dR@6%C z&&t*>a0^@3s=$cd(N6T*lfiaS!xd1nQ{KTs=zmLTr48FF z>XkV3I(s1jtItG|BbVC8wMfVf>6CGZC2*OOV~#EsQww;CrxBs*izoou zSH?yzv-Gm0#bdVc!g}e4HNQnJ%a^)S695w~Xq<`WX7iFeyiGr>!HZ))d#S#pyLZN8 z3GTj;ro^gu>PxEC?>d%&OS9v@papRdZZg7-CukhqmT; z9P`C)-&Y9aCMQ|66mT007F)dXM^LY_Tyojhw8^G)6VDKdJul}7SoQg0X%-|2+qU_X ziV={Zec{s2z7kjpa~l*z+r9@HwhfPjcWu}h)wx{2x>`@p+Xz-2u6u1H8CD{aIlYex z2p;?})9u<`(%k#00`4XY0#E?;>Y|7ul#B}nr`wE|y)sj_rP-S0)zX@KS1NHKr3)9* zT|^gh+lVe445o{~;gKm-=y=o9@xr20FR>($Gp~AvLT+81KomCg_~Y>~XBSoxVsLgG zU}J<;cF>17Xp~#{@rAL?hL(eDzFMwaJtY(C3U4d58I%Hpic<5a0V2rbHD)WZN3j~@ zfY8#z#SQX+@L@GwoSbivr%tESJCg*|YFiB&u&XAgjbrU;>((1{f|6l^4^kNG4`LWA zQ#7a}itNexXJ(7GF`$Agh9IYn4oNSb;sfDz+gqsED*TKQt=p!@`mb89O^cx*lIGVN zN$?R7Nr+RP9F{DngJI`hIvmkNACPE@4@op7)@fC|(i@AU`E5lK{H7uaGz|q~7fJE! zN*}?H^`;}q<1p#4Co}ksCR6=hBvbve9>B_%Eda?Wt$iLT%6TWaQQ3@jDsv`%m+i$V zxmi-=uGXY7MQBGAy6A^zR2;?Pf;~}NMf_McY?w2=X#$HZFNcZ=8{wpc4aSC4kMi2I z3lK^E+F3w~MNE|-0GLrfd?Q)xt23k9;Jkbp2NyS-Uo@rSg^Pr zl~2N?25*wmNby1uQi^s2X+*xFBW>v048N)a!E2L!JA!^9N8$0z3pSb%TNz!aQ2o^T z^y>V2xY9{9Es@Z%7ik2>3TUZ-4(h7Kzi`CUBSM`41|r-=lA7fF1)~{Af6(8pVaOK8 z&-~0155*m zb?(F3%!T7y{h9&GozkMq67;}hEuJ(3C|tXSYfmm%y-<_lQOD{K$?1*pP++j%qeLe6 z*@SUI61b_<-NYYDZUT*0IcPc^1}_hK>V=xrO&z24+!6O~kIT{v!O^A?hl?TQg%=#U zSW0k%Dwt_aSw^BaOB|WZ_R0z!)I7dD|C0CFJGbb7$GbM=9A+VqMk|r<=`q3}v zVH<>}f;TCp*G*zOQA~-$Hi+eldwmgmn6MV8+`zRGW%tf&WW$jExiE#m`+k@pB>YO4 zq^vZ?_Ov+U7%c`Nd$M);G@XewYg; z$X(pxbFWu%>#Mj;I0>s!f?~UuqZ|dd;>jM|7{sdP;kck_+3%^BhnDsuLyN&qkSojh zy?es(5^1f~29rB3-DAn@kE<>y6Vn}WY%o?Tu1u!q@U_eI9KO1l%%SX0k&*zxuRM|H z*PBSx0d~M*>5;Nnn(enddTS~hyS;@-RMHcxHN+nF* zQ;swG46_-yrb|43Oml~LpAG(6UbV;%W0muiPr^-R6@kKkyKooLwhGA(3Us}4X zK~go~bU~*2d!(+0c%03ru3lcIFoHQ`9{8?ZE@x^2OK{`WWpeL~56rcS7iZX&-r#!{ zPtIR9YR%*u3*bsc$;w|?@(Zu(kc^*y)l9&1zKB%)kyc?uKXyg(>-YOC7Qy^Lpm|LZ zUZ}xO$)(i>ZVOn_;0AP_zc^jeUrjphZamc>Zr$cJ*WCHWE~LJ*;gBQXk_s%8w54Qh zFyWI)Xek*PsI<0LX^VRhHVhu=rSR*4(s_AdUbk&29~M-+*o{n$!5rW>6ZBBHl+u_` zN?8fkAV)mO)2HJ}i4J-h9H=1_UPTs)a+o-rCui`&36P`dUS-jQh`B17lmItKK1WOw z!I)2iR{k;^ew9(8z2I!{y++9xUYa5qy&z5TUXZo=-)xlZkqG9%6>DA@GJ|N06L=0z z3Yoz^Lr^|A6}G`V)*JsV3-m(pW>#s)}XIx@Tp=GOD6&9V3lJj zZVjTTns`at0osP41YN+r8%FligHX_{3g|-V3G59q8_C^4$nH1%E2V)T02~JILHPuG2(qvuAzoKe5b!_^;yhS`xEX#im8EHWyM(J@ z?fcjqQ~(WOqyq&+Z|Bq=cwhw-tmq1fKTJsLO_=Jas)1kh6E1#Wf+M!D$q zra?-~*Hs<0_&q@KkKkLN8XBL#ai{_W1elW@HUwTpHmn--4FGD5L5%6WXcqBz!3>)j zQ#1uLhmh%=GV^$wLwE{d+;NO|vuoUx@b;TFcFath0i>1jEFtcaSwe_!(`L|^O$&+K zX49m}8+<9iZ)<8uASf8z_9<=QZXVPK%PXFQsf_mlGX@CGOQ;B#@cMq17;jC z1%%;kkI*xCD+@S>Z(s>V>4JI1wt87w89+-*fMg0OaJB$! zOMn3V9=r9L&kNM-hhXrKLd%wBP&=_Q4_JuvhM0d~BFJBNbjBKCeM&|#kDe2kjr#MT z$vp62Q~YN(4SO|eugs}N^@b2A?G2bFSbuzZwZ$;KU14fM(Q6kmKKPCWux}dTZwZt< zjl3=4Z_`;Xx5Z6E8j9B51TRM#;U!vA3?~hHI1S1mownA)5ifTuqaW6OJ4QcQTdb#t zK4m7%Y4ap#o!o=7o&2R}J}YDBVDL+Q9C^*7VL7(3tg>5~dkV9f9A?7u7;-+dK9Bf- z=k`uWKIKDC0-jlfO?U9t`Dui&fZO`{Y}{r)?rG`M5=*c3-tYGF41>SSN(&+dHpIdY zPneg1l?8K3cpYIRmMA4g@ubX{mN0t}&M0u(%0C!I^Hb&`&~{D=zif6P%x<}9qN1mS z&I|wq7y^I5x4xLv_)Z_T8X24uH~c8RcF< z$gJfI!DZ}x@21ogYU_^<;TURP5GY`ZGG=cybsS}V=ub<{CB(7+oMUEJ!MrNaE? zK%PPRc`47{s9ZMpvRCmT_vpVzdAgIBsDBe@7-N-#=gnu(;}?vH%oO;23+?Opn@f$P zsgkPGA?is~AJZ*pG@G49<4*@be=o5RYAoa};RquAnK9rdN;S&$+$cM3F04a!ttN8j z_^sCKb5&?hyM1`wRBWJSMkv(fC-q$cjeriaF$KW0a6Oj!|0t z=*BVHPA0&9-FXyXzg`YtKh?fa4?j@|n#{V?wP9;D$FTnCR_7lzNoqw6W@3wThB{oh zZVYif;>G*3(ge7!mt(n<9zxI}k6#w0Cu@)4e6&8!{eDv`Z-DK`C%`GWcBGcOY?*tU zxTJ(Hg4^chmwb2G_3UlLC#M15g6PP!)~TJq+&hwp^?PmZYn)zhUimzB0GNxm+~PQ= z&a2jHj*W3ci5^l&D=PufD7SLF+^mVx^Mw>`Blkm+>5VF8fJo zv|n<)G!43#ml#TXQU~L>zH@YP9_h4mLYsMzOZ&@6T|_MdW(Z}A=4sRuYVnUVUk9y_ znO@Rxw0@**W*t$@U+Uh)c#?7M+!ig_8 z*}gL$SJ52#0sQJSw3jQsUPie&jGWoZe4(M|4C*1pW5(Yd-F1kpyI*d^fjCBLL>fcg z@ilK0BQ31Bx4IQ~6dpjBZ(je0+*5e!!?zHdp`b(V`=sx>a886P(0Y6-ib0uC3F|`? zSLxP=cs)h2rNP%BVHYg`TnLYcW7TJR-*3*rNY)y|#M)i3PwU@I$1n`?rq}HyP%gN6W!i@!tC+HcSaKZLs5>UiBrL8I zuqRI-PIUs)e$sFkcOEi=9D(`(^0uFb-vE+S)oQ+6#9$hCqYUB44@BYuX{L+MfrU1GEf(au~d_gc^z>VM1M(wUd+4 zj!b=mBSU#cc}MM_h+pg>ZKqB_sYw|b?)&K8b|4-1lQt>KSS#fs^%TnOw3c<}+*G$G z37RBCW4$6(cSe+~C4WKg9VS{4z|j zr)}|l2UMPUD08fFLTYDc2FxMzur-UE6$A}n0Ng;IM#pCafm$CGODcH#c6W z%$jaOod?;NLvFI{GRM%j;~>E&0r@cA&j7n)<_Y{C1|d!&Cd`}JAHI*G#7HY;HqdS1 zT%hurPfkR_gEErb1oS6rgZ`X811#t5F53h!^H~{-a0l<4g!h3a4w%DcCt%!<_d{l% zyz8hQK+F;I2=TjN9wY0vKQY}fDTmRs3H09V=X53fR8w{Ibt)(&4}lIYNW3l=W@Wr4 z%n6j;XAYwNXMo2^gwJSw_ok(J?b-DGfcrpD)=S?o3OZxW2SH0mjOiq+dmOA`59rgh ze;ofY#W#)1wrNCht^AWAbh4iQ)mU>Sd9!2*zdAANaRROvNNPkCQNo?D7Bt;ar|FV` z_${ULx}nroOyzfz{72cIUuAtZ76+b8G(^lTD2c!Iw+&BBC_XTZ;c8;o>81c-9#gs6 zh(e;>ucuMmI;9ZV(7?vdfMWcWz^zdPBz5JtZ$I{ezdK}2J17NeyXLZPDf5lKjCzZ3#k>!i}ja z#%RNO2%)-OcjEO!UQA+r(yPI|(1=2!gkEp9*P|57;|JsOIDPcZi_5`u6sne{U+NBI zJ-E~AkB!ws>1E>*iK_}SRlkW5(r%yd>P{aMs6eTEN$EXN zyJZM%6Ly$t^KPx?*hm~wH4-<2iLRmZ!maZf%!vDjp^BYpG-vu%VNI{uyx4f;icko- zD5%#bdI#l^p4Ns)K=e!NNFSYJSem5u+@uPcdQi|Gg>V+}pEhOk8Y=10K9jRF8P7uN z)X6@#+G=d9pBhC;>Xpj-Ch^W?obo^}&=#R^pT|?v<4XZ9pysg%CAXyd4yC{0j){Y_ z`6zOUB%}6V^HHNRWxm^!-&N8(xaaTolk=nUi#3d@t9)zC$-UUs|n7vF%uZ{9G^qeBrrM}9K z)ZJrJCW{(@=EYE?77K2WQ9UBi;qeLGIHQ80LRGhAbkb;yPBogA*nPKJ)-+mos8Xuo zRLy=gGWm#cj7C{sh=g50ytB73KT$n{`mwckX*sOLkxn>FJFsGB4;+cKFm3X;zs1-T zy3&aJ8>{8xuy~9Ct7(k76~XV+aJ3Cg0MBuD55Yg5hJi*cf5;Vbs`~d~+Kb_Psu8}G zKB*k@s7*a3w=p!BzV{tRSsZE?n@bvA)0uwbdZV!EJZmC~Q!DxH8z)F`jg3VitjbP<>8ljqlSl>S@ zeek)WOY>1{LHjs#(zZ98s(sM2FzNe7)v3B1-jxpChg3(Fwf4F-2x21#ckVQFG~u0h zr?)NY%Tgm!h*EAn-G6x`p+<;CoHMYx0-2*n=VU6E~nkt*d9smcMHba zZf-c!G-CGCbygi^UECmI8ePJW`Q-A)f+ivdm#O^D?U;x=Vqnt{5hcHt2J3Two3O+N zuyVc8TngE0)Z#+cNtXjXhs{ys<~}`SoSeEHUBc2Ka35F>qm3%pWV>Ix9pJQrf{-~E zffCx^n=I`sZ~T7;T8tFzl`PJx)`UOXD_Q*9=0YP{icSpjWl|08c=X(IG!#-$J+1_* zxSJefH~zLR_XQbVD%4~Z9PSBmLL0{$y%?3%b9qWTIL{-fHzH>Zb2~=TfDDdssCh=h zwK0L3c>Z7{QvYzGc5`-lun$s9;&jQy_POH|LNkXx(*F(ni?$ZBp3rr3048GIozikG57YgyX!m)V zu-aX^Fx68>XVETqNZH5uW{>QDcB|uS2|mt)n6D#%i#uz?f?3a)ApM!$a{5UfTuVqf zg*o~JoEmpyrc(5CcHsj`_)S_^$sI#4;@!dQ=6xQ!v7Hf3)jMU}8K|?^rH5ZMZgPsx zdxLvse3#NdVZ&Vxe*6&N3tj)XX+`X~+z|OVz4dAI^b}}-ypZFGn`C;_xsw>s-8i#J zV@^t6FQ861({8Qj0&4C)fpWYBg6&7$L(Sb$ioWmgRpu$8*h))Nr*{ruA zaL(wBC7kuJ(cYIHuXH2#o%EhTP3q|$`n?-3mSaz+Y51&coy0qDOL0!rLHoGnfX=`d zfnWL{DP0p*vv(MA9An<(!}62>lL*n_n!BnTW$mxtw`Mx&2E7N4wwx>HG4~GR7MTg* z##3-dX1@T-dddyfNvbq!hw(Ozx<=sQx)-j@r=(YT+5oZ>>~g|7k_EKLY0=1Vu7!#R?s zV*sg02!rGm0 z7)HGv=K$8efVOtw|7T35+r4MjPYIrA4noUYIXC^&iNSc{t}S(ir)tG)D$Ry;!IB1nr8kGrpUec`fYTr#9ktRtM z#IQPpho?pT{e3|5a9EbwfsYGcYRcVSy^iDV!c0>MzlfV5j$tHJn^*?+K21vX$DP^~ z?g+b((6)0 zPMKml4Y7QwWwLA zo?mZPXAH*=`%pH~^m_cdnYXbwTl55BYxp~hndoGI51DC!wxaDdv21*@IXuz&Vt8vv zIplecPq#`rstqY`kMunC<^z8ul*ej&w~undKDat#7&u7ngR4$z-ytU^e`Hu!0Ob3j zn-=EuP{`HO*9hU-ng_j}MorWMTsx@Ykm@EJ9T%(8(9h>;QSD6R+;HnHhqqn&buJJ3 zXQ6SOOhUhbt0kT3q9rc_s^=h|)9a+H3w`*^T1q`?HqZsvs)Ur;x;u^L-R%s@@70@7 z@ky<62Xsq1_L=ozojmqMH#@UFtQ&DSN9tPTI)r)vX%aBtTq-q5wS%NllZ?*;VR=1d zNo_}^HMLpEbFZI=nt0f2N#7poJrgKHK1_{I>mx-=uKQe{{o1Ha200!~%aPJvP}3RI z?Q2=Yx3mQvpL4*r+&hj|xcYaFjFRV}MtUF*s5-ow?df_s=ZMRLu>vO3?zr?<&8Fej zaA;UhqZsNsT(gtH!W%SO&`a(kF326y;e&>f>W!4%-iOpxQcoJ(T1zp$_*^4BFO>21 zbc%W~z<7*fb)0dkU8LhM{Vue6b%xNmS=mHtrrr?MdhIbxL4u@FQWGuY?)3JA!!^Wx zRGzm^*`nD!a2DLiX(s7#r=MO)hnA~}u)fe@%e6>&b4=r#)?2GNhVzCP3T6JSQ0E9} z(`h|*FqG?ZCTovjN_eeW?zo1ewbq@sqTS|#@O9Jg;@Asvb=oo<;Aa@WJ~Zlu!Qw;LREFP`q`?`~OLMqAtErOpH`X8LL4(iNv`+k@xP`YnVj z)jBnA{S>TbJki3n@fa{Zc8cLVHRkdk%k1$7<3J;**D z4}hjt7*L`Ef9+ivr@Nd0b&4O_`jYb`XWVeL4uGYPB7 z3Fww1&=O9HoecMtJnYw<1{Lon)BD%Vem`$oPs6-HuOnsB>W|;F2kUE(+LqnE610~G z{FXVplXsAt1RW*w5JPI2bahj<0mB%{eX&;drMCiIJWa9!#>Dy9^qgj?d0*94CJ@jr7F5)_!?&Fb-q1H2dhs*q(JyflCmXG;V9z%oRsypDSSAFvWZ*47%Fc2Yt8Dcj_UN=o}~J-0tNra5k>_2m{w5Ov&TP zwGXYg?go#{?s)GP}xo|e($^tl^i zDtdboOORi?bIi&9hVT)K)GTOCS1p6z2Fo{Pg6m3NKik&eeMU^R*LvdKJ^tXZisJ%97@GZXO| zm)qZ6R+@9(a(x6SE7jXysSacs!c|dm&09uzTe`({*V1PCZW@lm>ju=>GQB=AN%y$ze>!v(dDB}jFLGAHfOE7!>}EBs zhZiMt>j3eeQ)f1J(PRBn&U9-CORJ%W4iv+{v^t8Yn+HwkbXnR}XCs#8XquLJHTGxV z?lB67ogvi1djvIO7XYVvO|#a` zer|P%l21X|kDk$(uxMViTVR?pB|MYMAbfY+Z|iP9lNs~6MB`g zdU_o0z-nH-(zv3~3oLoN#A&3{21g*KF+|C-%#{}Zm<%)rkzR8=CUb?3Lmr*<*K@HPgNmdvD%AZHU^|Oi$c0#yeltKII0^Y)V?B zOmCVkiFX6()YNfv>jP&uC7k}vA<7-CN1jf zJEt~bz5OIQcn(eyvIf%-Cs(ppLOFj@z!Zu{Ab1#s77ULPBgo^Kul{Mvh` zAP`FP0Q*m+%~vj%Lbh^Nq=VU?mM7VEq`ls>GV}!2m7VMqK0}{DDlcSH?oMp_k?7vH zV-=K%l%%`h(@rU)oR|Wf(nYEIvd|N;531ia>iNNtp^@6+l+Bh|s~Pfhr}ZkWbfmBQ z{Thh7`fV!I+@bc%)R{&1x|vZY{YZG#^K!0;UIWTo18lm#tzHw2a(js%Jwb6A4Bc7t zoDUPn(dVL&hsXVXCb8>I`kVsRW~~ppTlPe7eC4B|6`p3&@7KDs1r%kz7ggrbX9C({ zZk~9Wvff4E*_>0*zfNJ?qpKwYextNa$|PM(gSHt%?T@rf4GGk6h;8tWJo1@lwL1T4 zl-o+I?7%#Yo;2xJv<%YG#tO=E_lcD zP_GDSDBRxh-lvWOBa10~E`3H&_wu>6Dld_i3%8@jQQ$ki`i->GLu{xl;NlZfuA6EK zR|}?_D+qZzwOm+KbLAM&FX~DZr@OVbdYFlqHR~r(3)Mi5iFtH+uta*>->79{4{|2y zBOOxueW~1y^{<~baN(z)eO6gUULku$W6OhoT*fbz)6~TTM?I;TrC}mHr`cN%M#?qk z9UZA}la}z)jXg4-#OJthvI*cPZheo`xxXG1iWA4vBW19b;yjGzF#S$GrOgMk*`-Et zZHDT#--t^^pm{)RXq4YPng&ygGV7UUWe1@hrEwZ^um-a5bn|+nxN1`0L|T26G4U^N z@mz))mO|O08lTP|_2rOLhnJ|aQ%9psBg~yH-?;AZ7l3h|=zNQ*Yo*~!WS__|T0Goo zFXc+mk6|)PlWnGls~V0zwP4=FY3^f8@)V+He%thz=;xtf?-THk<{V0DGlL?D8jRy> z%O8EN)p$29tt01z?@|-cML5mP^)<$Y2&aNZ^;^k))`KeZa8+0ZbVJA|IBhJ zgz}1O7_N|<_8zTO=wK|a#nkT=F*g8xi`FK0Au2ykLMs_ClwTf%jcTK=m849wA$s!N zyl_fJlWPne({ScQb8?(H8`IColRn~e2>lV0c08VbkzA2-4U??XQNCcd@(=hSL{1rJ zj3B}7N|`Vu7^)UDaPmoYG>uVkIEff`cuMjlJ4NFN7jEjbLFSUVLM4c0lo^eoyJSGL zN6}V16SU@*sLuMtJmJ9!RiVjhbvdQRQCBOMz~KR99qL71mEGPtAA4U%;gwP~xOb zs)gp!CsCswt&Y+-g?2K3r1!gHSg`?bJcDzg`>T z!m?bxNGqr6m2s+DvkN{VwPBH{pFrmh8(H6!^kET70zaW{9(Cz-A8FP*zdZI=Tfn$q zqCUp`Sr~yH#?xjnk)y&f?csV@OPRYe11S3HbJRNYImEf+N+#!MD^%*&kWNDpDm~=q zPqtW}R{e76?Zjv`f|X=T4Jg*5p^}H6^j3X}APqH#(=TC~;G;ezHE+jK(q2Dj5)Uc# zRQX+9Kf39x`yk0rzmfHGGExZhq&Qa#dQ$*}v06U3*))d`^XMrz&C9(?GGFKUMWsV+ zu{w-oj;ux2Bg5=McwQ{oiFDBrnR*kfgW3||xd3P=xLXkuTz{n9sDTxSd=Y?K_x^V+ z5Z}IJOxd-keNPuHPHQ7fs$|9QEC>Z{ve$Y}-}(MQ!KwUyvrLrSy4_3djx&>LdC8)N znjSSa)&2Yf9z=pldR1?^j8HU&x*`uKm7B#Om5$)q%4J+JAD$al->6=tL(RBUlp3cdTd`N(l%5~-a)ELNwn|35v4xD0$ zha>5js{`u#%_%^_Z?t?$`JhDQx_$tH1LmtBy9F#N(nOhFjKpFo{_!=BZ4&WUg!(r2w%Pur+lAf(^IKo-hglej`MR*s?PV99+rc)F^l zDy!dO_la6|=eE+;to)9P1NM|W42~X~n4)6Bk(e1GLv}55?4oL2dXFM}=(w(M{ZYTA zdhE?r$-U!rPD483bm#u0+NVfedMl5MGY8Z5qU+bE6l%r>Q4{wM>hI8zx}2IpdR12? z^$O7?CO^rU5&8)8rMGPMlZsp}_9ZyWXB6vDAfLP_r679OBvtu;_Eb zJO_zHSIkoac$B-kz3NeLQT9d+aP-_57L$$2IhD!hz=50zPK|kNa{$Pqazl?opyfH< zBltAxQUu?|y92RAr(7WJxD(1-;h-HK*QG5@kNji}DNnT$r);^Q4eh6CW0E-?5*zD? zO5)Z?Eiy;P!o@j>jcbHqK*t?@hNCbtCiMT|-EY)dNJ&s&|WWFyiZpn~d@ z$0UBF{1KHuPIps$t`@yeG+po_8u;O_!Ik9z_n5M!~$yegy zg^$D;$yTpz+l8KmEP_NtMJ>}oQZ{QtvNUUzkhqvIl|O7YJ9hR z;o5#12HV9l4+mH|FU_*l(YJvVG)`+7m7yU&blU~waOBgZ?giXL8Rsl&wDxDI+(Nm5 z=+{_ko#r97!WBDD+>!tAl<;o+k}L0)Cw1xt@F|@^FG`P`%V@f;7j5H3KsgNVJq`~{ zoIu7cAWaIyr6Y7LSbp1x;2Q8qu0FMaSUTd zuIcIr)WfYp-Jp)`X};VE*f*2?aKG&djAH0vW#)%4=3EtWeHgBXl~?A$3UnPpITfx3 z953bgM&%2q(zr}7PCr#WxMt^(3jQ@)UGE+H304?G$=W!H(;#p!ufCv;5$569AIeQ-^PFQbn zhs%Sbs4=-kat62#o!PNU7du-R!(OQ8v%mi17$oaTI;K;GehxQ{yoO&&#Lr>=zJ|9@ zQxrvV_n`R=Q2CRfu`$f`G0^=GZeL)m-h{-EekbvJ8li{GC#4N?Q)z2|{aS_r z`51chq=hReGh4q5y*t?E(VNVv6-@D`Uv>oW)kq+N1Sb zi$h4<56b~4i^-+>Wp5v(iB=m>2>VWHGJ(H@Z4#sMY3V&f=3sqzhk#jPFs0N(^-IO- zKU6QycLe9d5Cn`{JjX5)gm-*6?~7vu6Z!6oLBjRxz7e`o8#?tOTt1v=enU z%3-dJ)ILawt8ycGE{?Lm`H1PN$E~6!y;6;2C1nvcP^YgETg}HpEhXGOb$3@q@bsKt zqb_K;Y@pd+*V7Dz)&aKY;BHd0{c?ccvZMS2HgP0MZO?=fw%cAG64D+bi>s)0 znaSol+k11TGN_<8_gp5o4lk=WW=#J*rURAKPIlT31dpH$ zV$l0G_y+ZFGHW{9dh)$JFJyZ1tM#YDm|XR**PB&s*@Q-YpahyHZ) zCs*s~=tRC^+dXErY0LKI3aC2Uf!A!dtF!$clbg*IyEbN!p3N1|*L&D@R|lKw>g-&V zyOix}#|X4{aTwZHceZcI-ecNUZ|N|ZExAj;bao56wbX`KG`I<{qw=;bTac33($Sg8 zU0a3jAszi`%k*t&Uz2IuPLu;rl`pd6y}8!_jsHXf{wcO9UtB|MX)<12{-BO8hjGz5 zzMQLk+1BypyErnW5y{+Bsq$5Sh|b!5YtXyiTx~nxUn}itBHq!UzIWPR4pRoG>Cbk7 zBDKw~fws0yX5*$zcV~OHjmT>g6t)5BZP|@&>pDBo^r=jig}MjY`m_D*J+-|Z5(m<0 z3rOcMTg)BE)eZ~I9JVxb7!84D4&aB$>p&HiH-sK4ZvZfmN9Bz!X$vm^0%U%)E5}m6 zvsQH!M6$_rY2ssDxyLl|F=^+qU7bMgDc4u&0bxa-|6zzL&ak7X`Y`Yk2fgXWSBIb z&5ip>;FkHaE$fliNGj z_2w#H%H*yZ5-Zxf3i5oni$9gGu-e+YZCwhT@yRH1d#s6SK zXGgB`ws6NV_U+z)yH?(brMPksS>J4_OdPD1wUpDuiZSK9G#5-EzMy~pf zlz7LM;4e$C24J^xBPj8%M%>I*-<1;Y+7kR_iJP{>%}xjqQp{=sdL5iO)87GU2f@~{ z2JE-;ja=oM*(?UEjRS`Hfv9ZI%-hmTwJTSBTbg;>Hp5>uQzfMUuxeLO;-*FnId4DH}QslkV-wZAzSDJVqALurWUKbNtR#T(Xl6ERO(fC zxTb5GwR$vHQ+a5#mKuNA^ii#&dbGz4vsRs}ytx{LjvuLfrUN`Sn{79gW0)MLz|nG* z@8>E%BxeO9{7z5hdlY^>wWk0r;@1oy!w-9EXZzY1k9YmKzJU#K;I88z3MwF#>k3Ha zI@;^0{Bf57aNp^vz0e7=!{^M+njVonlz|2+8JRR z-P$R#2ibF#9|ZvaNv`szL|JV~@pnakUc(QmQRz9en``Kr}O;fUi0iIT>j_6(Zi$W^D;sCI@74za%w zF~o>XC<%%GZ5F2xXWUlH<12ratNeAY@;4+7kXo(^!6sPzD`4#`v{6Z*LerI1smm;! zw7JS(L5@Do+H$q;D7@b%_z(#{TrZ<2O(8J={VzE8s~w`<=4yWeBxU;8#oC{2rPSmY z0xux&>$z$-o(RZLRJ)O@r@FoyavwkV2Y#+Em>76L^LVb$lFF45*d5fL?E>uR7>Ems zh~=sv5UNFxgVh@%0#siL1Od=+V;!qvJOXc1dQ{%bRer*$PKf*jcXh_1@0zT=iSI>K|!aZ?Q|Zsy~vd-dZ2@6~b@F zRwt`jl|_|^;~kRwb&HJZ7abO=uS>!gH$|jr7tmWX>FBK)SIJ~h$x*3fQl3YXRaI}M zS5>{~syZB0H6WFUE?6B9nh-QXyjS0sq%D>y*xo6c32^nDT-bX%`jFms*<}d=+1|Y) z8b|z8f6TfoAH-@v64oC|KkqvbD>o#sKvTKll7Ai~-<0H^gVXfn!E<`@m{_F5zX?Rl z4q@lj*D+wsTic=YR(>gBUPqYn@b#UYYjV|IA=hdzIZm}-1NZf}E2m^M{%v=YtzWCE z-Y1i~+G~TomQz=IHGb<_GN4@TXTZmOe9u*%!W66gOk{d{H)0^*Ayw`mc?qxg+7l(} zo4M*kebTtrS$iByvc650V*{v4kORWN1;8}_93AO^YyvX|M{YmR*#qS4%2oH`ALbE$ z4qEYZZCwukB!OM59+7Gu&sB#y%_>XIIkMq6u3(K#R zIoE#CXAyC29mFJ)vzq@G{bc)4aPa7<{k38#zZQAWYV|3=q)|si3UDP0_$BkzjHF!c zkjz858sK|egfaRwgjG`)geF#&ASA*JR<{alFHhFuwB@_V&{ds|YtiJaqG#jfYByEm zyTGrmVfnv68gY|AnPNZ5Wh_@c1-k9;5U|feZw7fkm#dy71EzLf`3eBe_FP?0Ag}fy z3_grPd|utEo#~e!jjOV^pa$Y+jdcI1PN9!3@MjdcPjs+2EM(hA+>SLRMXLbw0-}1Z z?&7cue-}+iQu5LsAVHbRSGI^s*_P}eazU|d-z@9YWQ$moTs`P;0&rmyz&Zj;e_hsE zWDy~?YhZBOWb$28bIUd$YTL%n)tD4t5N2D$^wb<*kbJM-+1ZJ;j&h?f#3bOe66w(TF135xoRHZ9q!6q>w^J^a7?BVSUePyxO@AXOxWU7?7LoTSshFdqC6>l9+n!*-qFR82Scd+NcLt-UN4% zMZreCgXn8mjJ=zy{e%@&zXMvx4S|RD$|@UciJs~b>_62@YX(+jazmIdOMOa`PqDh% zyQ?w1v$>((K)`Y|f1ay-fUfk(K>b_?v=80w3m0~^U+R$EblH9>nQwYIeih5{t6=>4 zba>u(W&7;-@t5QGz8$~!L4iP$Fr}-en|d91=T)e~kV5j-+f#il$e=7$mccYdQ1 z6tQ03TrFaxKp`3~)<=q4R)z&O)yN-ocDDDm<*u$?O)o8;zCOuC8sJ-F*-$019LF?OgRMLcbcWeyva9u6NoTmcp1>s{0zpr1}j{o%v=@ z^-U0kYJT6m6P0J%a+hqiNI;F%>)=E*8$d}I_mKM>Tt9g*qSGXz#TCvDMef?Rn7xqCrhN^(P*HMvTSl2K^P++rY zK*4Y_hHBqmsz5_ks9SG-l02~Du5`LT;g5s}vka`3E_=8M0azkQ% z0l|lH+p+ev^}W=EOmEAKhuVxnRG;6LRx#B<=LVKDm-!~rZzBC>Zs>l9H>rX}F+vyz z{GuE%YA~GOB(`Af24*T50(n3f`+4wR#0skqV$s9e4#e(2-W@@|E8l{dN2}h0ggv<- zViBzmf$Qa}KNUV#gN1W7FkXXT&(#hHeetKgza63n=KXe{7u*nr)UGV1;+CwEM6U8j zxzFb+X!vkXZA4oUdbEfmIp(UIN}NetBz^x5#Rxz-30P%sK=>xvY4wtD$m*pnRJ3Ab z4|@S&UIi+|+U$p@ic}(ae4pcv<*N$cp`T2KXuSWvK0#ygw4gmN&r=Z1cx za|07m_chLiT;;0(?lAuYP}?^htRYU$zCKs+N!JEy$_@2(u9G%^mI{P#4#mzmC zo4M+bz=Ep(n*0=1iogLcAUhDn?6)z+d#=6#PM~=@s6kWyaG~%GSp{lBo8<{#S~~#l zsBu~718v~Ef3w|+%|5U&Sit#%)ilJL=CeU-A6Hrb6}zKg#qih2k-)RS_^(Y0N6GD= z9V2(`c~0@#xYcT*nba1jYF(QK>%>Iu$#?bS!Q&}*uT4Xx?8&dcw^K~?x$4ilda4DH zH6lQ=P<<|f_GPG;3Qe{0ZDf&#E{gUK#@P+pL_Tc(V2K6&rTV`~I!te9Vo{!-m*?xk z(?RFb`qi7NRiQq&F-F3~@Q8|p1%X(Hv{%n|(O$qADK)($&joqDD$mLQZTZX)^!Qpz zkFRz8_;Z{7#zwj!UD9tM7 zTLnTht5)N2SN*Sa-;ws==Pl9mAYt=cLU+y+*f4fS7E9*-bT2O-ux-gLU$;dbe#ogW z^bbfTZiza9gr)9^doXxOaYu|WsW0h487AJ7=A;-V-+59z2BKFPmrWnt+WgOx_=CJ9 z^h+<8NP>Sm^Wdt;bfGDk&%{_4xL^Isw zLmW%;VT~pEP)3sm93bfwST-Mv1C*Zeejl(pS$qKNWbpw_&k~T1Kgm)^$4`!sP9(tx zDU#p=;wNl$_)?ZsHh0GHqX{`5A2!Nw%tramXw-;nfUcx^cwDc|OLw_;)0{5ibi1X? zN!gr;19fYaT`}88wCslAdvgJ8wY8o%n%6&Pc}(AK`6$7Z6OZhvy0PWC;CH z!;`8XYhG*^ec8vO4fL=oG^k%Ei91uW&5cR@YvtgsuidMkWzf}<-mPepW%C=2&=t+x zv}SjWpi)P}f$;AfJkS{8blQ8QSs~}yrk>#H+g&#M8g)1QlCe)LzX)l^oyQ1fTKagT zw;4rz**vj)7|7Rn`hw>$=xfPoewfwpOuZh1qqv$vXaUZOykwPM+@L!?kG4fG%(|<- zTCgTm2C`AnzcDWG!PTO-$mf#6{f;z|zH=BI32#VGy1)BJ%bxIWI!$JET~0d|=~r`9 zQGV+c93yuO&)+92N+$>(h9|=#Vaei+I>Is0^PPTm_b1Vf8=&6xS}= zP4RVz;QzvE@uur)Tis?;4%^?y?C$~lJA&K?Gi(>ae%AgzZ+~AxwgtY+f@U=~ zg1^|o=a<>~GH7jm>jDF0v2Rx0&k;F4yZ! z_$s5m#m9FU`~lzCf$C5A_%l9!%E!;8f)Du0K2+Ia@O9@y3<%C4iv z+7>vi;Gq^_Fw)jj#P)qTiv6#&9;z+!?46r)#&4kNG#n(*kkdX(9I z%%I`hkC^v6e0;BKwYBvkzVdBEVNt!hpG$Az_-7na_+TON8a7LGV~aVzfd?DG?gbwM zYo%SGGXi&Q2OiZUeB(%8lbi(N+DNz5LKDdv_XdM2Qcm(Qj>lDE;Myb~#NM?TJ{I}- zJRY#KWAP8_#XMSrr8}%+z(tncH2RiZH_+i;v)T0n0910&gx7_A59Y=TOs=5)b?U>y zH*QV9Y7S4Fb?}~Gp>^5yMj8;S|GI29KB6O(m|eXG-oNlI#SdImX(DNBgM|jB2`sGf z6xUT)1-KD-k6B{?Fakj2MtD+T60$-y!fOQFMO{P|jd;GN*ky#B=rx!d`mf#7Y;W(uGc74)*Z_>xi5h_M))Iasb=8m|$7lLoYb5yph%9 zqcU!XHSm}Ov>Rk`T0P%ZW783cw(c)q)ZmwG@XKq3a1MhMa-YXLTgPjq;=Nz<-d|rA z=C6F!5B#1GBg=l>kNyK0MNkz0RJcF^%=Lx-flgYa!tY zo35BLPsEc>M1;B`%WDw%Rv7tK2ZpoqmKdfhZ*_4%_aMApMiicu7}3gGYY~#}LgYyP zA8Y;}2Q|JI*7%;}cu#Y@hb<&-G*sT>BmiT&p;f+zjw=0CZiGc|1d%tx$eU8%FSWj3 zO5j%-_>}~Ht$|-N08vIhP&Lx*JGsgY+w42q?2RmYSbaBFxhXxYzN_&tG$Q)Pa4eCR z_aGwW|cQ#JQe6L*h;^2n~>pzM?F5&0f*ek&xi6rW_{GNv`ux~U?T;WFo z7d3FP*8mT23c+>?wqWIf{S>xe`Ezcpz&(-GR~HB;JsoH6gaWMq!3j~^2GQ&U!F20uY5v4$)ZQ`pLCeFMp3Ucar8w#oPC!o!))ACNZr zaP=CpU<+sM0QM|TFncz8_W+Kv*moVc5Hi8|iCpy$`Uha8k7Tkt(IHIO1+*~f8&nB} zr22Yx>p%yXC;VF0i3h#z5DAAAeM1t${6`h!quDzKR-vyqqs3T4_UPN*vGueh$_{91tB~H+-dP!;L-2K%$*OCuj!jOHg_vjJc^Z_YU9``K5C>%0ro1 zeY+Dh#9x_xUmy`d&kkna>*4HsU1r}7IIh{*w}V(^Q1HJK#iWjJX&v8^z;`w9-L*nD zfD*HXLLLkdM57MOy(0D*Q|;B5tyHY~+ocAT2~`mg)t_i}KarF_)4-oe;HMh+sRVwm z0sOFwAJ{H_AZaQSsv;ArDif+A6RIi`sv;9=tE7tBDwe4!L#_#TuC3FQb&|4C1Nfl= za$Q@pUdlT)ZRa{GuHo(m;p+uRTC5YA53}NjY7(~lF$R}71f2AhH)II(Rhp?C)n;l( zHTakfKDJI2RI7%H&PFA44ZP`k@>rmNYT%L}FW41Q$F}My@=?2}Ehx0p_lGKr(@deP zTEAS4xszHpwHl|8XtbyiwehZXRDi2v8VRD2`m1OANCI?FL#brVBukK!ZD7_!gRtcyVD=-dZMLSsm+h(1$N)~L68q+qRWrj7! z9|=u=9m_w(@nMVO!!lfm44mRyjOYGJLLmQXgqA%TK-LE7!u_Rb;* z_S=J*OLr;kD-J1+aE9my=r=a}xxxK|PKcQ565IgbDusDNzY(rZ`q)QdNAjl1oW3g4 z>fzwn2#t}Rzb{bM-j~1!8u%bU)cYZ#-j`|Khn18Zre+DkK+9oZ(H-U{%|0qvHB1R!GVKkW-NM14Y^oNca$KhKv?9aX5hmU>Ft; z{#N_R9{8d^Mezy3QVhhxO=9eUf2j{*s;^JleGSo&pVGwlwTbVu`_;D@a4b&|1NUPL zU*(S_Tjh@#sBMuzZObN1E9oS?x5aq~4&2CaRg@_FbYlutu0zKF8tHf|5??m0@yZtA zHo_Kb)P%4+mwK-rC5ct@2tzo7P2J#sA_PocvcqkeWsR0KGEolzCu=#v2S5|}1Bt2* z9zW&WCT+k`3LuEjQ1wSz&yPZCto}&q9GB-bJv~WUfK|$N4yfZTQlZ`mn3eBH;CmYQ z-a3>(r&L*T{Qma2AF1Y27*DO|z`a;&(m4ytx3c38g+7C7x*b{D| zzb-;Xa|c(Na5PY1_OlK2J+|*qCdR4oTyha`Aghf7DkP90FbIZ#;0}U{y4!bv_;)Dx zS+{BjObnd}5f-Ghxs=21w!UZG%k%E#C1zfb5H*0+$c;s? z{(QOH7OQ+Wczde@`78STaS;2S#J(4VZv<~QCFPg${FOX^%_r6}T6fmvtg?GulBUmX zlKV}G*(uLG@;nff7?ALYJWt5;q&&xi97owPioHA%sO9o`QF;e$g>ZZ!$osm4za`J_ z%2Rq({fWH)nLK|g&!1}rA4ovD2Ikb7OC*dq#SBwQj0 zRyH#SWU~A`CZ)dO0EGBqjTKEiEaepgMZUxShGe*6Gt>L>{2(aGFs++-<~zE`8ztiV z%w`cGS-`aj))qdm9$+f?4d0LQ9n6F=M&5rU@8j~E#uL+7p5H^GZt@~GW-ZdHU+v16 zE*P_6W6zk3nQXiBnNoh?$@#g_SEmXKi^ci5$&01=%jFF6(G3N6Y-P;W!6!#2Cl>Q_ z)A`c$&Zi5dGV(qC%DzFI%A3sI@kA*Q+UYN;Wc@n`M78!7529UKcW7Z7M z&(0PXPvpxN*G-*2Kb=2vD@-kR2elC~n@0-g^T;)xCxR9WrHR5KakKvHT=5kk z5p6ClUOdEcFlI2;tgVrl7z}C+BaQh~#&jc$iWVp5?+CLXTs)5sEfyNVuw@(E)37l%wR+Wf5!`R zg;H^9Ff8!WzR!Hd^>wjSoV#$lL4RRqP`|^aAhj^@(KPqM?d||jdd#Bq@QOp}-x(b4 z!`|WW{KAzDG14U)>77_wSeP#@mM1RGFU?Gkm*%Gm<#J|FvA#XV4^GWb7iK(Gpi@Bj z(i-sHsW<~Nrt(EQtN#l-ey8$t`3r^F!rbB@7|;A{p0fjd=k&SX#7x;a&?wu^U^ee> zbvEzcd+z-H!v`P9Pw#)^KwtT5i+1V&V4%ruq-V{_1kXJ%3v$Ze5!KwA5gh09?B9)+Vf^>mEAS}cY1 z>y@A+KtpK+Rj3;o(pkLu| z>6~b<&#op{Iu+Jmo~)jLabc!V`Co#5M`rEc<+03*dG68@>|-HY@m3Oz`c_vdSaA$d{%rrh+C*(QcUGZnt~}_>&ixX3s6arnCs~SD#&&h9xcp zqBZ#p<;0c@XGx%))?@R~6m6jd%V?kqJR6h>o4PGR3Oa@bCqnTJKslN*9nWA@SLh3r zvZ%HY^+9&1d|0-#l|^~$$(VJ1q5_39 zh%8uJ1s3$=>?@Gti?H#|pI;pOR2k-&Czobsp3cuK6;8n14&y8=ld&wJDQ0i$wwOKn z=>z8rkDS|=e6_3U;}nhGfI-scc8ZoeRane}N9C15UnVe|BCn7J6?)BQH)M*lVzb2OX)wPv z1%&foN5EQfVG&(mmKMmHj@<9EsK$Kvz zW7Fl82it!G@uCw(rufPOkfbro z?OA!?QPR(1w`*lWM)hvxLH2v_>VS)Z2=WyNov1SNOQk6Yj=-dE%-tDt=QI|N#W~SR zB59RB$e4{~DWmL&+RlpWScQ_&>%s~KHB>ht8=bt9+%8#>}ZWegX8^Q8;mx-jRF3rXvW5jgs`nR+*K&ieO#?X zfk}z(4e-iCA_qH3Q!5TmlKA;ju>iw{I0-6=PhsIYKc{3%3(owKE<2~@m*y7f+hytg zmEznKD4U^~c{uE0lSr4*bMuSG3g_obHW9(0^YFIQ#qn(ZRmzT&*lgl@nIK?|J2Z2F z{sR|h@#Q2mIc-?QI8Qq#bIB?g%jzY} z$gOZ5EX?K4%@jt8C2Y2imCH+cftjmxc<7ujURWwwjzH-*6*|+=6Oa%U3#f?ptEs%L zF(niFO{k}^W+#-G=JYigCccyv%oYf-jpzjr^(wKkESL{HNzfQq{fjUW;0vsT*Gpta zDL`yP43g*B;Di|1$kuFx$8R(vIGt?V2>)YANc}KEAeov4{6tWIdTbVkF_r|_O^YAY zsfa>dYFEjl4t*=5tac)32yTafT1U_|6~?iEHl}gxEa%f1I1XM`?^F;*;j)t1Nd5|d zxG!V+ri*0`_p$kTxIMy2ayXBrT@lt4G4`-E05Cc?y)X}R@YxbD%TioRkIa=%Uxrs= z`C@Saev<038I)p<(fqk%#W^msb(E)trshjmq#mItw~0C_79}_oZN?OtS(rt*@w*`1E)1^2+YIwc`LgS`p#o)l!0W!jP(3SZK? z;9k9mu@&rV%*lW;62kKsoI*+VA|@{8_Z@sh^G2iLWlJO%%fmy;j~6_4DeO(ua0R9i zczP+#kqj^9%j2cuD*y$Uz_}m}Zs8RG!dY+z-rF>M5^9-3`I*sDiN^Q-jM*YFh3S|J zAF)sNXj6|}A=E z;G?CjEIVu~6gCmcD-*W)^XJQj#gzvew|{1eIH9pJL8BZfuRPGW_Yr7DD-b@euso5s zB60Zp5X({7vH}rFV?lTn&%=Lq1ZvmH zgN~S6oL`x+aeg=x0Ts`chdl}u2jS%W%7ah#37ySlWulN4yTB~85^<=!1xxXjXU?v0 zf3S>0TBl2T9AbqzDRFwh+Q$%`80->2XE;sXMM!Rn3iyb zt80Q#gyphO(j`9Inbw2M*6w$4t~?xa+daO7TzM;9TJ9+VU_REJE^B-R z3tD-YrB)Dn3amW%xa{yHz{-P=%W@w=l~F4X&VK?eXiE2nR~~RQp^89Xd7x3cxQ+7_ z2OU|Cr&peVVvDU)>Z4S8q2{R$CflCT-5_pWamz|IV%@=KIjUChr*T!Bm&4sqqPV4{ z0kE^L+QKUiAF>DwwtQC{cw7`L%$MP>z|B2TM_q8m!MdGCeJ8UU8(+hO?a0(z9db3% zPPkj(d}24QP{Hm#HsLcV6?T5=@*@2>cD0hZ>vVB?in#|{$=yA~H3hTpZYBGg<5LS` z`B~;4sMD{mlhgTy)}eK|pMd;NLuTYYsVJh_dc@zIh9Y<2RA!`3HEWpb*b*Fs3e79Y zWAdiKB9%;t>rS+iuCDQbW(|h(-UMLBu8iwqPW+QHA4?)TtvAmKAQ9?_HczMVx6BBnBZ7m^Ljo}r=AwZh9}WL zwek5D#ppq)-^W2}cP68yU=kocJ2A*~C0aWHpB4Mwq)h_#nL6~g>KF_sQItfRZDFKg zH((R%heDSuO0E~`G`aei5a@?&6kME*u2L@;ASaar%Ed0c941P0G1RuuM@U{a2Wr;K zX6n|*TrJcmEE{&2;ZPy4gUJ@|BE&Eujm@d4Y1I(?!`g@DV6Cc)RXwczA+d^~w3Bwt z7|!g`bA{f64+%*p#gL#k(j>gCYz3SAuF3sB?Abt&UZ?BJ>R)p%7#nHOiF}BZet#It zwGqdCI9w5SAt@PXJLR$yfgy|3wo07_K~+y=tfJh==wYv zo@u0p)gy&hic^JEXW>ulE*?!z1bbD2qaaIOdVx|}-&+tRXq%UWHsM@JP{ONLj^0A) zb&%E2*7T;whRqA3yXEHVl#VoiN+{MJlh|xdA*xl!mS$c~ogyhxVA9C_RXOq}m3q8%<_S?J`U6&@6DNk~b#0+of5k$w6FW-)F!5?^i$i zkNyLC?AMrlmLebwgrUidq9G)+Y%*>qP{_-p?fGrgYgVQtE_>@2YaXV^>qa-N% zpI`n{!T|gd(VZ z*($q-wQ!L)-x_Rn=|}EcNzcrE$JCEgm_#qk3XM?)bljzDM>!p&wYS)pLxU#;{P6V z5Wjoz_Yi*B3&ODpa1e9;C)nMWqZ_wBh!5xT+s^!hk656dlW6~fKuF9i04K!k1$@jI z-VMTto|N`Z+jwG~{c$6xAAl|(Z=-(u?P~w^GrQBk@f2DLp>JFd;r>VF2;h#Ek7F^! z;U2-H;&G3~(uWf^&9k#h#v900{fM>vEneSD>|W{$t?!)02H;=o!Ik>g(?0k1Nto!VIo9r>II(~ZOc8_-4XZ+4P?z^wsfBa6n zj*kx5cl@+{$FI7<#^d*KyX-otsi`<2c6!6rf?(Z-ba2-BFWh5KdncHGe5qlPAhX<3 zf2AsIK~PNhmLi;(UTx=MMk>?U8%~^kN;=5Q!e5zGds}rWd^w8<&!p1T&vIx2mgx#c zFOm=5=ds*e7Du>0cBJE!nc&X0%%z>}Y1df@!b>YT94UsC4j$4|ih9NFPNn>iJ_$}{7;GDxV-A#Gd zfiCo>Tf2uB+-RQM*_)eKaPy+V%3>Uo&-luo(UO_dF)?YfaRX0(hiA+kRnBxZXx>~m znDu1Pfoy15BomydY4KyipS38th==(oNu|RIQ4p5e8oMjG`~^(~_Y9uMj;;`tV(+km zd#--jlPYxO+qY=U=T4nA`K8vbK+|Ok@j$Hnh;*s>>(!dS1}0UtTjDnBCd#Qf<0^X2 zI($)27lP8=l#JG|a4{RLk_x6*#t@)B>AO2Ll0&Yw;M2Dy;}f`?@hMEOx?8ebNg9{4 zlE@>cueYi$Qg=gosF`tZ>e{h4mb|MLE|pJ)Y_txl4-+LqzUTm_>5< z$s_kX9MyCj5V`M)NiA}H+@2ep)>)6+Hz-5YZ2vFgHkmI*XNHcjT``N~P^)b;*ClU1 z1XB%pzfASGa35|;gAey!!DbIx-H{492{$cZIn|qL?MfBfO5G#E+y#w!tq^)s`L101 z7NuNBvHqyFYiw#Jag^zrKb4-P0>I54r~pvMdY}S8v*v*cK*4|tK+%8-K*@j#0L_$l zLj|D8fQqrc6%h|Mn}G_zFas(QHmN?nn<}tbHlQM5bA%bFz-Eg96@XR)DiXKOV+Ja) zNo(hyssccZ<$(&jwPlfXa0O{YB*tmuczE1&b)+26i7(RW?q+}89j4S$vHAz9=FXHO z!edMMlp}6Ku_4es>n#wQp?ltI;wyA7dQFUk?q$)Td(|Vn8&(z<{<;S=qA~bAfb2z` zp9Ne#56~!U`e8x#tD_H4lcMHiW)0=MVZfKVVq}bWvXkLo52yG_aGdwj@ zM70MbRbsJA!aNCg@K`y0GG$=2w^9KXi*q_kQ8r7-m3p&SS%gEb`mppkB*J`o41(6y zpo2!WVKixeAa0TA%V`T&Fn1nt75nMfWiGpmb2chP%MIpoXUw;2po45C%+%Mr8$RPll8_r>HB{ru@?7=M>aM`~&Aj%NQo;N|$JBu0BKan*`G%ZcuI||= zUBUFM>$5>7oGHgX&r5}K!@aOlT@kmW-`G8ov<`!IVuXqWzvkLbA%CX2sw-iG48Ag_ z(o%2noSa()-I!nc1upUx%)_SYaScI8k0Dza757V{O9&i&)94O8cSH~Ad1UmYoGUmN zxlBQoLd*sI3iV9kFzhbtzmr0X?>{MfJ0mhKi?-|Elo!Ri?3nz zZ#tk-3}}$bY3VY|D_w?Eeni?)l#4yZf`0}t1-0J8Tf7uV`IGvCMzfqsj|jZ&d>kvq z5vjTJ;N<9hS2&`f@-tlOO|V>bBS=@vBH3Us+@L@Y;s$+~u>F*isJA-X#`Rp(?ueFR z=c&`Gn{X~Qwl#H+%NH(in{p*-;=P&Ak+nAi723CGD&*xr~r&NpaL+T0TqDx4X6On zdU`ih0H~)tPywJ2dY}R@(SQm7O{TY@0zd=lfeHXkr3Wgk-+}?vx;Ib(Ag_3!0zmWW zfeHXksRt?&ZqbT*0~Oe$9rZv(!sa4opaPqV8c>n2N%QEPP=U=U22=oOFTD*FiCby( zyn%{@0qveQP=OOPfF7s-knufG0iZqfKm~vn&I1(y+By$Z0BH3*PywL%^FT$yKeUA2 zKm|5w5SkZtAz)A*G0BC{yEh+#s9UiCv&>nc80zez!feHZiyay^09;D9m1}d;g zJ?DW602P@BDgab!9;isTwT>C6z$Vq5x2Xa^z2|`n09Bp`Dgab}9;g6NlX;*b@iZzX zZ=eF3)Jq151z;}&Dgb*MP?2zJA2U#a&3z5105}6G0MiYq z0PJT#1t2n@0#G%e0ifL3bYX8(O4`A&GK?Mw?={8hHU15b zLK?bby`~t3?s%^$aG^WVYl>9pPWGC@6S`BqrkI44G7h@aJ)ks%?o8432U2hGz*cv* zVt1~$NsbQP&%GwEhVBBd$(3P+zD?+U;Q^U22EX)xycW7&c}=bgD=lLCQV+;PVWm~T zAgOkC5NBom9_THI{#9>&$MA3g0!wRg2if9S`)$EJc_ zp4BdX_gzbU59V6lgLwg_wCW2m5$9iky%G0FKZ+a}bjZCu3=iyp6~bST@cXM%PN&N$ z-Mdv&IY)FC8^c`nE{WT`qfmwJX0ItWp}W;<3P|W~_nIOQx;xRAYA?_`I{B7R`*74= z!AN^H6@omw=$|cDr<@i)yN73!vij^By}Oi?&|T*>B_eb;B%UERPkuU-k)Q*tl&An4 zXg~$vAOk7@2OCfUIK+SozzhQ_05c7!032#S1z?r|6@b|WQ~(Y$pu);C28Wx03cwKt zQ~-`NpaO7|0TqCw4X6MdV?YJqSOY2m#~DxoINpE?zzGIaBz%0L8K}VKNd{B^PBx$d zaEbvHfKv^q0FW7co2LRm&h$V9;0yyQ0B0Id0XWNmiiD5PHUkydJjZ|vz_|ug0M0X@ z0`PMKDgfsjPyx8WfC|8c22=okVL%1oA_FP_zcipC5rm7)Km|5`Wk3bs5(6p#ml{w3 zxXgeGz~u&1B%XGK8K}VKl?GG*er-Sn;3@+u09PAO0r-sp6^W-^V+Ja)d948zfa?sX z09gn)DgZYcPyx8ffQrQ9Z#DxJ*u2Gn3c#%fQ~+)>paO8a0Tl_y?=S-u*u2w# z3cy_kQ~>TapaO7@0TqCI4X8*w?LIS5fzA63r~o`*Kn37I11bOy8BmdM{9!Xtfz3w@ zr~v%dfC|8)22=nZGoS+SxB(S_Ck&_nJZV4$;3)$t08blG0eHrM3c#}lR9Kk)9FGjA zJ9`@^CcaJ2dLHY^57aNnwSAy|QQVSmb$reXM$x|Y{U$AAjDM7|pLUw588$?facy)h z5}&Ex=dxJc1v{l&^eOhk${#^F|A9KzxqL9a?m~yTu%LeE78hcB&Q(uOF4|e|F}eqI z=zHhq-ky1K(GlD;z~Kq~9KJ;zHu~KTPwaQ^yLzwD@4mN7Jk^tNa&BsC$#jn_lrtB! zWOGqNA(&pyYFw5x?OVvOQGp?%clgdM_iW{33A=kngq1x-=5kRBcaF&Em|H}u z`0vbs^)XlXu)CK;)zfpDM}%|RM$>KcUp|7=OvzPIH+MyAaPVKJ)6re%j2pv)qZg5_ zxz@@YE?V-bnUeF$@%)1l9jTTASNe5Yry%6Y1$Q8wrOI&ZC!PPyoNwW41rrbI4_>QS z`*>LPecCZH2Km>9r58*!2l}@}>fq~BweQoHk>?4-cjkG%B;x_!SuI6p@Q6M$FdhPU zEBgJpSkK@Kb6dY6Qqm&QnAakb(H!A&F5m3=Vj>A|OZr_p_(EtwG+{bE&dTqO(HGThse z9g+2=tT!L|3|+(DouilQf4476HT>Oouh9Q)U&3qnyYB9jd%vwEX#eQ|>1gAUB=+Jw zN@bXjb2IrJ6ST%?uV0p3P8SJZhl-$;wb=m zn_m&6jz7Mhe@Bpi$>M|L-=;>ZvomgG9yu`o@^J)C^**my)k#J5yt^hw{qk-iXRmFh z^?X^XJ)xI*LEgEXJ#>TG6XLlWzR-xjw9qtG>A3256W;Dov_of==PE*GcA7aPe1-ETaQahu2mJ!~$Rh9k*aa7~i1 zOsuI_IY$sQAHxH4%ZqBZA?`#X^R0~EYvuPNvddp^Xz=W^LQ|jY5`U}Rx8Z~@>vKjL z$uIMMZ+_VvA6wGZ>$`g9*dFttGsli*`r|T(cp}amSCI(vQ7v@5y=dm(9ffl}bL?!- z93*pGsCF}MSM1a>hg|f@92dp5wiW|kN;C^>D;Khx#^cvjv{?BPJ%Tsr@X9YyNj8~pCqSzBKbk)0Jik6Se9!}<`n-;e~*R}KC9=G zeaI(czc-&;jDLFy87JpcsYqtwZvTqpJj{m9E9aZ(f1Fq1r%tO*rwwZKS1sALmT)PG zY*5aY!waZ^b4wpCSGhi4h##nVGhgLBBJ7OK9q&haF$-Vmbk6;7+wo4M^f0L7wMQ?G zkPF^$^x`PF;AKWHj^U#6rjYv}F2ad&NG~iblRZwIw!)5lhOYhrqn3O*AG()Na(+e6 zIro~L>pA;ET+;X(BxnCl?dIJZdah-?VFR+>Jj2LSu8LP$Lb`CB2yMHgbudUwCQL`? z05a|(9va<&Y^_yUg}8+)_!dt4Yejl!+FvXB7OpsWf9(%A&w-1p|iYw@z=ML7?Z7caHA^iyl!=Q7c#U2dlTMPAgWPOI)u#F7`~ z%I8G}R}y*gXrC98pVf~e27HmpS9zJ!93#`0`25J*W9Sa(pC7lC{P+<@K0m&NlKl9#o^$S9J=gQ&l{hz4e*B}_ z&A8vl^FPpwy!%kkwahtuK<0dlD9B6B`QFUgQkKkl6|P5%BY%?2xg`z_o;hz3leqgO znbYUZXBy7ixt=$lZ3u$#-`O?~RL>Onql z%9ZBL?uBZVq;C~l@>RMunr9d=2;IT`a?0fAtDnPtHuJ=bzZc|gusYlP&CLw-QcI1HN^cN-6lE`{=l@pqxOW1 zyPtcl=k`U7*OTQzb9-R2G}ilf4|`jAKgiP5+LFn*Ctxi(#sXvjrFTlkJ=F)ypK;Ih z0ZdSNE(v;;tp1zy?({CXFT55<+?QU<{q8HTLNlpzu9)OpAXh%1E+sne zGIA=o(3?oayS&$ri7tx9JB^%MvT-w(m1(ElEq&g^mTQ$vqzN~zr8uJaUF{^ZS+V;9 zPDZC8$#CJ19@n@DhX${TO7qlmXF1VMKHG5qZdMm%f<0+n<|lvZx3L+LN-{s%iK@=z zz}G<;@+o!qGFJ)9e4wh*8ibwkv?}SU=*9Y&Ihryi^P#Y;Lq1P2WHf{vG2t zD0uPtIE zMNbN>9L8O~hNPltYsoG}fei|*M>!mWmN4x`^SE-@oNW#(qnHfbl1rtz%#?G@xypMy zSz095jLCR9K*8h*cGZJB3%AAIWiW=>*P%`tEa$t*c?#^ia&v9aG26a{55n9`OVJNq zw9Rec|8jBrp6TU6jiWlVEw!M#ngl?x2!rptvHWqhP_Ni||u_?U^7WtN$>O^o*Aj*Ld1cHXPE${cB#i%k_P z>m$n5BZxcZtanI?ESr*%Ckp<&Id>GIF|SdPj=${7gm!wSHap-CeP#!A#WN0Pnj7Q1 z8>F^GXC`)|zyxY>V@_*4A@lc1SM1*L{$8D1nz*|+FEe!$Uie+|=8!tfdw+O*dzRvv zwEj_F>kW&^nD0EnLd*Mk45?ttp!;ak=L9_unSLc0^Ea<$o+raY!9=M)-E~A~yymWV zfiQZU*dFbUA$V<*Tf^w}`sLgV*`vFmt(4NF9e)lvZVEFc;!C>T!IW&Sw@&D$2U99> z6)`@HKCHX7@UT!vh3!c?;X?eiEB=zdl;-i28;zwoY6x~@j=;U)bM&IK3sHuZm zWdq_S<3e2T=}NoFoay;2j7jwl9G&42)6@5n>FEsc6=mLgSZ$K0XWhTa^fc+}(Yao$ zM_HAj3%OEq4rj_UT}D~fg>ufgyacG|by0L9nw5}rU^6-QHyrEQD$c=8sdT13R!u-< zZ2)EEhp#32-i4np^VHgRHD2gz3qM~)>o>ORcwU8g?fZ?5;b*xuI)NCAu8;_o>N_=4 zZc9hykx)6Xa?>yEE2d_O>+xW7E6qsB4>jj{@;O&Z5&g|N=-ixhOa!ZPt*9HEA_o55hmmJ{_Zb!(eU@K`CG9-6gM|i!#mDwgOI0)e8%fd+Z}X^3 z|K=_Z`r@Mqx*S3aI%z9G&-qb^c?f!APFujdu3F8z;RI1ut@2$-LcCzV5O0cO8sesY zA-+xwe25D+);=XT_O5z(rEVoI`lVehykFpeZ^o+Q#1DKTl~dMr$cgocqx770WAq%l zv7Bou*(QmYjFtsQ4;?LsU>3=tmCtFmm{+1D{+K4w(r+=ZM226?D-kpxTF${Sjh1*V zZ#^gcMNHziU|Y+(RdC$9^>|5Br*#hiFKQCKB!IdX)53)gTd`_N7QtrXOv55r*2?ne0nu|Y z4*KZH_RBV(iAfwiS<5%u1}A+~kDp7)H$DGd{3Js?W!|AfeGF!i9BSnx?iJS4@e)im z2>k-^rEnhrGPfV&m=bJug7-gj4H%I06PHu~UN@iuz%Zn@p#t!G11bOvPTzkt^?(3c&jYR3vWw zzzkGi^G^m;By2M9<=s?)O$OOKP?50tu^Fhq=AR9y0Q|*(3IO9S-Ype?PYkF?IL^q7 zx2Xb~pBhjBU_8d#P+_-fKj2>SuKelT-0CLMIH%lS=m+~(Hzr|z!iB8S6zEp;7Csfd zve%!9Ue)W*MX&Dl7wDQJUveRi2y|lT!BtUae0>@x+mNmzQv9f4z|o zxm@WAAMBha?!4?@zv-04GcH2E(8v5SAy{-%{|^3R=jf6nKC>L50>Dt6&mt-SpBqpC z_`3lWfG-TF0Q|#%3IO9i-cc2Re;QB$U^K|vPyzUt0Tlqoh`bFIfPWiM0r)r~ojU zv>B+t z<`@Gi%%+s3tx^mlXx-t*(IR`!h3iT&ozLs_tpNA1zMaZUuH6FOY(vqVqC@F( zgrVz&q})bw&+%foptraQ+N^Zf3>Wf-n~BA4ueT7*^4PkID?wNQP`hd2q#?V8V7N`q zaM7gUqH4HZ&2UQ6aEco4P%~USX}Gu=?o=~eGHJM^8tzgvTsmpEv>NVKGh8NVxUd@T zQ8Qdl4SR-%ZUtD0I&mMV6RBhO?MpGp`jI6#(X7 z`tqg%FwTGqz<2{H0P`780hr%_3cvyeQ~)LzPyy&Ppu!3-1{2Ld1zOpaRfsKm~vSM}Lb7K(7H6fJp{a02Vf&0l#o2SkHh8!1@MM05&k7!hEcKd8!Wm^L_azvRXBrB()OTIY>2i ziquNd1C1LnxpsGXv(rT1-q;*LkD0&N~OcQ0JY?N$b4x5b4UlxI3=%ehwJC&O0BILF>G9K<7IV4{W3$ zeqlecS8%M8E6x1LDg4;~ee67aDHj{}M< z@4FaJx&QI($t3%$XHO^D-(X$$`~3P(Z~h$S?sKnS5Y4_Kl726V{xV_zThCt={x7dz z7yWOqe=mBj*#E0{Kkr-SH-)ovhPXLLblU58L}$HzPjn9L_lF>>>7RFJoVW9V*eQDb zq3A}hKNj8W^}8)_A{UY5E)Pbs2WfK*x!H(zyStS01h;u z0&tK46@Y^cr~n*dK!r8)7|bvO6@ZxrR3vO3Y6dD22D8jS1y0O1paO810TqD54X6Md zVL%1oNCPSWM;TB7INE>;z%d3?0FE`F0&tuG6@cRnr~sT`Kn37L11bO~8BhT@*?j5rDgb90P?1QEv&}#SHqSAj0&uPY6@c>$s4%yr z-DkW)|9o3@n{Nw4X*zcFIxp=(q7Nw7Zf9>+6uqn0jiPt=x>@uzuZN4?%j*%M_wl+_ zwDY=6^nPAYL=)=68h?Y?nzRHW# zaZ-1LH>=dmM0&HMyjhokW4!JWeVo^mM4#X_aTvOjyq+xj6t5Q(eVW%xh(5#Xr9`tQ zocMRD=ySYYR`hvZFE9FhuU8a(q1P*mzR2rUMPKao>Y^|4dQH)ndA+viE4*G;^sl{M zU-Z>pZ-}n^QouDHY*Yi+d9X)P*nmsxbbx75OZ4v1FO8y}ksUtPADZ zZR^c06TQ9HSBT!x>tD+~zZ0;t2UiRDy?|XkxJJMq1h7+~a9a)R2dIxBE*Y1}v05gtr(jVgZ{Vb5@{Fm->d}An%Ji#Yg*leYf~%N(OMC`pCcIA4#0^2Eg|*{Ba9zjw?>#MWlKwGA12U zmP+l0o{Qx3v1N5IZ(W2mQwpf5lKH)K+Ip_!$3?upZ*|1GTWSx3CyK zR0Fdl@VEO|I!X*v?zc6=!##Mc296Zlahx9S4WGo&9pm-WHH*iI#qGSaCwar?#Nvs< z3BylN-`!{hM+GJ6CIcz}Hycm^xW#}9z^w*U0B$p&0&u$l6@WVor~uq)Kn36~11bP_ z8&Cnb$AAjJy#`bO?lYhQaK8Z+fCmhy06b_w1>hkADy(L~;9)aR0eHlK3czm-r~o`_ zKn37211b`ZKW+vpu=#`m6@VuVr~o`=Kn37w11b`ZKVt?eu=%V36@cdqs7T!Uycwv# z<_iW?0A4hpB5~_WW}pI_FB?!{Hl@xkGuKG|e9pho=lr)N=bz&ByHZ3F{a3kmr+KqK ziax{Z4@95k^@pO*@%m%Y=Xw1X(dT>piRcTx{#5iuUVkR~Vy{0JeTmm!h`!A0FVU67 zq$<3^gRg4f*B*Q=U}3RwwFln_pwB`#&4X_REGpnS4;s*w$pUTwNSU`W)TwcuKVIwn zd#LxQS?}efb^d*bbfuRY<2wI-z~FWM1DFg_=Sw>LOcH@VpAPqUFJ;6xH+vn5zSZlz z=-a(6qJ6V)rw5HSa5uo$UFl#A?|kh3W8Ug8apyj-%c39fx<&LuUe6=?5wF`tKZ>?7 z#AiJpCHx7m$B2H)Ykm`iao>dfS3I9j`14*bAo@kGJ4L@N_KEvUa0Gr{W?jl=ue zcqF#*WZlM*ef{%kY~yo1cSPUTZ61xycz%73H3|~cc%pGG%s2^`|0R&#T$pv@`R3R- zk8(bL=TS`Zd+uW0&(wI2A4@=E$>y_@DjN(cLnHT@C zBxD$iiF)dMWHg`hQQnbDJ4fpdG=6yqb9|rT?zTlcv%RC6GtJp(K`iH^-8t5mFV9(o zdCpIZcT(;dPHOQKwJ70DSj_Qr0$6x6-ful0-1%UTld!Iys;opjr!!fSYiSgPN%jL@ z0W<#be%nB~eU5vJY$5HQN0f3sExF26>^A1|{>CLGsoeY+_OhCyK9p`_*ri~h#eBKs z%m2z)?oEyC8sqCe|9b>0@~pOEswYg1oRsgL6pq@V*j;&H5u&T|0?v*bfAT4!UzA6b zqK61w^(FL-aNPJEikY5F*s((~-IEQ+4c~zs>{m|9_Km5IN!irMxeZPS)?8F;TEq(#ToH_{==iiK+zTn{tCvOl~+01Dv4oXn3q2j&U#Q>DjC(HM#szcerTz|8-@&x8wW;Qx zCC$BJxu`DrJRko~(a3U9Geu9n(A!ilHg)IoSW7w?V>ekM>l2LqUWm-z zSBaraGH;PL>j}mN4m?hsZ%Xy#c=MD*E95lA_`#7v-X~b0o?aS3KqWE)?N}@ z#MvrR#x&R!DHC-59wbPiIu4SUgj!l9|VrywiYwZQa@CptdmqNiOVMwI&-hw3GwG=tzU! ztn?{P_HAd1Um$Ta>wPiC7=qO#o!Vs;JieAP*BR|iwdg)aPV5ZZD}P7CSJCA)llW_> zU%y0K9ITEz`kMwcfAX6KvbMU|GY;_&1cM;01-(aV0iO%f{3=`RXAYjyp9*-zUb$58 z4)&@66@b?ar~tffKn37;22=okZ$Jg$4Ff6we=wi|@TLJ3fVT{&0L(F<0`Rs06@YgP zr~tfcKn37E11bQ2G@t_Tz5x}04-BXP{K6atBctYd-Fw%L4a?+GWX7 zWuJ`k@O1S{@_sQJR?d=+L$-1@r&Q$}j*aO|J5?^cxd*2Md_OG{Jca+(6#uznp~Y~uG$6~rb@_J~|CW*vu*3kY-Vx~f^>>1rq>Cx^UXeVF(2$y?&T=xlMLfYA(zcR!C~t^VPn z?c^Pt8wZ^uAn1nFZuHL5~umAs!-Wdpgdn%`>V+o?9((D0YUk8#$*O zzYG^v&gB4UQo?Uo)=0AweoC`OhABBLL53?iB0(58!ez}lvCAWr9A$RGY73xixA^B9 z>E&l!D})Zcn@3Eft;q)T7=v}h-)%7Z=Pa#mNAV*qEGa|O>)7V7qnxRZgvkb`#e#nw z;Dx==Ll12M67kJ+&l>6Y_OAGL=}PD;-^g;7jhaStXHRoDZ#g@_rRS0^G4ltTGCUo+ zc~RA|97@%396M)^=h&93&L@0+4sHQa6F4-^?&O%SP86`997IX}_U-ZTpnDnLW~KNA z*(HwgTKZwkQIl+5u2#6A7*-eJL}#;$lk1j44~I~jol^1*Naqo0za-t5~KiN}H3 zgUSll_sHrzt;Bnue&3MES;a6~mbf0Rld^j9VTW6a$3a(y&fX6jvSny7TD{L@?YD~- zxyVh$xa)gYNz>7*uaagpS8bIvFNpj+F6AsA+)G?+NL=(?C*2xnjNbO@E_lcP`fXxS zcaeqE;(D|;UW~Tmper6(rUOhzUkjB(E6XI^=X8oYbs2HVFP6+zE+t3ASugK@f493K zLsXx@e7dB|D@}-9_KS$?k9P1TCzSah*ff~^ay>2>sR=e35EnL{ znEVaohow%4+x$Mifn3i8VIm@uUR-y<*o&44UI#>SVCnRrftO4W4oLE*O6*SmBtJ6N3A=i zFw!=ke238Cu1rFckSi+}Z)RsE3Aft6jdthWqoT*T5FzSBU49 z2V1$Dc1?f$dm?VI(M5E#;}x z*vB~QwiT31KJ+A<*N0a5{a*Ud>{6)boO_IOya8$5j~|HjxOzzBt!i*tTYbMZx+%dH z1LM=@G`1J%v2qiSth49D?lorBh~K^F2gUIT-0bVxQZ>i;2;cEDa$>kXe^f{kuQfKBfo-kanx6?BC?Xvx&k-)3fAvCP>;de#3YWv+P(wl1l4>!{`MgL z=-~Iyj~0LRwkEFXlhGG{is)%=_CKpk+>V}P@jb9@s*aI}%DO@vUnM`2p@2lPXzxv_w@&^vv55TY;TOWg6Zq|G>GS` zJuUr=lv@C=yL-HzSM+^ej}!fX*Yk;f2(5d?u%sc_YUuR4gopcfW03T#u7XpNb0_IJ z>v(tJI&_ou%!nP0!vGt=_*Ty#_QTyo3mxzR1J=O&*DP1WV8aovi_nmudwY-L!n z+9M_zx1gM|ZXr3bV3kuX(YpI5+6M$w`wtMag( zwph6JxYGQ-^t)8j+3zJTA%n@s%92F5$vQp zM{|eP4gI@?e;0#Vw=nJ(t{d!dZM|Q}a80nyfH2njh4uE$g8g5%WxLdS5cN)SpNeyn z#fC0}cVZUFA(xN)%Y7@(-de@U8nJ%O*Bjh6c+I)u;02($$@-T6#uHk9ZbtlWHz0m3GJjAW8Z_!k!{Q&un2?LkB^+GtOBBnG z%g`C~8*A4idRWH)k_MJ970a3Lv>g9(MrSU%Q7mUGd*I?wKTOl-h3`3u(PX!8<0VKq zIrMwcY4UG*g~|<@qbK!Cv!l3U@HG2IOyV+Jf2VsR*m0S9pF`enw;vGawLD#Kv*JF) z?n{#M{GMR{+57Doa^nzvu5U4m7Z-}jfVil?-^x3N zC;u+u^Y5aG{9C~j%vb*p-%-965A}N=VvtT=dh~=}q+VsXF4%EE`uu-gCi>*^ z`Ie4T#Om!U0g)Vr%H_8ZolHvLjU}0~ubDgXerNTTYW=Cnl=b5l*9JQ__08iu4T!^9 z9={z2`n=Eo6YyW<@$t(HoySkcERw@edHmKP^0>_QPR7LTxG{KnpRjB)CI*h-SRUW` zd-C`cpT{Wz{!POV)CGeHsmauYBzxY0wyEMN054ZeD41ATsJS-hAn-cIHz4lvG zjOGWs4hYwOTy}?OzT_vLesJ?OgypbuFS)Ky*J9P>eGw4Jfdb1G@Y2!LL5LPV z`jFz&+kIMOzwS5aT38`=siptB@X2BlSH`t>;Y)&@Gxak20eON!(xLLiTwLgrCl*_= zR%R`N`}e*|@vj^4&Kl+h27E(tVTcCmG0Y-4kbRPIP-~j+CkAr5(Lu7P{);;XFRIZ> z^%#(*Iqq+67wr91J^wJnA=rKBICuj$d>jlF;z5UCeK)&xWs5I<2Wmhj@NqE~JM}qu zmLE2PMslFzJ!D*j1LERL?if5S#;r1FTbqKI@xuV9$< z-8joU&HX#r-(6m6n}&acQ@mVrcSp40>Y_(d@6{e)INdqoA;8q{f_s(rKH&p-O`-wz3-RuCE-8r zH-90%?ANE5Dvsxzp74wHbN2ooKP}_^v~0ppcX~gi1HPo{U-b;S1B?c)Nr85|c)hmh z-Mn5`^d4TXFM3a}Hx#|M*Bgo6*XvD0PxpE=(UI3%h~D4ptwbN_^){jp_If+fGrZnG z^r2qwBzm^jyPzu%2{_z?-D==S5B8{mqdnNO29EV$?;1GXgMDk@L=UC|+{s=?qEGdD zf6=F-N!PUgZu~x^!7#pNGYlzTl8`IP*CsZWS;?QHrnPBhv?H@JMA|}0KR^(2udY|o zUx*(eljZ#2c5f*Z10PKS8eX1f6bM0oJ0-J1Ks<-tca(Br|M1vJPllK}Pg#|(^7=EBNyQa4stkusW+pB?pU z(N;sGb<{9ki?%vo@U>`bU_xP*zD(ae4AU~+lt`=Py@x)*LvB&8KNUU2>(4|l?)B%Q zm-PAz(Mx;%rRZh6{z~+6XjwDya%|Hbk3?tLr#9(mnA;k?aY$gKqQ~^%DK7)@P^>t zcUWw|50x`lF<#YEh^FD2eD!CT@`Y<7PHtlkmF;Cg;*-gX=FK34l^d66yGfKvk~#U$vuJzC)+xP2ZIGalqtV5{+g2cPQi5I zr}_@Ju&hZw752y+KaCI#RH=I;vjZhevJZGIV*JXC1|O<9go@>J^-#$i8ecb#2_~*= z>p>c1j%~oqy|Ukjjft9D;x4Nrwi4&N+wupj#(hkY$?}^+bLNYAzW2lAoXzMsNxrSQ zV@B;;O)AI*-IHzpW=iHa1(Aen8>}V6RlS@LmU8-Bes@To+tfX}pwE>wWu76auq`+? zEcEu>Zr#?*wFir=Vb5!jch{ggWVja3AF#R)7aPuPhuadq?3|_Y2k_p|ppPx_)UWUw zxE|~$`ULygdaxN)viQvfYyZsVQl{j0Np&5EW|eUrr`&}#=DlvuGsDUb9Nmr_x+pW7 zSea1)*wlauz-9(i05&(E0hJ1DgehCP?7N9ab}<& zy~qqyVDpy-Q~)kEpdxYWugpLNHZL)t0&uAT6@beOs7SbVxf!Uy<`o810IoEk0`O}C zDgaj*Pyx8wfC|8G45$EHV?YJqS_3Ko*BMX&xZZ$@L=bK;0~Of3(SQoTO$Jl|ZZ@C- zaEk#IfLjfy0NiFk1>klADgbvFPyx8pfC|7}22=pq&WWt@^%ds?RZ?*-t4b=)@u+0Q z`Iz0V0{0#_paSrO0TqBJ4X7XkY}n7ur_6#1?s(dO3cxc4Q~;hepaSrm0TqDf4X6OT zU_b@nMFT1TFBwn)c-epoz$*q+0A4kqB9XaYGXoXaeBFSGgw5ZXfeLK?-hc|g8wOM) zZvBH9sKDl%22><$zGVg~usO$oiiFL#%|J!M;2kqiffMfnyHQ~>^BKn37`45$EnVn7ApuLe{AJ~f~M@HYc0 z0G}C9k%+nfH3Jpc{M>*Fz~2q10DNIU1>heBR3se#(hO8!^PdJ(0KPJy0`M;bDga*_ zP?2!_-)5i!o8K5v0hnt*MdH?P%|HbXmv##``%koyg>aJ`z zslb&H22=oA45$FK8c+e4$AAiI@y~dOzPI=0`~?sG6eho}n5ulz&kJMhb``icuK^W+ zu?AEC#u-on7;iuYU_JvX0P`DA0a(C*3Vi)d(${i22=o6GoS*nx&akr$W<6quN5P? zAVaPsWA0jvRuGT~*P3>_3fx=EfC|9c22=pnF`xplt^pN*^$e&0tZzUCU;_gx02>-m z0r;5#6@ZNlr~qtiKm}kE11bQU8c+e)%zz5O<_1&%wlJUqu%!VNfUOLu0I-_Nmje}m zZ49UYY->P;&KG4>eXzfbvsE^=^kOMc%Q`k7n5t}<;438f=J04AK)kC_E;@({)M7vt0>sM4yp=vtb-F2 z>@46Y4xQ133U;l78x-tbzvW2<)9T;@1$)(RX;@Eux=-E4yb4?$EUsX``YoF)sMf(g z3J$1)qZAxecjF=jht$Cx3T7IJKIS_5j6-X67hpB}3TuReQ2_U=&t`TG}%OG@&yePOJF5zRmY*T z-A$KM^a$>{{Y198NKe%&C%3;x2l&&0oLWNv@uRWa$RehLgf!*KP3~Y6pE{cO)Y0Vp zrw(>L29_K3tB9K+R&!Ws#7bjqC8s0*EzQ-LnDXpH<<#nCiQQr4=JK%0Y>~su!z+g& zCeG<759jvb@$Jp%W^;;f04vIO-!B?IeLqEh68+C~F_qEpDyiU;^irLsx5^ZEF+DZ2 z#B{Ikj;H^!uSa!XeuTa=Jxg+4XJ(dUtj_33VriD-Vs|*6k#D`(U}c_j0CnFmia6;j zJOA~$7tZHxoqSTuY_W4M_H{1NkZosmtO_dK?G2~^>|j6zU`GQg06Q5_0od7q3cxM~ zQ~-80paQU)0TqDV4X6O@VL%07ngJDnJq@S;>}5a&U~dB|0Q(qF0od1oiX~E&v#8e6 zY*)d2f!Y-nTG;iPH~BCt!mWeNKm|4rF`xo4!+;9FOam$ahZ;}; zm}Ni(V737jfWr)^z(2B0UNSZgHw!Ab;|K#P07n{70XWKl3c%3@Q~-`KpaO8L0TsNy zJ%=|sdu0Ud1y%Cy^i0xgGH)vr%%%(;C}l9H97)PD?>zdwRFqoaj)K^ZAn6QUifNLl!!G-8QuU7*9Da&~@<9LXBbDy#ZJZdbhD&~<%UP$2DdCa1Y_B%$_P2A~Ks%!bwbM69OpUT2ohCtQ zStKXleuIMuPv8AoYHKbwuEj#8(pDh2X*Ze^JK?ek?x?)14^D^KT(j(W`vuX#m*QsV z_$P37^04@VEro)GnW~o$EC0ZbpPf2G;wq=>NDuyD&+m}ux0c!(yJz9X@x(!s_f4VZ z8}>&?7g!ox^AGEUvk4!`=0fT}^%6S-b(OOP^^|OspzG`M?OX7hF*rUq!)BOae?J;@%uiRaHbsnRN|%%`T}e*RJ5&!=ZQ`4 z;K@H8fqn@s`o6MR0D;DOy>K)=6kHWcORVv$KaY}ld>{r~gE{n_A!H8J}lk$#< z2~t)o>xl)KN9_2mEN%FXpU zg_j&#k?HF8l$^cGE~6~#LOEw#UhEaUE{bkMGlg2RY|i}+$D}O!ITObPQy;Q#`e|8X zqkkz);t5hgZXnn% zNPi2P-neoyru#Fkg=r7o1^;BqlsM;3!I+wPKkjv>qC=m}PE&b^(9=co4HJKj|0vCt z2kwjkzq(`1E_)4UdC;#vT(YnZ!hJ1^&b2_ zgI&!U*b5`YZtu+}HN^ev+Z&1xdL0B;H!zEFrOgPN)IC>GQf6x2Y@oW3@?Tu)a9F5S zfNXPCuLAapuNpZ^>6hITw4H9sYxU#@3VI5uf|Kmgy$l#%Ca`3c?g{xws;dN+6k`t@ zcd3M~;4b6jci*0RfV|ixH{kZ=y%d~zk#nP=6%%rj80FnnVnHg}+Agbaq}|m(rdm}BnjNdZ;gW`iY;=v- zZsGnp3nVjE%I~?R28mq*b&vKGZzjWz_Vdb8)L2W!;i0Q_medk%GDgYN4Pyx8mfQm#<_!nlN0-F~ZPyzU*0TqCY4X6P8%7BV} z*=Ag#DOHhF=qdTLyOwyZb#;Azl6AY<@8X8I;+*GaRGhlyn)F@Psb9Gatwt@6W-4QF zn%^_M4o5pX-SwQp%DgalgOF@xwCEer?j{a2E;8Tmbe=a$@>XxCso7O!i&7@3K>Sk>$<%V}u4Sj;IyMBl$R;-%#4RC`;Md5Ynz z%j6vaA{S^{We#sV}XFLCJn~BVMVu zkeJZwNOX7`jlTV)chM_deof+d(Q7H%KzbsIs=E-h&gjz|tIF#8UUWt|9LgoZ7Hrm= zuLBn9NpPd}NVsTs4!VqtAEg7PqZftBp|!xiBeG6db}f@AAzNr)Y9-$92idi3S;9tq zZ_X+CfRF6~E#aIF`a$(aueC9ceuoFl9aXk@v_bGtFeBdALdJq4Z#lHKmNRjJXX6CV`UGD^T(lRgvM!U!u@TY=Je36Bj8pPyyW*B#-kIx{;CG2h zoZxKYDt&?=cs4k0lluBjI*h?lKV@1_wCG{~1ZnXNp7;5#o);78Gg8aqLYqoV>ypZ* z>ZX!7p<7>0Ik%yl_`#Wt&hM_38!FMRz%8F>eg~;~=J`TQ;zYCk5&jVzH>;jz%qf;r>61SHW%b#&Y%RXoca*JTFpT6tlNwj1eiNWX;k+1Qjro3s<#XXa-l?a2 zS@}5FVkIB%|IOOUE2ti{gQ|kg+?57Y0Df&i1>hKl(GfvgZ_Kpe@rl$_X@ z(>u8&CY3G3IP_rY8ps1=9b#Jd)uyYd>kwC?e(S2yMt4yyCdiBL@@9vEl9i& z@h(Wb5b>Qp-A;EmCblM}EtoLX`j$U#ZJ>aBG3#~){L)VDZES1m-l%#2?&OgZ)R zlrt)vd@1omCL?21=DW&)Hq_^?!o1MFMN=Vv>a@vMrQI|hA@eob^pj%Ad(PcM423hr z6FRoe-Y61fwJfH2jJ{NGoP_nDp~K3H_O3i&)?K*dgCm2sYvl45G*u6-1?e743q8Gs zgy;F;7JoVGZZVWF9MUHYI{ca=47Vh_g}+j|H#%MmQmbX<$iF=Qn)%ntzft__9$VcP zUv*WhdfZBn)AhKG9HSdZnPI`)w&U&Ng8w?K$w$Gv#|oYbz`X`k0PZuO0&u?p6@Ui} zr~o`@Kt(;OHLjn=*LbE}oiTJ=*YeeegXgRJNWxk7))JzrjqUbVuFjNHU}!v?bw5Uo zftNEE%(_qIOgZ)ND+Vgc*}37NeUiX`fG43yg*(ET;&glEex5=u>YJ?^6WJ=4_nAq< z#T%vk_D@;cREqNzdtAe|pqaT5m(Rj%YFVw$` z;kMKri_oVyk!O5QY3$yjZvoZP*gqhBKg_c|1EJ-^xO{<67M+fc>I0z0>MSCRqL$N7 z@v|Nvh6*#~=pMw_%V-}S>>lFU7m$`rTT8ZkmFjFs81`!}%zB6$_`xy~=Ym-es-7t) zQYKVUW-R}(zA2MsY6OW|&JZKF#gBZr_DJ^#a?V)KdrGnS0(3jytdHNvV^qfmCzTtd z;82pP!OfiwMbVZ$rOx}9>yso6562JRSLe+dESAHn=FNu*RNpu_B94P_)^8JW@Q9BC zIcXgD>$%~P-w_AZ-x6f@9GA!rXUdb@qmb%j94e1<$hjvtl2QBST*knqw$=(UUx;(A z|F-vkKkuf3dx+bUiQ5z-IKBaAjJCqU$Zq|i2F6GkWhnNvg>7yL#JHK08cl9Jsi7%k$jivDf-Be^}k{D zNpet2Cf*o$csVm}ypHVU{6JrP2f0Y@?A@iD(VxrohHWj>i^|#fIO-&X%Jbf|y(Jgl zHKCmA;kQhpDQ06L7fahk!CU9a+xjs@5`p3UV!RjKe!=oL_%x93^7E0mPL;fs9z7y( zPvQ5Tmau2IkC?IS`d@iaZq>b19$*(vSK{n6sq4-mYt!95 zSWam-Lr%KuG`|}w-(%dNHNs~9PZPK989B_ZVWzh|3+e35OlIX6jnL zj_t}PvCAM;HeW2dBT;}WIJu*}meS{r_4;bj$9sK^=o7uZPV~uM-yr%-uWu54Hiygs zxA8c-%pH8Vy;ta|Vk7VF7k#>D-Wg^5i~(dB3#Tqhr)45lvr8%+jdAny#j%v%qQ+;==QJy_6Z#Q2SxSo$Gq@y?8dIIUrHRos z@an}}=fZsTd2BbOd&Z_+J=w~9r5(+ z>g8yp)3RJQ+4YzH zdY-O%yV`hDnE9fWZ54o*45*;6zl7gqY@_nBh>0>~=oL|0rLu}Jxe%YEGL?%sb?uar zkz=vZ&j7byHn&v(UNN8o@Tvh7fY%JD0K9HM1>koEQ~-W&Kn36p11bp8FU6x0BuPOZ zq+f~pZ;fXD!JeRkN4{x5#eeJWkRJWsAEcVY^J^bn-j<8_qsu$uF&&%#JNfV|^5OS? zb9tV);me>l@W~G+@yH*W+E0&v$c3eWxF5Yp>4?7I5P$xVho+-xTSMib`_aqi54Kem zzs39WtwA@ApFfj9)q<3`;RW{|THeMB?tPTJ@cY5mjQg1Du<|v>7D*Ec?WI2_6L>X3a zvi2&z>`4{6YVYwc**BEsD6!}KH2$g&s@Fe+yxL%c?*o&w`oDOcIZL0&iNW_z^_+E| zajvD^nv!hEMA%@PLC0-5ia)EsVW3Ja=-@xAHne3U$G5M@#amgpR z{{&V~@a}Ev2`)``JkEPjaLoMm@%6=t+jD=KxIKjD#UBs-2a9^K=!|Z_&~GMMs(z)B zm~nsCbJqPs&!PJ#=USw$-9J*F78eG5vhZ=*xgBvTho2@+*TSX2o>;Z^{`379-zCrMHv<*48SfcT0r=zp;q5!Xt17y7=j>C`14$qO0)%4V zkepBjDM}TPrW64Y>AlE?9eMym5u_@p2#BbF*bwZBy?5+gh!uPH`|Rbu@0va5>{Rf- z|Gjyh%vtN5*=yFUse9TsfDiyaF@O*Nju}7*0G}E_2mqfMKnQe1nHUbT zUMKy%rr#v}qo&^`{U6dH`)B;b?hm{|^a+Krrv&r%Xnr|w|0aHt^0VUXw?O!%nRBP@ z-v&_e{ekbm$1RKA`vYN-pNvI>0Pr6J2m#=~1`qG~Z5CXt&1`qqDolnn9LpPvTK*TZ zF4sAY&Ph4!=_!BomF2kOf5yt%svCEGy76p~%?V3R8@^&a8s=Q2l z>+*Jp@^pEVO~$&sJsgcC%apfr1+8Lv?^h`A*a^rRl62zwrA#o!tz5r~?#akTXq^zuft z^Q#iHD7zv-H}a8kz4gJW1g)%FkswdE?A1`zkf!M!YHo zd2C;yph|52nTpDtM2l2qdwemza+BQ^v;A=e9j;2y6zez|d2C;$Ml1ct5#+Ibl^RV7 z97mAH_7w_pZNC#Q%HH<=kH%5Cji-RD%J%sTP+4*PH-gTuN>H%LiEDJ#|CXR{suILc zkh|r+VjFo%L;ln%Y{U=US1HKTxo-U55_GgGLHrcliE7kkTIr_20<5>ICHR z1LRfe=P`ZC^yBNt4{4vMyygGP@?JUtdHiPdiR#y4#_`k34+B>z&r{+G%g8G=65xk) zPgKz1ss!=Ft|uxeXJ+XXmePpdNj*_Pg;fdSM>tPZ(9cx~;#VzCR8ZgZt4P{gO;23V zb5#lA=L%0$qu;9%^itpI*UNO@ymMKh``#c4mw#y+$Hi0D-7YWmag=LMp zcC92X(KS+6ernilAV|neyCujPtk zX>qTZ{UzuEEH-^bth>g(1|2>Pk>xEjUs190{E?9JCen~+HBgv54tJ+N>b*{ftZnIf zZ}}m1CN#i(6kp?k@HdR2PRNOO(4c%v1_yX+7{-Y8<35gnoDoQa{oHl3I}y6@J2+UG z!ZHNaTkVb|(2^~?{+1R_ zT4(z0?-8rh2wFw&>-`dV5`K{yJB){3tWAaLHoL~7{d^+=p>3$3{uR^*5JQoxQ_e3%hL-SChva#XNipvYl!^)BmD{KQnu@gskO`5kdF#!n=%xi(UO`*J8<MaNZP%=Oq}pYQub&Ct&}KaCy$L z=pzVIo$crl)q97kNn5dAWZ-uf^L5@-1W3eL0t*|#um=q5Upxyi4gOcN-eA*(uG+}) zU*VmU-!@LPzYbl3FB#eW8_-AtmylhwX!gPW4m{kuO#VM!QX@|5jcpyVdqr3UT|LuP zw;^%>Mf7+Z_%+ni%>rhJwyVj9b$Af_y07DJa(qF^84!<3;f$agnpY1f@}fz?vZt_> zT`o|262#x33%Lh=IaJIorcbyl7hQGU$v1Px6h4ZSV|R2wXIm)00k%R*wlR}3aAqJ* zbdnU?!w?w$k~wc7b3zqljx%yD?jZ?=|3IuTc67h7g_F<)2X)?{)BTg)XwV0+Eb?v( zApo3d03iUJWdI=n3^afc00tRA2mtt=rWPs$fFTAD0>Ie@5CXtZ0|)_Nm;rxG+db;g87u*cPbu2~^ z0Z*t0b{|zZnP)Syk_)j@3;UMCeOP`wYkC~% zu9_Z7x)Zp6oR6KMMT{WbS40e?hzS%?`+q7Tg(AjMM4f*nVkEWb zuQeJ)`b^R2A(*VN9mQq;D{-+zT1 zvm+!E?7>jjZcaK&h8%#H1{sO)_(u2?_*vlza5Lg?Rg@3vM{uqr7`8x_WM;%$P8X!h zIUi11eE2%pqeSJYZWv#izk#TG{KrT|p}X*L{Mg4*YPZx!)X7Fe^+WXrDfzNKM>}3_j9X|Jnhn-U=r-tT1y` zhie!Y!T6Io8>#N*FvDg3?aPnL$`54b`?5H6l6=+)-OgO(y4f_tKFe9cCwAirog~j=;rFZ;$@0& zq>)?dP|BnoXK5-pCnVV*kL33&SHdIhJw=l8nH#QrDVh)_jgJU}KQlx8L-uggnaoxV zoCYwo^BWxf$=YxT@rL8z==TuZrYRTFEM>20Ib5z^%Kp*{??;X0kYJ?gHH83xPh9Kn zTnGT83?KvmeE3?25CXs$0|)_NtO0~T9?$1ZgVSE@odJP~eY=h-(hiqgD z@HRCJTiEh_HIhR1U{G-(`)vGJ;W-EvJ{MorO19#q8M4BKo+l%nb-?gQ1hL=aNGp(^ zhNC`5NCr*Y1)u~#!KauW2>hMd6}stp12k$V@Bh%Ay%(ZU3z{_x&=d>56^&xc{NPywkGD6fLoE_mzdwwEf-hC{7`A8!H=Kk z;IGZE!xv4m!e@42sJrlkOpRvlIFk=TAY<@ta-DTT0GMC^A>>`J zHPVCIu`oVfh9uZUr zT(DJ7QB91NLC-r&mYQ{;E^mFU!V!pJDOHSREmq=mP6~mX#FynYAOwIZ1`q-OJ~gjH z2mxT40fYcB-2g%Wm|*}R0N`WvT80n+&NqM%0A?9L2mrPLga9zx076Ka!TXE4QOe8; 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 diff --git a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml index c39f22b..5d82499 100644 --- a/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml +++ b/Module/PSInfisicalAPI/bin/en-US/PSInfisicalAPI.dll-Help.xml @@ -9,7 +9,7 @@ Infisical - Authenticates against an Infisical instance using one of the supported auth providers (UniversalAuth, Token, JWT, OIDC, LDAP, Azure, GCP IAM) and stores the resulting connection in the module-level session manager. Subsequent cmdlets pick up the connection automatically. If parameters such as BaseUri, OrganizationId, ProjectId, Environment, ClientId, or ClientSecret are not supplied, the cmdlet attempts to resolve them from a curated list of environment-variable name patterns across Process, User, and Machine scopes. + Authenticates against an Infisical instance using one of the supported auth providers (UniversalAuth, Token, JWT, OIDC, LDAP, Azure, GCP IAM) and stores the resulting connection in the module-level session manager. Subsequent cmdlets pick up the connection automatically. If parameters such as BaseUri, OrganizationId, ClientId, or ClientSecret are not supplied, the cmdlet attempts to resolve them from a curated list of environment-variable name patterns across Process, User, and Machine scopes. The connection no longer carries a default ProjectId, Environment, or SecretPath; downstream cmdlets accept those as explicit (mandatory where applicable) parameters. Notes @@ -21,7 +21,7 @@ EXAMPLE 1 - Connect-Infisical -BaseUri 'https://app.infisical.com' -ClientId $ClientId -ClientSecret $ClientSecret -OrganizationId $OrgId -ProjectId $ProjectId -Environment 'dev' + Connect-Infisical -BaseUri 'https://app.infisical.com' -ClientId $ClientId -ClientSecret $ClientSecret -OrganizationId $OrgId Performs a Universal-Auth machine-identity login and stores the resulting session for subsequent cmdlets. @@ -29,11 +29,8 @@ $ConnectInfisicalParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $ConnectInfisicalParameters.BaseUri = 'https://app.infisical.com' $ConnectInfisicalParameters.OrganizationId = $OrganizationId -$ConnectInfisicalParameters.ProjectId = $ProjectId -$ConnectInfisicalParameters.Environment = 'dev' $ConnectInfisicalParameters.ClientId = $ClientId $ConnectInfisicalParameters.ClientSecret = $ClientSecret -$ConnectInfisicalParameters.SecretPath = '/' $ConnectInfisicalParameters.ApiVersion = 'v4' $ConnectInfisicalParameters.PassThru = $True $ConnectInfisicalParameters.Verbose = $True @@ -86,7 +83,7 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters InfisicalSecret - Default (List parameter set) enumerates secrets under the active session's project and environment, optionally recursing through subfolders and filtering by metadata or tag slugs. When -SecretName is supplied (Single parameter set) the cmdlet returns one secret by name; -Version and -Type tune the single-record fetch. ProjectId, Environment, SecretPath, and ApiVersion default to the values pinned on the active InfisicalConnection in both modes. + Default (List parameter set) enumerates secrets under the supplied project and environment, optionally recursing through subfolders and filtering by metadata or tag slugs. When -SecretName is supplied (Single parameter set) the cmdlet returns one secret by name; -Version and -Type tune the single-record fetch. -ProjectId and -Environment are mandatory in both modes; -SecretPath defaults to '/' and -ApiVersion defaults to the value pinned on the active InfisicalConnection. Notes @@ -97,8 +94,8 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters EXAMPLE 1 - Get-InfisicalSecret -SecretPath '/Windows' -Recursive - Lists every secret under /Windows in the active project and environment. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath '/Windows' -Recursive + Lists every secret under /Windows in the dev environment of the specified project. EXAMPLE 2 @@ -108,8 +105,8 @@ $DisconnectInfisicalResult = Disconnect-Infisical @DisconnectInfisicalParameters EXAMPLE 3 $GetInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalSecretParameters.ProjectId = $ProjectId +$GetInfisicalSecretParameters.Environment = 'dev' $GetInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $GetInfisicalSecretParameters.Recursive = $True $GetInfisicalSecretParameters.ExpandSecretReferences = $True @@ -142,19 +139,19 @@ $GetInfisicalSecretResult = Get-InfisicalSecret @GetInfisicalSecretParameters EXAMPLE 1 - New-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'super-secret-value' - Creates a single shared secret in the active project/environment. + New-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'super-secret-value' -ProjectId $ProjectId -Environment 'dev' + Creates a single shared secret in the specified project/environment. EXAMPLE 2 - $GetInfisicalTagResult = Get-InfisicalTag -ProjectId $ConnectInfisicalParameters.ProjectId + $GetInfisicalTagResult = Get-InfisicalTag -ProjectId $ProjectId $NewInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $NewInfisicalSecretParameters.SecretName = 'API_KEY' $NewInfisicalSecretParameters.SecretValue = 'super-secret-value' $NewInfisicalSecretParameters.SecretComment = 'Issued by deployment pipeline' -$NewInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$NewInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalSecretParameters.ProjectId = $ProjectId +$NewInfisicalSecretParameters.Environment = 'dev' $NewInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $NewInfisicalSecretParameters.TagIds = @($GetInfisicalTagResult[0].Id) $NewInfisicalSecretParameters.Verbose = $True @@ -184,8 +181,8 @@ $NewInfisicalSecretResult = New-InfisicalSecret @NewInfisicalSecretParameters EXAMPLE 1 - Update-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'rotated-value' - Rotates the API_KEY secret in the active project/environment. + Update-InfisicalSecret -SecretName 'API_KEY' -SecretValue 'rotated-value' -ProjectId $ProjectId -Environment 'dev' + Rotates the API_KEY secret in the specified project/environment. EXAMPLE 2 @@ -194,8 +191,8 @@ $UpdateInfisicalSecretParameters.SecretName = 'API_KEY' $UpdateInfisicalSecretParameters.NewSecretName = 'API_KEY_V2' $UpdateInfisicalSecretParameters.SecretValue = 'rotated-value' $UpdateInfisicalSecretParameters.SecretComment = 'Rotated by scheduled job' -$UpdateInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$UpdateInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$UpdateInfisicalSecretParameters.ProjectId = $ProjectId +$UpdateInfisicalSecretParameters.Environment = 'dev' $UpdateInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $UpdateInfisicalSecretParameters.Verbose = $True @@ -224,15 +221,15 @@ $UpdateInfisicalSecretResult = Update-InfisicalSecret @UpdateInfisicalSecretPara EXAMPLE 1 - Remove-InfisicalSecret -SecretName 'API_KEY_V1' -Confirm:$False + Remove-InfisicalSecret -SecretName 'API_KEY_V1' -ProjectId $ProjectId -Environment 'dev' -Confirm:$False Deletes a single secret without prompting. EXAMPLE 2 $RemoveInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RemoveInfisicalSecretParameters.SecretNames = @('LEGACY_KEY_1','LEGACY_KEY_2','LEGACY_KEY_3') -$RemoveInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$RemoveInfisicalSecretParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalSecretParameters.ProjectId = $ProjectId +$RemoveInfisicalSecretParameters.Environment = 'dev' $RemoveInfisicalSecretParameters.SecretPath = "/Windows/$($CallingScriptPath.BaseName)" $RemoveInfisicalSecretParameters.PassThru = $True $RemoveInfisicalSecretParameters.Confirm = $False @@ -263,17 +260,17 @@ $RemoveInfisicalSecretResult = Remove-InfisicalSecret @RemoveInfisicalSecretPara EXAMPLE 1 - Get-InfisicalSecret | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -DestinationEnvironment 'staging' -CopySecretValue - Copies all secrets from the active environment into 'staging', including their values. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' | Select-Object -ExpandProperty Id | Copy-InfisicalSecret -ProjectId $ProjectId -SourceEnvironment 'dev' -DestinationEnvironment 'staging' -CopySecretValue + Copies all secrets from dev into staging, including their values. EXAMPLE 2 - $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath '/Windows' -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath '/Windows' -Recursive $CopyInfisicalSecretParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $CopyInfisicalSecretParameters.SecretId = $GetInfisicalSecretResult.Id -$CopyInfisicalSecretParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$CopyInfisicalSecretParameters.SourceEnvironment = $ConnectInfisicalParameters.Environment +$CopyInfisicalSecretParameters.ProjectId = $ProjectId +$CopyInfisicalSecretParameters.SourceEnvironment = 'dev' $CopyInfisicalSecretParameters.SourceSecretPath = '/Windows' $CopyInfisicalSecretParameters.DestinationEnvironment = 'staging' $CopyInfisicalSecretParameters.DestinationSecretPath = '/Windows' @@ -285,7 +282,7 @@ $CopyInfisicalSecretParameters.CopyMetadata = $True $CopyInfisicalSecretParameters.Verbose = $True $CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters - Promotes every Windows secret from the active environment into staging with full value/comment/tag/metadata propagation. + Promotes every Windows secret from dev into staging with full value/comment/tag/metadata propagation. @@ -309,12 +306,12 @@ $CopyInfisicalSecretResult = Copy-InfisicalSecret @CopyInfisicalSecretParameters EXAMPLE 1 - Get-InfisicalSecret | ConvertTo-InfisicalSecretDictionary -AsPlainText - Builds a plain-text dictionary of every secret in the active environment. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' | ConvertTo-InfisicalSecretDictionary -AsPlainText + Builds a plain-text dictionary of every secret in the dev environment of the specified project. EXAMPLE 2 - $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ConvertToInfisicalSecretDictionaryParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $ConvertToInfisicalSecretDictionaryParameters.InputObject = $GetInfisicalSecretResult @@ -347,12 +344,12 @@ $ConvertToInfisicalSecretDictionaryResult = ConvertTo-InfisicalSecretDictionary EXAMPLE 1 - Get-InfisicalSecret | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force - Writes the active environment's secrets to a .env file. + Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' | Export-InfisicalSecrets -Format DotEnv -Path '.\.env' -Force + Writes the dev environment's secrets for the specified project to a .env file. EXAMPLE 2 - $GetInfisicalSecretResult = Get-InfisicalSecret -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive + $GetInfisicalSecretResult = Get-InfisicalSecret -ProjectId $ProjectId -Environment 'dev' -SecretPath "/Windows/$($CallingScriptPath.BaseName)" -Recursive $ExportInfisicalSecretsParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $ExportInfisicalSecretsParameters.InputObject = $GetInfisicalSecretResult @@ -375,7 +372,7 @@ $ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsP InfisicalProject - Default (List parameter set) returns every project the active session can see; project visibility is governed by Infisical's role assignments. When -ProjectId is supplied (Single parameter set) the cmdlet returns the one matching record. + Default (List parameter set) returns every project the active session can see; project visibility is governed by Infisical's role assignments. -Type filters the list to a single product surface (secret-manager, cert-manager, kms, ssh, secret-scanning, pam, ai). -IncludeRoles asks the server to return the caller's role bindings on each project. When -ProjectId is supplied (Single parameter set) the cmdlet returns the one matching record. Notes @@ -391,19 +388,24 @@ $ExportInfisicalSecretsResult = Export-InfisicalSecrets @ExportInfisicalSecretsP EXAMPLE 2 - Get-InfisicalProject -ProjectId $ConnectInfisicalParameters.ProjectId - Retrieves the canonical record for the project pinned by the active session. + Get-InfisicalProject -ProjectId $ProjectId + Retrieves the canonical record for a single project by id. EXAMPLE 3 - $GetInfisicalProjectListResult = Get-InfisicalProject | Where-Object { $_.Slug -ilike 'platform-*' } + Get-InfisicalProject -Type 'cert-manager' -IncludeRoles + Lists every Certificate Manager project visible to the session, including the caller's role bindings. + + + EXAMPLE 4 + $GetInfisicalProjectListResult = Get-InfisicalProject -Type 'secret-manager' | Where-Object { $_.Slug -ilike 'platform-*' } $GetInfisicalProjectParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalProjectParameters.ProjectId = $GetInfisicalProjectListResult[0].Id $GetInfisicalProjectParameters.Verbose = $True $GetInfisicalProjectResult = Get-InfisicalProject @GetInfisicalProjectParameters - Filters the project list to slugs that begin with 'platform-' and refetches the first match by id. + Filters Secret Manager projects to slugs that begin with 'platform-' and refetches the first match by id. @@ -454,7 +456,7 @@ $NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters InfisicalProject - Updates mutable attributes on a project. -ProjectId defaults to the pinned session project when omitted. Only parameters that are bound are sent to the server. Honors -WhatIf and -Confirm. + Updates mutable attributes on a project. -ProjectId is required. Only parameters that are bound are sent to the server. Honors -WhatIf and -Confirm. Notes @@ -466,7 +468,7 @@ $NewInfisicalProjectResult = New-InfisicalProject @NewInfisicalProjectParameters EXAMPLE 1 Update-InfisicalProject -Name 'Platform Telemetry (v2)' - Renames the session-pinned project. + Renames the supplied project. EXAMPLE 2 @@ -493,7 +495,7 @@ $UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectP InfisicalProject - Deletes a project by Id. Defaults to the session-pinned project when -ProjectId is omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed project id. + Deletes a project by Id. -ProjectId is required. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed project id. Notes @@ -505,7 +507,7 @@ $UpdateInfisicalProjectResult = Update-InfisicalProject @UpdateInfisicalProjectP EXAMPLE 1 Remove-InfisicalProject -Confirm:$False - Deletes the session-pinned project without prompting. + Deletes the supplied project without prompting. EXAMPLE 2 @@ -531,7 +533,7 @@ $RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectP InfisicalEnvironment - Default (List parameter set) returns every environment configured on the session-pinned project. When -EnvironmentSlugOrId is supplied (Single parameter set) the cmdlet returns one environment by slug or id. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every environment configured on the supplied project. When -EnvironmentSlugOrId is supplied (Single parameter set) the cmdlet returns one environment by slug or id. -ProjectId is required in both modes. Notes @@ -543,12 +545,12 @@ $RemoveInfisicalProjectResult = Remove-InfisicalProject @RemoveInfisicalProjectP EXAMPLE 1 Get-InfisicalEnvironment - Lists every environment defined on the session-pinned project. + Lists every environment defined on the supplied project. EXAMPLE 2 Get-InfisicalEnvironment -EnvironmentSlugOrId 'dev' - Retrieves the 'dev' environment from the session-pinned project. + Retrieves the 'dev' environment from the supplied project. EXAMPLE 3 @@ -573,7 +575,7 @@ $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironme InfisicalEnvironment - Creates an environment with the supplied display name and slug, optionally setting its sort -Position. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + Creates an environment with the supplied display name and slug, optionally setting its sort -Position. -ProjectId is required. Honors -WhatIf and -Confirm. Notes @@ -585,7 +587,7 @@ $GetInfisicalEnvironmentResult = Get-InfisicalEnvironment @GetInfisicalEnvironme EXAMPLE 1 New-InfisicalEnvironment -Name 'Staging' -Slug 'staging' - Adds a Staging environment to the session-pinned project. + Adds a Staging environment to the supplied project. EXAMPLE 2 @@ -612,7 +614,7 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme InfisicalEnvironment - Updates an environment identified by -EnvironmentId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + Updates an environment identified by -EnvironmentId. -ProjectId is required. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. Notes @@ -624,7 +626,7 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme EXAMPLE 1 Update-InfisicalEnvironment -EnvironmentId $EnvId -Name 'Pre-Production' - Renames an environment in the session-pinned project. + Renames an environment in the supplied project. EXAMPLE 2 @@ -632,7 +634,7 @@ $NewInfisicalEnvironmentResult = New-InfisicalEnvironment @NewInfisicalEnvironme $UpdateInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $UpdateInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id -$UpdateInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalEnvironmentParameters.ProjectId = $ProjectId $UpdateInfisicalEnvironmentParameters.Name = 'Pre-Production' $UpdateInfisicalEnvironmentParameters.Slug = 'preprod' $UpdateInfisicalEnvironmentParameters.Position = 25 @@ -652,7 +654,7 @@ $UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisical InfisicalEnvironment - Removes an environment by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed environment id. + Removes an environment by Id. -ProjectId is required. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed environment id. Notes @@ -672,7 +674,7 @@ $UpdateInfisicalEnvironmentResult = Update-InfisicalEnvironment @UpdateInfisical $RemoveInfisicalEnvironmentParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RemoveInfisicalEnvironmentParameters.EnvironmentId = $GetInfisicalEnvironmentResult.Id -$RemoveInfisicalEnvironmentParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RemoveInfisicalEnvironmentParameters.ProjectId = $ProjectId $RemoveInfisicalEnvironmentParameters.PassThru = $True $RemoveInfisicalEnvironmentParameters.Confirm = $False $RemoveInfisicalEnvironmentParameters.Verbose = $True @@ -691,7 +693,7 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical InfisicalFolder - Default (List parameter set) enumerates folders directly under the supplied -Path within the active project and environment. When -FolderNameOrId is supplied (Single parameter set) the cmdlet returns one folder by name or id under -Path. -ProjectId, -Environment, and -Path default to the session-pinned values in both modes. + Default (List parameter set) enumerates folders directly under the supplied -Path within the project and environment. When -FolderNameOrId is supplied (Single parameter set) the cmdlet returns one folder by name or id under -Path. -ProjectId and -Environment are required in both modes; -Path defaults to '/'. Notes @@ -702,13 +704,13 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical EXAMPLE 1 - Get-InfisicalFolder -Path '/Windows' - Lists every folder directly under /Windows in the active project and environment. + Get-InfisicalFolder -ProjectId $ProjectId -Environment 'dev' -Path '/Windows' + Lists every folder directly under /Windows in the supplied project and environment. EXAMPLE 2 - Get-InfisicalFolder -FolderNameOrId 'Deployments' -Path '/Windows' - Retrieves the Deployments folder under /Windows in the active project and environment. + Get-InfisicalFolder -FolderNameOrId 'Deployments' -ProjectId $ProjectId -Environment 'dev' -Path '/Windows' + Retrieves the Deployments folder under /Windows in the supplied project and environment. EXAMPLE 3 @@ -716,8 +718,8 @@ $RemoveInfisicalEnvironmentResult = Remove-InfisicalEnvironment @RemoveInfisical $GetInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalFolderParameters.FolderNameOrId = $GetInfisicalFolderListResult.Id -$GetInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$GetInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$GetInfisicalFolderParameters.ProjectId = $ProjectId +$GetInfisicalFolderParameters.Environment = 'dev' $GetInfisicalFolderParameters.Path = '/Windows' $GetInfisicalFolderParameters.Verbose = $True @@ -735,7 +737,7 @@ $GetInfisicalFolderResult = Get-InfisicalFolder @GetInfisicalFolderParametersInfisicalFolder - Creates a folder with the supplied -Name beneath the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + Creates a folder with the supplied -Name beneath the supplied -Path. -ProjectId and -Environment are required; -Path defaults to '/'. Honors -WhatIf and -Confirm. Notes @@ -746,20 +748,20 @@ $GetInfisicalFolderResult = Get-InfisicalFolder @GetInfisicalFolderParameters EXAMPLE 1 - New-InfisicalFolder -Name 'Deployments' -Path '/Windows' - Creates the Deployments folder under /Windows in the active project and environment. + New-InfisicalFolder -Name 'Deployments' -ProjectId $ProjectId -Environment 'dev' -Path '/Windows' + Creates the Deployments folder under /Windows in the supplied project and environment. EXAMPLE 2 $NewInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $NewInfisicalFolderParameters.Name = $CallingScriptPath.BaseName -$NewInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$NewInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$NewInfisicalFolderParameters.ProjectId = $ProjectId +$NewInfisicalFolderParameters.Environment = 'dev' $NewInfisicalFolderParameters.Path = '/Windows' $NewInfisicalFolderParameters.Verbose = $True $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters - Creates a script-named folder under /Windows using the session-pinned project and environment. + Creates a script-named folder under /Windows in the supplied project and environment. @@ -772,7 +774,7 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParametersInfisicalFolder - Renames a folder identified by -FolderId to the supplied -Name. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. Honors -WhatIf and -Confirm. + Renames a folder identified by -FolderId to the supplied -Name. -ProjectId and -Environment are required; -Path defaults to '/'. Honors -WhatIf and -Confirm. Notes @@ -784,7 +786,7 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParameters EXAMPLE 1 Update-InfisicalFolder -FolderId $FolderId -Name 'Deployments-Archive' - Renames a folder in the session-pinned project/environment. + Renames a folder in the supplied project/environment. EXAMPLE 2 @@ -793,8 +795,8 @@ $NewInfisicalFolderResult = New-InfisicalFolder @NewInfisicalFolderParametersInfisicalFolder - Removes a folder by Id from the supplied -Path. -ProjectId, -Environment, and -Path default to the session-pinned values when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed folder id. + Removes a folder by Id from the supplied -Path. -ProjectId and -Environment are required; -Path defaults to '/'. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed folder id. Notes @@ -824,7 +826,7 @@ $UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderPara EXAMPLE 1 Remove-InfisicalFolder -FolderId $FolderId -Confirm:$False - Deletes a folder from the session-pinned project/environment without prompting. + Deletes a folder from the supplied project/environment without prompting. EXAMPLE 2 @@ -832,8 +834,8 @@ $UpdateInfisicalFolderResult = Update-InfisicalFolder @UpdateInfisicalFolderPara $RemoveInfisicalFolderParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RemoveInfisicalFolderParameters.FolderId = $GetInfisicalFolderResult.Id -$RemoveInfisicalFolderParameters.ProjectId = $ConnectInfisicalParameters.ProjectId -$RemoveInfisicalFolderParameters.Environment = $ConnectInfisicalParameters.Environment +$RemoveInfisicalFolderParameters.ProjectId = $ProjectId +$RemoveInfisicalFolderParameters.Environment = 'dev' $RemoveInfisicalFolderParameters.Path = '/Windows' $RemoveInfisicalFolderParameters.PassThru = $True $RemoveInfisicalFolderParameters.Confirm = $False @@ -853,7 +855,7 @@ $RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderPara InfisicalTag - Default (List parameter set) returns every tag configured on the project. When -TagSlugOrId is supplied (Single parameter set) the cmdlet returns the one matching record. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every tag configured on the project. When -TagSlugOrId is supplied (Single parameter set) the cmdlet returns the one matching record. -ProjectId is required in both modes. Notes @@ -865,12 +867,12 @@ $RemoveInfisicalFolderResult = Remove-InfisicalFolder @RemoveInfisicalFolderPara EXAMPLE 1 Get-InfisicalTag - Lists every tag defined on the session-pinned project. + Lists every tag defined on the supplied project. EXAMPLE 2 Get-InfisicalTag -TagSlugOrId 'critical' - Retrieves the 'critical' tag from the session-pinned project. + Retrieves the 'critical' tag from the supplied project. EXAMPLE 3 @@ -895,7 +897,7 @@ $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters InfisicalTag - Creates a tag with the supplied -Slug, optional -Name and -Color. -ProjectId defaults to the session-pinned project when omitted. Honors -WhatIf and -Confirm. + Creates a tag with the supplied -Slug, optional -Name and -Color. -ProjectId is required. Honors -WhatIf and -Confirm. Notes @@ -907,7 +909,7 @@ $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters EXAMPLE 1 New-InfisicalTag -Slug 'critical' -Name 'Critical' -Color '#FF0000' - Creates a red Critical tag in the session-pinned project. + Creates a red Critical tag in the supplied project. EXAMPLE 2 @@ -915,7 +917,7 @@ $GetInfisicalTagResult = Get-InfisicalTag @GetInfisicalTagParameters $NewInfisicalTagParameters.Slug = 'critical' $NewInfisicalTagParameters.Name = 'Critical' $NewInfisicalTagParameters.Color = '#FF0000' -$NewInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$NewInfisicalTagParameters.ProjectId = $ProjectId $NewInfisicalTagParameters.Verbose = $True $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters @@ -932,7 +934,7 @@ $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters InfisicalTag - Updates a tag identified by -TagId. -ProjectId defaults to the session-pinned project when omitted. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. + Updates a tag identified by -TagId. -ProjectId is required. Only bound parameters are sent to the server. Honors -WhatIf and -Confirm. Notes @@ -944,7 +946,7 @@ $NewInfisicalTagResult = New-InfisicalTag @NewInfisicalTagParameters EXAMPLE 1 Update-InfisicalTag -TagId $TagId -Color '#FFA500' - Changes the display color of a tag in the session-pinned project. + Changes the display color of a tag in the supplied project. EXAMPLE 2 @@ -955,7 +957,7 @@ $UpdateInfisicalTagParameters.TagId = $GetInfisicalTagResult.Id $UpdateInfisicalTagParameters.Slug = 'critical-v2' $UpdateInfisicalTagParameters.Name = 'Critical (v2)' $UpdateInfisicalTagParameters.Color = '#FFA500' -$UpdateInfisicalTagParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$UpdateInfisicalTagParameters.ProjectId = $ProjectId $UpdateInfisicalTagParameters.Verbose = $True $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters @@ -972,7 +974,7 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParametersInfisicalTag - Removes a tag by Id. -ProjectId defaults to the session-pinned project when omitted. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed tag id. + Removes a tag by Id. -ProjectId is required. High ConfirmImpact prompts unless -Confirm:$False is supplied. -PassThru emits the removed tag id. Notes @@ -984,7 +986,7 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParameters EXAMPLE 1 Remove-InfisicalTag -TagId $TagId -Confirm:$False - Deletes a tag from the session-pinned project without prompting. + Deletes a tag from the supplied project without prompting. EXAMPLE 2 @@ -992,7 +994,7 @@ $UpdateInfisicalTagResult = Update-InfisicalTag @UpdateInfisicalTagParametersInfisicalCertificateAuthority - When -CaId is supplied (ById parameter set) returns a single internal CA. Otherwise (List parameter set) returns CAs scoped by -Kind: Internal (default, /api/v1/cert-manager/ca/internal), Any (/api/v1/cert-manager/ca returning both internal and ACME), or Acme (filters the generic endpoint to ACME issuers only). -ProjectId defaults to the session-pinned project when omitted. + When -CaId is supplied (ById parameter set) returns a single internal CA. Otherwise (List parameter set) returns CAs scoped by -Kind: Internal (default, /api/v1/cert-manager/ca/internal), Any (/api/v1/cert-manager/ca returning both internal and ACME), or Acme (filters the generic endpoint to ACME issuers only). -ProjectId is required. Notes @@ -1023,12 +1025,12 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters EXAMPLE 1 Get-InfisicalCertificateAuthority - Lists every internal CA visible in the session-pinned project. + Lists every internal CA visible in the supplied project. EXAMPLE 2 Get-InfisicalCertificateAuthority -Kind Any - Lists every CA (internal and ACME) visible in the session-pinned project; inspect the Type property to distinguish them. + Lists every CA (internal and ACME) visible in the supplied project; inspect the Type property to distinguish them. EXAMPLE 3 @@ -1036,7 +1038,7 @@ $RemoveInfisicalTagResult = Remove-InfisicalTag @RemoveInfisicalTagParameters @@ -1053,7 +1055,7 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get InfisicalCertificate - Default (List parameter set) enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId; -Limit and -Offset drive a single page and pages are walked automatically until exhausted unless -NoAutoPage is supplied. When -SerialNumber is supplied (Single parameter set) the cmdlet returns one certificate record. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) enumerates certificates with optional filters for -CommonName, -FriendlyName, -Status, and -CaId; -Limit and -Offset drive a single page and pages are walked automatically until exhausted unless -NoAutoPage is supplied. When -SerialNumber is supplied (Single parameter set) the cmdlet returns one certificate record. -ProjectId is required in both modes. Notes @@ -1065,7 +1067,7 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get EXAMPLE 1 Get-InfisicalCertificate -Status 'active' - Lists every active certificate in the session-pinned project. + Lists every active certificate in the supplied project. EXAMPLE 2 @@ -1077,7 +1079,7 @@ $GetInfisicalCertificateAuthorityResult = Get-InfisicalCertificateAuthority @Get $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } $GetInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$GetInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateParameters.ProjectId = $ProjectId $GetInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME $GetInfisicalCertificateParameters.FriendlyName = 'web-tier' $GetInfisicalCertificateParameters.Status = 'active' @@ -1099,7 +1101,7 @@ $GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCerti InfisicalPkiSubscriber - Default (List parameter set) returns every PKI subscriber configured on the project. When -Name is supplied (ByName parameter set) the cmdlet returns one subscriber by its slug. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every PKI subscriber configured on the project. When -Name is supplied (ByName parameter set) the cmdlet returns one subscriber by its slug. -ProjectId is required in both modes. Notes @@ -1111,12 +1113,12 @@ $GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCerti EXAMPLE 1 Get-InfisicalPkiSubscriber - Lists every PKI subscriber defined on the session-pinned project. + Lists every PKI subscriber defined on the supplied project. EXAMPLE 2 Get-InfisicalPkiSubscriber -Name 'mecm' - Retrieves the 'mecm' PKI subscriber from the session-pinned project. + Retrieves the 'mecm' PKI subscriber from the supplied project. EXAMPLE 3 @@ -1124,7 +1126,7 @@ $GetInfisicalCertificateListResult = Get-InfisicalCertificate @GetInfisicalCerti $GetInfisicalPkiSubscriberParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalPkiSubscriberParameters.Name = $GetInfisicalPkiSubscriberListResult[0].Name -$GetInfisicalPkiSubscriberParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalPkiSubscriberParameters.ProjectId = $ProjectId $GetInfisicalPkiSubscriberParameters.Verbose = $True $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSubscriberParameters @@ -1141,7 +1143,7 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu InfisicalCertificateProfile - Default (List parameter set) returns every certificate profile configured on the project via /api/v1/cert-manager/certificate-profiles, with optional -Limit, -Offset, and -IncludeConfigs. When -ProfileId is supplied (ById parameter set) the cmdlet returns one profile by its id. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every certificate profile configured on the project via /api/v1/cert-manager/certificate-profiles, with optional -Limit, -Offset, and -IncludeConfigs. When -ProfileId is supplied (ById parameter set) the cmdlet returns one profile by its id. -ProjectId is required in both modes. Notes @@ -1153,12 +1155,12 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu EXAMPLE 1 Get-InfisicalCertificateProfile - Lists every certificate profile defined on the session-pinned project. + Lists every certificate profile defined on the supplied project. EXAMPLE 2 Get-InfisicalCertificateProfile -ProfileId '8257641e-c808-454e-ac92-8dc920be865f' - Retrieves a single certificate profile by id from the session-pinned project. + Retrieves a single certificate profile by id from the supplied project. EXAMPLE 3 @@ -1166,7 +1168,7 @@ $GetInfisicalPkiSubscriberResult = Get-InfisicalPkiSubscriber @GetInfisicalPkiSu $GetInfisicalCertificateProfileParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalCertificateProfileParameters.ProfileId = $GetInfisicalCertificateProfileListResult[0].Id -$GetInfisicalCertificateProfileParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificateProfileParameters.ProjectId = $ProjectId $GetInfisicalCertificateProfileParameters.Verbose = $True $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfisicalCertificateProfileParameters @@ -1183,7 +1185,7 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi InfisicalCertificatePolicy - Default (List parameter set) returns every certificate policy configured on the project via /api/v1/cert-manager/certificate-policies, with optional -Limit and -Offset. When -PolicyId is supplied (ById parameter set) the cmdlet returns one policy by its id. -ProjectId defaults to the session-pinned project in both modes. + Default (List parameter set) returns every certificate policy configured on the project via /api/v1/cert-manager/certificate-policies, with optional -Limit and -Offset. When -PolicyId is supplied (ById parameter set) the cmdlet returns one policy by its id. -ProjectId is required in both modes. Notes @@ -1195,12 +1197,12 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi EXAMPLE 1 Get-InfisicalCertificatePolicy - Lists every certificate policy defined on the session-pinned project. + Lists every certificate policy defined on the supplied project. EXAMPLE 2 Get-InfisicalCertificatePolicy -PolicyId '3e69306a-e7c1-4fd2-a140-7fb300e53c43' - Retrieves a single certificate policy by id from the session-pinned project. + Retrieves a single certificate policy by id from the supplied project. EXAMPLE 3 @@ -1208,7 +1210,7 @@ $GetInfisicalCertificateProfileResult = Get-InfisicalCertificateProfile @GetInfi $GetInfisicalCertificatePolicyParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $GetInfisicalCertificatePolicyParameters.PolicyId = $GetInfisicalCertificatePolicyListResult[0].Id -$GetInfisicalCertificatePolicyParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$GetInfisicalCertificatePolicyParameters.ProjectId = $ProjectId $GetInfisicalCertificatePolicyParameters.Verbose = $True $GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisicalCertificatePolicyParameters @@ -1225,7 +1227,7 @@ $GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisi InfisicalCertificate - Performs a server-side search across certificates with filters for friendly name, common name, free-text search, status, CA/profile/application/enrollment scope, key/signature algorithm, source, and validity window (-NotBeforeFrom/-NotBeforeTo/-NotAfterFrom/-NotAfterTo). Results are paged automatically unless -NoAutoPage is supplied. -ProjectId defaults to the session-pinned project when omitted. + Performs a server-side search across certificates with filters for friendly name, common name, free-text search, status, CA/profile/application/enrollment scope, key/signature algorithm, source, and validity window (-NotBeforeFrom/-NotBeforeTo/-NotAfterFrom/-NotAfterTo). Results are paged automatically unless -NoAutoPage is supplied. -ProjectId is required. Notes @@ -1244,7 +1246,7 @@ $GetInfisicalCertificatePolicyResult = Get-InfisicalCertificatePolicy @GetInfisi $GetInfisicalCertificateAuthorityListResult = Get-InfisicalCertificateAuthority | Where-Object { $_.FriendlyName -eq 'Issuing CA - Platform' } $SearchInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) -$SearchInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$SearchInfisicalCertificateParameters.ProjectId = $ProjectId $SearchInfisicalCertificateParameters.CommonName = $env:COMPUTERNAME $SearchInfisicalCertificateParameters.Status = 'active' $SearchInfisicalCertificateParameters.CaId = @($GetInfisicalCertificateAuthorityListResult.Id) @@ -1287,7 +1289,7 @@ $SearchInfisicalCertificateResult = Search-InfisicalCertificate @SearchInfisical EXAMPLE 2 $RequestInfisicalCertificateParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' -ArgumentList ([System.StringComparer]::OrdinalIgnoreCase) $RequestInfisicalCertificateParameters.PkiSubscriberSlug = 'web-tier' -$RequestInfisicalCertificateParameters.ProjectId = $ConnectInfisicalParameters.ProjectId +$RequestInfisicalCertificateParameters.ProjectId = $ProjectId $RequestInfisicalCertificateParameters.CommonName = ([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName $RequestInfisicalCertificateParameters.DnsName = @(([System.Net.Dns]::GetHostEntry($env:COMPUTERNAME)).HostName, $env:COMPUTERNAME) $RequestInfisicalCertificateParameters.KeyAlgorithm = 'Rsa' @@ -1480,22 +1482,22 @@ $UninstallInfisicalCertificateResult = Uninstall-InfisicalCertificate @Uninstall Get-InfisicalCertificateApplication - Lists or retrieves an Infisical Certificate Manager Application from the active project. + Lists or retrieves an Infisical Certificate Manager Application from the supplied project. Get InfisicalCertificateApplication - Reads Infisical certificate-manager Applications (the join target used by EST/ACME/SCEP profile attachments) using the active connection's project scope. The List parameter set returns all applications visible to the caller; the ById and ByName sets return a single application. ProjectId falls back to the active connection when omitted. + Reads Infisical certificate-manager Applications (the join target used by EST/ACME/SCEP profile attachments) for the supplied project. The List parameter set returns all applications visible to the caller; the ById and ByName sets return a single application. -ProjectId is required. EXAMPLE 1 - Get-InfisicalCertificateApplication - Lists certificate-manager applications for the active project. + Get-InfisicalCertificateApplication -ProjectId $ProjectId + Lists certificate-manager applications for the supplied project. EXAMPLE 2 - Get-InfisicalCertificateApplication -ApplicationName 'workstation-mdm' + Get-InfisicalCertificateApplication -ApplicationName 'workstation-mdm' -ProjectId $ProjectId Retrieves a single application by name.