Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
7ad2871
Keep the save sparkle on the button instead of in the gap beside it
codeGlaze Sep 8, 2026
504c45d
Drop a str around a string literal in the callout ring
codeGlaze Sep 10, 2026
d17ea6b
Heal a reloaded character too, and announce the heal after navigating
codeGlaze Sep 10, 2026
f0e267d
Save a character repaired on refresh back to the builder's draft
codeGlaze Sep 12, 2026
47f6e88
Take entries set aside on load out of the library copy too
codeGlaze Sep 12, 2026
0db360e
Export a source as the library holds it, not as a link remembered it
codeGlaze Sep 12, 2026
117af07
Mend the shapes damaged homebrew actually takes, and set aside the rest
codeGlaze Sep 12, 2026
71e3758
Repair damaged homebrew on import and on load, and say what was repaired
codeGlaze Sep 12, 2026
246d3ef
Show a partial import as a warning, with each line marked
codeGlaze Sep 12, 2026
5ae5bbb
Name a nameless item in the missing-fields dialog
codeGlaze Sep 12, 2026
74d8b24
Keep the import-log button off the page until there is a log, and und…
codeGlaze Sep 12, 2026
47d3ed8
Give the browser probes one way to find Chromium, and skip when there…
codeGlaze Sep 12, 2026
4ac618e
Load a library stored as text, and set aside one that isn't a library…
codeGlaze Sep 12, 2026
155abb4
Save a selection anyway under a key the next load keeps
codeGlaze Sep 12, 2026
544cd34
Store renames chosen for existing items even when nothing incoming is…
codeGlaze Sep 12, 2026
c275c10
Check that every fix path is saved, survives a reload and reaches the…
codeGlaze Sep 12, 2026
d490bd6
Record this branch's hotfixes in the branch changelog
codeGlaze Sep 12, 2026
c79a28e
Skip an entry that isn't a map instead of crashing the import
codeGlaze Sep 12, 2026
34472ae
Give an entry with no source the name of the source it sits in
codeGlaze Sep 12, 2026
4a14280
Record the source-name and non-map import fixes in the branch changelog
codeGlaze Sep 12, 2026
ae80c93
Keep the app starting when stored homebrew can't be sorted
codeGlaze Sep 12, 2026
7bcf6cf
Record the startup fix in the branch changelog
codeGlaze Sep 12, 2026
d1c234e
Repair broken keys and card lists in homebrew, and stop import and ex…
codeGlaze Sep 12, 2026
986c25a
Keep bad homebrew from stopping startup or a page, and set aside what…
codeGlaze Sep 13, 2026
55d8035
Record the homebrew safety net in the branch changelog
codeGlaze Sep 13, 2026
52e3890
Merge origin/integration (homebrew save keys) into integration-local
codeGlaze Sep 13, 2026
a31d656
Merge origin/integration (#669 filtered lists, changelog fold) into i…
codeGlaze Sep 13, 2026
a53520e
Send the auth token from the character problem report again
codeGlaze Sep 13, 2026
65a3136
Drop the requires equipment_subs no longer uses
codeGlaze Sep 13, 2026
3f1792e
Keep the #669 comments to what a reader needs
codeGlaze Sep 13, 2026
8101135
Say what a share link does carry for custom items
codeGlaze Sep 13, 2026
de0031c
Remove the #669 investigation log
codeGlaze Sep 13, 2026
917f668
Stop the config report shadowing var, get and integer?
codeGlaze Sep 14, 2026
530312b
Drop the unused PDDocument import from pdf.clj
codeGlaze Sep 14, 2026
362bc01
Refer only what two test namespaces use
codeGlaze Sep 14, 2026
ffa050e
Log out when the server rejects the token a loader sent
codeGlaze Sep 14, 2026
852bc8f
Leave item ids and owners out of share links
codeGlaze Sep 14, 2026
904f7be
Answer item reads for the owner only, and never show an owner's email
codeGlaze Sep 14, 2026
5c79b36
Pin that saving an item from the builder loses nothing
codeGlaze Sep 14, 2026
f9f50e5
Send API calls and PDF downloads to the server that served the page
codeGlaze Sep 14, 2026
60adac5
Name the e2e suites, and let run.sh run any of them on any machine
codeGlaze Sep 14, 2026
397aea6
Load a character's custom items from the server with the character
codeGlaze Sep 14, 2026
c3f656c
Check in a browser that a character shows its owner's items to others
codeGlaze Sep 14, 2026
4032396
Record today's fixes in the branch changelog
codeGlaze Sep 14, 2026
0a3ebdb
A standing duplicate key no longer traps the item that owns it
codeGlaze Sep 14, 2026
3ece5ac
Share the character the share button belongs to
codeGlaze Sep 14, 2026
806d1a2
Strip pasted media out of shared homebrew
codeGlaze Sep 14, 2026
5ef7939
Short share links: the homebrew goes to the server encrypted
codeGlaze Sep 14, 2026
8afcd88
Record short share links and the share fixes in the branch changelog
codeGlaze Sep 14, 2026
c250df6
Check that the character list's Copy link shares the same character
codeGlaze Sep 14, 2026
dc0218f
Store share snapshots as bytes, with caps halved from measurement
codeGlaze Sep 14, 2026
5672303
New link revokes a character's share links; the same homebrew keeps i…
codeGlaze Sep 14, 2026
79b79f9
One share link per character that always shows its current homebrew
codeGlaze Sep 14, 2026
32f477f
Describe short share links as they now work in the branch changelog
codeGlaze Sep 14, 2026
0eda101
Store nothing for a character until its owner presses Share link
codeGlaze Sep 14, 2026
6df4f1e
Note Share link in the branch changelog's short share links entry
codeGlaze Sep 14, 2026
ca38b4f
Share the e2e suites' helpers in scripts/e2e/lib.js
codeGlaze Sep 14, 2026
c553256
Delete share links nobody has used for 180 days
codeGlaze Sep 14, 2026
f328ca6
Parties take only characters, and keep a shared character's homebrew
codeGlaze Sep 14, 2026
8ab7778
Record expiring share links and party changes in the branch changelog
codeGlaze Sep 14, 2026
4b17550
Only real use keeps a share link, and downtime does not count against it
codeGlaze Sep 14, 2026
0db3cd1
Say in the branch changelog what share link pruning deletes and what …
codeGlaze Sep 14, 2026
8b7e011
A share with no recorded use expires, and the prune window is at leas…
codeGlaze Sep 14, 2026
016296e
Note the 30-day minimum prune window in the branch changelog
codeGlaze Sep 14, 2026
124c1c6
Stop sharing, a note when a share link expires, and a project-wide he…
codeGlaze Sep 14, 2026
50ccee7
Neutral wording for share settings in the startup log, and What's New…
codeGlaze Sep 14, 2026
54815f3
Record Stop sharing, the expired-link note, the heartbeat and share w…
codeGlaze Sep 14, 2026
f6354d7
Font Awesome 5 names for icons that rendered blank
codeGlaze Sep 15, 2026
d108089
Delete the tokens parties saved for a character when its share ends
codeGlaze Sep 15, 2026
d108cd4
Call out a mistyped ORCPUB_SHARE_PRUNE_DAYS in the startup banner
codeGlaze Sep 15, 2026
6dbf916
Document the share link settings in ENVIRONMENT.md
codeGlaze Sep 15, 2026
bfc9922
Record the icon, party token, banner and settings fixes in the branch…
codeGlaze Sep 15, 2026
d2e0105
Phone layout: the expired-link note gets its own line, and list-row b…
codeGlaze Sep 15, 2026
38365ce
A character's sharing is one line under its title
codeGlaze Sep 15, 2026
adf1efd
Record the share line in the branch changelog
codeGlaze Sep 15, 2026
e388e24
The character list row shares with one Copy link button
codeGlaze Sep 15, 2026
099beac
Record the character list row's Copy link button in the branch changelog
codeGlaze Sep 15, 2026
c3988d9
Keep the phone header from crowding itself
codeGlaze Sep 17, 2026
887293f
Take the Garden class definitions off the stalled refactor branch
codeGlaze Sep 17, 2026
a104089
Put the registration and login pages on the harvested classes
codeGlaze Sep 17, 2026
e849651
Judge passwords by length and shape, not by character classes
codeGlaze Sep 18, 2026
09ac513
Refuse passwords the breach corpus already knows
codeGlaze Sep 18, 2026
4277660
Tell people the password is common, not that it was breached
codeGlaze Sep 19, 2026
8141839
Require clojure.string in the breach test rather than leaning on it b…
codeGlaze Sep 19, 2026
b0b63dd
Say too common, the way the strength meter would say it
codeGlaze Sep 19, 2026
e250f60
Cut the explanation to one line, and keep it out of the form
codeGlaze Sep 19, 2026
b578934
Drop the explanation string; it had nowhere to go
codeGlaze Sep 19, 2026
360709a
Consult the per-address throttle that login never asked
codeGlaze Sep 19, 2026
1d8d7be
Stop password reset from answering whether an address is registered
codeGlaze Sep 19, 2026
073d542
Warn an account holder when one account is tried from several places
codeGlaze Sep 19, 2026
18d1deb
Put a time and a browser in the sign-in notice
codeGlaze Sep 19, 2026
80121fc
Close the login oracle, cap the mail endpoints, raise the minimum to 12
codeGlaze Sep 19, 2026
729458e
Make the breach check auditable instead of silently fail-open
codeGlaze Sep 19, 2026
072786c
Keep only a digest of the reset key, and expire it in two hours
codeGlaze Sep 19, 2026
8788b76
Give the server's objections somewhere to appear, and cap registration
codeGlaze Sep 20, 2026
3134d97
Set the registration cap by the table it must not break
codeGlaze Sep 20, 2026
49b3700
Count what the limits turn away, so the numbers can be tuned
codeGlaze Sep 20, 2026
696a962
Close the separator hole, and actually raise the minimum this time
codeGlaze Sep 20, 2026
416a3dc
Tell one host hammering apart from a pool of them
codeGlaze Sep 20, 2026
29783af
Make the meter ask the validator instead of guessing alongside it
codeGlaze Sep 20, 2026
f9604b4
Write down what this branch raised and did not do
codeGlaze Sep 20, 2026
e68ac04
Serve the password-changed page
codeGlaze Sep 20, 2026
4f61d63
Stop the register form and a dead reset link looking broken
codeGlaze Sep 20, 2026
619af5e
Record the .lein-env clobbering that breaks a parallel e2e boot
codeGlaze Sep 20, 2026
64f927e
Open the auth redesign branch with the decisions it implements
codeGlaze Sep 20, 2026
e59bfa6
Give the shared message components a light ground
codeGlaze Sep 20, 2026
5a8d750
Build the notched auth field
codeGlaze Sep 20, 2026
7688a8a
Correct the shell claim, and write down the order of the rest
codeGlaze Sep 20, 2026
dab92f8
Move the heading into the shell, as ink with an amber rule
codeGlaze Sep 20, 2026
4ed59b1
Stop a margin utility from making 194 places bold
codeGlaze Sep 20, 2026
8ee1dd8
Summarise what is wrong above the form, and fix the tail
codeGlaze Sep 20, 2026
93faf38
Confirm the password, until you can read it
codeGlaze Sep 20, 2026
0a64172
Offer a correction when the email domain looks mistyped
codeGlaze Sep 20, 2026
f1c0c46
Record progress, the measured blast radius, and where the record lives
codeGlaze Sep 20, 2026
f81f926
Merge refactor/garden-harvest: the harvested Garden classes and the p…
codeGlaze Sep 20, 2026
e57983c
Merge integration-local: resolve the auth pages against the harvested…
codeGlaze Sep 20, 2026
1cf2558
Refuse a password for the corpus only when it is egregiously common
codeGlaze Sep 20, 2026
d5feb65
Sweep the auth pages: the doubled legal links, the one-word link, the…
codeGlaze Sep 20, 2026
189170b
Record the sweep, and put the phone gutters back where they belong
codeGlaze Sep 20, 2026
ef217ae
Merge feature/auth-redesign: the password rules, the breach screening…
codeGlaze Sep 20, 2026
70ef02f
Merge feature/mobile-layout: the share line and the phone-width fixes
codeGlaze Sep 20, 2026
82ea472
Put the last three auth pages on the shared heading
codeGlaze Sep 20, 2026
0dd4545
Password reset told nobody why it would not go
codeGlaze Sep 20, 2026
05bac5e
Give the reset page the meter and the reveal it always should have had
codeGlaze Sep 21, 2026
991e5ff
Carry the server's reason to the page, and cover these flows for the …
codeGlaze Sep 21, 2026
b50602f
The corpus verdict belongs to the meter, and the card's text was set …
codeGlaze Sep 21, 2026
d7ff070
Cover the limits, document the new variables, and correct a stale note
codeGlaze Sep 21, 2026
4275637
Build the rule chips and the rung tips that were designed with the meter
codeGlaze Sep 21, 2026
9396bef
Give the outcome pages a layout, and group the login page's other way…
codeGlaze Sep 21, 2026
55cb4d4
Share the body of the auth pages, not just the shell
codeGlaze Sep 21, 2026
5334fc7
Share the password-making area between the two places a password is made
codeGlaze Sep 22, 2026
d071972
Write down what the reset page's identifier check knows, and why
codeGlaze Sep 22, 2026
5142b5b
Tell people when their credentials change, and take a password to mov…
codeGlaze Sep 23, 2026
c9de41d
A password reset takes back the sessions that existed before it
codeGlaze Sep 24, 2026
3c4b147
Sign out everywhere, from the account page
codeGlaze Sep 24, 2026
1efe5b9
Route api-subs through http-safe, and stop a stale login from landing
codeGlaze Sep 24, 2026
7f61dd9
Bound the image-probe endpoint: concurrency slots and a per-host limit
codeGlaze Sep 24, 2026
d679cc5
Keep the homebrew boot-rescue's storage call inside its own catch
codeGlaze Sep 24, 2026
678af04
cljs-harness: find Chrome through the shared lib, not a private copy
codeGlaze Sep 24, 2026
ae639e3
Make the debounce test's second-change case test what it says
codeGlaze Sep 24, 2026
9dc00a0
ATTRIBUTION: fix the vendored-icon count to match the table
codeGlaze Sep 24, 2026
1f8b084
What's New close control: a real button, keyboard-reachable
codeGlaze Sep 24, 2026
7c5745c
Revert the debounce test rewrite: it was timing-flaky
codeGlaze Sep 24, 2026
dda789e
Drive the debounce test's second change with a fake clock, not real time
codeGlaze Sep 24, 2026
29cb0e3
system: start token withdrawals before the server takes traffic
codeGlaze Sep 24, 2026
57d0c7c
cljs-harness: exit nonzero unless a clean summary was seen
codeGlaze Sep 24, 2026
530837f
security: an hourly refresh no longer drops a withdrawal noted since …
codeGlaze Sep 25, 2026
9180633
registration: judge a password as it is stored, trimmed
codeGlaze Sep 25, 2026
aab7470
relocate-content: a renaming move takes its subclasses and subraces a…
codeGlaze Sep 25, 2026
3dd4fd3
branch-changelog: the three Greptile fixes
codeGlaze Sep 25, 2026
8f48107
relocate-content: move classes and races before what points at them
codeGlaze Sep 25, 2026
fd17e7e
branch-changelog: bulk move ordering
codeGlaze Sep 25, 2026
f7c8cf6
test: probe every homebrew link under a rename, and that each is read
codeGlaze Sep 26, 2026
89a3112
test: what the player gets when a clash rename strands a link
codeGlaze Sep 26, 2026
1c7a58e
Merge remote-tracking branch 'origin/fix/duplicate-key-traps-its-owne…
codeGlaze Sep 26, 2026
0118048
Merge feat/source-tagged-keys into integration-local
codeGlaze Sep 26, 2026
6509880
lifecycle test: refer testing, and stop shadowing the k helper
codeGlaze Sep 27, 2026
65502f3
Revert the duplicate-key-traps-its-owner merge; its gating is owned e…
codeGlaze Sep 27, 2026
1454d75
branch-changelog: source-tagged keys, and why the gating was reverted
codeGlaze Sep 27, 2026
be6e450
Merge integration into the accounts branch
codeGlaze Oct 1, 2026
d499fce
comments: bring the accounts batch to the comment rule
codeGlaze Oct 1, 2026
1ba165b
Set broken homebrew aside through the library gate
codeGlaze Oct 1, 2026
0fc99f4
Build the template when a character is opened, so its heal lands then
codeGlaze Oct 2, 2026
c4ac4e2
Build the template under the spinner on a page that shows a character
codeGlaze Oct 2, 2026
4f7be0f
run.sh: watch the folders the bundle is built from, read from its config
codeGlaze Oct 2, 2026
15cb621
Loading spinner: a spiral, a d20 or a spell circle, at random
codeGlaze Oct 2, 2026
50df44b
Merge the accounts batch (integration-local) into integration
codeGlaze Oct 4, 2026
f8f270d
A reset link is a one-time permission to set a password, not a sign-in
codeGlaze Oct 4, 2026
f432865
Fold the integration-local changelog into Summer Patch
codeGlaze Oct 4, 2026
78bfa40
Browser suites from accounts: tag what reads internals, isolate the s…
codeGlaze Oct 4, 2026
50a316d
Merge integration (#47, picks namespace and lint cleanup) into merge/…
codeGlaze Oct 4, 2026
d130124
CHANGELOG: point the accounts entries at the rewritten commits
codeGlaze Oct 4, 2026
2a0ba10
Close the four races and gaps Greptile found in the accounts code
codeGlaze Oct 4, 2026
a540198
run-all.sh: the lock is released when the run ends
codeGlaze Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .clj-kondo/config.edn
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@
(orcpub.routes.folder-test/with-conn)
(orcpub.email-change-test/with-conn)
(orcpub.registration-rollback-test/with-conn)
(orcpub.routes.public-reads-test/with-conn)
(orcpub.routes.item-save-test/with-conn)
(orcpub.routes.share-test/with-conn)
(orcpub.routes.party-test/with-conn)
(orcpub.heartbeat-test/with-conn)
(user/with-db)]}}
;; native/cljs and web/cljs are separate source roots; kondo doesn't know
;; about them so ns names appear to mismatch their file paths.
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ deploy/homebrew/*
branch-sync-plan.md
dev/test-accounts.edn

# E2E test artifacts
# E2E test artifacts. Unanchored, because a leading slash pins the pattern to the
# repo root: /node_modules/ and /e2e/node_modules/ both missed the real one at
# scripts/e2e/node_modules, and 179 files of it went into a commit.
node_modules/
/e2e/node_modules/
/scripts/e2e/node_modules
/e2e/playwright-report/
Expand Down
380 changes: 379 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

49 changes: 48 additions & 1 deletion dev/e2e_boot.clj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
(:require [com.stuartsierra.component :as component]
[datomic.api :as d]
[orcpub.system :as s]
[orcpub.routes :as routes]
[orcpub.entity.strict :as se]
[orcpub.dnd.e5.character :as char5e]
[user :as dev]))

(defn- item
Expand All @@ -24,8 +27,35 @@
:orcpub.dnd.e5.magic-items/rarity :rare
:orcpub.dnd.e5.magic-items/description (str nm " — seeded by e2e-boot.")})

(defn- fighter-carrying
"A level 1 fighter with one of its owner's custom items equipped, so a browser check can open a
character whose sheet needs an item from another account."
[character-name item-key]
{::se/summary {::char5e/character-name character-name
::char5e/classes [{::char5e/class-name "Fighter" ::char5e/level 1}]}
::se/selections [{::se/key :ability-scores
::se/option {::se/key :standard-scores
::se/map-value {::char5e/str 15 ::char5e/dex 14 ::char5e/con 13
::char5e/int 12 ::char5e/wis 10 ::char5e/cha 8}}}
{::se/key :class
::se/options [{::se/key :fighter
::se/selections [{::se/key :levels
::se/options [{::se/key :level-1}]}]}]}
{::se/key :other-magic-items
::se/options [{::se/key item-key}]}]})

(defn- knowing-language
"The same fighter, also knowing a homebrew language. The browser suite puts that language in the
owner's local library, which is where homebrew lives; the server never has it."
[character-name item-key language-key]
(update (fighter-carrying character-name item-key) ::se/selections conj
{::se/key :languages ::se/options [{::se/key language-key}]}))

(defn -main [& _]
(let [sys (component/start (s/system :dev))
;; The :dev system pins port 8890; run.sh passes E2E_PORT through as PORT.
(let [port (some-> (System/getenv "PORT") Integer/parseInt)
sys (component/start (cond-> (s/system :dev)
port (assoc-in [:service-map :io.pedestal.http/port] port)))
conn (get-in sys [:conn :conn])]
;; TWO accounts, each with its OWN items. One account cannot show isolation:
;; a bug that returned every user's items would look identical to correct
Expand All @@ -43,6 +73,23 @@
(item "kaylee" "Kaylee Seeded Beta")
(item "kaylee" "Kaylee Seeded Gamma")
(item "zoe" "Zoe Seeded Only")])
;; Printed so a check can open the character without logging in.
(let [{:keys [status body]} (routes/do-save-character (d/db conn) conn
(fighter-carrying "Bree Tinker" :kaylee-seeded-alpha)
{:user "kaylee"})]
(println "E2E-CHARACTER" status (:db/id body)))
(let [{:keys [status body]} (routes/do-save-character (d/db conn) conn
(knowing-language "Wren Holloway" :kaylee-seeded-beta :e2e-cant)
{:user "kaylee"})]
(println "E2E-HOMEBREW-CHARACTER" status (:db/id body)))
;; A character whose last share link expired, as prune! leaves it: a note of the character and the date.
;; Ten days ago, well inside the window, so the heartbeat's first prune keeps the note.
(let [{:keys [status body]} (routes/do-save-character (d/db conn) conn
(knowing-language "Ash Marlow" :kaylee-seeded-gamma :e2e-cant)
{:user "kaylee"})]
@(d/transact conn [{:orcpub.share-expiry/character (:db/id body)
:orcpub.share-expiry/on (java.util.Date. (- (System/currentTimeMillis) (* 10 24 60 60 1000)))}])
(println "E2E-EXPIRED-CHARACTER" status (:db/id body)))
(println "E2E-READY")
(flush)
@(promise)))
Loading
Loading