Thomas Durieux
8de4a536cc
fix: recover legacy repository owners through GitHub ( #799 )
2026-09-08 13:39:39 +02:00
Thomas Durieux
3fb376dd53
fix: encrypt stored GitHub credentials ( #797 )
2026-09-08 13:04:28 +02:00
tdurieux
9f00641529
fix: preserve the year in default conference end dates
2026-09-06 10:47:59 +02:00
tdurieux
681f72f75c
fix: inject the translator for profile save errors
2026-09-06 10:47:53 +02:00
tdurieux
793e926463
fix: cancel status polling when the view is destroyed
2026-09-06 10:47:47 +02:00
tdurieux
cac76ad7b6
fix: select the PR diff tab after content loads
2026-09-06 10:47:32 +02:00
tdurieux
5c6e5b6519
fix: anonymize PR comment authors and bodies in previews
2026-09-06 10:47:26 +02:00
tdurieux
66e4be0a0c
fix: reload PR and Gist views when resource IDs change
2026-09-06 10:47:20 +02:00
tdurieux
a6e17e18d9
fix: clear failed searches without racing subsequent requests
2026-09-06 10:47:09 +02:00
tdurieux
a27f9f34d6
fix: reload explorer state when repository identity changes
2026-09-06 10:47:03 +02:00
tdurieux
b6c0d3a8ed
fix: ignore stale file responses after viewer navigation
2026-09-06 10:46:57 +02:00
tdurieux
b2dfda1838
fix: sanitize Org previews before trusting rendered HTML
2026-09-06 10:46:44 +02:00
tdurieux
cf58aa330b
fix: handle prototype property names in repository trees
2026-09-06 10:46:38 +02:00
tdurieux
d793d2c7c6
fix: bind file tree names without compiling repository content
2026-09-06 10:46:32 +02:00
tdurieux
b070d7e281
fix: evaluate document creation timestamps per instance
2026-09-06 09:19:33 +02:00
tdurieux
f312105ec3
fix: fetch private pull request diffs through authenticated API
2026-09-06 09:19:28 +02:00
tdurieux
4aecc1d92f
fix: fetch complete content for truncated Gist files
2026-09-06 09:19:23 +02:00
tdurieux
b1cb9093bb
fix: close streaming responses after upstream errors
2026-09-06 09:19:18 +02:00
tdurieux
38a09188ad
fix: expire conference repositories before completing expiration
2026-09-06 09:18:42 +02:00
tdurieux
6777537d44
fix: restrict S3 deletion to exact keys and descendants
2026-09-06 09:18:37 +02:00
tdurieux
5e84bfaa5b
fix: surface partial S3 object deletion failures
2026-09-06 09:18:32 +02:00
tdurieux
4643e9f838
fix: preserve and anonymize truncated folder warnings
2026-09-06 09:18:28 +02:00
tdurieux
8d2921b406
fix: respect backpressure when resolving Git LFS pointers
2026-09-06 09:18:24 +02:00
tdurieux
9c18526d52
fix: decode and validate webview file paths
2026-09-06 09:17:56 +02:00
tdurieux
67eb83674c
fix: sandbox repository webview documents
2026-09-06 09:17:52 +02:00
tdurieux
3e275311f1
fix: derive file ETags from current source content
2026-09-06 09:17:47 +02:00
tdurieux
c14a548cb9
fix: enforce content policies using original file types
2026-09-06 09:17:42 +02:00
tdurieux
7210db2b61
fix: catch authentication failures in async route handlers
2026-09-06 09:17:37 +02:00
tdurieux
11eb160d2b
fix: prevent stale downloads from reviving removed repositories
2026-09-06 09:17:33 +02:00
tdurieux
2af66cd1b6
fix: authorize coauthors by stable GitHub identity
2026-09-06 09:17:01 +02:00
tdurieux
8ec656c201
fix: authorize access before returning cached GitHub metadata
2026-09-06 09:16:57 +02:00
tdurieux
a401bb21d6
fix: reject OAuth linking across different GitHub identities
2026-09-06 09:16:53 +02:00
tdurieux
50d606d0c1
fix: bound regex execution during anonymization
2026-09-06 09:16:48 +02:00
tdurieux
b3f86513dd
fix: prevent anonymization leaks across stream boundaries
2026-09-06 09:16:44 +02:00
tdurieux
900516f225
fix: omit source content length for rewritten file responses
2026-09-06 09:16:23 +02:00
tdurieux
12c07641e0
fix: persist and recover repository removals for banned owners
2026-09-06 09:16:20 +02:00
tdurieux
f5f44c2511
fix: preserve removal intent when Redis enqueue fails
2026-09-06 09:16:17 +02:00
tdurieux
12b0bb52c0
fix: ignore stale removal jobs after repository restoration
2026-09-06 09:16:13 +02:00
Archit Rastogi
420fa9e450
fix: clip overflowing conference link in dashboard table ( #790 )
...
The Conference cell is a grid item with the default min-width:auto,
so a long unbroken URL forces the grid track wider than its
minmax(140px, 1fr) size and bleeds visually into the Status column.
Clip it with overflow:hidden/ellipsis and expose the full value via
a title attribute.
2026-08-26 21:47:23 +02:00
Thomas Durieux
adb0dcaec2
fix: reactivate removed repositories after edits ( #784 )
2026-08-20 14:33:09 +02:00
Thomas Durieux
7b585fdefd
Fix BullMQ removal processor arguments ( #783 )
2026-08-20 14:23:21 +02:00
Thomas Durieux
35c3b1804b
Fix repository cleanup after removal and expiration ( #782 )
2026-08-20 12:52:19 +02:00
Thomas Durieux
46e956a779
fix: reactivate repositories with future expiration ( #781 )
2026-08-20 12:29:52 +02:00
tdurieux
f0fdd9250b
fix: improve pdf rendering and html
2026-08-06 14:35:21 -07:00
Thomas Durieux
debd83c079
feat: add optional MongoDB replica deployment ( #765 )
2026-07-30 02:28:19 +02:00
Thomas Durieux
f040557ae8
fix: preserve state across backend updates ( #756 )
2026-07-22 04:29:58 +02:00
Thomas Durieux
beef8387ae
fix: close account authorization gaps ( #755 )
2026-07-22 04:29:04 +02:00
Thomas Durieux
aab6ccf7fc
fix: harden anonymization privacy paths ( #754 )
2026-07-22 04:28:01 +02:00
Thomas Durieux and Claude Fable 5
6a820408a1
fix: rate-limit visitors by real IP regardless of Cloudflare proxy hops ( #750 )
...
Since the night of 2026-07-16 production keyed the rate limiter on
Cloudflare edge IPs instead of visitor IPs: every visitor routed through
the same edge shared one 175-req/15min bucket, causing widespread 429s
(confirmed by probing: sequential requests alternated 200/429 across
fresh and exhausted buckets).
Root cause: 'trust proxy' used a fixed hop count (TRUST_PROXY=1), which
silently breaks whenever the proxy chain gains or loses an
X-Forwarded-For entry (e.g. a Cloudflare-side change).
- TRUST_PROXY now accepts a comma-separated subnet list; the new default
'loopback,uniquelocal,cloudflare' expands Cloudflare's published IP
ranges so Express skips trusted proxies no matter how many entries
they add. Plain numbers keep the legacy hop-count behavior.
- If resolution still stops at a Cloudflare address (visitor missing
from X-Forwarded-For entirely), the limiter key falls back to
cf-connecting-ip — safe because request.ip can only be a Cloudflare
address when the whole chain to it is trusted.
- CIDR matching uses Node's built-in net.BlockList (no new dependency).
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-07-17 06:44:21 +02:00
tdurieux
1c1993f972
fix: try to fix gist
2026-07-02 14:53:26 +03:00