Files
PSInfisicalAPI/CHANGELOG.md
T
GraceSolutions 211fbcf34d Bulk v4 batch routes + strongly-typed -Secrets IDictionary[string,string][]
- Endpoint registry: register POST/PATCH/DELETE /api/v4/secrets/batch as preferred candidates for BulkCreate/Update/Delete; v3 raw routes retained as automatic fallback.
- DTOs: add projectId (required for v4) alongside workspaceId on the three batch request envelopes; both serialized when set, both ignored when null.
- SecretsClient: populate ProjectId in CreateBatch/UpdateBatch/DeleteBatch so v4 succeeds on first attempt.
- Cmdlets: -Secrets on New/Update-InfisicalSecret changed from Hashtable[] to IDictionary<string,string>[] for stronger typing and tab-completion; converter rewritten to accept IEnumerable<IDictionary<string,string>>. TagIds parsed from comma-separated string; nested Metadata dropped from bulk hashtable surface (still settable programmatically on bulk items).
- Tests: 166 passing (was 161). Bulk endpoints now resolve to v4 primary with v3 fallback; new tests verify projectId envelope serialization, dual-key omission, and TagIds trimming.
2026-06-03 20:06:13 -04:00

20 KiB

Changelog

All notable changes to this project will be documented in this file.

The format follows Keep a Changelog loosely, but version numbers use the build timestamp format yyyy.MM.dd.HHmm.

Unreleased

2026.06.04.0005

Unreleased (carried forward)

  • Bulk v4 batch routes: Endpoint registry now registers POST|PATCH|DELETE /api/v4/secrets/batch as the preferred candidates for BulkCreateSecret/BulkUpdateSecret/BulkDeleteSecret; the existing v3 raw routes (/api/v3/secrets/batch/raw) remain as automatic fallback. Batch request DTOs serialize both projectId (required by v4) and workspaceId (accepted by v3) when populated.
  • Strongly-typed bulk input: -Secrets on New-InfisicalSecret and Update-InfisicalSecret is now IDictionary<string, string>[] instead of Hashtable[]. InfisicalBulkSecretConverter accepts IEnumerable<IDictionary<string, string>> and parses TagIds from a comma-separated string. Nested Metadata/SecretMetadata dictionaries are no longer accepted in the bulk hashtable surface (set SecretMetadata programmatically on InfisicalBulkCreateSecretItem/InfisicalBulkUpdateSecretItem if needed).

2026.06.03.2207

  • Build produced from commit 09c3d5c68b.
  • M9 — Bulk, Duplicate & Inheritance:
    • Bulk parameter sets added to New-InfisicalSecret, Update-InfisicalSecret, and Remove-InfisicalSecret accepting -Secrets Hashtable[]; client methods CreateBatch/UpdateBatch/DeleteBatch wrap POST|PATCH|DELETE /api/v3/secrets/batch/raw.
    • Copy-InfisicalSecret cmdlet added, wrapping POST /api/v4/secrets/duplicate with source/destination environment + path parameters and per-attribute copy toggles.
    • Connection inheritance centralized in InfisicalCmdletBase (ResolveProjectId/ResolveEnvironment/ResolveSecretPath/ResolveApiVersion/ResolveOrganizationId). Explicit parameters always win; missing values fall back to the active connection and emit a -Verbose line.
    • Project/Environment/Folder/Tag and all secret cmdlets refactored to use the inheritance helpers; existing explicit-parameter behavior is preserved.
    • InfisicalBulkSecretConverter accepts flexible key aliases (SecretName/Name/Key, SecretValue/Value, SecretComment/Comment, Metadata/SecretMetadata).
    • Test count: 161 (up from 139). Added coverage for bulk DTO shapes, the converter, the duplicate request DTO, registry entries for the four new endpoints, and the resolution helpers.

Unreleased (carried forward)

2026.06.03.2206

Unreleased (carried forward)

2026.06.03.2136

  • Build produced from commit d9822aab7a.
  • Resource CRUD expansion: Added full Get/New/Update/Remove cmdlet families for Projects, Environments, Folders, and Tags (20 new cmdlets):
    • Projects: Get-InfisicalProjects, Get-InfisicalProject, New-InfisicalProject, Update-InfisicalProject, Remove-InfisicalProject.
    • Environments: Get-InfisicalEnvironments, Get-InfisicalEnvironment, New-InfisicalEnvironment, Update-InfisicalEnvironment, Remove-InfisicalEnvironment.
    • Folders: Get-InfisicalFolders, Get-InfisicalFolder, New-InfisicalFolder, Update-InfisicalFolder, Remove-InfisicalFolder.
    • Tags: Get-InfisicalTags, Get-InfisicalTag, New-InfisicalTag, Update-InfisicalTag, Remove-InfisicalTag.
  • Secret mutation cmdlets: Added New-InfisicalSecret, Update-InfisicalSecret, and Remove-InfisicalSecret; extended InfisicalSecretsClient with corresponding create/update/delete operations.
  • Additional auth providers: Connect-Infisical now supports JWT (-Jwt -IdentityId), OIDC (-Jwt -IdentityId), LDAP (-Username -Password), Azure (-Jwt -IdentityId), and GCP IAM (-Jwt -IdentityId) via dedicated parameter sets. Common identity-login flow is centralized in IdentityLoginExecutor.
  • Endpoint registry expanded with login routes (/api/v1/auth/{jwt|oidc|ldap|azure|gcp}-auth/login) and CRUD routes for projects (v2), environments, folders, tags, and secret mutations.
  • Test suite expanded to 139 passing tests, including mapper round-trips for projects/environments/folders/tags, secret mutation DTO shapes, and request-body validation for each new auth provider.

2026.06.03.0131

  • Build produced from commit 7be0b7b420.
  • Behavior change: Get-InfisicalSecrets and Get-InfisicalSecret now default -ViewSecretValue to $true. Real secret values are returned by default. To request the redacted/hidden response, pass -ViewSecretValue:$false.
  • InfisicalSecretMapper now treats the server-side <hidden-by-infisical> placeholder as a hidden marker rather than a value: when secretValueHidden=true (or the placeholder string is detected) SecretValue is set to null instead of stuffing the literal into a SecureString. This prevents downstream consumers (auth, exports, dictionary conversion) from silently using <hidden-by-infisical> as if it were a real secret.

Unreleased (carried forward)

2026.06.03.0113

  • Build produced from commit 09c577ebd0.
  • Added InfisicalSecret.GetPlainTextValue() for direct plain-text access to secret material from PowerShell without needing Marshal.SecureStringToBSTR.
  • Added -AsPlainText switch to ConvertTo-InfisicalSecretDictionary; when present the cmdlet emits Dictionary<string, string> instead of the default Dictionary<string, SecureString>.

Unreleased (carried forward)

2026.06.03.0057

Unreleased (carried forward)

2026.06.03.0056

Unreleased (carried forward)

2026.06.03.0055

Unreleased (carried forward)

2026.06.03.0047

Unreleased (carried forward)

2026.06.03.0046

Unreleased (carried forward)

2026.06.03.0032

Unreleased (carried forward)

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1648

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1638

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1648

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1611

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1648

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1638

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward)

2026.06.02.1648

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward)

2026.06.02.1724

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward)

2026.06.02.1737

Unreleased

2026.06.02.1907

Unreleased (carried forward)

2026.06.02.1902

Unreleased

2026.06.02.1907

Unreleased (carried forward) (carried forward) (carried forward) (carried forward) (carried forward) (carried forward) (carried forward)

Added

  • Initial repository skeleton, C# netstandard2.0 project, and PowerShell module layout.
  • Centralized logging (InfisicalLogger), error types/handler, sanitizer, path utility, and SecureString utility.
  • Endpoint registry covering UniversalAuthLogin, ListSecrets, and RetrieveSecret, and a System.Uri-based URI builder.
  • Synchronous HTTP client, JSON/YAML/XML/ENV serializers, and DTO/mapper for secrets.
  • Connection model, process-level session manager, Universal Auth and Token Auth providers.
  • Cmdlets: Connect-Infisical, Disconnect-Infisical, Get-InfisicalSecrets, Get-InfisicalSecret, ConvertTo-InfisicalSecretDictionary, Export-InfisicalSecrets.
  • Build script (build.ps1) generating manifest, copying binaries, creating release folders, and supporting unit/integration tests.
  • xUnit test project with unit tests and opt-in integration tests.