@snagset/server 0.1.16 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +9 -10
- package/dist/app.js +51 -47
- package/dist/app.js.map +1 -1
- package/dist/bin.js +31 -32
- package/dist/bin.js.map +1 -1
- package/dist/boot.js +21 -21
- package/dist/boot.js.map +1 -1
- package/dist/config.generated.js +5 -8
- package/dist/config.generated.js.map +1 -1
- package/dist/config.js +14 -14
- package/dist/config.js.map +1 -1
- package/dist/crypto.js +1 -1
- package/dist/crypto.js.map +1 -1
- package/dist/db/connect.js +1 -1
- package/dist/db/migrate.js +11 -11
- package/dist/db/migrations/0010_round_archive.sql +23 -0
- package/dist/db/rls.js +3 -3
- package/dist/db/rls.js.map +1 -1
- package/dist/domain.js +73 -5
- package/dist/domain.js.map +1 -1
- package/dist/explain.js +1 -1
- package/dist/instance/address.js +3 -3
- package/dist/instance/address.js.map +1 -1
- package/dist/instance/settings.js +1 -1
- package/dist/integrations/github.js +3 -3
- package/dist/integrations/github.js.map +1 -1
- package/dist/integrations/inbound.js +3 -3
- package/dist/integrations/inbound.js.map +1 -1
- package/dist/integrations/linear.js +1 -1
- package/dist/integrations/linear.js.map +1 -1
- package/dist/integrations/outbox.js +4 -4
- package/dist/integrations/outbox.js.map +1 -1
- package/dist/integrations/slack.js +2 -2
- package/dist/integrations/slack.js.map +1 -1
- package/dist/jobs/index.js +3 -3
- package/dist/jobs/reaper.js +11 -11
- package/dist/jobs/reaper.js.map +1 -1
- package/dist/jobs/set.js +3 -3
- package/dist/jobs/set.js.map +1 -1
- package/dist/jobs/soon.js +3 -3
- package/dist/keys.js +3 -3
- package/dist/keys.js.map +1 -1
- package/dist/listen.js +3 -3
- package/dist/listen.js.map +1 -1
- package/dist/mail/assigned.js +10 -10
- package/dist/mail/assigned.js.map +1 -1
- package/dist/mail/digest.js +3 -3
- package/dist/mail/digest.js.map +1 -1
- package/dist/mail/index.js +2 -2
- package/dist/mail/links.js +5 -5
- package/dist/mail/mailer.js +2 -2
- package/dist/mail/notify.js +22 -22
- package/dist/mail/notify.js.map +1 -1
- package/dist/mail/resend.js +1 -1
- package/dist/mail/resolve.js +1 -1
- package/dist/mail/resolve.js.map +1 -1
- package/dist/mail/smtp.js +1 -1
- package/dist/mail/unsubscribe.js +1 -1
- package/dist/net/publicFetch.js +1 -1
- package/dist/orgs.js +5 -5
- package/dist/orgs.js.map +1 -1
- package/dist/plan.js +1 -1
- package/dist/projects.js +4 -4
- package/dist/projects.js.map +1 -1
- package/dist/routes/account.js +1 -1
- package/dist/routes/account.js.map +1 -1
- package/dist/routes/activity.js +1 -1
- package/dist/routes/anchorReports.js +9 -9
- package/dist/routes/anchorReports.js.map +1 -1
- package/dist/routes/assignees.js +4 -4
- package/dist/routes/assignees.js.map +1 -1
- package/dist/routes/attachments.js +6 -6
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/auth.js +4 -4
- package/dist/routes/bodyLimit.js +5 -5
- package/dist/routes/bodyLimit.js.map +1 -1
- package/dist/routes/commentEdit.js +5 -5
- package/dist/routes/commentEdit.js.map +1 -1
- package/dist/routes/comments.js +24 -24
- package/dist/routes/comments.js.map +1 -1
- package/dist/routes/cors.js +33 -15
- package/dist/routes/cors.js.map +1 -1
- package/dist/routes/instance.js +3 -3
- package/dist/routes/instance.js.map +1 -1
- package/dist/routes/integrations.js +14 -11
- package/dist/routes/integrations.js.map +1 -1
- package/dist/routes/invites.js +7 -7
- package/dist/routes/invites.js.map +1 -1
- package/dist/routes/mcpAuth.js +13 -13
- package/dist/routes/mcpAuth.js.map +1 -1
- package/dist/routes/mcpToken.js +4 -4
- package/dist/routes/mcpToken.js.map +1 -1
- package/dist/routes/mcpTokens.js +27 -14
- package/dist/routes/mcpTokens.js.map +1 -1
- package/dist/routes/members.js +9 -5
- package/dist/routes/members.js.map +1 -1
- package/dist/routes/owner.js +13 -13
- package/dist/routes/owner.js.map +1 -1
- package/dist/routes/reviewLinks.js +4 -4
- package/dist/routes/reviewLinks.js.map +1 -1
- package/dist/routes/rounds.js +131 -38
- package/dist/routes/rounds.js.map +1 -1
- package/dist/routes/sessions.js +190 -73
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/sites.js +9 -9
- package/dist/routes/sites.js.map +1 -1
- package/dist/routes/threads.js +298 -141
- package/dist/routes/threads.js.map +1 -1
- package/dist/routes/widget.js +5 -5
- package/dist/routes/widget.js.map +1 -1
- package/dist/serverless.js +4 -4
- package/dist/serverless.js.map +1 -1
- package/dist/session.js +8 -8
- package/dist/session.js.map +1 -1
- package/dist/storage/bucket.js +4 -4
- package/dist/storage/bucket.js.map +1 -1
- package/dist/storage/settings.js +4 -4
- package/dist/storage/settings.js.map +1 -1
- package/dist/studioReviewers.js +4 -4
- package/dist/vendor/adapters/outbound/fence.js +2 -2
- package/dist/vendor/adapters/outbound/sanitise.js +14 -14
- package/dist/vendor/mcp/bin.js +4 -4
- package/dist/vendor/mcp/client.js +3 -3
- package/dist/vendor/mcp/server.js +3 -3
- package/dist/vendor/mcp/source.js +13 -13
- package/dist/vendor/mcp/view.js +15 -15
- package/dist/vendor/types/brief.js +2 -2
- package/dist/vendor/types/index.js +1 -1
- package/dist/vendor/types/names.js +20 -18
- package/dist/vendor/widget/object.js +3 -3
- package/dist/vendor/widget/predicates.js +38 -39
- package/package.json +1 -5
- package/static/dashboard/assets/{CompositeItem-DP7FLsIz.js → CompositeItem-wqcRki5s.js} +1 -1
- package/static/dashboard/assets/{ConfirmDialog-B-mNmk6U.js → ConfirmDialog-BqK5eJxB.js} +1 -1
- package/static/dashboard/assets/{CopyButton-bsaLPvqU.js → CopyButton-Cc4nF6JB.js} +1 -1
- package/static/dashboard/assets/{FieldItemContext-Cz9anwiZ.js → FieldItemContext-DVLVe_H8.js} +1 -1
- package/static/dashboard/assets/{InstallTag-DDMHFPFi.js → InstallTag-DCRj1B-Z.js} +1 -1
- package/static/dashboard/assets/{SaveState-rgq6rRHH.js → SaveState-B5TIvzLh.js} +1 -1
- package/static/dashboard/assets/{_app-B--Q2p1D.js → _app-BOhhOcC-.js} +1 -1
- package/static/dashboard/assets/{_app-C5aeP_jI.js → _app-DdvP8iZf.js} +1 -1
- package/static/dashboard/assets/{activity-CmpMwfWp.js → activity-CaCW3Nql.js} +1 -1
- package/static/dashboard/assets/{arrow-left-BN3lUG8m.js → arrow-left-B5Z7SkRz.js} +1 -1
- package/static/dashboard/assets/{avatar-4OkpxHzf.js → avatar-CFgdRtiV.js} +1 -1
- package/static/dashboard/assets/{badge-BGUQxxes.js → badge-BIVx2feC.js} +1 -1
- package/static/dashboard/assets/{card-BX32udhB.js → card-HwCaU_bv.js} +1 -1
- package/static/dashboard/assets/{check-DjkY9Lhe.js → check-CMqBU0e3.js} +1 -1
- package/static/dashboard/assets/{chevron-right-w26JMtvi.js → chevron-right-CY_sUg3i.js} +1 -1
- package/static/dashboard/assets/{copy-BtOpNPn3.js → copy-Cn6p0txj.js} +1 -1
- package/static/dashboard/assets/{dialog-Ca351GqX.js → dialog-_GPHTnXl.js} +2 -2
- package/static/dashboard/assets/{dropdown-menu-BdM8D0_i.js → dropdown-menu-BEcLmKR6.js} +1 -1
- package/static/dashboard/assets/{image-off-DBc5pfc8.js → image-off-CyXpcTZd.js} +1 -1
- package/static/dashboard/assets/{index-Bvmz5Xph.js → index-BZAfm4kX.js} +14 -14
- package/static/dashboard/assets/index-BzWDSuyB.css +1 -0
- package/static/dashboard/assets/{invite-b1vVPR4n.js → invite-iirWwB3z.js} +1 -1
- package/static/dashboard/assets/{label-CeHVAC98.js → label-C9GdL6JP.js} +1 -1
- package/static/dashboard/assets/{layout-grid-BJUJgcuD.js → layout-grid-3hfjyzci.js} +1 -1
- package/static/dashboard/assets/me-Bgw9jS9F.js +1 -0
- package/static/dashboard/assets/{parts-BU_5BLga.js → parts-BOtvDu_v.js} +1 -1
- package/static/dashboard/assets/{plus-DW3meZh8.js → plus-CTKInfcq.js} +1 -1
- package/static/dashboard/assets/s._site-Bi7roN7x.js +1 -0
- package/static/dashboard/assets/s._site.comments-DZBq2FkM.js +54 -0
- package/static/dashboard/assets/s._site.reviewers-YfizOkhz.js +1 -0
- package/static/dashboard/assets/s._site.settings-Dbua1pYa.js +1 -0
- package/static/dashboard/assets/{setup-B5fdtoM-.js → setup-4E2PxysX.js} +1 -1
- package/static/dashboard/assets/{sign-in-D9Bhw619.js → sign-in-Nda93fWo.js} +1 -1
- package/static/dashboard/assets/{sign-up-CK-LWLzn.js → sign-up-kWIqmM8W.js} +1 -1
- package/static/dashboard/assets/{sites-CLB6RzU6.js → sites-DbhDznKA.js} +1 -1
- package/static/dashboard/assets/studio-MNEmZ3n7.js +1 -0
- package/static/dashboard/assets/{studio-CVFUbJQb.js → studio-ml7KCROJ.js} +1 -1
- package/static/dashboard/assets/{studio.index-CUtMjh5_.js → studio.index-CZXgB0jx.js} +1 -1
- package/static/dashboard/assets/studio.integrations-OprNYBrJ.js +1 -0
- package/static/dashboard/assets/{studio.members-BcVrAT7r.js → studio.members-DT93LEwF.js} +1 -1
- package/static/dashboard/assets/{sun-BzCBfLxA.js → sun--lA9pLT9.js} +1 -1
- package/static/dashboard/assets/{switch-Djsy8JA6.js → switch-BCNx3nDC.js} +1 -1
- package/static/dashboard/assets/{table-Cnpowiv-.js → table-B1e35-OI.js} +1 -1
- package/static/dashboard/assets/{useAriaLabelledBy-D35XdVIh.js → useAriaLabelledBy-BLgC8mE_.js} +1 -1
- package/static/dashboard/assets/{useBaseQuery-DztMyAqa.js → useBaseQuery-CZkDX1tZ.js} +1 -1
- package/static/dashboard/assets/useQuery-C0BVsxqZ.js +1 -0
- package/static/dashboard/assets/useRender-P5Wj_Sbt.js +1 -0
- package/static/dashboard/assets/{useValueChanged-DY7n1sYE.js → useValueChanged-CCRl5Bf5.js} +1 -1
- package/static/dashboard/assets/{users-CR2o4PsB.js → users-DCeMsa2g.js} +1 -1
- package/static/dashboard/assets/{welcome-DJ_8xHTE.js → welcome-Il9zYmvM.js} +1 -1
- package/static/dashboard/assets/{widget-signin-BOulktuR.js → widget-signin-BLNsOS5K.js} +1 -1
- package/static/dashboard/assets/{you-DJGezimL.js → you-B2lWBXCD.js} +1 -1
- package/static/dashboard/assets/{zod-4RphBaVj.js → zod-DG4VLz0r.js} +1 -1
- package/static/dashboard/index.html +2 -2
- package/static/widget/snag.capture.js +1 -1
- package/static/widget/snag.dock.js +2 -2
- package/static/widget/snag.panels.js +2 -2
- package/static/widget/snag.runtime.js +2 -2
- package/static/dashboard/assets/index-DAgnfv_E.css +0 -1
- package/static/dashboard/assets/me-zNn3-t75.js +0 -1
- package/static/dashboard/assets/s._site-DP3hLlXp.js +0 -1
- package/static/dashboard/assets/s._site.comments-CyIqVrl3.js +0 -54
- package/static/dashboard/assets/s._site.reviewers-muaVzTtT.js +0 -1
- package/static/dashboard/assets/s._site.settings-Bow6VdXW.js +0 -1
- package/static/dashboard/assets/studio-CuiXjnSt.js +0 -1
- package/static/dashboard/assets/studio.integrations-CiQ83f7Q.js +0 -1
- package/static/dashboard/assets/useQuery-DCEPkmeo.js +0 -1
- package/static/dashboard/assets/useRender-C2NyqaXd.js +0 -1
package/dist/routes/sessions.js
CHANGED
|
@@ -6,6 +6,7 @@ import { mintSession, verifySession, withinRefreshWindow } from "../session.js";
|
|
|
6
6
|
import { inOrg } from "../db/scope.js";
|
|
7
7
|
import { studioReviewerId } from "../studioReviewers.js";
|
|
8
8
|
import { allowedOrigins, originPermitted } from "./cors.js";
|
|
9
|
+
import { sameSite } from "../domain.js";
|
|
9
10
|
function fail(c, status, code, message) {
|
|
10
11
|
return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
|
|
11
12
|
}
|
|
@@ -13,7 +14,7 @@ function fail(c, status, code, message) {
|
|
|
13
14
|
* hash is taken over the string that arrived on the wire, never a re-decode. */
|
|
14
15
|
const sha256 = (s) => createHash("sha256").update(s, "utf8").digest();
|
|
15
16
|
const mintSecret = () => randomBytes(32).toString("base64url");
|
|
16
|
-
/** `prj_…`/`rev_…` — the row id is bare, the wire form is prefixed
|
|
17
|
+
/** `prj_…`/`rev_…` — the row id is bare, the wire form is prefixed. */
|
|
17
18
|
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
18
19
|
function rowId(wire, prefix) {
|
|
19
20
|
if (typeof wire !== "string")
|
|
@@ -21,13 +22,13 @@ function rowId(wire, prefix) {
|
|
|
21
22
|
const bare = wire.startsWith(prefix) ? wire.slice(prefix.length) : wire;
|
|
22
23
|
return UUID.test(bare) ? bare.toLowerCase() : null;
|
|
23
24
|
}
|
|
24
|
-
/**
|
|
25
|
+
/** The default: what an ordinary client link may do. */
|
|
25
26
|
const CLIENT_PERMISSIONS = ["thread:create", "comment:create", "thread:resolve", "thread:delete:own"];
|
|
26
27
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
28
|
+
* The read-time downgrade. There is no jobs engine yet (
|
|
29
|
+
* the reaper), so `write_mode = 'open'` past its `write_mode_downgrade_at`
|
|
29
30
|
* is evaluated HERE, on every session mint, rather than flipped by a
|
|
30
|
-
* background pass. When
|
|
31
|
+
* background pass. When the `runDueJobs` lands it should ALSO persist the
|
|
31
32
|
* downgrade (`UPDATE projects SET write_mode = 'link-required', … WHERE …`) so
|
|
32
33
|
* this stays a fallback rather than the only enforcement — but a session
|
|
33
34
|
* request must never trust a `write_mode` column that could be 24 hours
|
|
@@ -42,14 +43,14 @@ export function effectiveWriteMode(row, at) {
|
|
|
42
43
|
return row.write_mode;
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
|
-
* `perm` is computed ONCE, from the credential, here —
|
|
46
|
+
* `perm` is computed ONCE, from the credential, here — the table.
|
|
46
47
|
*
|
|
47
48
|
* *"Nothing about visibility is ever taken from the request. Not a header, not
|
|
48
49
|
* a query parameter, not a field on the body, not the reviewer's own claim
|
|
49
50
|
* about themselves."* `thread:private` and `thread:assign` decide whether a
|
|
50
51
|
* session sees team-only threads, so the only route by which a widget session
|
|
51
52
|
* gets them is a review link whose stored `permissions` already contain them —
|
|
52
|
-
* the "team link"
|
|
53
|
+
* the "team link".
|
|
53
54
|
*/
|
|
54
55
|
function permissionsFor(kind, link) {
|
|
55
56
|
if (kind === "guest")
|
|
@@ -61,12 +62,14 @@ function permissionsFor(kind, link) {
|
|
|
61
62
|
return CLIENT_PERMISSIONS;
|
|
62
63
|
}
|
|
63
64
|
/**
|
|
64
|
-
* What a studio member signed in from the widget may do
|
|
65
|
-
* link's set
|
|
65
|
+
* What a studio member signed in from the widget may do — the team
|
|
66
|
+
* link's set, every permission there is. They are the studio: the
|
|
66
67
|
* dashboard already shows them team-only threads and lets them assign, and a
|
|
67
68
|
* widget that showed them less than the dashboard would be a second, smaller
|
|
68
69
|
* idea of who they are.
|
|
69
70
|
*/
|
|
71
|
+
/** A silently-minted member session's absolute cap. */
|
|
72
|
+
const SILENT_CAP_S = 12 * 60 * 60;
|
|
70
73
|
const MEMBER_PERMISSIONS = [
|
|
71
74
|
"thread:create",
|
|
72
75
|
"comment:create",
|
|
@@ -132,7 +135,7 @@ export function sessionRoutes(deps) {
|
|
|
132
135
|
}
|
|
133
136
|
if (!project)
|
|
134
137
|
return fail(c, 404, "project_not_found", "No project with that uid.");
|
|
135
|
-
//
|
|
138
|
+
// The codes, not the blanket 401: a paused project is 403 and a
|
|
136
139
|
// disabled one 410 everywhere else in this API, and a client branches on
|
|
137
140
|
// the status class. "Your token is wrong" and "this project is switched
|
|
138
141
|
// off" are different problems with different next steps.
|
|
@@ -155,7 +158,7 @@ export function sessionRoutes(deps) {
|
|
|
155
158
|
const body = (await c.req.json().catch(() => null));
|
|
156
159
|
if (!body)
|
|
157
160
|
return fail(c, 400, "validation_failed", "A JSON body is required.");
|
|
158
|
-
//
|
|
161
|
+
// And the shape of rule: a request that tries to grant itself
|
|
159
162
|
// visibility is refused rather than ignored, because silently dropping the
|
|
160
163
|
// field teaches the caller it worked.
|
|
161
164
|
for (const forbidden of ["role", "isTeam", "includePrivate", "permissions", "perm"]) {
|
|
@@ -165,7 +168,7 @@ export function sessionRoutes(deps) {
|
|
|
165
168
|
}
|
|
166
169
|
const bearer = /^Bearer (.+)$/i.exec(c.req.header("Authorization") ?? "")?.[1];
|
|
167
170
|
const identity = body.identity;
|
|
168
|
-
// ── REFRESH: a bearer and no identity
|
|
171
|
+
// ── REFRESH: a bearer and no identity. Silent, and the whole reason
|
|
169
172
|
// a reviewer is not asked to re-open their link four times an afternoon.
|
|
170
173
|
if (bearer && !identity) {
|
|
171
174
|
const v = await verifySession(keys, bearer, {
|
|
@@ -179,7 +182,7 @@ export function sessionRoutes(deps) {
|
|
|
179
182
|
const code = v.reason === "session_revoked" ? "session_revoked" : "unauthorized";
|
|
180
183
|
return fail(c, 401, code, "That session is no longer valid. Re-open your review link to continue.");
|
|
181
184
|
}
|
|
182
|
-
// A link session re-checks the link on refresh
|
|
185
|
+
// A link session re-checks the link on refresh: revocation is
|
|
183
186
|
// instant at exchange AND on every refresh, which is what bounds how long
|
|
184
187
|
// a revoked link keeps working to one sliding window.
|
|
185
188
|
let linkExpiresAt;
|
|
@@ -196,7 +199,7 @@ export function sessionRoutes(deps) {
|
|
|
196
199
|
return fail(c, 401, "session_expired", "This review session has reached its limit. Re-open your review link.");
|
|
197
200
|
}
|
|
198
201
|
/**
|
|
199
|
-
* `in_studio` is
|
|
202
|
+
* `in_studio` is the re-check, in the same round trip. A STUDIO
|
|
200
203
|
* MEMBER'S widget session (`sub` a reviewer row with `user_id` set) is
|
|
201
204
|
* only as good as the membership it was minted from: removed from the
|
|
202
205
|
* studio, made a viewer, or their account deleted, and the next refresh
|
|
@@ -243,21 +246,21 @@ export function sessionRoutes(deps) {
|
|
|
243
246
|
return fail(c, 400, "validation_failed", "identity.kind is required (guest or link).");
|
|
244
247
|
}
|
|
245
248
|
if (identity.kind === "verified") {
|
|
246
|
-
//
|
|
249
|
+
// The HMAC handshake is. Saying so beats a 500.
|
|
247
250
|
return fail(c, 501, "not_implemented", "Verified identity is not available on this build yet.");
|
|
248
251
|
}
|
|
249
252
|
if (identity.kind !== "guest" && identity.kind !== "link") {
|
|
250
253
|
return fail(c, 400, "validation_failed", `Unknown identity kind "${identity.kind}".`);
|
|
251
254
|
}
|
|
252
|
-
// ──
|
|
255
|
+
// ── the write-mode gate. This is what closed the hole: a project past
|
|
253
256
|
// `open`'s grace window (or minted `link-required`/`verified-only`)
|
|
254
257
|
// used to mint a guest session anyway, because nothing here ever read
|
|
255
258
|
// `write_mode`. `verified-only` is checked FIRST: neither a `guest`
|
|
256
259
|
// identity (no credential at all) nor a `link` identity is ever
|
|
257
260
|
// `verified`, so both must be refused before the guest/link check
|
|
258
261
|
// below gets a chance to mislabel a verified-only rejection as
|
|
259
|
-
// "get a link" (
|
|
260
|
-
// this way, and
|
|
262
|
+
// "get a link" (registers the two codes
|
|
263
|
+
// this way, and the table maps mode -> code the same way; a
|
|
261
264
|
// guest-first ordering here made a verified-only project answer
|
|
262
265
|
// guests with 403 link_required instead of verified_identity_required
|
|
263
266
|
// — a link would not have helped them). Only once verified-only is
|
|
@@ -276,7 +279,7 @@ export function sessionRoutes(deps) {
|
|
|
276
279
|
if (!environment) {
|
|
277
280
|
return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
|
|
278
281
|
}
|
|
279
|
-
// ──
|
|
282
|
+
// ── the validation table, IN ORDER.
|
|
280
283
|
let link = null;
|
|
281
284
|
if (identity.kind === "link") {
|
|
282
285
|
if (typeof identity.token !== "string" || !identity.token) {
|
|
@@ -285,7 +288,7 @@ export function sessionRoutes(deps) {
|
|
|
285
288
|
// Looked up BY HASH, so an unknown token and a wrong one take the same
|
|
286
289
|
// path — there is no row to compare against and therefore nothing to
|
|
287
290
|
// compare in variable time.
|
|
288
|
-
//
|
|
291
|
+
// LEFT JOIN rounds so a round-pinned link can report the round
|
|
289
292
|
// NUMBER (what a reviewer and the widget both mean by "round"), not
|
|
290
293
|
// just its opaque id -- rounds.id never left the server before this.
|
|
291
294
|
const [found] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
@@ -293,7 +296,9 @@ export function sessionRoutes(deps) {
|
|
|
293
296
|
rl.allow_name_override, rl.name, rl.email,
|
|
294
297
|
rl.max_uses, rl.use_count, rl.expires_at, rl.revoked_at
|
|
295
298
|
FROM review_links rl
|
|
296
|
-
|
|
299
|
+
-- An archived or deleted round pins nothing: the link widens
|
|
300
|
+
-- to the default, as it does when the round row is gone.
|
|
301
|
+
LEFT JOIN rounds rd ON rd.id = rl.round_id AND rd.deleted_at IS NULL AND rd.archived_at IS NULL
|
|
297
302
|
WHERE rl.project_id = ${project.id} AND rl.token_hash = ${sha256(identity.token)}
|
|
298
303
|
`);
|
|
299
304
|
if (!found)
|
|
@@ -310,7 +315,7 @@ export function sessionRoutes(deps) {
|
|
|
310
315
|
}
|
|
311
316
|
const kind = identity.kind;
|
|
312
317
|
const permissions = permissionsFor(kind, link);
|
|
313
|
-
// ── The reviewer
|
|
318
|
+
// ── The reviewer.: the SERVER mints the holder secret and returns
|
|
314
319
|
// it once; later exchanges present it back.
|
|
315
320
|
const presented = typeof identity.holderSecret === "string" ? identity.holderSecret : null;
|
|
316
321
|
const presentedId = rowId(identity.holderId, ID_PREFIX.reviewer);
|
|
@@ -329,7 +334,7 @@ export function sessionRoutes(deps) {
|
|
|
329
334
|
AND holder_secret_hash = ${sha256(presented)}
|
|
330
335
|
AND blocked_at IS NULL AND erased_at IS NULL
|
|
331
336
|
`);
|
|
332
|
-
//
|
|
337
|
+
// "a mismatch does NOT error — it silently mints a new guest
|
|
333
338
|
// identity, because a stale storage entry must never lock a reviewer
|
|
334
339
|
// out." So this is an `if`, not a guard clause.
|
|
335
340
|
if (existing) {
|
|
@@ -343,7 +348,7 @@ export function sessionRoutes(deps) {
|
|
|
343
348
|
}
|
|
344
349
|
}
|
|
345
350
|
if (!reviewerId) {
|
|
346
|
-
//
|
|
351
|
+
// The `max_uses` check happens HERE, not above, because it counts
|
|
347
352
|
// PEOPLE: a holder who already has a row is readmitted even on an
|
|
348
353
|
// exhausted link, and only a genuinely new person is refused.
|
|
349
354
|
if (link && link.max_uses !== null && link.use_count >= link.max_uses) {
|
|
@@ -361,7 +366,7 @@ export function sessionRoutes(deps) {
|
|
|
361
366
|
DO NOTHING
|
|
362
367
|
RETURNING id
|
|
363
368
|
`;
|
|
364
|
-
//
|
|
369
|
+
// Use_count increments ONLY on a returned id — that is what makes
|
|
365
370
|
// it count people rather than exchanges. `last_used_at` rides along, so
|
|
366
371
|
// an exchange is one extra statement rather than two.
|
|
367
372
|
if (rows[0] && link) {
|
|
@@ -404,21 +409,76 @@ export function sessionRoutes(deps) {
|
|
|
404
409
|
expiresAt: minted.expiresAt.toISOString(),
|
|
405
410
|
refreshableUntil: minted.refreshableUntil.toISOString(),
|
|
406
411
|
reviewer: { id: ID_PREFIX.reviewer + reviewerId, name: reviewerName, kind },
|
|
407
|
-
// Returned ONCE, on first creation of this person
|
|
412
|
+
// Returned ONCE, on first creation of this person. Absent on
|
|
408
413
|
// every later exchange, which is how the client knows to keep the one
|
|
409
414
|
// it has.
|
|
410
415
|
...(holderSecret ? { holderSecret } : {}),
|
|
411
416
|
environment,
|
|
412
417
|
permissions,
|
|
413
|
-
//
|
|
418
|
+
// `number` alongside `id` -- the widget stores the NUMBER beside
|
|
414
419
|
// the bearer and passes `?round=<number>` on `GET …/threads`; the
|
|
415
420
|
// internal `rounds.id` is never a query param anywhere in 05.
|
|
416
|
-
...(link?.round_id ? { round: { id: link.round_id, number: link.round_number } } : {}),
|
|
421
|
+
...(link?.round_id && link.round_number ? { round: { id: link.round_id, number: link.round_number } } : {}),
|
|
417
422
|
serverTime: now().toISOString(),
|
|
418
423
|
}, 201);
|
|
419
424
|
});
|
|
420
425
|
/**
|
|
421
|
-
*
|
|
426
|
+
* The member session itself, for an owner whose studio, role and origin the
|
|
427
|
+
* caller has already checked — shared by the popup's route and the silent
|
|
428
|
+
* one, so the two cannot drift into two ideas of what a member's
|
|
429
|
+
* session is.
|
|
430
|
+
*/
|
|
431
|
+
const mintMember = async (c, owner, project, uid, origin, envKey,
|
|
432
|
+
/** The absolute cap for this session; the instance's, unless shorter. */
|
|
433
|
+
capS = ttls.absoluteS) => {
|
|
434
|
+
const environment = await environmentOf(project, envKey);
|
|
435
|
+
if (!environment) {
|
|
436
|
+
return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
|
|
437
|
+
}
|
|
438
|
+
const reviewer = await inOrg(sql, project.org_id, async (tx) => {
|
|
439
|
+
const id = await studioReviewerId(tx, {
|
|
440
|
+
orgId: project.org_id,
|
|
441
|
+
projectId: project.id,
|
|
442
|
+
userId: owner.userId,
|
|
443
|
+
name: owner.name,
|
|
444
|
+
email: owner.email,
|
|
445
|
+
});
|
|
446
|
+
const [row] = await tx `
|
|
447
|
+
UPDATE reviewers SET last_seen_at = now() WHERE id = ${id}::uuid RETURNING id, name
|
|
448
|
+
`;
|
|
449
|
+
return row;
|
|
450
|
+
});
|
|
451
|
+
const nowS = Math.floor(now().getTime() / 1000);
|
|
452
|
+
const minted = await mintSession(keys, {
|
|
453
|
+
projectUid: uid,
|
|
454
|
+
reviewerId: reviewer.id,
|
|
455
|
+
environmentKey: environment.key,
|
|
456
|
+
kind: "verified",
|
|
457
|
+
reviewLinkId: null,
|
|
458
|
+
permissions: MEMBER_PERMISSIONS,
|
|
459
|
+
sessionEpoch: project.session_epoch,
|
|
460
|
+
iex: nowS + Math.min(capS, ttls.absoluteS),
|
|
461
|
+
}, ttls, now);
|
|
462
|
+
// The exchange's shape, so the widget stores it with the code it already
|
|
463
|
+
// has — plus `origin`, the one the dashboard must post to, echoed from
|
|
464
|
+
// the check above rather than re-derived on the page.
|
|
465
|
+
return c.json({
|
|
466
|
+
sessionToken: minted.token,
|
|
467
|
+
expiresAt: minted.expiresAt.toISOString(),
|
|
468
|
+
refreshableUntil: minted.refreshableUntil.toISOString(),
|
|
469
|
+
reviewer: { id: ID_PREFIX.reviewer + reviewer.id, name: reviewer.name, kind: "verified" },
|
|
470
|
+
environment,
|
|
471
|
+
permissions: MEMBER_PERMISSIONS,
|
|
472
|
+
// Owners and admins may delete anyone's comment from the widget, as in
|
|
473
|
+
// the dashboard — a hint for which controls to draw; the delete routes
|
|
474
|
+
// read the membership themselves (isStudioModerator).
|
|
475
|
+
moderator: owner.role === "owner" || owner.role === "admin",
|
|
476
|
+
origin,
|
|
477
|
+
serverTime: now().toISOString(),
|
|
478
|
+
}, 201);
|
|
479
|
+
};
|
|
480
|
+
/**
|
|
481
|
+
* `POST /api/v1/projects/{uid}/sessions/member`, "Sign in with
|
|
422
482
|
* Snagset".
|
|
423
483
|
*
|
|
424
484
|
* A studio member reviewing a client's site from the widget was asked for
|
|
@@ -480,51 +540,108 @@ export function sessionRoutes(deps) {
|
|
|
480
540
|
return fail(c, 403, "origin_not_allowed", `${origin} is not one of this site's addresses. Add it in the site's settings first.`);
|
|
481
541
|
}
|
|
482
542
|
const envKey = typeof body?.environment === "string" && body.environment ? body.environment : null;
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
543
|
+
return mintMember(c, owner, project, uid, origin, envKey);
|
|
544
|
+
});
|
|
545
|
+
/**
|
|
546
|
+
* `POST /api/v1/projects/{uid}/sessions/member/silent`, the silent
|
|
547
|
+
* member sign-in for a client page on the SAME SITE as the dashboard.
|
|
548
|
+
*
|
|
549
|
+
* The studio's real setup is `snagset.studio.dev` for the dashboard and
|
|
550
|
+
* `acme.studio.dev` for the client's staging site: two origins, ONE site.
|
|
551
|
+
* A `SameSite=Lax` cookie is sent on any same-site request, credentialed
|
|
552
|
+
* fetches included, so the widget on acme.… can simply ask "am I a
|
|
553
|
+
* member?" with the dashboard cookie riding along — no popup, no click.
|
|
554
|
+
* On an unrelated client domain the browser sends nothing (cross-site), the
|
|
555
|
+
* answer is a cheap 401, and the popup stays the way in.
|
|
556
|
+
*
|
|
557
|
+
* WHY THE CLICK IS NOT NEEDED HERE, when the decision says it is not a courtesy:
|
|
558
|
+
* The click guards against a page that opens the popup and receives a
|
|
559
|
+
* token by `postMessage` without the member knowing. Here the token goes
|
|
560
|
+
* nowhere but the response body, and the browser lets only an origin this
|
|
561
|
+
* response names (`Access-Control-Allow-Origin` + credentials, cors.ts)
|
|
562
|
+
* read it — and every such origin is, by the checks below, one of the
|
|
563
|
+
* site's own addresses on the studio's own registrable domain. A page that
|
|
564
|
+
* can read this response is a page the widget is installed on, under a
|
|
565
|
+
* domain the studio controls.
|
|
566
|
+
*
|
|
567
|
+
* NO CSRF PAIR — the widget cannot read the dashboard's CSRF cookie (it is
|
|
568
|
+
* host-only on the server's host), so this route is NOT behind
|
|
569
|
+
* `requireOwner()` (app.ts mounts that on `…/sessions/member` exactly,
|
|
570
|
+
* which does not match this path). It is protected by three checks, and
|
|
571
|
+
* every one of them must pass:
|
|
572
|
+
*
|
|
573
|
+
* 1. `Sec-Fetch-Site` is `same-site` or `same-origin`. A Fetch Metadata
|
|
574
|
+
* header: set by the browser, not settable by page script, so a
|
|
575
|
+
* cross-site page cannot claim to be a neighbour. MISSING is a refusal
|
|
576
|
+
* — an old browser that does not send it uses the popup, as it always
|
|
577
|
+
* could.
|
|
578
|
+
* 2. `Origin` is exactly an origin, `originPermitted` accepts it for this
|
|
579
|
+
* site (the CORS layer's and the popup route's own verdict), AND it is
|
|
580
|
+
* the same site as this server's own host (`sameSite`, domain.ts:
|
|
581
|
+
* last two labels equal and not a shared hosting or registry suffix —
|
|
582
|
+
* two customers' `*.vercel.app` apps are NOT one site). Localhost
|
|
583
|
+
* only when the server is on localhost too.
|
|
584
|
+
* 3. A dashboard cookie session for a member of the site's studio whose
|
|
585
|
+
* role is not `viewer` — the popup route's own rule.
|
|
586
|
+
*
|
|
587
|
+
* The order is the cheap one: the two header checks touch nothing, and a
|
|
588
|
+
* page with no cookie (a CLIENT on a same-site staging page, which is most
|
|
589
|
+
* callers) gets its 401 before any query of this route's own — `ownerAuth`
|
|
590
|
+
* only queries when a cookie is present, and the project lookup the CORS
|
|
591
|
+
* layer did is cached.
|
|
592
|
+
*
|
|
593
|
+
* The body is optional and `text/plain` if present (`{"environment":"…"}`):
|
|
594
|
+
* a POST with no custom header and a safelisted content type is a CORS
|
|
595
|
+
* SIMPLE request, so there is no preflight round trip on every page load.
|
|
596
|
+
* (cors.ts answers a preflight correctly anyway.)
|
|
597
|
+
*/
|
|
598
|
+
app.post("/api/v1/projects/:uid/sessions/member/silent", async (c) => {
|
|
599
|
+
const fetchSite = c.req.header("Sec-Fetch-Site");
|
|
600
|
+
if (fetchSite !== "same-site" && fetchSite !== "same-origin") {
|
|
601
|
+
return fail(c, 403, "forbidden", "Silent sign-in only answers a page on the dashboard's own site.");
|
|
486
602
|
}
|
|
487
|
-
const
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
603
|
+
const origin = canonicalOrigin(c.req.header("Origin"));
|
|
604
|
+
// The server's own host as the browser addressed it — the same reading
|
|
605
|
+
// `/auth/login`'s origin check makes, and the host `Sec-Fetch-Site` was
|
|
606
|
+
// computed against. Port dropped: a site has no port.
|
|
607
|
+
const serverHost = (c.req.header("Host") ?? new URL(c.req.url).host).replace(/:\d+$/, "");
|
|
608
|
+
if (!origin || !sameSite(new URL(origin).hostname, serverHost)) {
|
|
609
|
+
return fail(c, 403, "forbidden", "Silent sign-in only answers a page on the dashboard's own site.");
|
|
610
|
+
}
|
|
611
|
+
const owner = c.get("owner");
|
|
612
|
+
if (!owner)
|
|
613
|
+
return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
|
|
614
|
+
const uid = c.req.param("uid");
|
|
615
|
+
const project = await live(c, uid);
|
|
616
|
+
if (project instanceof Response)
|
|
617
|
+
return project;
|
|
618
|
+
if (project.org_id !== owner.orgId)
|
|
619
|
+
return fail(c, 404, "project_not_found", "No project with that uid.");
|
|
620
|
+
if (owner.role === "viewer") {
|
|
621
|
+
return fail(c, 403, "forbidden", "Your role in this studio cannot comment.");
|
|
622
|
+
}
|
|
623
|
+
if (!originPermitted(await allowedOrigins(sql, project.id), project.domain, origin)) {
|
|
624
|
+
return fail(c, 403, "origin_not_allowed", `${origin} is not one of this site's addresses. Add it in the site's settings first.`);
|
|
625
|
+
}
|
|
626
|
+
const raw = await c.req.text().catch(() => "");
|
|
627
|
+
let body = null;
|
|
628
|
+
try {
|
|
629
|
+
body = raw ? JSON.parse(raw) : null;
|
|
630
|
+
}
|
|
631
|
+
catch {
|
|
632
|
+
body = null;
|
|
633
|
+
}
|
|
634
|
+
const envKey = typeof body?.environment === "string" && body.environment ? body.environment : null;
|
|
635
|
+
/**
|
|
636
|
+
* TWELVE HOURS, whatever SNAGSET_SESSION_ABSOLUTE_TTL_S says. Nobody
|
|
637
|
+
* clicked for this session: any script on a permitted same-site page —
|
|
638
|
+
* an XSS on a client's staging site, a dangling subdomain taken over —
|
|
639
|
+
* can obtain one while a member visits. Renewal is silent too, so the
|
|
640
|
+
* short cap costs the member nothing; it only bounds how long a session
|
|
641
|
+
* lifted that way stays good. The popup, approved with a click, keeps
|
|
642
|
+
* the instance's cap (a studio may raise it to 30 days).
|
|
643
|
+
*/
|
|
644
|
+
return mintMember(c, owner, project, uid, origin, envKey, SILENT_CAP_S);
|
|
528
645
|
});
|
|
529
646
|
return app;
|
|
530
647
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/sites.js
CHANGED
|
@@ -55,7 +55,7 @@ export function siteRoutes(deps) {
|
|
|
55
55
|
catch (e) {
|
|
56
56
|
return fail(c, 400, "validation_failed", e instanceof Error ? e.message : String(e));
|
|
57
57
|
}
|
|
58
|
-
//
|
|
58
|
+
// The site's DOMAIN, the one field most sites need: its host, every
|
|
59
59
|
// subdomain, any scheme and port, and localhost. Exact origins stay for
|
|
60
60
|
// the addresses a domain cannot say.
|
|
61
61
|
const rawDomain = body?.["domain"];
|
|
@@ -163,7 +163,7 @@ export function siteRoutes(deps) {
|
|
|
163
163
|
return c.json({ origins: all.map((r) => r.pattern) }, 201);
|
|
164
164
|
});
|
|
165
165
|
/**
|
|
166
|
-
* `PATCH /api/v1/projects/:uid` — who sees the toolbar.
|
|
166
|
+
* `PATCH /api/v1/projects/:uid` — who sees the toolbar.
|
|
167
167
|
*
|
|
168
168
|
* ONE knob, and it is the knob that already existed: `write_mode`. Who can
|
|
169
169
|
* WRITE is who the toolbar is for — showing a comment bar to somebody whose
|
|
@@ -172,7 +172,7 @@ export function siteRoutes(deps) {
|
|
|
172
172
|
* comment; `link-required` = only somebody who opened a review link (and,
|
|
173
173
|
* thereafter, whenever they come back).
|
|
174
174
|
*
|
|
175
|
-
* Choosing `open` here CLEARS the
|
|
175
|
+
* Choosing `open` here CLEARS the grace timer. The 24-hour downgrade
|
|
176
176
|
* exists so a site somebody set up and forgot does not stay a public comment
|
|
177
177
|
* box; an owner choosing "everyone" in the dashboard is the opposite of
|
|
178
178
|
* forgetting, and having the toolbar silently vanish a day later would be
|
|
@@ -191,10 +191,10 @@ export function siteRoutes(deps) {
|
|
|
191
191
|
}
|
|
192
192
|
const body = (await c.req.json().catch(() => null));
|
|
193
193
|
/**
|
|
194
|
-
* THREE FIELDS NOW, NOT ONE.
|
|
194
|
+
* THREE FIELDS NOW, NOT ONE. Mounted this route for `writeMode` alone,
|
|
195
195
|
* and a site was create-once ever after: a typo in the name was permanent
|
|
196
196
|
* and a staging URL that moved could only be ADDED to, never corrected.
|
|
197
|
-
*
|
|
197
|
+
* The maintainer, using it: *"the sites we should be able to edit the url and name
|
|
198
198
|
* and delete or edit it, right now is just one time."*
|
|
199
199
|
*
|
|
200
200
|
* Each is optional and absent means unchanged, so the existing
|
|
@@ -224,7 +224,7 @@ export function siteRoutes(deps) {
|
|
|
224
224
|
return fail(c, 400, "validation_failed", "That name is longer than 120 characters.");
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
|
-
//
|
|
227
|
+
// The domain: a string to set, null (or empty) to clear.
|
|
228
228
|
let domain;
|
|
229
229
|
if (rawDomain !== undefined) {
|
|
230
230
|
if (rawDomain === null || (typeof rawDomain === "string" && !rawDomain.trim())) {
|
|
@@ -240,7 +240,7 @@ export function siteRoutes(deps) {
|
|
|
240
240
|
return fail(c, 400, "validation_failed", "domain must be a string, or null to clear it.");
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
|
-
//
|
|
243
|
+
// The switch, layer 6's kill switch with a dashboard
|
|
244
244
|
// control: paused refuses the widget's writes and hides the toolbar;
|
|
245
245
|
// reads and the studio's own triage go on.
|
|
246
246
|
let status;
|
|
@@ -323,7 +323,7 @@ export function siteRoutes(deps) {
|
|
|
323
323
|
return c.json({
|
|
324
324
|
uid: c.req.param("uid"),
|
|
325
325
|
name: row?.name,
|
|
326
|
-
// What the widget enforces, as the sites list says it
|
|
326
|
+
// What the widget enforces, as the sites list says it.
|
|
327
327
|
writeMode: row ? effectiveWriteMode(row, new Date()) : undefined,
|
|
328
328
|
status: row?.status,
|
|
329
329
|
domain: row?.domain ?? null,
|
|
@@ -378,7 +378,7 @@ export function siteRoutes(deps) {
|
|
|
378
378
|
const all = await inOrg(sql, project.org_id, (tx) => tx `
|
|
379
379
|
SELECT pattern FROM project_origins WHERE project_id = ${project.id} ORDER BY pattern
|
|
380
380
|
`);
|
|
381
|
-
//
|
|
381
|
+
// Where the widget may run is the domain AND the exact addresses.
|
|
382
382
|
return c.json({ domain: project.domain, origins: all.map((r) => r.pattern) });
|
|
383
383
|
});
|
|
384
384
|
return app;
|