Commit Graph
268 Commits
Author SHA1 Message Date
ancsemi c8c8fbcf3c Release 4.25.0 2026-10-16 12:50:58 -04:00
ancsemi 085563b37c Release 4.24.0 2026-10-15 15:22:01 -04:00
ancsemi 2b93553420 Update better-sqlite3 to 12.11.1, which stops random crashes at exit on Node 26 2026-10-15 12:38:49 -04:00
ancsemi a4a9f750aa Approve better-sqlite3 and esbuild install scripts so fresh installs stop warning 2026-10-14 22:58:16 -04:00
ancsemi bb5b699dec Release 4.23.0 2026-10-14 01:24:30 -04:00
ancsemi aac3a50849 Release 4.22.0 2026-10-12 14:04:59 -04:00
ancsemi b69bea7fe4 Release 4.21.0 2026-10-10 18:35:37 -04:00
ancsemi d3e8e0184e Remove the unused Inno Setup installer scripts 2026-10-10 18:08:54 -04:00
ancsemi 45e3f6daea Docs: Node 22 to 26, and mention the optional voice relay 2026-10-10 16:13:59 -04:00
ancsemi 44a51b2c6e Update music-metadata to 11.16 for two audio file parsing fixes (an MP4 infinite loop and unbounded EBML lengths) 2026-10-09 13:28:21 -04:00
ancsemi 041a21abe6 Release 4.20.0 2026-10-09 13:17:02 -04:00
ancsemi 4bd2be4f11 Release 4.19.0 2026-10-06 02:15:30 -04:00
ancsemi 3643487f2c Release 4.18.0 2026-10-04 11:53:34 -04:00
Josh Stevenson-WoodsandJosh Stevenson-Woods e84e562b53 Add manual plugin and theme updates (#5588)
* docs: propose extension release and blocklist contracts

* feat: add manual plugin and theme updates

---------

Co-authored-by: Josh Stevenson-Woods <5860234+jkswoods@users.noreply.github.com>
2026-10-03 15:35:49 -04:00
ancsemi 9001af5425 Release 4.17.0 2026-10-02 11:42:05 -04:00
ancsemi 5bfcde9b7b Release 4.16.0 2026-10-01 00:20:45 -04:00
ancsemi 768b7930ab Update multer to 2.4.0: an upload aborted partway no longer leaves its partial file behind on disk (Dependabot alert 1) 2026-09-29 18:02:49 -04:00
ancsemi 0713a61eba Release 4.15.0 2026-09-27 21:15:39 -04:00
ancsemi 2da9c91c0c The voice relay installs on demand: an Install the relay button in Large Server Setup downloads it (about 10 MB) into the data folder with plain progress steps, so normal installs and updates never fetch it, Haven updates leave it in place, and it starts without a restart 2026-09-27 13:10:14 -04:00
ancsemi 61a13b1d7f Voice relay (off by default): with the built-in relay on, each person in a call sends once to the server, which passes it on, so calls are no longer capped by everyone's upload. Mic, camera and screen go through it; bots and apps without relay support still connect directly in the same call; calls recover on their own after a server restart and move to direct connections if the relay is turned off. mediasoup is an optional dependency, so an install without it keeps working peer to peer 2026-09-27 03:44:53 -04:00
ancsemi 54601dcd06 Release 4.14.0 2026-09-26 16:41:40 -04:00
ancsemi 0a5d36dd16 Release 4.13.0 2026-09-24 17:54:08 -04:00
ancsemi d6173eb210 Flash games load the Ruffle player from Haven itself: pinned as a dependency instead of the newest build from unpkg, and no page's CSP lists unpkg any more 2026-09-23 23:38:50 -04:00
ancsemi 35cff8914a Release 4.12.0 2026-09-23 23:15:57 -04:00
ancsemi dda4421c68 Release 4.11.0 2026-09-21 22:12:13 -04:00
ancsemi 0625bce9d1 Release 4.10.0 2026-09-18 23:01:24 -04:00
ancsemi 79b3ba250c Release 4.9.0 2026-09-15 20:37:03 -04:00
ancsemi 33b1c38666 Release 4.8.0 2026-09-12 20:55:55 -04:00
ancsemi db0b3776e8 Release 4.7.0 2026-09-11 00:40:54 -04:00
ancsemi 7061f0c740 Release 4.6.1 2026-09-09 20:18:14 -04:00
ancsemi e69ee6753c Release 4.6.0 2026-09-09 00:13:11 -04:00
ancsemi 158d166495 Release 4.5.0 2026-09-07 20:42:10 -04:00
ancsemi 605f4f430c Release 4.4.1 2026-09-05 17:57:27 -04:00
ancsemi 4fd0264090 Release 4.4.0 2026-09-05 17:10:18 -04:00
ancsemi b34181495e Release 4.3.0 2026-09-03 00:42:34 -04:00
AmnibroandCursor daefc658f2 Group DM E2E: crypto core, key distribution, and tests (#5499)
* Group DM E2E: crypto core, key distribution, and tests

Implements the design in docs/group-dm-e2e-plan.md far enough to prove the
properties hold. No UI yet — this is the layer everything else sits on.

public/js/e2e-group.js holds the primitives, deliberately free of storage,
sockets and DOM so the same file runs in the browser and under node --test.
Confidentiality comes from an AES-256 epoch key wrapped per member over the
pairwise ECDH secret that already exists; authenticity from an ECDSA P-256
signature over a digest binding channel, epoch, sender and the previous
message. Verification happens before decryption and a rejected message
returns null plaintext, so a forgery cannot be rendered by mistake.

The signature is what makes one shared group key safe: every member can
decrypt, only a key holder can author.

src/socketHandlers/groupE2E.js distributes wrapped blobs the server cannot
open, while enforcing what no client can check for itself — only a member
may publish an epoch, epochs are strictly sequential, a member reads only
their own blob, and an epoch must cover exactly the current membership.
That last rule stops a member publishing an epoch that silently omits
someone, locking them out of a conversation the UI still shows them in.

Two suites, 28 tests, runnable with npm test. The crypto suite is written
as attacks rather than happy paths: forging as another member, re-attributing
a genuine message, tampering, stripping the signature, replaying into another
channel or epoch, reading an epoch you were not given, and unwrapping a key
not wrapped for you. It also asserts scrollback still decrypts across several
rotations, which is the regression a per-message ratchet would have caused,
and that concurrent sends sharing a prev do not false-alarm.

Confirmed the suite is load-bearing by disabling the signature check: exactly
the five attack tests fail and nothing else.

* Group DMs invite instead of auto-joining, and rewraps require a request.

Addresses review on #5499: drop leftover setup.js, consent plus roster
dedup on start-group-dm, and pin rewraps to a prior request plus the
recipient's TOFU public key.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 22:00:38 -04:00
ancsemi 97c65fb93a Make npm test run the suite serially so it can be trusted
There was no test script, so the suite was run by hand with a glob and Node's
default parallelism. Under that, the bot audio integration test intermittently
took down its spawned server with an access violation on Windows, which reads
as a product failure and is not one: it passes alone, paired, and serially.
Several test files each start a real server, and enough of them at once is what
does it.

Serial is slower and correct, which is the right way round for a suite this
size. 91 of 91 pass.
2026-09-01 00:41:04 -04:00
ancsemi 7db1e7f574 Release 4.2.0 2026-09-01 00:15:17 -04:00
ancsemi 6f080487bc Release 4.1.0 2026-08-30 00:43:14 -04:00
Bernardo Costa 3b14588bae Add dynamic bot voice audio (#5540)
* Add dynamic bot voice audio

* Close bot audio review gaps
2026-08-29 23:43:44 -04:00
ancsemi 9e37f5118f Release 4.0.0
Bumps the version, adds the CHANGELOG entry, and updates the download links
and version history on both site files.

The major number reflects the size of the release rather than a break in
compatibility. There are no migration steps: the schema changes only add, and
Ferry ships switched off. The notes say plainly that it touches shared code and
that Ferry has not been through a real deployment, and recommend a backup
first, because promising that nothing breaks is not something this release has
earned yet.
2026-08-27 18:42:34 -04:00
ancsemi 7b7c47f669 Add Ferry, a two-way Haven and Discord message bridge (server side)
Each Haven server brings its own Discord bot, since Discord caps unverified
applications at 100 guilds. Reading uses a gateway WebSocket, because Discord
has no outgoing webhook for new messages. Writing uses a per-pairing Discord
channel webhook rather than the bot user, which is the only way a relayed
message can carry the Haven author's own name and avatar.

Pairings live in ferry_links and act as the allowlist, not just a routing
table: a member can only reach Discord channels an admin paired with the Haven
channel they are standing in. Each pairing picks its own direction (two way, or
either one way) and its own outgoing mode (mirror everything, or only messages
addressed with the "=>" prefix). Sending needs the new use_ferry permission.

The trigger is "=>" and not ">>" because a leading ">" is Haven's blockquote
marker, so an unresolved target would render as a quote instead of visibly
failing. Resolved targets are stripped from the stored message and recorded in
messages.ferry_target so history shows a destination badge instead of raw
routing syntax.

Loop prevention drops the gateway echo of our own webhook ids and, by default,
every other bot. Mentions are blocked by default so one member cannot ping a
whole Discord server through the bridge. DMs are off by default, outbound only,
and stamped with the author's name, since a bot cannot impersonate in a DM.

ws becomes a direct dependency; it was only reaching us through socket.io.
2026-08-27 15:17:17 -04:00
ancsemi 7afb3586b9 Release 3.50.0 2026-08-25 21:36:30 -04:00
ancsemi f5f9a4e52b Release 3.49.0 2026-08-22 11:47:44 -04:00
ancsemi 8c6ef99194 Release 3.48.0
Covers everything since v3.47.0, including the eight commits that were
pushed after that tag and never released: the invite buttons, the upload
cancel button, unban for moderators who can ban, the sub-channel nesting
permission fix, the Braid Layout fixes, and the group DM encryption design.
2026-08-18 22:40:39 -04:00
ancsemi 11d1a26454 3.47.0 2026-08-13 12:28:28 -04:00
ancsemi 0582584c5e 3.46.0 2026-08-11 02:36:42 -04:00
ancsemi 774644ad7e 3.45.0 2026-08-10 01:00:25 -04:00
ancsemi e3d6278ab1 3.44.2 2026-08-09 18:44:27 -04:00
ancsemi 7bad2e2599 3.44.1 2026-08-09 10:24:29 -04:00