Skip to content

Fix/vault reset and passthrough - #535

Merged
ginccc merged 8 commits into
mainfrom
fix/vault-reset-and-passthrough
Jun 18, 2026
Merged

Fix/vault reset and passthrough#535
ginccc merged 8 commits into
mainfrom
fix/vault-reset-and-passthrough

Conversation

@ginccc

@ginccc ginccc commented Jun 17, 2026

Copy link
Copy Markdown
Member

Summary

This pull request introduces a new "reset vault" operation for tenant secrets management, improves error handling and logging, and updates the test infrastructure to support the new functionality. The most significant changes are the addition of a destructive vault reset endpoint, robust handling for master key changes, and improved clarity in error messages.

Vault reset functionality:

  • Added a new resetTenant method to the ISecretProvider interface and implemented it in VaultSecretProvider, allowing administrators to delete all secrets and the DEK for a specific tenant, enabling recovery when the master key changes and the old key is unavailable. [1] [2]
  • Exposed a new REST API endpoint POST /secretstore/secrets/{tenantId}/reset in IRestSecretStore and RestSecretStore for admins to trigger the vault reset operation. [1] [2]

Robust handling of master key changes:

  • Improved DEK decryption error handling in VaultSecretProvider: if the DEK cannot be decrypted due to a master key change, the user receives a clear error with actionable recovery steps, including using the new reset endpoint.

Logging and error handling improvements:

  • Standardized logging in RestSecretStore to use LOGGER.error with exception details instead of custom formatted error messages, providing better stack traces and easier debugging. (F1384645L137R137, [1] [2] [3] [4] [5]

Test updates:

  • Updated test doubles in AgentSigningServiceTest to implement the new resetTenant method, and extended RestSecretStoreTest with new imports and test structure to support the new functionality. [1] [2]

Other improvements:

  • In AgentSetupService, improved handling of API keys that are already vault references by detecting and using them as-is, avoiding unnecessary re-vaulting.

Type of Change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📝 Documentation update
  • ♻️ Refactoring (no functional changes)
  • 🔧 Chore (dependency updates, CI changes, etc.)

Checklist

  • My code follows the project's code style
  • I have added tests that prove my fix/feature works
  • Existing tests pass locally (./mvnw clean verify -DskipITs)
  • I have updated documentation if needed
  • My commit messages follow conventional commits
  • I have not committed any secrets, API keys, or tokens
  • This PR has a clear, focused scope (one concern per PR)

Summary by CodeRabbit

Release Notes

  • New Features

    • Added an admin-only REST endpoint to reset a tenant’s secrets vault, permanently deleting all tenant secrets and keys and refreshing cached secret data.
  • Bug Fixes

    • Improved API key handling: if an API key is already in vault-reference form, it is now recognized and reused without re-storing.
  • Improvements

    • Enhanced handling of DEK/KEK cryptographic failures with clearer operator-facing recovery guidance.
    • Improved REST error logging using sanitized identifiers.

ginccc added 2 commits June 17, 2026 17:45
- Add resetTenant() to ISecretProvider and VaultSecretProvider
  Deletes all secrets + DEK for a tenant, bypassing DEK decryption.
  Safe to call when master key has changed and old key is unavailable.
- Add POST /{tenantId}/reset REST endpoint in IRestSecretStore/RestSecretStore
  with input validation, cache invalidation, and proper error responses.
- Extract handleDekDecryptionFailure() with actionable 3-option recovery message
  including secret count context (0/N/unknown) for informed decision-making.
- Extract generateAndPersistDek() helper from getOrCreateDek().
- Fix vaultApiKey() in AgentSetupService to detect existing vault refs
  and pass them through, preventing double-vaulting bug.
- Fix LOGGER.errorf -> LOGGER.error to preserve stack traces in error logs.
…yptionFailure, vaultApiKey

- VaultSecretProviderBranchTest: 8 new tests covering resetTenant (happy path,
  empty tenant, persistence failure, vault unavailable), handleDekDecryptionFailure
  (with N/0/unknown secrets), and generateAndPersistDek (new DEK generation).
- RestSecretStoreTest: 6 new tests for resetTenant endpoint (200 success, 503
  unavailable, 400 invalid/blank tenantId, 500 provider exception, cache invalidation).
- AgentSetupServiceBranchCoverageTest: 3 new tests for vaultApiKey passthrough
  (vault reference, null, blank).
- AgentSigningServiceTest: add resetTenant() stub to InMemorySecretProvider.

All 141 tests pass. Coverage: RestSecretStore 100%/95.7%, VaultSecretProvider
78.1%/80.4% (new methods fully covered, remaining gaps in pre-existing code).
@ginccc
ginccc requested a review from rolandpickl as a code owner June 17, 2026 15:56
@ginccc
ginccc requested a review from Copilot June 17, 2026 15:56
@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 18ad8631-e88c-45fb-8cdb-ab57e5623894

📥 Commits

Reviewing files that changed from the base of the PR and between 9311642 and fc1c83e.

📒 Files selected for processing (2)
  • src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java
  • src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java
  • src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java

📝 Walkthrough

Walkthrough

The PR adds a destructive resetTenant operation to the secrets vault system: it is declared in ISecretProvider, implemented in VaultSecretProvider with explicit generateAndPersistDek and handleDekDecryptionFailure DEK provisioning helpers, exposed as an admin-only REST endpoint in IRestSecretStore/RestSecretStore, and error logging across existing REST endpoints is standardized. AgentSetupService.vaultApiKey gains a short-circuit for already-vaulted ${vault:...} references. Comprehensive branch-coverage tests are added for all new paths, edge cases, and related functionality across the secrets and setup services.

Changes

Vault resetTenant feature with DEK refactor and AgentSetupService guard

Layer / File(s) Summary
ISecretProvider and IRestSecretStore contracts
src/main/java/ai/labs/eddi/secrets/ISecretProvider.java, src/main/java/ai/labs/eddi/secrets/rest/IRestSecretStore.java
resetTenant(String tenantId) method contract added to ISecretProvider with destructive semantics documentation; admin-only POST /{tenantId}/reset JAX-RS endpoint declared in IRestSecretStore with OpenAPI metadata and role protection.
VaultSecretProvider resetTenant and DEK helper refactor
src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java
Implements resetTenant (enumerate and delete all tenant secrets, delete DEK, return count); refactors getOrCreateDek to route missing-DEK path to new generateAndPersistDek helper and crypto-failure path to new handleDekDecryptionFailure (which throws detailed SecretProviderException with recovery guidance).
RestSecretStore resetTenant endpoint and error logging refactor
src/main/java/ai/labs/eddi/secrets/rest/RestSecretStore.java
Adds resetTenant implementation with vault availability check, tenantId validation, provider delegation, secret resolver cache invalidation, and 200/500 responses. Updates error logging across storeSecret, deleteSecret, getSecretMetadata, listSecrets, rotateDek, and rotateKek to use standardized LOGGER.error(..., exception) pattern.
AgentSetupService vault reference short-circuit
src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java
vaultApiKey method detects already-vaulted ${vault:...} and legacy ${eddivault:...} reference patterns and returns the input unchanged with a log message, skipping storage.
VaultSecretProvider comprehensive branch-coverage tests
src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java
New test class covering DEK creation and persistence failure, DEK/KEK rotation success and error paths, metadata/listKeys exception wrapping, resolve last-accessed updates, store defaulting behaviors, resetTenant success/empty/failure/unavailable scenarios, handleDekDecryptionFailure message content assertions, and end-to-end generateAndPersistDek via store flow.
RestSecretStore and AgentSigningService test coverage
src/test/java/ai/labs/eddi/secrets/rest/RestSecretStoreTest.java, src/test/java/ai/labs/eddi/configs/agents/AgentSigningServiceTest.java
RestSecretStoreTest gains nested groups for all existing endpoints' error/success paths and a comprehensive resetTenant group covering validation, success payload, vault unavailability, and provider exceptions. AgentSigningServiceTest.InMemorySecretProvider adds resetTenant override to support test scenarios.
AgentSetupService comprehensive branch-coverage tests
src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java
New test class covering all helper methods (parseEnvironment, extractIdFromLocation, extractVersionFromLocation, isLocalLlmProvider, supportsResponseFormat, buildPromptResponseJson, resolveParams), setupAgent cloud vs local provider validation, deployAndWait HTTP status and error branching, createLlmConfig provider-specific parameter wiring, buildPostResponse QR generation, createWorkflowConfig step counting, and vaultApiKey passthrough via reflection.
PropertySetterTaskTest coverage expansion
src/test/java/ai/labs/eddi/modules/properties/impl/PropertySetterTaskTest.java
Expands with configuration/exception imports; adds ExecuteTests covering fromObjectPath value extraction for multiple types, toObjectPath write behavior, secret scope auto-vaulting and vault-failure degradation, template processing error wrapping, and CATCH_ANY_INPUT_AS_PROPERTY edge cases; adds ConfigureTests for URI-based config loading and error wrapping.
Gitleaks suppression for test fixtures
.gitleaksignore
Adds gitleaks suppression fingerprints for RestSecretStoreTest KEK rotation test fixture values to prevent false-positive secret detection.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~65 minutes

Possibly related PRs

  • labsai/EDDI#470: Introduces SecretReference.isVaultReference(...) which is directly used by this PR's AgentSetupService.vaultApiKey to detect already-vaulted ${vault:...} references.

Suggested reviewers

  • rolandpickl

Poem

🐇 A vault of secrets locked up tight,
The rabbit added "reset" just right.
Already vaulted? Skip the store!
DEK helpers keep the crypto lore.
With tests galore, the branches sing—
Hop hop hooray for everything! 🔑

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.95% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Fix/vault reset and passthrough' is concise and directly describes the main features: vault reset functionality and API key passthrough improvements.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/vault-reset-and-passthrough

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown

⚠️ Deprecation Warning: The deny-licenses option is deprecated for possible removal in the next major release. For more information, see issue 997.

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

Comment thread src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java Fixed
EncryptedDek dek = new EncryptedDek(UUID.randomUUID().toString(), tenantId, encResult.ciphertext(), encResult.iv(), Instant.now());

persistence.upsertDek(dek);
LOGGER.infof("Generated new DEK for tenant: %s", tenantId);

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java (1)

710-720: ⚡ Quick win

Add a passthrough test for legacy ${eddivault:...} references.

Current coverage only asserts ${vault:...} passthrough. Adding the legacy prefix case will lock in compatibility with existing reference semantics and prevent future regressions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java`
around lines 710 - 720, The passthroughVaultReference test only covers the
modern ${vault:...} format but lacks coverage for the legacy ${eddivault:...}
format. Add a new test method (similar to passthroughVaultReference) that tests
the same passthrough behavior but using the legacy
${eddivault:anthropic-api-key} reference format. This new test should also
invoke invokeVaultApiKey with the legacy format, assert that the same reference
is returned unchanged, and verify that secretProvider has no interactions,
ensuring backward compatibility with existing vault references is maintained.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java`:
- Around line 499-503: The condition in the vault reference guard check only
validates the new `${vault:...}` format but ignores the legacy
`${eddivault:...}` format, causing legacy references to be re-vaulted instead of
passed through. Update the if statement condition to also check for the legacy
`${eddivault:` prefix pattern in addition to the current `${vault:` check,
ensuring both formats are recognized as already-vaulted references and returned
as-is without re-vaulting.

---

Nitpick comments:
In
`@src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java`:
- Around line 710-720: The passthroughVaultReference test only covers the modern
${vault:...} format but lacks coverage for the legacy ${eddivault:...} format.
Add a new test method (similar to passthroughVaultReference) that tests the same
passthrough behavior but using the legacy ${eddivault:anthropic-api-key}
reference format. This new test should also invoke invokeVaultApiKey with the
legacy format, assert that the same reference is returned unchanged, and verify
that secretProvider has no interactions, ensuring backward compatibility with
existing vault references is maintained.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4cf810ce-75e7-43ad-9e0d-254a7baca09c

📥 Commits

Reviewing files that changed from the base of the PR and between 67be58b and 06ef33a.

📒 Files selected for processing (9)
  • src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java
  • src/main/java/ai/labs/eddi/secrets/ISecretProvider.java
  • src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java
  • src/main/java/ai/labs/eddi/secrets/rest/IRestSecretStore.java
  • src/main/java/ai/labs/eddi/secrets/rest/RestSecretStore.java
  • src/test/java/ai/labs/eddi/configs/agents/AgentSigningServiceTest.java
  • src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java
  • src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java
  • src/test/java/ai/labs/eddi/secrets/rest/RestSecretStoreTest.java

Comment thread src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a destructive “reset tenant vault” operation to the Secrets Vault subsystem to recover from unrecoverable master-key (KEK) changes, while improving REST-side logging and extending test coverage for the new and existing vault branches.

Changes:

  • Introduce ISecretProvider.resetTenant() and implement it in VaultSecretProvider to delete all tenant secrets and the tenant DEK.
  • Expose POST /secretstore/secrets/{tenantId}/reset (admin-only) in IRestSecretStore/RestSecretStore, with validation + cache invalidation.
  • Expand unit/branch-coverage tests around vault error paths, key rotation, reset behavior, and AgentSetupService vault-reference passthrough.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/main/java/ai/labs/eddi/secrets/ISecretProvider.java Adds the resetTenant SPI method for destructive tenant vault resets.
src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java Implements tenant reset and improves DEK decryption failure messaging + DEK creation factoring.
src/main/java/ai/labs/eddi/secrets/rest/IRestSecretStore.java Adds the admin REST contract for POST /{tenantId}/reset.
src/main/java/ai/labs/eddi/secrets/rest/RestSecretStore.java Implements the reset endpoint and standardizes error logging to include stack traces.
src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java Avoids re-vaulting API keys that are already vault references (passthrough behavior).
src/test/java/ai/labs/eddi/secrets/rest/RestSecretStoreTest.java Adds nested tests for additional REST error branches + resetTenant behavior.
src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java New extended branch-coverage tests for VaultSecretProvider (DEK/KEK rotation, reset, failure branches).
src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java New branch-coverage tests for AgentSetupService helpers and vault passthrough behavior.
src/test/java/ai/labs/eddi/configs/agents/AgentSigningServiceTest.java Updates test double to implement the new SPI method.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +499 to +503
// Already a vault reference — use it directly, don't re-vault
if (apiKey.startsWith("${vault:") && apiKey.endsWith("}")) {
LOGGER.infof("API key for agent '%s' is already a vault reference — using as-is.", agentName);
return apiKey;
}
Comment on lines +399 to +409
// Delete all secrets first, then the DEK
var secrets = persistence.listSecretsByTenant(tenantId);
int secretCount = secrets.size();

for (var secret : secrets) {
persistence.deleteSecret(secret.getTenantId(), secret.getKeyName());
}
persistence.deleteDek(tenantId);

LOGGER.infof("[VAULT] Tenant '%s' reset: %d secret(s) deleted, DEK removed.", tenantId, secretCount);
return secretCount;
- vaultApiKey: use SecretReference.isVaultReference() + compiledPattern()
  to also handle legacy  references (CodeRabbit + Copilot).
- resetTenant: count actual successful deletions via deleteSecret() return
  value instead of assuming secrets.size() (Copilot).
- InMemorySecretProvider.resetTenant: return actual deleted count (Copilot).
- Add tests for legacy eddivault and full-form vault reference passthrough.
- Fix deleteSecret mock to return true for accurate count assertions.
Comment thread src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java (1)

387-396: ⚡ Quick win

Add a partial-delete test for resetTenant count semantics.

happyPath now correctly stubs all deletions as true, but there’s still no branch that proves the returned count excludes failed deletes (deleteSecret == false). Since this endpoint’s contract is “count successful deletions,” add a mixed-outcome test (true, false) and assert count 1 while still verifying deleteDek is called.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java`
around lines 387 - 396, The current test for resetTenant only validates the
successful deletion path where all deleteSecret calls return true. Add a new
test method to verify the partial-delete scenario where some deleteSecret calls
return false and others return true, to ensure the returned count from
resetTenant correctly reflects only successful deletions. Configure the mock for
persistence.deleteSecret to return mixed outcomes (true for one key and false
for the other), call provider.resetTenant(TENANT_ID), assert the result equals 1
(counting only successful deletes), and verify that deleteDek is still invoked
to ensure all cleanup operations are attempted regardless of individual
deleteSecret outcomes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java`:
- Around line 387-396: The current test for resetTenant only validates the
successful deletion path where all deleteSecret calls return true. Add a new
test method to verify the partial-delete scenario where some deleteSecret calls
return false and others return true, to ensure the returned count from
resetTenant correctly reflects only successful deletions. Configure the mock for
persistence.deleteSecret to return mixed outcomes (true for one key and false
for the other), call provider.resetTenant(TENANT_ID), assert the result equals 1
(counting only successful deletes), and verify that deleteDek is still invoked
to ensure all cleanup operations are attempted regardless of individual
deleteSecret outcomes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 49204f4c-9e15-4c74-8d4c-a728d5aab196

📥 Commits

Reviewing files that changed from the base of the PR and between 06ef33a and b80bbdd.

📒 Files selected for processing (5)
  • src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java
  • src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java
  • src/test/java/ai/labs/eddi/configs/agents/AgentSigningServiceTest.java
  • src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java
  • src/test/java/ai/labs/eddi/secrets/impl/VaultSecretProviderBranchTest.java
✅ Files skipped from review due to trivial changes (1)
  • src/test/java/ai/labs/eddi/configs/agents/AgentSigningServiceTest.java
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/main/java/ai/labs/eddi/engine/setup/AgentSetupService.java
  • src/main/java/ai/labs/eddi/secrets/impl/VaultSecretProvider.java
  • src/test/java/ai/labs/eddi/engine/setup/AgentSetupServiceBranchCoverageTest.java

ginccc added 2 commits June 17, 2026 18:54
- Replace high-entropy dummy value 'newkey12345678' with clearly-fake
  'test-new-master-key' in RestSecretStoreTest rotateKek fixtures.
- Add historical fingerprints to .gitleaksignore for the already-pushed
  commit (06ef33a) — these are unit test fixture values, not real secrets.
…verage tests

- fromObjectPath: String, Map, List, Integer, Float, Boolean value types
- fromObjectPath + toObjectPath: PathNavigator.setValue integration
- scope=secret: auto-vault store + graceful degradation on vault failure
- valueFloat, valueBoolean, valueList: typed property instruction coverage
- TemplateEngineException: wraps in LifecycleException
- CATCH_ANY_INPUT_AS_PROPERTY: empty input skips property
- Previous step null actions: null-safe actions data handling
- configure: URI-based config loading + ServiceException wrapping

Total: 45 tests (28 existing + 17 new), all passing.
- Fix CodeQL log injection finding: sanitize(tenantId) in resetTenant
  log message and exception message using LogSanitizer.
- Add partial-delete test proving returned count excludes failed deletes
  (mixed true/false outcome from deleteSecret). PR nitpick feedback.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Comment thread .gitleaksignore
ginccc added 2 commits June 17, 2026 19:02
Gitleaks only supports full-line # comments. Inline comments after
fingerprints were being treated as part of the fingerprint string,
preventing the suppression from matching.
@ginccc
ginccc merged commit 17930ee into main Jun 18, 2026
21 checks passed
@ginccc
ginccc deleted the fix/vault-reset-and-passthrough branch June 18, 2026 08:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants