Skip to content

Harden shared action and agent credential responses - #1920

Merged
Paul Lizer (paullizer) merged 2 commits into
Developmentfrom
paullizer-action-secret-exposure
Nov 11, 2026
Merged

Paul Lizer (paullizer) merged 2 commits into
Developmentfrom
paullizer-action-secret-exposure

Conversation

@paullizer

Copy link
Copy Markdown
Collaborator

Summary

  • Separate shared capability discovery from credential management. Legacy group and shared-global action/agent responses return metadata to non-managers and masked, non-secret configuration to authorized group managers, independently of Key Vault storage mode.
  • Reuse native projections and conditional keep/replace/clear writes in classic group editors. Preserve untouched credentials and existing authorized legacy agent IDs, handle Basic authentication safely, and reject composed stored-value masks before they overwrite secrets.
  • Preserve authoritative credential re-entry metadata on cleaned list rows and recompute it only for raw detail/save records. Runtime invocation/binding rules and dedicated site-admin settings remain unchanged; this does not reset or migrate stored credentials.
  • Add isolated API, installed-SDK lifecycle, and real-browser regressions; update the existing usage guides and bump the application to 0.261.428.

Intentional API tightening: non-managing legacy readers no longer receive connector/agent configuration, and group managers cannot reveal saved credential values. Legitimate discovery, selection, and execution remain available.

Linked issue

N/A.

Release Notes & Latest Features

  • New Feature
  • Bug Fix
  • UI Enhancement
  • Breaking Change
  • Internal only

Is this visible to end users?

  • Yes
  • No

Is this admin-facing (Admin Settings, governance, deployment, config)?

  • Yes
  • No

Should this become a Latest Feature card?

  • Yes
  • No
  • Already added

Screenshot needed for the card?

  • Yes
  • No
  • Attached

Version bump

  • application/single_app/config.py VERSION third segment bumped, or not needed because this is docs-only
  • deployers/version.txt bumped, or not needed because deployers/ was not changed

Testing / validation

API/SDK runs used synthetic Cosmos/Key Vault fixtures with external networking blocked. Browser checks used the production local assets with intercepted synthetic APIs.

  • python -B .\scripts\check_cosmos_response_boundaries.py --run-contracts - Passed: 2,053 tests. This broad run preceded the final readiness-source integration guard; the final guard was then verified by the focused command below.
  • python -B -m pytest -q --tb=short -p no:cacheprovider -p test_support.cosmos_network_guard .\functional_tests\test_shared_action_secret_responses.py .\functional_tests\test_shared_agent_secret_responses.py .\functional_tests\test_workspace_authoring_sdk_boundaries.py - Passed: 99 tests on the final source.
  • python -B -m pytest -q --tb=short -p no:cacheprovider .\ui_tests\test_shared_workspace_secret_editing.py - Passed: 22 browser workflows.
  • python -B .\scripts\check_cosmos_response_boundaries.py - Passed: 1,094 owners, 426 doubles, zero review gaps. Module-only changes received renewed owner-runtime SDK evidence; no source-only exemptions were added.
  • python -B .\functional_tests\test_docs_app_surface_coverage.py && python -B .\functional_tests\test_docs_site_quality.py - Passed: 7 coverage checks and 6 site-quality checks.
  • python -B .\functional_tests\route_tests\test_route_blueprint_policy_inventory.py && python -B .\functional_tests\route_tests\test_route_unauthenticated_policy_contract.py && python -B .\functional_tests\route_tests\test_route_policy_test_coverage.py - Passed: 28 route-policy checks.

Commit-diff XSS and broken-access-control guardrails also passed for all 10 changed application files and all 5 changed Python files, respectively. All five changed JavaScript assets passed node --check; patch whitespace checks passed.

Documentation

  • Release notes updated, or not needed
  • Feature documentation updated, or not needed
  • Fix documentation updated, or not needed

Updated only the existing group-workspace and agent/action usage guides. Release notes and standalone feature/fix reports are intentionally not included in this scoped change.

Security checklist

  • New Flask routes include @swagger_route(security=get_auth_security())
  • Settings sent to non-admin frontends use sanitize_settings_for_user()
  • Browser JavaScript is served from local SimpleChat static assets only; no CDN-hosted JS
  • No secrets, keys, connection strings, or local-only artifacts are included

No new Flask routes or raw settings-object serialization were added. Shared-resource records use canonical allowlisted projections and credential masking; existing settings-sanitization boundaries and dedicated admin settings are unchanged. Test credentials are synthetic, and session-only planning artifacts are excluded.

Separate shared group/global discovery payloads from credential-bearing configuration.

Reuse native secret-preserving writes and conditional revisions for classic group editors, including explicit clears and safe masked-credential handling. Add offline API, SDK lifecycle, and browser regressions, update usage guidance, and bump the application patch version.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Retain both shared-credential and support-export SDK inventory entries.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@paullizer
Paul Lizer (paullizer) merged commit e601e6f into Development Nov 11, 2026
13 checks passed
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.

2 participants