@snagset/server 0.1.10 → 0.1.12
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/dist/app.js +23 -1
- package/dist/app.js.map +1 -1
- package/dist/config.generated.js +2 -1
- package/dist/config.generated.js.map +1 -1
- package/dist/db/migrate.js +44 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/migrations/0008_outbox_org_rows.sql +29 -0
- package/dist/db/migrations/0009_member_invites.sql +84 -0
- package/dist/jobs/set.js +15 -4
- package/dist/jobs/set.js.map +1 -1
- package/dist/mail/digest.js +291 -0
- package/dist/mail/digest.js.map +1 -0
- package/dist/mail/links.js +41 -0
- package/dist/mail/links.js.map +1 -0
- package/dist/mail/notify.js +126 -25
- package/dist/mail/notify.js.map +1 -1
- package/dist/net/publicFetch.js +202 -0
- package/dist/net/publicFetch.js.map +1 -0
- package/dist/routes/commentEdit.js +20 -5
- package/dist/routes/commentEdit.js.map +1 -1
- package/dist/routes/imageProxy.js +77 -0
- package/dist/routes/imageProxy.js.map +1 -0
- package/dist/routes/invites.js +417 -0
- package/dist/routes/invites.js.map +1 -0
- package/dist/routes/members.js +36 -68
- package/dist/routes/members.js.map +1 -1
- package/dist/routes/owner.js +5 -0
- package/dist/routes/owner.js.map +1 -1
- package/dist/routes/threads.js +182 -42
- package/dist/routes/threads.js.map +1 -1
- package/package.json +3 -3
- package/static/dashboard/assets/CompositeItem-CYCgjQYA.js +1 -0
- package/static/dashboard/assets/{ConfirmDialog-eCzw7vjK.js → ConfirmDialog-ChIOOj7I.js} +1 -1
- package/static/dashboard/assets/{CopyButton-lcjux1TA.js → CopyButton-V7OJiMLP.js} +1 -1
- package/static/dashboard/assets/{FieldItemContext-i5zdyQYl.js → FieldItemContext-DVtdzu3C.js} +1 -1
- package/static/dashboard/assets/{InstallTag-Eqs3RM9e.js → InstallTag-OD-dW_hC.js} +1 -1
- package/static/dashboard/assets/{SaveState-Cf_bnJmg.js → SaveState-JVgANqCr.js} +1 -1
- package/static/dashboard/assets/{_app-CuKLSKZ2.js → _app-B0TJyHg-.js} +1 -1
- package/static/dashboard/assets/_app-Bwss1pXe.js +56 -0
- package/static/dashboard/assets/activity-CbcgWM3L.js +1 -0
- package/static/dashboard/assets/{arrow-left-CQUHEFUP.js → arrow-left-BrmSwEeI.js} +1 -1
- package/static/dashboard/assets/{avatar-CWT37Ivf.js → avatar-CwD1_B-n.js} +1 -1
- package/static/dashboard/assets/{badge-thtKAJ0h.js → badge-DM_IoUbC.js} +1 -1
- package/static/dashboard/assets/{card-CsXE7vKD.js → card-DpmJQuox.js} +1 -1
- package/static/dashboard/assets/{check-Bc_1fmPx.js → check-DNKwULUa.js} +1 -1
- package/static/dashboard/assets/{chevron-right-neQQkaOt.js → chevron-right-ob3VZye2.js} +1 -1
- package/static/dashboard/assets/{copy-O3USBatC.js → copy-CyBHfvzN.js} +1 -1
- package/static/dashboard/assets/{dialog-MC-TOvQV.js → dialog-Bys-LJLw.js} +2 -2
- package/static/dashboard/assets/{dropdown-menu-C2ZhmONu.js → dropdown-menu-Cqas_wS3.js} +2 -2
- package/static/dashboard/assets/{image-off-Bu6l8gP5.js → image-off-D_65_17F.js} +1 -1
- package/static/dashboard/assets/index-Cxnlb88o.js +169 -0
- package/static/dashboard/assets/index-Ddi7bl87.css +1 -0
- package/static/dashboard/assets/invite-Cc7l9fdY.js +1 -0
- package/static/dashboard/assets/label-CwqSv8L3.js +1 -0
- package/static/dashboard/assets/{layout-grid-rYWIGaIJ.js → layout-grid-PTAyhqU8.js} +1 -1
- package/static/dashboard/assets/me-kMczOn0k.js +1 -0
- package/static/dashboard/assets/{parts-kPNZVO9H.js → parts-CErghVAB.js} +1 -1
- package/static/dashboard/assets/{plus-CcJ1Zwa7.js → plus-BE-gOo3v.js} +1 -1
- package/static/dashboard/assets/s._site-BBRI74gv.js +1 -0
- package/static/dashboard/assets/s._site.comments-CbfjF9-s.js +54 -0
- package/static/dashboard/assets/{s._site.reviewers-Djq2t6Dx.js → s._site.reviewers-BMiqVuRm.js} +1 -1
- package/static/dashboard/assets/s._site.settings-CEvRwMQt.js +1 -0
- package/static/dashboard/assets/{setup-D748SEIm.js → setup-CkNn_rwp.js} +1 -1
- package/static/dashboard/assets/{sign-in-CKSiZWCo.js → sign-in-Bz6iRxcc.js} +1 -1
- package/static/dashboard/assets/{sign-up-BX9j_Ya2.js → sign-up-QcstGuaV.js} +1 -1
- package/static/dashboard/assets/sites-DJjGT-f2.js +1 -0
- package/static/dashboard/assets/studio-mKw0u2SL.js +1 -0
- package/static/dashboard/assets/studio-qqUvuQo5.js +1 -0
- package/static/dashboard/assets/studio.index-zjJeqf8B.js +1 -0
- package/static/dashboard/assets/studio.integrations-C9-R6CQZ.js +1 -0
- package/static/dashboard/assets/studio.members-BYd5gcvp.js +6 -0
- package/static/dashboard/assets/{sun-CWPmS6_O.js → sun-DTQiNbTt.js} +1 -1
- package/static/dashboard/assets/switch-Cqqz6oQN.js +1 -0
- package/static/dashboard/assets/{table-CiZO2uuW.js → table-D_36h1Oq.js} +1 -1
- package/static/dashboard/assets/{useAriaLabelledBy-oZFqC809.js → useAriaLabelledBy-D-dab2TD.js} +1 -1
- package/static/dashboard/assets/{useBaseQuery-CHgLQD-M.js → useBaseQuery-DmDP3Pxx.js} +1 -1
- package/static/dashboard/assets/useQuery-CKn14AcE.js +1 -0
- package/static/dashboard/assets/useRender-B_JrSXOO.js +1 -0
- package/static/dashboard/assets/{useValueChanged-Dvr7PvAV.js → useValueChanged--Isnj6ZH.js} +1 -1
- package/static/dashboard/assets/{users-Ci-ogubz.js → users-CJVqlkra.js} +1 -1
- package/static/dashboard/assets/{welcome-BDWw5Qlv.js → welcome-BMr4vd5V.js} +2 -2
- package/static/dashboard/assets/{you-DAUNHAFI.js → you-Bqw_r3i7.js} +1 -1
- package/static/dashboard/assets/{zod-CtjFmGX5.js → zod-BMw0fS-7.js} +1 -1
- package/static/dashboard/index.html +2 -2
- package/static/widget/snag.capture.js +1 -1
- package/static/widget/snag.dock.js +1 -1
- package/static/widget/snag.runtime.js +2 -2
- package/static/widget/snag.screenshot.js +1 -1
- package/static/dashboard/assets/CompositeItem-Db_8iHSG.js +0 -1
- package/static/dashboard/assets/_app-qNVG5lsX.js +0 -56
- package/static/dashboard/assets/activity-CQLBFIV4.js +0 -1
- package/static/dashboard/assets/index-BR4Mnw-o.css +0 -1
- package/static/dashboard/assets/index-C6gyyLd5.js +0 -169
- package/static/dashboard/assets/label-BTdAT39L.js +0 -1
- package/static/dashboard/assets/me-CI9giaT9.js +0 -1
- package/static/dashboard/assets/s._site-D0HRtia-.js +0 -1
- package/static/dashboard/assets/s._site.comments-D3ACsr3a.js +0 -39
- package/static/dashboard/assets/s._site.settings-D0b6vJci.js +0 -1
- package/static/dashboard/assets/sites-QwJy87Y8.js +0 -1
- package/static/dashboard/assets/studio-B_ma5JGA.js +0 -1
- package/static/dashboard/assets/studio-HH_J6PPv.js +0 -1
- package/static/dashboard/assets/studio.index-DrtJF7DT.js +0 -1
- package/static/dashboard/assets/studio.integrations-Cv34ukzT.js +0 -1
- package/static/dashboard/assets/studio.members-DTbKcrEI.js +0 -1
- package/static/dashboard/assets/switch-CzijGUed.js +0 -1
- package/static/dashboard/assets/useQuery-C6FyjMS-.js +0 -1
- package/static/dashboard/assets/useRender-D5jZ1wns.js +0 -1
package/dist/mail/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/mail/notify.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/mail/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { lookup as dnsLookup } from "node:dns";
|
|
2
|
+
import { BlockList, isIP } from "node:net";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
import https from "node:https";
|
|
5
|
+
/**
|
|
6
|
+
* Fetch an image from the public internet, and from nowhere else — the image
|
|
7
|
+
* proxy's half on the server (D-image-proxy, found reviewing Bringg).
|
|
8
|
+
*
|
|
9
|
+
* A server that fetches a URL a browser hands it is a server that can be
|
|
10
|
+
* pointed at itself: `http://localhost:5432`, the cloud metadata address
|
|
11
|
+
* `169.254.169.254`, a database on the private network beside it. So the
|
|
12
|
+
* check is on the ADDRESS, not the name, and it happens at connect time,
|
|
13
|
+
* inside the socket's own DNS lookup: checking the name first and connecting
|
|
14
|
+
* afterwards is exactly the gap DNS rebinding drives through, because the
|
|
15
|
+
* second resolution can answer differently from the first. Redirects are
|
|
16
|
+
* followed by hand for the same reason — each hop is a new connection and
|
|
17
|
+
* gets the same check.
|
|
18
|
+
*
|
|
19
|
+
* Node's built-in BlockList, not a dependency: the ranges are short, fixed
|
|
20
|
+
* and RFC-numbered, and a parser library is one more thing on the path of
|
|
21
|
+
* every request this route serves.
|
|
22
|
+
*/
|
|
23
|
+
const BLOCKED = new BlockList();
|
|
24
|
+
for (const [net, bits] of [
|
|
25
|
+
["0.0.0.0", 8], // "this network"
|
|
26
|
+
["10.0.0.0", 8], // RFC 1918
|
|
27
|
+
["100.64.0.0", 10], // carrier-grade NAT
|
|
28
|
+
["127.0.0.0", 8], // loopback
|
|
29
|
+
["169.254.0.0", 16], // link-local, and the cloud metadata address in it
|
|
30
|
+
["172.16.0.0", 12], // RFC 1918
|
|
31
|
+
["192.0.0.0", 24], // IETF protocol assignments
|
|
32
|
+
["192.0.2.0", 24], // documentation
|
|
33
|
+
["192.88.99.0", 24], // 6to4 relay
|
|
34
|
+
["192.168.0.0", 16], // RFC 1918
|
|
35
|
+
["198.18.0.0", 15], // benchmarking
|
|
36
|
+
["198.51.100.0", 24], // documentation
|
|
37
|
+
["203.0.113.0", 24], // documentation
|
|
38
|
+
["224.0.0.0", 4], // multicast
|
|
39
|
+
["240.0.0.0", 4], // reserved, and broadcast
|
|
40
|
+
]) {
|
|
41
|
+
BLOCKED.addSubnet(net, bits, "ipv4");
|
|
42
|
+
}
|
|
43
|
+
for (const [net, bits] of [
|
|
44
|
+
["::", 128], // unspecified
|
|
45
|
+
["::1", 128], // loopback
|
|
46
|
+
["64:ff9b::", 96], // NAT64, which can reach an IPv4 private address
|
|
47
|
+
["64:ff9b:1::", 48], // NAT64 local use
|
|
48
|
+
["100::", 64], // discard
|
|
49
|
+
["2001:db8::", 32], // documentation
|
|
50
|
+
["fc00::", 7], // unique local
|
|
51
|
+
["fe80::", 10], // link-local
|
|
52
|
+
["ff00::", 8], // multicast
|
|
53
|
+
]) {
|
|
54
|
+
BLOCKED.addSubnet(net, bits, "ipv6");
|
|
55
|
+
}
|
|
56
|
+
// NOT `::ffff:0:0/96`. Node's BlockList matches an IPv4 address against an
|
|
57
|
+
// IPv4-mapped IPv6 subnet, so that one line blocked the whole IPv4 internet —
|
|
58
|
+
// found by the test that expects 8.8.8.8 to be public. Mapped addresses are
|
|
59
|
+
// unwrapped and judged as IPv4 in isPublicAddress instead.
|
|
60
|
+
/** True when an address is one the proxy may connect to. */
|
|
61
|
+
export function isPublicAddress(address) {
|
|
62
|
+
const family = isIP(address);
|
|
63
|
+
if (family === 4)
|
|
64
|
+
return !BLOCKED.check(address, "ipv4");
|
|
65
|
+
if (family === 6) {
|
|
66
|
+
// `::ffff:10.0.0.1` is 10.0.0.1. Judged as what it reaches, not as what
|
|
67
|
+
// it is written as — the IPv6 range alone would say only "mapped".
|
|
68
|
+
const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(address)?.[1];
|
|
69
|
+
if (mapped)
|
|
70
|
+
return !BLOCKED.check(mapped, "ipv4");
|
|
71
|
+
return !BLOCKED.check(address, "ipv6");
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
export class PublicFetchError extends Error {
|
|
76
|
+
// Assigned in the body: the server runs under --experimental-strip-types,
|
|
77
|
+
// which has no parameter properties.
|
|
78
|
+
code;
|
|
79
|
+
constructor(code, message) {
|
|
80
|
+
super(message);
|
|
81
|
+
this.code = code;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const PORTS = new Set(["", "80", "443"]);
|
|
85
|
+
export async function fetchPublicImage(raw, opts) {
|
|
86
|
+
let url;
|
|
87
|
+
try {
|
|
88
|
+
url = new URL(raw);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new PublicFetchError("bad_url", "That is not a URL.");
|
|
92
|
+
}
|
|
93
|
+
const deadline = Date.now() + opts.timeoutMs;
|
|
94
|
+
for (let hop = 0; hop <= (opts.maxRedirects ?? 3); hop++) {
|
|
95
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
96
|
+
throw new PublicFetchError("bad_url", "Only http and https images can be fetched.");
|
|
97
|
+
}
|
|
98
|
+
// Credentials in a URL are someone's, and nothing an image needs. A port
|
|
99
|
+
// beyond the web's two is how "fetch this image" becomes "probe this
|
|
100
|
+
// service" — the allowed origin's images are served on 80 and 443.
|
|
101
|
+
if (url.username || url.password || (!opts.allowPrivate && !PORTS.has(url.port))) {
|
|
102
|
+
throw new PublicFetchError("bad_url", "Only images on the standard web ports can be fetched.");
|
|
103
|
+
}
|
|
104
|
+
const res = await request(url, deadline, opts);
|
|
105
|
+
if (res.status >= 300 && res.status < 400 && res.location) {
|
|
106
|
+
url = new URL(res.location, url);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (res.status !== 200)
|
|
110
|
+
throw new PublicFetchError("upstream", `The image's server answered ${res.status}.`);
|
|
111
|
+
return { bytes: res.bytes, contentType: res.contentType };
|
|
112
|
+
}
|
|
113
|
+
throw new PublicFetchError("too_many_redirects", "The image redirected too many times.");
|
|
114
|
+
}
|
|
115
|
+
function guardedLookup(allowPrivate) {
|
|
116
|
+
return (hostname, options, callback) => {
|
|
117
|
+
dnsLookup(hostname, { ...options, all: true }, (err, addresses) => {
|
|
118
|
+
if (err)
|
|
119
|
+
return callback(err, []);
|
|
120
|
+
const list = addresses;
|
|
121
|
+
// EVERY answer, not the first: a name that resolves to one public and
|
|
122
|
+
// one private address would otherwise be a coin toss on which the
|
|
123
|
+
// socket picks.
|
|
124
|
+
if (!allowPrivate && (list.length === 0 || !list.every((a) => isPublicAddress(a.address)))) {
|
|
125
|
+
return callback(Object.assign(new Error("blocked_address"), { code: "EBLOCKED" }), []);
|
|
126
|
+
}
|
|
127
|
+
const all = options.all;
|
|
128
|
+
if (all)
|
|
129
|
+
return callback(null, list);
|
|
130
|
+
callback(null, list[0].address, list[0].family);
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function request(url, deadline, opts) {
|
|
135
|
+
const lib = url.protocol === "https:" ? https : http;
|
|
136
|
+
// A literal IP skips DNS, so it is checked here instead.
|
|
137
|
+
const host = url.hostname.replace(/^\[|\]$/g, "");
|
|
138
|
+
if (!opts.allowPrivate && isIP(host) && !isPublicAddress(host)) {
|
|
139
|
+
return Promise.reject(new PublicFetchError("blocked_address", "That address is not on the public internet."));
|
|
140
|
+
}
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
const remaining = deadline - Date.now();
|
|
143
|
+
if (remaining <= 0)
|
|
144
|
+
return reject(new PublicFetchError("timeout", "The image took too long."));
|
|
145
|
+
const req = lib.get(url, {
|
|
146
|
+
lookup: guardedLookup(!!opts.allowPrivate),
|
|
147
|
+
timeout: remaining,
|
|
148
|
+
headers: { accept: "image/*", "user-agent": "Snagset image proxy (+https://snagset.com)" },
|
|
149
|
+
}, (res) => {
|
|
150
|
+
const status = res.statusCode ?? 0;
|
|
151
|
+
if (status >= 300 && status < 400) {
|
|
152
|
+
res.resume();
|
|
153
|
+
return resolve({ status, ...(res.headers.location ? { location: res.headers.location } : {}) });
|
|
154
|
+
}
|
|
155
|
+
if (status !== 200) {
|
|
156
|
+
res.resume();
|
|
157
|
+
return resolve({ status });
|
|
158
|
+
}
|
|
159
|
+
const contentType = String(res.headers["content-type"] ?? "").split(";")[0].trim().toLowerCase();
|
|
160
|
+
// An image or nothing. The proxy exists to put pixels in a canvas; a
|
|
161
|
+
// page, a script or a JSON document has no business coming back.
|
|
162
|
+
if (!contentType.startsWith("image/")) {
|
|
163
|
+
res.destroy();
|
|
164
|
+
return reject(new PublicFetchError("not_an_image", `Expected an image; got "${contentType || "nothing"}".`));
|
|
165
|
+
}
|
|
166
|
+
const declared = Number(res.headers["content-length"] ?? 0);
|
|
167
|
+
if (declared > opts.maxBytes) {
|
|
168
|
+
res.destroy();
|
|
169
|
+
return reject(new PublicFetchError("too_large", "The image is larger than the proxy carries."));
|
|
170
|
+
}
|
|
171
|
+
const chunks = [];
|
|
172
|
+
let size = 0;
|
|
173
|
+
res.on("data", (chunk) => {
|
|
174
|
+
size += chunk.length;
|
|
175
|
+
// Counted as it arrives: a Content-Length can be absent or a lie.
|
|
176
|
+
if (size > opts.maxBytes) {
|
|
177
|
+
res.destroy();
|
|
178
|
+
reject(new PublicFetchError("too_large", "The image is larger than the proxy carries."));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
chunks.push(chunk);
|
|
182
|
+
});
|
|
183
|
+
res.on("end", () => resolve({ status, bytes: new Uint8Array(Buffer.concat(chunks)), contentType }));
|
|
184
|
+
res.on("error", (e) => reject(new PublicFetchError("upstream", e.message)));
|
|
185
|
+
});
|
|
186
|
+
req.on("timeout", () => {
|
|
187
|
+
req.destroy();
|
|
188
|
+
reject(new PublicFetchError("timeout", "The image took too long."));
|
|
189
|
+
});
|
|
190
|
+
req.on("error", (e) => {
|
|
191
|
+
if (e.code === "EBLOCKED" || e.message === "blocked_address") {
|
|
192
|
+
reject(new PublicFetchError("blocked_address", "That address is not on the public internet."));
|
|
193
|
+
}
|
|
194
|
+
else if (!(e instanceof PublicFetchError)) {
|
|
195
|
+
reject(new PublicFetchError("upstream", e.message));
|
|
196
|
+
}
|
|
197
|
+
else
|
|
198
|
+
reject(e);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=publicFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publicFetch.js","sourceRoot":"","sources":["../../src/net/publicFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,8 @@ export function commentEditRoutes(deps) {
|
|
|
26
26
|
const [row] = await maintenance(sql, (tx) => tx `
|
|
27
27
|
SELECT c.id, c.org_id, c.project_id, c.thread_id, c.author_id, c.body, c.private,
|
|
28
28
|
c.created_at, c.deleted_at,
|
|
29
|
-
t.private AS thread_private,
|
|
30
|
-
r.name AS author_name, r.kind AS author_kind
|
|
29
|
+
t.private AS thread_private, t.deleted_at AS thread_deleted_at,
|
|
30
|
+
r.name AS author_name, r.kind AS author_kind, r.user_id AS author_user_id
|
|
31
31
|
FROM comments c
|
|
32
32
|
JOIN threads t ON t.id = c.thread_id
|
|
33
33
|
JOIN reviewers r ON r.id = c.author_id
|
|
@@ -46,7 +46,18 @@ export function commentEditRoutes(deps) {
|
|
|
46
46
|
const owner = c.get("owner");
|
|
47
47
|
const session = c.get("session");
|
|
48
48
|
const asOwner = !!owner && owner.orgId === row.org_id;
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* TWO ways to be the author, because there are two identity systems.
|
|
51
|
+
*
|
|
52
|
+
* A reviewer session's `sub` IS a `reviewers.id`. An owner has no `sub`:
|
|
53
|
+
* a dashboard reply is written under the studio member's own reviewer row
|
|
54
|
+
* (`studioReviewerId`, `user_id` set), so the owner is the author when THAT
|
|
55
|
+
* row's `user_id` is theirs. This used to read only the session half, so
|
|
56
|
+
* an owner could never edit their own reply — the "edit only their own"
|
|
57
|
+
* rule below was "edit nothing" for every dashboard comment ever written.
|
|
58
|
+
*/
|
|
59
|
+
const isAuthor = (!!session && session.sub === row.author_id) ||
|
|
60
|
+
(asOwner && !!row.author_user_id && row.author_user_id === owner.userId);
|
|
50
61
|
if (!asOwner && !session) {
|
|
51
62
|
return fail(c, 401, "unauthorized", "Sign in, or open your review link, and try again.");
|
|
52
63
|
}
|
|
@@ -105,7 +116,10 @@ export function commentEditRoutes(deps) {
|
|
|
105
116
|
/** Endpoint 12 — `PATCH /api/v1/comments/{id}`. */
|
|
106
117
|
const patch = async (c) => {
|
|
107
118
|
const row = await load(c.req.param("id"));
|
|
108
|
-
|
|
119
|
+
// A comment in a DELETED thread is gone with it. Without this a stale tab
|
|
120
|
+
// could edit words nobody can read any more, and the edit would bump the
|
|
121
|
+
// dead thread's `updated_at` for nothing.
|
|
122
|
+
if (!row || row.deleted_at || row.thread_deleted_at)
|
|
109
123
|
return fail(c, 404, "comment_not_found", "No such comment.");
|
|
110
124
|
const refused = refuse(c, row, "edit");
|
|
111
125
|
if (refused)
|
|
@@ -148,7 +162,8 @@ export function commentEditRoutes(deps) {
|
|
|
148
162
|
/** Endpoint 13 — `DELETE /api/v1/comments/{id}`. */
|
|
149
163
|
const remove = async (c) => {
|
|
150
164
|
const row = await load(c.req.param("id"));
|
|
151
|
-
|
|
165
|
+
// Same as the edit: the thread's deletion took its comments with it.
|
|
166
|
+
if (!row || row.thread_deleted_at)
|
|
152
167
|
return fail(c, 404, "comment_not_found", "No such comment.");
|
|
153
168
|
// Deleting twice is the same outcome as deleting once, and a reviewer who
|
|
154
169
|
// taps twice on a slow connection should not see an error for getting what
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commentEdit.js","sourceRoot":"","sources":["../../src/routes/commentEdit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAoB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA2C7C,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,SAAS,IAAI,CAAC,CAAM,EAAE,MAAc,EAAE,IAAY,EAAE,OAAe,EAAE,OAAiB;IACpF,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,EAC5F,MAAa,CACd,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,iEAAiE,CAAC;AAC/E,SAAS,KAAK,CAAC,IAAa,EAAE,MAAc;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;
|
|
1
|
+
{"version":3,"file":"commentEdit.js","sourceRoot":"","sources":["../../src/routes/commentEdit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { inOrg } from "../db/scope.js";
|
|
3
|
+
import { fetchPublicImage, PublicFetchError } from "../net/publicFetch.js";
|
|
4
|
+
/** Large hero images are a few MB; anything past this is not a web picture. */
|
|
5
|
+
export const PROXY_MAX_BYTES = 10 * 1024 * 1024;
|
|
6
|
+
/** A page with a slow image host should not hold a screenshot for long. */
|
|
7
|
+
export const PROXY_TIMEOUT_MS = 8_000;
|
|
8
|
+
/** A busy page has dozens of images; this is a ceiling, not a target. */
|
|
9
|
+
export const PROXY_PER_MINUTE = 240;
|
|
10
|
+
const RATE_WINDOW_MS = 60_000;
|
|
11
|
+
function fail(c, status, code, message) {
|
|
12
|
+
return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
|
|
13
|
+
}
|
|
14
|
+
const STATUS = {
|
|
15
|
+
bad_url: 422,
|
|
16
|
+
blocked_address: 422,
|
|
17
|
+
not_an_image: 415,
|
|
18
|
+
too_large: 413,
|
|
19
|
+
upstream: 502,
|
|
20
|
+
timeout: 504,
|
|
21
|
+
too_many_redirects: 502,
|
|
22
|
+
};
|
|
23
|
+
export function imageProxyRoutes(deps) {
|
|
24
|
+
const app = new Hono();
|
|
25
|
+
const { sql, projects } = deps;
|
|
26
|
+
app.get("/api/v1/projects/:uid/image", async (c) => {
|
|
27
|
+
const project = await projects.get(c.req.param("uid"));
|
|
28
|
+
if (!project)
|
|
29
|
+
return fail(c, 404, "project_not_found", "No project with that uid.");
|
|
30
|
+
const session = c.get("session");
|
|
31
|
+
if (!session)
|
|
32
|
+
return fail(c, 401, "unauthorized", "Open your review link, or reload the page, and try again.");
|
|
33
|
+
const src = c.req.query("src");
|
|
34
|
+
if (!src)
|
|
35
|
+
return fail(c, 400, "validation_failed", "Which image? Pass it as ?src=.");
|
|
36
|
+
const now = new Date();
|
|
37
|
+
const windowStart = new Date(now.getTime() - RATE_WINDOW_MS);
|
|
38
|
+
const [counter] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
39
|
+
INSERT INTO rate_counters (org_id, bucket_key, window_start, count, expires_at)
|
|
40
|
+
VALUES (${project.org_id}, ${`img:${session.sid}`}, ${now}, 1,
|
|
41
|
+
${new Date(now.getTime() + RATE_WINDOW_MS)})
|
|
42
|
+
ON CONFLICT (org_id, bucket_key) DO UPDATE
|
|
43
|
+
SET count = CASE WHEN rate_counters.window_start < ${windowStart} THEN 1
|
|
44
|
+
ELSE rate_counters.count + 1 END,
|
|
45
|
+
window_start = CASE WHEN rate_counters.window_start < ${windowStart} THEN ${now}
|
|
46
|
+
ELSE rate_counters.window_start END,
|
|
47
|
+
expires_at = ${new Date(now.getTime() + RATE_WINDOW_MS)}
|
|
48
|
+
RETURNING count::text
|
|
49
|
+
`);
|
|
50
|
+
if (Number(counter?.count ?? 0) > PROXY_PER_MINUTE) {
|
|
51
|
+
return fail(c, 429, "rate_limited", "Too many images in a minute. The rest keep their placeholders.");
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const { bytes, contentType } = await fetchPublicImage(src, {
|
|
55
|
+
maxBytes: PROXY_MAX_BYTES,
|
|
56
|
+
timeoutMs: PROXY_TIMEOUT_MS,
|
|
57
|
+
...deps.fetchOptions,
|
|
58
|
+
});
|
|
59
|
+
// Private and short: it is the same picture the reviewer's browser just
|
|
60
|
+
// loaded, cached for the next capture on this page and nowhere else.
|
|
61
|
+
c.header("Cache-Control", "private, max-age=300");
|
|
62
|
+
c.header("Content-Type", contentType);
|
|
63
|
+
// An SVG is drawn through an <img>, where scripts do not run; the
|
|
64
|
+
// policy makes sure that holds if anything ever opens it directly.
|
|
65
|
+
c.header("Content-Security-Policy", "default-src 'none'; style-src 'unsafe-inline'; sandbox");
|
|
66
|
+
c.header("X-Content-Type-Options", "nosniff");
|
|
67
|
+
return c.body(bytes);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
if (e instanceof PublicFetchError)
|
|
71
|
+
return fail(c, STATUS[e.code], e.code, e.message);
|
|
72
|
+
throw e;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return app;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=imageProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageProxy.js","sourceRoot":"","sources":["../../src/routes/imageProxy.ts"],"names":[],"mappings":"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"}
|