Skip to content

Bump actions/upload-artifact from 7.0.0 to 7.0.1#2

Open
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/github_actions/actions/upload-artifact-7.0.1
Open

Bump actions/upload-artifact from 7.0.0 to 7.0.1#2
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/github_actions/actions/upload-artifact-7.0.1

Conversation

@dependabot
Copy link
Copy Markdown

@dependabot dependabot Bot commented on behalf of github Apr 23, 2026

Bumps actions/upload-artifact from 7.0.0 to 7.0.1.

Release notes

Sourced from actions/upload-artifact's releases.

v7.0.1

What's Changed

Full Changelog: actions/upload-artifact@v7...v7.0.1

Commits
  • 043fb46 Merge pull request #797 from actions/yacaovsnc/update-dependency
  • 634250c Include changes in typespec/ts-http-runtime 0.3.5
  • e454baa Readme: bump all the example versions to v7 (#796)
  • 74fad66 Update the readme with direct upload details (#795)
  • See full diff in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@bbbca2d...043fb46)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Apr 23, 2026
hiboma added a commit that referenced this pull request Apr 23, 2026
Subagent review of the branch found four small issues worth fixing before
merge:

1. Authorizer / SplunkClient / LoginResponse all derived Debug. Authorizer's
   cached_session is a Splunk session key and LoginResponse carries the same
   value from /services/auth/login. The derived Debug on
   Arc<RwLock<Option<String>>> would expand the string verbatim, so any
   future `eprintln!("{:?}", client)` / `dbg!(&auth)` would leak the session
   key. Drop the derives and hand-write Authorizer's Debug so cached_session
   only ever renders as "Some(***)" / "None" / "<locked>". SplunkClient
   drops Debug entirely (the one `expect_err` callsite in the integration
   test is rewritten to match on the result). LoginResponse drops the
   derive outright.

2. resolve_secret treated an empty string as a real value. With
   `SPLUNK_TOKEN=""` in the environment (a common mistake after e.g.
   `source .envrc` without actually setting the var), the CLI would build
   `BearerToken("")` and then 401. Filter empty strings out of all three
   sources (env, store, toml) so missing and empty collapse to the same
   "no credential set" state.

3. migrate computed its remove-list from the fields it actually wrote to
   the store. A pre-existing `token = ""` line in config.toml was therefore
   not cleaned up, even though after migrate the user expects the toml to
   be entirely free of secret declarations. Flip the rule: always remove
   the three secret keys from the toml regardless of whether the store was
   updated. The value is already gone from effective resolution thanks to
   #2, and leaving the dead declaration behind was just confusing.

4. `credentials set --stdin` used buf.trim(), which also strips leading and
   trailing spaces. Token values with intentional surrounding whitespace
   would be silently corrupted. Narrow the strip to `trim_end_matches(['\r',
   '\n'])` so we still drop the terminator from `read_line` but respect
   whatever the user actually piped in.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hiboma added a commit that referenced this pull request Apr 23, 2026
Subagent review of the branch found four small issues worth fixing before
merge:

1. Authorizer / SplunkClient / LoginResponse all derived Debug. Authorizer's
   cached_session is a Splunk session key and LoginResponse carries the same
   value from /services/auth/login. The derived Debug on
   Arc<RwLock<Option<String>>> would expand the string verbatim, so any
   future `eprintln!("{:?}", client)` / `dbg!(&auth)` would leak the session
   key. Drop the derives and hand-write Authorizer's Debug so cached_session
   only ever renders as "Some(***)" / "None" / "<locked>". SplunkClient
   drops Debug entirely (the one `expect_err` callsite in the integration
   test is rewritten to match on the result). LoginResponse drops the
   derive outright.

2. resolve_secret treated an empty string as a real value. With
   `SPLUNK_TOKEN=""` in the environment (a common mistake after e.g.
   `source .envrc` without actually setting the var), the CLI would build
   `BearerToken("")` and then 401. Filter empty strings out of all three
   sources (env, store, toml) so missing and empty collapse to the same
   "no credential set" state.

3. migrate computed its remove-list from the fields it actually wrote to
   the store. A pre-existing `token = ""` line in config.toml was therefore
   not cleaned up, even though after migrate the user expects the toml to
   be entirely free of secret declarations. Flip the rule: always remove
   the three secret keys from the toml regardless of whether the store was
   updated. The value is already gone from effective resolution thanks to
   #2, and leaving the dead declaration behind was just confusing.

4. `credentials set --stdin` used buf.trim(), which also strips leading and
   trailing spaces. Token values with intentional surrounding whitespace
   would be silently corrupted. Narrow the strip to `trim_end_matches(['\r',
   '\n'])` so we still drop the terminator from `read_line` but respect
   whatever the user actually piped in.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hiboma added a commit that referenced this pull request Apr 23, 2026
…chain (#6)

* refactor(config): split config.rs into config/ module

Prepare for adding credential_store sibling by moving the single-file
module into a directory. No behavioral change — this commit is a pure
rename so downstream functional changes stay reviewable in isolation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(config): add macOS Keychain-backed credential store

Introduce a CredentialStore trait with a macOS KeychainStore implementation
(keyring crate, apple-native feature) and a test-only MemoryStore. Wire
resolve_credentials to consult the store between environment variables and
the toml, so each of token / session_key / password can live in the OS
credential store instead of plaintext config.

Why: plaintext secrets in ~/.config/splunk-cloud-cli/config.toml are the
single most direct leak surface — Time Machine backups, accidental dotfile
commits, malware reading the home directory under the same uid. Moving the
secret into the Keychain closes that path.

Design decisions worth calling out:

- StoreError is split into Unavailable (no backend at all — non-macOS build,
  CI sandbox without a default keychain) vs Backend (a real access failure
  such as a denied prompt, daemon down, ACL mismatch). Only Unavailable
  falls through to the toml. A Backend failure does NOT fall through;
  silently picking up a stale plaintext value would defeat the point of
  moving the secret into the Keychain in the first place.
- Settings and AuthMethod get hand-written Debug impls that mask the three
  secret fields, so accidental {:?} / dbg! formatting cannot leak secrets
  into logs or error messages.
- resolve_credentials_with_store is exposed for tests so they can inject a
  MemoryStore without touching the real Keychain.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(cli): add credentials subcommand (set/delete/status/migrate)

Add splunk-cloud-cli credentials as the user-facing way to put secrets into
the Keychain and audit what is stored. The subcommand intentionally does
not expose a get verb: the value never needs to leave the store for any
legitimate workflow, and exposing one would invite leakage into shell
history, terminal scrollback, and AI-agent transcripts.

set reads the value from an rpassword-hidden prompt, or from stdin for CI.
status probes each known key and prints only "stored" / "not stored" —
never the value. delete removes the entry. migrate moves any token /
session_key / password currently in config.toml into the Keychain in one
step, ordered so the user is never left in an inconsistent half-migrated
state:

1. Write to the credential store first. Any failure rolls back the entries
   already written in this run; the toml has not been touched yet.
2. Ask the user how to dispose of the plaintext copy (default: remove
   outright, with a loud warning if they opt for a 0600 backup).
3. Rewrite the toml via a 0600 tempfile + rename. If the rewrite fails,
   roll back the store entries so the next run of the CLI picks up the
   still-present plaintext secret rather than a missing one.

Unsupported TOML quoting forms (literal strings, multi-line basic/literal,
escaped quotes) are refused rather than silently mishandled. We delete the
line entirely instead of blanking the value, so a future reader cannot
misread client_secret = "" as an intentional override.

main.rs routes credentials (and completion) before load_settings /
resolve_credentials, since the whole point of `credentials set` is to
configure the credentials themselves.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: add .gitallowed allowlist for git-secrets

Track the allowlist that silences git-secrets false positives on the Cargo
checksum pattern and on a couple of crate names the hook's entropy scan
flags. Previously lived in the parent checkout only, so commits from fresh
worktrees would fail the pre-commit hook without any way to reproduce the
configuration.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: document Keychain credential storage

Add a Credential storage section to README describing the env > Keychain >
config.toml resolution order, the Backend-error-does-not-fall-through
behavior, the set / status / delete / migrate workflow, and how to inspect
the entries via Keychain Access or security(1). Mark the keyring item in
TODO.md as done.

Also replace the pre-existing "eyJraWQi..." TOML example placeholder with
the allowlist-friendly "eyJEXAMPLEHEADER00.eyJEXAMPLEPAYLOAD0.EXAMPLESIGN0"
form so the pre-commit git-secrets hook stops false-positive-blocking
unrelated commits that touch README.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(credentials): close Debug leak paths, empty-env UX, migrate contract

Subagent review of the branch found four small issues worth fixing before
merge:

1. Authorizer / SplunkClient / LoginResponse all derived Debug. Authorizer's
   cached_session is a Splunk session key and LoginResponse carries the same
   value from /services/auth/login. The derived Debug on
   Arc<RwLock<Option<String>>> would expand the string verbatim, so any
   future `eprintln!("{:?}", client)` / `dbg!(&auth)` would leak the session
   key. Drop the derives and hand-write Authorizer's Debug so cached_session
   only ever renders as "Some(***)" / "None" / "<locked>". SplunkClient
   drops Debug entirely (the one `expect_err` callsite in the integration
   test is rewritten to match on the result). LoginResponse drops the
   derive outright.

2. resolve_secret treated an empty string as a real value. With
   `SPLUNK_TOKEN=""` in the environment (a common mistake after e.g.
   `source .envrc` without actually setting the var), the CLI would build
   `BearerToken("")` and then 401. Filter empty strings out of all three
   sources (env, store, toml) so missing and empty collapse to the same
   "no credential set" state.

3. migrate computed its remove-list from the fields it actually wrote to
   the store. A pre-existing `token = ""` line in config.toml was therefore
   not cleaned up, even though after migrate the user expects the toml to
   be entirely free of secret declarations. Flip the rule: always remove
   the three secret keys from the toml regardless of whether the store was
   updated. The value is already gone from effective resolution thanks to
   #2, and leaving the dead declaration behind was just confusing.

4. `credentials set --stdin` used buf.trim(), which also strips leading and
   trailing spaces. Token values with intentional surrounding whitespace
   would be silently corrupted. Narrow the strip to `trim_end_matches(['\r',
   '\n'])` so we still drop the terminator from `read_line` but respect
   whatever the user actually piped in.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(credentials): cover Backend/Unavailable fallback, empty env, TOML edges

Add tests for the contracts that the preceding fix commit just locked
down, plus the TOML parsing edges the subagent review flagged as
under-covered:

- FailingStore and UnavailableStore stubs in test_support so resolve tests
  can drive the StoreError::Backend vs Unavailable paths that the real
  KeychainStore cannot trigger deterministically.
- resolve_backend_error_refuses_toml_fallback exercises the load-bearing
  contract that a Keychain access denial does NOT silently pick up a stale
  plaintext from config.toml. Also asserts the toml value string does not
  appear in the error message.
- resolve_unavailable_store_falls_through_to_toml covers the dual case:
  when the store is simply not present, the toml IS read.
- resolve_empty_env_var_is_treated_as_unset pins the SPLUNK_TOKEN="" UX
  behavior so a future refactor cannot silently regress it.
- auth_method_debug_masks_session_key_and_basic_password extends the
  existing Debug-masks-BearerToken test to the other two variants, so the
  guarantee covers AuthMethod as a whole.
- TOML scanning edges: CRLF line endings, inline `#` comment, commented-
  out lines, tab as key/value separator, and the migrate contract that
  `token = ""` gets dropped by remove_fields even though extract_field
  reports it as Absent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants