mirror of
https://github.com/Twigpine/node.git
synced 2026-11-09 05:20:05 -10:00
Compare commits
base: Twigpine/node:fix/graphql-query-cost-bounds
Twigpine/node:main
Twigpine/node:chore/bootstrap-peer-moonwake-ledger
Twigpine/node:fix/durable-outbox-receive-pack
Twigpine/node:fix/secret-file-mode-at-create
Twigpine/node:fix/quickstart-no-ucan-failure
Twigpine/node:feat/upstream-mirror-worker
Twigpine/node:fix/task-read-visibility-gate
Twigpine/node:fix/issue-218-reconciliation-sweep-v2
Twigpine/node:fix/satisfies-threshold-tolerant-scan
Twigpine/node:release-please--branches--main--components--gitlawb-node
Twigpine/node:fix/graphql-query-cost-bounds
Twigpine/node:fix/claim-task-assignee-integrity
Twigpine/node:fix/issue-26-split-3-cert-compat
Twigpine/node:fix/issue-370-view-url-404
Twigpine/node:fix/357-gl-doctor-exit-status
Twigpine/node:recreate-409-codex-fix-federated-response-bounds
Twigpine/node:fix/issue-358-check-created-overflow
Twigpine/node:recreate-410-codex/fix-identify-address-bounds
Twigpine/node:bug_fix_2
Twigpine/node:fix/issue-496-create-task-repo-gate
Twigpine/node:fix/issue-509-cert-threshold-did-canonical
Twigpine/node:recreate-376-fix-git-clone-positional-delimiter
Twigpine/node:codex/b1a-mirror-persistence
Twigpine/node:fix/issue-26-split-4-config-policy
Twigpine/node:fix/350-timestamp-slice-panics
Twigpine/node:fix/360-attest-didkey-bound
Twigpine/node:fix/227-icaptcha-insecure-parse
Twigpine/node:fix/verify-all-lenient-require-all
Twigpine/node:fix/344-remove-label-canonicalization
Twigpine/node:fix/341-bounty-mutation-gates
Twigpine/node:fix/node-add-response-missing-hash
Twigpine/node:fix/477-bounty-stats-visibility
Twigpine/node:fix/234-release-publish-environment-gate
Twigpine/node:fix/issue-26-split-2-arweave-transport
Twigpine/node:fix/issue-398-hex-sha-validation
Twigpine/node:fix/issue-417-nonutf8-mirror-path
Twigpine/node:fix/issue-338-public-read-messaging
Twigpine/node:fix/issue-369-delete-push-hang
Twigpine/node:fix/triage-detect-namespaced-test-attrs
Twigpine/node:fix/issue-345-icaptcha-stdin-overflow
Twigpine/node:fix/list-refs-canonical-slug
Twigpine/node:fix/issue-435-replica-visibility
Twigpine/node:fix/issue-419-recipient-scan-cap
Twigpine/node:fix/graphql-mutation-fence
Twigpine/node:fix/issue-123-client-read-status-check
Twigpine/node:fix/fork-repo-path-validation
Twigpine/node:fix/bound-preauth-signature-body
Twigpine/node:fix/reject-small-order-ed25519-keys
Twigpine/node:fix/gossip-replay-bound
Twigpine/node:ci/targeted-pr-checks
Twigpine/node:fix/issue-413-gl-scheme-check
Twigpine/node:fix/issue-426-issue-read-errors
Twigpine/node:fix/issue-400-silent-empty-results
Twigpine/node:feat/real-node-deny-harness
Twigpine/node:feat/ucan-push-authorization
Twigpine/node:fix/helper-refuses-plaintext-remote-node
Twigpine/node:fix/doctor-probes-transport-node
Twigpine/node:fix/issue-115-sign-gated-reads
Twigpine/node:feat/commit-status-surface
Twigpine/node:feat/storage-abstraction
Twigpine/node:test/replay-guards-253
Twigpine/node:285
Twigpine/node:pr-219
Twigpine/node:fix/h2-unbounded-data-frames
Twigpine/node:fix/p2p-key-ownership
Twigpine/node:fix/sweep-sourceless-legacy-pins
Twigpine/node:fix/peers-ledger-248-writers
Twigpine/node:fix/issue-117-multiround-fetch-deadlock
Twigpine/node:fix/icaptcha-insecure-seam-coverage
Twigpine/node:backup/173-unpushed
Twigpine/node:feat/write-sink-brake-coverage
Twigpine/node:feat/repos-search-sort
Twigpine/node:infra-fly-node-configs
Twigpine/node:feat/admin-purge-spam
Twigpine/node:chore/bootstrap-seed-gitlawb-nodes
Twigpine/node:fix/zeroize-seed-bytes
Twigpine/node:infra-node3-fly
Twigpine/node:fix/path-traversal-codeql-4
..
compare: Twigpine/node:main
Twigpine/node:chore/bootstrap-peer-moonwake-ledger
Twigpine/node:fix/durable-outbox-receive-pack
Twigpine/node:fix/secret-file-mode-at-create
Twigpine/node:fix/quickstart-no-ucan-failure
Twigpine/node:feat/upstream-mirror-worker
Twigpine/node:fix/task-read-visibility-gate
Twigpine/node:fix/issue-218-reconciliation-sweep-v2
Twigpine/node:fix/satisfies-threshold-tolerant-scan
Twigpine/node:release-please--branches--main--components--gitlawb-node
Twigpine/node:main
Twigpine/node:fix/graphql-query-cost-bounds
Twigpine/node:fix/claim-task-assignee-integrity
Twigpine/node:fix/issue-26-split-3-cert-compat
Twigpine/node:fix/issue-370-view-url-404
Twigpine/node:fix/357-gl-doctor-exit-status
Twigpine/node:recreate-409-codex-fix-federated-response-bounds
Twigpine/node:fix/issue-358-check-created-overflow
Twigpine/node:recreate-410-codex/fix-identify-address-bounds
Twigpine/node:bug_fix_2
Twigpine/node:fix/issue-496-create-task-repo-gate
Twigpine/node:fix/issue-509-cert-threshold-did-canonical
Twigpine/node:recreate-376-fix-git-clone-positional-delimiter
Twigpine/node:codex/b1a-mirror-persistence
Twigpine/node:fix/issue-26-split-4-config-policy
Twigpine/node:fix/350-timestamp-slice-panics
Twigpine/node:fix/360-attest-didkey-bound
Twigpine/node:fix/227-icaptcha-insecure-parse
Twigpine/node:fix/verify-all-lenient-require-all
Twigpine/node:fix/344-remove-label-canonicalization
Twigpine/node:fix/341-bounty-mutation-gates
Twigpine/node:fix/node-add-response-missing-hash
Twigpine/node:fix/477-bounty-stats-visibility
Twigpine/node:fix/234-release-publish-environment-gate
Twigpine/node:fix/issue-26-split-2-arweave-transport
Twigpine/node:fix/issue-398-hex-sha-validation
Twigpine/node:fix/issue-417-nonutf8-mirror-path
Twigpine/node:fix/issue-338-public-read-messaging
Twigpine/node:fix/issue-369-delete-push-hang
Twigpine/node:fix/triage-detect-namespaced-test-attrs
Twigpine/node:fix/issue-345-icaptcha-stdin-overflow
Twigpine/node:fix/list-refs-canonical-slug
Twigpine/node:fix/issue-435-replica-visibility
Twigpine/node:fix/issue-419-recipient-scan-cap
Twigpine/node:fix/graphql-mutation-fence
Twigpine/node:fix/issue-123-client-read-status-check
Twigpine/node:fix/fork-repo-path-validation
Twigpine/node:fix/bound-preauth-signature-body
Twigpine/node:fix/reject-small-order-ed25519-keys
Twigpine/node:fix/gossip-replay-bound
Twigpine/node:ci/targeted-pr-checks
Twigpine/node:fix/issue-413-gl-scheme-check
Twigpine/node:fix/issue-426-issue-read-errors
Twigpine/node:fix/issue-400-silent-empty-results
Twigpine/node:feat/real-node-deny-harness
Twigpine/node:feat/ucan-push-authorization
Twigpine/node:fix/helper-refuses-plaintext-remote-node
Twigpine/node:fix/doctor-probes-transport-node
Twigpine/node:fix/issue-115-sign-gated-reads
Twigpine/node:feat/commit-status-surface
Twigpine/node:feat/storage-abstraction
Twigpine/node:test/replay-guards-253
Twigpine/node:285
Twigpine/node:pr-219
Twigpine/node:fix/h2-unbounded-data-frames
Twigpine/node:fix/p2p-key-ownership
Twigpine/node:fix/sweep-sourceless-legacy-pins
Twigpine/node:fix/peers-ledger-248-writers
Twigpine/node:fix/issue-117-multiround-fetch-deadlock
Twigpine/node:fix/icaptcha-insecure-seam-coverage
Twigpine/node:backup/173-unpushed
Twigpine/node:feat/write-sink-brake-coverage
Twigpine/node:feat/repos-search-sort
Twigpine/node:infra-fly-node-configs
Twigpine/node:feat/admin-purge-spam
Twigpine/node:chore/bootstrap-seed-gitlawb-nodes
Twigpine/node:fix/zeroize-seed-bytes
Twigpine/node:infra-node3-fly
Twigpine/node:fix/path-traversal-codeql-4
1
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
c805e35f40 |
fix(node): bound GraphQL query cost (#552)
* fix(node): bound GraphQL query cost * fix(node)!: bound repo names so emitted cursors always parse The reposPage cursor embeds base64(JSON(owner_did, name)) while parse_repo_cursor rejects cursors over 4096 bytes, but repo names were unbounded on every write path. A single long-named visible repo made the server emit an endCursor it then rejected as "invalid repository cursor", dead-ending pagination for every caller past that row. Bound names to MAX_REPO_NAME_LEN (100 bytes) at the create_repo and fork_repo handlers via a shared validate_repo_name helper (bad charset is still a 400), and reject overlong peer-supplied names in Db::upsert_mirror_repo (the sync caller already drops the error and skips the mirror). Also in this round: - docs/graphql-pagination.md states the 200 page-size maximum and corrects the over-budget remedy: a smaller limit does not reduce the reposPage or repos price, which is charged at the full MAX_VISIBLE_REPO_PAGE_SIZE scan regardless of limit. - Tests pin refUpdates(limit: -1) clamping to zero rows, the parse_repo_cursor wrong-shape-JSON arm with its exact "invalid repository cursor" message, the longest-admissible-name cursor round-trip, and the mirror write-path rejection. BREAKING CHANGE: the GraphQL `repos` field now returns an error instead of the full list when more than MAX_VISIBLE_REPO_PAGE_SIZE (200) repositories are visible; larger lists must use `reposPage` with `limit`/`after`. Repository names are additionally limited to 100 bytes at creation, fork, and mirror-registration time. * fix(node): address beardthelion P3 findings on name bound and input messages - Assert each rejection's own message in the reposPage invalid-inputs loop: the loop no longer accepts either message for every query, so a misattributed message (limit arm returning the cursor message) goes red. - Pin the create/fork name-bound wiring through the handler: new test drives create_repo with an overlong name via test_state_lazy and asserts the 400; deleting the validate_repo_name call site would proceed to the lazy DB pool and fail with a connection error instead. - Document the API-side vs disk-side validate_repo_name divergence on the new function, and tie the store's literal 100 to MAX_REPO_NAME_LEN so the two validators cannot drift apart on length. --------- Co-authored-by: Marlowe <[email protected]> Co-authored-by: cairn-intern <[email protected]> |