Compare commits

..

874 commits

Author SHA1 Message Date
f55f99b648 Merge tag 'v4.5.3' into chinwag-next 2026-01-03 11:58:16 +11:00
Claire
86cff1abca
Bump version to v4.5.3 (#37142) 2025-12-08 16:20:15 +01:00
Claire
e6d2fc869b
Merge commit from fork 2025-12-08 15:44:08 +01:00
github-actions[bot]
a9f8268a75
New Crowdin Translations for stable-4.5 (automated) (#37158)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-12-08 12:56:49 +01:00
Claire
dfe269439a Fix “Delete and Redraft” on a non-quote being treated as a quote post in some cases (#37140) 2025-12-05 16:50:07 +01:00
Echo
9bc9ebc59e Fixes YouTube embeds (#37126) 2025-12-05 11:15:16 +01:00
Claire
a6d31c0ccf Fix streamed quoted polls not being hydrated correctly (#37118) 2025-12-05 11:15:16 +01:00
David Roetzel
1e2cf6c964 Fix creation of duplicate conversations (#37108) 2025-12-05 11:15:16 +01:00
Echo
c42c71c90a Remove noreferrer from external links (#37107) 2025-12-05 11:15:16 +01:00
Claire
782e410719 Make settings-related database migrations more robust (#37079) 2025-12-05 11:15:16 +01:00
Claire
b0c141e658 Fix error handling when re-fetching already-known statuses (#37077) 2025-12-05 11:15:16 +01:00
diondiondion
1ef4bbd88d Fix post navigation in single-column mode when Advanced UI is enabled (#37044) 2025-12-05 11:15:16 +01:00
Claire
240d38b7c0 Fix tootctl status remove removing quoted posts and remote quotes of local posts (#37009) 2025-12-05 11:15:16 +01:00
Claire
770d1212bb Increase HTTP read timeout for expensive S3 batch delete operation (#37004) 2025-12-05 11:15:16 +01:00
Claire
86e463c0e8 Fix compose autosuggest always lowercasing token (#36995) 2025-12-05 11:15:16 +01:00
Matt Jankowski
a04a210e14 Suggest ES image version 7.17.29 in docker compose (#36972) 2025-12-05 11:15:16 +01:00
67796ae1e5 Merge tag 'v4.5.2' into chinwag-next 2025-12-01 15:19:31 +11:00
Claire
19588756ef
Bump version to v4.5.2 (#36944) 2025-11-20 14:41:09 +01:00
github-actions[bot]
e398ff40b2
New Crowdin Translations for stable-4.5 (automated) (#36945)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-11-20 13:40:31 +01:00
Claire
96eb687524 Fix missing fallback link in CW-only quote posts (#36963) 2025-11-20 12:56:41 +01:00
Claire
05c624cfa7 Fix statuses without text disappearing on reload (#36962) 2025-11-20 12:56:41 +01:00
Claire
5fe316b2e9
Update dependency glob (#36941) 2025-11-19 16:29:35 +01:00
diondiondion
1dbf10198d Fix g + h keyboard shortcut not working when a post is focused (#36935) 2025-11-19 15:20:01 +01:00
Claire
c6ccacdf7b Fix quoting overwriting current content warning (#36934) 2025-11-19 15:20:01 +01:00
Claire
6ccd9c2f1f Fix scroll-to-status in threaded view being unreliable (#36927) 2025-11-19 15:20:01 +01:00
Claire
261d9b33fe Change private quote education modal to not show up on self-quotes (#36926) 2025-11-19 15:20:01 +01:00
Claire
4ee21c2e29 Fix double encoding in links (#36925) 2025-11-19 15:20:01 +01:00
Echo
c08cd6d62a Emoji: Fix path resolution for emoji worker (#36897) 2025-11-19 15:20:01 +01:00
Shugo Maeda
44d45e5705 Fix ArgumentError of tootctl upgrade storage-schema (#36914) 2025-11-19 15:20:01 +01:00
Claire
27c67f1750 Fix cross-origin handling of CSS modules (#36890) 2025-11-19 15:20:01 +01:00
renovate[bot]
bb28552859 chore(deps): update dependency js-yaml to v4.1.1 [security] (#36891)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-19 15:20:01 +01:00
Echo
6486c092f6 Fix error with remote tags including percent signs (#36886) 2025-11-19 15:20:01 +01:00
Claire
a7b45682a6 Fix bogus quote approval policy not always being replaced correctly (#36885) 2025-11-19 15:20:01 +01:00
Claire
5a57c0844a Fix hashtag completion not being inserted correctly (#36884) 2025-11-19 15:20:01 +01:00
diondiondion
1d081250f4 Fix Cmd/Ctrl + Enter in the composer triggering confirmation dialog action (#36870) 2025-11-19 15:20:01 +01:00
b5c296bad5 Merge branch 'chinwag-next' of git.chinwag.org:chinwag/chinwagsocial into chinwag-next 2025-11-16 13:25:57 +11:00
f7a765d3be Missing icon colour override 2025-11-16 13:22:28 +11:00
08b59bc6c0 Update prerelease version 2025-11-16 13:07:33 +11:00
9c99596ff2 Merge tag 'v4.5.1' into chinwag-next 2025-11-16 12:59:46 +11:00
Claire
bb6093c315 Bump version to v4.5.1 2025-11-13 17:12:07 +01:00
Claire
058f704c21 Fix error when sending new posts (#36869) 2025-11-13 17:12:07 +01:00
diondiondion
6baa8f2466 Fix Cmd/Ctrl + Enter not submitting Alt text modal on some browsers (#36866) 2025-11-13 17:12:07 +01:00
github-actions[bot]
e742eff044
New Crowdin Translations for stable-4.5 (automated) (#36864)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-11-13 15:46:34 +01:00
Claire
55b9d21537 Fix posts coming from public/hashtag streaming being marked as unquotable (#36860) 2025-11-13 15:24:58 +01:00
Claire
59f0134578 Fix Update importing old previously-unknown activities and treating them as recent ones (#36848) 2025-11-13 15:24:58 +01:00
Echo
28b9e9087a Fix deprecation warning in Vite (#36849) 2025-11-13 15:24:58 +01:00
diondiondion
fa2cc409ce Fixes blank screen in browsers that don't support Intl.DisplayNames (#36847) 2025-11-13 15:24:58 +01:00
Claire
8a100d84c5 Fix filters not being applied to quotes in detailed view (#36843) 2025-11-13 15:24:58 +01:00
Echo
9ae0464e8f Emoji: Load emoji with hash in URL (#36808) 2025-11-13 15:24:58 +01:00
diondiondion
9eea4479e1 Fix scroll shift caused by fetch-all-replies alerts (#36807) 2025-11-13 15:24:58 +01:00
diondiondion
30103fd2c8 Fix dropdown menu not focusing first item when opened via keyboard (#36804) 2025-11-13 15:24:58 +01:00
Claire
a9a7ad62f1 Update dependency rollup from 4.46.2 to 4.46.4 (#36781) 2025-11-13 15:24:58 +01:00
Claire
ea663cf7c7 Fix /api/v1/statuses/:id/context sometimes returing Mastodon-Async-Refresh without result_count (#36779) 2025-11-13 15:24:58 +01:00
Claire
fbe05d42fb Fix prepared quote not being discarded with contents when replying (#36778) 2025-11-13 15:24:58 +01:00
740cb53aeb Fix Vagrantfile NFS 2025-11-12 21:40:52 +11:00
1ab7b55016 Change default quote policy 2025-11-10 12:14:42 +11:00
03f3bf3d34 Bump pre-release versions 2025-11-10 01:06:36 +11:00
4ca96f846a CRLF 2025-11-10 00:51:20 +11:00
cb700a77c7 Sync package info with v4.5.0 2025-11-10 00:44:48 +11:00
c2a601b12d Quote icon colour fixes 2025-11-10 00:41:04 +11:00
c1da9de5c6 Make quick boosting the default 2025-11-10 00:10:42 +11:00
b7aeafa035 Merge tag 'v4.5.0' into chinwag-next 2025-11-09 22:18:23 +11:00
0a94d60adb Bump pre-release version 2025-11-09 22:00:58 +11:00
8e2c0d4736 TangerineUI 2.5.1 base styles 2025-11-09 21:58:51 +11:00
Claire
29ae9c9c4b
Add 4.5.x to the list of supported branches (#36761) 2025-11-06 17:12:41 +01:00
Claire
26c78392f8
Bump version to v4.5.0 (#36732) 2025-11-06 12:39:07 +01:00
github-actions[bot]
048430f4e8
New Crowdin Translations for stable-4.5 (automated) (#36745)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-11-06 11:37:54 +01:00
Echo
d45b4db1d7 Fix: correctly dismisses announcement when viewed (#36750) 2025-11-06 11:23:46 +01:00
Echo
ef3a95affc Add default visualizer for audio upload without poster (#36734) 2025-11-06 10:34:12 +01:00
diondiondion
3e6a9371b0 Fix spoiler toggle button being able to submit compose form (#36736) 2025-11-06 10:34:12 +01:00
Claire
e91c764590 Bump version to v4.5.0-rc.3 2025-11-05 09:59:00 +01:00
Claire
cfdd9396c0 Change paste-link-to-quote loading state from generic loading bar to compose placeholder (#36695) 2025-11-05 09:59:00 +01:00
Claire
ba498ae779 Change quote action to error instead of insert link in Private Mentions (#36721) 2025-11-05 09:59:00 +01:00
Echo
5bae08d1ff Quote Posts: Add notifications for DMs and private posts (#36696) 2025-11-05 09:59:00 +01:00
Echo
5253527ec4 Add CSS Module support (#36637) 2025-11-05 09:59:00 +01:00
Claire
0b50789c5b Fix Skeleton placeholders being animated when setting to reduce animations is enabled (#36716) 2025-11-05 09:59:00 +01:00
Claire
a978e37f4c Fix quote dropdown menu item in detailed status view (#36704) 2025-11-05 09:59:00 +01:00
Claire
dd708298a8 Remove option to disable access to local topic feeds for logged-in users (#36703) 2025-11-05 09:59:00 +01:00
renovate[bot]
449eb03f11 chore(deps): update dependency sidekiq to v8.0.9 (#36699)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-05 09:59:00 +01:00
renovate[bot]
1baede0a7c chore(deps): update dependency brakeman to v7.1.1 (#35434)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-05 09:59:00 +01:00
renovate[bot]
a7ecfc1ca5 fix(deps): update dependency @rails/ujs to v7.1.600 (#36634)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-05 09:59:00 +01:00
Claire
e62baacfc1 Increase number of quote approval job retries (#36698) 2025-11-05 09:59:00 +01:00
Rachael Wright-Munn
b5a6feb3bf Move "Privacy and reach" from "Public profile" to top-level navigation (#27294) 2025-11-05 09:59:00 +01:00
Claire
05964f571b Prevent creation of Private Mentions quoting someone who is not mentioned (#36689) 2025-11-05 09:59:00 +01:00
Claire
16a54f7158 Fix issuance of quote approval for remote private statuses (#36693) 2025-11-05 09:59:00 +01:00
Claire
6d53ca63d6 Disable paste-link-to-quote flow when composing Private Mentions (#36690) 2025-11-05 09:59:00 +01:00
renovate[bot]
93acfdd7d3 chore(deps): update dependency irb to v1.15.3 (#36682)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-05 09:59:00 +01:00
renovate[bot]
a209b8e544 chore(deps): update dependency rubyzip to v3.2.2 (#36687)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-05 09:59:00 +01:00
Claire
af4c372ab2 Bump version to v4.5.0-rc.2 2025-10-31 16:01:06 +01:00
diondiondion
aa579ce286 Fix initially selected language in Rules panel, hide selector when no alternative translations exist (#36672) 2025-10-31 16:01:06 +01:00
github-actions[bot]
adfabf8c80
New Crowdin Translations for stable-4.5 (automated) (#36670)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-31 14:51:18 +01:00
renovate[bot]
ea710df180 chore(deps): update dependency axios to v1.13.1 (#36633)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-31 14:09:36 +01:00
renovate[bot]
e1b6e28829 chore(deps): update dependency libvips to v8.17.3 (#36654)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-31 14:09:36 +01:00
diondiondion
214d59bd37 Show error when submitting empty post rather than failing silently (#36650) 2025-10-31 14:09:36 +01:00
Claire
e4291e9b05 Fix SMTP configuration with mail 2.9.0 (#36646) 2025-10-31 14:09:36 +01:00
Claire
2a9c7d2b9e
Fix quote-inline fallback being removed even for legacy quotes (#36638) 2025-10-29 11:56:34 +00:00
Claire
51877081b4
Bump version to v4.5.0-rc.1 (#36635) 2025-10-29 11:11:33 +00:00
github-actions[bot]
7b66eefd3e
New Crowdin Translations (automated) (#36632)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-29 10:13:42 +00:00
Claire
e437bb919f
Change display of blocked and muted quoted users (#36619) 2025-10-29 09:13:12 +00:00
Claire
4896d2c4c6
Change firehose labels depending on which feeds are accessible (#36607) 2025-10-28 16:59:37 +00:00
Renaud Chaput
795aaa14bf
Remove environment variables to config Fetch All Replies behaviour (#36627) 2025-10-28 15:58:18 +00:00
diondiondion
e1bd9b944a
chore(deps): update dependency eslint-plugin-jsdoc to v60 (#36466) 2025-10-28 15:17:33 +00:00
Claire
26ec19a649
Change styling of column banners (#36531) 2025-10-28 14:45:46 +00:00
Claire
b01d21c4d4
Hashtag fixes (#36625) 2025-10-28 14:26:08 +00:00
Claire
3ccb6632f2
Fix mention matching ignoring path (#36626) 2025-10-28 14:05:39 +00:00
Claire
8fb524e07f
Add support for Update of converted object types (#36322) 2025-10-28 14:05:14 +00:00
Echo
9c7d09993d
Fix props in DisplayName component (#36622) 2025-10-28 14:02:37 +00:00
renovate[bot]
3efc747be3
Update dependency axios to v1.13.0 (#36612)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 13:26:05 +00:00
renovate[bot]
1f5cdb30c7
Update dependency @vitejs/plugin-react to v5.1.0 (#36600)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 13:23:38 +00:00
renovate[bot]
3cace4098a
Update dependency devise-two-factor to v6.2.0 (#36574)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 13:23:32 +00:00
Claire
ccfac2716d
Add streaming server side filtering for live/topic feed settings (#36585) 2025-10-28 13:23:05 +00:00
diondiondion
422fa1cf9f
Revert "Fix custom emoji width (#27969)" (#36620) 2025-10-28 12:36:22 +00:00
renovate[bot]
2b5f6838ed
Update dependency annotaterb to v4.20.0 (#36527)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 11:59:21 +00:00
Echo
85d0cdb5f7
Emoji: Remove final flag (#36409) 2025-10-28 11:33:27 +00:00
renovate[bot]
e4fc18abfd
Update dependency simple_form to v5.4.0 (#36604)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 11:29:07 +00:00
renovate[bot]
e322c1777b
Update dependency webmock to v3.26.0 (#36605)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 11:27:54 +00:00
Nicholas La Roux
f53c4db05c
[Vite] Remove overridden build.target in favor of legacy plugin defaults (#36611) 2025-10-28 11:22:41 +00:00
renovate[bot]
4905c194b8
Update dependency mail to v2.9.0 (#36575)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 08:32:36 +00:00
renovate[bot]
7ba06a661c
Update dependency @reduxjs/toolkit to v2.9.2 (#36572)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-28 08:32:29 +00:00
github-actions[bot]
5d00ae7eb3
New Crowdin Translations (automated) (#36617)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-28 08:29:36 +00:00
Claire
4b42fe6aba
Change API behavior of reblogs wrt. quotes for consistency (#36559) 2025-10-28 08:05:23 +00:00
Claire
3bf99b8a4a
Fix URL comparison for mentions in case of empty path (#36613) 2025-10-27 18:19:52 +00:00
Echo
d0d09fd3a5
Emoji: Fix Web Worker import (#36603) 2025-10-27 17:36:01 +00:00
Eugen Rochko
76053fb4a9
Fix hashtags not being picked up when full-width hash sign is used (#36103)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2025-10-27 17:18:01 +00:00
David Roetzel
402686c76c
Remove http_message_signatures feature flag (#36610) 2025-10-27 16:06:44 +00:00
marousta
dc851c9efc
Fix custom emoji width (#27969) 2025-10-27 15:56:06 +00:00
Eugen Rochko
1dead10312
Change min. characters required for logged-out account search from 5 to 3 (#36487) 2025-10-27 15:52:21 +00:00
M.J. Fieggen (Joni)
e8382c7332
Fix layout of severed relationships when purged events are listed (#36593) 2025-10-27 15:19:38 +00:00
Eugen Rochko
bfcf21e915
Fix vacuums being interrupted by a single batch failure (#36606) 2025-10-27 14:22:54 +00:00
Matt Jankowski
b60bae6361
Handle unreachable network error for search services (#36587) 2025-10-27 13:28:56 +00:00
Claire
38f15a89fe
Fix recent settings migrations (#36602) 2025-10-27 12:24:24 +00:00
renovate[bot]
ab5b7e3776
Update dependency webauthn to v3.4.3 (#36599)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-27 10:21:12 +00:00
renovate[bot]
1230d05b18
Update dependency rubyzip to v3.2.1 (#36598)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-27 10:21:08 +00:00
Renaud Chaput
779a1f8448
Add a new setting to choose the server landing page (#36588) 2025-10-27 10:16:59 +00:00
github-actions[bot]
e40ca321ed
New Crowdin Translations (automated) (#36590)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-27 09:45:37 +00:00
renovate[bot]
5f837001e6
Update opentelemetry-ruby (non-major) (#36557)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-27 09:40:13 +00:00
Matt Jankowski
2640cf5317
Update stoplight to version 5.4.0 (#36581) 2025-10-27 09:38:01 +00:00
99461d3357 Merge tag 'v4.5.0-beta.2' into chinwag-next 2025-10-26 10:18:58 +11:00
diondiondion
1ba579b0a1
Fix "new post highlighting" in threads being applied when navigating between posts (#36583) 2025-10-23 15:52:07 +00:00
Claire
6b2051b7b3
Fix bookmarks export when one bookmarked status is soft-deleted (#36576) 2025-10-23 11:51:23 +00:00
Claire
2fa5dd6d1f
Add UI support for disabled live feeds (#36577)
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-10-23 09:59:43 +00:00
github-actions[bot]
f7b99cd48a
New Crowdin Translations (automated) (#36569)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-23 09:29:02 +00:00
renovate[bot]
92aeecfbdc
Update dependency vite to v7.1.12 (#36573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-23 08:41:34 +00:00
Claire
7774cd6670
Add disabled setting for live and topic feeds, as well as user permission to bypass that (#36563) 2025-10-23 08:37:05 +00:00
Claire
9f7075a0ce
Remove unnecessary restrictions on HTML handling (#36548) 2025-10-22 13:55:41 +00:00
renovate[bot]
c40648f7b3
Update dependency pino to v9.14.0 (#36529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-22 13:53:20 +00:00
renovate[bot]
2bd5c2f528
Update dependency ioredis to v5.8.2 (#36544)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-22 13:52:59 +00:00
renovate[bot]
1e28ec628b
Update dependency rubocop to v1.81.6 (#36541)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-22 13:52:43 +00:00
diondiondion
7538bc77b7
Fix text overflow alignment for long author names in News (#36562) 2025-10-22 13:08:51 +00:00
diondiondion
7ea2af6ae2
Refresh thread replies periodically & when refocusing window (#36547) 2025-10-22 09:43:03 +00:00
belatedly
6adbd9ce52
Fix discovery preamble missing word in EN and EN-GB locales (#36560) 2025-10-22 09:18:02 +00:00
github-actions[bot]
08ae77fd9c
New Crowdin Translations (automated) (#36556)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-22 08:24:40 +00:00
Claire
17eb1a7e66
Fix scheduled quote posts being posted as non-quote posts (#36550) 2025-10-21 16:00:40 +00:00
Claire
aba30a85be
Fix value of quote_approval_policy and quoted_status_id in ScheduledStatus serializer (#36549) 2025-10-21 16:00:30 +00:00
Renaud Chaput
de80a54555
Update recommended Node version to 24 (LTS) (#36539) 2025-10-21 14:26:24 +00:00
Renaud Chaput
b80ec3721d
Drop support for PostgreSQL 13 (#36540) 2025-10-21 14:26:00 +00:00
Claire
118ff13bd0
Bump version to v4.5.0-beta.2 (#36543) 2025-10-21 13:43:38 +00:00
Claire
405a49df44
Merge commit from fork
* Refuse granting quote authorization for reblogs

* Add validation to reject quotes of reblogs

* Do not process quotes of reblogs as potentially valid quotes

* Refuse to serve quoted reblogs over REST API
2025-10-21 15:00:28 +02:00
github-actions[bot]
2b9e4294fe
New Crowdin Translations (automated) (#36538)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-21 08:50:24 +00:00
Matt Jankowski
2eccd7b53c
Specs for validation error in API responses (#36507) 2025-10-21 07:33:30 +00:00
renovate[bot]
74172ced81
Update dependency playwright to v1.55.1 [SECURITY] (#36534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 07:20:24 +00:00
renovate[bot]
341ea7f462
Update dependency vite to v7.1.11 (#36526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 17:07:28 +00:00
renovate[bot]
168cba35e3
Update dependency puma to v7.1.0 (#36519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 17:07:11 +00:00
Echo
6e2973aa2d
Emoji: Fix unneeded re-renders when StatusContent changes (#36532) 2025-10-20 14:52:27 +00:00
Claire
97c8cc5606
Fix position of quote dropdown menu item when “quick boosting” is enabled (#36528) 2025-10-20 13:05:40 +00:00
Echo
50dfab30c2
Emoji: Swap mode test to an emoji from 16.0 (#36530) 2025-10-20 13:04:38 +00:00
renovate[bot]
53e20d5c83
Update dependency jsdom to v27.0.1 (#36524)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 12:11:04 +00:00
renovate[bot]
0a1111d5a5
Update dependency @reduxjs/toolkit to v2.9.1 (#36515)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 12:10:45 +00:00
renovate[bot]
95be29d700
Update dependency rubocop-performance to v1.26.1 (#36525)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 10:56:54 +00:00
Ben Sheldon [he/him]
843c43c97a
Replace ThreadingHelper wait loop with functional CyclicBarrier (#36508) 2025-10-20 10:10:43 +00:00
github-actions[bot]
82483ed8b0
New Crowdin Translations (automated) (#36520)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-20 10:10:37 +00:00
da8a70ba6f Chingerine changes for 4.5.x 2025-10-19 20:46:23 +11:00
24e691a199 Merge tag 'v4.5.0-beta.1' into chinwag-next 2025-10-19 08:48:12 +11:00
renovate[bot]
612771de46
Update dependency rack-attack to v6.8.0 (#36471)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-17 14:10:42 +00:00
renovate[bot]
950e7beeea
Update dependency rubyzip to v3.2.0 (#36472)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-17 14:10:39 +00:00
renovate[bot]
1018a4def4
Update dependency vite-plugin-static-copy to v3.1.4 (#36480)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-17 14:10:36 +00:00
Claire
811c1eaf7e
Fix relationship not being fetched to evaluate whether to show a quote post (#36517) 2025-10-17 13:03:18 +00:00
diondiondion
6dad80eb8c
Add new "quick boosting" setting (#36516) 2025-10-17 13:02:47 +00:00
Claire
c96e28a41d
Change HttpMessageSignature to perform assertions directly on Linzer objects (#36510) 2025-10-17 08:41:28 +00:00
github-actions[bot]
ccac6da3e8
New Crowdin Translations (automated) (#36513)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-17 08:41:07 +00:00
diondiondion
20961c7538
Add keyboard shortcut info banner to the boosting preferences section (#36506) 2025-10-16 14:53:23 +00:00
Echo
63dc426fae
Emoji: Fix emoji picker not centering native emoji (#36502) 2025-10-16 13:45:20 +00:00
Emelia Smith
210b389643
Implement quote posts in Moderator UI (#35964) 2025-10-16 13:40:24 +00:00
Echo
51d0bfcb38
Emoji: Update Twemoji to v16 (#36501) 2025-10-16 13:15:16 +00:00
Echo
7530f06dee
Emoji: Fix autoplay incorrectly being applied (#36503) 2025-10-16 12:46:17 +00:00
renovate[bot]
28339cad6d
Update dependency rollup-plugin-visualizer to v6.0.5 (#36499)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-16 10:29:13 +00:00
github-actions[bot]
5404f92cee
New Crowdin Translations (automated) (#36494)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-16 10:29:07 +00:00
diondiondion
05244c335d
Restructure appearance settings to introduce new Advanced settings section (#36496) 2025-10-16 09:44:24 +00:00
Claire
241ad1c587
Update docker-compose.yml sidekiq health check to work for both 4.4 and 4.5 (#36498) 2025-10-16 09:24:22 +00:00
Claire
ef53dcfd8c
Fix pinned hashtag columns fully refreshing unprompted (#36497) 2025-10-16 09:10:53 +00:00
diondiondion
869eeecfee
Show new replies early if the fetch-all-replies task takes long to finish (#36481) 2025-10-15 17:30:47 +00:00
diondiondion
28a42bb62c
Fix low-contrast hover colour of alert actions (light theme only) (#36484) 2025-10-15 15:38:36 +00:00
Aung Htet Nay
905aa9434d
Change FFmpeg source to GitHub mirror in Dockerfile (#36424) 2025-10-15 15:25:39 +00:00
Claire
5a8ab0a3e6
Update changelog with last-minute changes (#36482) 2025-10-15 14:12:33 +00:00
Claire
c5fb080ab8
Bump version to v4.5.0-beta.1 (#36479) 2025-10-15 13:09:25 +00:00
Claire
fab0dd0bcf
Change redirection for denied registration from web app to sign-in page with error message (#36384) 2025-10-15 11:37:22 +00:00
Matt Jankowski
c6de46d12d
Update stylelint-config-standard-scss to version 16.0.0 (#36429)
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-10-15 11:30:09 +00:00
Claire
3160f5746d
Bump version to v4.4.7 (#36478) 2025-10-15 09:11:03 +00:00
Emelia Smith
d8bdce2835
Fix rendering of poll options in status history modal (#35633) 2025-10-15 09:05:10 +00:00
github-actions[bot]
339673d533
New Crowdin Translations (automated) (#36476)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-15 08:54:47 +00:00
renovate[bot]
d0d1fcd034
Update opentelemetry-ruby (non-major) (#36477)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 07:56:45 +00:00
renovate[bot]
3550508421
Update dependency core-js to v3.46.0 (#36417)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 07:55:10 +00:00
renovate[bot]
e3e5067772
Update formatjs monorepo (#36415)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 07:11:45 +00:00
renovate[bot]
5fd380096f
Update dependency vite-plugin-pwa to v1.1.0 (#36452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 07:10:52 +00:00
renovate[bot]
d788e45628
Update dependency vite to v7.1.10 (#36468)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-15 07:08:49 +00:00
Claire
264d068d8d
Change new accounts to use new ActivityPub numeric ID scheme (#36365) 2025-10-14 16:36:55 +00:00
Claire
50743cc35b
Fix forwarder being called with nil status when quote post is soft-deleted (#36463) 2025-10-14 15:15:45 +00:00
Claire
fd516347cb
Fix deletion of posts quoting soft-deleted local post (#36461) 2025-10-14 15:15:38 +00:00
Claire
3232eee358
Fix error in logged-out hashtag view when remote posts require log-in (#36467) 2025-10-14 14:04:18 +00:00
github-actions[bot]
484225895f
New Crowdin Translations (automated) (#36457)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-14 12:26:21 +00:00
Claire
156f031ed0
Fix WebUI mistakenly allowing to attach quotes when editing (#36464) 2025-10-14 12:21:13 +00:00
renovate[bot]
ad858ebe81
Update dependency strong_migrations to v2.5.1 (#36458)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-14 12:17:40 +00:00
Jonathan de Jong
f2f711deeb
Fix allow_referrer_origin typo (#36460) 2025-10-14 12:07:15 +00:00
Claire
44ecc4b1e3
Fix moderation warning e-mails that include posts (#36462) 2025-10-14 11:48:51 +00:00
Echo
0c64e7f75e
Emoji: Cleanup new code (#36402) 2025-10-14 09:36:25 +00:00
diondiondion
9a001e7839
Fix videos not being indented properly in thread view (#36459) 2025-10-14 08:58:03 +00:00
Echo
edd7fd9872
Emoji: Picker native rendering (#36454) 2025-10-13 15:29:39 +00:00
Eugen Rochko
33f739da44
Fix permalink redirects continuing to work for suspended accounts (#36453) 2025-10-13 15:18:01 +00:00
Claire
254fff93ca
Bump version to v4.4.6 (#36447) 2025-10-13 14:31:12 +00:00
Claire
2971ac9863
Fix streaming still being authorized for suspended accounts (#36448) 2025-10-13 13:35:44 +00:00
Emelia Smith
7e98fa9b47
Merge commit from fork
* Require read, read:statuses or read:notifications scope to access streaming APIs

* Add additional tests for scope-based channel access

We were missing tests in the affirmative for subscribing to the user:notification channel, this adds them
2025-10-13 14:20:57 +02:00
Emelia Smith
24dcb18013
Merge commit from fork
* Ensure tootctl revokes sessions, access tokens and web push subscriptions

* Fix test coverage
2025-10-13 14:20:23 +02:00
Emelia Smith
8d09e4ef23
Merge commit from fork
* Streaming: Ensure disabled users cannot connect to streaming

* Streaming: Disconnect when the user is disabled
2025-10-13 14:19:14 +02:00
renovate[bot]
692cfe27fa
Update dependency opentelemetry-instrumentation-excon to v0.25.2 (#36436)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-13 10:01:00 +00:00
github-actions[bot]
8b78c033e8
New Crowdin Translations (automated) (#36433)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-13 09:25:52 +00:00
Claire
ab93e9fc8a
Update dependency rack (#36443) 2025-10-13 09:13:17 +00:00
Claire
0219b7cad7
Add result_count to Mastodon-Async-Refresh header when needed (#36239) 2025-10-10 12:26:10 +00:00
github-actions[bot]
3f2ee09827
New Crowdin Translations (automated) (#36420)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-10 09:06:57 +00:00
Emelia Smith
8898f120dc
Improve display of content warnings in Admin UI (#35935) 2025-10-10 08:55:41 +00:00
Emelia Smith
81350c7cfb
Add support for displaying link previews for Admin UI (#35958) 2025-10-10 08:43:48 +00:00
Echo
c858fc77ef
Fixes handled link formatting (#36410)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2025-10-09 14:31:13 +00:00
Echo
258869278e
Fix: Embed author handle using wrong DisplayName (#36413) 2025-10-09 14:08:36 +00:00
Claire
d4a4a7177a
Fix crash when serializing quotes of deleted posts for ActivityPub (#36381) 2025-10-09 13:52:38 +00:00
Claire
b7c5e60426
Fix quote post state sometimes not being updated through streaming server (#36408) 2025-10-09 09:53:45 +00:00
github-actions[bot]
a459ccf616
New Crowdin Translations (automated) (#36406)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-09 09:12:27 +00:00
renovate[bot]
ba70dcf827
Update docker.io/ruby Docker tag to v3.4.7 (#36407)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-09 08:25:26 +00:00
Matt Jankowski
0152659245
Use tag filter for pending tag count on admin dashboard (#36404) 2025-10-09 08:08:29 +00:00
Echo
5bc7c4b7e8
Emoji: Fixes issue with handled link not correctly showing remote users (#36403) 2025-10-08 17:17:03 +00:00
Renaud Chaput
b8444d9bb7
Do not automatically run Prettier on the streaming server code. (#36400) 2025-10-08 15:51:53 +00:00
Echo
babb7b2b9d
Emoji: Announcements (#36397)
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-10-08 15:07:01 +00:00
renovate[bot]
5c92312d4d
Update dependency cross-env to v10.1.0 (#36297)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-08 14:19:27 +00:00
Echo
0c1ca6c969
Emoji: Statuses (#36393) 2025-10-08 14:18:11 +00:00
renovate[bot]
2b213e9b1b
Update dependency ruby to v3.4.7 (#36387)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-08 14:17:42 +00:00
renovate[bot]
4fd5b6e73b
Update opentelemetry-ruby (non-major) (#36313)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-08 13:15:22 +00:00
Claire
0be0a8898a
Fix Update/Delete of quoted status not being forwarded to quoters's followers (#36390) 2025-10-08 12:56:32 +00:00
renovate[bot]
d8f0326b02
Update dependency sidekiq to v8.0.8 (#36388)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-08 12:39:24 +00:00
Claire
987f1e897b
Fix JSON payload being potentially mutated when processing interaction policies (#36392) 2025-10-08 12:31:51 +00:00
Echo
6abda76d13
Emoji: Account page (#36385) 2025-10-08 11:11:25 +00:00
github-actions[bot]
3867f3bc61
New Crowdin Translations (automated) (#36386)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-08 10:06:30 +00:00
Renaud Chaput
4fce4337d8
Update rack and uri to the latest release (#36389) 2025-10-08 09:35:36 +00:00
Matt Jankowski
092f46f61a
Use bundler version 2.7.2 (#36367) 2025-10-08 08:21:23 +00:00
diondiondion
e4c3854ae8
Ensure Fetch-all-replies snackbar is shown at the bottom of the screen (#36383) 2025-10-07 16:43:40 +00:00
renovate[bot]
aa7bcd3ae3
Update formatjs monorepo (#36356)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-07 15:34:45 +00:00
Claire
bc7119b3cb
Remove unused feature flag from sample configuration file (#36382) 2025-10-07 15:34:06 +00:00
Echo
e02ea3e110
Emoji: Compare history modal (#36378) 2025-10-07 15:22:00 +00:00
Echo
3c9b828c71
Emoji: Bypass legacy emoji normalization (#36377) 2025-10-07 15:21:50 +00:00
Brad Dunbar
c578a0cb74
Resolve typescript eslint warning (#36314) 2025-10-07 14:42:15 +00:00
renovate[bot]
da6ae98e57
Update dependency ioredis to v5.8.1 (#36361)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-07 14:29:58 +00:00
renovate[bot]
fb6fd7b7e1
Update dependency pino to v9.13.1 (#36337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-07 14:29:19 +00:00
renovate[bot]
d51717c101
Update dependency vite to v7.1.9 (#36332)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-07 14:29:04 +00:00
diondiondion
63bbe4ee16
Display quotes in email notifications (#36379) 2025-10-07 12:50:40 +00:00
github-actions[bot]
adcbab527a
New Crowdin Translations (automated) (#36371)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-07 12:37:46 +00:00
Claire
a7f89d13d2
Change index on follows table to improve performance of some queries (#36374) 2025-10-07 12:37:40 +00:00
Renaud Chaput
e8dab026bb
Fix quote mailer preview to use the latest quote notification (#36373) 2025-10-07 10:19:53 +00:00
Echo
9027d60420
Emoji: Remove re: from handleElement in StatusContent (#36366) 2025-10-06 16:20:15 +00:00
diondiondion
474fbb2770
Fetch all replies: Only display "More replies found" prompt when there really are new replies (#36334) 2025-10-06 14:13:24 +00:00
diondiondion
4a40f81067
Link to local accounts from settings (#36340) 2025-10-06 14:10:26 +00:00
Claire
cda07686df
Add feature to automatically attach quote on eligible link past in Web UI composer (#36364) 2025-10-06 13:43:20 +00:00
Echo
68a36d5a57
Allow modern_emojis to be enabled purely server-side (#36342) 2025-10-06 13:34:51 +00:00
Echo
ffac4cb05f
Emoji: Link Replacement (#36341) 2025-10-06 09:31:10 +00:00
github-actions[bot]
4dc21d7afd
New Crowdin Translations (automated) (#36349)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-06 09:11:31 +00:00
Claire
2d2c525097
Split timeline_preview setting into more granular settings (#36338) 2025-10-06 08:34:05 +00:00
nicole mikołajczyk
62f91eddf4
Do not display mute button in hashtag dropdown when unauthenticated (#36353)
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-10-05 14:24:54 +00:00
Claire
80c8a84740
Fix redirect to external object when URL is missing or malformed (#36347) 2025-10-03 17:30:23 +00:00
github-actions[bot]
1561517387
New Crowdin Translations (automated) (#36345)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-03 08:07:10 +00:00
renovate[bot]
5543967e5c
chore(deps): update dependency rollup-plugin-visualizer to v6.0.4 (#36336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-03 07:57:48 +00:00
diondiondion
0d7af7e1fe
Allow quotes to be displayed in the featured carousel (#36335) 2025-10-02 13:51:47 +00:00
github-actions[bot]
4809b38f6e
New Crowdin Translations (automated) (#36329)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-02 08:34:38 +00:00
renovate[bot]
554dd1a76a
chore(deps): update dependency omniauth to v2.1.4 (#36331)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-02 08:25:40 +00:00
Brad Dunbar
f69ca085db
ESLint: Ignore .bundle directory (#36321) 2025-10-01 15:48:15 +00:00
Claire
3ee1378932
Fix approval for remote quotes of local posts not being streamed to local users (#36317) 2025-10-01 13:51:43 +00:00
Claire
f03d1bb21f
Add numeric_ap_ids feature flag to switch new accounts to numeric AP identifiers (#36316) 2025-10-01 13:09:56 +00:00
diondiondion
669738ef3b
Add quote/boost dropdown menu to boost button in media modal (#36315) 2025-10-01 12:18:19 +00:00
renovate[bot]
94a4e9d5a9
chore(deps): update dependency vite-plugin-static-copy to v3.1.3 (#36312)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-01 09:48:26 +00:00
github-actions[bot]
9114e72c50
New Crowdin Translations (automated) (#36308)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-01 09:47:16 +00:00
Terence Eden
6c3c2714d7
Add overflow to .more-from-author (#36310) 2025-10-01 09:23:49 +00:00
metalhead
e4094d9fb2
Add support for dynamic viewport height (#36272)
Co-authored-by: l <eh.chahkiev@smartics.ru>
2025-10-01 08:53:29 +00:00
Claire
d51723bb57
Add UI support for displaying quotes of other people's posts (#36301) 2025-09-30 15:10:09 +00:00
Claire
5af40ff960
Fix some routes for numeric AP identifiers (#36304) 2025-09-30 15:09:59 +00:00
diondiondion
473bd84c24
Update confirmation dialogs for follow button actions "unfollow", "unblock", and "withdraw request" (#36289) 2025-09-30 14:55:25 +00:00
Echo
c12b8f51c1
Emoji Component (#36293) 2025-09-30 13:06:02 +00:00
Brad Dunbar
ac50e5eebc
Convert mastodon/initial_state to TypeScript (#36274) 2025-09-30 11:14:58 +00:00
Claire
589af7a1cc
Change GET /api/v1/statuses/:id/quotes to allow listing quotes to other people's posts (#36291) 2025-09-30 09:56:03 +00:00
Claire
45219dbf64
Fix spurious notification of local boosters and quoters when updating quote policy (#36299) 2025-09-30 09:40:58 +00:00
renovate[bot]
a6236148d8
chore(deps): update dependency haml-rails to v3 (#36288)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-30 08:44:15 +00:00
Emelia Smith
5b97f25a15
Add integration tests for mastodon-streaming (#36025)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
Co-authored-by: David Roetzel <david@roetzel.de>
2025-09-30 07:27:09 +00:00
Claire
150f0fcba5
Add support for numeric-based URIs for local accounts (#32724) 2025-09-29 12:05:48 +00:00
renovate[bot]
4d7c208da3
chore(deps): update node.js to 22.20 (#36252)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-29 09:45:31 +00:00
renovate[bot]
dc72719f4c
chore(deps): update dependency hiredis-client to v0.26.1 (#36286)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-29 09:30:10 +00:00
renovate[bot]
9f1a12b749
chore(deps): update dependency @vitejs/plugin-react to v5.0.4 (#36282)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-29 09:30:01 +00:00
renovate[bot]
adbd57e5a9
chore(deps): update dependency rubyzip to v3.1.1 (#36278)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-29 09:29:52 +00:00
renovate[bot]
8779bbc4c1
chore(deps): update rubocop (non-major) to v1.81.1 (#36277)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-29 09:29:37 +00:00
renovate[bot]
bbb698937a
chore(deps): update dependency pino to v9.12.0 (#36287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-29 09:29:15 +00:00
github-actions[bot]
4d8e848c6a
New Crowdin Translations (automated) (#36276)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-29 09:16:16 +00:00
Brad Dunbar
aae9a5528a
Remove shallow prop from Wrapper (#36275) 2025-09-29 09:10:27 +00:00
Claire
a44a3f6d40
Expand test coverage of ActivityPub::TagManager class (#36260) 2025-09-26 10:00:53 +00:00
diondiondion
cb5bbbfb05
Update "Follow" button labels (#36264) 2025-09-26 10:00:50 +00:00
Echo
e07b9dfdc1
Adds new HTMLBlock component (#36262) 2025-09-26 09:50:59 +00:00
diondiondion
1571514e49
Fix page being vertically scrollable in Advanced UI (#36271) 2025-09-26 09:23:30 +00:00
Brad Dunbar
238d74fe81
Refactor getFocusedItemIndex to avoid conditionals that closest already handles (#36267) 2025-09-26 08:53:08 +00:00
github-actions[bot]
7431c50566
New Crowdin Translations (automated) (#36270)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-26 08:42:28 +00:00
renovate[bot]
c2d426a565
chore(deps): update dependency rubocop to v1.81.0 (#36269)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-26 08:21:06 +00:00
Matt Jankowski
f61d8cb02a
Hold usable value lists in admin settings form (#36268) 2025-09-26 08:21:03 +00:00
diondiondion
11bd515648
Allow accessing ref of ScrollContainer's child (#36265) 2025-09-25 16:14:49 +00:00
diondiondion
d801cf8e59
Replace react-router-scroll-4 with inlined implementation (#36253) 2025-09-25 12:26:50 +00:00
renovate[bot]
6d2493ca7c
chore(deps): update dependency puma to v7.0.4 (#36240)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 10:03:53 +00:00
Claire
66686994c1
Fix not being able to author quotes with CW but no text (#36153)
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-09-25 09:25:00 +00:00
Renaud Chaput
719b2de3c3
Update uuid package to latest version (#36259) 2025-09-25 08:54:02 +00:00
github-actions[bot]
d2bdb03da0
New Crowdin Translations (automated) (#36258)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-25 08:53:58 +00:00
renovate[bot]
507e6dc473
fix(deps): update dependency ioredis to v5.8.0 (#36234)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:58:20 +00:00
renovate[bot]
52d5e628a4
chore(deps): update dependency hiredis-client to v0.26.0 (#36233)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:57:47 +00:00
renovate[bot]
85213dab47
chore(deps): update yarn to v4.10.3 (#36178)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:56:33 +00:00
renovate[bot]
8fac87d77c
chore(deps): update dependency rails to v8.0.3 (#36230)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:55:46 +00:00
renovate[bot]
fda3589498
fix(deps): update dependency sass to v1.93.2 (#36231)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:55:09 +00:00
renovate[bot]
0798d0c95a
chore(deps): update dependency pundit to v2.5.2 (#36251)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:54:58 +00:00
renovate[bot]
33fd8c774b
chore(deps): update dependency webauthn to v3.4.2 (#36243)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:54:41 +00:00
renovate[bot]
e0f7aedf41
chore(deps): update dependency propshaft to v1.3.1 (#36241)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 07:54:07 +00:00
renovate[bot]
cc54b33720
chore(deps): update dependency typescript to ~5.9.0 (#36212)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-09-25 07:52:37 +00:00
Claire
df72a2dbbe
Fix newly-highlighted replies not being interactable (#36256) 2025-09-24 20:37:20 +00:00
Claire
28be5a199f
Fix Private Messages self-quoting private posts being changed to followers-only (#36249) 2025-09-24 10:58:52 +00:00
diondiondion
3a81ee8f5b
Implement new design for "Refetch all" (#36172) 2025-09-24 09:54:07 +00:00
Echo
29d9f81e42
Fix missed event handler (#36248) 2025-09-24 09:37:11 +00:00
diondiondion
059bf1e980
Highlight newly added replies in thread view (#36237) 2025-09-24 09:27:33 +00:00
github-actions[bot]
23a69e3bd7
New Crowdin Translations (automated) (#36246)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-24 09:18:50 +00:00
Claire
e1f7847b64
Remove the outgoing_quotes feature flag, making the feature unconditional (#36130) 2025-09-24 08:58:08 +00:00
diondiondion
6cbc857ee0
Fix unfortunate action button wrapping in admin area (#36247) 2025-09-24 08:57:18 +00:00
David Roetzel
37cec638df
Update to puma 7 (#36238) 2025-09-23 13:40:04 +00:00
github-actions[bot]
82f5901a3f
New Crowdin Translations (automated) (#36228)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-23 09:56:46 +00:00
Echo
6bd90940b6
Refactor emoji GIF animation (#36165) 2025-09-23 08:53:14 +00:00
Claire
24ddf80ff7
Revert "Add compatibility hack for GoToSocial interaction policies (#36004)" (#36218) 2025-09-23 08:14:11 +00:00
renovate[bot]
8e6c0fdf5a
chore(deps): update dependency simplecov-lcov to v0.9.0 (#35884)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 16:18:01 +00:00
renovate[bot]
bdadfe60cb
chore(deps): update dependency ffmpeg to v8 (#35886)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 16:16:49 +00:00
Claire
64895e5f6d
Add support for has:quote in search (#36217) 2025-09-22 16:03:22 +00:00
renovate[bot]
dc808054d2
chore(deps): update opentelemetry-ruby (non-major) (#35831)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 15:46:27 +00:00
renovate[bot]
4b1d7490d2
chore(deps): update devdependencies (non-major) (#35889)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 15:45:24 +00:00
renovate[bot]
107d2a9f93
chore(deps): update playwright to v1.55.0 (#36222)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 15:38:59 +00:00
renovate[bot]
6c2c485638
chore(deps): update storybook (non-major) (#36221)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Renaud Chaput <renchap@gmail.com>
2025-09-22 15:01:03 +00:00
Itoh Shimon
99d5af9914
Add Traditional Mongolian to posting languages (#36196) 2025-09-22 14:05:07 +00:00
renovate[bot]
45a044cad0
fix(deps): update dependency debug to v4.4.3 (#36058)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:57:59 +00:00
Renaud Chaput
63a2ef6274
Force playwright-ruby-client version to keep it in sync with the NPM package (#36225) 2025-09-22 13:56:08 +00:00
renovate[bot]
91e666bcaa
fix(deps): update dependency postcss-preset-env to v10.4.0 (#35873)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:54:38 +00:00
renovate[bot]
da272d13e2
fix(deps): update dependency react-swipeable-views to v0.14.1 (#36208)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:53:49 +00:00
renovate[bot]
28264c5c86
fix(deps): update dependency sass to v1.93.0 (#36199)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:52:52 +00:00
renovate[bot]
0ac2d11ac8
fix(deps): update dependency @vitejs/plugin-react to v5.0.3 (#36146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:52:26 +00:00
renovate[bot]
5f2091d8d2
fix(deps): update dependency vite to v7.1.7 (#36177)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:51:42 +00:00
diondiondion
e473583da0
Add quote-related info to a post's aria-label (#36169) 2025-09-22 13:50:29 +00:00
renovate[bot]
4a99025d02
chore(deps): update docker/dockerfile docker tag to v1.18 (#36213)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:49:30 +00:00
renovate[bot]
5398dd9ee1
fix(deps): update dependency pino to v9.11.0 (#35767)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:49:05 +00:00
Matt Jankowski
4abc442add
Refer to pinnable visibilities constant from status serializer pinnable? attribute (#35852) 2025-09-22 13:45:23 +00:00
renovate[bot]
1f2a84b3d0
chore(deps): update dependency net-ldap to v0.20.0 (#35871)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:34:05 +00:00
renovate[bot]
00cc6c40eb
chore(deps): update dependency annotaterb to v4.19.0 (#35943)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:16:44 +00:00
renovate[bot]
187afeaee7
chore(deps): update dependency nokogiri to v1.18.10 (#36120)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 13:14:38 +00:00
Renaud Chaput
b1c91d885a
Remove Renovate postUpgrade commands (#36223) 2025-09-22 12:44:16 +00:00
diondiondion
66afc13b7f
Left-align boost/quote menu to prevent shift based on descriptions (#36220) 2025-09-22 11:54:06 +00:00
Renaud Chaput
6689040fc6
Renovate config improvements (#36209) 2025-09-22 09:08:35 +00:00
diondiondion
9bd151808c
Fix line break in Read more button (#36216) 2025-09-22 08:39:32 +00:00
github-actions[bot]
a42258eca2
New Crowdin Translations (automated) (#36198)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-22 07:59:19 +00:00
renovate[bot]
a95deddeab
chore(deps): update dependency stoplight to v5.3.8 (#36191)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 07:40:55 +00:00
Matt Jankowski
854aaec6fe
Spec for newline in request lib initialize (#36170) 2025-09-19 15:22:23 +00:00
David Roetzel
f316cd51c8
Enable GH actions scanning with CodeQL (#36193) 2025-09-19 13:14:24 +00:00
Claire
ea7371c183
Return 404 for quote approval when either quoted or quoting status is deleted (#36194) 2025-09-19 12:55:30 +00:00
Claire
4ff215f19b
Update dependency rexml (#36192) 2025-09-19 12:19:10 +00:00
Claire
938b54dff0
Switch stoplight back to upstream releases (#36188) 2025-09-19 10:02:46 +00:00
Claire
a0a56a4c7b
Fix processing of out-of-order Update as implicit updates (#36190) 2025-09-19 09:52:17 +00:00
Claire
b6bc42aaa6
Fix getting Create and Update out of order (#36176) 2025-09-19 08:45:13 +00:00
github-actions[bot]
23efdf12cb
New Crowdin Translations (automated) (#36187)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-19 07:58:45 +00:00
Claire
48005c55ff
Add short-time HTTP caching of quote authorizations for public posts (#36171) 2025-09-18 17:03:07 +00:00
Claire
e2171f5083
Change quoted posts from silenced accounts not to be hidden (#36166) 2025-09-18 13:21:17 +00:00
Claire
16a6e5c118
Add click-through for quoted limited accounts (#36167) 2025-09-18 12:46:31 +00:00
diondiondion
c368a16dc1
Fix translate button width in Safari (#36164) 2025-09-18 10:16:22 +00:00
github-actions[bot]
bb3f9ed13b
New Crowdin Translations (automated) (#36160)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-18 08:17:25 +00:00
Claire
90765342a3
Fix posts when omitting quote policy and default policy is nobody (#36158) 2025-09-17 19:16:36 +00:00
diondiondion
085e9ea676
Create reusable Alert/Snackbar component (#36141) 2025-09-17 15:24:39 +00:00
Claire
db0cd9489c
Bump version to v4.4.4 (#36152) 2025-09-17 12:19:03 +00:00
Claire
fbf093a87f
Fix CW being moved to text when posting quote posts with empty text (#36151) 2025-09-17 12:19:00 +00:00
Claire
2664bb628b
Fix quote with CW but no text being shown without CW (#36150) 2025-09-17 12:00:58 +00:00
renovate[bot]
8a6ef2ebdf
fix(deps): update dependency jsdom to v27 (#36107)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-17 09:46:30 +00:00
renovate[bot]
de3692ca00
chore(deps): update docker.io/ruby docker tag to v3.4.6 (#36145)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-17 09:44:16 +00:00
renovate[bot]
72fff2e54f
chore(deps): update dependency ruby to v3.4.6 (#36135)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-17 09:44:12 +00:00
Echo
dfef7d9407
Refactor: Replace all display name usage for new component (#36137) 2025-09-17 09:00:57 +00:00
github-actions[bot]
ff03938808
New Crowdin Translations (automated) (#36143)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-17 07:27:03 +00:00
Jeong Arm
3055afd1d2
Fix applying user's default quote policy if API parameter is not specified (#36132) 2025-09-17 07:08:55 +00:00
Eugen Rochko
d9b70bbde1
Fix login page linking to other pages within OAuth authorization flow (#36115) 2025-09-16 14:25:21 +00:00
Claire
d1402af0b2
Change reblog button to immediately show the interaction modal when logged out (#36138) 2025-09-16 12:23:44 +00:00
Claire
41ab10f88c
Change wording of disabled quote state to “You are not allowed to quote this post” (#36129) 2025-09-16 10:24:58 +00:00
github-actions[bot]
96d0f6f049
New Crowdin Translations (automated) (#36133)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-16 09:43:02 +00:00
Claire
6c5a4702d9
Use default quote policy setting in the absence of API parameter (#36094) 2025-09-15 15:53:21 +00:00
diondiondion
38fa0102c1
Fix logged-out quote menu UX, simplify Interaction dialog copy (#36124) 2025-09-15 15:38:11 +00:00
Claire
943cdc5b21
Add example post with manual quote approval policy to dev:populate_sample_data (#36099) 2025-09-15 15:35:33 +00:00
diondiondion
887e982aa2
Don't show more than one quote removal hint on notifications page (#36128) 2025-09-15 15:27:43 +00:00
Claire
e4bb0fc43a
Add server-side support for handling posts with a quote policy allowing followers to quote (#36127) 2025-09-15 15:03:44 +00:00
Claire
f5591346cc
Add following_url to accounts (#36093) 2025-09-15 13:45:57 +00:00
renovate[bot]
94dcf8c96c
fix(deps): update dependency axios to v1.12.0 [security] (#36116)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 10:02:38 +00:00
Lycolia Rizzim
4702e369e9
Fix: clicking a status header opens the status details, no longer navigate to profile (#36118) 2025-09-15 09:43:14 +00:00
diondiondion
681a9cfda1
In composer, show when quoted post is also a quote post (#36119) 2025-09-15 09:21:03 +00:00
renovate[bot]
38c0c9ba3b
chore(deps): update dependency libvips to v8.17.2 (#36117)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 08:55:15 +00:00
github-actions[bot]
93c977eb3d
New Crowdin Translations (automated) (#36105)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-15 08:28:25 +00:00
renovate[bot]
8e46252862
chore(deps): update dependency pundit to v2.5.1 (#36097)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 08:15:28 +00:00
Echo
06803422da
Make Vite respect CSP for styles (#36089) 2025-09-12 13:37:26 +00:00
Claire
82b26603fe
Fix quote posts with CW and no text being rejected (#36095) 2025-09-12 13:10:31 +00:00
Eugen Rochko
30b31a89e6
Add schema.org markup to SEO-enabled posts (#36075) 2025-09-12 09:12:07 +00:00
github-actions[bot]
b59e06fba7
New Crowdin Translations (automated) (#36092)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-12 09:04:44 +00:00
diondiondion
45a996f12b
Fix "Post revoked" label & "Pending" tooltip text (#36090) 2025-09-11 16:36:18 +00:00
Claire
946721fd0b
Fix local quote notifications (#36091) 2025-09-11 16:32:55 +00:00
diondiondion
84d1ba980b
Allow removing deleted quotes from composer (#36080) 2025-09-11 14:44:20 +00:00
diondiondion
872044484c
Update labels in Posting defaults settings (#36084) 2025-09-11 14:04:15 +00:00
Claire
e35dfbfdef
Fix accpeted quotes sometimes not generating notifications (#36087) 2025-09-11 12:58:25 +00:00
Claire
aacc829dc6
Fix missing memoization in Web::PushNotificationWorker (#36085) 2025-09-11 12:32:56 +00:00
Claire
f7289b251f
Add migration to fill unset default quote policy based on default post privacy (#36041) 2025-09-11 10:11:31 +00:00
github-actions[bot]
75f78244d5
New Crowdin Translations (automated) (#36082)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-11 09:39:51 +00:00
Claire
b60ee191ac
Fix QuoteAuthorization id not being properly serialized when federating revocation (#36083) 2025-09-11 09:37:56 +00:00
Echo
8a0d0025ff
Add basic HTML parser for converting strings to React components (#36071) 2025-09-11 09:22:44 +00:00
renovate[bot]
2314583606
chore(deps): update dependency hiredis-client to v0.25.3 (#36079)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-11 08:17:58 +00:00
diondiondion
841212710b
Allow disabled dropdown menu items to be focused (#36078) 2025-09-10 11:32:50 +00:00
Yamagishi Kazutoshi
ffaa672fd6
Display Valkey version on admin dashboard (#35785) 2025-09-10 10:58:51 +00:00
github-actions[bot]
eb118d8523
New Crowdin Translations (automated) (#36076)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-10 08:42:44 +00:00
Claire
e1dc960219
Rework FEP-7888 implementation (#36064) 2025-09-09 18:27:30 +00:00
diondiondion
377e870348
Improve accessibility of visibility modal dropdowns (#36068) 2025-09-09 17:44:43 +00:00
diondiondion
66d73fc213
Lighten up modal background colours in light mode (#36069) 2025-09-09 17:43:36 +00:00
Claire
e2cbef7edb
Remove unused definitions from OStatus::TagManager (#36067) 2025-09-09 13:14:35 +00:00
Renaud Chaput
beca0faed0
Upgrade transitive deps with security advisories to latest version (#36066) 2025-09-09 13:13:56 +00:00
diondiondion
cf20c5db9c
Show hint explaining post visibility when quoting a "quiet public" post (#36065) 2025-09-09 12:43:23 +00:00
github-actions[bot]
3c79c512fe
New Crowdin Translations (automated) (#36063)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-09 07:42:52 +00:00
Claire
1c8990927a
Move quote post fallback removal import-time (#36055) 2025-09-08 15:31:36 +00:00
renovate[bot]
13d970b5ae
chore(deps): update dependency rubyzip to v3.1.0 (#36048)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-08 14:53:51 +00:00
renovate[bot]
e7d7da9511
chore(deps): update dependency rubocop-performance to v1.26.0 (#36047)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-08 14:53:30 +00:00
Claire
2347354bba
Fix unresponsive areas around GIFV modals in some cases (#36059) 2025-09-08 14:11:10 +00:00
renovate[bot]
9d0e73d308
fix(deps): update dependency vite to v7.1.5 (#36056)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-08 13:51:25 +00:00
renovate[bot]
3ca4793e68
fix(deps): update dependency sass to v1.92.1 (#36046)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-08 13:04:57 +00:00
github-actions[bot]
e9e107c5a5
New Crowdin Translations (automated) (#36045)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-08 13:04:38 +00:00
diondiondion
c0af4581aa
Visibility dialog: Add visual dropdown indicator to Dropdown component (#36052) 2025-09-08 12:53:23 +00:00
diondiondion
0153b49ef7
Visibility modal: Match dropdown width to button (#36054) 2025-09-08 12:43:38 +00:00
Echo
24fb862a65
Remove old search results with new search (#36053) 2025-09-08 12:35:59 +00:00
Echo
b99c94537b
Revert change to EmojiHTML (#36051) 2025-09-08 12:08:07 +00:00
diondiondion
a5fbe2f5c1
Fix missing icons and subtitle in mobile boost/quote menu (#36038) 2025-09-08 08:50:46 +00:00
Jesse Karmani
65b4a0a6f1
Implement FEP 7888: Part 1 - publish conversation context (#35959) 2025-09-05 19:28:29 +00:00
Claire
9463a31107
Change “Posting defaults” settings page to enforce nobody quote policy for private default visibility (#36040) 2025-09-05 18:51:08 +00:00
Claire
7ddb8814e1
Change description of “Quiet public” (#36032) 2025-09-05 18:35:34 +00:00
Matt Jankowski
1b664cf20d
Relay reset delivery tracker model spec and callback (#36027) 2025-09-05 12:56:15 +00:00
Matt Jankowski
05a655f33e
Convert age verification controller to system specs (#36026) 2025-09-05 12:44:09 +00:00
Matt Jankowski
3efba15b3c
Use pluck on DomainAllow.allowed_domains for export (#36019) 2025-09-05 12:30:18 +00:00
Matt Jankowski
350a802851
Remove unused _index iterator in admin partial (#36018) 2025-09-05 12:29:11 +00:00
Claire
de09e33c92
Change “Boost with original visibility” to “Share again with your followers” (#36035) 2025-09-05 08:59:16 +00:00
Claire
9a2be25199
Fix missing beforeUnload confirmation when a quote post is being authored (#36034) 2025-09-05 08:51:49 +00:00
Claire
279405f2a7
Fix incorrect change of unlisted source strings (#36033) 2025-09-05 08:34:14 +00:00
Claire
497bfbc483
Fix source string for visibility dropdown hint (#36031) 2025-09-05 08:14:34 +00:00
github-actions[bot]
dd6bd681ea
New Crowdin Translations (automated) (#36029)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-05 08:14:25 +00:00
Claire
0d93801bde
Fix missing beforeUnload confirmation when a poll is being authored (#36030) 2025-09-05 08:07:59 +00:00
diondiondion
e7c30cd072
Add first-time user education hint about quote removal on Quote notifications (#35986) 2025-09-04 13:01:12 +00:00
Echo
42be0ca0eb
Adds DisplayName component (#35985) 2025-09-04 10:09:27 +00:00
renovate[bot]
d7d83d44e6
fix(deps): update dependency @reduxjs/toolkit to v2.9.0 (#36000)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-04 09:44:17 +00:00
github-actions[bot]
5cb85acf2b
New Crowdin Translations (automated) (#36015)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-04 09:41:16 +00:00
Matt Jankowski
27969c3077
Update rubocop to version 1.80.2 (#36007) 2025-09-04 08:14:01 +00:00
Emelia Smith
4c2a2c27c1
Automatically remove invalid Web::PushSubscriptions (#35987) 2025-09-04 08:00:44 +00:00
Claire
14cb5ff881
Add compatibility hack for GoToSocial interaction policies (#36004) 2025-09-03 19:35:43 +00:00
diondiondion
bc952ebde9
Add new plain (text-only) button variant (#36002) 2025-09-03 12:34:29 +00:00
renovate[bot]
c1542643f5
fix(deps): update dependency sass to v1.92.0 (#36001)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-03 12:23:00 +00:00
Claire
624c024766
Prepend “RE: <url>” fallback link to Mastodon-authored quote posts (#35971) 2025-09-03 09:35:44 +00:00
github-actions[bot]
927468bce5
New Crowdin Translations (automated) (#35999)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-03 07:57:33 +00:00
Claire
75fca715e9
Change public self-quotes of private posts to be disallowed (#35975) 2025-09-02 15:48:37 +00:00
Claire
5d9a9c76fb
Change icon variant for quotes (#35991) 2025-09-02 13:52:09 +00:00
Claire
0e5cac8c8b
Change wording on quote label when disabled (#35990) 2025-09-02 13:41:31 +00:00
fiona
e665cc68f4
Fix handling of edited status with new media and no text (#35970) 2025-09-02 12:25:55 +00:00
Bruno Viveiros
bdff970a5e
fix: YouTube iframe being able to start at a defined time (#26584) 2025-09-02 10:04:59 +00:00
renovate[bot]
bf860c39c2
Update dependency vite to v7.1.4 (#35983)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 09:21:31 +00:00
renovate[bot]
b829d89757
Update dependency use-debounce to v10.0.6 (#35982)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 08:29:24 +00:00
renovate[bot]
5844fd3e3d
Update dependency pg to v1.6.2 (#35981)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 08:11:39 +00:00
renovate[bot]
f51b733109
Update dependency connection_pool to v2.5.4 (#35980)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 08:11:28 +00:00
Emelia Smith
2138f3e40f
Move 'add more' inside table toolbar on reports (#35963) 2025-09-02 07:54:58 +00:00
github-actions[bot]
fb736eaed5
New Crowdin Translations (automated) (#35979)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-02 07:41:43 +00:00
Matt Jankowski
786891c333
Remove unused local vars from user mailer warning (#35977) 2025-09-02 07:35:53 +00:00
Eugen Rochko
7fc884ba00
Fix banned text being able to be circumvented via unicode (#35978) 2025-09-02 07:29:03 +00:00
Claire
6e09dd10a7
Fix stale interaction counts being served for quotes over streaming (#35967) 2025-09-01 20:12:20 +00:00
Emelia Smith
314d5f0d7a
Fix batch table toolbar displaying under status media (#35962) 2025-09-01 16:02:31 +00:00
Emelia Smith
15401e6988
Support displaying polls in Admin UI (#35933)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2025-09-01 14:59:03 +00:00
diondiondion
6f8187e595
Update Visibility modal copy & preferences link (#35969) 2025-09-01 11:17:27 +00:00
Claire
ab698ff521
Move posting defaults to their own preferences sub-category (#35966) 2025-09-01 08:31:07 +00:00
renovate[bot]
f21d9f64db
Update Node.js to 22.19 (#35954)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-01 07:21:09 +00:00
github-actions[bot]
e95e6064ae
New Crowdin Translations (automated) (#35960)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-09-01 07:20:25 +00:00
Matt Jankowski
70da14871f
Remove unused require of rubygems/package from ip blocks CLI class (#35957) 2025-09-01 06:23:39 +00:00
Matt Jankowski
40242fafee
Use partial for severed relationship download area (#35945) 2025-08-29 15:19:59 +00:00
Matt Jankowski
ee4b0a223c
Add coverage for Relay model (#35950) 2025-08-29 15:18:52 +00:00
ioflow
3c578dbdcd
Fix incorrect RSS feed MIME type in gzip_types directive (#35562) 2025-08-29 14:17:04 +00:00
Claire
4fa203e69e
Rename unknown quote policy value to unsupported_policy (#35955) 2025-08-29 13:50:37 +00:00
Claire
8b7685d956
Add default quote policy to API (#35948) 2025-08-29 11:37:20 +00:00
Claire
4ecbaea8bb
Conditionally bump API version depending on quote post feature flag (#35939) 2025-08-29 10:33:35 +00:00
Matt Jankowski
5f1e6a5886
Fix failure to verify changes in api/v1/accounts/credentials spec (#35951) 2025-08-29 08:14:23 +00:00
github-actions[bot]
97d80265b4
New Crowdin Translations (automated) (#35953)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-29 07:32:22 +00:00
Kazuki Nagasawa
d93572ea90
Fix 404 error after deleting status from detail view (#35800) (#35881) 2025-08-28 20:50:19 +00:00
renovate[bot]
d880f397df
Update dependency @vitejs/plugin-react to v5.0.2 (#35942)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-28 14:04:38 +00:00
renovate[bot]
3ab2d14782
Update Yarn to v4.9.4 (#35837)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-28 12:39:01 +00:00
diondiondion
229cbc6a24
Add hotkey Q for quoting the currently focused post (#35941) 2025-08-28 12:33:23 +00:00
github-actions[bot]
dccd29fe25
New Crowdin Translations (automated) (#35936)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-28 08:47:16 +00:00
Claire
b6cd32281f
Accomodate longer text in quote/reblog dropdown (#35930) 2025-08-27 17:20:02 +00:00
Claire
02de05dc27
Add ability to list quotes of one's own posts (#35914) 2025-08-27 15:38:52 +00:00
Claire
9c55b2fbe4
Enable quotes of manually-reviewed quotes with a different label (#35925) 2025-08-27 14:55:39 +00:00
Claire
a6a0d982ef
Fix streaming and handling of quoted_update notifications (#35924) 2025-08-27 14:53:54 +00:00
Matt Jankowski
c2b7b28919
Use strict locals and remove unused value in card partial (#35919) 2025-08-27 13:22:39 +00:00
Matt Jankowski
5cb7dfafcc
Move lengthy ruby logic from mailer view to helper (#35911) 2025-08-27 13:15:33 +00:00
Matt Jankowski
35a06319fa
Rely on mail_to helper default name arg value (#35913) 2025-08-27 13:05:13 +00:00
renovate[bot]
6f34db9bb7
Update dependency sass to v1.91.0 (#35906)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-27 12:51:06 +00:00
Matt Jankowski
3f1d78f3c6
Use target account from group_by result in admin/reports/index (#35920) 2025-08-27 12:50:16 +00:00
Claire
c00ed9c913
Add digest re-check before removing followers in synchronization mechanism (#34273) 2025-08-27 12:12:55 +00:00
Claire
66f5ad42e2
Fix API return types for interaction API helpers (#35915) 2025-08-27 08:13:34 +00:00
github-actions[bot]
8dcd195527
New Crowdin Translations (automated) (#35922)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-27 08:13:21 +00:00
diondiondion
4180f754d0
Fix error alerts for deleted quotes (#35918) 2025-08-26 16:34:14 +00:00
Claire
6ad0ddebe4
Fix quotes counting (#35917) 2025-08-26 15:51:56 +00:00
Claire
3c9bde31f7
Fix WebUI fetching deleted quote in an endless loop (#35909) 2025-08-26 10:07:02 +00:00
Matt Jankowski
a8166d28ed
Add coverage for "live TOS" and "no TOS" paths in tos/drafts spec (#35902) 2025-08-26 08:43:43 +00:00
github-actions[bot]
460043a969
New Crowdin Translations (automated) (#35908)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-26 08:40:16 +00:00
Matt Jankowski
4f41b7c089
Relax hard-coded attr names in system specs (#35903) 2025-08-26 08:23:45 +00:00
Matt Jankowski
4738a18e52
Use default action of persisted records on edit forms (#35904) 2025-08-25 17:26:25 +00:00
Claire
3c17ccab37
Rearrange posting defaults settings (#35896) 2025-08-25 15:50:22 +00:00
Claire
496370801a
Add quotes_count to serializer specs (#35901) 2025-08-25 15:49:52 +00:00
Claire
f3a932d8a1
Add quoted_update notification type (#35820) 2025-08-25 15:44:18 +00:00
Claire
7aba79ade9
Fix quotes_count attribute on Status not being serialized (#35895) 2025-08-25 14:33:25 +00:00
Claire
7a76f71d99
Ensure quote policy is displayed as “Just me” when disabled because of visibility (#35894) 2025-08-25 13:08:37 +00:00
Claire
012450e87d
Consolidate labels for quote policy settings (#35893) 2025-08-25 12:30:37 +00:00
Claire
d8c07be021
Fix Edit as well as “Delete & Redraft” on a poll not inserting empty option (#35892) 2025-08-25 12:25:35 +00:00
Claire
2560242972
Add quotes_count to statuses stats (#35832) 2025-08-25 12:21:28 +00:00
diondiondion
94ad088482
Fix broken custom radio buttons & checkboxes in modals (#35891) 2025-08-25 09:12:46 +00:00
github-actions[bot]
b771fc0880
New Crowdin Translations (automated) (#35878)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-25 06:54:53 +00:00
Shlee
61a21d6a36
Add crossorigin back to inert css (regression? of #30687) (#35876) 2025-08-25 06:54:47 +00:00
renovate[bot]
d85743576c
Update dependency vite-plugin-svgr to v4.5.0 (#35885)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-25 06:46:10 +00:00
renovate[bot]
a1ca52ed8f
Update dependency @types/react to v18.3.24 (#35888)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-25 06:43:24 +00:00
Claire
f6e822e1f5
Fix issue with Stoplight 5.3 and DragonflyDB (#35868) 2025-08-22 23:59:25 +00:00
Claire
3fd629cf84
Do not mark remote quotes of local posts as approved before request (#35860) 2025-08-22 23:59:18 +00:00
Matt Jankowski
20bc34ca52
Rely on pluck for the SELECT in RuleTranslation.languages (#35826) 2025-08-22 23:58:40 +00:00
github-actions[bot]
abe5413638
New Crowdin Translations (automated) (#35859)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-22 14:53:27 +00:00
Echo
4df50b9c7e
Visibility Modal fixes (#35865) 2025-08-22 12:34:37 +00:00
diondiondion
a1c7b853ec
Improve feed item focus outlines (#35864) 2025-08-22 12:10:07 +00:00
diondiondion
118c30fbc7
Improvements for keyboard navigation in feeds (#35853) 2025-08-22 09:57:39 +00:00
diondiondion
511e10df34
Fix layout shift caused by "Who to follow" widget (#35861) 2025-08-22 09:44:10 +00:00
Emelia Smith
4f494781c1
Refactor to reuse the one status partial across moderation tools (#35644) 2025-08-21 14:51:11 +00:00
Echo
f85f0eee1b
Composer quote improvements (#35835)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-08-21 14:07:31 +00:00
renovate[bot]
e770303968
Update dependency rubyzip to v3.0.2 (#35845)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-21 11:40:40 +00:00
renovate[bot]
23de9c7e6c
Update dependency vite-plugin-static-copy to v3.1.2 (#35846)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-21 11:33:11 +00:00
github-actions[bot]
f696f794cf
New Crowdin Translations (automated) (#35844)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-21 07:42:45 +00:00
renovate[bot]
83f151947e
Update dependency core-js to v3.45.1 (#35843)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-21 07:29:58 +00:00
Matt Jankowski
20a71a5479
Disable Metrics/* cops (#35000) 2025-08-20 17:04:36 +00:00
renovate[bot]
181134153d
Update dependency ruby-vips to v2.2.5 (#35836)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-20 15:31:58 +00:00
Claire
45ec4c93c0
Fix display of quotes in threads in WebUI (#35834) 2025-08-20 14:39:58 +00:00
Matt Jankowski
50cf327819
Use debug? query method on httplog initializer check (#35833) 2025-08-20 12:06:35 +00:00
Echo
8268323d7f
Status quote button (#35822) 2025-08-20 10:09:57 +00:00
github-actions[bot]
54da7ff12b
New Crowdin Translations (automated) (#35829)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-20 08:31:57 +00:00
renovate[bot]
e28fe4199d
Update dependency vite-plugin-pwa to v1.0.3 (#35830)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-20 08:09:02 +00:00
Claire
8d3bca3bb8
Fix serialization of quote policies in nested quotes (#35828) 2025-08-19 17:13:43 +00:00
Echo
f16f8b51b8
Move language and visibility buttons above CW field (#35824) 2025-08-19 15:29:10 +00:00
Claire
831a24ae15
Fix self-destruct scheduler behavior on some Redis setups (#35823) 2025-08-19 14:16:30 +00:00
Claire
736751e5de
Change indexes on quotes to efficiently list quotes of a given account or quoted status (#35819) 2025-08-19 12:50:30 +00:00
renovate[bot]
421dbf9a7f
Update opentelemetry-ruby (non-major) (#35784)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 07:07:46 +00:00
renovate[bot]
7ac16582be
Update dependency prometheus_exporter to v2.3.0 (#35791)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 07:07:26 +00:00
renovate[bot]
5d24cb7514
Update dependency @vitejs/plugin-react to v5.0.1 (#35817)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 06:51:08 +00:00
renovate[bot]
a81b6beeca
Update dependency vite to v7.1.3 (#35818)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 06:51:05 +00:00
github-actions[bot]
10dc66be64
New Crowdin Translations (automated) (#35816)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-19 06:49:37 +00:00
Matt Jankowski
ce813ad144
Avoid method that makes tokens while checking for tokens (#35815) 2025-08-19 06:49:34 +00:00
Echo
d4b2e7f771
Composer Quote UI (#35805)
Co-authored-by: diondiondion <mail@diondiondion.com>
2025-08-18 16:52:28 +00:00
Michael Stanclift
28bf811a07
Update Dockerfile to use Debian 'trixie' (#35768) 2025-08-18 16:45:31 +00:00
Claire
255d8f3f8c
Fix e-mail confirmation bypassing username approval (#35806) 2025-08-18 16:37:13 +00:00
Alan
95111e88e3
Update color alpha blending to use Sass color functions (#35787) 2025-08-18 15:55:38 +00:00
Claire
c2fcf4183c
Fix “Delete & Redraft” as well as “Edit” unexpectedly reseting quote policy (#35808) 2025-08-18 14:51:16 +00:00
Evаn Summers
f5754f2a36
Mention admin@localhost in DEVELOPMENT.md for non-Vagrant setups (#35704) 2025-08-18 14:13:44 +00:00
Claire
72bd1ed4b3
Fix updates to quote policy not being federated (#35804) 2025-08-18 08:34:45 +00:00
Matt Jankowski
9d15b85d3b
Include update in the resources args for api/web/push_subscriptions route (#35801) 2025-08-18 07:35:56 +00:00
github-actions[bot]
a18e6199ef
New Crowdin Translations (automated) (#35795)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-18 07:03:54 +00:00
renovate[bot]
83fcd1cf4f
Update dependency rails-i18n to v8.0.2 (#35796)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-18 07:01:07 +00:00
github-actions[bot]
25f1a515f8
New Crowdin Translations (automated) (#35788)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-15 07:12:01 +00:00
Matt Jankowski
4de21056ff
Update sidekiq to version 8.0.7 (#34824) 2025-08-14 15:25:31 +00:00
Echo
651e51a82e
Allow editing status quote policy (#35762) 2025-08-14 15:04:32 +00:00
Claire
a2cddb9eac
Disallow making private posts quotable (#35780) 2025-08-14 13:58:25 +00:00
Claire
b0ce1ce49d
Fix tootctl admin create not bypassing reserved username checks (#35779) 2025-08-14 13:35:19 +00:00
renovate[bot]
ac0581fd22
Update devDependencies (non-major) (#35660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Renaud Chaput <renchap@gmail.com>
2025-08-14 08:36:38 +00:00
Matt Jankowski
93923a4af2
First pass coverage addition for antispam class (#35771) 2025-08-14 07:57:18 +00:00
renovate[bot]
9fc81adc7b
Update opentelemetry-ruby (non-major) (#35777)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-14 07:51:51 +00:00
renovate[bot]
734dbbcb14
Update dependency rubocop-rails to v2.33.3 (#35766)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-14 07:35:12 +00:00
renovate[bot]
2112416761
Update dependency @rails/ujs to v7.1.502 (#35772)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-14 07:34:30 +00:00
renovate[bot]
c0f64a6603
Update dependency rails to v8.0.2.1 (#35776)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-14 07:34:27 +00:00
Claire
e2e19544ae
Update Vagrantfile (#35765) 2025-08-13 20:45:10 +00:00
Claire
2648bbdc51
Add PUT /api/v1/statuses/:status_id/interaction_policy (#35769) 2025-08-13 15:51:16 +00:00
Echo
49a6e4cbb5
Move composer buttons to top (#35749) 2025-08-13 14:09:45 +00:00
Echo
7cf53dbf63
Redirect on success for standalone compose (#35763) 2025-08-13 13:52:29 +00:00
renovate[bot]
613cbf720c
Update dependency eslint-plugin-jsdoc to v54 (#35760)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-13 07:28:21 +00:00
github-actions[bot]
bce4a572cd
New Crowdin Translations (automated) (#35759)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-13 07:26:03 +00:00
Claire
c893b82ace
Remove unnecessary limitation on manual build-security workflow (#35752) 2025-08-13 07:12:11 +00:00
renovate[bot]
eda8ddddd6
Update dependency json-schema to v6 (#35754)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 16:38:54 +00:00
Claire
63d3f28b20
Fix reply indicator displaying wrong avatar in rare cases (#35756) 2025-08-12 16:16:03 +00:00
renovate[bot]
783b33e2da
Update dependency pino to v9.8.0 (#35722)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 13:54:40 +00:00
renovate[bot]
5847117573
Update dependency eslint-plugin-jsdoc to v53 (#35742)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 13:54:22 +00:00
Claire
258e5c4938
Fix interaction policy changes in implicit updates not being saved (#35751) 2025-08-12 12:19:29 +00:00
renovate[bot]
69ee043f9d
Update dependency rspec-rails to v8.0.2 (#35750)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 09:53:52 +00:00
renovate[bot]
28b5477c6f
Update dependency rubocop-rails to v2.33.1 (#35747)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 09:27:07 +00:00
Matt Jankowski
5ee83a680b
Update stoplight to version 5.3.1 (#35129) 2025-08-12 08:15:22 +00:00
renovate[bot]
d9d7914a8d
Update dependency vite to v7.1.2 (#35746)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-12 07:44:48 +00:00
github-actions[bot]
ca3d67e88d
New Crowdin Translations (automated) (#35745)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-12 07:40:37 +00:00
Matt Jankowski
61f0ce654f
Update rubocop-rails to version 2.33.0 (#35741) 2025-08-12 07:29:02 +00:00
Renaud Chaput
379f12ea00
Update to Vite 7 (#35598) 2025-08-11 12:35:36 +00:00
Echo
bf15b1d65d
Prevent props being added as HTML attributes (#35739) 2025-08-11 12:00:35 +00:00
renovate[bot]
4cabc031e6
Update dependency rubyzip to v3 (#35576)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 10:12:14 +00:00
renovate[bot]
9c5b4b2639
Update dependency sass to v1.90.0 (#35695)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 08:57:42 +00:00
Claire
8a7e84a475
Add test for Delete of inlined QuoteAuthorization (#35724) 2025-08-11 08:55:23 +00:00
Claire
0e99d428b2
Change serialization of Delete activities for QuoteAuthorization to inline the latter (#35725) 2025-08-11 08:55:18 +00:00
renovate[bot]
dbab3912bd
Update dependency hiredis-client to v0.25.2 (#35732)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-11 08:08:40 +00:00
github-actions[bot]
3c6c9d650d
New Crowdin Translations (automated) (#35729)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-11 08:08:33 +00:00
Matt Jankowski
b827a0a6a8
Allow CustomEmoji to normalize its own domain (#35726) 2025-08-11 07:33:36 +00:00
renovate[bot]
ce1680e6f9
Update dependency core-js to v3.45.0 (#35667)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-08 15:32:15 +00:00
Matt Jankowski
b8982cb881
Use around_action to preserve stored location in auth/sessions#destroy (#35716) 2025-08-08 15:31:50 +00:00
renovate[bot]
5d934c2835
Update dependency httplog to v1.7.3 (#35721)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-08 10:06:23 +00:00
David Roetzel
868c46bc76
Add delivery failure handling to FASP jobs (#35723) 2025-08-08 09:46:09 +00:00
github-actions[bot]
1fd147bf2b
New Crowdin Translations (automated) (#35720)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-08 09:00:51 +00:00
Echo
8ee4b3f906
Update Redux to handle quote posts (#35715) 2025-08-08 08:44:05 +00:00
Matt Jankowski
a485f97d21
Replace EmailHelper module with normalizes via model concern (#35702) 2025-08-07 13:47:47 +00:00
Claire
496a5f423e
Inline instrument quote post in outgoing QuoteRequest activities (#35713) 2025-08-07 13:19:18 +00:00
Claire
836a2bfee0
Fix handling of inlined instrument in incoming QuoteRequest (#35714) 2025-08-07 12:52:29 +00:00
github-actions[bot]
39a3ffaf2f
New Crowdin Translations (automated) (#35708)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-07 08:46:11 +00:00
Claire
d4e0784182
Fix quote revocation not being streamed (#35710) 2025-08-07 08:03:15 +00:00
Claire
e615d2f069
Change quote to be fetched with quoted account rather than random follower (#35709) 2025-08-07 08:02:29 +00:00
Claire
ac59772dc6
Change icon of quote notification mails (#35701) 2025-08-06 15:20:16 +00:00
Claire
4838085d66
Bundle quotes and mentions in the same quickfilter bar since quotes don't have their own icon (#35700) 2025-08-06 14:54:03 +00:00
Claire
9ec99ffef1
Add quote_approval_policy parameter when posting and editing statuses (#35699) 2025-08-06 14:23:12 +00:00
Matt Jankowski
6e48322055
Add spec for CanonicalEmailBlock.matching_email scope (#35692) 2025-08-06 12:19:43 +00:00
Claire
55a98580aa
Add UI for revoking quote posts (#35689) 2025-08-06 11:52:56 +00:00
Claire
c8f263c419
Export interaction policies for local posts over ActivityPub (#35697) 2025-08-06 11:31:36 +00:00
github-actions[bot]
6f6e7d8d49
New Crowdin Translations (automated) (#35694)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-06 09:06:22 +00:00
renovate[bot]
fcbd4b7afb
Update dependency annotaterb to v4.18.0 (#35676)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-06 08:43:14 +00:00
Matt Jankowski
4c2ddbf2c4
Update rubocop to version 1.79.2 (#35688) 2025-08-06 08:42:53 +00:00
Claire
a4c05c694f
Fix quote notification filtering and add settings (#35690) 2025-08-05 16:15:16 +00:00
Matt Jankowski
a968849e9c
Use normalizes api for UsernameBlock username change (#35606) 2025-08-05 14:10:28 +00:00
Claire
ffeb5da991
Bump version to v4.4.3 (#35687) 2025-08-05 13:32:20 +00:00
Claire
edece2a197
Merge commit from fork 2025-08-05 14:53:04 +02:00
Claire
1fd3510b32
Change the quote revocation REST API endpoint to return updated quote post (#35677) 2025-08-05 09:42:58 +00:00
renovate[bot]
9c0a10f662
Update dependency capybara-playwright-driver to v0.5.7 (#35675)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 08:19:58 +00:00
github-actions[bot]
54fd1c1f9b
New Crowdin Translations (automated) (#35674)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-05 08:19:55 +00:00
Matt Jankowski
8131268256
Replace unprocessable_entity -> unprocessable_content (#35658) 2025-08-05 07:42:08 +00:00
Claire
5318957ab3
Fix serialization of quote post notification groups (#35670) 2025-08-04 20:58:59 +00:00
Claire
081d38679f
Add quote notifications to WebUI (#35653) 2025-08-04 18:12:37 +00:00
Echo
570c9d16be
Performance regression fixes (#35664) 2025-08-04 17:16:12 +00:00
Echo
28b0e5ee78
Provides legacy fallback for browser that don't support regex flag v (#35659) 2025-08-04 17:15:46 +00:00
Claire
cb0b608fa7
Ensure quoted user is given access to see the post (#35665) 2025-08-04 16:06:59 +00:00
Claire
32791c9745
Accept remote quotes of local quotes according to set policy (#35629) 2025-08-04 15:27:46 +00:00
Claire
0153a239db
Avoid nested transactions when fetching quote posts (#35657) 2025-08-04 14:34:05 +00:00
renovate[bot]
49dcbd22d6
Update eslint (non-major) (#35661)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 14:19:48 +00:00
Claire
5ed9410de0
Disable ActiveRecord query cache in Create critical path (#35662) 2025-08-04 14:15:02 +00:00
David Roetzel
eb273f904f
Make WorkerBatch spec more robust (#35656) 2025-08-04 14:04:40 +00:00
Eugen Rochko
d8397040d7
Fix allow with approval option not working on username blocks (#35655) 2025-08-04 13:10:19 +00:00
Eugen Rochko
c8ec649830
Fix "new replies available" miscounting previously known replies (#35654) 2025-08-04 12:49:17 +00:00
Claire
80aadc55df
Add missing mailer for quote notifications (#35652) 2025-08-04 10:44:59 +00:00
github-actions[bot]
f68bd21600
New Crowdin Translations (automated) (#35634)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-04 09:20:50 +00:00
renovate[bot]
59e729e3fe
Update dependency ioredis to v5.7.0 (#35617)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 08:34:04 +00:00
renovate[bot]
895975e2ab
Update dependency haml_lint to v0.66.0 (#35649)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 08:33:41 +00:00
renovate[bot]
1228e000a1
Update dependency pg to v1.6.1 (#35559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 08:33:17 +00:00
renovate[bot]
3d3d2c93d6
Update DefinitelyTyped types (non-major) (#35647)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 08:12:11 +00:00
Claire
3caa318dfe
Fix WebUI crashing for accounts with null URL (#35651) 2025-08-04 07:49:12 +00:00
Claire
927cfea5ae
Update dependency ruby-saml to v1.18.1 (#35650) 2025-08-04 07:49:08 +00:00
David Roetzel
05cdd3f6eb
Track delivery failures to FASP (#35628) 2025-08-04 07:43:34 +00:00
renovate[bot]
bf46cffd9e
Update peter-evans/create-pull-request action to v7.0.8 (#35648)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 06:48:16 +00:00
renovate[bot]
ab1a5b4822
Update Node.js to 22.18 (#35621)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 06:46:38 +00:00
Claire
591df1f205
Add support for local quote stamps (#35626) 2025-08-01 14:55:25 +00:00
Matt Jankowski
483da67204
Remove unused obscured_counter helper method (#35627) 2025-08-01 14:28:45 +00:00
David Roetzel
fba24cc4eb
Add minute resolution to DeliveryFailureTracker (#35625) 2025-08-01 13:29:22 +00:00
renovate[bot]
bcab6a9318
Update dependency sidekiq-scheduler to v6 (#35596)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-01 11:57:13 +00:00
Claire
6268321316
Ensure blocked users cannot quote (#35624) 2025-08-01 09:34:12 +00:00
Claire
29a5f059d2
Add notifications for inbound quotes (#35618) 2025-08-01 09:12:46 +00:00
github-actions[bot]
d09f866daa
New Crowdin Translations (automated) (#35622)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-01 07:57:38 +00:00
renovate[bot]
1d86df685b
Update dependency puma to v6.6.1 (#35620)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-01 06:34:05 +00:00
Echo
6bca52453a
Emoji Rendering Efficiency (#35568) 2025-07-31 17:30:14 +00:00
Claire
0e249cba4b
Revoke quote posts when those get deleted (#35614) 2025-07-31 14:23:36 +00:00
Claire
19db4cb7c1
Add example of quote post with a preview card to development sample data (#35616) 2025-07-31 13:39:26 +00:00
Echo
b81670776f
Modern Emoji: Use local storage to opt-in (#35605) 2025-07-31 13:33:34 +00:00
renovate[bot]
8452ec6f3b
Update dependency rubocop to v1.79.1 (#35613)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-31 12:35:22 +00:00
Claire
f7388af721
Fix Chewy::UndefinedUpdateStrategy in dev:populate_sample_data task when Elasticsearch is enabled (#35615) 2025-07-31 12:34:21 +00:00
Claire
2dfdcc7dcb
Add API endpoints to view and revoke one's quoted posts (#35578) 2025-07-31 09:36:51 +00:00
Claire
572a0e128d
Change quote verification to not bypass authorization flow for mentions (#35528) 2025-07-31 07:39:53 +00:00
github-actions[bot]
2131d1ff23
New Crowdin Translations (automated) (#35611)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-31 07:26:24 +00:00
renovate[bot]
fc1abed0dc
Update dependency database_cleaner-active_record to v2.2.2 (#35610)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-31 07:14:48 +00:00
Claire
e5826777b6
Fix friends-of-friends recommendations suggesting already-requested accounts (#35604) 2025-07-30 16:28:26 +00:00
Eugen Rochko
b80e95b2aa
Change new replies to be loaded automatically if thread previously empty (#35603) 2025-07-30 16:18:58 +00:00
Eugen Rochko
2257612deb
Fix "new replies available" reporting a false positive for re-fetched root status (#35602) 2025-07-30 16:09:16 +00:00
Eugen Rochko
92bf55afd0
Change design of quote posts in web UI (#35584) 2025-07-30 15:53:42 +00:00
Osman
39250ab961
Sort auditable accounts (#35272) 2025-07-30 15:08:05 +00:00
Claire
efc0d237af
Fix synchronous recursive fetching of deeply-nested quoted posts (#35600) 2025-07-30 14:39:30 +00:00
Claire
31ba52a57b
Change StatusReachFinder to consider quotes as well as reblogs (#35601) 2025-07-30 14:07:01 +00:00
Matt Jankowski
e8e6cf9510
Add coverage to user spec for missing last_sign_in_at scenario (#35587) 2025-07-30 13:46:58 +00:00
Matt Jankowski
139025fce0
Fix wrong policy authorization in admin controllers (#35588) 2025-07-30 13:17:53 +00:00
Matt Jankowski
3146109b08
Add MediaAttachment.combined_media_file_size method (#35570) 2025-07-30 12:57:51 +00:00
Matt Jankowski
8896d6c1b1
Use attribute for User#bypass_registration_checks? (#35580) 2025-07-30 12:55:36 +00:00
renovate[bot]
25add0af31
Update dependency cross-env to v10 (#35564)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-30 12:15:56 +00:00
renovate[bot]
027657b590
Update dependency eslint-plugin-jsdoc to v52 (#35561)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-30 12:14:33 +00:00
Matt Jankowski
7e6b134222
Extract User::Activity concern (#35581) 2025-07-30 11:19:11 +00:00
Matt Jankowski
4042bc959b
Use increment for User#update_sign_in! optional change (#35573) 2025-07-30 10:38:04 +00:00
Matt Jankowski
6dc55a2f4e
Extract User::Confirmation concern (#35582) 2025-07-30 10:33:57 +00:00
Matt Jankowski
15b72591d4
Use attribute for User#external? (#35579) 2025-07-30 09:48:18 +00:00
Matt Jankowski
fd779c25b9
Avoid return not_found in statuses controller (#35585) 2025-07-30 09:28:20 +00:00
Matt Jankowski
ece49baa38
Use generated query method for check in admin/domain_blocks (#35589) 2025-07-30 09:27:29 +00:00
Matt Jankowski
ba9fa54f9c
Add coverage for more admin/domain_blocks scenarios (#35590) 2025-07-30 08:52:47 +00:00
github-actions[bot]
1c89309db0
New Crowdin Translations (automated) (#35592)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-30 08:37:33 +00:00
Eugen Rochko
a368b29e27
Fix number of new replies increasing even if reply was not fetched (#35577) 2025-07-29 10:47:18 +00:00
Eugen Rochko
20bbd20ef1
Add ability to block words in usernames (#35407) 2025-07-29 10:19:15 +00:00
Eugen Rochko
8cf7a77808
Fix async refresh never being finished when status cannot be fetched (#35500) 2025-07-29 09:23:32 +00:00
Eugen Rochko
d121007927
Change "new replies available" notice to be above replies in web UI (#35575) 2025-07-29 09:00:27 +00:00
Claire
3eca8cce1c
Add second set of blocked text that applies to accounts regardless of account age (#35563) 2025-07-29 08:59:16 +00:00
github-actions[bot]
d299b0d576
New Crowdin Translations (automated) (#35574)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-29 08:59:00 +00:00
Matt Jankowski
ea976a5ffb
Fix unnecessary account note addition for already-muted moved-to users (#35566) 2025-07-29 08:23:19 +00:00
Matt Jankowski
bedbab74b9
Use bundler version 2.7.1 (#35567) 2025-07-29 08:22:04 +00:00
Matt Jankowski
c587c44975
Fix Lint/NonLocalExitFromIterator cop in JSON-LD helper (#34948) 2025-07-28 15:35:37 +00:00
David Roetzel
f1b9868980
Bypass registration checks for seeded admin user (#35565) 2025-07-28 13:25:16 +00:00
Matt Jankowski
8d6f033326
Fix Style/GuardClause in move worker (#35520) 2025-07-28 12:55:05 +00:00
Colin Dean
b5cebf45ea
Swap order of translation restoration and service credit on post card (#33619) 2025-07-28 11:33:11 +00:00
renovate[bot]
513b6289d6
chore(deps): update dependency strong_migrations to v2.5.0 (#35560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-28 09:34:14 +00:00
Matt Jankowski
040a638ab9
Fix Style/GuardClause in Tag (#35522) 2025-07-28 08:54:29 +00:00
Matt Jankowski
eb73ae2f86
Fix Style/GuardClause in User#regenerate_feed! (#35523) 2025-07-28 08:53:52 +00:00
Matt Jankowski
916cc1365e
Fix Style/GuardClause in User#wrap_email_confirmation (#35524) 2025-07-28 08:52:59 +00:00
Matt Jankowski
86ef4d4884
Add skip_* methods to check move worker process (#35538) 2025-07-28 08:50:19 +00:00
renovate[bot]
456c3bda0b
chore(deps): update dependency omniauth-cas to v3.0.2 (#35558)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-28 08:41:31 +00:00
Matt Jankowski
63daf6b317
Fix Style/GuardClause in PreviewCard (#35525) 2025-07-28 08:40:37 +00:00
Matt Jankowski
e183d7dd9a
Fix Style/GuardClause in app/helpers (#35526) 2025-07-28 08:40:20 +00:00
Matt Jankowski
2acc942bb4
Fix Style/GuardClause in WebfingerResource (#35531) 2025-07-28 08:39:11 +00:00
Matt Jankowski
038de44110
Fix Style/GuardClause in Webfinger lib (#35532) 2025-07-28 08:38:55 +00:00
renovate[bot]
3b01f98c11
fix(deps): update dependency vite-plugin-pwa to v1.0.2 (#35529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-28 08:32:47 +00:00
Matt Jankowski
7cd3738c19
Add with_list_account scope to List model (#35539) 2025-07-28 08:26:29 +00:00
Eugen Rochko
018e5e303f
Fix jobs being added to batch after they might already execute (#35496) 2025-07-28 08:20:12 +00:00
github-actions[bot]
a57a9505d4
New Crowdin Translations (automated) (#35537)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-28 08:14:11 +00:00
Matt Jankowski
720ee96969
Move repeated snowflake ID gather to base classes (#35554) 2025-07-28 08:14:06 +00:00
Matt Jankowski
73f72ec8fe
Use attribute for defining rate_limit boolean (#35555) 2025-07-28 08:08:31 +00:00
Matt Jankowski
5d69157e62
Prefer delegated nil-wrapping methods to safe navigation (#35541) 2025-07-28 08:03:23 +00:00
Matt Jankowski
b464b87c2b
Use moved? query method where relevant (#35542) 2025-07-28 08:02:21 +00:00
Matt Jankowski
9d0d6f011c
Add coverage for AnnouncementReaction model (#35543) 2025-07-28 07:59:32 +00:00
william light
f3786e0816
hotkeys: only match just() when no modifiers are held (#35535) 2025-07-26 05:51:50 +00:00
Claire
e93efe0e13
Fix unnecessary duplication in vite code for finding entrypoints (#35515) 2025-07-25 16:38:21 +00:00
Claire
5a88b7f683
Add experimental basic quote post authoring (#35355) 2025-07-25 12:35:24 +00:00
Roni Laukkarinen
81da377d8e
Fix Vite build failure on Node.js v20 due to undefined file.parentPath (#35509) 2025-07-25 07:59:49 +00:00
github-actions[bot]
d950298d29
New Crowdin Translations (automated) (#35514)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-25 07:29:48 +00:00
Matt Jankowski
2e35defeec
Update rubocop to version 1.79.0 (#35502) 2025-07-25 07:22:05 +00:00
Matt Jankowski
960f693219
Use field partial in admin account show view (#35503) 2025-07-25 07:21:08 +00:00
Matt Jankowski
e5e977c24f
Fix Style/GuardClause in worker rescues (#35508) 2025-07-25 07:18:46 +00:00
Claire
a863e68d17
Add restrictions on which quote posts can trend (#35507) 2025-07-24 15:45:12 +00:00
renovate[bot]
847b37552a
chore(deps): update dependency httplog to v1.7.2 (#35506)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-24 15:08:50 +00:00
Echo
dfaca794bf
Force modern emoji experimental to be dev mode only (#35505) 2025-07-24 14:55:00 +00:00
diondiondion
6fc77a545b
fix: Fix TypeError on pages with empty feeds (#35504) 2025-07-24 14:30:56 +00:00
renovate[bot]
c871c7398e
fix(deps): update dependency @vitejs/plugin-react to v4.7.0 (#35421)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-24 09:00:32 +00:00
Mayank
8baed8b90e
remove redundant title text from media modal images in web UI (#35468) 2025-07-24 08:58:22 +00:00
David Roetzel
8a1c43bf3b
Use default for preselected default privacy post setting (#35422) 2025-07-24 08:23:41 +00:00
Matt Jankowski
5c01ccc31f
Set flash options via redirect where possible (#35370) 2025-07-24 08:03:28 +00:00
renovate[bot]
67be8208db
chore(deps): update dependency haml_lint to v0.65.1 (#35497)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-24 07:52:34 +00:00
David Roetzel
7d136feccf
Bump version to v4.4.2 (#35498) 2025-07-24 07:51:56 +00:00
Matt Jankowski
e54e96d61f
Extract params hash for api/v1/push/subscriptions#create (#35475) 2025-07-24 07:49:20 +00:00
github-actions[bot]
469304359a
New Crowdin Translations (automated) (#35495)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-24 07:49:09 +00:00
Matt Jankowski
290e36d7e8
Finish migration of api/web/push_subscriptions controller->request spec (#35482) 2025-07-24 07:46:09 +00:00
Matt Jankowski
4241ce9888
Silence json key duplicate warning from api/web/push_subscriptions (#35481) 2025-07-24 07:33:53 +00:00
Echo
7f9ad7eabf
Enables cross-origin Web Workers (#35483) 2025-07-24 07:14:27 +00:00
Claire
a6794c066d
Fix “Expand this post” link including user @undefined (#35478) 2025-07-23 23:09:24 +00:00
Echo
7d3ef27a8d
Fix accidentally instantiating Web Worker (#35473) 2025-07-23 14:01:45 +00:00
Eugen Rochko
14a781fa24
Add button to load new replies in web UI (#35210) 2025-07-23 13:42:07 +00:00
renovate[bot]
cec26d58c8
chore(deps): update dependency json-ld-preloaded to v3.3.2 (#35470)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 08:13:04 +00:00
renovate[bot]
593cdae404
fix(deps): update dependency axios to v1.11.0 (#35471)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 08:12:16 +00:00
Matt Jankowski
d2ef9ac04a
Use report_range method in admin/tags to generate reporting period (#35465) 2025-07-23 08:02:07 +00:00
Matt Jankowski
d065ec9298
Combine assignment params in admin/accounts#batch action (#35463) 2025-07-23 07:59:14 +00:00
Matt Jankowski
b19131202f
Extract constants for captcha directives/sources (#35439) 2025-07-23 07:55:54 +00:00
Matt Jankowski
70058ae49d
Add Form::BaseBatch class for "batch form update" objects (#35458) 2025-07-23 07:50:35 +00:00
renovate[bot]
62a23b1985
chore(deps): update dependency rspec-sidekiq to v5.2.0 (#35436)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 07:42:48 +00:00
renovate[bot]
6917cd2f40
chore(deps): update dependency propshaft to v1.2.1 (#35451)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 07:40:24 +00:00
diondiondion
d36236cbcd
fix: Fix glitchy status keyboard navigation (#35455) 2025-07-23 07:39:36 +00:00
Echo
760d00b7f7
Emoji Rendering (#35424) 2025-07-22 14:43:15 +00:00
Echo
0af2c4829f
Creates Vite plugin to generate assets file (#35454) 2025-07-22 13:58:04 +00:00
github-actions[bot]
be3dc5b508
New Crowdin Translations (automated) (#35453)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-22 10:10:37 +00:00
renovate[bot]
ae13063460
chore(deps): update dependency eslint-plugin-jsdoc to v51 (#35026)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 16:31:10 +00:00
renovate[bot]
1ed58aaaf2
fix(deps): update dependency axios to v1.10.0 (#35050)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 16:28:49 +00:00
renovate[bot]
bf17895d19
chore(deps): update dependency chromatic to v13 (#35064)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 16:28:01 +00:00
Matt Jankowski
20b3c43dde
Update playwright-ruby-client to version 1.54.0 (#35448) 2025-07-21 16:24:55 +00:00
diondiondion
ee21f72211
fix: Don't submit post when pressing Enter in CW field (#35445) 2025-07-21 15:57:20 +00:00
diondiondion
4de5cbd6f5
refactor: Replace react-hotkeys with custom hook (#35425) 2025-07-21 14:43:38 +00:00
Matt Jankowski
fab95b8dae
Add coverage for api/v1/invites scenarios (#35389) 2025-07-21 14:17:53 +00:00
renovate[bot]
4d2655490c
chore(deps): update dependency nokogiri to v1.18.9 (#35433)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 12:25:28 +00:00
github-actions[bot]
6bb4113d0a
New Crowdin Translations (automated) (#35428)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-21 09:01:34 +00:00
Matt Jankowski
3e76f01db4
Use bundler version 2.7.0 (#35430) 2025-07-21 08:07:53 +00:00
diondiondion
cf580d8c90
Don't require JSDoc params & return in TS (#35426) 2025-07-18 18:34:04 +00:00
github-actions[bot]
dbd0c3cbd9
New Crowdin Translations (automated) (#35420)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-18 07:52:05 +00:00
diondiondion
3771f9e04b
fix: Fix quote posts styling on notifications page (#35411) 2025-07-17 17:28:30 +00:00
diondiondion
a842b14c84
refactor: Disable useDrag hook when main menu is not openable (#35414) 2025-07-17 12:39:40 +00:00
diondiondion
138746bdcc
fix: Add lang attribute to current composer language in alt text modal (#35412) 2025-07-17 11:12:54 +00:00
Echo
9e6a9efe10
Replace Ruby Vite plugins (#35195)
Co-authored-by: Renaud Chaput <renchap@gmail.com>
2025-07-17 10:04:04 +00:00
renovate[bot]
19626ad89f
chore(deps): update dependency httplog to v1.7.1 (#35406)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 09:32:57 +00:00
github-actions[bot]
7e2d92284c
New Crowdin Translations (automated) (#35408)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-17 09:31:22 +00:00
renovate[bot]
20fb6bd788
chore(deps): update docker.io/ruby docker tag to v3.4.5 (#35397)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 09:03:40 +00:00
diondiondion
faffb73cbd
fix: Improve a11y of custom select menus in notifications settings (#35403) 2025-07-17 08:56:00 +00:00
renovate[bot]
02a4e30594
chore(deps): update dependency propshaft to v1.2.0 (#35398)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 08:48:10 +00:00
renovate[bot]
f10b522f0c
chore(deps): update dependency ruby to v3.4.5 (#35395)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-17 08:47:39 +00:00
github-actions[bot]
331599fa2b
New Crowdin Translations (automated) (#35399)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-16 12:24:09 +00:00
diondiondion
558b9c90a6
fix: Fix selected item in poll select menus is unreadable in Firefox (#35402) 2025-07-16 12:03:39 +00:00
Renaud Chaput
7d2dda97b3
Remove the "to triage" label status (#35394) 2025-07-16 07:17:21 +00:00
diondiondion
74fc4dbacf
refactor: Only remove pointer-events when necessary (#35390) 2025-07-15 15:57:31 +00:00
diondiondion
07912a1cb7
Update age limit wording (#35387) 2025-07-15 15:46:44 +00:00
Claire
d36bf3b6fb
Fix support for quote verification in implicit status updates (#35384) 2025-07-15 15:36:12 +00:00
Claire
594976a538
Refactor ActivityPub::Activity::Accept and ActivityPub::Activity::Reject specs (#35382) 2025-07-15 13:18:37 +00:00
Matt Jankowski
0efb889a9c
Extract constant for attribution domains limit in account (#35350) 2025-07-15 13:08:24 +00:00
Claire
c0eabe289b
Always give local quote of remote posts a quote request URI (#35383) 2025-07-15 13:01:03 +00:00
Claire
5bbc3c5ebb
Fix quoteAuthorization type in JSON-LD context (#35380) 2025-07-15 09:32:02 +00:00
github-actions[bot]
d5e2cf5d3c
New Crowdin Translations (automated) (#35379)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-15 08:16:56 +00:00
diondiondion
82a6ff091f
fix: Improve Dropdown component accessibility (#35373) 2025-07-15 07:52:34 +00:00
renovate[bot]
4b8e60682d
fix(deps): update dependency react-select to v5.10.2 (#35352)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-15 06:32:38 +00:00
renovate[bot]
6c2db9b1cf
fix(deps): update dependency vite-plugin-static-copy to v3.1.1 (#35367)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-15 06:32:00 +00:00
Matt Jankowski
30344d6abf
Confirm User#login_activities in auth/sessions spec (#35372) 2025-07-15 06:31:00 +00:00
Matt Jankowski
1637297085
Add coverage for CustomFilterStatus model (#35374) 2025-07-15 06:28:40 +00:00
Matt Jankowski
dec1fb71f4
Add coverage for FollowRecommendationMute model (#35376) 2025-07-15 06:27:36 +00:00
Matt Jankowski
7273f6c03c
Move shared params to common method in admin/reports/actions (#35353) 2025-07-14 09:23:18 +00:00
Matt Jankowski
a3ffd2edf8
Use sequence for unique names on webauthn cred fabricator (#35356) 2025-07-14 09:20:50 +00:00
renovate[bot]
a2c5eace88
chore(deps): update dependency annotaterb to v4.17.0 (#35368)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-14 07:07:21 +00:00
github-actions[bot]
a643d9d498
New Crowdin Translations (automated) (#35358)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-14 06:21:56 +00:00
Claire
3b52dca405
Fix quote attributes missing from Mastodon's context (#35354) 2025-07-11 16:35:06 +00:00
Echo
853a0c466e
Make bio hashtags open the local page instead of the remote instance (#35349) 2025-07-11 15:18:34 +00:00
Echo
94bceb8683
Expose enabled features to the frontend (#35348) 2025-07-11 13:15:22 +00:00
Claire
88b0f3a172
Simplify DatabaseViewRecord.refresh (#35252) 2025-07-11 08:36:05 +00:00
github-actions[bot]
b69b5ba775
New Crowdin Translations (automated) (#35344)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-11 08:14:39 +00:00
Matt Jankowski
c442589593
Use ActiveModel::Attributes in FollowLimitable concern (#35327) 2025-07-10 07:40:56 +00:00
renovate[bot]
28633a504a
chore(deps): update dependency json-schema to v5.2.1 (#35337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-10 07:38:07 +00:00
Matt Jankowski
ad78701b6f
Mark private methods in AnnualReport::TopStatuses (#35256) 2025-07-10 07:35:40 +00:00
Matt Jankowski
1496488771
Add Status#not_replying_to_account scope for annual report classes (#35257) 2025-07-10 07:35:04 +00:00
renovate[bot]
dd3d958e75
fix(deps): update dependency core-js to v3.44.0 (#35284)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-10 07:23:54 +00:00
github-actions[bot]
b363a3651d
New Crowdin Translations (automated) (#35335)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-10 07:23:27 +00:00
renovate[bot]
86645fc14c
chore(deps): update dependency rubocop to v1.78.0 (#35289)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-10 07:23:23 +00:00
Matt Jankowski
f9beecb343
Improve Accounts CLI prune spec (#35302) 2025-07-10 07:23:09 +00:00
Matt Jankowski
4ecfbd3920
Add Status.only_polls (and without polls) scope (#35330) 2025-07-10 07:13:22 +00:00
Claire
a315934314
Fix styling of external log-in button (#35320) 2025-07-10 06:56:40 +00:00
Claire
e9170e2de1
Bump version to v4.4.1 (#35329) 2025-07-09 16:22:25 +00:00
Claire
5cfc1fabcf
Fix nearly every sub-directory being crawled as part of Vite build (#35323) 2025-07-09 14:34:16 +00:00
David Roetzel
786b12e379
Relax error restriction in initializer (#35321) 2025-07-09 14:22:47 +00:00
Claire
e7c5c25de8
Fix replying from media modal or pop-in-player tagging user @undefined (#35317) 2025-07-09 12:13:51 +00:00
Echo
a1e8813522
Emoji Indexing and Search (#35253) 2025-07-09 09:55:41 +00:00
github-actions[bot]
76c1446416
New Crowdin Translations (automated) (#35310)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-09 09:10:55 +00:00
Claire
8bd2c87399
Fix support for special characters in various environment variables (#35314)
Co-authored-by: Matt Jankowski <matt@jankowski.online>
2025-07-09 08:58:41 +00:00
Matt Jankowski
1e2d77f2c7
Use if_exists: true when removing duplicate indexes (#35309) 2025-07-09 08:45:29 +00:00
Matt Jankowski
fb6c22f5c2
Use touch to record viewing annual report (#35296) 2025-07-09 08:04:00 +00:00
Matt Jankowski
f7259f625f
Prefer on: :update in Tag validation declaration (#35297) 2025-07-09 08:03:39 +00:00
Claire
b628a98d32
Bump version to v4.4.0 (#35291) 2025-07-08 14:26:43 +00:00
Miguel Landaeta
d8fa807998
Bump linzer to 0.7.7 (#35258) 2025-07-08 13:04:16 +00:00
Echo
ef66d8379c
Add option to set emoji preferences behind feature flag (#35282) 2025-07-08 10:51:11 +00:00
David Roetzel
8ee6cee36e
Better error response to malformed headers (#35278) 2025-07-08 09:31:04 +00:00
github-actions[bot]
71b2120e5c
New Crowdin Translations (automated) (#35286)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-08 09:22:38 +00:00
renovate[bot]
b10078633c
chore(deps): update dependency libvips to v8.17.1 (#35283)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 08:35:54 +00:00
diondiondion
b5eebd4d2b
fix: Fix can't skip search field by tabbing (#35281) 2025-07-07 15:10:51 +00:00
Claire
fdefc4d2b4
Add ability to manually trigger i18n uploads (#35279) 2025-07-07 09:22:22 +00:00
github-actions[bot]
f6b2609353
New Crowdin Translations (automated) (#35269)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-07 08:21:51 +00:00
Matt Jankowski
bdffdcb12f
Remove unused scopes in Account model (#35276) 2025-07-07 08:07:01 +00:00
Claire
1ebb87a6a8
Fix incorrect name in scheduler configuration (#35263) 2025-07-04 07:51:01 +00:00
github-actions[bot]
83660ee381
New Crowdin Translations (automated) (#35261)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-04 07:34:54 +00:00
David Roetzel
1fa72d6c44
Raise better exception on FASP error responses (#35262) 2025-07-04 07:25:42 +00:00
Andy Piper
5a7c0d42f7
Add specific language confirming that we test with BrowserStack and Chromatic (#35248)
Signed-off-by: Andy Piper <andypiper@users.noreply.github.com>
2025-07-03 20:51:32 +00:00
Matt Jankowski
e8d2432e6a
Fix intermittent failure of TOS model spec from effective date collision (#35244) 2025-07-03 16:28:47 +00:00
Matt Jankowski
2af17adc34
Use ActiveModel::Attributes in admin/status_batch_action (#35255) 2025-07-03 14:43:36 +00:00
Claire
e97f43399b
Fix error handling for blank actions in account moderation action form (#35246) 2025-07-03 14:42:48 +00:00
github-actions[bot]
c66c5fd73d
New Crowdin Translations (automated) (#35250)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-03 09:47:57 +00:00
diondiondion
3c0767f543
fix: Remove focus highlight when status is clicked in light mode (#35251) 2025-07-03 07:51:12 +00:00
renovate[bot]
70cd1fdc63
fix(deps): update dependency vite-plugin-pwa to v1.0.1 (#35223)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-03 07:32:51 +00:00
renovate[bot]
39028dde40
chore(deps): update dependency scenic to v1.9.0 (#35226)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-03 07:32:15 +00:00
Matt Jankowski
6e39b5ef04
Use ActiveModel::Attributes for admin/account_action boolean values (#35247) 2025-07-03 07:28:07 +00:00
Matt Jankowski
49db8a9662
Use Account#targeted_reports association where needed (#35249) 2025-07-03 07:28:03 +00:00
Andy Piper
2cfa6cb0e0
Update README with testing tool references. (#35236)
Signed-off-by: Andy Piper <andypiper@users.noreply.github.com>
2025-07-02 12:00:15 +00:00
Matt Jankowski
1ae3510ede
Add coverage for TOS interstitial interruption flow of web app controller concern (#35235) 2025-07-02 09:21:32 +00:00
github-actions[bot]
6f1135d763
New Crowdin Translations (automated) (#35238)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-02 09:17:03 +00:00
Echo
52bc2f64f4
Import Emojibase data (#35229) 2025-07-02 08:58:39 +00:00
renovate[bot]
b1375328e1
chore(deps): update dependency faker to v3.5.2 (#35239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 08:02:33 +00:00
renovate[bot]
9443e2cc4b
chore(deps): update dependency opentelemetry-instrumentation-http to v0.25.1 (#35240)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-02 08:02:30 +00:00
Renaud Chaput
3a533c6c8d
Bump version to 4.5.0-alpha.1 (#35231) 2025-07-02 08:00:43 +00:00
Matt Jankowski
c047014214
Add coverage for valid_locale_or_nil languages helper method (#34866) 2025-07-02 07:34:42 +00:00
Claire
68b05e994f
Fix error on log-in from old users requiring ToS interstitial when said ToS has been removed (#35233) 2025-07-01 17:43:59 +00:00
1220 changed files with 41774 additions and 19649 deletions

View file

@ -5,6 +5,7 @@
.gitattributes
.gitignore
.github
.vscode
public/system
public/assets
public/packs
@ -20,6 +21,7 @@ postgres14
redis
elasticsearch
chart
storybook-static
.yarn/
!.yarn/patches
!.yarn/plugins

View file

@ -88,24 +88,3 @@ S3_ALIAS_HOST=files.example.com
# -----------------------
IP_RETENTION_PERIOD=31556952
SESSION_RETENTION_PERIOD=31556952
# Fetch All Replies Behavior
# --------------------------
# When a user expands a post (DetailedStatus view), fetch all of its replies
# (default: false)
FETCH_REPLIES_ENABLED=false
# Period to wait between fetching replies (in minutes)
FETCH_REPLIES_COOLDOWN_MINUTES=15
# Period to wait after a post is first created before fetching its replies (in minutes)
FETCH_REPLIES_INITIAL_WAIT_MINUTES=5
# Max number of replies to fetch - total, recursively through a whole reply tree
FETCH_REPLIES_MAX_GLOBAL=1000
# Max number of replies to fetch - for a single post
FETCH_REPLIES_MAX_SINGLE=500
# Max number of replies Collection pages to fetch - total
FETCH_REPLIES_MAX_PAGES=500

View file

@ -1,6 +1,6 @@
name: Bug Report (Web Interface)
description: There is a problem using Mastodon's web interface.
labels: ['status/to triage', 'area/web interface']
labels: ['area/web interface']
type: Bug
body:
- type: markdown

View file

@ -1,7 +1,6 @@
name: Bug Report (server / API)
description: |
There is a problem with the HTTP server, REST API, ActivityPub interaction, etc.
labels: ['status/to triage']
type: 'Bug'
body:
- type: markdown

View file

@ -6,6 +6,7 @@
':labels(dependencies)',
':prConcurrentLimitNone', // Remove limit for open PRs at any time.
':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour.
':enableVulnerabilityAlertsWithLabel(security)',
],
rebaseWhen: 'conflicted',
minimumReleaseAge: '3', // Wait 3 days after the package has been published before upgrading it
@ -23,7 +24,6 @@
matchManagers: ['npm'],
matchPackageNames: [
'tesseract.js', // Requires code changes
'react-hotkeys', // Requires code changes
// react-router: Requires manual upgrade
'history',
@ -94,6 +94,19 @@
matchUpdateTypes: ['patch', 'minor'],
groupName: 'eslint (non-major)',
},
{
// Group all Storybook-related packages in the same PR
matchManagers: ['npm'],
matchPackageNames: [
'chromatic',
'storybook',
'@storybook/*',
'msw',
'msw-storybook-addon',
],
matchUpdateTypes: ['patch', 'minor'],
groupName: 'storybook (non-major)',
},
{
// Group actions/*-artifact in the same PR
matchManagers: ['github-actions'],
@ -142,6 +155,12 @@
matchUpdateTypes: ['patch', 'minor'],
groupName: 'opentelemetry-ruby (non-major)',
},
{
// Group Playwright Ruby & JS deps in the same PR, as they need to be in sync
matchManagers: ['bundler', 'npm'],
matchPackageNames: ['playwright-ruby-client', 'playwright'],
groupName: 'Playwright',
},
// Add labels depending on package manager
{ matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
{ matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },

View file

@ -21,7 +21,7 @@ jobs:
# Only tag with latest when ran against the latest stable branch
# This needs to be updated after each minor version release
flavor: |
latest=${{ startsWith(github.ref, 'refs/tags/v4.4.') }}
latest=${{ startsWith(github.ref, 'refs/tags/v4.5.') }}
tags: |
type=pep440,pattern={{raw}}
type=pep440,pattern=v{{major}}.{{minor}}
@ -39,7 +39,7 @@ jobs:
# Only tag with latest when ran against the latest stable branch
# This needs to be updated after each minor version release
flavor: |
latest=${{ startsWith(github.ref, 'refs/tags/v4.4.') }}
latest=${{ startsWith(github.ref, 'refs/tags/v4.5.') }}
tags: |
type=pep440,pattern={{raw}}
type=pep440,pattern=v{{major}}.{{minor}}

View file

@ -9,7 +9,6 @@ permissions:
jobs:
compute-suffix:
runs-on: ubuntu-latest
if: github.repository == 'mastodon/mastodon'
steps:
- id: version_vars
env:

View file

@ -25,8 +25,8 @@ jobs:
strategy:
fail-fast: false
matrix:
language: ['javascript', 'ruby']
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
language: ['actions', 'javascript', 'ruby']
# CodeQL supports [ 'actions', 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:

View file

@ -50,7 +50,7 @@ jobs:
# Create or update the pull request
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7.0.6
uses: peter-evans/create-pull-request@v7.0.8
with:
commit-message: 'New Crowdin translations'
title: 'New Crowdin Translations for ${{ github.base_ref || github.ref_name }} (automated)'

1
.gitignore vendored
View file

@ -23,6 +23,7 @@
/public/packs
/public/packs-dev
/public/packs-test
stats.html
.env
.env.production
node_modules/

2
.nvmrc
View file

@ -1 +1 @@
22.17
24.10

View file

@ -1,17 +1,21 @@
---
Metrics/AbcSize:
Exclude:
- lib/mastodon/cli/*.rb
Enabled: false
Metrics/BlockLength:
Enabled: false
Metrics/BlockNesting:
Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/CollectionLiteralLength:
Enabled: false
Metrics/CyclomaticComplexity:
Exclude:
- lib/mastodon/cli/*.rb
Enabled: false
Metrics/MethodLength:
Enabled: false
@ -20,4 +24,7 @@ Metrics/ModuleLength:
Enabled: false
Metrics/ParameterLists:
CountKeywordArgs: false
Enabled: false
Metrics/PerceivedComplexity:
Enabled: false

View file

@ -1,32 +1,11 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
# using RuboCop version 1.77.0.
# using RuboCop version 1.80.2.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
Lint/NonLocalExitFromIterator:
Exclude:
- 'app/helpers/json_ld_helper.rb'
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
Max: 82
# Configuration parameters: CountBlocks, CountModifierForms, Max.
Metrics/BlockNesting:
Exclude:
- 'lib/tasks/mastodon.rake'
# Configuration parameters: AllowedMethods, AllowedPatterns.
Metrics/CyclomaticComplexity:
Max: 25
# Configuration parameters: AllowedMethods, AllowedPatterns.
Metrics/PerceivedComplexity:
Max: 27
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowedVars, DefaultToNil.
Style/FetchEnvVar:

View file

@ -1 +1 @@
3.4.4
3.4.7

View file

@ -1,3 +1,5 @@
import { resolve } from 'node:path';
import type { StorybookConfig } from '@storybook/react-vite';
const config: StorybookConfig = {
@ -26,6 +28,12 @@ const config: StorybookConfig = {
'oops.png',
].map((path) => ({ from: `../public/${path}`, to: `/${path}` })),
],
viteFinal(config) {
// For an unknown reason, Storybook does not use the root
// from the Vite config so we need to set it manually.
config.root = resolve(__dirname, '../app/javascript');
return config;
},
};
export default config;

View file

@ -0,0 +1,2 @@
<html class="no-reduce-motion">
</html>

View file

@ -12,13 +12,14 @@ import { initialize, mswLoader } from 'msw-storybook-addon';
import { action } from 'storybook/actions';
import type { LocaleData } from '@/mastodon/locales';
import { reducerWithInitialState, rootReducer } from '@/mastodon/reducers';
import { reducerWithInitialState } from '@/mastodon/reducers';
import { defaultMiddleware } from '@/mastodon/store/store';
import { mockHandlers, unhandledRequestHandler } from '@/testing/api';
// If you want to run the dark theme during development,
// you can change the below to `/application.scss`
import '../app/javascript/styles/mastodon-light.scss';
import './styles.css';
const localeFiles = import.meta.glob('@/mastodon/locales/*.json', {
query: { as: 'json' },
@ -49,12 +50,23 @@ const preview: Preview = {
locale: 'en',
},
decorators: [
(Story, { parameters }) => {
(Story, { parameters, globals, args }) => {
// Get the locale from the global toolbar
// and merge it with any parameters or args state.
const { locale } = globals as { locale: string };
const { state = {} } = parameters;
let reducer = rootReducer;
if (typeof state === 'object' && state) {
reducer = reducerWithInitialState(state as Record<string, unknown>);
}
const { state: argsState = {} } = args;
const reducer = reducerWithInitialState(
{
meta: {
locale,
},
},
state as Record<string, unknown>,
argsState as Record<string, unknown>,
);
const store = configureStore({
reducer,
middleware(getDefaultMiddleware) {

View file

@ -7,8 +7,8 @@
* - Please do NOT modify this file.
*/
const PACKAGE_VERSION = '2.10.2'
const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af'
const PACKAGE_VERSION = '2.11.3'
const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set()
@ -71,11 +71,6 @@ addEventListener('message', async function (event) {
break
}
case 'MOCK_DEACTIVATE': {
activeClientIds.delete(clientId)
break
}
case 'CLIENT_CLOSED': {
activeClientIds.delete(clientId)
@ -94,6 +89,8 @@ addEventListener('message', async function (event) {
})
addEventListener('fetch', function (event) {
const requestInterceptedAt = Date.now()
// Bypass navigation requests.
if (event.request.mode === 'navigate') {
return
@ -110,23 +107,29 @@ addEventListener('fetch', function (event) {
// Bypass all requests when there are no active clients.
// Prevents the self-unregistered worked from handling requests
// after it's been deleted (still remains active until the next reload).
// after it's been terminated (still remains active until the next reload).
if (activeClientIds.size === 0) {
return
}
const requestId = crypto.randomUUID()
event.respondWith(handleRequest(event, requestId))
event.respondWith(handleRequest(event, requestId, requestInterceptedAt))
})
/**
* @param {FetchEvent} event
* @param {string} requestId
* @param {number} requestInterceptedAt
*/
async function handleRequest(event, requestId) {
async function handleRequest(event, requestId, requestInterceptedAt) {
const client = await resolveMainClient(event)
const requestCloneForEvents = event.request.clone()
const response = await getResponse(event, client, requestId)
const response = await getResponse(
event,
client,
requestId,
requestInterceptedAt,
)
// Send back the response clone for the "response:*" life-cycle events.
// Ensure MSW is active and ready to handle the message, otherwise
@ -204,7 +207,7 @@ async function resolveMainClient(event) {
* @param {string} requestId
* @returns {Promise<Response>}
*/
async function getResponse(event, client, requestId) {
async function getResponse(event, client, requestId, requestInterceptedAt) {
// Clone the request because it might've been already used
// (i.e. its body has been read and sent to the client).
const requestClone = event.request.clone()
@ -255,6 +258,7 @@ async function getResponse(event, client, requestId) {
type: 'REQUEST',
payload: {
id: requestId,
interceptedAt: requestInterceptedAt,
...serializedRequest,
},
},

8
.storybook/styles.css Normal file
View file

@ -0,0 +1,8 @@
a {
color: inherit;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}

View file

@ -2,6 +2,177 @@
All notable changes to this project will be documented in this file.
## [4.5.3] - 2025-12-08
### Security
- Fix inconsistent error handling leaking information on existence of private posts ([GHSA-gwhw-gcjx-72v8](https://github.com/mastodon/mastodon/security/advisories/GHSA-gwhw-gcjx-72v8))
### Fixed
- Fix “Delete and Redraft” on a non-quote being treated as a quote post in some cases (#37140 by @ClearlyClaire)
- Fix YouTube embeds by sending referer (#37126 by @ChaosExAnima)
- Fix streamed quoted polls not being hydrated correctly (#37118 by @ClearlyClaire)
- Fix creation of duplicate conversations (#37108 by @oneiros)
- Fix extraneous `noreferrer` in external links (#37107 by @ChaosExAnima)
- Fix edge case error handling in some database migrations (#37079 by @ClearlyClaire)
- Fix error handling when re-fetching already-known statuses (#37077 by @ClearlyClaire)
- Fix post navigation in single-column mode when Advanced UI is enabled (#37044 by @diondiondion)
- Fix `tootctl status remove` removing quoted posts and remote quotes of local posts (#37009 by @ClearlyClaire)
- Fix known expensive S3 batch delete operation failing because of short timeouts (#37004 by @ClearlyClaire)
- Fix compose autosuggest always lowercasing input token (#36995 by @ClearlyClaire)
## [4.5.2] - 2025-11-20
### Changed
- Change private quote education modal to not show up on self-quotes (#36926 by @ClearlyClaire)
### Fixed
- Fix missing fallback link in CW-only quote posts (#36963 by @ClearlyClaire)
- Fix statuses without text being hidden while loading (#36962 by @ClearlyClaire)
- Fix `g` + `h` keyboard shortcut not working when a post is focused (#36935 by @diondiondion)
- Fix quoting overwriting current content warning (#36934 by @ClearlyClaire)
- Fix scroll-to-status in threaded view being unreliable (#36927 by @ClearlyClaire)
- Fix path resolution for emoji worker (#36897 by @ChaosExAnima)
- Fix `tootctl upgrade storage-schema` failing with `ArgumentError` (#36914 by @shugo)
- Fix cross-origin handling of CSS modules (#36890 by @ClearlyClaire)
- Fix error with remote tags including percent signs (#36886 and #36925 by @ChaosExAnima and @ClearlyClaire)
- Fix bogus quote approval policy not always being replaced correctly (#36885 by @ClearlyClaire)
- Fix hashtag completion not being inserted correctly (#36884 by @ClearlyClaire)
- Fix Cmd/Ctrl + Enter in the composer triggering confirmation dialog action (#36870 by @diondiondion)
## [4.5.1] - 2025-11-13
### Fixed
- Fix Cmd/Ctrl + Enter not submitting Alt text modal on some browsers (#36866 by @diondiondion)
- Fix posts coming from public/hashtag streaming being marked as unquotable (#36860 and #36869 by @ClearlyClaire)
- Fix old previously-undiscovered posts being treated as new when receiving an `Update` (#36848 by @ClearlyClaire)
- Fix blank screen in browsers that don't support `Intl.DisplayNames` (#36847 by @diondiondion)
- Fix filters not being applied to quotes in detailed view (#36843 by @ClearlyClaire)
- Fix scroll shift caused by fetch-all-replies alerts (#36807 by @diondiondion)
- Fix dropdown menu not focusing first item when opened via keyboard (#36804 by @diondiondion)
- Fix assets build issue on arch64 (#36781 by @ClearlyClaire)
- Fix `/api/v1/statuses/:id/context` sometimes returing `Mastodon-Async-Refresh` without `result_count` (#36779 by @ClearlyClaire)
- Fix prepared quote not being discarded with contents when replying (#36778 by @ClearlyClaire)
## [4.5.0] - 2025-11-06
### Added
- **Add support for allowing and authoring quotes** (#35355, #35578, #35614, #35618, #35624, #35626, #35652, #35629, #35665, #35653, #35670, #35677, #35690, #35697, #35689, #35699, #35700, #35701, #35709, #35714, #35713, #35715, #35725, #35749, #35769, #35780, #35762, #35804, #35808, #35805, #35819, #35824, #35828, #35822, #35835, #35865, #35860, #35832, #35891, #35894, #35895, #35820, #35917, #35924, #35925, #35914, #35930, #35941, #35939, #35948, #35955, #35967, #35990, #35991, #35975, #35971, #36002, #35986, #36031, #36034, #36038, #36054, #36052, #36055, #36065, #36068, #36083, #36087, #36080, #36091, #36090, #36118, #36119, #36128, #36094, #36129, #36138, #36132, #36151, #36158, #36171, #36194, #36220, #36169, #36130, #36249, #36153, #36299, #36291, #36301, #36315, #36317, #36364, #36383, #36381, #36459, #36464, #36461, #36516, #36528, #36549, #36550, #36559, #36693, #36704, #36690, #36689, #36696, #36721, #36695 and #36736 by @ChaosExAnima, @ClearlyClaire, @Lycolia, @diondiondion, and @tribela)\
This includes a revamp of the composer interface.\
See https://blog.joinmastodon.org/2025/09/introducing-quote-posts/ for a user-centric overview of the feature, and https://docs.joinmastodon.org/client/quotes/ for API documentation.
- **Add support for fetching and refreshing replies to the web UI** (#35210, #35496, #35575, #35500, #35577, #35602, #35603, #35654, #36141, #36237, #36172, #36256, #36271, #36334, #36382, #36239, #36484, #36481, #36583, #36627 and #36547 by @ClearlyClaire, @diondiondion, @Gargron and @renchap)
- **Add ability to block words in usernames** (#35407, #35655, and #35806 by @ClearlyClaire and @Gargron)
- Add ability to individually disable local or remote feeds for visitors or logged-in users `disabled` value to server setting for live and topic feeds, as well as user permission to bypass that (#36338, #36467, #36497, #36563, #36577, #36585, #36607 and #36703 by @ClearlyClaire)\
This splits the `timeline_preview` setting into four more granular settings controlling live feeds and topic (hashtag, trending link) feeds.\
The setting for local topic feeds has 2 values: `public` and `authenticated`. Every other setting has 3 values: `public`, `authenticated`, `disabled`.\
When `disabled`, users with the “View live and topic feeds” will still be able to view them.
- Add support for displaying of quote posts in Moderator UI (#35964 by @ThisIsMissEm)
- Add support for displaying link previews for Admin UI (#35958 by @ThisIsMissEm)
- Add a new server setting to choose the server landing page (#36588 and #36602 by @ClearlyClaire and @renchap)
- Add support for `Update` activities on converted object types (#36322 by @ClearlyClaire)
- Add support for dynamic viewport height (#36272 by @e1berd)
- Add support for numeric-based URIs for new local accounts (#32724, #36304, #36316, and #36365 by @ClearlyClaire)
- Add default visualizer for audio upload without poster (#36734 by @ChaosExAnima)
- Add Traditional Mongolian to posting languages (#36196 by @shimon1024)
- Add example post with manual quote approval policy to `dev:populate_sample_data` (#36099 by @ClearlyClaire)
- Add server-side support for handling posts with a quote policy allowing followers to quote (#36093 and #36127 by @ClearlyClaire)
- Add schema.org markup to SEO-enabled posts (#36075 by @Gargron)
- Add migration to fill unset default quote policy based on default post privacy (#36041 by @ClearlyClaire)
- Add “Posting defaults” setting page, moving existing settings from “Other” (#35896, #36033, #35966, #35969, and #36084 by @ClearlyClaire and @diondiondion)
- Added emoji from Twemoji v16 (#36501 and #36530 by @ChaosExAnima)
- Add feature to select custom emoji rendering (#35229, #35282, #35253, #35424, #35473, #35483, #35505, #35568, #35605, #35659, #35664, #35739, #35985, #36051, #36071, #36137, #36165, #36248, #36262, #36275, #36293, #36341, #36342, #36366, #36377, #36378, #36385, #36393, #36397, #36403, #36413, #36410, #36454, #36402, #36503, #36502, #36532, #36603, #36409, #36638 and #36750 by @ChaosExAnima, @ClearlyClaire and @braddunbar)\
This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places.
- Add support for exposing conversation context for new public conversations according to FEP-7888 (#35959 and #36064 by @ClearlyClaire and @jesseplusplus)
- Add digest re-check before removing followers in synchronization mechanism (#34273 by @ClearlyClaire)
- Add support for displaying Valkey version on admin dashboard (#35785 by @ykzts)
- Add delivery failure tracking and handling to FASP jobs (#35625, #35628, and #35723 by @oneiros)
- Add example of quote post with a preview card to development sample data (#35616 by @ClearlyClaire)
- Add second set of blocked text that applies to accounts regardless of account age for spam-blocking (#35563 by @ClearlyClaire)
### Changed
- Change confirmation dialogs for follow button actions “unfollow”, “unblock”, and “withdraw request” (#36289 by @diondiondion)
- Change “Follow” button labels (#36264 by @diondiondion)
- Change appearance settings to introduce new Advanced settings section (#36496 and #36506 by @diondiondion)
- Change display of blocked and muted quoted users (#36619 by @ClearlyClaire)\
This adds `blocked_account`, `blocked_domain` and `muted_account` values to the `state` attribute of `Quote` and `ShallowQuote` REST API entities.
- Change submitting an empty post to show an error rather than failing silently (#36650 by @diondiondion)
- Change "Privacy and reach" settings from "Public profile" to their own top-level category (#27294 by @ChaelCodes)
- Change number of times quote verification is retried to better deal with temporary failures (#36698 by @ClearlyClaire)
- Change display of content warnings in Admin UI (#35935 by @ThisIsMissEm)
- Change styling of column banners (#36531 by @ClearlyClaire)
- Change recommended Node version to 24 (LTS) (#36539 by @renchap)
- Change min. characters required for logged-out account search from 5 to 3 (#36487 by @Gargron)
- Change browser target to Vite legacy plugin defaults (#36611 by @larouxn)
- Change index on `follows` table to improve performance of some queries (#36374 by @ClearlyClaire)
- Change links to accounts in settings and moderation views to link to local view unless account is suspended (#36340 by @diondiondion)
- Change redirection for denied registration from web app to sign-in page with error message (#36384 by @ClearlyClaire)
- Change support for RFC9421 HTTP signatures to be enabled unconditionally (#36610 by @oneiros)
- Change wording and design of interaction dialog to simplify it (#36124 by @diondiondion)
- Change dropdown menus to allow disabled items to be focused (#36078 by @diondiondion)
- Change modal background colours in light mode (#36069 by @diondiondion)
- Change “Posting defaults” settings page to enforce `nobody` quote policy for `private` default visibility (#36040 by @ClearlyClaire)
- Change description of “Quiet public” (#36032 by @ClearlyClaire)
- Change “Boost with original visibility” to “Share again with your followers” (#36035 by @ClearlyClaire)
- Change handling of push subscriptions to automatically delete invalid ones on delivery (#35987 by @ThisIsMissEm)
- Change design of quote posts in web UI (#35584 and #35834 by @Gargron)
- Change auditable accounts to be sorted by username in admin action logs interface (#35272 by @breadtk)
- Change order of translation restoration and service credit on post card (#33619 by @colindean)
- Change position of add more to be inside table toolbar on reports (#35963 by @ThisIsMissEm)
- Change docker-compose.yml sidekiq health check to work for both 4.4 and 4.5 (#36498 by @ClearlyClaire)
### Fixed
- Fix relationship not being fetched to evaluate whether to show a quote post (#36517 by @ClearlyClaire)
- Fix rendering of poll options in status history modal (#35633 by @ThisIsMissEm)
- Fix “mute” button being displayed to unauthenticated visitors in hashtag dropdown (#36353 by @mkljczk)
- Fix initially selected language in Rules panel, hide selector when no alternative translations exist (#36672 by @diondiondion)
- Fix URL comparison for mentions in case of empty path (#36613 and #36626 by @ClearlyClaire)
- Fix hashtags not being picked up when full-width hash sign is used (#36103 and #36625 by @ClearlyClaire and @Gargron)
- Fix layout of severed relationships when purged events are listed (#36593 by @mejofi)
- Fix Skeleton placeholders being animated when setting to reduce animations is enabled (#36716 by @ClearlyClaire)
- Fix vacuum tasks being interrupted by a single batch failure (#36606 by @Gargron)
- Fix handling of unreachable network error for search services (#36587 by @mjankowski)
- Fix bookmarks export when a bookmarked status is soft-deleted (#36576 by @ClearlyClaire)
- Fix text overflow alignment for long author names in News (#36562 by @diondiondion)
- Fix discovery preamble missing word in admin settings (#36560 by @belatedly)
- Fix overflow handling of `.more-from-author` (#36310 by @edent)
- Fix unfortunate action button wrapping in admin area (#36247 by @diondiondion)
- Fix translate button width in Safari (#36164 and #36216 by @diondiondion)
- Fix login page linking to other pages within OAuth authorization flow (#36115 by @Gargron)
- Fix stale search results being displayed in Web UI while new query is in progress (#36053 by @ChaosExAnima)
- Fix YouTube iframe not being able to start at a defined time (#26584 by @BrunoViveiros)
- Fix banned text being able to be circumvented via unicode (#35978 by @Gargron)
- Fix batch table toolbar displaying under status media (#35962 by @ThisIsMissEm)
- Fix incorrect RSS feed MIME type in gzip_types directive (#35562 by @iioflow)
- Fix 404 error after deleting status from detail view (#35800) (#35881 by @crafkaz)
- Fix feeds keyboard navigation issues (#35853, #35864, and #36267 by @braddunbar and @diondiondion)
- Fix layout shift caused by “Who to follow” widget (#35861 by @diondiondion)
- Fix Vagrantfile (#35765 by @ClearlyClaire)
- Fix reply indicator displaying wrong avatar in rare cases (#35756 by @ClearlyClaire)
- Fix `Chewy::UndefinedUpdateStrategy` in `dev:populate_sample_data` task when Elasticsearch is enabled (#35615 by @ClearlyClaire)
- Fix unnecessary account note addition for already-muted moved-to users (#35566 by @mjankowski)
- Fix seeded admin user creation failing on specific configurations (#35565 by @oneiros)
- Fix media modal images in Web UI having redundant `title` attribute (#35468 by @mayank99)
- Fix inconsistent default privacy post setting when unset in settings (#35422 by @oneiros)
- Fix glitchy status keyboard navigation (#35455 and #35504 by @diondiondion)
- Fix post being submitted when pressing “Enter” in the CW field (#35445 by @diondiondion)
### Removed
- Remove support for PostgreSQL 13 (#36540 by @renchap)
## [4.4.8] - 2025-10-21
### Security
- Fix quote control bypass ([GHSA-8h43-rcqj-wpc6](https://github.com/mastodon/mastodon/security/advisories/GHSA-8h43-rcqj-wpc6))
## [4.4.7] - 2025-10-15
### Fixed
@ -661,7 +832,6 @@ The following changelog entries focus on changes visible to users, administrator
You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\
Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\
This adds the following REST API endpoints:
- `GET /api/v2/notifications/policy`: https://docs.joinmastodon.org/methods/notifications/#get-policy
- `PATCH /api/v2/notifications/policy`: https://docs.joinmastodon.org/methods/notifications/#update-the-filtering-policy-for-notifications
- `GET /api/v1/notifications/requests`: https://docs.joinmastodon.org/methods/notifications/#get-requests
@ -673,7 +843,6 @@ The following changelog entries focus on changes visible to users, administrator
- `GET /api/v1/notifications/requests/merged`: https://docs.joinmastodon.org/methods/notifications/#requests-merged
In addition, accepting one or more notification requests generates a new streaming event:
- `notifications_merged`: an event of this type indicates accepted notification requests have finished merging, and the notifications list should be refreshed
- **Add notifications of severed relationships** (#27511, #29665, #29668, #29670, #29700, #29714, #29712, and #29731 by @ClearlyClaire and @Gargron)\

View file

@ -1,4 +1,4 @@
# syntax=docker/dockerfile:1.12
# syntax=docker/dockerfile:1.18
# This file is designed for production server deployment, not local development work
# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker
@ -13,15 +13,15 @@ ARG BASE_REGISTRY="docker.io"
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"]
# renovate: datasource=docker depName=docker.io/ruby
ARG RUBY_VERSION="3.4.4"
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
ARG RUBY_VERSION="3.4.7"
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="22"]
# renovate: datasource=node-version depName=node
ARG NODE_MAJOR_VERSION="22"
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
ARG DEBIAN_VERSION="bookworm"
# Node.js image to use for base image based on combined variables (ex: 20-bookworm-slim)
ARG NODE_MAJOR_VERSION="24"
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
ARG DEBIAN_VERSION="trixie"
# Node.js image to use for base image based on combined variables (ex: 20-trixie-slim)
FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm)
# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-trixie)
FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
@ -96,9 +96,6 @@ RUN \
# Set /opt/mastodon as working directory
WORKDIR /opt/mastodon
# Add backport repository for some specific packages where we need the latest version
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
# hadolint ignore=DL3008,DL3005
RUN \
# Mount Apt cache and lib directories from Docker buildx caches
@ -161,11 +158,11 @@ RUN \
libexif-dev \
libexpat1-dev \
libgirepository1.0-dev \
libheif-dev/bookworm-backports \
libheif-dev \
libhwy-dev \
libimagequant-dev \
libjpeg62-turbo-dev \
liblcms2-dev \
liborc-dev \
libspng-dev \
libtiff-dev \
libwebp-dev \
@ -186,7 +183,7 @@ FROM build AS libvips
# libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"]
# renovate: datasource=github-releases depName=libvips packageName=libvips/libvips
ARG VIPS_VERSION=8.17.0
ARG VIPS_VERSION=8.17.3
# libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"]
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
@ -209,14 +206,14 @@ FROM build AS ffmpeg
# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"]
# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg
ARG FFMPEG_VERSION=7.1
ARG FFMPEG_VERSION=8.0
# ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"]
ARG FFMPEG_URL=https://ffmpeg.org/releases
ARG FFMPEG_URL=https://github.com/FFmpeg/FFmpeg/archive/refs/tags
WORKDIR /usr/local/ffmpeg/src
# Download and extract ffmpeg source code
ADD ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz /usr/local/ffmpeg/src/
RUN tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz;
ADD ${FFMPEG_URL}/n${FFMPEG_VERSION}.tar.gz /usr/local/ffmpeg/src/
RUN tar xf n${FFMPEG_VERSION}.tar.gz && mv FFmpeg-n${FFMPEG_VERSION} ffmpeg-${FFMPEG_VERSION};
WORKDIR /usr/local/ffmpeg/src/ffmpeg-${FFMPEG_VERSION}
@ -327,28 +324,28 @@ RUN \
# Apt update install non-dev versions of necessary components
apt-get install -y --no-install-recommends \
libexpat1 \
libglib2.0-0 \
libicu72 \
libglib2.0-0t64 \
libicu76 \
libidn12 \
libpq5 \
libreadline8 \
libssl3 \
libreadline8t64 \
libssl3t64 \
libyaml-0-2 \
# libvips components
libcgif0 \
libexif12 \
libheif1/bookworm-backports \
libheif1 \
libhwy1t64 \
libimagequant0 \
libjpeg62-turbo \
liblcms2-2 \
liborc-0.4-0 \
libspng0 \
libtiff6 \
libwebp7 \
libwebpdemux2 \
libwebpmux3 \
# ffmpeg components
libdav1d6 \
libdav1d7 \
libmp3lame0 \
libopencore-amrnb0 \
libopencore-amrwb0 \
@ -358,9 +355,9 @@ RUN \
libvorbis0a \
libvorbisenc2 \
libvorbisfile3 \
libvpx7 \
libvpx9 \
libx264-164 \
libx265-199 \
libx265-215 \
;
# Copy Mastodon sources into final layer

47
Gemfile
View file

@ -4,12 +4,12 @@ source 'https://rubygems.org'
ruby '>= 3.2.0', '< 3.5.0'
gem 'propshaft'
gem 'puma', '~> 6.3'
gem 'puma', '~> 7.0'
gem 'rails', '~> 8.0'
gem 'thor', '~> 1.2'
gem 'dotenv'
gem 'haml-rails', '~>2.0'
gem 'haml-rails', '~>3.0'
gem 'pg', '~> 1.5'
gem 'pghero'
@ -62,7 +62,7 @@ gem 'inline_svg'
gem 'irb', '~> 1.8'
gem 'kaminari', '~> 1.2'
gem 'link_header', '~> 0.0'
gem 'linzer', '~> 0.7.2'
gem 'linzer', '~> 0.7.7'
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'mime-types', '~> 3.7.0', require: 'mime/types/columnar'
gem 'mutex_m'
@ -82,13 +82,13 @@ gem 'rqrcode', '~> 3.0'
gem 'ruby-progressbar', '~> 1.13'
gem 'sanitize', '~> 7.0'
gem 'scenic', '~> 1.7'
gem 'sidekiq', '< 8'
gem 'sidekiq', '< 9'
gem 'sidekiq-bulk', '~> 0.2.0'
gem 'sidekiq-scheduler', '~> 5.0'
gem 'sidekiq-scheduler', '~> 6.0'
gem 'sidekiq-unique-jobs', '> 8'
gem 'simple_form', '~> 5.2'
gem 'simple-navigation', '~> 4.4'
gem 'stoplight', '~> 4.1'
gem 'stoplight'
gem 'strong_migrations'
gem 'tty-prompt', '~> 0.23', require: false
gem 'twitter-text', '~> 3.1.0'
@ -102,23 +102,23 @@ gem 'rdf-normalize', '~> 0.5'
gem 'prometheus_exporter', '~> 2.2', require: false
gem 'opentelemetry-api', '~> 1.5.0'
gem 'opentelemetry-api', '~> 1.7.0'
group :opentelemetry do
gem 'opentelemetry-exporter-otlp', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-active_job', '~> 0.8.0', require: false
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.22.0', require: false
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.22.0', require: false
gem 'opentelemetry-instrumentation-excon', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-faraday', '~> 0.27.0', require: false
gem 'opentelemetry-instrumentation-http', '~> 0.25.0', require: false
gem 'opentelemetry-instrumentation-http_client', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-rails', '~> 0.36.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false
gem 'opentelemetry-exporter-otlp', '~> 0.31.0', require: false
gem 'opentelemetry-instrumentation-active_job', '~> 0.10.0', require: false
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.24.0', require: false
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.24.0', require: false
gem 'opentelemetry-instrumentation-excon', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-faraday', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-http', '~> 0.27.0', require: false
gem 'opentelemetry-instrumentation-http_client', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-net_http', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-pg', '~> 0.32.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-rails', '~> 0.39.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.28.0', require: false
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.28.0', require: false
gem 'opentelemetry-sdk', '~> 1.4', require: false
end
@ -138,6 +138,7 @@ group :test do
# Browser integration testing
gem 'capybara', '~> 3.39'
gem 'capybara-playwright-driver'
gem 'playwright-ruby-client', '1.55.0', require: false # Pinning the exact version as it needs to be kept in sync with the installed npm package
# Used to reset the database between system tests
gem 'database_cleaner-active_record'
@ -146,7 +147,7 @@ group :test do
gem 'climate_control'
# Validate schemas in specs
gem 'json-schema', '~> 5.0'
gem 'json-schema', '~> 6.0'
# Test harness fo rack components
gem 'rack-test', '~> 2.1'
@ -226,7 +227,7 @@ gem 'connection_pool', require: false
gem 'xorcist', '~> 1.1'
gem 'net-http', '~> 0.6.0'
gem 'rubyzip', '~> 2.3'
gem 'rubyzip', '~> 3.0'
gem 'hcaptcha', '~> 7.1'

File diff suppressed because it is too large Load diff

View file

@ -20,32 +20,36 @@ Click below to **learn more** in a video:
<img src="app/javascript/images/cigarmanwoman.svg?raw=true" align="right" width="30%" />
**No vendor lock-in: Fully interoperable with any conforming platform** - It doesn't have to be Mastodon; whatever implements ActivityPub is part of the social network! [Learn more](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/)
**Part of the Fediverse. Based on open standards, with no vendor lock-in.** - the network goes beyond just Mastodon; anything that implements ActivityPub is part of a broader social network known as [the Fediverse](https://jointhefediverse.net/). You can follow and interact with users on other servers (including those running different software), and they can follow you back.
**Real-time, chronological timeline updates** - updates of people you're following appear in real-time in the UI via WebSockets. There's a firehose view as well!
**Real-time, chronological timeline updates** - updates of people you're following appear in real-time in the UI.
**Media attachments like images and short videos** - upload and view images and WebM/MP4 videos attached to the updates. Videos with no audio track are treated like GIFs; normal videos loop continuously!
**Media attachments** - upload and view images and videos attached to the updates. Videos with no audio track are treated like animated GIFs; normal videos loop continuously.
**Safety and moderation tools** - Mastodon includes private posts, locked accounts, phrase filtering, muting, blocking, and all sorts of other features, along with a reporting and moderation system. [Learn more](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/)
**Safety and moderation tools** - Mastodon includes private posts, locked accounts, phrase filtering, muting, blocking, and many other features, along with a reporting and moderation system.
**OAuth2 and a straightforward REST API** - Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Streaming APIs. This results in a rich app ecosystem with a lot of choices!
**OAuth2 and a straightforward REST API** - Mastodon acts as an OAuth2 provider, and third party apps can use the REST and Streaming APIs. This results in a [rich app ecosystem](https://joinmastodon.org/apps) with a variety of choices!
## Deployment
### Tech stack
- **Ruby on Rails** powers the REST API and other web pages
- **React.js** and **Redux** are used for the dynamic parts of the interface
- **Node.js** powers the streaming API
- [Ruby on Rails](https://github.com/rails/rails) powers the REST API and other web pages.
- [PostgreSQL](https://www.postgresql.org/) is the main database.
- [Redis](https://redis.io/) and [Sidekiq](https://sidekiq.org/) are used for caching and queueing.
- [Node.js](https://nodejs.org/) powers the streaming API.
- [React.js](https://reactjs.org/) and [Redux](https://redux.js.org/) are used for the dynamic parts of the interface.
- [BrowserStack](https://www.browserstack.com/) supports testing on real devices and browsers. (This project is tested with BrowserStack)
- [Chromatic](https://www.chromatic.com/) provides visual regression testing. (This project is tested with Chromatic)
### Requirements
- **PostgreSQL** 13+
- **Redis** 6.2+
- **Ruby** 3.2+
- **PostgreSQL** 14+
- **Redis** 7.0+
- **Node.js** 20+
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, and **Scalingo**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
This repository includes deployment configurations for **Docker and docker-compose**, as well as for other environments like Heroku and Scalingo. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). A [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the main documentation.
## Contributing
@ -61,7 +65,7 @@ Copyright (c) 2016-2025 Eugen Rochko (+ [`mastodon authors`](AUTHORS.md))
Licensed under GNU Affero General Public License as stated in the [LICENSE](LICENSE):
```
```text
Copyright (c) 2016-2025 Eugen Rochko & other Mastodon contributors
This program is free software: you can redistribute it and/or modify it under
@ -77,7 +81,3 @@ details.
You should have received a copy of the GNU Affero General Public License along
with this program. If not, see https://www.gnu.org/licenses/
```
[CONTRIBUTING]: CONTRIBUTING.md
[DEVELOPMENT]: docs/DEVELOPMENT.md
[OpenCollective]: https://opencollective.com/mastodon

View file

@ -15,7 +15,8 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
| Version | Supported |
| ------- | ---------------- |
| 4.5.x | Yes |
| 4.4.x | Yes |
| 4.3.x | Yes |
| 4.3.x | Until 2026-05-06 |
| 4.2.x | Until 2026-01-08 |
| < 4.2 | No |

5
Vagrantfile vendored
View file

@ -54,6 +54,7 @@ sudo apt-get install \
pkg-config \
protobuf-compiler \
zlib1g-dev \
libvips42t64 \
-y
# Install rvm
@ -134,7 +135,7 @@ VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/focal64"
config.vm.box = "bento/ubuntu-24.04"
config.vm.provider :virtualbox do |vb|
vb.name = "mastodon"
@ -172,7 +173,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
end
if config.vm.networks.any? { |type, options| type == :private_network }
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'actimeo=1']
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'actimeo=1'], nfs_udp: false
else
config.vm.synced_folder ".", "/vagrant", type: "rsync", create: true, rsync__args: ["--verbose", "--archive", "--delete", "-z"]
end

View file

@ -71,6 +71,10 @@ class AccountsController < ApplicationController
params[:username]
end
def account_id_param
params[:id]
end
def skip_temporary_suspension_response?
request.format == :json
end

View file

@ -0,0 +1,82 @@
# frozen_string_literal: true
class ActivityPub::ContextsController < ActivityPub::BaseController
vary_by -> { 'Signature' if authorized_fetch_mode? }
before_action :require_account_signature!, if: :authorized_fetch_mode?
before_action :set_conversation
before_action :set_items
DESCENDANTS_LIMIT = 60
def show
expires_in 3.minutes, public: public_fetch_mode?
render_with_cache json: context_presenter, serializer: ActivityPub::ContextSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
end
def items
expires_in 3.minutes, public: public_fetch_mode?
render_with_cache json: items_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
end
private
def account_required?
false
end
def set_conversation
account_id, status_id = params[:id].split('-')
@conversation = Conversation.local.find_by(parent_account_id: account_id, parent_status_id: status_id)
end
def set_items
@items = @conversation.statuses.distributable_visibility.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
end
def context_presenter
first_page = ActivityPub::CollectionPresenter.new(
id: items_context_url(@conversation, page_params),
type: :unordered,
part_of: items_context_url(@conversation),
next: next_page,
items: @items.map { |status| status.local? ? ActivityPub::TagManager.instance.uri_for(status) : status.uri }
)
ActivityPub::ContextPresenter.from_conversation(@conversation).tap do |presenter|
presenter.first = first_page
end
end
def items_collection_presenter
page = ActivityPub::CollectionPresenter.new(
id: items_context_url(@conversation, page_params),
type: :unordered,
part_of: items_context_url(@conversation),
next: next_page,
items: @items.map { |status| status.local? ? ActivityPub::TagManager.instance.uri_for(status) : status.uri }
)
return page if page_requested?
ActivityPub::CollectionPresenter.new(
id: items_context_url(@conversation),
type: :unordered,
first: page
)
end
def page_requested?
truthy_param?(:page)
end
def next_page
return nil if @items.size < DESCENDANTS_LIMIT
items_context_url(@conversation, page: true, min_id: @items.last.id)
end
def page_params
params.permit(:page, :min_id)
end
end

View file

@ -22,13 +22,13 @@ class ActivityPub::LikesController < ActivityPub::BaseController
def set_status
@status = @account.statuses.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
def likes_collection_presenter
ActivityPub::CollectionPresenter.new(
id: account_status_likes_url(@account, @status),
id: ActivityPub::TagManager.instance.likes_uri_for(@status),
type: :unordered,
size: @status.favourites_count
)

View file

@ -73,6 +73,8 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
end
def set_account
@account = params[:account_username].present? ? Account.find_local!(username_param) : Account.representative
return super if params[:account_username].present? || params[:account_id].present?
@account = Account.representative
end
end

View file

@ -0,0 +1,30 @@
# frozen_string_literal: true
class ActivityPub::QuoteAuthorizationsController < ActivityPub::BaseController
include Authorization
vary_by -> { 'Signature' if authorized_fetch_mode? }
before_action :require_account_signature!, if: :authorized_fetch_mode?
before_action :set_quote_authorization
def show
expires_in 30.seconds, public: true if @quote.quoted_status.distributable? && public_fetch_mode?
render json: @quote, serializer: ActivityPub::QuoteAuthorizationSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
end
private
def pundit_user
signed_request_account
end
def set_quote_authorization
@quote = Quote.accepted.where(quoted_account: @account).find(params[:id])
return not_found unless @quote.status.present? && @quote.quoted_status.present?
authorize @quote.quoted_status, :show?
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View file

@ -25,7 +25,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
def set_status
@status = @account.statuses.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
@ -37,7 +37,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
def replies_collection_presenter
page = ActivityPub::CollectionPresenter.new(
id: account_status_replies_url(@account, @status, page_params),
id: ActivityPub::TagManager.instance.replies_uri_for(@status, page_params),
type: :unordered,
part_of: account_status_replies_url(@account, @status),
next: next_page,
@ -47,7 +47,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
return page if page_requested?
ActivityPub::CollectionPresenter.new(
id: account_status_replies_url(@account, @status),
id: ActivityPub::TagManager.instance.replies_uri_for(@status),
type: :unordered,
first: page
)
@ -66,8 +66,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
# Only consider remote accounts
return nil if @replies.size < DESCENDANTS_LIMIT
account_status_replies_url(
@account,
ActivityPub::TagManager.instance.replies_uri_for(
@status,
page: true,
min_id: @replies&.last&.id,
@ -77,8 +76,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
# For now, we're serving only self-replies, but next page might be other accounts
next_only_other_accounts = @replies&.last&.account_id != @account.id || @replies.size < DESCENDANTS_LIMIT
account_status_replies_url(
@account,
ActivityPub::TagManager.instance.replies_uri_for(
@status,
page: true,
min_id: next_only_other_accounts ? nil : @replies&.last&.id,

View file

@ -22,13 +22,13 @@ class ActivityPub::SharesController < ActivityPub::BaseController
def set_status
@status = @account.statuses.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
def shares_collection_presenter
ActivityPub::CollectionPresenter.new(
id: account_status_shares_url(@account, @status),
id: ActivityPub::TagManager.instance.shares_uri_for(@status),
type: :unordered,
size: @status.reblogs_count
)

View file

@ -16,11 +16,14 @@ module Admin
def batch
authorize :account, :index?
@form = Form::AccountBatch.new(form_account_batch_params)
@form.current_account = current_account
@form.action = action_from_button
@form.select_all_matching = params[:select_all_matching]
@form.query = filtered_accounts
@form = Form::AccountBatch.new(
form_account_batch_params.merge(
action: action_from_button,
current_account:,
query: filtered_accounts,
select_all_matching: params[:select_all_matching]
)
)
@form.save
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.accounts.no_account_selected')

View file

@ -6,7 +6,7 @@ module Admin
def index
authorize :audit_log, :index?
@auditable_accounts = Account.auditable.select(:id, :username)
@auditable_accounts = Account.auditable.select(:id, :username).order(username: :asc)
end
private

View file

@ -19,15 +19,13 @@ module Admin
log_action :resend, @user
flash[:notice] = I18n.t('admin.accounts.resend_confirmation.success')
redirect_to admin_accounts_path
redirect_to admin_accounts_path, notice: t('admin.accounts.resend_confirmation.success')
end
private
def redirect_confirmed_user
flash[:error] = I18n.t('admin.accounts.resend_confirmation.already_confirmed')
redirect_to admin_accounts_path
redirect_to admin_accounts_path, flash: { error: t('admin.accounts.resend_confirmation.already_confirmed') }
end
def user_confirmed?

View file

@ -18,7 +18,7 @@ class Admin::Disputes::AppealsController < Admin::BaseController
end
def reject
authorize @appeal, :approve?
authorize @appeal, :reject?
log_action :reject, @appeal
@appeal.reject!(current_account)
UserMailer.appeal_rejected(@appeal.account.user, @appeal).deliver_later

View file

@ -36,7 +36,7 @@ module Admin
end
def edit
authorize :domain_block, :create?
authorize :domain_block, :update?
end
def create
@ -129,7 +129,7 @@ module Admin
end
def requires_confirmation?
@domain_block.valid? && (@domain_block.new_record? || @domain_block.severity_changed?) && @domain_block.severity.to_s == 'suspend' && !params[:confirm]
@domain_block.valid? && (@domain_block.new_record? || @domain_block.severity_changed?) && @domain_block.suspend? && !params[:confirm]
end
end
end

View file

@ -49,8 +49,8 @@ module Admin
def export_data
CSV.generate(headers: export_headers, write_headers: true) do |content|
DomainAllow.allowed_domains.each do |instance|
content << [instance.domain]
DomainAllow.allowed_domains.each do |domain|
content << [domain]
end
end
end

View file

@ -13,27 +13,9 @@ class Admin::Reports::ActionsController < Admin::BaseController
case action_from_button
when 'delete', 'mark_as_sensitive'
status_batch_action = Admin::StatusBatchAction.new(
type: action_from_button,
status_ids: @report.status_ids,
current_account: current_account,
report_id: @report.id,
send_email_notification: !@report.spam?,
text: params[:text]
)
status_batch_action.save!
Admin::StatusBatchAction.new(status_batch_action_params).save!
when 'silence', 'suspend'
account_action = Admin::AccountAction.new(
type: action_from_button,
report_id: @report.id,
target_account: @report.target_account,
current_account: current_account,
send_email_notification: !@report.spam?,
text: params[:text]
)
account_action.save!
Admin::AccountAction.new(account_action_params).save!
else
return redirect_to admin_report_path(@report), alert: I18n.t('admin.reports.unknown_action_msg', action: action_from_button)
end
@ -43,6 +25,26 @@ class Admin::Reports::ActionsController < Admin::BaseController
private
def status_batch_action_params
shared_params
.merge(status_ids: @report.status_ids)
end
def account_action_params
shared_params
.merge(target_account: @report.target_account)
end
def shared_params
{
current_account: current_account,
report_id: @report.id,
send_email_notification: !@report.spam?,
text: params[:text],
type: action_from_button,
}
end
def set_report
@report = Report.find(params[:report_id])
end

View file

@ -14,8 +14,7 @@ module Admin
@admin_settings = Form::AdminSettings.new(settings_params)
if @admin_settings.save
flash[:notice] = I18n.t('generic.changes_saved_msg')
redirect_to after_update_redirect_path
redirect_to after_update_redirect_path, notice: t('generic.changes_saved_msg')
else
render :show
end

View file

@ -5,6 +5,7 @@ module Admin
before_action :set_tag, except: [:index]
PER_PAGE = 20
PERIOD_DAYS = 6.days
def index
authorize :tag, :index?
@ -15,7 +16,7 @@ module Admin
def show
authorize @tag, :show?
@time_period = (6.days.ago.to_date...Time.now.utc.to_date)
@time_period = report_range
end
def update
@ -24,7 +25,7 @@ module Admin
if @tag.update(tag_params.merge(reviewed_at: Time.now.utc))
redirect_to admin_tag_path(@tag.id), notice: I18n.t('admin.tags.updated_msg')
else
@time_period = (6.days.ago.to_date...Time.now.utc.to_date)
@time_period = report_range
render :show
end
@ -36,6 +37,10 @@ module Admin
@tag = Tag.find(params[:id])
end
def report_range
(PERIOD_DAYS.ago.to_date...Time.now.utc.to_date)
end
def tag_params
params
.expect(tag: [:name, :display_name, :trendable, :usable, :listable])

View file

@ -0,0 +1,77 @@
# frozen_string_literal: true
class Admin::UsernameBlocksController < Admin::BaseController
before_action :set_username_block, only: [:edit, :update]
def index
authorize :username_block, :index?
@username_blocks = UsernameBlock.order(username: :asc).page(params[:page])
@form = Form::UsernameBlockBatch.new
end
def batch
authorize :username_block, :index?
@form = Form::UsernameBlockBatch.new(form_username_block_batch_params.merge(current_account: current_account, action: action_from_button))
@form.save
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.username_blocks.no_username_block_selected')
rescue Mastodon::NotPermittedError
flash[:alert] = I18n.t('admin.username_blocks.not_permitted')
ensure
redirect_to admin_username_blocks_path
end
def new
authorize :username_block, :create?
@username_block = UsernameBlock.new(exact: true)
end
def edit
authorize @username_block, :update?
end
def create
authorize :username_block, :create?
@username_block = UsernameBlock.new(resource_params)
if @username_block.save
log_action :create, @username_block
redirect_to admin_username_blocks_path, notice: I18n.t('admin.username_blocks.created_msg')
else
render :new
end
end
def update
authorize @username_block, :update?
if @username_block.update(resource_params)
log_action :update, @username_block
redirect_to admin_username_blocks_path, notice: I18n.t('admin.username_blocks.updated_msg')
else
render :new
end
end
private
def set_username_block
@username_block = UsernameBlock.find(params[:id])
end
def form_username_block_batch_params
params
.expect(form_username_block_batch: [username_block_ids: []])
end
def resource_params
params
.expect(username_block: [:username, :comparison, :allow_with_approval])
end
def action_from_button
'delete' if params[:delete]
end
end

View file

@ -48,6 +48,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
default_privacy: source_params.fetch(:privacy, @account.user.setting_default_privacy),
default_sensitive: source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
default_language: source_params.fetch(:language, @account.user.setting_default_language),
default_quote_policy: source_params.fetch(:quote_policy, @account.user.setting_default_quote_policy),
},
}
end

View file

@ -2,6 +2,7 @@
class Api::V1::Admin::TagsController < Api::BaseController
include Authorization
before_action -> { authorize_if_got_token! :'admin:read' }, only: [:index, :show]
before_action -> { authorize_if_got_token! :'admin:write' }, only: :update

View file

@ -7,6 +7,7 @@ class Api::V1::InvitesController < Api::BaseController
skip_around_action :set_locale
before_action :set_invite
before_action :check_valid_usage!
before_action :check_enabled_registrations!
# Override `current_user` to avoid reading session cookies
@ -22,9 +23,11 @@ class Api::V1::InvitesController < Api::BaseController
@invite = Invite.find_by!(code: params[:invite_code])
end
def check_enabled_registrations!
return render json: { error: I18n.t('invites.invalid') }, status: 401 unless @invite.valid_for_use?
def check_valid_usage!
render json: { error: I18n.t('invites.invalid') }, status: 401 unless @invite.valid_for_use?
end
def check_enabled_registrations!
raise Mastodon::NotPermittedError unless allowed_registration?(request.remote_ip, @invite)
end
end

View file

@ -17,7 +17,7 @@ class Api::V1::Polls::VotesController < Api::BaseController
def set_poll
@poll = Poll.find(params[:poll_id])
authorize @poll.status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View file

@ -17,7 +17,7 @@ class Api::V1::PollsController < Api::BaseController
def set_poll
@poll = Poll.find(params[:id])
authorize @poll.status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View file

@ -16,16 +16,7 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
def create
with_redis_lock("push_subscription:#{current_user.id}") do
destroy_web_push_subscriptions!
@push_subscription = Web::PushSubscription.create!(
endpoint: subscription_params[:endpoint],
key_p256dh: subscription_params[:keys][:p256dh],
key_auth: subscription_params[:keys][:auth],
standard: subscription_params[:standard] || false,
data: data_params,
user_id: current_user.id,
access_token_id: doorkeeper_token.id
)
@push_subscription = Web::PushSubscription.create!(web_push_subscription_params)
end
render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer
@ -55,6 +46,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
not_found if @push_subscription.nil?
end
def web_push_subscription_params
{
access_token_id: doorkeeper_token.id,
data: data_params,
endpoint: subscription_params[:endpoint],
key_auth: subscription_params[:keys][:auth],
key_p256dh: subscription_params[:keys][:p256dh],
standard: subscription_params[:standard] || false,
user_id: current_user.id,
}
end
def subscription_params
params.expect(subscription: [:endpoint, :standard, keys: [:auth, :p256dh]])
end

View file

@ -10,7 +10,7 @@ class Api::V1::Statuses::BaseController < Api::BaseController
def set_status
@status = Status.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View file

@ -23,7 +23,7 @@ class Api::V1::Statuses::BookmarksController < Api::V1::Statuses::BaseController
bookmark&.destroy!
render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, bookmarks_map: { @status.id => false })
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View file

@ -25,7 +25,7 @@ class Api::V1::Statuses::FavouritesController < Api::V1::Statuses::BaseControlle
relationships = StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false }, attributes_map: { @status.id => { favourites_count: count } })
render json: @status, serializer: REST::StatusSerializer, relationships: relationships
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View file

@ -0,0 +1,28 @@
# frozen_string_literal: true
class Api::V1::Statuses::InteractionPoliciesController < Api::V1::Statuses::BaseController
include Api::InteractionPoliciesConcern
before_action -> { doorkeeper_authorize! :write, :'write:statuses' }
def update
authorize @status, :update?
@status.update!(quote_approval_policy: quote_approval_policy)
broadcast_updates! if @status.quote_approval_policy_previously_changed?
render json: @status, serializer: REST::StatusSerializer
end
private
def status_params
params.permit(:quote_approval_policy)
end
def broadcast_updates!
DistributionWorker.perform_async(@status.id, { 'update' => true, 'skip_notifications' => true })
ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id, { 'updated_at' => Time.now.utc.iso8601 })
end
end

View file

@ -0,0 +1,74 @@
# frozen_string_literal: true
class Api::V1::Statuses::QuotesController < Api::V1::Statuses::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: :index
before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: :revoke
before_action :set_statuses, only: :index
before_action :set_quote, only: :revoke
after_action :insert_pagination_headers, only: :index
def index
cache_if_unauthenticated!
render json: @statuses, each_serializer: REST::StatusSerializer
end
def revoke
authorize @quote, :revoke?
RevokeQuoteService.new.call(@quote)
render json: @quote.status, serializer: REST::StatusSerializer
end
private
def set_quote
@quote = @status.quotes.find_by!(status_id: params[:id])
end
def set_statuses
scope = default_statuses
scope = scope.not_excluded_by_account(current_account) unless current_account.nil?
@statuses = scope.merge(paginated_quotes).to_a
# Store next page info before filtering
@records_continue = @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
@pagination_since_id = @statuses.first.quote.id unless @statuses.empty?
@pagination_max_id = @statuses.last.quote.id if @records_continue
if current_account&.id != @status.account_id
domains = @statuses.filter_map(&:account_domain).uniq
account_ids = @statuses.map(&:account_id).uniq
relations = current_account&.relations_map(account_ids, domains) || {}
@statuses.reject! { |status| StatusFilter.new(status, current_account, relations).filtered? }
end
end
def default_statuses
Status.includes(:quote).references(:quote)
end
def paginated_quotes
@status.quotes.accepted.paginate_by_max_id(
limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id],
params[:since_id]
)
end
def next_path
api_v1_status_quotes_url pagination_params(max_id: pagination_max_id) if records_continue?
end
def prev_path
api_v1_status_quotes_url pagination_params(since_id: pagination_since_id) unless @statuses.empty?
end
attr_reader :pagination_max_id, :pagination_since_id
def records_continue?
@records_continue
end
end

View file

@ -36,7 +36,7 @@ class Api::V1::Statuses::ReblogsController < Api::V1::Statuses::BaseController
relationships = StatusRelationshipsPresenter.new([@status], current_account.id, reblogs_map: { @reblog.id => false }, attributes_map: { @reblog.id => { reblogs_count: count } })
render json: @reblog, serializer: REST::StatusSerializer, relationships: relationships
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
@ -45,7 +45,7 @@ class Api::V1::Statuses::ReblogsController < Api::V1::Statuses::BaseController
def set_reblog
@reblog = Status.find(params[:status_id])
authorize @reblog, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View file

@ -2,6 +2,8 @@
class Api::V1::StatusesController < Api::BaseController
include Authorization
include AsyncRefreshesConcern
include Api::InteractionPoliciesConcern
before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy]
before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :update, :destroy]
@ -9,6 +11,7 @@ class Api::V1::StatusesController < Api::BaseController
before_action :set_statuses, only: [:index]
before_action :set_status, only: [:show, :context]
before_action :set_thread, only: [:create]
before_action :set_quoted_status, only: [:create]
before_action :check_statuses_limit, only: [:index]
override_rate_limit_headers :create, family: :statuses
@ -57,9 +60,21 @@ class Api::V1::StatusesController < Api::BaseController
@context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
statuses = [@status] + @context.ancestors + @context.descendants
render json: @context, serializer: REST::ContextSerializer, relationships: StatusRelationshipsPresenter.new(statuses, current_user&.account_id)
refresh_key = "context:#{@status.id}:refresh"
async_refresh = AsyncRefresh.new(refresh_key)
ActivityPub::FetchAllRepliesWorker.perform_async(@status.id) if !current_account.nil? && @status.should_fetch_replies?
if async_refresh.running?
add_async_refresh_header(async_refresh)
elsif !current_account.nil? && @status.should_fetch_replies?
add_async_refresh_header(AsyncRefresh.create(refresh_key, count_results: true))
WorkerBatch.new.within do |batch|
batch.connect(refresh_key, threshold: 1.0)
ActivityPub::FetchAllRepliesWorker.perform_async(@status.id, { 'batch_id' => batch.id })
end
end
render json: @context, serializer: REST::ContextSerializer, relationships: StatusRelationshipsPresenter.new(statuses, current_user&.account_id)
end
def create
@ -67,6 +82,8 @@ class Api::V1::StatusesController < Api::BaseController
current_user.account,
text: status_params[:status],
thread: @thread,
quoted_status: @quoted_status,
quote_approval_policy: quote_approval_policy,
media_ids: status_params[:media_ids],
sensitive: status_params[:sensitive],
spoiler_text: status_params[:spoiler_text],
@ -98,7 +115,8 @@ class Api::V1::StatusesController < Api::BaseController
sensitive: status_params[:sensitive],
language: status_params[:language],
spoiler_text: status_params[:spoiler_text],
poll: status_params[:poll]
poll: status_params[:poll],
quote_approval_policy: quote_approval_policy
)
render json: @status, serializer: REST::StatusSerializer
@ -127,7 +145,7 @@ class Api::V1::StatusesController < Api::BaseController
def set_status
@status = Status.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
@ -138,6 +156,14 @@ class Api::V1::StatusesController < Api::BaseController
render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404
end
def set_quoted_status
@quoted_status = Status.find(status_params[:quoted_status_id])&.proper if status_params[:quoted_status_id].present?
authorize(@quoted_status, :quote?) if @quoted_status.present?
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
# TODO: distinguish between non-existing and non-quotable posts
render json: { error: I18n.t('statuses.errors.quoted_status_not_found') }, status: 404
end
def check_statuses_limit
raise(Mastodon::ValidationError) if status_ids.size > DEFAULT_STATUSES_LIMIT
end
@ -154,6 +180,8 @@ class Api::V1::StatusesController < Api::BaseController
params.permit(
:status,
:in_reply_to_id,
:quoted_status_id,
:quote_approval_policy,
:sensitive,
:spoiler_text,
:visibility,

View file

@ -3,14 +3,8 @@
class Api::V1::Timelines::BaseController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
before_action :require_user!, if: :require_auth?
private
def require_auth?
!Setting.timeline_preview
end
def pagination_collection
@statuses
end

View file

@ -3,8 +3,8 @@
class Api::V1::Timelines::HomeController < Api::V1::Timelines::BaseController
include AsyncRefreshesConcern
before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show]
before_action :require_user!, only: [:show]
before_action -> { doorkeeper_authorize! :read, :'read:statuses' }
before_action :require_user!
PERMITTED_PARAMS = %i(local limit).freeze

View file

@ -1,6 +1,6 @@
# frozen_string_literal: true
class Api::V1::Timelines::LinkController < Api::V1::Timelines::BaseController
class Api::V1::Timelines::LinkController < Api::V1::Timelines::TopicController
before_action -> { authorize_if_got_token! :read, :'read:statuses' }
before_action :set_preview_card
before_action :set_statuses

View file

@ -2,6 +2,7 @@
class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController
before_action -> { authorize_if_got_token! :read, :'read:statuses' }
before_action :require_user!, if: :require_auth?
PERMITTED_PARAMS = %i(local remote limit only_media).freeze
@ -13,6 +14,16 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController
private
def require_auth?
if truthy_param?(:local)
Setting.local_live_feed_access != 'public'
elsif truthy_param?(:remote)
Setting.remote_live_feed_access != 'public'
else
Setting.local_live_feed_access != 'public' || Setting.remote_live_feed_access != 'public'
end
end
def load_statuses
preloaded_public_statuses_page
end

View file

@ -1,6 +1,6 @@
# frozen_string_literal: true
class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController
class Api::V1::Timelines::TagController < Api::V1::Timelines::TopicController
before_action -> { authorize_if_got_token! :read, :'read:statuses' }
before_action :load_tag
@ -14,10 +14,6 @@ class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController
private
def require_auth?
!Setting.timeline_preview
end
def load_tag
@tag = Tag.find_normalized(params[:id])
end

View file

@ -0,0 +1,17 @@
# frozen_string_literal: true
class Api::V1::Timelines::TopicController < Api::V1::Timelines::BaseController
before_action :require_user!, if: :require_auth?
private
def require_auth?
if truthy_param?(:local)
Setting.local_topic_feed_access != 'public'
elsif truthy_param?(:remote)
Setting.remote_topic_feed_access != 'public'
else
Setting.local_topic_feed_access != 'public' || Setting.remote_topic_feed_access != 'public'
end
end
end

View file

@ -20,7 +20,7 @@ class Api::V2::SearchController < Api::BaseController
@search = Search.new(search_results)
render json: @search, serializer: REST::SearchSerializer
rescue Mastodon::SyntaxError
unprocessable_entity
unprocessable_content
rescue ActiveRecord::RecordNotFound
not_found
end

View file

@ -30,7 +30,7 @@ class Api::Web::EmbedsController < Api::Web::BaseController
def set_status
@status = Status.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View file

@ -49,7 +49,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
{
policy: 'all',
alerts: Notification::TYPES.index_with { alerts_enabled },
}
}.deep_stringify_keys
end
def alerts_enabled

View file

@ -28,7 +28,7 @@ class ApplicationController < ActionController::Base
rescue_from Mastodon::NotPermittedError, with: :forbidden
rescue_from ActionController::RoutingError, ActiveRecord::RecordNotFound, with: :not_found
rescue_from ActionController::UnknownFormat, with: :not_acceptable
rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_content
rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests
rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error)
@ -123,7 +123,7 @@ class ApplicationController < ActionController::Base
respond_with_error(410)
end
def unprocessable_entity
def unprocessable_content
respond_with_error(422)
end

View file

@ -38,8 +38,7 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
private
def record_login_activity
LoginActivity.create(
user: @user,
@user.login_activities.create(
success: true,
authentication_method: :omniauth,
provider: @provider,

View file

@ -19,8 +19,7 @@ class Auth::PasswordsController < Devise::PasswordsController
private
def redirect_invalid_reset_token
flash[:error] = I18n.t('auth.invalid_reset_password_token')
redirect_to new_password_path(resource_name)
redirect_to new_password_path(resource_name), flash: { error: t('auth.invalid_reset_password_token') }
end
def reset_password_token_is_valid?

View file

@ -23,11 +23,11 @@ class Auth::RegistrationsController < Devise::RegistrationsController
super(&:build_invite_request)
end
def edit # rubocop:disable Lint/UselessMethodDefinition
def edit
super
end
def create # rubocop:disable Lint/UselessMethodDefinition
def create
super
end
@ -89,7 +89,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
end
def check_enabled_registrations
redirect_to root_path unless allowed_registration?(request.remote_ip, @invite)
redirect_to new_user_session_path, alert: I18n.t('devise.failure.closed_registrations', email: Setting.site_contact_email) unless allowed_registration?(request.remote_ip, @invite)
end
def invite_code

View file

@ -12,6 +12,8 @@ class Auth::SessionsController < Devise::SessionsController
skip_before_action :require_functional!
skip_before_action :update_user_sign_in
around_action :preserve_stored_location, only: :destroy, if: :continue_after?
prepend_before_action :check_suspicious!, only: [:create]
include Auth::TwoFactorAuthenticationConcern
@ -31,11 +33,9 @@ class Auth::SessionsController < Devise::SessionsController
end
def destroy
tmp_stored_location = stored_location_for(:user)
super
session.delete(:challenge_passed_at)
flash.delete(:notice)
store_location_for(:user, tmp_stored_location) if continue_after?
end
def webauthn_options
@ -96,6 +96,12 @@ class Auth::SessionsController < Devise::SessionsController
private
def preserve_stored_location
original_stored_location = stored_location_for(:user)
yield
store_location_for(:user, original_stored_location)
end
def check_suspicious!
user = find_user
@login_is_suspicious = suspicious_sign_in?(user) unless user.nil?
@ -151,12 +157,11 @@ class Auth::SessionsController < Devise::SessionsController
sign_in(user)
flash.delete(:notice)
LoginActivity.create(
user: user,
success: true,
authentication_method: security_measure,
ip: request.remote_ip,
user_agent: request.user_agent
user.login_activities.create(
request_details.merge(
authentication_method: security_measure,
success: true
)
)
UserMailer.suspicious_sign_in(user, request.remote_ip, request.user_agent, Time.now.utc).deliver_later! if @login_is_suspicious
@ -167,13 +172,12 @@ class Auth::SessionsController < Devise::SessionsController
end
def on_authentication_failure(user, security_measure, failure_reason)
LoginActivity.create(
user: user,
success: false,
authentication_method: security_measure,
failure_reason: failure_reason,
ip: request.remote_ip,
user_agent: request.user_agent
user.login_activities.create(
request_details.merge(
authentication_method: security_measure,
failure_reason: failure_reason,
success: false
)
)
# Only send a notification email every hour at most
@ -182,6 +186,13 @@ class Auth::SessionsController < Devise::SessionsController
UserMailer.failed_2fa(user, request.remote_ip, request.user_agent, Time.now.utc).deliver_later!
end
def request_details
{
ip: request.remote_ip,
user_agent: request.user_agent,
}
end
def second_factor_attempts_key(user)
"2fa_auth_attempts:#{user.id}:#{Time.now.utc.hour}"
end

View file

@ -21,7 +21,7 @@ class AuthorizeInteractionsController < ApplicationController
def set_resource
@resource = located_resource
authorize(@resource, :show?) if @resource.is_a?(Status)
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View file

@ -18,7 +18,11 @@ module AccountOwnedConcern
end
def set_account
@account = Account.find_local!(username_param)
@account = username_param.present? ? Account.find_local!(username_param) : Account.local.find(account_id_param)
end
def account_id_param
params[:account_id]
end
def username_param

View file

@ -0,0 +1,19 @@
# frozen_string_literal: true
module Api::InteractionPoliciesConcern
extend ActiveSupport::Concern
def quote_approval_policy
case status_params[:quote_approval_policy].presence || current_user.setting_default_quote_policy
when 'public'
Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16
when 'followers'
Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] << 16
when 'nobody'
0
else
# TODO: raise more useful message
raise ActiveRecord::RecordInvalid
end
end
end

View file

@ -6,6 +6,9 @@ module AsyncRefreshesConcern
def add_async_refresh_header(async_refresh, retry_seconds: 3)
return unless async_refresh.running?
response.headers['Mastodon-Async-Refresh'] = "id=\"#{async_refresh.id}\", retry=#{retry_seconds}"
value = "id=\"#{async_refresh.id}\", retry=#{retry_seconds}"
value += ", result_count=#{async_refresh.result_count}" unless async_refresh.result_count.nil?
response.headers['Mastodon-Async-Refresh'] = value
end
end

View file

@ -5,6 +5,18 @@ module Auth::CaptchaConcern
include Hcaptcha::Adapters::ViewMethods
CAPTCHA_DIRECTIVES = %w(
connect_src
frame_src
script_src
style_src
).freeze
CAPTCHA_SOURCES = %w(
https://*.hcaptcha.com
https://hcaptcha.com
).freeze
included do
helper_method :render_captcha
end
@ -42,20 +54,9 @@ module Auth::CaptchaConcern
end
def extend_csp_for_captcha!
policy = request.content_security_policy&.clone
return unless captcha_required? && request.content_security_policy.present?
return unless captcha_required? && policy.present?
%w(script_src frame_src style_src connect_src).each do |directive|
values = policy.send(directive)
values << 'https://hcaptcha.com' unless values.include?('https://hcaptcha.com') || values.include?('https:')
values << 'https://*.hcaptcha.com' unless values.include?('https://*.hcaptcha.com') || values.include?('https:')
policy.send(directive, *values)
end
request.content_security_policy = policy
request.content_security_policy = captcha_adjusted_policy
end
def render_captcha
@ -63,4 +64,24 @@ module Auth::CaptchaConcern
hcaptcha_tags
end
private
def captcha_adjusted_policy
request.content_security_policy.clone.tap do |policy|
populate_captcha_policy(policy)
end
end
def populate_captcha_policy(policy)
CAPTCHA_DIRECTIVES.each do |directive|
values = policy.send(directive)
CAPTCHA_SOURCES.each do |source|
values << source unless values.include?(source) || values.include?('https:')
end
policy.send(directive, *values)
end
end
end

View file

@ -9,6 +9,8 @@ module SignatureVerification
EXPIRATION_WINDOW_LIMIT = 12.hours
CLOCK_SKEW_MARGIN = 1.hour
STOPLIGHT_COOL_OFF_TIME = 5.minutes.seconds
STOPLIGHT_THRESHOLD = 1
def require_account_signature!
render json: signature_verification_failure_reason, status: signature_verification_failure_code unless signed_request_account
@ -107,10 +109,12 @@ module SignatureVerification
end
def stoplight_wrapper
Stoplight("source:#{request.remote_ip}")
.with_threshold(1)
.with_cool_off_time(5.minutes.seconds)
.with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) }
Stoplight(
"source:#{request.remote_ip}",
cool_off_time: STOPLIGHT_COOL_OFF_TIME,
threshold: STOPLIGHT_THRESHOLD,
tracked_errors: [HTTP::Error, OpenSSL::SSL::SSLError]
)
end
def actor_refresh_key!(actor)

View file

@ -60,17 +60,17 @@ class FollowerAccountsController < ApplicationController
def collection_presenter
if page_requested?
ActivityPub::CollectionPresenter.new(
id: account_followers_url(@account, page: params.fetch(:page, 1)),
id: page_url(params.fetch(:page, 1)),
type: :ordered,
size: @account.followers_count,
items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.account) },
part_of: account_followers_url(@account),
part_of: ActivityPub::TagManager.instance.followers_uri_for(@account),
next: next_page_url,
prev: prev_page_url
)
else
ActivityPub::CollectionPresenter.new(
id: account_followers_url(@account),
id: ActivityPub::TagManager.instance.followers_uri_for(@account),
type: :ordered,
size: @account.followers_count,
first: page_url(1)

View file

@ -49,7 +49,7 @@ class FollowingAccountsController < ApplicationController
end
def page_url(page)
account_following_index_url(@account, page: page) unless page.nil?
ActivityPub::TagManager.instance.following_uri_for(@account, page: page) unless page.nil?
end
def next_page_url
@ -63,17 +63,17 @@ class FollowingAccountsController < ApplicationController
def collection_presenter
if page_requested?
ActivityPub::CollectionPresenter.new(
id: account_following_index_url(@account, page: params.fetch(:page, 1)),
id: page_url(params.fetch(:page, 1)),
type: :ordered,
size: @account.following_count,
items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.target_account) },
part_of: account_following_index_url(@account),
part_of: ActivityPub::TagManager.instance.following_uri_for(@account),
next: next_page_url,
prev: prev_page_url
)
else
ActivityPub::CollectionPresenter.new(
id: account_following_index_url(@account),
id: ActivityPub::TagManager.instance.following_uri_for(@account),
type: :ordered,
size: @account.following_count,
first: page_url(1)

View file

@ -34,7 +34,7 @@ class MediaController < ApplicationController
def verify_permitted_status!
authorize @media_attachment.status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View file

@ -5,6 +5,6 @@ class Settings::LoginActivitiesController < Settings::BaseController
skip_before_action :require_functional!
def index
@login_activities = LoginActivity.where(user: current_user).order(id: :desc).page(params[:page])
@login_activities = current_user.login_activities.order(id: :desc).page(params[:page])
end
end

View file

@ -22,7 +22,7 @@ class Settings::Migration::RedirectsController < Settings::BaseController
end
def destroy
if current_account.moved_to_account_id.present?
if current_account.moved?
current_account.update!(moved_to_account: nil)
ActivityPub::UpdateDistributionWorker.perform_async(current_account.id)
end

View file

@ -0,0 +1,15 @@
# frozen_string_literal: true
class Settings::Preferences::PostingDefaultsController < Settings::Preferences::BaseController
private
def after_update_redirect_path
settings_preferences_posting_defaults_path
end
def user_params
super.tap do |params|
params[:settings_attributes][:default_quote_policy] = 'nobody' if params[:settings_attributes][:default_privacy] == 'private'
end
end
end

View file

@ -8,8 +8,7 @@ class Settings::SessionsController < Settings::BaseController
def destroy
@session.destroy!
flash[:notice] = I18n.t('sessions.revoke_success')
redirect_to edit_user_registration_path
redirect_to edit_user_registration_path, notice: t('sessions.revoke_success')
end
private

View file

@ -52,7 +52,7 @@ module Settings
end
else
flash[:error] = I18n.t('webauthn_credentials.create.error')
status = :unprocessable_entity
status = :unprocessable_content
end
else
flash[:error] = t('webauthn_credentials.create.error')
@ -86,13 +86,11 @@ module Settings
private
def redirect_invalid_otp
flash[:error] = t('webauthn_credentials.otp_required')
redirect_to settings_two_factor_authentication_methods_path
redirect_to settings_two_factor_authentication_methods_path, flash: { error: t('webauthn_credentials.otp_required') }
end
def redirect_invalid_webauthn
flash[:error] = t('webauthn_credentials.not_enabled')
redirect_to settings_two_factor_authentication_methods_path
redirect_to settings_two_factor_authentication_methods_path, flash: { error: t('webauthn_credentials.not_enabled') }
end
end
end

View file

@ -11,6 +11,7 @@ class StatusesController < ApplicationController
before_action :require_account_signature!, only: [:show, :activity], if: -> { request.format == :json && authorized_fetch_mode? }
before_action :set_status
before_action :redirect_to_original, only: :show
before_action :verify_embed_allowed, only: :embed
after_action :set_link_headers
@ -40,8 +41,6 @@ class StatusesController < ApplicationController
end
def embed
return not_found if @status.hidden? || @status.reblog?
expires_in 180, public: true
response.headers.delete('X-Frame-Options')
@ -50,6 +49,10 @@ class StatusesController < ApplicationController
private
def verify_embed_allowed
not_found if @status.hidden? || @status.reblog?
end
def set_link_headers
response.headers['Link'] = LinkHeader.new(
[[ActivityPub::TagManager.instance.uri_for(@status), [%w(rel alternate), %w(type application/activity+json)]]]
@ -59,7 +62,7 @@ class StatusesController < ApplicationController
def set_status
@status = @account.statuses.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View file

@ -13,6 +13,8 @@ module Admin::ActionLogsHelper
end
when 'UserRole'
link_to log.human_identifier, admin_roles_path(log.target_id)
when 'UsernameBlock'
link_to log.human_identifier, edit_admin_username_block_path(log.target_id)
when 'Report'
link_to "##{log.human_identifier.presence || log.target_id}", admin_report_path(log.target_id)
when 'Instance', 'DomainBlock', 'DomainAllow', 'UnavailableDomain'

View file

@ -113,6 +113,7 @@ module ApplicationHelper
end
def material_symbol(icon, attributes = {})
whitespace = attributes.delete(:whitespace) { true }
safe_join(
[
inline_svg_tag(
@ -121,7 +122,7 @@ module ApplicationHelper
role: :img,
data: attributes[:data]
),
' ',
whitespace ? ' ' : '',
]
)
end
@ -243,6 +244,10 @@ module ApplicationHelper
tag.input(type: :text, maxlength: 999, spellcheck: false, readonly: true, **options)
end
def recent_tag_users(tag)
tag.statuses.public_visibility.joins(:account).merge(Account.without_suspended.without_silenced).includes(:account).limit(3).map(&:account)
end
def recent_tag_usage(tag)
people = tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts
I18n.t 'user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(people), count: people
@ -256,6 +261,10 @@ module ApplicationHelper
'https://play.google.com/store/apps/details?id=org.joinmastodon.android'
end
def within_authorization_flow?
session[:user_return_to].present? && Rails.application.routes.recognize_path(session[:user_return_to])[:controller] == 'oauth/authorizations'
end
private
def storage_host_var

View file

@ -39,6 +39,12 @@ module ContextHelper
'automaticApproval' => { '@id' => 'gts:automaticApproval', '@type' => '@id' },
'manualApproval' => { '@id' => 'gts:manualApproval', '@type' => '@id' },
},
quote_authorizations: {
'gts' => 'https://gotosocial.org/ns#',
'quoteAuthorization' => { '@id' => 'https://w3id.org/fep/044f#quoteAuthorization', '@type' => '@id' },
'interactingObject' => { '@id' => 'gts:interactingObject' },
'interactionTarget' => { '@id' => 'gts:interactionTarget' },
},
}.freeze
def full_context

View file

@ -1,18 +0,0 @@
# frozen_string_literal: true
module EmailHelper
def self.included(base)
base.extend(self)
end
def email_to_canonical_email(str)
username, domain = str.downcase.split('@', 2)
username, = username.delete('.').split('+', 2)
"#{username}@#{domain}"
end
def email_to_canonical_email_hash(str)
Digest::SHA2.new(256).hexdigest(email_to_canonical_email(str))
end
end

View file

@ -27,7 +27,9 @@ module FormattingHelper
module_function :extract_status_plain_text
def status_content_format(status)
html_aware_format(status.text, status.local?, preloaded_accounts: [status.account] + (status.respond_to?(:active_mentions) ? status.active_mentions.map(&:account) : []))
quoted_status = status.quote&.quoted_status if status.local?
html_aware_format(status.text, status.local?, preloaded_accounts: [status.account] + (status.respond_to?(:active_mentions) ? status.active_mentions.map(&:account) : []), quoted_status: quoted_status)
end
def rss_status_content_format(status)
@ -65,12 +67,12 @@ module FormattingHelper
end
def rss_content_preroll(status)
if status.spoiler_text?
safe_join [
tag.p { spoiler_with_warning(status) },
tag.hr,
]
end
return unless status.spoiler_text?
safe_join [
tag.p { spoiler_with_warning(status) },
tag.hr,
]
end
def spoiler_with_warning(status)
@ -81,10 +83,10 @@ module FormattingHelper
end
def rss_content_postroll(status)
if status.preloadable_poll
tag.p do
poll_option_tags(status)
end
return unless status.preloadable_poll
tag.p do
poll_option_tags(status)
end
end

View file

@ -21,7 +21,13 @@ module HomeHelper
end
end
else
link_to(path || ActivityPub::TagManager.instance.url_for(account), class: 'account__display-name') do
account_url = if account.suspended?
ActivityPub::TagManager.instance.url_for(account)
else
web_url("@#{account.pretty_acct}")
end
link_to(path || account_url, class: 'account__display-name') do
content_tag(:div, class: 'account__avatar-wrapper') do
image_tag(full_asset_url(current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url), class: 'account__avatar', width: 46, height: 46)
end +
@ -39,18 +45,8 @@ module HomeHelper
end
end
def obscured_counter(count)
if count <= 0
'0'
elsif count == 1
'1'
else
'1+'
end
end
def custom_field_classes(field)
if field.verified?
def field_verified_class(verified)
if verified
'verified'
else
'emojify'

View file

@ -134,7 +134,7 @@ module JsonLdHelper
patch_for_forwarding!(value, compacted_value)
elsif value.is_a?(Array)
compacted_value = [compacted_value] unless compacted_value.is_a?(Array)
return if value.size != compacted_value.size
return nil if value.size != compacted_value.size
compacted[key] = value.zip(compacted_value).map do |v, vc|
if v.is_a?(Hash) && vc.is_a?(Hash)

View file

@ -107,6 +107,7 @@ module LanguagesHelper
mk: ['Macedonian', 'македонски јазик'].freeze,
ml: ['Malayalam', 'മലയാളം'].freeze,
mn: ['Mongolian', 'Монгол хэл'].freeze,
'mn-Mong': ['Traditional Mongolian', 'ᠮᠣᠩᠭᠣᠯ ᠬᠡᠯᠡ'].freeze,
mr: ['Marathi', 'मराठी'].freeze,
ms: ['Malay', 'Bahasa Melayu'].freeze,
'ms-Arab': ['Jawi Malay', 'بهاس ملايو'].freeze,

View file

@ -46,6 +46,14 @@ module StatusesHelper
status.preloadable_poll.options.map { |o| "[ ] #{o}" }.join("\n")
end
def status_classnames(status, is_quote)
if is_quote
'status--is-quote'
elsif status.quote.present?
'status--has-quote'
end
end
def status_description(status)
components = [[media_summary(status), status_text_summary(status)].compact_blank.join(' · ')]
@ -57,6 +65,20 @@ module StatusesHelper
components.compact_blank.join("\n\n")
end
# This logic should be kept in sync with https://github.com/mastodon/mastodon/blob/425311e1d95c8a64ddac6c724fca247b8b893a82/app/javascript/mastodon/features/status/components/card.jsx#L160
def preview_card_aspect_ratio_classname(preview_card)
interactive = preview_card.type == 'video'
large_image = (preview_card.image.present? && preview_card.width > preview_card.height) || interactive
if large_image && interactive
'status-card__image--video'
elsif large_image
'status-card__image--large'
else
'status-card__image--normal'
end
end
def visibility_icon(status)
VISIBLITY_ICONS[status.visibility.to_sym]
end
@ -64,4 +86,16 @@ module StatusesHelper
def prefers_autoplay?
ActiveModel::Type::Boolean.new.cast(params[:autoplay]) || current_user&.setting_auto_play_gif
end
def render_seo_schema(status)
json = ActiveModelSerializers::SerializableResource.new(
status,
serializer: SEO::SocialMediaPostingSerializer,
adapter: SEO::Adapter
).to_json
# rubocop:disable Rails/OutputSafety
content_tag(:script, json_escape(json).html_safe, type: 'application/ld+json')
# rubocop:enable Rails/OutputSafety
end
end

View file

@ -24,24 +24,24 @@ module ThemeHelper
end
def custom_stylesheet
if active_custom_stylesheet.present?
stylesheet_link_tag(
custom_css_path(active_custom_stylesheet),
host: root_url,
media: :all,
skip_pipeline: true
)
end
return if active_custom_stylesheet.blank?
stylesheet_link_tag(
custom_css_path(active_custom_stylesheet),
host: root_url,
media: :all,
skip_pipeline: true
)
end
private
def active_custom_stylesheet
if cached_custom_css_digest.present?
[:custom, cached_custom_css_digest.to_s.first(8)]
.compact_blank
.join('-')
end
return if cached_custom_css_digest.blank?
[:custom, cached_custom_css_digest.to_s.first(8)]
.compact_blank
.join('-')
end
def cached_custom_css_digest

View file

@ -0,0 +1,61 @@
{
"global": {
"class": "className",
"id": true,
"title": true,
"dir": true,
"lang": true
},
"tags": {
"p": {},
"br": {
"children": false
},
"span": {
"attributes": {
"translate": true
}
},
"a": {
"attributes": {
"href": true,
"rel": true,
"translate": true,
"target": true
}
},
"del": {},
"s": {},
"pre": {},
"blockquote": {},
"code": {},
"b": {},
"strong": {},
"u": {},
"i": {},
"img": {
"children": false,
"attributes": {
"src": true,
"alt": true,
"title": true
}
},
"em": {},
"ul": {},
"ol": {
"attributes": {
"start": true,
"reversed": true
}
},
"li": {
"attributes": {
"value": true
}
},
"ruby": {},
"rt": {},
"rp": {}
}
}

View file

@ -1,6 +1,7 @@
import { createRoot } from 'react-dom/client';
import Rails from '@rails/ujs';
import { decode, ValidationError } from 'blurhash';
import ready from '../mastodon/ready';
@ -362,6 +363,46 @@ ready(() => {
document.querySelectorAll('[data-admin-component]').forEach((element) => {
void mountReactComponent(element);
});
document
.querySelectorAll<HTMLCanvasElement>('canvas[data-blurhash]')
.forEach((canvas) => {
const blurhash = canvas.dataset.blurhash;
if (blurhash) {
try {
// decode returns a Uint8ClampedArray<ArrayBufferLike> not Uint8ClampedArray<ArrayBuffer>
const pixels = decode(
blurhash,
32,
32,
) as Uint8ClampedArray<ArrayBuffer>;
const ctx = canvas.getContext('2d');
const imageData = new ImageData(pixels, 32, 32);
ctx?.putImageData(imageData, 0, 0);
} catch (err) {
if (err instanceof ValidationError) {
// ignore blurhash validation errors
return;
}
throw err;
}
}
});
document
.querySelectorAll<HTMLDivElement>('.preview-card')
.forEach((previewCard) => {
const spoilerButton = previewCard.querySelector('.spoiler-button');
if (!spoilerButton) {
return;
}
spoilerButton.addEventListener('click', () => {
previewCard.classList.toggle('preview-card--image-visible');
});
});
}).catch((reason: unknown) => {
throw reason;
});

View file

@ -145,6 +145,10 @@ function loaded() {
);
});
updateDefaultQuotePrivacyFromPrivacy(
document.querySelector('#user_settings_attributes_default_privacy'),
);
const reactComponents = document.querySelectorAll('[data-component]');
if (reactComponents.length > 0) {
@ -347,6 +351,31 @@ const setInputDisabled = (
}
};
const setInputHint = (
input: HTMLInputElement | HTMLSelectElement,
hintPrefix: string,
) => {
const fieldWrapper = input.closest<HTMLElement>('.fields-group > .input');
if (!fieldWrapper) return;
const hint = fieldWrapper.dataset[`${hintPrefix}Hint`];
const hintElement =
fieldWrapper.querySelector<HTMLSpanElement>(':scope > .hint');
if (hint) {
if (hintElement) {
hintElement.textContent = hint;
} else {
const newHintElement = document.createElement('span');
newHintElement.className = 'hint';
newHintElement.textContent = hint;
fieldWrapper.appendChild(newHintElement);
}
} else {
hintElement?.remove();
}
};
Rails.delegate(
document,
'#account_statuses_cleanup_policy_enabled',
@ -364,6 +393,36 @@ Rails.delegate(
},
);
const updateDefaultQuotePrivacyFromPrivacy = (
privacySelect: EventTarget | null,
) => {
if (!(privacySelect instanceof HTMLSelectElement) || !privacySelect.form)
return;
const select = privacySelect.form.querySelector<HTMLSelectElement>(
'select#user_settings_attributes_default_quote_policy',
);
if (!select) return;
setInputHint(select, privacySelect.value);
if (privacySelect.value === 'private') {
select.value = 'nobody';
setInputDisabled(select, true);
} else {
setInputDisabled(select, false);
}
};
Rails.delegate(
document,
'#user_settings_attributes_default_privacy',
'change',
({ target }) => {
updateDefaultQuotePrivacyFromPrivacy(target);
},
);
// Empty the honeypot fields in JS in case something like an extension
// automatically filled them.
Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => {

View file

@ -1 +1,3 @@
Images in this folder are based on [Tabler.io icons](https://tabler.io/icons).
Seems to be 1.5 width icons scaled to 64×64px and centered above a blue square with round corners (24px).

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Some files were not shown because too many files have changed in this diff Show more