From 2489b7adca98d7677d78272bda4e3d4ad239a027 Mon Sep 17 00:00:00 2001 From: GraceSolutions Date: Thu, 4 Jun 2026 15:11:49 -0400 Subject: [PATCH] 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 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μ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; + } + } +}