You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,6 +14,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). Haven uses [Sema
14
14
## [Unreleased]
15
15
16
16
### Added
17
+
-**#5389: Per-channel default role.** Channel Functions → "Default Role" picks a server role that gets auto-granted (channel-scoped) to every current member and to anyone who joins later. Setting it backfills all existing members in one transaction; clearing it leaves prior grants in place so admins can decide whether to revoke from the Roles UI. New `channels.default_role_id` column (nullable FK → roles, SET NULL on delete), new `set-channel-default-role` socket event gated on `manage_roles`, and the auto-grant fires through the public-join, server-code, and vanity-code join paths. DMs are excluded since they have no roles. `INSERT OR IGNORE` on `user_roles (user_id, role_id, channel_id)` keeps repeated joins idempotent.
17
18
-**#5392: Admin-adjustable max sticker file size.** Stickers had a hard-coded 1 MB ceiling that made them feel cramped compared to images — small enough that most "GIF library" candidates failed to upload. Admin Settings → Uploads & Limits now has a "Max Sticker File Size (KB)" input (256–10240 KB, default 1024). The server already read `max_sticker_kb` per-upload via `createStickerUpload()`, so this just surfaces and validates the setting. Bump it up if you want stickers to double as a GIF library.
18
19
-**#5393: `/break` slash command + persona compacting hard-stop.** Different personas sent in quick succession under the same account were sometimes still visually compacting into a single grouped block for *other* viewers (not the poster — they saw it correctly), making the personas indistinguishable. Three defensive layers now: (1) the grouping check also compares `persona_username` and the displayed `username`, so even if a stale or missing `persona_id` slips through the wire the displayed name still forces a break; (2) a new `break_chain` column on `messages` lets any message hard-stop compaction with the previous one; (3) the new `/break <message>` slash command (also surfaced in the autocomplete list) lets users manually force a fresh group whenever they want, including for normal non-persona messages. The flag round-trips through the SELECT projections, the broadcast object, and the rendered DOM data-attrs so it survives reconnects, history pagination, and DOM trimming.
19
20
- **#5300: Admin password reset (opt-in) backend.** New `admin_password_reset_enabled` server setting (default `false`) lets admins enable a "reset user password to a one-time temp value" flow. New socket event `admin-reset-user-password` (admin-only, gated on the setting) generates a 16-hex-char temp password (`XXXX-XXXX-XXXX-XXXX`), bcrypt-hashes it, bumps `password_version` (which invalidates the target's existing JWTs via the existing pwv-rejection path), sets a new `must_change_password` flag on the user row, and returns the plaintext temp password to the admin once. Audit-logged as `admin_password_reset`. Login response now carries `mustChangePassword: bool`, and a new `POST /api/auth/change-password-required` endpoint accepts a valid token + new password and clears the flag. The setting is also mirrored into `/api/public-config` so any user can see whether admins on this server have this power before signing up. Admin Settings has a checkbox + warning text covering the E2E impact (the user's wrap key derives from the password, so old encrypted DM history becomes unrecoverable on their side, matching the existing recovery-codes flow). Backend by @Amnibro (#5318).
<divclass="cfn-row" data-fn="default-role" data-i18n-title="channel_functions.default_role_hint" title="Auto-grant this role (scoped to this channel) to every current and future member">
<divclass="cfn-row cfn-afk-row" data-fn="afk-sub" style="display:none" data-i18n-title="channel_functions.afk_sub_hint" title="Designate a sub-channel as the AFK voice room — idle users are moved here">
socket.emit('error-msg','Failed to set default role');
790
+
}
791
+
});
792
+
708
793
socket.on('set-sort-alphabetical',(data)=>{
709
794
if(!data||typeofdata!=='object')return;
710
795
if(!socket.user.isAdmin&&!userHasPermission(socket.user.id,'create_channel'))returnsocket.emit('error-msg','You don\'t have permission to change sort settings');
0 commit comments