Skip to content

Commit b27cbf1

Browse files
authored
feat(cookies): build-tag-selectable cookie provider (kooky default, HackBrowserData opt-in) (#50)
* feat(cookies): add build-tag-selectable cookie provider (kooky default, HackBrowserData opt-in) Split internal/cookies into a provider-agnostic core plus two readers chosen at build time, so the browser cookie backend can be swapped without touching the selection logic. - cookies.go keeps the pure, unit-tested selection pipeline (rawCookie, groupCandidates, selectSession, chooseSession, annotateReadError). - provider_kooky.go (//go:build !hbd) is the default: browserutils/kooky. A stock `go build` links kooky and nothing from HackBrowserData. - provider_hbd.go (//go:build hbd) reads via moond4rk/hackbrowserdata, with per-OS retriever wiring (retrievers_hbd_*.go) deliberately kept to the benign native path: no macOS login-password prompt, no Windows ABE reflective injection, standard Linux keyring. - browserReadHints and the provider tests move to the matching tagged files. Both tag variants build (darwin/linux/windows), vet, and test clean. go.mod lists both deps; only the tagged one is linked per build. * docs: document the build-tag cookie provider and version/fork pinning Update architecture.md's cookie section for the provider seam introduced with the build tag (kooky default, hackbrowserdata via -tags hbd), refresh the file tree, and add a short README note on selecting the provider and pinning any commit or fork of either dependency. * ci: exercise the hackbrowserdata provider (-tags hbd) Add vet/test/build under -tags hbd plus darwin/windows cross-compiles, so the opt-in cookie provider and its per-OS retriever files are covered and can't silently rot alongside the default kooky build. * fix(cookies): drop dead nil-error seed in hbd reader; recommend pinned HBD commit - readRawCookies seeded errs with an always-nil err (early return precedes it); use a plain nil slice (review finding). - README: recommend go get hackbrowserdata@adfb6d9 for -tags hbd builds until the next release — the first commit carrying both the macOS gcore-dump gate (#629) and library log silencing (#632). * refactor(cookies): align hbd reader error handling and hints with app idiom - readRawCookies (hbd): join the DiscoverBrowsers error instead of early-returning, matching the kooky reader's return-partial-plus-error pattern so chooseSession arbitrates. - Drop the hbd browserReadHints entry: HackBrowserData's Extract swallows per-cookie decryption failures and only surfaces store read errors, so the hint could never fire; the no-cookie case is already covered by noSessionMsg. - Move the kooky-specific chooseSession hint assertion out of the shared test into provider_kooky_test.go (it fails under -tags hbd, which has no such hint). * feat(cookies): pin gated+quiet HBD, silence its logger, ship hbd release variant - Pin hackbrowserdata to the commit carrying the macOS securityd-dump build-tag gate (#629) and package-level log.SetLevel (#632), until upstream tags a release. - Silence HackBrowserData's logger to fatal-only in the hbd build so Extract no longer writes [INF]/[WRN] to stderr. - goreleaser: add a second -tags hbd build published as hbd-<os>-<arch> assets (gh extension install still resolves the default kooky binary); modernize the archives block to the non-deprecated ids/formats keys; attest the hbd assets. Verified from snapshot binaries: default links 0 hackbrowserdata / hbd links 0 kooky, and the hbd variant carries no gcore securityd-dump symbols. * refactor(cookies): build hbd retrievers once, shared across browsers Hoist nativeRetrievers() out of the per-browser loop. Matches HackBrowserData's own injector (retrievers built once, SetRetrievers called per browser) and shares SecurityCmdRetriever's Keychain cache, so macOS prompts at most once.
1 parent d59ac2b commit b27cbf1

16 files changed

Lines changed: 568 additions & 169 deletions

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ jobs:
4242
dist/linux-*
4343
dist/windows-*
4444
dist/android-*
45+
dist/hbd-*

.github/workflows/test.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,12 @@ jobs:
1818
- run: go build ./...
1919
- name: Cross-compile android/arm64
2020
run: GOOS=android GOARCH=arm64 CGO_ENABLED=0 go build -o /dev/null .
21+
- name: hackbrowserdata provider (-tags hbd)
22+
run: |
23+
go vet -tags hbd ./...
24+
go test -tags hbd -cover ./...
25+
go build -tags hbd ./...
26+
- name: Cross-compile hbd provider (darwin, windows)
27+
run: |
28+
GOOS=darwin GOARCH=arm64 go build -tags hbd -o /dev/null .
29+
GOOS=windows GOARCH=amd64 go build -tags hbd -o /dev/null .

.goreleaser.yml

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
version: 2
22

33
builds:
4-
- binary: gh-image
4+
# Default provider: kooky. This is the binary `gh extension install` resolves.
5+
- id: kooky
6+
binary: gh-image
57
main: .
68
env:
79
- CGO_ENABLED=0
@@ -22,9 +24,42 @@ builds:
2224
- goos: android
2325
goarch: amd64
2426

27+
# Alternate provider: HackBrowserData (-tags hbd). Shipped as extra `hbd-*`
28+
# assets for manual download; `gh extension install` still gets the kooky build.
29+
# No android: HackBrowserData targets desktop browsers only.
30+
- id: hbd
31+
binary: gh-image
32+
main: .
33+
flags:
34+
- -tags=hbd
35+
env:
36+
- CGO_ENABLED=0
37+
ldflags:
38+
- -s -w -X main.version={{.Version}}-hbd
39+
goos:
40+
- darwin
41+
- linux
42+
- windows
43+
goarch:
44+
- amd64
45+
- arm64
46+
ignore:
47+
- goos: windows
48+
goarch: arm64
49+
2550
archives:
26-
- format: binary
51+
- id: default
52+
ids:
53+
- kooky
54+
formats:
55+
- binary
2756
name_template: "{{ .Os }}-{{ .Arch }}"
57+
- id: hbd
58+
ids:
59+
- hbd
60+
formats:
61+
- binary
62+
name_template: "hbd-{{ .Os }}-{{ .Arch }}"
2863

2964
checksum:
3065
name_template: "checksums.txt"

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ gh extension install .
6060

6161
Requires Go 1.26+.
6262

63+
The cookie backend defaults to [`kooky`](https://github.com/browserutils/kooky); `go build -tags hbd` uses [`hackbrowserdata`](https://github.com/moonD4rk/HackBrowserData) instead, also shipped as `hbd-<os>-<arch>` release assets. The `hbd` build pins a hackbrowserdata commit carrying the macOS securityd-dump gate and library log silencing until its next release; override either dep with `go get <module>@<ref>` or a `go.mod` `replace`.
64+
6365
</details>
6466

6567
## Usage

documentation/architecture.md

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ gh-image/
1414
├── go.sum
1515
├── internal/
1616
│ ├── cookies/
17-
│ │ ├── cookies.go # Browser session cookie extraction via kooky
17+
│ │ ├── cookies.go # Provider-agnostic session-cookie selection
1818
│ │ ├── cookies_test.go
19+
│ │ ├── provider_kooky.go # Default cookie reader: kooky (//go:build !hbd)
20+
│ │ ├── provider_hbd.go # Opt-in cookie reader: hackbrowserdata (//go:build hbd)
21+
│ │ ├── retrievers_hbd_*.go # Per-OS master-key retrievers for the hbd provider
1922
│ │ ├── jar.go # GitHub cookie jar + same-site pair construction
2023
│ │ └── jar_test.go
2124
│ ├── session/
@@ -58,7 +61,7 @@ The session token is resolved with the following precedence (first match wins):
5861

5962
1. `--token <value>` flag
6063
2. `GH_SESSION_TOKEN` environment variable
61-
3. Browser cookie store (via `kooky`)
64+
3. Browser cookie store (via the selected cookie provider — `kooky` by default)
6265

6366
The flag is convenient for one-off use; the env var is the recommended path for CI/CD and shared machines, since `--token` values are visible in process listings. Browser extraction is the zero-config path for local interactive use.
6467

@@ -68,13 +71,13 @@ The flag is convenient for one-off use; the env var is the recommended path for
6871

6972
Reads the GitHub `user_session` cookie from local browser cookie stores.
7073

71-
**Dependency:** [`browserutils/kooky`](https://github.com/browserutils/kooky) — a pure Go library that handles:
72-
- Locating each browser's cookie store on disk
73-
- Retrieving encryption keys (macOS Keychain, Windows DPAPI, Linux GNOME Keyring / kwallet)
74-
- AES decryption and cookie DB schema differences across versions
75-
- Per-browser quirks for Chromium-family browsers, Firefox, Safari, and Opera
74+
**Cookie provider (build-tag-selected):** `cookies.go` holds the pure selection logic; the browser read (`readRawCookies`) is delegated to one of two interchangeable backends, chosen at compile time. Only one is linked per binary:
75+
- **default** (`//go:build !hbd`) — [`browserutils/kooky`](https://github.com/browserutils/kooky)
76+
- **`-tags hbd`**[`moond4rk/hackbrowserdata`](https://github.com/moonD4rk/HackBrowserData), with per-OS master-key retrieval kept to the native path (no macOS login-password prompt, no Windows App-Bound-Encryption injection)
7677

77-
**Supported browsers** (registered via blank-imported kooky finders): Chrome, Brave, Edge, Chromium, Firefox, Opera, Safari. `GetGitHubSession` queries all of them in one pass, groups the `user_session` candidates per browser store, and prefers stores that are logged in. When more than one candidate survives, `validate` is used to pick a live one (pass nil to skip network validation).
78+
Both handle store discovery, per-OS key retrieval (macOS Keychain, Windows DPAPI, Linux GNOME Keyring / kwallet), AES decryption, and per-browser schema quirks. The version or fork of the active provider is pinned in `go.mod`.
79+
80+
**Supported browsers:** Chrome, Brave, Edge, Chromium, Firefox, Opera, Safari — the kooky provider registers these via blank-imported finders; the hbd provider discovers them internally. `GetGitHubSession` queries all of them in one pass, groups the `user_session` candidates per browser store, and prefers stores that are logged in. When more than one candidate survives, `validate` is used to pick a live one (pass nil to skip network validation).
7881

7982
```go
8083
// GetGitHubSession returns the best user_session cookie for github.com across

go.mod

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,48 @@ module github.com/drogers0/gh-image
22

33
go 1.26.1
44

5-
require github.com/browserutils/kooky v0.2.10
5+
require (
6+
github.com/browserutils/kooky v0.2.10
7+
github.com/moond4rk/hackbrowserdata v1.1.1-0.20260817023946-adfb6d993ef8
8+
)
69

710
require (
811
github.com/browserutils/ese v0.0.0-20260314233042-37b6a03a93ce // indirect
912
github.com/browserutils/sqlite3 v0.0.2 // indirect
13+
github.com/dustin/go-humanize v1.0.1 // indirect
1014
github.com/godbus/dbus/v5 v5.2.2 // indirect
15+
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
1116
github.com/gonuts/binary v0.2.0 // indirect
17+
github.com/google/uuid v1.6.0 // indirect
18+
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
1219
github.com/keybase/go-keychain v0.0.1 // indirect
20+
github.com/mattn/go-isatty v0.0.20 // indirect
21+
github.com/moond4rk/binarycookies v1.0.3 // indirect
22+
github.com/moond4rk/keychainbreaker v0.2.6 // indirect
23+
github.com/moond4rk/plist v1.2.2 // indirect
24+
github.com/ncruces/go-strftime v0.1.9 // indirect
25+
github.com/otiai10/copy v1.14.1 // indirect
26+
github.com/otiai10/mint v1.6.3 // indirect
1327
github.com/pierrec/lz4/v4 v4.1.26 // indirect
28+
github.com/ppacher/go-dbus-keyring v1.0.1 // indirect
29+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
30+
github.com/syndtr/goleveldb v1.0.0 // indirect
31+
github.com/tidwall/gjson v1.18.0 // indirect
32+
github.com/tidwall/match v1.1.1 // indirect
33+
github.com/tidwall/pretty v1.2.0 // indirect
1434
github.com/zalando/go-keyring v0.2.7 // indirect
1535
golang.org/x/crypto v0.48.0 // indirect
1636
golang.org/x/net v0.50.0 // indirect
37+
golang.org/x/sync v0.19.0 // indirect
1738
golang.org/x/sys v0.41.0 // indirect
39+
golang.org/x/term v0.40.0 // indirect
1840
golang.org/x/text v0.34.0 // indirect
1941
gopkg.in/ini.v1 v1.67.1 // indirect
42+
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
43+
modernc.org/libc v1.55.3 // indirect
44+
modernc.org/mathutil v1.6.0 // indirect
45+
modernc.org/memory v1.8.0 // indirect
46+
modernc.org/sqlite v1.31.1 // indirect
47+
modernc.org/strutil v1.2.0 // indirect
48+
modernc.org/token v1.1.0 // indirect
2049
)

go.sum

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,56 @@ github.com/browserutils/sqlite3 v0.0.2/go.mod h1:3i7CY1ba3/D+qovGRJyCgfDnu/lGc8s
77
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
88
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
99
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10+
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
11+
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
12+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
13+
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
1014
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
1115
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
16+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
17+
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
18+
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
1219
github.com/gonuts/binary v0.2.0 h1:caITwMWAoQWlL0RNvv2lTU/AHqAJlVuu6nZmNgfbKW4=
1320
github.com/gonuts/binary v0.2.0/go.mod h1:kM+CtBrCGDSKdv8WXTuCUsw+loiy8f/QEI8YCCC0M/E=
21+
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
22+
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
23+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
24+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
25+
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
26+
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
27+
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
28+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
1429
github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU=
1530
github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k=
31+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
32+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
33+
github.com/moond4rk/binarycookies v1.0.3 h1:MRi8GkMKjIoyxdCSCgm4k+gBYA2fYxl1GZc04kQi3G0=
34+
github.com/moond4rk/binarycookies v1.0.3/go.mod h1:iAJr8L7ZgzTKaZhzEZmzjuOFnAoIHaqHFzvn58h1b7c=
35+
github.com/moond4rk/hackbrowserdata v1.1.1-0.20260817023946-adfb6d993ef8 h1:Rf97YHCUy/8o3AoWj1FkIs0OVbLL7ZxubK0+mMHJLk4=
36+
github.com/moond4rk/hackbrowserdata v1.1.1-0.20260817023946-adfb6d993ef8/go.mod h1:TyD/hVTU/KBUqsz0FXvv1ZopW4/Q4CSMPmEx4lvikk0=
37+
github.com/moond4rk/keychainbreaker v0.2.6 h1:pji+mNKwNndR3wcq5Wu4fJO7lSro3fHpycLbohoOeOc=
38+
github.com/moond4rk/keychainbreaker v0.2.6/go.mod h1:VVx2VXwL2EGhuU2WBD67w66JCKKqLFXGJg91y3FY4f0=
39+
github.com/moond4rk/plist v1.2.2 h1:o1yyy2GTkh/+zSslWqK+/M7Z4dMRzTBCBSXnUgwLLw4=
40+
github.com/moond4rk/plist v1.2.2/go.mod h1:/1FduRi9JULFEUYcXvW88vOwHgOiEH+YNtvtmdh6GOs=
41+
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
42+
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
43+
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
44+
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
45+
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
46+
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
47+
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
48+
github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8=
49+
github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I=
50+
github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
51+
github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
1652
github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY=
1753
github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4=
1854
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1955
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
56+
github.com/ppacher/go-dbus-keyring v1.0.1 h1:dM4dMfP5w9MxY+foFHCQiN7izEGpFdKr3tZeMGmvqD0=
57+
github.com/ppacher/go-dbus-keyring v1.0.1/go.mod h1:JEmkRwBVPBFkOHedAsoZALWmhNJxR/R/ykkFpbEHtGE=
58+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
59+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
2060
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
2161
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
2262
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -27,19 +67,72 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
2767
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
2868
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
2969
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
70+
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
71+
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
72+
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
73+
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
74+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
75+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
76+
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
77+
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
3078
github.com/zalando/go-keyring v0.2.7 h1:YbqBw40+g4g69UNk4WsRM/fV9YErfVWwozE2+7Bn+7g=
3179
github.com/zalando/go-keyring v0.2.7/go.mod h1:tsMo+VpRq5NGyKfxoBVjCuMrG47yj8cmakZDO5QGii0=
3280
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
3381
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
82+
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
83+
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
84+
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
3485
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
3586
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
87+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
88+
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
89+
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
90+
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
91+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3692
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
3793
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
94+
golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=
95+
golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM=
96+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
3897
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
3998
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
99+
golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
100+
golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
40101
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
102+
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
103+
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
41104
gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=
42105
gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss=
106+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
107+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
108+
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
109+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
43110
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
44111
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
45112
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
113+
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
114+
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
115+
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
116+
modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s=
117+
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
118+
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
119+
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
120+
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
121+
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
122+
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
123+
modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
124+
modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
125+
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
126+
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
127+
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
128+
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
129+
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
130+
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
131+
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
132+
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
133+
modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs=
134+
modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA=
135+
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
136+
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
137+
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
138+
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

0 commit comments

Comments
 (0)