An invite link that had expired, been used or been taken back still showed "You are invited as you", the key box and a greyed join button above the refusal. Now the page keeps its heading and the refusal only.
- commit
- 57b0493496c24455406cb386d8bbd697ab1dab6f
- parent
- 81d803a9b9d79d8d9c7ab0cea86a0ed6fec7db19
- author
- cat <admin@dev.site>
- ci
- ✓ passed in 82s, signed by cat
- kind
- fix risk score 1.3 of 3, Jev's estimate
- review
- #19 A dead invite link says so, without the form
ci attestation
forge-attestation 1 type ci commit 57b0493496c24455406cb386d8bbd697ab1dab6f tree 4af24fa46b224e515ca74d4408829e9973ce0ecc script .forge/ci 2dbcda6e044dc4b05503abde8369e2528413d3c7 result pass exit 0 started 2026-10-19T04:18:29Z duration 82s runner (not shown here; refs/notes/ci has it) system Darwin 25.5.0 arm64 env host log sha256:022a78479c7be83853f0580179f09f4091468aba6f8a793f11940064ba725843 274 lines |pushed wip/i18n |eb30de7 running .forge/ci: greet.sh: say what it is | | sh: /bin/sh | | ok greet |eb30de7 pass in 0s, signed |pushed main |remote: review #4: /dami/greet/reviews/4/ |pushed wip/i18n |9a46b9e running .forge/ci: wave at the world | | sh: /bin/sh | | FAIL greet : got 'hello, world o/', want 'hello, world' |9a46b9e fail in 0s, signed |forge: 1 commit(s) did not pass |remote: review #6: /dami/greet/reviews/6/ |pushed ana/wave |7ed4ca4 running .forge/ci: update the test for the wave | | sh: /bin/sh | | ok greet |7ed4ca4 pass in 0s, signed |remote: review #6: /dami/greet/reviews/6/ |pushed ana/wave |warning: You appear to have cloned an empty repository. |site home: deployed 34406e7 -> /sites/ana/dotfiles/home/ |created ana/notes |remote: review #1: /ana/notes/reviews/1/ |pushed ana/todo |landing #1 A todo list: ana/todo -> main |6948c3a running .forge/ci: web, server and Python versions of greet | | sh: /bin/sh | | ok greet |6948c3a pass in 0s, signed |pushed main |2871b40 running .forge/ci: messages: notes for the later regions | | sh: /bin/sh | | ok greet |2871b40 pass in 0s, signed |remote: review #7: /dami/greet/reviews/7/ |pushed dami/regions |created dami/forge |warning: You appear to have cloned an empty repository. |site guide: mkdir -p guide/fonts && cp site/assets/fonts/*.woff2 guide/fonts/ |site guide: deployed 719405c -> /sites/dami/forge/guide/ |(node:59561) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built ana/dotfiles in 0s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.MNiY6a/wt/demo/root/.forge/www |(node:59688) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built ana/notes in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.MNiY6a/wt/demo/root/.forge/www |(node:59828) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built dami/forge in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.MNiY6a/wt/demo/root/.forge/www |(node:60170) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built dami/greet in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.MNiY6a/wt/demo/root/.forge/www |(node:61021) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built - in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.MNiY6a/wt/demo/root/.forge/www |234 of 234 pages render the same without 11ty |guide: 8 files, links ok |ok
Signature: good, cat
| M | site/ | 2 | ++ |
| M | site/ | 6 | +++++- |
@@ -38,10 +38,12 @@
3838 </div>3939 <div id="invite-part" hidden>4040 <h1>Join {{ host }}</h1>41+<div id="invite-form">4142 <p>You are invited as <b id="invite-user">you</b><span id="invite-grant"></span>. Your SSH key is how you get in: paste the public half, the one line of a <code>.pub</code> file such as <code>~/.ssh/id_ed25519.pub</code>. None yet? <code>ssh-keygen -t ed25519</code> makes one.</p>4243 <p>{{ ui.textarea('ssh public key', 'ssh-ed25519 AAAA... you@laptop', 'id="invite-key" rows="3" spellcheck="false" autocomplete="off" autocapitalize="off" maxlength="8192"', true) }}</p>4344 <p>{{ ui.button('join', true, 'id="invite-join"') }}</p>4445 </div>46+</div>4547 <div id="enroll-part" hidden>4648 <h1>Add a passkey</h1>4749 <p id="joined" hidden>You are <b id="joined-user">in</b> on {{ host }}: <code>ssh {{ forge.config.ssh }} help</code> says what you can do over ssh. A passkey signs you in on the web as well, to see the pages of private repos you may read. Your browser, phone or password manager keeps it. Not now? <code>ssh {{ forge.config.ssh }} passkey</code> prints a link for one later.</p>@@ -128,7 +128,11 @@ interface WebAuthn {
128128 if (o.repo) document.getElementById('invite-grant')!.textContent = `, a ${String(o.role)} of ${String(o.repo)}`;129129 join.disabled = false;130130 key.focus();131- }, (e: Error) => say(e.message, true));131+ }, (e: Error) => {132+ // A dead link: nothing to fill in.133+ document.getElementById('invite-form')!.hidden = true;134+ say(e.message, true);135+ });132136 join.addEventListener('click', async () => {133137 join.disabled = true;134138 say('Adding your key…');