db: enforce foreign keys, and ship the licence package.json claims - #154
Merged
Conversation
Two things that were true on paper and not in fact. SQLite ignores every REFERENCES clause unless `PRAGMA foreign_keys = ON` is set, per connection, and nothing here ever set it. So the ON DELETE CASCADE on moshpit_names.user_id, moshpit_name_purchases.user_id, moshpit_name_pins.user_id and sessions.user_id have all been decorative: deleting a user left their names, purchases, published keys and sessions behind, pointing at a row that no longer exists. A published key outliving its owner is a key nobody can revoke. Set once at import and not awaited — every statement goes through the same client and libSQL serialises on the connection, so the PRAGMA is on the wire before anything that depends on it. A failure is logged rather than thrown: the app still works without it, it just enforces less. The risk in turning this on is old inserts that reference rows which do not exist, which would now fail rather than quietly succeed. 292 tests say there are none. package.json has claimed "license": "MIT" with no LICENSE file in the repo, so the claim was unenforceable and GitHub reported the project as all-rights- reserved. The file is moshcoding's verbatim, same copyright holder. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
vu1nz Security Review0 finding(s) in PR #? No security issues found. |
Merged
ralyodio
added a commit
that referenced
this pull request
Aug 1, 2026
install.sh resolves releases/latest, so the sixteen commits merged since v0.13.3 have been sitting on main unreachable — including a fix for a page that locks browsers up. The headline is the pit. /pit rendered every ending an account held and a form per name under each, with no bound on either: at 50 endings x 100 names that was 3.1 MiB of HTML and 36,082 DOM elements, and it managed to jam a browser with no script on the page at all (#167). It now draws a window and says what it is not drawing — 173 KiB, 1,926 elements — with a filter box over the top that takes `eggs` as a substring and `def*` as a glob, debounced against the API (#168). The namespace also stopped being the one part of the product a script could not touch: /api/moshpit/* now accepts the same API key /api/me and /api/sessions already did (#169), and /pit/dns finally documents the TronBrowser route for machines whose DNS is not theirs to change (#165). moshcode: foreign keys are enforced, and the licence package.json claims actually ships (#154) cli: help aliases exit 0 (#157), invalid integration commands fail (#160), `--` is honoured (#159), a BOM before a shebang no longer breaks (#158) skills: engines with no skills primitive are reported, not dropped (#166); `--name` requires a value (#156) mcp: an unsupported flag is rejected rather than registered as the server name (#164) pit: the namespace rules are vendored again with a drift test holding them to the published package (#161, #162, #163) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two things that were true on paper and not in fact.
Foreign keys were never enforced
SQLite ignores every
REFERENCESclause unlessPRAGMA foreign_keys = ONis set — per connection — and nothing here ever set it. So these have all been decorative:Deleting a user left their names, purchases, published keys and sessions behind, pointing at a row that no longer exists. A published key outliving its owner is a key nobody can revoke.
Verified against a real database — before: 1 name, 1 pin. After
DELETE FROM users: 0 and 0.Set once at import and not awaited: every statement goes through the same client and libSQL serialises on the connection, so the PRAGMA is on the wire before anything depending on it. A failure is logged rather than thrown — the app still works without it, it just enforces less.
The risk in turning this on is old inserts referencing rows that don't exist, which would now fail rather than quietly succeed. 292 tests say there are none.
The licence was claimed but not shipped
package.jsonhas said"license": "MIT"with no LICENSE file in the repo — so the claim was unenforceable and GitHub reported the project all-rights-reserved. The file ismoshcoding's verbatim, same copyright holder.🤖 Generated with Claude Code