Default -ViewSecretValue to true; reject <hidden-by-infisical> placeholder
Publish to PowerShell Gallery / build (pull_request) Failing after 6s
Publish to PowerShell Gallery / release (pull_request) Has been skipped
Publish to PowerShell Gallery / publish (pull_request) Has been skipped

Get-InfisicalSecrets and Get-InfisicalSecret now return real secret values by default. Pass -ViewSecretValue:False to opt in to the server's hidden response. InfisicalSecretMapper detects the <hidden-by-infisical> placeholder and the secretValueHidden flag; in either case SecretValue is set to null instead of pushing the literal placeholder into a SecureString, so downstream auth/export/dictionary consumers can never silently use the placeholder as if it were a real secret.
This commit is contained in:
GraceSolutions
2026-06-02 21:34:16 -04:00
parent 7be0b7b420
commit dce97e98de
7 changed files with 23 additions and 8 deletions
+8
View File
@@ -6,6 +6,14 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos
## Unreleased ## Unreleased
## 2026.06.03.0131
- Build produced from commit 7be0b7b42008.
- **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 ## 2026.06.03.0113
- Build produced from commit 09c577ebd0fd. - Build produced from commit 09c577ebd0fd.
+2 -2
View File
@@ -1,6 +1,6 @@
@{ @{
RootModule = 'PSInfisicalAPI.psm1' RootModule = 'PSInfisicalAPI.psm1'
ModuleVersion = '2026.06.03.0113' ModuleVersion = '2026.06.03.0131'
GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51'
Author = 'Grace Solutions' Author = 'Grace Solutions'
CompanyName = 'Grace Solutions' CompanyName = 'Grace Solutions'
@@ -27,7 +27,7 @@
LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html'
ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI'
ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.'
CommitHash = '09c577ebd0fd' CommitHash = '7be0b7b42008'
} }
} }
} }
Binary file not shown.
+2 -2
View File
@@ -971,7 +971,7 @@ SecretPath: Current connection DefaultSecretPath or /
Recursive: false Recursive: false
IncludeImports: false IncludeImports: false
ExpandSecretReferences: false ExpandSecretReferences: false
ViewSecretValue: false ViewSecretValue: true
``` ```
## Behavior ## Behavior
@@ -1040,7 +1040,7 @@ ProjectId: Current connection ProjectId
Environment: Current connection Environment Environment: Current connection Environment
SecretPath: Current connection DefaultSecretPath or / SecretPath: Current connection DefaultSecretPath or /
Type: Shared Type: Shared
ViewSecretValue: false ViewSecretValue: true
ExpandSecretReferences: false ExpandSecretReferences: false
IncludeImports: false IncludeImports: false
``` ```
@@ -19,7 +19,7 @@ namespace PSInfisicalAPI.Cmdlets
[Parameter] public string ApiVersion { get; set; } [Parameter] public string ApiVersion { get; set; }
[Parameter] public int? Version { get; set; } [Parameter] public int? Version { get; set; }
[Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; [Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared;
[Parameter] public SwitchParameter ViewSecretValue { get; set; } [Parameter] public SwitchParameter ViewSecretValue { get; set; } = SwitchParameter.Present;
[Parameter] public SwitchParameter ExpandSecretReferences { get; set; } [Parameter] public SwitchParameter ExpandSecretReferences { get; set; }
[Parameter] public SwitchParameter IncludeImports { get; set; } [Parameter] public SwitchParameter IncludeImports { get; set; }
@@ -20,7 +20,7 @@ namespace PSInfisicalAPI.Cmdlets
[Parameter] public SwitchParameter IncludeImports { get; set; } [Parameter] public SwitchParameter IncludeImports { get; set; }
[Parameter] public SwitchParameter IncludePersonalOverrides { get; set; } [Parameter] public SwitchParameter IncludePersonalOverrides { get; set; }
[Parameter] public SwitchParameter ExpandSecretReferences { get; set; } [Parameter] public SwitchParameter ExpandSecretReferences { get; set; }
[Parameter] public SwitchParameter ViewSecretValue { get; set; } [Parameter] public SwitchParameter ViewSecretValue { get; set; } = SwitchParameter.Present;
[Parameter] public Hashtable MetadataFilter { get; set; } [Parameter] public Hashtable MetadataFilter { get; set; }
[Parameter] public string[] TagSlugs { get; set; } [Parameter] public string[] TagSlugs { get; set; }
@@ -15,6 +15,8 @@ namespace PSInfisicalAPI.Secrets
return null; return null;
} }
bool hidden = dto.SecretValueHidden || IsHiddenPlaceholder(dto.SecretValue);
InfisicalSecret secret = new InfisicalSecret InfisicalSecret secret = new InfisicalSecret
{ {
Id = dto.Id, Id = dto.Id,
@@ -24,8 +26,8 @@ namespace PSInfisicalAPI.Secrets
Version = dto.Version, Version = dto.Version,
Type = ParseType(dto.Type), Type = ParseType(dto.Type),
SecretName = dto.SecretKey, SecretName = dto.SecretKey,
SecretValue = SecureStringUtility.ToReadOnlySecureString(dto.SecretValue), SecretValue = hidden ? null : SecureStringUtility.ToReadOnlySecureString(dto.SecretValue),
SecretValueHidden = dto.SecretValueHidden, SecretValueHidden = hidden,
SecretPath = dto.SecretPath, SecretPath = dto.SecretPath,
SecretComment = dto.SecretComment, SecretComment = dto.SecretComment,
CreatedAtUtc = ParseTimestamp(dto.CreatedAt), CreatedAtUtc = ParseTimestamp(dto.CreatedAt),
@@ -41,6 +43,11 @@ namespace PSInfisicalAPI.Secrets
return secret; return secret;
} }
private static bool IsHiddenPlaceholder(string value)
{
return string.Equals(value, "<hidden-by-infisical>", StringComparison.Ordinal);
}
public static InfisicalSecret[] MapMany(IEnumerable<InfisicalSecretResponseDto> items) public static InfisicalSecret[] MapMany(IEnumerable<InfisicalSecretResponseDto> items)
{ {
if (items == null) if (items == null)