From c3764fd239e9929ec677e286cea9b9e42556f6ba Mon Sep 17 00:00:00 2001 From: m c Date: Sat, 19 Oct 2024 21:35:03 -0400 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 075a4492f700097310738d41ba2de6d1b2707ff6 Merge: 92771e5afb ba365ac8ec Author: Claire Date: Sat Oct 19 22:08:41 2024 +0200 Merge pull request #2887 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 1fc165de02d79294c8a218f5fa82bcd477484ca1 commit ba365ac8ec1deede2b28ef5884d06a18d8f144ed Author: Emelia Smith Date: Wed Oct 16 12:40:40 2024 +0200 [Glitch] Fix: Reword 'pick one' to 'single choice' for polls Port bc2e642272eec058f153b59b155712e61bc2af7d to glitch-soc Signed-off-by: Claire commit 6bd185b42392fe4d51491cf5a1b52d02fc414c28 Author: Claire Date: Fri Oct 18 12:51:05 2024 +0200 [Glitch] Remove ability to get embed code for remote posts Port 1fc165de02d79294c8a218f5fa82bcd477484ca1 to glitch-soc Signed-off-by: Claire commit f0207d10be620315ec12fad6d4bc7c26c1ee4fc4 Author: hota Date: Fri Oct 18 16:40:08 2024 +0900 [Glitch] Fix column-settings spacing in local timeline in advanced view Port 0f37b7d6acd2a7666ce56354d9196da2ec02da81 to glitch-soc Signed-off-by: Claire commit b428921ec91a72ad98ec4de4a75a450b722d2580 Author: Claire Date: Thu Oct 17 11:03:08 2024 +0200 [Glitch] Add more explicit explanations about author attribution and `fediverse:creator` Port 8b5650962557726c8b1dfca6ccc4b41d96a693b6 to glitch-soc Signed-off-by: Claire commit 829ff8633b87ff0f7c0068be68dfb06b14036228 Author: Renaud Chaput Date: Wed Oct 16 10:33:11 2024 +0200 [Glitch] Add ability to group follow notifications in WebUI Port 6c87c76e1825a377ebb87fdfcf7f5c438c1be589 to glitch-soc Signed-off-by: Claire commit 42336d810b83df36698b4cbd7644fb171c81d7de Author: Claire Date: Wed Oct 16 09:30:53 2024 +0200 [Glitch] Fix only the first paragraph being displayed in some notifications Port 25f8003d75515fb1c195c6f4ca2ea92a0d58163e to glitch-soc Signed-off-by: Claire commit 2f854c5576adb4cc4eb64f9af1f5b303afbf7fef Author: Renaud Chaput Date: Wed Oct 16 09:27:44 2024 +0200 [Glitch] Add back a 6 hours mute duration option Port 7a7a7cc448514609a268a2c6bceca414783579ee to glitch-soc Signed-off-by: Claire commit e35ee2ce5c78b779e11c5948c472edb0a1ac55e1 Author: Jeong Arm Date: Tue Oct 15 06:01:21 2024 -0400 [Glitch] Fix reblog icons on account media view Port 5afdb81b366ed423588e0a29c146539978180de0 to glitch-soc Signed-off-by: Claire commit 886a422d090475461d67fc1e43f456b2e61f3028 Author: Claire Date: Tue Oct 15 11:38:04 2024 +0200 [Glitch] Fix follow recommendation carrousel scrolling on RTL layouts, for real Port 5e4cc1a39c86d75995dc0a86a021085adc3a8c63 to glitch-soc Signed-off-by: Claire commit d63594d97ee9e9c1615792c6034a4d0f1b6a014a Author: Renaud Chaput Date: Tue Oct 15 11:15:25 2024 +0200 [Glitch] Fix back arrow pointing to the incorrect direction in RTL languages Port 51345e5133a7f7b84044b9aeebdf99fd769ddf40 to glitch-soc Signed-off-by: Claire commit 6281c4deddce7cddfe3e2c192d824e34472e26b0 Merge: 92771e5afb 1fc165de02 Author: Claire Date: Sat Oct 19 19:13:32 2024 +0200 Merge commit '1fc165de02d79294c8a218f5fa82bcd477484ca1' into glitch-soc/merge-upstream Conflicts: - `.env.production.sample`: Upstream added a block of three environment variables, while glitch-soc has a different version of the file overall. Added upstream's changes. - `app/helpers/application_helper.rb`: Upstream added a helper, while glitch-soc had extra helpers. Added upstream's helper. commit 1fc165de02d79294c8a218f5fa82bcd477484ca1 Author: Claire Date: Fri Oct 18 12:51:05 2024 +0200 Remove ability to get embed code for remote posts (#32578) commit 2391937e11d2dd1ce4da9073511ee0f85a3f63f9 Author: Claire Date: Fri Oct 18 12:21:25 2024 +0200 Fix follow recommendation moderation page default language when using regional variant (#32580) commit 8eae0d067db940d88a834128a9b6c022e29b9b28 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Oct 18 09:56:43 2024 +0200 New Crowdin Translations (automated) (#32573) Co-authored-by: GitHub Actions commit 0f37b7d6acd2a7666ce56354d9196da2ec02da81 Author: hota Date: Fri Oct 18 16:40:08 2024 +0900 Fix column-settings spacing in local timeline in advanced view (#32567) commit bd6c96f73742101df842cf21574a3bbe0c1371e0 Author: Matt Jankowski Date: Fri Oct 18 03:19:37 2024 -0400 Fix broken i18n in text welcome mailer tags area (#32571) commit 8b5650962557726c8b1dfca6ccc4b41d96a693b6 Author: Claire Date: Thu Oct 17 11:03:08 2024 +0200 Add more explicit explanations about author attribution and `fediverse:creator` (#32383) commit 009f2ebc324458209c8827eab64cb7d9c81f3404 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Oct 17 10:21:51 2024 +0200 New Crowdin Translations (automated) (#32553) Co-authored-by: GitHub Actions commit b23ff050acebeac7ce09581ad65151b361362998 Author: Emelia Smith Date: Thu Oct 17 10:17:18 2024 +0200 Fix missing or incorrect cache-control headers for Streaming server (#32551) commit 5103abc3ec8fa8923541ad03b94fa7924b017b6c Author: Matt Jankowski Date: Thu Oct 17 03:22:13 2024 -0400 Fix trailing slash newline in changelog (#32545) commit a0c7b317a727521a8c5d9c5af9a4d29107fd9a40 Author: Matt Jankowski Date: Wed Oct 16 08:52:06 2024 -0400 Update rails to version 7.1.4.1 (#32542) commit bc2e642272eec058f153b59b155712e61bc2af7d Author: Emelia Smith Date: Wed Oct 16 12:40:40 2024 +0200 Fix: Reword 'pick one' to 'single choice' for polls (#32397) commit 6ff1954bdbab3432807615c70849b181b1bef54b Author: Claire Date: Wed Oct 16 10:43:45 2024 +0200 Change Active Record Encryption variable check to check for emptiness (#32537) commit 6c87c76e1825a377ebb87fdfcf7f5c438c1be589 Author: Renaud Chaput Date: Wed Oct 16 10:33:11 2024 +0200 Add ability to group follow notifications in WebUI (#32520) commit acc1973f3ac554a06d9eefdcff71822cbe7ee927 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Oct 16 08:12:43 2024 +0000 New Crowdin Translations (automated) (#32533) Co-authored-by: GitHub Actions commit bfe3d49ccad3b15d3b62e9c5e574132af3155f39 Author: Matt Jankowski Date: Wed Oct 16 04:06:34 2024 -0400 Add `inline_jobs` to admin/reset spec (#32517) commit f8ba2122f84679b726050605f81c45b8de7380fa Author: Claire Date: Wed Oct 16 10:03:35 2024 +0200 Explicitly install ImageMagick in CI (except for libvips tests) (#32534) commit 5900c8c7fd3fb0f3a99f144f79d864fcdedeeca5 Author: Christian Winther Date: Wed Oct 16 09:44:28 2024 +0200 Run migration tests against postgres 16 and 17 as well (#32416) commit 25f8003d75515fb1c195c6f4ca2ea92a0d58163e Author: Claire Date: Wed Oct 16 09:30:53 2024 +0200 Fix only the first paragraph being displayed in some notifications (#32348) commit 7a7a7cc448514609a268a2c6bceca414783579ee Author: Renaud Chaput Date: Wed Oct 16 09:27:44 2024 +0200 Add back a 6 hours mute duration option (#32522) commit c40cd79c4d90ad0613616c59cc029ab83d55ee48 Author: Matt Jankowski Date: Tue Oct 15 10:27:46 2024 -0400 Convert `admin/invites` controller specs to system specs (#32450) commit 9e8f099d38029b74d46daa7edbadeaf7057aebfc Author: Matt Jankowski Date: Tue Oct 15 10:24:12 2024 -0400 Improve `app/policies` coverage (#32426) commit 28131b4b00e65826ac58a034d99b13123461940d Author: Matt Jankowski Date: Tue Oct 15 10:18:20 2024 -0400 Convert status embed controller to request spec (#32448) commit 52bc33115d1dc0c544244aa008cb0f2c356531d1 Author: Matt Jankowski Date: Tue Oct 15 10:14:17 2024 -0400 Add mention of encryption secrets to production sample (#32512) commit b78597979a71d4ce4296a96fffc1fb466c7d3c6b Author: Matt Jankowski Date: Tue Oct 15 10:12:54 2024 -0400 Fix missing content warning text in rss formatter (#32406) commit b742ce9d0961d9b992fce66ba4ecb3ff414c90c0 Author: Matt Jankowski Date: Tue Oct 15 09:58:45 2024 -0400 Reduce factory creation (17 -> 0) in `PlainTextFormatter` spec (#32487) commit 92c886045179f470dbba196e653d019acfdc899a Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 15 13:58:33 2024 +0000 Update babel monorepo to v7.25.8 (#32391) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0e58dc90d967746d551d360dd56cb0f533090253 Author: Matt Jankowski Date: Tue Oct 15 09:56:29 2024 -0400 Use array compact style for classes in `nothing_here` helper (#32403) commit e9b27852bea0472c9736f48604cba0ad46cc372a Author: Matt Jankowski Date: Tue Oct 15 09:51:52 2024 -0400 Reduce factory creation (14 -> 8) in `ActivityPub::Activity::Block` spec (#32488) commit 27f05e9016294f18c4aa2999288884cc6e42d735 Author: Matt Jankowski Date: Tue Oct 15 09:43:08 2024 -0400 Expand coverage for `User#token_for_app` (#32434) commit c772b41c36ed9adc5650f9ce18047104e5aae444 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 15 13:38:48 2024 +0000 Update dependency react-textarea-autosize to v8.5.4 (#32401) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c19397b94aed94340dd179f1b659b3e2b9205c10 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 15 15:38:02 2024 +0200 Update formatjs monorepo (#32304) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit bfb41e61a34ad7d1f245e69131332cdb5542af26 Author: Matt Jankowski Date: Tue Oct 15 09:30:17 2024 -0400 Expand coverage for `Block` model (#32480) commit 227d46883f59dbf3aeef7cbe63cf0909dc74c160 Author: Christian Schmidt Date: Tue Oct 15 14:26:20 2024 +0100 Translate to regional language variant (e.g. pt-BR) (#32428) commit 6a39212b0213072e7e77627165ac503887ae8a6b Author: Matt Jankowski Date: Tue Oct 15 09:18:57 2024 -0400 Reduce factories (36 > 12) in `AccountReachFinder` spec (#32482) commit 92bb19773a19ca7bae8687dd1b3606455db8a2ca Author: Matt Jankowski Date: Tue Oct 15 09:12:58 2024 -0400 Use `context` for repeated scenarios in `AccountStatusCleanupPolicy` spec (#32489) commit d1d2278e7007daac2dd658041ec29151fb09b0ed Author: Matt Jankowski Date: Tue Oct 15 09:10:29 2024 -0400 Reduce factory creation (73 -> 64) in `PublicFeed` spec (#32491) commit b1c10969ac2cfad52a6ee6dbcc34087f86cd87c6 Author: Matt Jankowski Date: Tue Oct 15 09:10:03 2024 -0400 Reduce factory creation (48 -> 8) in `AP::Note` serializer spec (#32492) commit a11b599fface2a4fcd39d3c54ec9ed0aa4b5c8f7 Author: Matt Jankowski Date: Tue Oct 15 09:09:25 2024 -0400 Expand coverage for `Scheduler::IpCleanupScheduler` worker (#32499) commit 0cc21f1dedf36111ac59842b1db5355d70c316e8 Author: Matt Jankowski Date: Tue Oct 15 08:54:56 2024 -0400 Reduce factory creation (132 -> 40) in lib/vacuum/* specs (#32498) commit d74c2c583a0bee57c042bf957ee864e17b53472a Author: Matt Jankowski Date: Tue Oct 15 08:48:10 2024 -0400 Extend spec coverage for `Poll` model (#32500) commit a1eb1a964277ce72a4063de1738ef4b6eda3a796 Author: Renaud Chaput Date: Tue Oct 15 13:49:15 2024 +0200 Update issue templates ot use the new GH Types, and add Troubleshooting template (#32484) Co-authored-by: Matt Jankowski commit 5afdb81b366ed423588e0a29c146539978180de0 Author: Jeong Arm Date: Tue Oct 15 06:01:21 2024 -0400 Fix reblog icons on account media view (#32506) commit 5e4cc1a39c86d75995dc0a86a021085adc3a8c63 Author: Claire Date: Tue Oct 15 11:38:04 2024 +0200 Fix follow recommendation carrousel scrolling on RTL layouts, for real (#32505) commit f2378aca4001198f60d52feb8d24a281a705a88a Author: kenkiku1021 Date: Tue Oct 15 18:28:07 2024 +0900 add SWIFT object storage uri to CSP media hosts (#32439) Co-authored-by: Claire commit 7d89cea0ea0fb25657864b3f442639de14966137 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Oct 15 09:26:28 2024 +0000 New Crowdin Translations (automated) (#32339) Co-authored-by: GitHub Actions commit 5ac64153d9921df6c0a751cb97fb666c6fe902af Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 15 09:16:29 2024 +0000 Update dependency pghero to v3.6.1 (#32502) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b5e8bc4dad663644a88e7bf78fa5365615a05736 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 15 09:16:14 2024 +0000 Update dependency strong_migrations to v2.0.1 (#32503) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 51345e5133a7f7b84044b9aeebdf99fd769ddf40 Author: Renaud Chaput Date: Tue Oct 15 11:15:25 2024 +0200 Fix back arrow pointing to the incorrect direction in RTL languages (#32485) commit 6d99f848a2b7b1b89ca165b5f6a69d1c04f9e469 Author: Emelia Smith Date: Tue Oct 15 09:40:18 2024 +0200 Fix: Use consistent REDIS_USER environment variable in streaming (#32493) commit 92771e5afb94ce72e6022dcbeb940c380bc0f88c Merge: 888e6a3439 ab50b2613e Author: Claire Date: Mon Oct 14 21:47:32 2024 +0200 Merge pull request #2884 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 7c10b0fb7a078661558fef86399d86831423260c commit ab50b2613e0faf19a3b68def947eb557db267102 Author: Claire Date: Mon Oct 14 17:25:32 2024 +0200 [Glitch] Fix follow recommendation carrousel scrolling on RTL layouts Port 7c10b0fb7a078661558fef86399d86831423260c to glitch-soc Signed-off-by: Claire commit 075eb3ed389e46241811be79c8399485291acc4a Author: Claire Date: Thu Oct 10 16:53:12 2024 +0200 [Glitch] Fix mute duration not being shown in list of muted accounts in web UI Port a295832960f3a782b928145279af335f956fff1f to glitch-soc Signed-off-by: Claire commit 71a6ced55cc13f7e23e53623b0fbf2c1871a2245 Author: Claire Date: Thu Oct 10 15:42:08 2024 +0200 [Glitch] Fix “Mark every notification as read” not updating the read marker if scrolled down Port e018e6321feb97609b18ac61d3349beb6de170b5 to glitch-soc Signed-off-by: Claire commit 9b3aaa96095c0f71ea93947c732917ce986c4592 Author: Claire Date: Thu Oct 10 13:04:38 2024 +0200 [Glitch] Fix “Mention” appearing for otherwise filtered posts Port f75eb1a8b0386d2ca5c1c05ee3b10364b3e11211 to glitch-soc Signed-off-by: Claire commit 1a9be3e0eb045352ce93ff6e7e11cc60202fc867 Author: Michael Stanclift Date: Wed Oct 9 14:33:28 2024 -0500 [Glitch] Restore list column border Port de4f7859b4cf5fc5254173368cf35f0d711331b6 to glitch-soc Signed-off-by: Claire commit 39723a4d9cdb321617b25290f09be99d6026641b Author: Claire Date: Wed Oct 9 19:24:22 2024 +0200 [Glitch] Fix list edition modal styling Port 45a520603b10792e24a2190215c0305c739108d0 to glitch-soc Signed-off-by: Claire commit 6cedbb4c5056818a2c1b6b618d987f46cebf50c8 Author: Matt Jankowski Date: Tue Oct 8 09:21:36 2024 -0400 [Glitch] Bring icon vertical middle to applications list style Port fa4a82326d4e33c63a76c6725c36e85fe3ae9310 to glitch-soc Signed-off-by: Claire commit 4d9b4ef72f4f655e7ec655d57c9c2d82a0bb2c84 Merge: 888e6a3439 7c10b0fb7a Author: Claire Date: Mon Oct 14 19:46:52 2024 +0200 Merge commit '7c10b0fb7a078661558fef86399d86831423260c' into glitch-soc/merge-upstream commit 7c10b0fb7a078661558fef86399d86831423260c Author: Claire Date: Mon Oct 14 17:25:32 2024 +0200 Fix follow recommendation carrousel scrolling on RTL layouts (#32462) commit ffa10323814b3ea0f15ac9cd2238164e42a873ad Author: Claire Date: Mon Oct 14 15:00:20 2024 +0200 Add further warnings about encryption secrets (#32476) commit cc70acc11cf488660ebd4a207633380e56cbf417 Author: Matt Jankowski Date: Mon Oct 14 08:52:47 2024 -0400 Augment coverage for `Status` model (#32468) commit d8eab3d81f1ab46026801d4698380110e25f7b44 Author: Matt Jankowski Date: Mon Oct 14 08:51:01 2024 -0400 Reinforce coverage for `DomainBlock` model (#32473) commit 2404d6d1a13d1e59f026c14403b89a328decabe3 Author: Florian Kohler <13822756+FlohEinstein@users.noreply.github.com> Date: Mon Oct 14 10:57:34 2024 +0200 Added Swiss German to languages dropdown (#29281) Co-authored-by: David Roetzel commit 06d6b35e884dbfa10ba7cb0069b5dd8c25c76399 Author: Matt Jankowski Date: Mon Oct 14 04:31:12 2024 -0400 Convert `admin/tags` controller specs to system specs (#32447) commit 2343ce4441c2304da1e20adcb7d9262d71890abd Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Oct 14 08:28:47 2024 +0000 Update dependency rack to v2.2.10 (#32455) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 555fb98cbb1f6e951d8ee0401bd95215ed8dd58c Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Oct 14 10:28:15 2024 +0200 Update dependency typescript to v5.6.3 (#32456) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 05bc82e1ab7fab0beae7dc300d2dd369faf0504a Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Oct 14 08:24:10 2024 +0000 Update dependency use-debounce to v10.0.4 (#32452) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e9eac648964b1c3cdbbc49022bdf44483dba6b34 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Oct 14 08:23:20 2024 +0000 Update devDependencies (non-major) (#32457) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit de422a37e8092768a6e8bef45479c43da8681d5d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Oct 14 10:22:46 2024 +0200 Update dependency fuzzysort to v3.1.0 (#32460) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b0dd38433beda1e72ed74e80b6523805fa0a9d56 Author: Claire Date: Mon Oct 14 10:18:25 2024 +0200 Fix follow recommendation suppressions not applying immediately (#32392) commit 888e6a3439ed1324a53d1085a2b293809c9e1eb6 Author: Claire Date: Fri Oct 11 17:45:07 2024 +0200 Fix setting to hide the quick filter bar (#2882) Fixes #2881 commit e15befebbd288faeec55ef6ad323d106f4ec57e1 Author: Claire Date: Fri Oct 11 16:16:37 2024 +0200 Add tag with commit hash to PR image builds (#32418) commit 10ea6da09ffc46a402800d22c81bad6dfa0beecb Author: Claire Date: Fri Oct 11 12:24:03 2024 +0200 Fix language of push notifications (#32415) commit bb0cf04d71783214aab0a65f410f76ba6989513c Author: Claire Date: Fri Oct 11 11:19:48 2024 +0200 Add note about not changing ActiveRecord encryption secrets once they are set (#32413) commit 6e96ec840d9fdf0ba83f48d8482b2bcdd573c08e Author: Claire Date: Thu Oct 10 19:31:51 2024 +0200 Fix the favicon notification badge not using the correct notification count (#2880) Fixes #2879 commit 22fd767425a02eb1b39d18a54053603772777b86 Author: Claire Date: Thu Oct 10 16:53:12 2024 +0200 Fix mute duration not being shown in list of muted accounts in web UI (#32388) commit 3b07fe1bba713fb10f5c873dccb38f6875180c77 Author: Claire Date: Thu Oct 10 15:42:08 2024 +0200 Fix “Mark every notification as read” not updating the read marker if scrolled down (#32385) commit 9350cd31d74486c0b6a523f497a353350792b955 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Oct 10 13:21:48 2024 +0000 Update dependency postcss-preset-env to v10.0.7 (#32389) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a5a3733c9772424c29735b2ae1542e270186d24c Author: Claire Date: Thu Oct 10 13:04:38 2024 +0200 Fix “Mention” appearing for otherwise filtered posts (#32356) commit cdf603239e8bc78b4f7c06e3df96da6e6d7c7a57 Author: Michael Stanclift Date: Wed Oct 9 14:33:28 2024 -0500 Restore list column border (#32367) commit d9fbb071da1904f3a4da90d055368f47b174224c Author: Claire Date: Wed Oct 9 19:29:02 2024 +0200 Fix notification requests from suspended accounts still being listed (#32354) commit 03dbebdfef47eda19b1b86e56004119f723e667e Author: Claire Date: Wed Oct 9 19:24:22 2024 +0200 Fix list edition modal styling (#32358) commit fda52b2a521af9b743d97ae35964ec6fc0e97879 Author: Claire Date: Wed Oct 9 19:16:57 2024 +0200 Fix 4 columns barely not fitting on 1920px screen (#32361) commit c574f5b53fd13d2668a3730f7d3257fdafca0220 Author: Claire Date: Wed Oct 9 18:36:19 2024 +0200 Change how migrations duplicated between glitch and upstream are handled (#2878) commit 6d6565eee720c961bfe1ef56f289f0b0a0c0fbb4 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Oct 9 16:24:24 2024 +0200 Update dependency express to v4.21.1 (#32336) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0d91db3d77b0376cd4e17cbdb62585dfa2847fbd Author: Claire Date: Wed Oct 9 14:13:32 2024 +0200 Fix `latest` tag for 4.3 docker image builds (#32350) commit 7033b3476e066bda836848da20b7caa96ebaa98d Author: Claire Date: Tue Oct 8 19:10:59 2024 +0200 Fix discrepancy with upstream regarding `latest` docker image tag (#2877) commit 258dce125668ccac45d6d0958da1c841ab7cfcee Author: Matt Jankowski Date: Tue Oct 8 10:59:51 2024 -0400 Add `OpenSSL::SSL::SSLError` to http connection errors wrapper (#32307) commit e8ec6667bd24028422abb68525db5b8f6a44c801 Author: Matt Jankowski Date: Tue Oct 8 09:53:35 2024 -0400 Extract wrapper constant for `HTTP::*` error classes (#32285) commit f49161ab1d57969b105bd115af8c827fc817db61 Author: Matt Jankowski Date: Tue Oct 8 09:30:54 2024 -0400 Oauth system spec cleanup / helper method extraction (#32287) commit 3cf2d35c4947cb8fb12cb33c22b2832f823cb3a4 Author: Matt Jankowski Date: Tue Oct 8 09:23:30 2024 -0400 Reference `IpBlock.severities` keys from CLI option check (#32291) commit d20a899bb90c78c2290a947e36f19fff6654ad47 Author: Matt Jankowski Date: Tue Oct 8 09:21:36 2024 -0400 Bring icon vertical middle to applications list style (#32293) commit 022c1ae6f2911db8c479e0b6b88cff1e3a79c47e Author: Matt Jankowski Date: Tue Oct 8 08:52:52 2024 -0400 Remove unused deprecator configuration (#32288) commit c3a38c7d8c123f5bf736e20e0417fb3d70022391 Author: Claire Date: Tue Oct 8 14:24:59 2024 +0200 Update changelog and security policy (#32300) commit d04e2e910486398d48b0128cad16dc8c80fbcefd Merge: fd75087534 1de6d511f4 Author: Claire Date: Tue Oct 8 13:42:11 2024 +0200 Merge pull request #2874 from ClearlyClaire/glitch-soc/fixes/crowdin-download-stable-glitch Fix download of stable translation files in glitch-soc commit 1de6d511f44c432f0f1954ea0c7153e80be9729b Author: Claire Date: Tue Oct 8 13:41:11 2024 +0200 Fix download of stable translation files in glitch-soc commit ff3e2c9cfa857b5091a9119337728bf972763856 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Oct 8 08:10:39 2024 +0000 New Crowdin Translations (automated) (#32295) Co-authored-by: GitHub Actions commit 562105c69a9166d3a7f8eb09f2221e3571697ba0 Author: Claire Date: Tue Oct 8 10:00:05 2024 +0200 Fix source strings being uploaded to crowdin in merge groups (#32298) commit c60d4ecc82ce3dd2f2a00eaccf5231f03f24c31d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 8 09:38:43 2024 +0200 Update dependency @reduxjs/toolkit to v2.2.8 (#32296) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0c163659913f1d9d02cd8b5e45913846f2039c96 Author: Jake Anto <64896514+jake-anto@users.noreply.github.com> Date: Tue Oct 8 02:03:14 2024 +0530 Prefer native apps over PWA (#27254) commit fd750875342e1ee1d5a64eda1f555ce3f4153745 Merge: 6967031144 ee17081793 Author: Claire Date: Mon Oct 7 21:25:06 2024 +0200 Merge pull request #2872 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 4238da6ee3c93dfd5752e9133cbec958f8ebb18a commit ee170817935ba62fd2689ff655066d6cdd95516b Author: Eugen Rochko Date: Mon Oct 7 11:35:42 2024 +0200 [Glitch] Fix missing avatar fallback interfering with transparency in web UI Port cae93e79a406a1156b51091784e35f8f0126ea12 to glitch-soc Signed-off-by: Claire commit 9ca99b7dc1ad1eccaea0da220fb0499f0cfd7069 Author: Eugen Rochko Date: Mon Oct 7 08:53:29 2024 +0200 [Glitch] Fix wrong width on logo in detailed link card in web UI Port 889edc560ae94b0663bab0e4cdb7cbad7e3cc6f8 to glitch-soc Signed-off-by: Claire commit 7e06d724c944c683d77fc7407b0ededcf94ca937 Merge: 6967031144 4238da6ee3 Author: Claire Date: Mon Oct 7 20:45:07 2024 +0200 Merge commit '4238da6ee3c93dfd5752e9133cbec958f8ebb18a' into glitch-soc/merge-upstream commit 4238da6ee3c93dfd5752e9133cbec958f8ebb18a Author: Leni Kadali <52788034+lenikadali@users.noreply.github.com> Date: Mon Oct 7 15:05:46 2024 +0300 Add error message when user tries to follow their own account (#31910) commit bfabd6a2b882c4eca186e8fe47ce98a47f74662f Author: Matt Jankowski Date: Mon Oct 7 08:02:04 2024 -0400 Move account suspension-related methods to concern (#28351) commit 1f5bd571cd26ddb44228b8e6a9498e765037e639 Author: Eugen Rochko Date: Mon Oct 7 11:35:42 2024 +0200 Fix missing avatar fallback interfering with transparency in web UI (#32270) commit a59160cf01142a49a15b3237d76a19dcfd9de100 Author: Claire Date: Mon Oct 7 09:46:03 2024 +0200 Add missing `on_delete: :cascade` on `notification_permissions` (#32281) commit 0ce2db4f7d3dad317803a41d33409dd83165bfc6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Oct 7 09:07:07 2024 +0200 Update dependency postcss-preset-env to v10.0.6 (#32260) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 498024558ae8d4111b4c263901dfc105b3563ddc Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Oct 7 09:06:43 2024 +0200 New Crowdin Translations (automated) (#32262) Co-authored-by: GitHub Actions commit 2c54b91dd1a0f0a622ea88628d15c8b1bdda70f7 Author: Eugen Rochko Date: Mon Oct 7 08:53:29 2024 +0200 Fix wrong width on logo in detailed link card in web UI (#32271) commit 6967031144c4890ea423154eeeb1d33c2e728540 Author: Claire Date: Sun Oct 6 18:34:55 2024 +0200 Fix video player's height in detailed status view commit bbc7be1d95d0786f4197f46da560678da3dfe351 Merge: 88756ab75f c37daa11f2 Author: Claire Date: Sun Oct 6 19:18:59 2024 +0200 Merge pull request #2867 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to c40ab43dc703be988c277d4ba6b7987a3a80e16c commit c37daa11f2b1844a0726f6be580d72781f6b0828 Author: Christian Schmidt Date: Fri Oct 4 18:23:05 2024 +0200 [Glitch] Remove redundant title attribute Port c40ab43dc703be988c277d4ba6b7987a3a80e16c to glitch-soc Signed-off-by: Claire commit 7b40f14452be3a15c9172c776f650eb8e3ef9079 Author: Claire Date: Fri Oct 4 16:55:44 2024 +0200 [Glitch] Fix media gallery items having incorrect borders when hidden Port 51769e06708f79a485c444d139cbdbdd7249b0cb to glitch-soc Signed-off-by: Claire commit c720623dc76f435a79c5470f3c7f2b7bce7bb5a4 Author: Claire Date: Fri Oct 4 14:23:30 2024 +0200 [Glitch] Fix unsupported grouped notifications from streaming causing duplicate IDs Port 77f5b127fadc02ba84fd1d5deccc7b70e68aba59 to glitch-soc Signed-off-by: Claire commit 819abbdb2fccfa522e8fafefb6fbdfc6ac7e1c85 Author: forsamori Date: Fri Oct 4 09:02:14 2024 +0100 [Glitch] Add margin-bottom to error.dialog to reduce whitespace Port 63a959099b854af62b88d6097895d5a7c1443cb3 to glitch-soc Co-authored-by: Claire Signed-off-by: Claire commit b22272fcdce24b26a6cd5c422e8a838b058ab717 Author: Claire Date: Wed Oct 2 17:51:05 2024 +0200 [Glitch] Hide badges in media gallery when media are hidden Port f768a6eb16880f4e584db530e4106be9b9dcf206 to glitch-soc Signed-off-by: Claire commit 299372babef8831b01576f482a940b4717b36031 Author: Claire Date: Wed Oct 2 15:29:23 2024 +0200 [Glitch] Fix editing description of media uploads with custom thumbnails Port f760899b04ef5647d8688e9f1f08094fb3cf5894 to glitch-soc Signed-off-by: Claire commit 54b209243b0fe372ab21a527df2e920a6afe2784 Author: Claire Date: Wed Oct 2 15:28:36 2024 +0200 [Glitch] Fix media uploads in composer appearing over search results in advanced interface Port b5006539c995cbefda04db25888ffe5bb5995d3f to glitch-soc Signed-off-by: Claire commit ce3bedade30342daed6ef8d3c31abceecc8615bd Author: Claire Date: Wed Oct 2 12:03:04 2024 +0200 [Glitch] Fix incorrect `'navigator'` check Port 4a737a948a6aa8803ba366374569a93970437ec7 to glitch-soc Signed-off-by: Claire commit 61a0c58dee383bf79a3b6ff6c08f82a34710d8dd Author: Nick Schonning Date: Tue Oct 1 12:26:30 2024 -0400 [Glitch] Enable ESLlint no-case-declarations Port f91f077985eccf9933346052ce4ee532215099c6 to glitch-soc Signed-off-by: Claire commit af39ac6edc00e4e27f94ddd85fac6502fb386022 Author: Matt Jankowski Date: Tue Oct 1 09:41:25 2024 -0400 [Glitch] Adjust spacing on setting sub-nav items when below mobile size Port f10d61bf86559bc1464b2e7972b8980ae789908d Signed-off-by: Claire commit edfa716a18f133743adabc829f4cfdbe9a255bb0 Author: Matt Jankowski Date: Tue Oct 1 05:08:29 2024 -0400 [Glitch] Improve alignment of icons on admin roles list Port f811fcb2b2749d1e7a30ee7558ddff9d01e86e70 to glitch-soc Signed-off-by: Claire commit 8572fa14526b9f28600ec7694000fb2f05200be0 Author: Renaud Chaput Date: Tue Oct 1 10:22:14 2024 +0200 [Glitch] Fix follow notifications from streaming being grouped Port 1be55ce24418ea149a9ca0def237a76f4c6501af to glitch-soc Signed-off-by: Claire commit b28ce2424ce3bd3326dcadb859ad37594160d5b1 Merge: 88756ab75f c40ab43dc7 Author: Claire Date: Sun Oct 6 16:07:58 2024 +0200 Merge commit 'c40ab43dc703be988c277d4ba6b7987a3a80e16c' into glitch-soc/merge-upstream Conflicts: - `app/helpers/application_helper.rb`: Upstream added a helper where glitch-soc had its own, not really a conflict. Added upstream's helper. - `lib/sanitize_ext/sanitize_config.rb`: Upstream renamed a constant that was used slightly differently in glitch-soc. Renamed it as upstream did. commit c40ab43dc703be988c277d4ba6b7987a3a80e16c Author: Christian Schmidt Date: Fri Oct 4 18:23:05 2024 +0200 Remove redundant title attribute (#32258) commit 51769e06708f79a485c444d139cbdbdd7249b0cb Author: Claire Date: Fri Oct 4 16:55:44 2024 +0200 Fix media gallery items having incorrect borders when hidden (#32257) commit 1f720366e94c175f171156a86d65787d6f0d7ba6 Author: Claire Date: Fri Oct 4 16:29:23 2024 +0200 Fix notification push notifications not including the author's username (#32254) commit ebdeac0731c31b73438aaa369a234d9ac5798b43 Author: Matt Jankowski Date: Fri Oct 4 10:15:14 2024 -0400 Add coverage for missing status scenario in NotificationMailer (#32256) commit e4e07b1c34858dc6b7070f1b5d81f40ec63ebf4c Author: Matt Jankowski Date: Fri Oct 4 10:11:15 2024 -0400 Reduce factory usage across `spec/services` area (#32098) commit 4fe7f213a64e22a2912f13a8e5d6ac415125b0a1 Author: Matt Jankowski Date: Fri Oct 4 08:29:43 2024 -0400 Use `async_count` in more view locations (#32086) commit 77f5b127fadc02ba84fd1d5deccc7b70e68aba59 Author: Claire Date: Fri Oct 4 14:23:30 2024 +0200 Fix unsupported grouped notifications from streaming causing duplicate IDs (#32243) commit 463f9197d822e3b040834b4dab1c5334c7c8b968 Author: Matt Jankowski Date: Fri Oct 4 08:21:55 2024 -0400 Add regression coverage for admin reports resolution button within form (#32248) commit 49407e7623c52dd9e6e21bcb7a014cb116e081d3 Author: Claire Date: Fri Oct 4 10:50:36 2024 +0200 Fix Content-Security-Policy when using sso-redirect (#32241) commit cf28104317642d647d77efe872bdabe3ea0c0624 Author: Matt Jankowski Date: Fri Oct 4 04:30:08 2024 -0400 Rename preloaded models constant in cli media (#30531) commit 82e7d53d54143ca69c7b0a0cebacee3f3ddd7b3c Author: Matt Jankowski Date: Fri Oct 4 04:29:23 2024 -0400 Rename transformer constant in sanitizer (#30532) commit 160917e71814168ce3aac776907dbe23a8c1c178 Author: gunchleoc Date: Fri Oct 4 09:19:01 2024 +0100 Pluralize csv imports (#27094) Co-authored-by: Claire commit 63a959099b854af62b88d6097895d5a7c1443cb3 Author: forsamori Date: Fri Oct 4 09:02:14 2024 +0100 Add margin-bottom to error.dialog to reduce whitespace (#25708) Co-authored-by: Claire commit 12a8ac1f8514f002a9d2c830e8981fde80b1cba9 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Oct 4 09:57:41 2024 +0200 Update dependency node to 20.18 (#32244) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 1b247a1dc21bbaf20bd03be073f65e8dfc286dba Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Oct 4 09:29:53 2024 +0200 New Crowdin Translations (automated) (#32249) Co-authored-by: GitHub Actions commit aba888c4a6c3be008bb708c0871f145cb0356052 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Oct 4 09:18:38 2024 +0200 Update dependency ffmpeg to v7.1 (#32239) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4c0e44ebbe244b32117ef0e2624ca3e7087c34ad Author: Claire Date: Thu Oct 3 18:12:15 2024 +0200 Fix recently-broken admin interface buttons (#32240) commit cc8d723e7111b7e2e3d6685e0632c38813d27df0 Author: Matt Jankowski Date: Thu Oct 3 09:10:27 2024 -0400 Register an XML encoder for response tests (#32220) commit d95f6f4410c28b2f7b9f736c9477936587bd700b Author: Matt Jankowski Date: Thu Oct 3 09:09:58 2024 -0400 Extract `ExportSummary` class for account object counts (#32227) commit 52afa94f1c277f7387c5bb3d1eb85fb555126a2a Author: Matt Jankowski Date: Thu Oct 3 08:13:54 2024 -0400 Use `print_table` to wrap storage output CLI (#32230) commit 1db91ab8d9b26ba0103bdc51bc9c79411a3cf6dd Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Oct 3 11:34:04 2024 +0200 Update dependency typescript to v5.6.2 (#32165) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit fe3f5375e3c0a2f138558947db69267813c0e726 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Oct 3 11:15:31 2024 +0200 New Crowdin Translations (automated) (#32233) Co-authored-by: GitHub Actions commit d96351a87d7078e8d6a07486d7d30e4a7956745d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Oct 3 09:05:11 2024 +0000 Update babel monorepo to v7.25.7 (#32225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0be1d332f28ca31e734954d7b8d73b41d60f485f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Oct 3 11:04:33 2024 +0200 Update dependency aws-sdk-s3 to v1.167.0 (#32231) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 6ef510fe3f4a08908df223d33d2788f851d0cb52 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Oct 3 11:04:12 2024 +0200 Update dependency json-schema to v5.0.1 (#32234) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f768a6eb16880f4e584db530e4106be9b9dcf206 Author: Claire Date: Wed Oct 2 17:51:05 2024 +0200 Hide badges in media gallery when media are hidden (#32224) commit cec89613720c23cb18d566ae05a6f69ac52d115e Author: Matt Jankowski Date: Wed Oct 2 10:47:00 2024 -0400 Move admin action log type list generation to helper (#32178) commit 7d6b9ccd34fd10cce33114ac13201905222a807e Author: Matt Jankowski Date: Wed Oct 2 10:45:54 2024 -0400 Add `copyable_input` helper method to wrap shared options (#32119) commit 36f9c96812c313c5f782a702df221ad4b57da0f3 Author: Matt Jankowski Date: Wed Oct 2 10:45:12 2024 -0400 Clean up labels on development application form (#32116) commit b7bb850efd485466d4424f4744c1795541ca592f Author: Matt Jankowski Date: Wed Oct 2 09:56:26 2024 -0400 Enable hostname config for all system specs (#32109) commit f760899b04ef5647d8688e9f1f08094fb3cf5894 Author: Claire Date: Wed Oct 2 15:29:23 2024 +0200 Fix editing description of media uploads with custom thumbnails (#32221) commit b5006539c995cbefda04db25888ffe5bb5995d3f Author: Claire Date: Wed Oct 2 15:28:36 2024 +0200 Fix media uploads in composer appearing over search results in advanced interface (#32217) commit d270d6dd4fce6dd15107ee1fe9b7877a5fca02d9 Author: Matt Jankowski Date: Wed Oct 2 09:26:46 2024 -0400 Provide `use_path` to qr generator for svg data size reduction (#32127) commit 2151dfb8d687f08438fc76d8fdf670a473d6a1e8 Author: Matt Jankowski Date: Wed Oct 2 09:24:40 2024 -0400 Add `relevant_params` to ReportFilter (matches account filter) (#32136) commit cf859d151b494a0786c07167f26dc52d0cfd407f Author: Matt Jankowski Date: Wed Oct 2 09:08:40 2024 -0400 More link/button conversion across views (#32199) commit 1f65a95421a4dcbe44e25bd9e36329830a396eef Author: Matt Jankowski Date: Wed Oct 2 08:26:16 2024 -0400 Remove unneeded `reorder(nil)` conditions (#32200) commit 4aa26eba53a0c6c5e305f0de9367ea54c83f86db Author: Matt Jankowski Date: Wed Oct 2 07:11:52 2024 -0400 Extract `WebPushRequest` from push notification worker and subscription (#32208) commit 4a737a948a6aa8803ba366374569a93970437ec7 Author: Claire Date: Wed Oct 2 12:03:04 2024 +0200 Fix incorrect `'navigator'` check (#32219) commit ebab3b80c7e8abb7e29d1ab912427e52d89faa1c Author: Matt Jankowski Date: Wed Oct 2 05:43:04 2024 -0400 Expand coverage for `Export` utility class (#32212) commit 33d3ca7cf19b5ae6e90163092d63d4a49fe45d4b Author: Christian Schmidt Date: Wed Oct 2 11:23:44 2024 +0200 Support /.well-known/host-meta.json (#32206) commit f0716368e642c4c3d21d2327009ddd59d27cec8b Author: Matt Jankowski Date: Wed Oct 2 05:07:52 2024 -0400 Update simplecov-html to version 0.13.1 (#32205) commit ea72d5ec3a2eda181baa6846a67aec9b8b4b0142 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Oct 2 09:05:57 2024 +0000 New Crowdin Translations (automated) (#32214) Co-authored-by: GitHub Actions commit 66b2bc1c841d6ad59fe4961ff9f0075fa3e52d50 Author: Jeong Arm Date: Wed Oct 2 17:08:02 2024 +0900 Ignore error if mentioned account was not processable (#29215) Co-authored-by: Claire commit f91f077985eccf9933346052ce4ee532215099c6 Author: Nick Schonning Date: Tue Oct 1 12:26:30 2024 -0400 Enable ESLlint no-case-declarations (#30768) commit a2c4ba20010a1fabca65ff6353e1b0fbea3b5f6d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 17:10:56 2024 +0200 Update dependency rubocop-rspec to v3.1.0 (#32202) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4cae309f6a1835dcff6b85ac31b046092e2985a1 Author: Matt Jankowski Date: Tue Oct 1 09:56:43 2024 -0400 Fix `Rails/CreateTableWithTimestamps` cop (#30836) commit 65508bb0c07bab4760576a9c59cacb43cf7d1301 Author: Jeong Arm Date: Tue Oct 1 22:54:28 2024 +0900 Show timestamp when the user deletes their account on admin dashboard (#25640) Co-authored-by: Claire commit df98cf71e30063ece4022ae4a8a73c21dfea5f74 Author: Matt Jankowski Date: Tue Oct 1 09:50:20 2024 -0400 Avoid repeated icon stack in settings sidebar (#32201) commit f10d61bf86559bc1464b2e7972b8980ae789908d Author: Matt Jankowski Date: Tue Oct 1 09:41:25 2024 -0400 Adjust spacing on setting sub-nav items when below mobile size (#32137) commit f73787a4b84eb23ccad9d425b52aa09e1c26e18c Author: Matt Jankowski Date: Tue Oct 1 09:38:29 2024 -0400 Fix broken border on applications list (#32147) commit 7b92cf3b4771b42ff3895f247c006679e9a11ff6 Author: Claire Date: Tue Oct 1 14:52:13 2024 +0200 Fix unneeded requests to blocked domains when receiving relayed signed activities from them (#31161) commit c5f0da98e43134d5922ea76dc89db292cd3531e8 Author: Emelia Smith Date: Tue Oct 1 14:49:04 2024 +0200 Add detection and download of material_symbol icons in config/navigation.rb (#31366) commit 44071fdbae14d12bcd2c64bdc0d4162aca9de486 Author: Matt Jankowski Date: Tue Oct 1 08:45:58 2024 -0400 Wrap datetime in `time` element with attrs (#32177) commit ec16ed37c39a79ae23d5b4d759f571b0fa66506b Author: Matt Jankowski Date: Tue Oct 1 07:36:25 2024 -0400 Extract constants for header and avatar geometry (#32151) commit c0095079128d04974a10821e04e046ec27fa6a3f Author: Matt Jankowski Date: Tue Oct 1 07:14:12 2024 -0400 Use `button_to` for `method: :post` links on account show page (#32154) commit 651846c62227917729492ff9d6fc4161ea8d86c5 Author: Matt Jankowski Date: Tue Oct 1 07:03:13 2024 -0400 Only show email domain blocks MX table when some found (#32155) commit 4b4bf82ea99a5d4f223556e92d97a04dbfa45297 Author: Matt Jankowski Date: Tue Oct 1 06:48:27 2024 -0400 Fix nav item active highlight for some paths (#32159) commit 489abb817358bd27417ce464d144bafb5ae191fb Author: Matt Jankowski Date: Tue Oct 1 06:35:40 2024 -0400 Remove explicit `put` action in prefs forms (#32175) commit 7e35bef97efc5b5c107434d0157326427b79660a Author: Matt Jankowski Date: Tue Oct 1 06:34:05 2024 -0400 Remove explicit `put` action in settings forms (#32176) commit 8ae381fd042aa7dbcc546c13ccb158ccd8b01ff3 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 10:04:12 2024 +0000 Update dependency postcss-preset-env to v10.0.5 (#32019) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit efd3f59627a2786b5601ef6a5c484ec96a777ae5 Author: Matt Jankowski Date: Tue Oct 1 06:02:58 2024 -0400 Use `module: :users` in routes/admin section (#30767) commit 454d21ab5ad87def97e712bc53e8e8ef50a5c678 Author: Emelia Smith Date: Tue Oct 1 11:56:58 2024 +0200 Remove OAuth Password Grant Type support (#30960) commit e975b55c24f420316b14d5dc02b2eab3fbba4d6e Author: Matt Jankowski Date: Tue Oct 1 05:54:42 2024 -0400 Remove `WebfingerHelper` module & move usage inline (#31203) commit e6cda8388c0eae4dee82437538544563b04e7f24 Author: David Roetzel Date: Tue Oct 1 11:38:42 2024 +0200 Move OTP secret length to configuration (#32125) commit 0b89765e9a9154c5f904b602ae5aaa0966880818 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 09:30:54 2024 +0000 Update RuboCop (non-major) to v1.22.1 (#31573) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f251edfc1daffecb30914d1f48e6919710c61b12 Author: Matt Jankowski Date: Tue Oct 1 05:30:21 2024 -0400 Add `date_range` view helper (#32187) commit 7a653001b42d07eb82858801b5c5b00d71fefa12 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 11:30:09 2024 +0200 Update dependency haml_lint to v0.59.0 (#32146) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b7ddf45924c35dc8d5ecc8f4ab3c611da9d70d94 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 11:29:38 2024 +0200 Update docker/dockerfile Docker tag to v1.10 (#32166) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3d943f03fd5264ec5f8c636f4fde18867a4e22c3 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 11:13:33 2024 +0200 Update dependency webmock to v3.24.0 (#32190) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2829f72d1668ec2cda5f07137f0e69c7abd37274 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 11:13:29 2024 +0200 Update dependency propshaft to v1.1.0 (#32192) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f811fcb2b2749d1e7a30ee7558ddff9d01e86e70 Author: Matt Jankowski Date: Tue Oct 1 05:08:29 2024 -0400 Improve alignment of icons on admin roles list (#32153) commit 675d3ea5c11d78821d505b8ea8debe6355dee2df Author: Matt Jankowski Date: Tue Oct 1 04:36:41 2024 -0400 Extract dashboard partial for admin instance page (#32189) commit 497e8d00b9644bed65c3085b5cc1ca3139eebd58 Author: Renaud Chaput Date: Tue Oct 1 10:36:22 2024 +0200 Bump `main` version 4.4.0-alpha.1 (#32180) commit d9973f3b705d62db2305420af9b51b4a75c14332 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Oct 1 08:28:50 2024 +0000 Update peter-evans/create-pull-request action to v7.0.5 (#32164) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 685067efd148e28cc7c158705ac1fa1199daeeda Author: Matt Jankowski Date: Tue Oct 1 04:23:05 2024 -0400 Avoid `id` duplication conflict with main navigation from settings profile link (#32181) commit 1be55ce24418ea149a9ca0def237a76f4c6501af Author: Renaud Chaput Date: Tue Oct 1 10:22:14 2024 +0200 Fix follow notifications from streaming being grouped (#32179) commit 5839ee434ba8510f9eb50804ee4530dacf146e97 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Oct 1 08:21:17 2024 +0000 New Crowdin Translations (automated) (#32195) Co-authored-by: GitHub Actions commit 0b6d217b9e0c51cd4132f8e7d24c8df4b9f02f20 Author: Matt Jankowski Date: Tue Oct 1 04:19:53 2024 -0400 Use account display name for pretend blog example in attribution area (#32188) commit 07cd1fd1efe0c47e4738189297a484cc2662aebf Author: Claire Date: Mon Sep 30 19:32:23 2024 +0200 Support translation branches in Crowdin (#32174) commit 88756ab75fc06a0354098f659ce2414aa5faf17c Merge: 9bf624b44d 9af9ef6fb3 Author: Claire Date: Mon Sep 30 13:30:14 2024 +0200 Merge pull request #2861 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 03210085b7481568cc507f088144aaf1dae73c88 commit 9af9ef6fb3287e2ac119acf1148974d2003e195e Merge: 9bf624b44d 03210085b7 Author: Claire Date: Mon Sep 30 13:04:19 2024 +0200 Merge commit '03210085b7481568cc507f088144aaf1dae73c88' into glitch-soc/merge-upstream commit 03210085b7481568cc507f088144aaf1dae73c88 Author: Claire Date: Mon Sep 30 12:42:59 2024 +0200 Bump version to 4.3.0-rc.1 (#32124) commit 0c872beed4a49ca879e5899ddd96f51c69c68cb8 Author: Claire Date: Mon Sep 30 12:25:54 2024 +0200 Merge commit from fork This should not change the set of words matched by `USERNAME_RE` but does change the one matched by `MENTION_RE`. Indeed, the previous regexp allowed a domain part to start with `.` or `-`, which the new regexp does not allow. commit e22eff890003481977ee0bcecee12c3d40aededb Author: Claire Date: Mon Sep 30 11:41:06 2024 +0200 Remove regexp timeout feature (#32169) commit 431b3825639ea4087338fcd77ac1adb342b0ef4e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 30 08:55:18 2024 +0000 Update dependency sass to v1.79.4 (#32139) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit bf7cfba48e03bf482bbdae1d92378c8cebf0702e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 30 08:53:52 2024 +0000 Update DefinitelyTyped types (non-major) (#32163) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f477dc399e9edf9b02c2033724a6a57679c7b286 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Sep 30 08:53:29 2024 +0000 New Crowdin Translations (automated) (#32140) Co-authored-by: GitHub Actions commit 6037714f76910dbc15f99cbf3ab97e5d3d5006d7 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 30 10:47:57 2024 +0200 Update dependency propshaft to v1.0.1 (#32158) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c352ce6f4550a8bea554448fd48ca657bbdc50c2 Author: Eugen Rochko Date: Mon Sep 30 10:20:20 2024 +0200 Fix missing permission on new embeds making them unclickable (#32135) commit 9bf624b44ddc4ae59f2c9b7c24dc4449a8797345 Merge: 437cecc965 e80971e660 Author: Claire Date: Sun Sep 29 20:36:32 2024 +0200 Merge pull request #2860 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 9d664f87a04b6a5157ddbe60ee33b5b7a960198e commit e80971e660945b08a4f34ab83ba97fcf2dfcfcdb Author: Eugen Rochko Date: Fri Sep 27 17:09:39 2024 +0200 [Glitch] Change media reordering design in the compose form in web UI Port 11a12e56b3480ac03921e831a7ccfcc7ade24b52 to glitch-soc Signed-off-by: Claire commit 9e10fd59b73eb98ab35eed8a27679cb5e6d6fac0 Author: Eugen Rochko Date: Thu Sep 26 15:26:49 2024 +0200 [Glitch] Add ability to view alt text by clicking the ALT badge in web UI Port a04433f995099854c06fbc7d02245a7d2a3677c0 to glitch-soc Signed-off-by: Claire commit 9b5f073cb31e4fe45944a5b535304ee7fdf57a13 Author: Eugen Rochko Date: Thu Sep 26 14:31:32 2024 +0200 [Glitch] Change design of media tab on profiles in web UI Port 89df27a06c69818d38621c1147c6724d76beefde to glitch-soc Signed-off-by: Claire commit 157ecf255bdb1ae3290d67175e80f2632205c558 Author: Eugen Rochko Date: Wed Sep 25 18:36:19 2024 +0200 [Glitch] Change responsive break points on navigation panel in web UI Port 28c4eca0af696ff039b90b8af57aa818df442edf to glitch-soc Signed-off-by: Claire commit b8c23f94b09e604acba1a8933450c5368836e8b6 Author: Matt Jankowski Date: Fri Sep 27 15:38:44 2024 -0400 [Glitch] Add `no-toolbar` state for "nothing here" batch table views Port 24d3ce7bab2becc345152a143224924044ebe33c to glitch-soc Signed-off-by: Claire commit 3fa34bd73a24ea855c9989ad2cb3a48c6b86b400 Author: Matt Jankowski Date: Thu Sep 26 15:26:40 2024 -0400 [Glitch] Use 1 column layout for form `ul` on narrow widths Port 106b22bd2dc2fca8561d36f849c80dd4a918ca2e to glitch-soc Signed-off-by: Claire commit 77d2f7eef6facb71832dd97906d94791b0401386 Author: Claire Date: Thu Sep 26 16:26:04 2024 +0200 [Glitch] Fix scrollbar width Port 89c39e7826bee92ebc537babfc4061bd4d98c8ba to glitch-soc Signed-off-by: Claire commit 8439084587fa86e5cb4b86a41cb232350ceec668 Author: Claire Date: Thu Sep 26 14:47:56 2024 +0200 [Glitch] Add fallback to domain block confirmation modal Port 7a62d57427f925f3e7de4444cb25c5c190425161 to glitch-soc Signed-off-by: Claire commit 7b290cee47dec7cbe734e4363b866f7c1fa8e338 Author: Eugen Rochko Date: Wed Sep 25 20:13:36 2024 +0200 [Glitch] Add preview of followers removed in domain block modal in web UI Port 3426ea2912d1cd69ebdfa4e43a119dc6e7374c49 to glitch-soc Signed-off-by: Claire commit 7ef25ae53bcca9ee6b59b163c2009b85f3be41df Merge: 437cecc965 9d664f87a0 Author: Claire Date: Sun Sep 29 11:06:09 2024 +0200 Merge commit '9d664f87a04b6a5157ddbe60ee33b5b7a960198e' into glitch-soc/merge-upstream commit 9d664f87a04b6a5157ddbe60ee33b5b7a960198e Author: Christian Schmidt Date: Fri Sep 27 21:41:41 2024 +0200 Mailer layout fixes (#32132) commit 24d3ce7bab2becc345152a143224924044ebe33c Author: Matt Jankowski Date: Fri Sep 27 15:38:44 2024 -0400 Add `no-toolbar` state for "nothing here" batch table views (#32128) commit 11a12e56b3480ac03921e831a7ccfcc7ade24b52 Author: Eugen Rochko Date: Fri Sep 27 17:09:39 2024 +0200 Change media reordering design in the compose form in web UI (#32093) commit cdd7526531f3b2f2fa39497ce2d89002b4f428e3 Author: Matt Jankowski Date: Fri Sep 27 04:22:40 2024 -0400 Remove completed TODO note in tags request spec (#32108) commit e02e88bff4ad5f5acd017fa340f745b87f430a46 Author: Matt Jankowski Date: Fri Sep 27 04:21:27 2024 -0400 Use previously extracted model constants in form `maxlength` attributes (#32113) commit 04dd3a9eb6f28eb6387dd480b0556e5f7aba772b Author: Matt Jankowski Date: Fri Sep 27 04:20:21 2024 -0400 Wrap webhook event label with `samp` tag (#32115) commit 675ec1a0adf9b179c9b5fe407f7926c94266dd69 Author: Matt Jankowski Date: Fri Sep 27 04:18:42 2024 -0400 Only show recently used tags hint when they are present (#32120) commit c9b069996456fb79d41dd37d986673a07cef5187 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Sep 27 09:34:46 2024 +0200 New Crowdin Translations (automated) (#32121) Co-authored-by: GitHub Actions commit 513f187dafd8ff441479a6de12c61f8bb8d4c5bf Author: Claire Date: Thu Sep 26 21:27:57 2024 +0200 Add “A Mastodon update is available.” message on admin dashboard for non-bugfix updates (#32106) commit ee2d966080b4e293d07acedf9385786a939432c6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 26 21:27:13 2024 +0200 Update dependency blurhash to v0.1.8 (#32114) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 106b22bd2dc2fca8561d36f849c80dd4a918ca2e Author: Matt Jankowski Date: Thu Sep 26 15:26:40 2024 -0400 Use 1 column layout for form `ul` on narrow widths (#32112) commit 89c39e7826bee92ebc537babfc4061bd4d98c8ba Author: Claire Date: Thu Sep 26 16:26:04 2024 +0200 Fix scrollbar width (#32091) commit a04433f995099854c06fbc7d02245a7d2a3677c0 Author: Eugen Rochko Date: Thu Sep 26 15:26:49 2024 +0200 Add ability to view alt text by clicking the ALT badge in web UI (#32058) commit 7a62d57427f925f3e7de4444cb25c5c190425161 Author: Claire Date: Thu Sep 26 14:47:56 2024 +0200 Add fallback to domain block confirmation modal (#32105) commit 89df27a06c69818d38621c1147c6724d76beefde Author: Eugen Rochko Date: Thu Sep 26 14:31:32 2024 +0200 Change design of media tab on profiles in web UI (#31967) commit 00aaf77e04ce3aeadd976b4e1726c49794b3ea89 Author: Christian Schmidt Date: Thu Sep 26 13:48:01 2024 +0200 Use same styling for statuses in email as on web (#32073) commit 437cecc9654ec0ae0533a6fc118005cf267cb1fa Author: Claire Date: Thu Sep 26 12:02:40 2024 +0200 Fix awkward status action bar layout changes (#2859) commit db57fe80c8a4fcac2b0fb857c7eb959cbf82a2e0 Author: Matt Jankowski Date: Thu Sep 26 04:54:01 2024 -0400 Remove `page_json` var from ap/replies spec (#32000) commit 278a075b22204b72e7acb43266388c81aedfc402 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Sep 26 10:47:38 2024 +0200 New Crowdin Translations (automated) (#32103) Co-authored-by: GitHub Actions commit 886baa5e3543a983b82a9efd15b9e41f7f38227d Author: Claire Date: Thu Sep 26 09:40:59 2024 +0200 Fix typo causing incorrect error being raised in blurhash processing failure (#32104) commit db332553c96152302223e6c8c5df61832fab7a08 Author: Christian Schmidt Date: Wed Sep 25 21:54:28 2024 +0200 Rename "Data export" menu item (#32099) commit f610fdd6e78439c1b822dab16c79bb7510f85ba8 Merge: 440b695b79 0b1310feb3 Author: Claire Date: Wed Sep 25 21:15:51 2024 +0200 Merge pull request #2858 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 28966fa0a6d7b98ee94696acdc79e45449ce8349 commit 3426ea2912d1cd69ebdfa4e43a119dc6e7374c49 Author: Eugen Rochko Date: Wed Sep 25 20:13:36 2024 +0200 Add preview of followers removed in domain block modal in web UI (#32032) commit 28c4eca0af696ff039b90b8af57aa818df442edf Author: Eugen Rochko Date: Wed Sep 25 18:36:19 2024 +0200 Change responsive break points on navigation panel in web UI (#32034) commit 0b1310feb35d85a0974ad1471bd790689fbbce6f Author: Renaud Chaput Date: Wed Sep 25 16:33:58 2024 +0200 [Glitch] Keep the status action buttons at their position regardless of the counter size Port 739ad0eed2f537bc49f53fb556beab52fd6e66da to glitch-soc Co-authored-by: Claire Signed-off-by: Claire commit 5716ebf39011f10079e87176f30957d7b2e7ccd8 Author: Renaud Chaput Date: Wed Sep 25 15:36:19 2024 +0200 [Glitch] Add notification grouping for follow notifications Port d6f5ee75ab91eba676e4e200d4e6a98a5aed91ef to glitch-soc Signed-off-by: Claire commit 36ce5813cbb0de4e8829c458bfb98005c4f2f006 Author: Renaud Chaput Date: Wed Sep 25 15:35:37 2024 +0200 [Glitch] Fix search params being dropped when redirected to non-deck path Port 3dc4ddc6631585813c1c5bce9e8679f101a03a56 to glitch-soc Signed-off-by: Claire commit d9d84822bbbf21b54cfd12cceec12cbee8940af3 Author: Matt Jankowski Date: Wed Sep 25 03:43:12 2024 -0400 [Glitch] Use `not-allowed` for cursor on disabled buttons Port 69aa5699ce8fc1076d87e8f0a8954ea0caf3d464 to glitch-soc Signed-off-by: Claire commit 633165ba9ca96e5cc194d4e9ee7c0161bdf96836 Merge: 440b695b79 28966fa0a6 Author: Claire Date: Wed Sep 25 17:41:37 2024 +0200 Merge commit '28966fa0a6d7b98ee94696acdc79e45449ce8349' into glitch-soc/merge-upstream commit 28966fa0a6d7b98ee94696acdc79e45449ce8349 Author: Renaud Chaput Date: Wed Sep 25 17:21:11 2024 +0200 Remove deprecated `v2_alpha` endpoint for grouped notifications (#32089) commit 739ad0eed2f537bc49f53fb556beab52fd6e66da Author: Renaud Chaput Date: Wed Sep 25 16:33:58 2024 +0200 Keep the status action buttons at their position regardless of the counter size (#32084) Co-authored-by: Claire commit 51777fe3e2ec1646fece2b99ade0b802afe2088d Author: Matt Jankowski Date: Wed Sep 25 09:54:22 2024 -0400 Prefer structure checks over multi-line size/parts checks in `parsed_body` (#32063) commit d6f5ee75ab91eba676e4e200d4e6a98a5aed91ef Author: Renaud Chaput Date: Wed Sep 25 15:36:19 2024 +0200 Add notification grouping for follow notifications (#32085) commit 3dc4ddc6631585813c1c5bce9e8679f101a03a56 Author: Renaud Chaput Date: Wed Sep 25 15:35:37 2024 +0200 Fix search params being dropped when redirected to non-deck path (#31984) commit 83574f641aba9278bbc9c0d940717dad00522634 Author: Matt Jankowski Date: Wed Sep 25 04:07:48 2024 -0400 Add coverage and use mailer callback to check functional user in notification mailer (#32055) commit c2ef83ea4c045eefe9930b66ea6abe6ddeb31740 Author: Matt Jankowski Date: Wed Sep 25 03:56:42 2024 -0400 Consolidate shared `a scope` example parts into one attributes check (#32046) commit c3b6a7a29792ff55706a0741f88bdc43b741c46b Author: Matt Jankowski Date: Wed Sep 25 03:56:08 2024 -0400 Reduce factory creation (36 -> 12) in `spec/controllers/oauth/*` area (#32045) commit 06ecf9008b9f98a54eb4c2c0b57cdea0fdd96526 Author: Matt Jankowski Date: Wed Sep 25 03:50:15 2024 -0400 Remove single-use shared examples in controller specs (#32044) commit 69aa5699ce8fc1076d87e8f0a8954ea0caf3d464 Author: Matt Jankowski Date: Wed Sep 25 03:43:12 2024 -0400 Use `not-allowed` for cursor on disabled buttons (#32076) commit 4e6fc3a62f053084916b4bdfbcb20d4b5de2eb08 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Sep 25 07:40:14 2024 +0000 New Crowdin Translations (automated) (#32083) Co-authored-by: GitHub Actions commit a773c239c3b4da4801e0438ec88ccaf0ca90e8fd Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 25 09:33:37 2024 +0200 Update dependency aws-sdk-s3 to v1.166.0 (#32079) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 440b695b79b6d748d31def951c0da52af22da538 Author: Claire Date: Tue Sep 24 20:54:24 2024 +0200 Fix polls not being displayed in detailed status (#2857) commit 5df7e362444644f31040a6a0a9ad64ff29a7bcdd Merge: 6551129aff ba7b1f06c1 Author: Claire Date: Tue Sep 24 20:51:46 2024 +0200 Merge pull request #2856 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 70988519df66f0b8edeb6ca95140f1d3e436fea8 commit ba7b1f06c10541942eca630a1d256d169e0374a4 Author: Eugen Rochko Date: Tue Sep 24 19:02:36 2024 +0200 [Glitch] Fix too many requests caused by relationship look-ups in web UI Port 70988519df66f0b8edeb6ca95140f1d3e436fea8 to glitch-soc Co-authored-by: Claire Signed-off-by: Claire commit 6142adc7d6dc779c2e8218fe5c232d41f00d5e38 Author: Renaud Chaput Date: Tue Sep 24 18:47:45 2024 +0200 [Glitch] Fix wrapping in dashboard quick access buttons Port f1b6a611aab351d9f3658fc8c255694597602d81 to glitch-soc Signed-off-by: Claire commit 131696277cc4c41e95f3a4ebe252c0b2cb82977a Author: Claire Date: Tue Sep 24 17:03:38 2024 +0200 [Glitch] Fix multiple bugs in notification requests and notification policies Port 0a6b75b71eae0dd9eb9d5d8c73e1d210820eeb51 to glitch-soc Signed-off-by: Claire commit aac6296183ec3df6c6cb2911af21edb66c9b7faa Author: Eugen Rochko Date: Tue Sep 24 10:00:20 2024 +0200 [Glitch] Change hide media button to be in top right corner in web UI Port d54ce67dc9ac59ad1d2fc0ee719318610a5ed249 to glitch-soc Signed-off-by: Claire commit c6039f99ce21b5642ec3b4920680ffae80d288b9 Merge: 6551129aff 70988519df Author: Claire Date: Tue Sep 24 19:34:30 2024 +0200 Merge commit '70988519df66f0b8edeb6ca95140f1d3e436fea8' into glitch-soc/merge-upstream commit 70988519df66f0b8edeb6ca95140f1d3e436fea8 Author: Eugen Rochko Date: Tue Sep 24 19:02:36 2024 +0200 Fix too many requests caused by relationship look-ups in web UI (#32042) Co-authored-by: Claire commit f1b6a611aab351d9f3658fc8c255694597602d81 Author: Renaud Chaput Date: Tue Sep 24 18:47:45 2024 +0200 Fix wrapping in dashboard quick access buttons (#32043) commit 556837f1561bb8b806030cb39d7ed658a1a1eaca Author: André Menrath <99024746+Menrath@users.noreply.github.com> Date: Tue Sep 24 17:57:53 2024 +0200 Fix the summary of converted object types to be treated as HTML (#28629) commit c36a76b9eb2e5e6809956e012028d726e113dd50 Author: Claire Date: Tue Sep 24 17:19:55 2024 +0200 Fix error when accepting appeal for sensitive posts deleted in the meantime (#32037) Co-authored-by: David Roetzel commit 0a6b75b71eae0dd9eb9d5d8c73e1d210820eeb51 Author: Claire Date: Tue Sep 24 17:03:38 2024 +0200 Fix multiple bugs in notification requests and notification policies (#32062) commit cfb8fc6222f451b16ccabfc4bb1448a84afb26ee Author: David Roetzel Date: Tue Sep 24 15:16:58 2024 +0200 Increase regexp timeout and allow override (#32056) commit 19dedd7cfd9a6d61e136519ede4447d7ec0e6e60 Author: Matt Jankowski Date: Tue Sep 24 09:16:31 2024 -0400 Set important mailer headers with `after_action` callback (#32057) commit 780e2e9d660db329a375e6120d25be5b689acb66 Author: Matt Jankowski Date: Tue Sep 24 08:07:16 2024 -0400 Convert notification mailer spec shared examples to matchers (#32047) commit 7c61533111a7046126a93580e744f99f1b72337e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 24 11:54:25 2024 +0200 Update dependency aws-sdk-s3 to v1.165.0 (#32050) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 11ac5c892981a1d03335f81ac0f7f147f3204a43 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Sep 24 11:42:14 2024 +0200 New Crowdin Translations (automated) (#32052) Co-authored-by: GitHub Actions commit c808055fc3ebe311b0e89cd2486e80458be29472 Author: Claire Date: Tue Sep 24 10:16:22 2024 +0200 Update dependency webrick (#32054) commit d54ce67dc9ac59ad1d2fc0ee719318610a5ed249 Author: Eugen Rochko Date: Tue Sep 24 10:00:20 2024 +0200 Change hide media button to be in top right corner in web UI (#32048) commit 6551129afff6d66f7fd72564782d5da1ff6af17b Merge: 6ac6d86525 38744a4e51 Author: Claire Date: Tue Sep 24 09:44:10 2024 +0200 Merge pull request #2853 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 5dfdec645313e556413147597138a8008bc35996 commit 38744a4e51fd4f4dea1eb627e20d3d4a6d0f2070 Author: Claire Date: Mon Sep 23 14:53:35 2024 +0200 [Glitch] Change mobile breakpoint back to old version and allow main column to shrink Port b5bdc69f7ba75852e6de651d2cd16e1e8897823f to glitch-soc Signed-off-by: Claire commit c2c3a664784f29fbd12fea841ef9dc0abeef6fa0 Merge: 6ac6d86525 5dfdec6453 Author: Claire Date: Mon Sep 23 20:24:18 2024 +0200 Merge commit '5dfdec645313e556413147597138a8008bc35996' into glitch-soc/merge-upstream commit 5dfdec645313e556413147597138a8008bc35996 Author: Matt Jankowski Date: Mon Sep 23 09:37:32 2024 -0400 Convert `settings/applications` controller spec to system/request specs (#32006) commit aaab6b7adc736a17ea9adc79309ef2efc90146e9 Author: Eugen Rochko Date: Mon Sep 23 15:14:15 2024 +0200 Add reblogs and favourites counts to statuses in ActivityPub (#32007) commit b5bdc69f7ba75852e6de651d2cd16e1e8897823f Author: Claire Date: Mon Sep 23 14:53:35 2024 +0200 Change mobile breakpoint back to old version and allow main column to shrink (#32033) commit bbf77522569ad284893d2380d0b688d361391889 Author: Matt Jankowski Date: Mon Sep 23 06:45:34 2024 -0400 Combine assertions in `Notification` model spec (#32015) commit 2b4bda800448337c3eb07b679e3e1031ea301102 Author: Matt Jankowski Date: Mon Sep 23 06:44:52 2024 -0400 Add `response_avatar_link` helper to webfinger request spec (#31999) commit 447d0a3e880221973fc81840c9ba5e3cc6c06dcb Author: Matt Jankowski Date: Mon Sep 23 05:27:53 2024 -0400 Remove double no-records cases in `api/v1/admin` req specs (#32014) commit 66ed7ea4b5a5c022da94eca9cb5931eb4151080d Author: Matt Jankowski Date: Mon Sep 23 05:20:43 2024 -0400 Move status creation to "with rss" context in accounts request spec (#32020) commit cd7b670cd8de145510091c5737f5ed158e16cd00 Author: Matt Jankowski Date: Mon Sep 23 05:18:04 2024 -0400 Reduce factory creation in `User#reset_password!` spec (#32021) commit 5d6a3f2cb07de926da007e855e24ee852dc17b91 Author: Claire Date: Mon Sep 23 11:13:51 2024 +0200 Update dependency google-protobuf (#32029) commit 770ec9240a8ec4f9a554533821e8b9a60be71bdf Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 09:02:16 2024 +0000 Update Yarn to v4.5.0 (#31914) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 11eae691ba91c2e36ce7cbdab18bf5a60a4fb9c8 Author: Tim Campbell Date: Mon Sep 23 10:55:35 2024 +0200 Feature more otel customization (#31998) commit ed90d9342ee61efa110996dc88f7352c3c9efe8d Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Sep 23 08:50:19 2024 +0000 New Crowdin Translations (automated) (#32011) Co-authored-by: GitHub Actions commit 0ba3ad4a354df6b7cdcc9fbad4dc50d86f429171 Author: Matt Jankowski Date: Mon Sep 23 04:45:05 2024 -0400 Remove `body_json_ids` from api/v2/admin/accounts spec (#32003) commit e0b45b35c9415c912f92803ab7c797b1ae516a7e Author: Matt Jankowski Date: Mon Sep 23 04:42:52 2024 -0400 Combine repeated parsed_body assertions into single (#32002) commit 5fae1d55e5e15bb3e44cae2677b0904799e4ef62 Author: Eugen Rochko Date: Mon Sep 23 10:42:03 2024 +0200 Fix OAuth authorization prompt referring to third-party apps (#32005) commit 10d2f83025b3161fb2a149b997d06cbb5f1b8e48 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 08:41:26 2024 +0000 Update dependency selenium-webdriver to v4.25.0 (#32008) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 958f01e7225daf371307848d6fe2729a2580e0a8 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 08:41:05 2024 +0000 Update dependency sass to v1.79.3 (#32009) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f4632d941ad1f89a52a2cd1dfd09b54797e935d0 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 10:40:46 2024 +0200 Update dependency aws-sdk-s3 to v1.164.0 (#32010) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c37f9c0d44fb78e5023942ce9948168b5e637b74 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 10:36:57 2024 +0200 Update dependency jsdom to v25.0.1 (#32017) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 84d04386dd2b16e86c520349efd898c3d4bf8b44 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 10:35:37 2024 +0200 Update DefinitelyTyped types (non-major) (#32026) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f294c4a594ebf6da8ea5a18bdfd62b754941575e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 10:35:23 2024 +0200 Update libretranslate/libretranslate Docker tag to v1.6.1 (#32027) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit efc0d4d526e3f05b089b7eb1685dbe415f12bb03 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 23 10:35:11 2024 +0200 Update dependency react-intl to v6.7.0 (#32028) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 6ac6d8652561cb18fea9ef09c4e1f151fc5e95b4 Merge: 5aebdc9bcb 7c148ed1cb Author: Claire Date: Sun Sep 22 21:57:55 2024 +0200 Merge pull request #2852 from ClearlyClaire/glitch-soc/features/grouped-notifications-cw Add content warning support to grouped notifications commit 7c148ed1cb45195e170b3c5945b3de455a59a378 Author: Claire Date: Sun Sep 22 20:54:11 2024 +0200 Use new CW class in more places commit 4d754935a98aa9970f2d90db81c83f77be6ca654 Author: Claire Date: Sun Sep 22 20:21:46 2024 +0200 Replace new-style upstream CWs with old-style CWs for now commit 0d26c9fb0b54470f4da3429ec6c7d98c01938ff5 Author: Eugen Rochko Date: Thu Sep 5 11:46:11 2024 +0200 [Glitch] Fix wrong width on content warnings and filters in web UI Port b265a654d74f649b6a58debe39a439cc9b07b730 to glitch-soc Signed-off-by: Claire commit 7d97e3d82fdde28c4de0c39e2e47ec4d67ceeaf3 Author: Eugen Rochko Date: Thu Aug 22 19:12:35 2024 +0200 [Glitch] Change how content warnings and filters are displayed in web UI Partially apply 500f4925a5e5ee45f2576ee3b0c603a0ab851840 to glitch-soc Signed-off-by: Claire commit 5aebdc9bcba59375264934b0ebc22c514fc1ba79 Merge: b0f6d3e112 a969c6a6a6 Author: Claire Date: Sat Sep 21 20:27:48 2024 +0200 Merge pull request #2850 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 7ed9c590b98610f8d68deab9ef8df260eec6d8f0 commit a969c6a6a60fcf7813d66b9e7a2c8700c500eb24 Author: Eugen Rochko Date: Fri Sep 20 11:42:02 2024 +0200 [Glitch] Change zoom icon in web UI Port e7fd0985c9cd14437443345adfe725ecd3b038a6 to glitch-soc Signed-off-by: Claire commit 03829d8e1d0b952e1ff6fdca64435bae401a47c5 Author: Renaud Chaput Date: Thu Sep 19 17:34:08 2024 +0200 [Glitch] Update directory page options to use URL params Port ae03e4ffc6a25c8a3e3c61701180fdc1ea194141 to glitch-soc Signed-off-by: Claire commit 86b9d3b4e5f95be5a97924e4787a92112c6e6f11 Author: Claire Date: Thu Sep 19 16:58:33 2024 +0200 [Glitch] Fix custom `history.push` and `history.replace` building bogus location if path is omitted Port 57a38f071b0ffd74b813516e24c9e86a23c4d467 to glitch-soc Signed-off-by: Claire commit 9bd58386463adf2f312cc13915559958fd22c430 Author: Eugen Rochko Date: Thu Sep 19 12:52:46 2024 +0200 [Glitch] Fix browser glitch caused by two overlapping scroll animations in web UI Port ef4d6ab98875891716fa2b9ce22ed34afc58a53f to glitch-soc Signed-off-by: Claire commit 80cb285819a4544f732fcc3315c8283471771d98 Author: Eugen Rochko Date: Wed Sep 18 19:39:32 2024 +0200 [Glitch] Fix sass deprecation warning Port 29656cb9e0e5fbecdec5bc5f4e8fc2249e1b8c4e to glitch-soc Signed-off-by: Claire commit d77348f830c5725ef3025cb07d79220300247725 Author: Renaud Chaput Date: Wed Sep 18 19:39:15 2024 +0200 [Glitch] Fix the appearance of avatars when they do not load Port 8b708340356e18696e5ab9e83067ce9297e481f7 to glitch-soc Signed-off-by: Claire commit 0820cbcb35cf40b546993611f5226cf45d8330ef Author: Christian Schmidt Date: Wed Sep 18 10:43:24 2024 +0200 [Glitch] Mute XHR abort errors Port 7740f1a6bb6c34a1d4fdfeaa29c31ac24fd4b236 to glitch-soc Signed-off-by: Claire commit 221bba1897e51ef6b5a7cde474653bddff4b572b Merge: b0f6d3e112 7ed9c590b9 Author: Claire Date: Sat Sep 21 15:06:06 2024 +0200 Merge commit '7ed9c590b98610f8d68deab9ef8df260eec6d8f0' into glitch-soc/merge-upstream commit b0f6d3e112ebaa0d31bb801794d6ff4d71329516 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat Sep 21 14:57:30 2024 +0200 New Crowdin Translations (automated) (#2773) * New Crowdin translations * Fix bogus `no.yml` * Fix bogus `simple_form.no.yml` --------- Co-authored-by: GitHub Actions Co-authored-by: Claire commit 7ed9c590b98610f8d68deab9ef8df260eec6d8f0 Author: Claire Date: Fri Sep 20 16:58:06 2024 +0200 Fix issue when encountering reblog of deleted post in feed rebuild (#32001) commit ed8b0e4b1ea9df593aff6d831bfb9ad8fe0ed32d Author: Claire Date: Fri Sep 20 15:33:26 2024 +0200 Fix links for reblogs in moderation interface (#31979) commit d55f4fbda1967ab0889e6553dfad9f91bb2805f0 Author: Matt Jankowski Date: Fri Sep 20 09:19:53 2024 -0400 Add content type checks to api/v2 request specs (#31983) commit 171394e914b4f3cc15b6659a45ecc210e42ee004 Author: Matt Jankowski Date: Fri Sep 20 09:13:47 2024 -0400 Add coverage for CSV responses for severed relationships (#31962) commit 66326065b096fdfa4f8589747dc1717be03b5626 Author: Matt Jankowski Date: Fri Sep 20 09:13:04 2024 -0400 Add `response.content_type` checks for JSON to `api/v1` request specs (#31981) commit a7dbf6f5a5f3bddbc40d8b4d9067bec0a7025169 Author: Matt Jankowski Date: Fri Sep 20 08:50:51 2024 -0400 Use heredoc/squish for inline css styles in oembed serializer (#31991) commit bdf83c353f8ff8c9794a11a4133f74129fac8670 Author: Matt Jankowski Date: Fri Sep 20 08:39:48 2024 -0400 Move default embed size knowledge into `OEmbedSerializer` (#31990) Co-authored-by: Claire commit 8afa3bb2fa872c2413cd264ca3321a7509a5ffdf Author: Claire Date: Fri Sep 20 12:10:09 2024 +0200 Change Mastodon to issue correctly-signed queries by default (#31994) commit e7fd0985c9cd14437443345adfe725ecd3b038a6 Author: Eugen Rochko Date: Fri Sep 20 11:42:02 2024 +0200 Change zoom icon in web UI (#29683) commit 04a939d6407d4ae5873757b8ab8d7187110fe6e7 Author: Matt Jankowski Date: Fri Sep 20 04:51:37 2024 -0400 Add `reviewed` and `unreviewed` scopes to `Reviewable` model concern (#31988) commit c922af27375ec9e902981c6b66c96a7ae57c7513 Author: Matt Jankowski Date: Fri Sep 20 04:31:58 2024 -0400 Add `LIMIT` constant for `api/v1/peers/search` endpoint (#31989) commit 162f9a3c90dd688cd042f241add098c1ef6c6625 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Sep 20 08:31:28 2024 +0000 New Crowdin Translations (automated) (#31993) Co-authored-by: GitHub Actions commit 840fd697306ddb8d54768bdc083b1c93cb16fc3a Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Sep 20 10:20:27 2024 +0200 Update dependency sass to v1.79.2 (#31992) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 9a03902ab602fe49ea8bfbc56cdbed0831e5963f Author: Matt Jankowski Date: Fri Sep 20 04:16:19 2024 -0400 Capture actual behavior in v2/notifications "someone else" dismiss scenario (#31985) commit 09459ed0008b42098549c0213916e85f567b0579 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Sep 20 10:15:14 2024 +0200 Update dependency react-select to v5.8.1 (#31982) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ae03e4ffc6a25c8a3e3c61701180fdc1ea194141 Author: Renaud Chaput Date: Thu Sep 19 17:34:08 2024 +0200 Update directory page options to use URL params (#31977) commit 57a38f071b0ffd74b813516e24c9e86a23c4d467 Author: Claire Date: Thu Sep 19 16:58:33 2024 +0200 Fix custom `history.push` and `history.replace` building bogus location if path is omitted (#31980) commit 5a8f2fe31d15a2a07384d118b5cbcd10ad714be4 Author: Matt Jankowski Date: Thu Sep 19 09:43:40 2024 -0400 Convert `settings/exports` controller spec to system/request specs (#31965) commit 2946a9286b1b4a5323f9f7ea6e7b29b6ca5d309d Author: Matt Jankowski Date: Thu Sep 19 09:38:32 2024 -0400 Use `headers` shorthand in mailers (#31956) commit 6801afa12f3611c86aeec78a2d43ffa8323ecec6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 19 10:56:09 2024 +0000 Update dependency devise-two-factor to v6 [SECURITY] (#31957) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: David Roetzel commit ef4d6ab98875891716fa2b9ce22ed34afc58a53f Author: Eugen Rochko Date: Thu Sep 19 12:52:46 2024 +0200 Fix browser glitch caused by two overlapping scroll animations in web UI (#31960) commit efdc17513d4f929259f5d92b9ba2718e280295e3 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Sep 19 10:34:19 2024 +0000 New Crowdin Translations (automated) (#31974) Co-authored-by: GitHub Actions commit 5d573c976e8f02e67014154232d2c7f936d8f717 Author: Matt Jankowski Date: Thu Sep 19 06:23:58 2024 -0400 Remove unused E2EE-related methods (#31964) commit b071e618e7c53a89ee332ae4c7afe9c5b4e9d176 Author: Matt Jankowski Date: Thu Sep 19 06:15:21 2024 -0400 Combine API request spec assertions (#31970) commit 1fce55cf5dc63d944f45b938eb3df28742ca7d77 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 19 09:51:14 2024 +0000 Update dependency aws-sdk-s3 to v1.163.0 (#31972) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 90db524a90ea5fee8b791b15501c7348f8a87c39 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 19 09:50:58 2024 +0000 Update dependency puma to v6.4.3 (#31975) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 62a39d60cedc073b3190b9ba2f2f6f3173057eb2 Author: Claire Date: Thu Sep 19 11:50:06 2024 +0200 Fix rolling updates by moving DropEndToEndMessageTables to post-deployment migrations (#31963) commit 29656cb9e0e5fbecdec5bc5f4e8fc2249e1b8c4e Author: Eugen Rochko Date: Wed Sep 18 19:39:32 2024 +0200 Fix sass deprecation warning (#31961) commit 8b708340356e18696e5ab9e83067ce9297e481f7 Author: Renaud Chaput Date: Wed Sep 18 19:39:15 2024 +0200 Fix the appearance of avatars when they do not load (#31966) commit e3baa1cdda2af3d0ff7920e6249a3a9c0ccbe562 Author: Matt Jankowski Date: Wed Sep 18 09:29:57 2024 -0400 Add coverage for `AccountDeletionRequest` class (#31937) commit 42f9f507b632c1b90fecfed5f38ce2dbb2d0c949 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 18 15:29:21 2024 +0200 Update dependency pg to v8.13.0 (#31949) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit bf8eaaa9a505f86bf7c965f981f585af34337635 Author: Matt Jankowski Date: Wed Sep 18 05:42:36 2024 -0400 Convert controller spec for security_key_options endpoint to request spec (#31938) commit 6f836c45aa5862cdfd65877c99252fcb28ab4da1 Author: Matt Jankowski Date: Wed Sep 18 05:27:50 2024 -0400 Remove `crypto` values from doorkeeper application/token `scopes` (#31945) commit 5405bdd344ff140e4e9cf9782770e7180794edec Author: Matt Jankowski Date: Wed Sep 18 05:27:43 2024 -0400 Remove unused E2EE messaging code (#31193) commit 2d399f5d4a26e2f9c398ec7ab01f1aaee1d0e1ac Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 18 11:17:57 2024 +0200 Update dependency pg-connection-string to v2.7.0 (#31950) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 7740f1a6bb6c34a1d4fdfeaa29c31ac24fd4b236 Author: Christian Schmidt Date: Wed Sep 18 10:43:24 2024 +0200 Mute XHR abort errors (#31952) commit a791274824d1136278a0139f4b15f54433e56561 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 18 08:28:42 2024 +0000 Update dependency sass to v1.79.1 (#31958) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit eb16763bff5cc2d38dec19c82d47615cd2b54e27 Author: Matt Jankowski Date: Wed Sep 18 04:22:07 2024 -0400 Use `have_http_link_header` matcher in `api/v1/trends/*` specs (#31940) commit 943738671c02424b4956de0994c4bd298191fe54 Author: Matt Jankowski Date: Wed Sep 18 04:21:31 2024 -0400 Remove unneeded `to_s` on `Link` header comparison in statuses controller spec (#31941) commit 6f3d7516dc535ab04b040d69b2682d8bc69d5d7e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 18 08:10:22 2024 +0000 Update dependency dotenv to v3.1.4 (#31953) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit bd86c692cf08bb4c5b853f5b843adf0a0853d16d Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Sep 18 08:06:44 2024 +0000 New Crowdin Translations (automated) (#31959) Co-authored-by: GitHub Actions commit b7548dbf290b3eb9adebeac0ff1b0735ffec2872 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 18 08:05:59 2024 +0000 Update dependency memory_profiler to v1.1.0 (#31947) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a397141d78b073246059b36489eb28f27485f9f8 Author: Matt Jankowski Date: Wed Sep 18 04:05:25 2024 -0400 Move non-action public method controller callback to private methods (#31933) commit f3f06dafe34de5cb8562bc203f3c4557821217e5 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 18 10:05:06 2024 +0200 Update dependency babel-loader to v8.4.1 (#31931) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 486e61677c4080b9c9639ca39c1a1eb434162c83 Merge: 18209d2011 6bd86fede0 Author: Claire Date: Tue Sep 17 18:34:28 2024 +0200 Merge pull request #2848 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 3e91c101b3c4b5166dab778837e38bed424b4333 commit 6bd86fede0a9171cf47e1dcf363bbcbd4e2c3068 Author: Claire Date: Tue Sep 17 05:19:42 2024 +0200 [Glitch] Increase no-gap-breakpoint by 32px to fix overflow Port d2f907507857fb0d256c45dda34403ae1fe95cd8 to glitch-soc Signed-off-by: Claire commit a85b2476c21c975a84d33e504e3d9fcf02d794cc Author: Michael Stanclift Date: Mon Sep 16 22:19:04 2024 -0500 [Glitch] Fix background of text detection progress Port 5a33a5658b904b97a664f18eaad6587c7c6cf04e to glitch-soc Signed-off-by: Claire commit 93b2c8164ec40da95f138d0b038d018863eb7ea3 Author: Claire Date: Mon Sep 16 16:51:56 2024 +0200 [Glitch] Fix selectSettingsNotificationsExcludedTypes not being memoized properly Port ca8e892c1abb91722c256030c83cabec8e3445ff to glitch-soc Signed-off-by: Claire commit 11de3dbef6fc719bd12379649a888ae84ad9b347 Author: Claire Date: Mon Sep 16 15:12:10 2024 +0200 [Glitch] Enable grouped notifications unconditionally Port c620452fd7e0e3b083bae4b68fa09384df322f4a to glitch-soc Signed-off-by: Claire commit 6de18bb475e75ea211fbf6561093a642b25966bb Merge: 18209d2011 3e91c101b3 Author: Claire Date: Tue Sep 17 17:54:00 2024 +0200 Merge commit '3e91c101b3c4b5166dab778837e38bed424b4333' into glitch-soc/merge-upstream commit 3e91c101b3c4b5166dab778837e38bed424b4333 Author: Claire Date: Tue Sep 17 17:42:45 2024 +0200 Bump version to 4.3.0-beta.2 (#31948) commit d8f9db547a3d3354b747b2aa609ff12017f60edd Author: David Roetzel Date: Tue Sep 17 16:59:29 2024 +0200 Merge commit from fork Co-authored-by: Eugen Rochko commit 6a233cbfcfa6e14e9575fd490ed018670793e9ef Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Sep 17 15:02:53 2024 +0200 New Crowdin Translations (automated) (#31946) Co-authored-by: GitHub Actions commit d2f907507857fb0d256c45dda34403ae1fe95cd8 Author: Claire Date: Tue Sep 17 05:19:42 2024 +0200 Increase no-gap-breakpoint by 32px to fix overflow (#31889) commit 5a33a5658b904b97a664f18eaad6587c7c6cf04e Author: Michael Stanclift Date: Mon Sep 16 22:19:04 2024 -0500 Fix background of text detection progress (#31943) commit 18209d2011921a85c82f429a787869bb8e6dc227 Merge: c8ef702ba9 43f6792e1b Author: Claire Date: Mon Sep 16 23:51:37 2024 +0200 Merge pull request #2847 from ClearlyClaire/glitch-soc/fixes/click-detailed-status Fix detailed statuses being clickable and linking to broken pages commit c8ef702ba904f53f1b10f17641a5589531bbe4ab Merge: 346919178d 0740352ce6 Author: Claire Date: Mon Sep 16 23:31:03 2024 +0200 Merge pull request #2846 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to e0648a916ab81925545504173bf4f43ec64d4f3c commit 43f6792e1bec08d3804a16f710525dfe368518c6 Author: Claire Date: Mon Sep 16 22:51:19 2024 +0200 Fix detailed statuses being clickable and linking to broken pages commit 0740352ce6f0bf3d97f34665bbae27ed40a2b1e1 Author: Claire Date: Mon Sep 16 14:10:02 2024 +0200 [Glitch] Rename `/api/v2_alpha/notifications*` to `/api/v2/notifications*` Port e0648a916ab81925545504173bf4f43ec64d4f3c to glitch-soc Signed-off-by: Claire commit b6398cf2d3bc5e61f8fa266b0c2953525550ade6 Author: Eugen Rochko Date: Mon Sep 16 14:08:37 2024 +0200 [Glitch] Fix horizontal scrollbar on who to follow carousel in web UI Port efb0e2c34b2c2921ac0c0b999d99384882667d6c to glitch-soc Signed-off-by: Claire commit e25634ccefb76c5d15a4b1f6edf6434ba449a277 Author: Claire Date: Mon Sep 16 11:54:03 2024 +0200 [Glitch] Convert notification requests actions and reducers to Typescript Port c0eda832f3cc0f4009a59836cd4494e9daeb844c to glitch-soc Signed-off-by: Claire commit 665e9129fee1f3d461ae290010e4f45a9c18e78c Merge: 346919178d e0648a916a Author: Claire Date: Mon Sep 16 21:08:58 2024 +0200 Merge commit 'e0648a916ab81925545504173bf4f43ec64d4f3c' into glitch-soc/merge-upstream Conflicts: - `app/models/custom_emoji.rb`: An upstream refactor touched lines adjacent to ones modified in glitch-soc. Ported upstream's changes. commit ca8e892c1abb91722c256030c83cabec8e3445ff Author: Claire Date: Mon Sep 16 16:51:56 2024 +0200 Fix selectSettingsNotificationsExcludedTypes not being memoized properly (#31881) commit 6c76a7a90778e6b0f1daf33ff6a2725079c8f335 Author: Claire Date: Mon Sep 16 15:20:44 2024 +0200 Fix cancel follow request button sometimes saying “Follow back” (#31934) commit c620452fd7e0e3b083bae4b68fa09384df322f4a Author: Claire Date: Mon Sep 16 15:12:10 2024 +0200 Enable grouped notifications unconditionally (#31929) commit e0648a916ab81925545504173bf4f43ec64d4f3c Author: Claire Date: Mon Sep 16 14:10:02 2024 +0200 Rename `/api/v2_alpha/notifications*` to `/api/v2/notifications*` (#31840) commit efb0e2c34b2c2921ac0c0b999d99384882667d6c Author: Eugen Rochko Date: Mon Sep 16 14:08:37 2024 +0200 Fix horizontal scrollbar on who to follow carousel in web UI (#31912) commit c0eda832f3cc0f4009a59836cd4494e9daeb844c Author: Claire Date: Mon Sep 16 11:54:03 2024 +0200 Convert notification requests actions and reducers to Typescript (#31866) commit d5cf27e667e86b023f60780a4e9cdd5d3d1babfd Author: Claire Date: Mon Sep 16 11:40:18 2024 +0200 Add global Regexp timeout (#31928) commit c54cbf7943693f2aa63cf9cb32941a674a7ba63b Author: Matt Jankowski Date: Mon Sep 16 04:56:40 2024 -0400 Remove `follow` creation from `ListAccount` fabricator (#31902) commit 474abf3c7f38803fe826ccb69afd44511739a256 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Sep 16 10:48:20 2024 +0200 New Crowdin Translations (automated) (#31911) Co-authored-by: GitHub Actions commit 1d58f93670a057ce7a4cf757585d4f0b6fd79a0f Author: Claire Date: Mon Sep 16 10:48:13 2024 +0200 Update dependencies omniauth-saml, ruby-xml and ruby-saml (#31926) commit bf8b55ce91809874169e5fec889f58962d331977 Author: Matt Jankowski Date: Mon Sep 16 04:29:06 2024 -0400 Enable `Rails/Output` in `spec/` dir (#31905) commit abd2f5654a5d1b2baa4a210c8175d6ed5e6ff5c5 Author: Matt Jankowski Date: Mon Sep 16 03:53:03 2024 -0400 Add validation coverage for `CustomEmoji` shortcode value (#31906) commit 822e918a56055223be009974d581a8295d60b709 Author: Matt Jankowski Date: Mon Sep 16 03:52:22 2024 -0400 Add coverage for `Bookmark` validation and reblog/status check callback (#31907) commit c24de04f9c828b4b64aee5bb8fa133a88b590b65 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 16 09:51:36 2024 +0200 Update dependency postcss to v8.4.47 (#31913) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 9ea270526cc4d8c0d1b5a546d7bc598b2c3a9e93 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 16 09:51:13 2024 +0200 Update DefinitelyTyped types (non-major) (#31922) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2afaa3b3d48248a057f206ae3a3840622e5b959d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 16 09:50:51 2024 +0200 Update dependency husky to v9.1.6 (#31923) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0cc05fbb7cf818a0ef95576ba663182d02fdd4c2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 16 09:50:43 2024 +0200 Update dependency i18n to v1.14.6 (#31925) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4b40d13cb37a465cc334e20d8131070c8a23d268 Author: Claire Date: Sat Sep 14 02:16:02 2024 +0200 Increase preview card image size limit from 2MB to 8MB when using libvips (#31904) commit 346919178d52df376e27b7aa934545fe760ea81b Merge: 065abf2918 117ac13d12 Author: Claire Date: Fri Sep 13 23:40:06 2024 +0200 Merge pull request #2845 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 5ba3405be4c1f708f198580b481f822698dab392 commit 117ac13d121dd66eca710e01e1028cd2faa8af03 Merge: 065abf2918 5ba3405be4 Author: Claire Date: Fri Sep 13 21:37:34 2024 +0200 Merge commit '5ba3405be4c1f708f198580b481f822698dab392' into glitch-soc/merge-upstream commit 065abf2918b16491276f02220c5a5a0f3c28abb0 Merge: cb91629353 427ed60274 Author: Claire Date: Fri Sep 13 21:35:17 2024 +0200 Merge pull request #2843 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 0226bbe5165a53658b29e46ddbef6a10507fdc8c commit 5ba3405be4c1f708f198580b481f822698dab392 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Sep 13 14:07:33 2024 +0200 Update dependency opentelemetry-instrumentation-pg to '~> 0.29.0' (#31897) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c1b2c4fd9a3ae8110d75794c98fe0833c31ff9cc Author: David Roetzel Date: Fri Sep 13 13:37:15 2024 +0200 Strip protocol from attribution domains (#31900) commit ba81e4e0192371e1fc07ad6d7cf58e86766d0e77 Author: Claire Date: Fri Sep 13 11:11:10 2024 +0200 Fix inability to locally suspend remotely-suspended accounts in moderation interface (#31899) commit a2c4f5f5c0de75fb67cee011b98c82e0d75f0fbd Author: Matt Jankowski Date: Fri Sep 13 04:49:03 2024 -0400 Add coverage for `ListAccount` follow/follow_request set up (#31896) commit 49cbee383612bb58efeebd3377acc0d618fbf80e Author: Matt Jankowski Date: Fri Sep 13 04:43:21 2024 -0400 Remove unused argument from `AccountMigration.within_cooldown` (#31892) commit 353ade767b32f2237a46e0bbac53cb07ac3e91e2 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Sep 13 10:41:46 2024 +0200 New Crowdin Translations (automated) (#31898) Co-authored-by: GitHub Actions commit 427ed60274f2fb7a7a24fe52c04ed95c8f10bd8e Author: Claire Date: Thu Sep 12 22:42:07 2024 +0200 Fix link handling within detailed status contents commit 4050beb6e2eff82934297eeaebd095603ad2c942 Author: Claire Date: Thu Sep 12 22:30:40 2024 +0200 Fix detailed status timestamp link target not being the original URL commit 202077517c298c918782b764c7073215856c70db Author: Matt Jankowski Date: Thu Sep 12 16:09:55 2024 -0400 Add "search" group for chewy classes in simplecov config (#31890) commit 9b1ecf7aee670b95077b0fde86ada3edf9c75f89 Author: Michael Stanclift Date: Thu Sep 12 09:18:43 2024 -0500 [Glitch] Fix review history and action modal styling Port a269ff9253050fb9a0b2c063c253eacfad77b738 to glitch-soc Signed-off-by: Claire commit afd3953cdd90d342359775b91126667be2ff6fbd Author: Claire Date: Thu Sep 12 15:15:05 2024 +0200 [Glitch] Autofocus primary button in modals Port 5f782f9629de25a2029fbc75d79316d583adc9a0 to glitch-soc Signed-off-by: Claire commit 83b553c7d14dc567d67dd808f0ff162cdd53777e Merge: bd68d2ab21 0226bbe516 Author: Claire Date: Thu Sep 12 21:32:39 2024 +0200 Merge commit '0226bbe5165a53658b29e46ddbef6a10507fdc8c' into glitch-soc/merge-upstream commit bd68d2ab21bfcc434812d7a208f8474716388a50 Author: Eugen Rochko Date: Thu Sep 12 14:54:16 2024 +0200 [Glitch] Change design of embed modal in web UI Port 24ef8255b3f9b44cb54f49bc78fe3382a7070b1a to glitch-soc Signed-off-by: Claire commit e705ec13db1281d2078487c273ce447b58e81093 Author: Eugen Rochko Date: Thu Sep 12 11:41:19 2024 +0200 [Glitch] Change embedded posts to use web UI Port 3d46f478174403a64bd194e8c60e11b07bbd5d2d to glitch-soc Co-authored-by: Claire Signed-off-by: Claire commit 3465d39494b0af637755ad0e86566262e7aa35b7 Merge: 2d31cdbc28 24ef8255b3 Author: Claire Date: Thu Sep 12 20:05:08 2024 +0200 Merge commit '24ef8255b3f9b44cb54f49bc78fe3382a7070b1a' into glitch-soc/merge-upstream Conflicts: - `app/helpers/accounts_helper.rb`: Upstream removed a helper, textually adjacent to a glitch-soc-only one. Not really a conflict. Removed the helper as upstream did. - `app/views/layouts/embedded.html.haml`: Conflicts due to theming system. Adapted upstream's change to our theming system. - `app/views/statuses/_simple_status.html.haml`: Removed upstream, but we had local changes. Removed as upstream did. commit 2d31cdbc288aa2fdcfc8cd640f247b57db295fed Author: Eugen Rochko Date: Thu Sep 12 10:16:07 2024 +0200 [Glitch] Fix notifications re-rendering spuriously in web UI Port f2a92c2d22345568ca7f47ee1d1d70de53eb547d to glitch-soc Signed-off-by: Claire commit caaa412e6e8406dad8f208016b28ae2e02b958fe Merge: 17e3a12d3d f2a92c2d22 Author: Claire Date: Thu Sep 12 17:34:16 2024 +0200 Merge commit 'f2a92c2d22345568ca7f47ee1d1d70de53eb547d' into glitch-soc/merge-upstream commit 17e3a12d3d28edaf91176ff70de82400370bd1ad Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 11 15:59:46 2024 +0200 [Glitch] Update typescript-eslint monorepo to v8 (major) Port a27f7f4e561c9d2fe21d984059603d2f500c005b to glitch-soc Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput Signed-off-by: Claire commit 196b141af5f133978e12e4819097fbd9e699e97a Author: Eugen Rochko Date: Wed Sep 11 09:29:18 2024 +0200 [Glitch] Change inner borders in media galleries in web UI Port a3215c0f88bb5f436bed665ad26175923544d9d4 to glitch-soc Signed-off-by: Claire commit eb28472ded0bc0ab8e12e4fbb237744485675ad5 Author: Michael Stanclift Date: Tue Sep 10 12:33:55 2024 -0500 [Glitch] Fix alt text modal styling Port e09f9f885e3d2859f495d5e5e6107bba9bde3b5a to glitch-soc Signed-off-by: Claire commit 90d7a4bac42335b33bbd82277900a1da572b7def Merge: cb91629353 a27f7f4e56 Author: Claire Date: Thu Sep 12 17:22:06 2024 +0200 Merge commit 'a27f7f4e561c9d2fe21d984059603d2f500c005b' into glitch-soc/merge-upstream commit 0226bbe5165a53658b29e46ddbef6a10507fdc8c Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 12 14:21:06 2024 +0000 Update dependency express to v4.21.0 (#31877) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit cc3cf9c4656460dbf3b93de0e95c4dc29e454cb2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 12 14:20:44 2024 +0000 Update dependency aws-sdk-s3 to v1.162.0 (#31875) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a269ff9253050fb9a0b2c063c253eacfad77b738 Author: Michael Stanclift Date: Thu Sep 12 09:18:43 2024 -0500 Fix review history and action modal styling (#31864) commit 207c073bf87855c02a218526a3a389fc851e6c25 Author: Matt Jankowski Date: Thu Sep 12 10:04:46 2024 -0400 Remove debug output in migration controller spec (#31886) commit 1b6a82b7994e436d145b0e2282af07314fe54308 Author: Taylor Chaparro <33099255+notchairmk@users.noreply.github.com> Date: Thu Sep 12 06:40:20 2024 -0700 Fix invalid date searches returning 503 (#31526) commit f3c48745225fa4a0f21efbfa530e84e34bb56a97 Author: Matt Jankowski Date: Thu Sep 12 09:38:15 2024 -0400 Remove unused `statuses#embed` body class assignment (#31787) commit 4aa600387e71bca60331d672dc5c15ba58886006 Author: Matt Jankowski Date: Thu Sep 12 09:31:50 2024 -0400 Move redirect/base body class to view (#31796) commit 8cdc1481679ef0c7a848d488dae1a265cdcfeac1 Author: Christian Schmidt Date: Thu Sep 12 15:29:55 2024 +0200 Handle invalid visibility (#31571) commit 17c57c46e7f54f32ad7b17b86c7b936c789ca799 Author: Matt Jankowski Date: Thu Sep 12 09:25:23 2024 -0400 Add coverage for title/limit validations in `List` model (#31869) commit a496aeabcb28b7cc7d8a9e69bf47543c2be038c2 Author: Claire Date: Thu Sep 12 15:24:19 2024 +0200 Change form-action Content-Security-Policy directive to be more restrictive (#26897) commit 5f782f9629de25a2029fbc75d79316d583adc9a0 Author: Claire Date: Thu Sep 12 15:15:05 2024 +0200 Autofocus primary button in modals (#31883) commit c35ea59ee6be05fbb7af57e339a493f363200103 Author: Claire Date: Thu Sep 12 14:58:12 2024 +0200 Fix security context sometimes not being added in LD-Signed activities (#31871) commit 24ef8255b3f9b44cb54f49bc78fe3382a7070b1a Author: Eugen Rochko Date: Thu Sep 12 14:54:16 2024 +0200 Change design of embed modal in web UI (#31801) commit cb9162935318bb3ebef066562bbac69974bfc53e Merge: 7cfa8bb782 77cbe2332a Author: Claire Date: Thu Sep 12 13:55:14 2024 +0200 Merge pull request #2842 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 0c3c06f7cc50c9207a44f56e184ce6a41f953171 commit ab763c493fd8d40db6005282c38bd2636120f273 Author: David Roetzel Date: Thu Sep 12 13:14:42 2024 +0200 Ignore `undefined` as canonical url (#31882) commit 77cbe2332a5bf505e1d6f171714f42d5420bb599 Author: Eugen Rochko Date: Tue Sep 10 14:00:40 2024 +0200 [Glitch] Add ability to manage which websites can credit you in link previews Port CSS changes from e0c27a504788bdc6cd518072e557313e4ec5ee7a to glitch-soc Signed-off-by: Claire commit abe17172156920bcb4a850a480597ded401be6a1 Author: Eugen Rochko Date: Tue Sep 10 11:29:17 2024 +0200 [Glitch] Change design of hide media button in web UI Port 3929e3c6d21226ad42f743a283576004d9c1c7eb to glitch-soc Signed-off-by: Claire commit 10e2b87774d888093c3a53a646f7633b0b796e29 Merge: 7cfa8bb782 0c3c06f7cc Author: Claire Date: Thu Sep 12 12:09:21 2024 +0200 Merge commit '0c3c06f7cc50c9207a44f56e184ce6a41f953171' into glitch-soc/merge-upstream commit 3d46f478174403a64bd194e8c60e11b07bbd5d2d Author: Eugen Rochko Date: Thu Sep 12 11:41:19 2024 +0200 Change embedded posts to use web UI (#31766) Co-authored-by: Claire commit f2a92c2d22345568ca7f47ee1d1d70de53eb547d Author: Eugen Rochko Date: Thu Sep 12 10:16:07 2024 +0200 Fix notifications re-rendering spuriously in web UI (#31879) commit 7d53ca56d200dc0c3c8c6491d9e25aa8965e8d52 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Sep 12 09:54:53 2024 +0200 New Crowdin Translations (automated) (#31878) Co-authored-by: GitHub Actions commit 7cfa8bb7828625dfcbea41dd97b8ee76b4756b04 Merge: 1436db389e e2c101ec35 Author: Claire Date: Thu Sep 12 08:51:21 2024 +0200 Merge pull request #2841 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to a021dee64214fcc662c0c36ad4e44dc1deaba65f commit e2c101ec35f54a8cf9a3310f4e563749b457cc6a Author: Eugen Rochko Date: Mon Sep 9 17:28:54 2024 +0200 [Glitch] Change labels on thread indicators in web UI Partial port of a021dee64214fcc662c0c36ad4e44dc1deaba65f to glitch-soc Signed-off-by: Claire commit b240bad61a7a77cce7cbdd738398b22e023c4e1b Merge: 1436db389e 5260233b81 Author: Claire Date: Wed Sep 11 20:58:35 2024 +0200 Merge commit '5260233b81c301cf7b0c79b179858748b693460b' into glitch-soc/merge-upstream commit a27f7f4e561c9d2fe21d984059603d2f500c005b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 11 15:59:46 2024 +0200 Update typescript-eslint monorepo to v8 (major) (#31231) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput commit 2babfafaffd56ff69b6213f3a550c7d0b3d3283c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Sep 11 10:18:10 2024 +0200 New Crowdin Translations (automated) (#31855) Co-authored-by: GitHub Actions commit cdcd834f3c08f12eb1b7cbf66aec3c716b232663 Author: Matt Jankowski Date: Wed Sep 11 04:01:32 2024 -0400 Add coverage for `AnnualReport::*` source child classes (#31849) commit 9769ffdcc2d93fbb33b5daec52ea02854dbb1574 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 11 09:47:37 2024 +0200 Update dependency aws-sdk-s3 to v1.161.0 (#31853) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit cee71b9892d14d934f4f14e91c4d7d7843fc13d9 Author: Matt Jankowski Date: Wed Sep 11 03:47:16 2024 -0400 Remove `fa_` prefix from status visibility icon method (#31846) commit a3215c0f88bb5f436bed665ad26175923544d9d4 Author: Eugen Rochko Date: Wed Sep 11 09:29:18 2024 +0200 Change inner borders in media galleries in web UI (#31852) commit 9e12fa254e8956f1f8765a76b2c6ea54e47cfdae Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 10 17:45:32 2024 +0000 Update dependency propshaft to v1 (#31832) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e6f5b36a12396daf0a8166d0d2ea8865cd589ee2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 10 19:45:16 2024 +0200 Update dependency express to v4.20.0 (#31836) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e09f9f885e3d2859f495d5e5e6107bba9bde3b5a Author: Michael Stanclift Date: Tue Sep 10 12:33:55 2024 -0500 Fix alt text modal styling (#31844) commit 0c3c06f7cc50c9207a44f56e184ce6a41f953171 Author: Matt Jankowski Date: Tue Sep 10 13:32:58 2024 -0400 Remove vendor prefix from `mobile-web-app-capable` meta tag (#31845) commit 4ffaced8bcbcb9227722c8e09756c7ca1909aa86 Author: Claire Date: Tue Sep 10 16:00:23 2024 +0200 Second attempt at disabling Codecov annotations (#31841) commit c4b09d684e864d58fc5eaa171fafcc942e4d6937 Author: Matt Jankowski Date: Tue Sep 10 09:23:55 2024 -0400 Extract method for account-referencing in CLI prune task (#31824) commit da07adfe6c2137b07f3def1716b370329a9ec9cb Author: Matt Jankowski Date: Tue Sep 10 09:21:40 2024 -0400 Add `CustomEmoji.enabled` scope (#31830) commit e0c27a504788bdc6cd518072e557313e4ec5ee7a Author: Eugen Rochko Date: Tue Sep 10 14:00:40 2024 +0200 Add ability to manage which websites can credit you in link previews (#31819) commit 3929e3c6d21226ad42f743a283576004d9c1c7eb Author: Eugen Rochko Date: Tue Sep 10 11:29:17 2024 +0200 Change design of hide media button in web UI (#31807) commit 5260233b81c301cf7b0c79b179858748b693460b Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Sep 10 11:22:49 2024 +0200 New Crowdin Translations (automated) (#31835) Co-authored-by: GitHub Actions commit 5b995143f1ba3278e799e46b76646a9878977677 Author: Matt Jankowski Date: Tue Sep 10 04:03:45 2024 -0400 Use `with_options` for shared Account validation option value (#31827) commit 9ea710e5438ba862f135e972185a932910511715 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 10 09:59:18 2024 +0200 Update dependency oj to v3.16.6 (#31831) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 592a7af27f7699d4751d2bea7785149d3c0e5d58 Author: Claire Date: Mon Sep 9 21:57:52 2024 +0200 Fix translatable source string using “silenced” instead of “limited” (#31822) commit d0ab94c4d256d8239d0708c5a1e1d694607dae71 Author: Matt Jankowski Date: Mon Sep 9 15:57:19 2024 -0400 Add `FeaturedTag` coverage, use `pick` in model (#31828) commit 1436db389e02d3e473fe6ea3889a9c63b1434cfc Merge: 9dcc6808d6 441af2632d Author: Claire Date: Mon Sep 9 20:02:04 2024 +0200 Merge pull request #2839 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 2caa3f365ded73be17b623177967110e66f14061 commit 441af2632d4f04eba82ba187c9326b2f98aa26d4 Merge: 9dcc6808d6 2caa3f365d Author: Claire Date: Mon Sep 9 18:22:41 2024 +0200 Merge commit '2caa3f365ded73be17b623177967110e66f14061' into glitch-soc/merge-upstream commit a021dee64214fcc662c0c36ad4e44dc1deaba65f Author: Eugen Rochko Date: Mon Sep 9 17:28:54 2024 +0200 Change labels on thread indicators in web UI (#31806) commit 2caa3f365ded73be17b623177967110e66f14061 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Sep 9 14:38:43 2024 +0200 New Crowdin Translations (automated) (#31800) Co-authored-by: GitHub Actions commit 1d03570080252ee70859f07638ab724fc4fadfc2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 9 13:16:09 2024 +0200 Update dependency postcss-preset-env to v10.0.3 (#31821) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a0ea2fa3b01c61d4d390b5e4b6cddc8006b204ec Author: Mike Dalessio Date: Mon Sep 9 06:59:42 2024 -0400 Change fetch link card service to parse as HTML5 (#31814) commit 9d9901cc5bf9472ff52df87ed2d1cd096182d571 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 9 10:43:12 2024 +0200 Update peter-evans/create-pull-request action to v7 (#31818) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e6969cf4e434abb7a03a1f1300e97f031b23a042 Author: Matt Jankowski Date: Mon Sep 9 04:33:51 2024 -0400 Add method for media-referencing status in `AccountStatusCleanupPolicy` (#31798) commit 1f13b875671e203002207d9d794e26a17f41890e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 9 10:31:13 2024 +0200 Update dependency pg to v1.5.8 (#31795) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c6a0768fe564d342e6ac6b70aff9d7c23b8a9ffc Author: Matt Jankowski Date: Mon Sep 9 04:01:26 2024 -0400 Use shared system spec helper methods (#31784) commit 82161d8ae54b94be701cba600536d87957361cea Author: Mike Dalessio Date: Sun Sep 8 14:56:18 2024 -0400 Change Account::Field parsing to use HTML5::DocumentFragment (#31813) commit afa2e257e481deb913ea04104966a613fc50a7f2 Author: Mike Dalessio Date: Sun Sep 8 14:50:22 2024 -0400 Change verify link service to use CSS selectors instead of a complex XPath query (#31815) commit 10143d053a99d69f5770f6a5478ab0f88a95ae5b Author: Mike Dalessio Date: Sun Sep 8 14:41:37 2024 -0400 Change some instances of Nokogiri HTML4 parsing to HTML5 (#31812) commit 9dcc6808d60e08e49e92efe5883f0c9b23a563be Merge: 4cd74585ae 5c97ccf939 Author: Claire Date: Sat Sep 7 10:16:46 2024 +0200 Merge pull request #2837 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to b716248fc5bde4dc47b8104d092d092d87c50f1a commit 5c97ccf9396cf626e94a96cf17cd9abd40db7f05 Merge: af6ca96a4e b716248fc5 Author: Claire Date: Fri Sep 6 20:10:53 2024 +0200 Merge commit 'b716248fc5bde4dc47b8104d092d092d87c50f1a' into glitch-soc/merge-upstream commit af6ca96a4e1aa4fa718bc4929dab6618adf74c98 Author: Claire Date: Fri Sep 6 20:00:19 2024 +0200 Fix tests in glitch-soc commit 29124990a27aebda12350860f490b3d375e23d71 Merge: 4cd74585ae 7335a43b6d Author: Claire Date: Fri Sep 6 19:25:31 2024 +0200 Merge commit '7335a43b6dac0e82c305ce4dec9db4da114c769e' into glitch-soc/merge-upstream Conflicts: - `app/helpers/application_helper.rb`: Upstream reworked how CSS classes for the document's body are computed. Slight conflict due to glitch-soc's different theming system. Updated as upstream did. commit b716248fc5bde4dc47b8104d092d092d87c50f1a Author: Claire Date: Fri Sep 6 19:21:49 2024 +0200 Add link to `/admin/roles` in moderation interface when changing someone's role (#31791) commit 7335a43b6dac0e82c305ce4dec9db4da114c769e Author: Matt Jankowski Date: Fri Sep 6 12:52:35 2024 -0400 Use async count in admin dashboard (#30606) commit 0a433d08fb51e0bfdd9e5f512af529f6abafa7a6 Author: Matt Jankowski Date: Fri Sep 6 12:46:55 2024 -0400 Move shares/modal body class to layout (#31789) commit 4f81ad249477ad25aea191b1987cddb4222e65ba Author: Matt Jankowski Date: Fri Sep 6 12:46:25 2024 -0400 Add coverage for `media#player`, move body class to view (#31790) commit b530fc5267e14b4eab0322d63af94525e999fd39 Author: Matt Jankowski Date: Fri Sep 6 11:22:35 2024 -0400 Update rails to version 7.1.4 (#31563) commit c88ba523ee6eebb11413690639818ef1c926399c Author: Emelia Smith Date: Fri Sep 6 16:58:36 2024 +0200 Fix sort order of moderation notes on Reports and Accounts (#31528) commit a9d0b48b6566f5e06337a84745cdd624a6b31426 Author: Matt Jankowski Date: Fri Sep 6 09:58:46 2024 -0400 Set "admin" body class from `admin` nested layout (#31269) commit fd7fc7bdc36ea559d70edfa8cc811bed18baefc9 Author: Emelia Smith Date: Fri Sep 6 14:50:30 2024 +0200 Disable actions on reports that have already been taken (#31773) commit 1fed11cfa77c12135c68d5eff8c0d8760605b2b2 Author: Claire Date: Fri Sep 6 14:33:38 2024 +0200 Target firefox all the way back to Firefox 78 (#31782) commit ebf09328d4b17ad199ecfe364b84aa9b3da3f9b3 Author: Claire Date: Fri Sep 6 12:58:53 2024 +0200 Disable codecov github annotations (#31783) commit 6b6a80b407e03c31326deb9838bc9c199bab39ea Author: Matt Jankowski Date: Fri Sep 6 05:58:46 2024 -0400 Remove `body_as_json` in favor of built-in `response.parsed_body` for JSON response specs (#31749) commit be77a1098bef771dffe85d94e8ed4ddeb53cc768 Author: Matt Jankowski Date: Fri Sep 6 03:49:38 2024 -0400 Extract `Account::AUTOMATED_ACTOR_TYPES` for "bot" actor_type values (#31772) commit cc4865193a4454c8650bd6877c30dfec68d69d55 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Sep 6 07:38:08 2024 +0000 New Crowdin Translations (automated) (#31781) Co-authored-by: GitHub Actions commit 60182db0ca49f863d8f81f50f31b22386f734c90 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Sep 6 09:30:53 2024 +0200 Update dependency tzinfo-data to v1.2024.2 (#31780) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4cd74585aef90895c9fbbf77234ad02ecdc0d4cb Merge: 5a1d7db309 db6b1fe8fb Author: Claire Date: Thu Sep 5 22:56:10 2024 +0200 Merge pull request #2836 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 5acec087caed4a2fdf0fd8ed11f891222496f321 commit 7efe0bde9dc363de57fc350dbcdb0b099bd1329a Author: Matt Jankowski Date: Thu Sep 5 16:05:38 2024 -0400 Add `have_http_link_header` matcher and set header values as strings (#31010) commit 09017dd8f063926738b253fe964a6b12faaa744f Author: Matt Jankowski Date: Thu Sep 5 15:51:17 2024 -0400 Add worker spec for annual report worker (#31778) commit db6b1fe8fb56c5eab4f11cc2cd79703739ca2608 Author: Michael Stanclift Date: Thu Sep 5 07:34:13 2024 -0500 [Glitch] Fix radio checkbox visibility in Report dialogs Port b4b639ee4a059385874f143027b75516c8db17d9 to glitch-soc Signed-off-by: Claire commit cb324b5d7c6eba78aad28bfee1c806dc01517f2b Author: Eugen Rochko Date: Thu Sep 5 11:39:59 2024 +0200 [Glitch] Change design of unread conversations in web UI Port ec4c49082edb5f4941bd4e129900628c6b30101e to glitch-soc Signed-off-by: Claire commit 1a0ef0c5262a9b136c6b1a8336a5dcc9b3dcf06f Merge: 5a1d7db309 5acec087ca Author: Claire Date: Thu Sep 5 20:36:25 2024 +0200 Merge commit '5acec087caed4a2fdf0fd8ed11f891222496f321' into glitch-soc/merge-upstream commit 5acec087caed4a2fdf0fd8ed11f891222496f321 Author: Matt Jankowski Date: Thu Sep 5 11:36:05 2024 -0400 Simplify basic presence validations (#29664) commit bc435c63bd99df757d02737674ca2f39aca49438 Author: Eugen Rochko Date: Thu Sep 5 16:57:53 2024 +0200 Change width of columns in advanced web UI (#31762) commit 850478dc140f16d407ade46f791e08f3ceb4bf2e Author: Matt Jankowski Date: Thu Sep 5 10:41:14 2024 -0400 Use `conflicted` configuration for renovate rebase strategy (#31770) commit d58faa20181c95b82ace744494a683b81eea681a Author: Matt Jankowski Date: Thu Sep 5 10:07:17 2024 -0400 Remove references to deprecated `Import` model (#31759) commit f85694acfdaf57c113bba49ca2aef949b16d4141 Author: David Roetzel Date: Thu Sep 5 16:06:58 2024 +0200 Add credentials to redis sentinel configuration (#31768) commit b4b639ee4a059385874f143027b75516c8db17d9 Author: Michael Stanclift Date: Thu Sep 5 07:34:13 2024 -0500 Fix radio checkbox visibility in Report dialogs (#31752) commit e820cc30b8798c1d9e30d4e780c511b5ab395345 Author: Matt Jankowski Date: Thu Sep 5 07:54:27 2024 -0400 Convert invites controller spec to system/request specs (#31755) commit 5b1ae15a368aa800fd045d6e3b6a7500c7196889 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 5 13:06:05 2024 +0200 Update docker.io/ruby Docker tag to v3.3.5 (#31758) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 8fd3e37747b6cdde100bae33ac5d84f3255c24ce Author: Matt Jankowski Date: Thu Sep 5 06:20:27 2024 -0400 Update `parser` and `rubocop` gems (#31760) commit bd8cd0c6e746356eea83ffc4d3185a51e4eeb5dc Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Sep 5 09:50:38 2024 +0000 Update dependency cssnano to v7.0.6 (#31757) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f9712fad1b62e93961280243970c6ccff4d3e3ff Author: James May Date: Thu Sep 5 19:48:42 2024 +1000 Direct link to each authorized_application entry with html anchor (#31677) Co-authored-by: Matt Jankowski commit ba9fd1c32e760582041758105b2844debed640a3 Author: Matt Jankowski Date: Thu Sep 5 05:48:33 2024 -0400 Add coverage for `Account#prepare_contents` callback (#31748) commit b265a654d74f649b6a58debe39a439cc9b07b730 Author: Eugen Rochko Date: Thu Sep 5 11:46:11 2024 +0200 Fix wrong width on content warnings and filters in web UI (#31761) commit eb23d9f0f6d8415551e31d264418de733f71d83d Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Sep 5 09:40:38 2024 +0000 New Crowdin Translations (automated) (#31765) Co-authored-by: GitHub Actions commit ec4c49082edb5f4941bd4e129900628c6b30101e Author: Eugen Rochko Date: Thu Sep 5 11:39:59 2024 +0200 Change design of unread conversations in web UI (#31763) commit 7d91723f052f42a2b5fed365b007767e5717a9bb Author: David Roetzel Date: Thu Sep 5 11:26:49 2024 +0200 Support `REDIS_SENTINEL_PORT` variables (#31767) commit 5a1d7db3092db0690efe87fbcbede9721c5707b7 Merge: 664dfa69b2 cb1eaa10f2 Author: Claire Date: Wed Sep 4 23:01:53 2024 +0200 Merge pull request #2835 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to fe04291af46d7cb9d3439fa73739b2ffb2b53d72 commit 4d5c91e99a3897addd737b12b8b6e3baded6d2d9 Author: Matt Jankowski Date: Wed Sep 4 15:51:40 2024 -0400 Remove `before` block in spec with TODOs which have been TO-DONE already (#31754) commit 4678473e54de33200919ad39f08162aed9350e8a Author: Matt Jankowski Date: Wed Sep 4 15:50:33 2024 -0400 Add `AnnualReport::Source#report_statuses` method for subclasses to use (#31753) commit cb1eaa10f21ae0524a0ea909c6271be2621dfade Author: Claire Date: Wed Sep 4 20:07:23 2024 +0200 Fix glitch-soc-only tests commit 1fb31ad9b1be6d7c629300657d773b803c943ff1 Author: Claire Date: Wed Sep 4 15:43:08 2024 +0200 [Glitch] Fix display name being displayed instead of domain in remote reports Port 585e369e0bb0e17ff5e025385dfefde1e9e81fa3 to glitch-soc Signed-off-by: Claire commit 1d86377ba90c640763cb61ae3a6d79544a92e8df Author: Claire Date: Wed Sep 4 15:28:16 2024 +0200 [Glitch] Fix all notification types being stored without filtering when polling Port fab29ebbe864f0aec84857fc3d87f0d56f4f6b9b to glitch-soc Signed-off-by: Claire commit 5a55180b95b49af1742531b444a289f31f68739e Merge: 664dfa69b2 fe04291af4 Author: Claire Date: Wed Sep 4 19:38:52 2024 +0200 Merge commit 'fe04291af46d7cb9d3439fa73739b2ffb2b53d72' into glitch-soc/merge-upstream Conflicts: - `spec/lib/sanitize/config_spec.rb`: Upstream rewrote top-level `describe` calls to `RSpec.describe`, and glitch-soc had differences in the first few tests because of the wider subset of HTML it accepts. Changed `describe` to `RSpec.describe` as upstream did, keeping glitch-soc's tests. commit 559958f8c540a28c9f41da040fa23a228fadad0b Author: Claire Date: Wed Sep 4 19:35:40 2024 +0200 Fix email language when recipient has no selected locale (#31747) commit e1b5f3fc6f1bb6e77a7cad725a963d008c7ce983 Author: Matt Jankowski Date: Wed Sep 4 13:29:05 2024 -0400 Use `response.parsed_body` for html response checks (#31750) commit fe04291af46d7cb9d3439fa73739b2ffb2b53d72 Author: Matt Jankowski Date: Wed Sep 4 13:19:53 2024 -0400 Use more accurate beginning/ending times in annual report source (#31751) commit ef2bc8ea261838cf31fe4fe11b2954a19c864295 Author: David Roetzel Date: Wed Sep 4 16:10:45 2024 +0200 Add redis sentinel support to ruby part of code (#31744) commit 9ba81eae3e526724dda1c693117aae5c0c235fe9 Author: Emelia Smith Date: Wed Sep 4 16:10:26 2024 +0200 Streaming: Improve Redis connection options handling (#31623) commit 585e369e0bb0e17ff5e025385dfefde1e9e81fa3 Author: Claire Date: Wed Sep 4 15:43:08 2024 +0200 Fix display name being displayed instead of domain in remote reports (#31613) commit fab29ebbe864f0aec84857fc3d87f0d56f4f6b9b Author: Claire Date: Wed Sep 4 15:28:16 2024 +0200 Fix all notification types being stored without filtering when polling (#31745) commit 1fcffa573cf1ca9373ac1b65b2f7e805cc691927 Author: Claire Date: Wed Sep 4 14:54:15 2024 +0200 Fix 500 error in `GET /api/v2_alpha/notifications` when there are no notifications to return (#31746) commit ee55d20fd57fefc3bd865fb0a172bd64e908af3b Author: Claire Date: Wed Sep 4 12:46:28 2024 +0200 Allow `POST /oauth/revoke` through CORS (#31743) commit 36710aec8b2cc622034828f0fe7f6c9a649bc0ce Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 09:57:28 2024 +0000 Update dependency postcss to v8.4.45 (#31742) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 7fb8834dd79b93f164369d252d505ad983be027b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 09:29:14 2024 +0000 Update dependency pino-http to v10.3.0 (#31721) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 44fd0803cea855ef28fc3fe709b3febd9caa8eed Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 09:27:12 2024 +0000 Update dependency pino to v9.4.0 (#31720) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit d8bd9ef19082ab3bccd4a8d2b6727e56de25b335 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 09:25:25 2024 +0000 Update eslint (non-major) (#31684) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ffe29ce4174673cd4b19d0ef330c56e584f284e6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 08:58:28 2024 +0000 Update dependency shoulda-matchers to v6.4.0 (#31731) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 58df00f04d39cf25e7d4d4cbb111bc4cfe1875c4 Author: Matt Jankowski Date: Wed Sep 4 04:52:37 2024 -0400 Extract method for self-referencing records in `AccountStatusCleanupPolicy` (#31244) commit 1c17dca6d9c36371cbcdd0f9a610e9c5eb53718b Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Sep 4 10:42:36 2024 +0200 New Crowdin Translations (automated) (#31741) Co-authored-by: GitHub Actions commit 393a5504e58e05e389781abe7f17e153eb4583eb Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 10:25:37 2024 +0200 Update dependency ruby to v3.3.5 (#31719) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2c6131c9a1957b4847cf6d0b23986824e64c60c2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 10:23:15 2024 +0200 Update dependency test-prof to v1.4.2 (#31733) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3553d6c36f522d4b3365db0139ff40261fc0728b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 08:23:00 2024 +0000 Update dependency aws-sdk-s3 to v1.160.0 (#31735) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 612802b9e5ede73e76e711a65f5c95e451fab0b7 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Sep 4 08:22:44 2024 +0000 Update dependency sass to v1.78.0 (#31739) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a24049db306a97dc5b29da4d794751b4757529bf Author: Michael Stanclift Date: Wed Sep 4 03:20:46 2024 -0500 Fix Corepack prompt on Devcontainer (#31729) commit 14af5b47ac2230937e9244bec41390301c7b0067 Author: Matt Jankowski Date: Wed Sep 4 01:12:40 2024 -0400 Add coverage for model normalizations (#31734) commit 9ed1aab9b7a96076e949d5c47b391376af23d9c8 Author: Matt Jankowski Date: Wed Sep 4 01:12:35 2024 -0400 Remove accidental matcher debug code (#31732) commit f1003b256055e7eaf5d81cc95c370fc1ab82dfde Author: Matt Jankowski Date: Wed Sep 4 01:12:25 2024 -0400 Enable "zero monkey patching" mode in RSpec (#31614) commit 664dfa69b286402fed9dfbdaef4953bf3947f582 Merge: c461a6ab2f 8e3c47aff5 Author: Claire Date: Tue Sep 3 23:26:20 2024 +0200 Merge pull request #2834 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to c9ea91f8683cd5c0cfac14071a17e3956ac6d3b0 commit 8e3c47aff5327c52ce92b4821cf4bb54ece5d441 Author: Christian Schmidt Date: Tue Sep 3 17:55:13 2024 +0200 [Glitch] `frequentlyUsedLanguages` not updated correctly Port 8adf67f2dbde0ae249ccadd8cbd2156e14932f52 to glitch-soc Signed-off-by: Claire commit 663cebbe3b47942b695ad2be8b576539c8b83874 Author: Claire Date: Tue Sep 3 13:37:09 2024 +0200 [Glitch] Fix radio buttons styling in web UI Port 0437dd9e770c293ec4f16d0513d1d5dd65209406 to glitch-soc Signed-off-by: Claire commit fef055db96a45be5aaabba96f0872139ca25ad3c Merge: c461a6ab2f c9ea91f868 Author: Claire Date: Tue Sep 3 21:51:53 2024 +0200 Merge commit 'c9ea91f8683cd5c0cfac14071a17e3956ac6d3b0' into glitch-soc/merge-upstream Conflicts: - `spec/requests/api/v1/timelines/tag_spec.rb`: Upstream refactored this file, while we had a change to switch a default setting. Updated as upstream did. - `spec/views/statuses/show.html.haml_spec.rb`: Upstream refactored this file, while we stubbed different methods. Updated as upstream did, and updated the stubs accordingly. commit c9ea91f8683cd5c0cfac14071a17e3956ac6d3b0 Author: Matt Jankowski Date: Tue Sep 3 12:10:48 2024 -0400 Add coverage for `api/v1/annual_reports` area (#31730) commit 8c928faff3b9de1087b5cf983fd0e575bd2181dc Author: zunda Date: Tue Sep 3 16:03:00 2024 +0000 Refresh Heroku related thingy for heroku-24 stack (#31135) commit 8adf67f2dbde0ae249ccadd8cbd2156e14932f52 Author: Christian Schmidt Date: Tue Sep 3 17:55:13 2024 +0200 `frequentlyUsedLanguages` not updated correctly (#31386) commit 19849eb91d1a7f8b5700abc50cbd84181666fa2c Author: Matt Jankowski Date: Tue Sep 3 11:39:19 2024 -0400 Skip paperclip spoof detector unless opted into attachment processing specs (#31454) commit 69dbc2303826d4a90322892f1fdf96c5ec22a948 Author: Matt Jankowski Date: Tue Sep 3 11:38:38 2024 -0400 Only enable chewy in search-tagged specs (#30583) commit 7c26e5e4a101e2784d8c627055b4caad5812015f Author: Matt Jankowski Date: Tue Sep 3 11:37:45 2024 -0400 Add `Reviewable` model concern (#31152) commit 2f0d0fc127c73d74c7105441bf6dd8163b14450c Author: Matt Jankowski Date: Tue Sep 3 11:36:59 2024 -0400 Add coverage for `CLI::Accounts#fix_duplications` task (#30639) commit e1fa456c7cfa5dc41cec21a94573bc6cb1ec60cc Author: Matt Jankowski Date: Tue Sep 3 11:35:19 2024 -0400 Add `have_cacheable_headers` matcher for responses (#31727) commit 490bdb7944fd2fe323494b3bbd60130673ccfa33 Author: Matt Jankowski Date: Tue Sep 3 11:34:09 2024 -0400 Add coverage for `StatusesHelper#media_summary` method (#31726) commit 46828044481f2a2698483d7bfa4ca36b04980d40 Author: Matt Jankowski Date: Tue Sep 3 11:32:22 2024 -0400 Fix `Rails/ReversibleMigration` cop for `remove_index` (#30832) commit 8922786ef48951a3d4ce719a0e40ef96d2a3792c Author: Matt Jankowski Date: Tue Sep 3 11:32:12 2024 -0400 Fix `RSpec/LetSetup` cop in api/v1/timelines/tag spec (#30796) commit 67faaf555723e8b202620725b7144a183543809e Author: Matt Jankowski Date: Tue Sep 3 11:30:57 2024 -0400 Simplify account model username presence validation spec (#31013) commit fcb83be8b23f64d336d7d3aca2829e9b92ff1df2 Author: Matt Jankowski Date: Tue Sep 3 11:30:13 2024 -0400 Improve coverage specificity for Webhook enable/disable/secret specs (#31194) commit 928390c2ba4e8c6f433025f3eb3ecd89337a2660 Author: Matt Jankowski Date: Tue Sep 3 11:29:32 2024 -0400 Convert `admin/settings` controller specs to system specs (#31548) commit ef4920c6c92b4191b12f0de820d694e8abf14d4a Author: Matt Jankowski Date: Tue Sep 3 11:28:57 2024 -0400 Pull out https/hostname setup for request specs to shared config (#31622) commit dc2f67f69bfd0536564268eb73a79f1eec80cb03 Author: Matt Jankowski Date: Tue Sep 3 11:24:31 2024 -0400 Remove `fuubar` gem and custom rspec `--format` setting (#30594) commit 79b1841805f47cd3931bfdb7d51e1791529c3845 Author: Matt Jankowski Date: Tue Sep 3 11:23:57 2024 -0400 Disable `without_verify_partial_doubles` in statuses/show view spec (#29132) commit 5b595b8a5a0872a5c4eaaca83a60ba7b3652e847 Author: Matt Jankowski Date: Tue Sep 3 11:23:16 2024 -0400 Remove usage of `assigns` in controller specs (#30195) commit ae363f05555115503ab4679e826c6658416c38b5 Author: Claire Date: Tue Sep 3 16:43:34 2024 +0200 Fix spacing between icons and labels in settings/admin interface (#31728) commit 97bb8df1c1ba33631c71df13210aa4b7a9ce06f1 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 3 16:32:59 2024 +0200 Update dependency rspec-rails to v7.0.1 (#31695) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ea0d691e196753b1a5b6747b014bac5b7da50e97 Author: Claire Date: Tue Sep 3 16:32:26 2024 +0200 Add `GET /api/v2_alpha/notifications/:group_key/accounts` (#31725) commit c9641c8070c07caa2da1e2875367a6bad8f0ecca Author: Matt Jankowski Date: Tue Sep 3 09:19:48 2024 -0400 Remove un-needed edge case sort condition in languages helper (#31724) commit 219458d7d4c9bb9ee0ed3c89c72438ee4edc2e1c Author: Matt Jankowski Date: Tue Sep 3 09:18:53 2024 -0400 Convert `tags` controller spec to system and request specs (#31708) commit 0437dd9e770c293ec4f16d0513d1d5dd65209406 Author: Claire Date: Tue Sep 3 13:37:09 2024 +0200 Fix radio buttons styling in web UI (#31723) commit c461a6ab2fc0a22d7687d24591df59d8b5e4d73b Merge: ec3b81fced e9adba60af Author: Claire Date: Tue Sep 3 13:05:14 2024 +0200 Merge pull request #2833 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 611533cd12059d365ca0267342b750e615637bd4 commit e9adba60af868fedc17c7303aa5ef21e7d22a778 Author: Claire Date: Mon Sep 2 22:14:04 2024 +0200 [Glitch] Fix not being able to load more notifications after trimming Port c1795ee9639b56d14687416135c627bb99efbff2 to glitch-soc Signed-off-by: Claire commit ac4002fe08d04e9cdf85adf2eb64a2964c152742 Merge: ec3b81fced 611533cd12 Author: Claire Date: Tue Sep 3 12:12:23 2024 +0200 Merge commit '611533cd12059d365ca0267342b750e615637bd4' into glitch-soc/merge-upstream commit 611533cd12059d365ca0267342b750e615637bd4 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 3 09:53:44 2024 +0000 Update dependency json-schema to v5 (#31499) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4819fc72ee9941e40aea8a1e6d63dff5f479efda Author: Matt Jankowski Date: Tue Sep 3 05:13:54 2024 -0400 Remove `config/secrets.yml` file (#31562) commit 31c00108a447ff482dd7c9f47d9a8eaa3189d9b2 Author: Matt Jankowski Date: Tue Sep 3 05:05:26 2024 -0400 Add first pass coverage for `AnnualReport` class (#31704) commit 2a244e2fdb7cce8288ecf015fd2e370e2ddb0360 Author: Matt Jankowski Date: Tue Sep 3 04:59:37 2024 -0400 Remove unused `merge_context` helper (#31703) commit 3efe98aa9589cec628da0ef928f2e4cd7d16654c Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 3 10:55:24 2024 +0200 Update libretranslate/libretranslate Docker tag to v1.6.0 (#31687) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b8957241af9ffa0b3e4a9a6adaa043799621d421 Author: Matt Jankowski Date: Tue Sep 3 04:41:11 2024 -0400 Add coverage for `JsonLdHelper#uri_from_bearcap` method (#31700) commit 25bbb01666222c5f6a277775b43e6151fc9c39f8 Author: Matt Jankowski Date: Tue Sep 3 04:04:22 2024 -0400 Remove unused helper method in spec (#31699) commit 48379e62e4a4aae0464b6eecba5ee60e528dcce1 Author: Matt Jankowski Date: Tue Sep 3 04:04:00 2024 -0400 Remove unused `User#inactive_message` method (#31698) commit 406b8211f554bfa68058632f849690395c18fe82 Author: Matt Jankowski Date: Tue Sep 3 04:03:25 2024 -0400 Remove unused `Mention#active?` method (#31697) commit 24a0b20408447d44dfb166e6da3aff4856b1827b Author: Matt Jankowski Date: Tue Sep 3 04:03:08 2024 -0400 Use `body_as_json` directly instead of via local var assignment (#31696) commit e5155c50fd1585ac32f7fcc2eb7201e0f67085fd Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Sep 3 08:02:08 2024 +0000 New Crowdin Translations (automated) (#31716) Co-authored-by: GitHub Actions commit 754baf00c01e0f682ec5fcdd024e46d6d48d1502 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 3 10:01:12 2024 +0200 Update dependency inline_svg to v1.10.0 (#31717) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 5f7a3958482762d3907375e3813fb7b44d2b7629 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Sep 3 10:00:52 2024 +0200 Update dependency rspec-rails to v7 (#31710) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a5bbe83dfd456c72855f7e2b25eabe28d37ddb40 Author: Christian Schmidt Date: Mon Sep 2 22:18:09 2024 +0200 media_ids is an array of strings (#31709) commit c1795ee9639b56d14687416135c627bb99efbff2 Author: Claire Date: Mon Sep 2 22:14:04 2024 +0200 Fix not being able to load more notifications after trimming (#31652) commit ec3b81fced26c4e860dba5a37e57cba850206401 Merge: b06907e4e4 402c1e116d Author: Claire Date: Mon Sep 2 21:28:13 2024 +0200 Merge pull request #2832 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 491033c86cc9c29302bfe68cc94dabad82ded4cc commit 402c1e116d1ae1dbb3e7fdb80daf2f842a20189e Merge: b06907e4e4 491033c86c Author: Claire Date: Mon Sep 2 17:43:10 2024 +0200 Merge commit '491033c86cc9c29302bfe68cc94dabad82ded4cc' into glitch-soc/merge-upstream commit 491033c86cc9c29302bfe68cc94dabad82ded4cc Author: Christian Schmidt Date: Mon Sep 2 17:30:48 2024 +0200 Reject status creation with invalid `media_ids` parameter (#31681) commit 40f993b3a0cadfdc9765363e89fdd222bc4c5c4f Author: Matt Jankowski Date: Mon Sep 2 10:25:21 2024 -0400 Use built-in `response.parsed_body` for JSON response specs (#31674) commit 388d5473e11f1e1b4119cf55b9f499cf87f87c8b Author: David Roetzel Date: Mon Sep 2 16:19:55 2024 +0200 Refactor (ruby) redis configuration (#31694) commit a23b3747ac7131a1725748b386109732942120fc Author: Claire Date: Mon Sep 2 11:56:00 2024 +0200 Fix N+1s in grouped notifications (#31638) commit fc870c7e5ac7de96bfa90b67c013f87d62fc8fb2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 2 11:35:43 2024 +0200 Update dependency postcss to v8.4.44 (#31691) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 5439af327646de337b16e6706d412f8fbaffc8a7 Author: Matt Jankowski Date: Mon Sep 2 04:46:50 2024 -0400 Bump Bundler/Ruby versions in lockfile, misc gem version bumps (#31666) commit d1cca521e1a011255b91f9af9e0cdaebab6c0dab Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 2 08:36:56 2024 +0000 Update devDependencies (non-major) (#31686) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 25d5e19b8348f40ee5b0fdb16b9a1f612031e26d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 2 10:35:51 2024 +0200 Update DefinitelyTyped types (non-major) (#31683) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 478155b015d0af5e7caf4e2aab4644cb6c6b9238 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 2 10:35:28 2024 +0200 Update dependency postcss to v8.4.43 (#31676) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2f2b98c8cbc4997a39b121fada23975214479394 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Sep 2 10:35:09 2024 +0200 New Crowdin Translations (automated) (#31671) Co-authored-by: GitHub Actions commit 1701b1fc8011748070084015c3d01cb0d0806cde Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Sep 2 10:26:43 2024 +0200 Update dependency axios to v1.7.7 (#31670) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b06907e4e4725cf28dc53d65e5e166a16e2b814c Author: Claire Date: Sat Aug 31 18:41:25 2024 +0200 Rewrite favourite modal as a Typescript functional component, use revamped design (#2831) commit a859b0c7e7f99e90282a21a09af6987d1e387c0f Merge: 5f8f8cc98f ee2c38fcb8 Author: Claire Date: Sat Aug 31 18:41:10 2024 +0200 Merge pull request #2829 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 02633d6ebbe944a8769c8f2229fa9e0d6c7d1142 commit 5f8f8cc98f5101db827ffd9e264ed32ba4b7bd85 Author: Claire Date: Sat Aug 31 17:33:06 2024 +0200 Fix crowdin upload workflow not running on glitch-soc (#2830) commit ee2c38fcb8141584644928ece32461768a59fba4 Author: Claire Date: Fri Aug 30 11:42:48 2024 +0200 [Glitch] Change background color of notifications on private messages Port 3ddeaca863999270719752aff49d55d73ae5f412 to glitch-soc Signed-off-by: Claire commit 4f1da814a873608f8dd5d14ff7ec011c80876013 Author: Claire Date: Fri Aug 30 11:37:39 2024 +0200 [Glitch] Fix inconsistencies between code and notification source translation strings Port 35538fe694765d0fa20bb85047680704f85be795 to glitch-soc Signed-off-by: Claire commit 6f35e93f726154c031d3de53241d7d1c62aa843a Merge: d46bf54925 02633d6ebb Author: Claire Date: Sat Aug 31 16:06:04 2024 +0200 Merge commit '02633d6ebbe944a8769c8f2229fa9e0d6c7d1142' into glitch-soc/merge-upstream commit 02633d6ebbe944a8769c8f2229fa9e0d6c7d1142 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 30 09:48:54 2024 +0000 Update dependency jsdom to v25 (#31578) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3655e3204fbf70d14ce60e4aa67a331e63668e62 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 30 09:46:53 2024 +0000 Update dependency @babel/runtime to v7.25.6 (#31649) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 85e8d1f2859742c3f455ed6b70ba06b4ee86d249 Author: Matt Jankowski Date: Fri Aug 30 05:46:09 2024 -0400 Use rails configuration storage for paperclip path (#31651) commit 3ddeaca863999270719752aff49d55d73ae5f412 Author: Claire Date: Fri Aug 30 11:42:48 2024 +0200 Change background color of notifications on private messages (#31657) commit 35538fe694765d0fa20bb85047680704f85be795 Author: Claire Date: Fri Aug 30 11:37:39 2024 +0200 Fix inconsistencies between code and notification source translation strings (#31658) commit 1ee1c329cc12fa7a167eb312d6c91693f56327d9 Author: Matt Jankowski Date: Fri Aug 30 03:15:28 2024 -0400 Convert `admin/announcements` controller spec to system spec (#31655) commit 92eba9096b6a75b46befb5c271755a6167ac342c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Aug 30 09:12:56 2024 +0200 New Crowdin Translations (automated) (#31656) Co-authored-by: GitHub Actions commit b0a30967d7f2a53aeaa3d3a630b0e012e5254231 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 30 09:05:39 2024 +0200 Update dependency thor to v1.3.2 (#31654) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ad0a28a8bfb8b527eae11cdc29829d87b07db53c Author: Claire Date: Thu Aug 29 14:39:07 2024 +0200 Add `grouped_types` parameter to allow clients to restrict which notifications types get grouped (#31594) commit 662f87dbe9c23e505fc9ffa3f21d6a623f4df974 Author: Matt Jankowski Date: Thu Aug 29 04:52:29 2024 -0400 Use `MediaAttachment.supported_mime_types` method where relevant (#31635) commit 02585d87894c52bb182260b3f33e6212a90e9ca7 Author: Matt Jankowski Date: Thu Aug 29 04:46:00 2024 -0400 Convert `media` controller spec to request spec (#31634) commit b9269c8d3800bab8f1d37bfec755eb7b0e860553 Author: Matt Jankowski Date: Thu Aug 29 04:38:17 2024 -0400 Convert `admin/reset` controller spec to system spec (#31643) commit 5d725b2c12516f0dccc79cee47fd1f616082a21b Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Aug 29 10:30:39 2024 +0200 New Crowdin Translations (automated) (#31647) Co-authored-by: GitHub Actions commit 4f4be654529429ff1886ce5b11ef1d1189d80d2d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 29 10:30:09 2024 +0200 Update dependency @rails/ujs to v7.1.400 (#31628) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 8bd8238d4156a338e9e3790738fda80a29103789 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 29 08:20:02 2024 +0000 Update dependency selenium-webdriver to v4.24.0 (#31633) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 099657be9a4f261e6502212689250b0af47b64da Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 29 10:19:38 2024 +0200 Update dependency flatware-rspec to v2.3.3 (#31636) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit dc7412c15f3e447a06cd0046c0a35c721878d49d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 29 10:18:41 2024 +0200 Update opentelemetry-ruby (non-major) (#31646) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f6fb9b75dbc10cee8beee4bcb84dd08e821baf1b Author: Emelia Smith Date: Wed Aug 28 12:40:37 2024 +0200 Streaming: Fix BIND IPv6 handling (#31624) commit 3c412578c916f4bdebb2abd3ca793f8fad00f921 Author: HolgerHuo <50446405+HolgerHuo@users.noreply.github.com> Date: Wed Aug 28 17:28:48 2024 +0800 update: max_media_attachments follow server advertised value (#31616) commit 26d6d291c37194c40e3e5acbf4d8bae6734c2ace Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Aug 28 10:59:15 2024 +0200 New Crowdin Translations (automated) (#31627) Co-authored-by: GitHub Actions commit 0ef636f72d5cb5df93e558ffb0489b2804f4a815 Author: Matt Jankowski Date: Wed Aug 28 03:58:40 2024 -0400 Convert `shares` controller spec to system spec (#31619) commit 00586d27cb0f84377614a5ca2a3683c9fe9b74a5 Author: Matt Jankowski Date: Wed Aug 28 03:56:07 2024 -0400 Convert `instance_actor` controller spec to request spec (#31621) commit d46bf549251508951dceb623acfc4ae20251f8db Merge: 51311f97fb 435ff8e550 Author: Claire Date: Tue Aug 27 22:56:55 2024 +0200 Merge pull request #2828 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 04f0468016b450ace8e0ce707b4c21aa18b51262 commit 435ff8e550fbcbf83e7eca1bccafe2817252e666 Author: Claire Date: Tue Aug 27 16:55:51 2024 +0200 [Glitch] Add ability for admins to force grouped notifications in web UI Port c73868cd78592780cb9e0be6985fe2f34b7c91cd to glitch-soc Signed-off-by: Claire commit e15fad27bceaa3252d8778c1695526b9b8e127d2 Author: Eugen Rochko Date: Mon Aug 26 19:12:17 2024 +0200 [Glitch] Change design of boost modal in web UI Port 29b9642b315a30ca5d3dd9375fa85ab8fe74ad52 to glitch-soc Signed-off-by: Claire commit d3629d191f1cb1b47b872caed1ea303240ec26bd Author: Emelia Smith Date: Mon Aug 26 18:42:46 2024 +0200 [Glitch] Add quick links to Administration and Moderation Reports from Web UI Port d820c0883d5557f011b4de8fafa1ff9f68b0d5de to glitch-soc Signed-off-by: Claire commit 94d8cdc494986ab4176ab32dc44d7bfb7224a499 Merge: 51311f97fb 04f0468016 Author: Claire Date: Tue Aug 27 20:00:07 2024 +0200 Merge commit '04f0468016b450ace8e0ce707b4c21aa18b51262' into glitch-soc/merge-upstream commit 51311f97fb1b1627ebaaa7362c20713b39fc514e Merge: 11014ac414 33ad67fcea Author: Claire Date: Tue Aug 27 19:09:20 2024 +0200 Merge pull request #2827 from ClearlyClaire/glitch-soc/fixes/report-old-notifications-target Fix target account link in old report notifications commit 33ad67fcea52c4f8251b8774a1c965d53d8c0a34 Author: Claire Date: Tue Aug 27 18:11:14 2024 +0200 Fix target account link in old report notifications commit 04f0468016b450ace8e0ce707b4c21aa18b51262 Author: Renaud Chaput Date: Tue Aug 27 18:05:19 2024 +0200 Fix streaming image with Docker Compose (#31615) commit 6eba057e644d427428a9540c9a8d4906dde41f64 Author: Matt Jankowski Date: Tue Aug 27 11:23:08 2024 -0400 Cache rspec persistence file between CI runs (#31065) commit 3959f36d1913e1baa163dc86f6d0776d02b37ca2 Author: Matt Jankowski Date: Tue Aug 27 10:59:56 2024 -0400 Add checks about response body content to admin/dash spec (#30716) commit c73868cd78592780cb9e0be6985fe2f34b7c91cd Author: Claire Date: Tue Aug 27 16:55:51 2024 +0200 Add ability for admins to force grouped notifications in web UI (#31610) commit da42e9d44618a09aca57b5c229e5f0ebc24e66fa Author: Renaud Chaput Date: Tue Aug 27 14:51:34 2024 +0200 Fix typo in Compose file (#31612) commit c513fdb9c5f69a7ae9d5efd89aa84778787096a7 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 27 11:51:29 2024 +0200 Update dependency pundit to v2.4.0 (#31598) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 48f4e5444d1676414e7cf8e1344fab68fc61644b Author: Matt Jankowski Date: Tue Aug 27 05:44:16 2024 -0400 Convert `media_proxy` controller spec to request spec (#31600) commit 4118688fba789a84956d77415c87d049d46a7bf4 Author: Emelia Smith Date: Tue Aug 27 10:40:04 2024 +0200 Streaming: Refactor move database and redis logic into separate files (#31567) commit a7f8417795a7306e10c9bec7202359a8e73f6e46 Author: Matt Jankowski Date: Tue Aug 27 04:12:39 2024 -0400 Convert "CSV export" settings controller specs to request specs (#31601) commit 38a3466741cfa148692c7aa58d8cf207793ac3c1 Author: Matt Jankowski Date: Tue Aug 27 03:55:25 2024 -0400 Convert `api/oembed` controller spec to request spec (#31605) commit 0e7c88aa6df12e2927396518f7663b07fb9660f2 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Aug 27 09:54:58 2024 +0200 New Crowdin Translations (automated) (#31609) Co-authored-by: GitHub Actions commit c09d232ee33f14a17b32ead7caa3aa2332d4b3d3 Author: Matt Jankowski Date: Tue Aug 27 03:42:35 2024 -0400 Convert `api/web/settings` controller spec to request spec (#31606) commit 14d7fe05d05473a5b078ad397cc078f1b033c5b5 Author: Matt Jankowski Date: Tue Aug 27 03:40:18 2024 -0400 Use `describe` instead of `context` in top-level spec declaration (#31607) commit 11014ac414c29d15f8b46a3eb4b0352ce641f05a Merge: ccd7eb397a 8f678a3cf4 Author: Claire Date: Mon Aug 26 21:08:23 2024 +0200 Merge pull request #2826 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to e38ce3beb7b83f43ef6e6f144c19b186c393910c commit 29b9642b315a30ca5d3dd9375fa85ab8fe74ad52 Author: Eugen Rochko Date: Mon Aug 26 19:12:17 2024 +0200 Change design of boost modal in web UI (#31555) commit 8f678a3cf4e6f0c29ab03442141f2ddbcc78b489 Author: Claire Date: Mon Aug 26 19:08:42 2024 +0200 Fix tests for glitch-soc commit 2379bfe3ea9f1612b865a45c547b9f96059d22ba Author: Claire Date: Mon Aug 26 18:38:34 2024 +0200 [Glitch] Fix spurious loading bar middleware usage Port e38ce3beb7b83f43ef6e6f144c19b186c393910c to glitch-soc Signed-off-by: Claire commit 11b8017b4513ee8e3f1dd8bad6dce42b6c55353b Merge: ccd7eb397a e38ce3beb7 Author: Claire Date: Mon Aug 26 18:52:33 2024 +0200 Merge commit 'e38ce3beb7b83f43ef6e6f144c19b186c393910c' into glitch-soc/merge-upstream commit d820c0883d5557f011b4de8fafa1ff9f68b0d5de Author: Emelia Smith Date: Mon Aug 26 18:42:46 2024 +0200 Add quick links to Administration and Moderation Reports from Web UI (#24838) commit e38ce3beb7b83f43ef6e6f144c19b186c393910c Author: Claire Date: Mon Aug 26 18:38:34 2024 +0200 Fix spurious loading bar middleware usage (#31592) commit 4c2534d12e805638bcb70e1c1e13de351527f607 Author: Matt Jankowski Date: Mon Aug 26 11:53:48 2024 -0400 Convert "static page" controller specs to system specs (#31599) commit 963c1309a40b797b9b32d21208d9812ad25f6304 Author: Matt Jankowski Date: Mon Aug 26 11:20:05 2024 -0400 Cache asset compilation results on CI (#30868) commit dbe0ee8a81516eccbbc6d47278e727b96cba841e Author: Matt Jankowski Date: Mon Aug 26 11:00:05 2024 -0400 Convert `emojis` controller spec to request spec (#31597) Co-authored-by: Claire commit 5172d84946eba2b844a3aee3896e270b59f66695 Author: Matt Jankowski Date: Mon Aug 26 10:37:23 2024 -0400 Convert `manifest` controller spec to request spec (#31596) commit 36ccdcc9e12d35399742cbe05c2589d69dbbbc99 Author: Matt Jankowski Date: Mon Aug 26 10:36:31 2024 -0400 Convert "custom css" controller spec to request spec (#31595) commit 641ae6a2cf7eac47599620bc9cb24095829418e0 Author: Matt Jankowski Date: Mon Aug 26 08:17:35 2024 -0400 Convert health check endpoint controller spec to request spec (#31565) commit e3516fa8cfa81c07776e02d8c5161fffc585ffa5 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 13:01:09 2024 +0200 Update Yarn to v4.4.1 (#31575) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a3c33c77ab3737dfef9d1d0303faa6dfec9e9e20 Author: Claire Date: Mon Aug 26 13:01:00 2024 +0200 Fix typo in changelog (#31591) commit 3e1bd9756eff27e73d441252427494f3df975ad7 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 08:50:40 2024 +0000 Update dependency brakeman to v6.2.1 (#31553) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ccc0aea767bd8c01e9b401f4367c8e2f01d4c64f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 08:48:04 2024 +0000 Update dependency bundler-audit to v0.9.2 (#31558) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit d0822a0e78cac93cc0350e8e6abe7a89b536e836 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 08:47:21 2024 +0000 Update dependency test-prof to v1.4.1 (#31561) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0422a5c208dc9ca13684690c5a83e7363ca797d3 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 08:44:32 2024 +0000 Update dependency axios to v1.7.5 (#31564) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c245a2044ecf5418b8010e3e8340a5899db38cf3 Author: Emelia Smith Date: Mon Aug 26 10:08:21 2024 +0200 Streaming: Refactor to use metrics.$name instead of destructuring (#31566) commit f9f4006a1b0a388bf2fadfe8949f5df30aab6ecd Author: Renaud Chaput Date: Mon Aug 26 09:51:21 2024 +0200 Update `omniauth-rails_csrf_protection` (#31552) commit 4cc589e53351a939e10887faf791ae84b15850d8 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 07:35:53 2024 +0000 Update dependency jsdom to v24.1.3 (#31577) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a6df12530397f046d9c7c787bf497a0c7606a453 Author: Matt Jankowski Date: Mon Aug 26 03:35:33 2024 -0400 Fix `Rails/CompactBlank` cop (#31581) commit bcc4b1078cf44515ef1b4193b004cb94ecfd288c Author: Matt Jankowski Date: Mon Aug 26 03:35:07 2024 -0400 Fix `Rails/RootPathnameMethods` cop (#31582) commit 5bcfe8d4213a9e890971dc06ce32e45541491fb5 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 09:34:16 2024 +0200 Update dependency @types/react to v18.3.4 (#31586) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a6906e045b3b73627ee09e26e5fa1f7659f78938 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 26 09:34:01 2024 +0200 Update devDependencies (non-major) (#31587) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 626d44b6c6d1843288ea6a3bfaa58ab337ab9c82 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Aug 26 09:25:39 2024 +0200 New Crowdin Translations (automated) (#31572) Co-authored-by: GitHub Actions commit 3bfa5ffe29e14ad4a4cdfa7ff94d4fa756fcb193 Author: Claire Date: Mon Aug 26 09:21:39 2024 +0200 Update dependency rexml (#31590) commit ccd7eb397a0accaaae9875357318f8e4d9e3f506 Merge: 49671fe253 f5d26225ed Author: Claire Date: Sat Aug 24 12:46:57 2024 +0200 Merge pull request #2825 from ClearlyClaire/glitch-soc/fixes/nightly-tagging Update github actions commit f5d26225eda4fcc5a96d51f08c53f600f9c14cf3 Author: Claire Date: Sat Aug 24 12:33:09 2024 +0200 Re-enable PR-needs-rebase action for glitch-soc (was disabled upstream for forks) commit 117af5847a9c06850eaa145f0585f319eb7f993b Author: Claire Date: Sat Aug 24 12:32:48 2024 +0200 Disable tagging nightly images as latest commit 49671fe253c6d4fa12ae91de845919c67e087063 Merge: ae9bd635e7 d0529b810a Author: Claire Date: Sat Aug 24 12:30:57 2024 +0200 Merge pull request #2824 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 97f6baf977212e84125ac325176ad305ad5b068a commit d0529b810a9d8e1f4e4ae34bae1e95c86d0a8ef1 Merge: 532b53eece 97f6baf977 Author: Claire Date: Sat Aug 24 12:06:31 2024 +0200 Merge commit '97f6baf977212e84125ac325176ad305ad5b068a' into glitch-soc/merge-upstream commit 97f6baf977212e84125ac325176ad305ad5b068a Author: Claire Date: Fri Aug 23 18:07:32 2024 +0200 Bump version to v4.3.0-beta.1 (#30989) commit 77c055b78ca3df0e17cd42414e6ff6fac85c160a Author: Michael Stanclift Date: Fri Aug 23 11:00:07 2024 -0500 Update Docker Compose for 4.3-beta (#31554) commit c493689e84eadf2f9c055d9f2ce688d8d0b1b291 Author: Claire Date: Fri Aug 23 14:55:54 2024 +0200 Change output format of `repo:changelog` task (#31546) commit ae9bd635e76e85501121a11c58e42223339eda63 Merge: eae232fd01 532b53eece Author: Claire Date: Fri Aug 23 12:34:34 2024 +0200 Merge pull request #2822 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to e08d22724d9baf6c639466507c2b117788e5b8de commit 62be0234d5d1788c12d0c9504fd4243099518521 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Aug 23 10:59:31 2024 +0200 New Crowdin Translations (automated) (#31559) Co-authored-by: GitHub Actions commit 0374918746e3943a655712529ddc14b71aecc9c2 Author: David Roetzel Date: Fri Aug 23 10:20:32 2024 +0200 Add spec for doorkeeper behavior around issuing tokens (#31545) commit 6ec768668ec521a5752ced29924dff0f4591d083 Author: Matt Jankowski Date: Thu Aug 22 16:28:54 2024 -0400 Remove `nsa` statsd integration (replaced by OpenTelemetry) (#30240) commit 532b53eeceb4c370679f6dd1098b59cd1923f69c Author: Claire Date: Thu Aug 22 22:23:06 2024 +0200 Fix assets build issue due to slightly different webpack config commit e18bd0450a78214ab1d5efde41d1041617a7989a Author: Claire Date: Thu Aug 22 22:17:33 2024 +0200 Extract strings removed upstream commit 7ce079cd2634c97b1154358014c14b92eec686ff Author: Claire Date: Thu Aug 22 20:57:22 2024 +0200 [Glitch] Fix missing CSS in moderation interface Port e08d22724d9baf6c639466507c2b117788e5b8de to glitch-soc Signed-off-by: Claire commit dc70ef25b26c6692e72f8a8c613d1b27ae9da236 Merge: eae232fd01 e08d22724d Author: Claire Date: Thu Aug 22 22:09:10 2024 +0200 Merge commit 'e08d22724d9baf6c639466507c2b117788e5b8de' into glitch-soc/merge-upstream commit eae232fd01081cfd3b79537e29ba09a5ccb45986 Merge: fd73999a84 9f2d3c721c Author: Claire Date: Thu Aug 22 22:00:04 2024 +0200 Merge pull request #2821 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 98237207e67697abffc6b141f2388e3d8c925260 commit e08d22724d9baf6c639466507c2b117788e5b8de Author: Claire Date: Thu Aug 22 20:57:22 2024 +0200 Fix missing CSS in moderation interface (#31550) commit 9f2d3c721c182ff31f694b87f2049337ff3ddec1 Author: Claire Date: Thu Aug 22 15:42:02 2024 +0200 [Glitch] Hide multiple selection bar for notification requests when no notificion requests are loaded Port abe292b0ec7f1e5ae0871db0492e191c65a18784 to glitch-soc Signed-off-by: Claire commit 37f20514d31c72404cb90dfb46d582fbda4152cc Author: Emelia Smith Date: Thu Aug 22 10:42:33 2024 +0200 [Glitch] Add button to view the Hashtag on the instance from Hashtags in Moderation UI Port 376088f6da71e0250e144cc57b42d0dc18822317 to glitch-soc Signed-off-by: Claire commit 18556d3e9b81bf9f5d3604d10cdb423d634ce38c Merge: fd73999a84 98237207e6 Author: Claire Date: Thu Aug 22 19:48:43 2024 +0200 Merge commit '98237207e67697abffc6b141f2388e3d8c925260' into glitch-soc/merge-upstream Conflicts: - `app/helpers/application_helper.rb`: Upstream refactored some helpers and moved them in another file. Not a real conflict, but glitch-soc had adjacent glitch-only definitions. Kept glitch-soc definitions where they are and moved upstream ones as upstream did. commit 500f4925a5e5ee45f2576ee3b0c603a0ab851840 Author: Eugen Rochko Date: Thu Aug 22 19:12:35 2024 +0200 Change how content warnings and filters are displayed in web UI (#31365) commit 98237207e67697abffc6b141f2388e3d8c925260 Author: Claire Date: Thu Aug 22 15:42:04 2024 +0200 Fix unnecessary “next” link when API returns fewer notification requests than requested (#31541) commit abe292b0ec7f1e5ae0871db0492e191c65a18784 Author: Claire Date: Thu Aug 22 15:42:02 2024 +0200 Hide multiple selection bar for notification requests when no notificion requests are loaded (#31540) commit 61d9704f6d768f10f8f4a41e7bc3145003586b6e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 22 11:51:30 2024 +0000 Update babel monorepo to v7.25.4 (#31542) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c70dc5f0d7c05f4886c2ba748c0e407988267cdc Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 22 13:50:46 2024 +0200 Update dependency node to 20.17 (#31531) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4a968cb7a97edd2a613a39fbd8b3f339d6c5002f Author: Renaud Chaput Date: Thu Aug 22 12:04:27 2024 +0200 Add `icon` field to instance endpoint (#30205) commit 376088f6da71e0250e144cc57b42d0dc18822317 Author: Emelia Smith Date: Thu Aug 22 10:42:33 2024 +0200 Add button to view the Hashtag on the instance from Hashtags in Moderation UI (#31533) commit 170c6e9733d38f538d20483c11ea72cab2216e44 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 22 08:27:46 2024 +0000 Update dependency opentelemetry-instrumentation-active_job to v0.7.7 (#31530) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit fd93f817e75071b8a6d67e063c128b5cb9f45626 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 22 10:15:54 2024 +0200 Update dependency aws-sdk-s3 to v1.159.0 (#31518) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f86d16adbaeaa97034458b4dbd42fdb84e888fe2 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Aug 22 10:04:56 2024 +0200 New Crowdin Translations (automated) (#31536) Co-authored-by: GitHub Actions commit fd73999a842d4574be1d63a98141b107b5b199ac Merge: 0cd60fdb82 1e814f58cc Author: Claire Date: Wed Aug 21 22:41:10 2024 +0200 Merge pull request #2820 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 2da687a28b509025343d3d8ca17753de9b128e8f commit 1e814f58cc1e29c09df32d2f54b56b1f55eaae24 Author: Claire Date: Wed Aug 21 19:05:02 2024 +0200 [Glitch] Remove dead CSS code Port 2da687a28b509025343d3d8ca17753de9b128e8f to glitch-soc Signed-off-by: Claire commit fa2e758152055d92130b64c4743839ea4481d0cc Merge: 0cd60fdb82 2da687a28b Author: Claire Date: Wed Aug 21 20:32:02 2024 +0200 Merge commit '2da687a28b509025343d3d8ca17753de9b128e8f' into glitch-soc/merge-upstream commit 0cd60fdb82ed1bb72ee3bdfc402a10d3af88c17b Merge: d815b3d100 3ffdb7cdac Author: Claire Date: Wed Aug 21 20:31:08 2024 +0200 Merge pull request #2819 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to edeae945c0c9d6318d489ab720587621545063d0 commit 2da687a28b509025343d3d8ca17753de9b128e8f Author: Claire Date: Wed Aug 21 19:05:02 2024 +0200 Remove dead CSS code (#31527) commit 3ffdb7cdacb28f72d1990007515efb56f074aca3 Author: Claire Date: Wed Aug 21 17:55:35 2024 +0200 [Glitch] Remove fontawesome leftovers Port edeae945c0c9d6318d489ab720587621545063d0 to glitch-soc Signed-off-by: Claire commit 24849cdb1f66b8485cb7406de167d03f792e1e89 Author: Claire Date: Wed Aug 21 16:41:31 2024 +0200 [Glitch] Add automatic notification polling for grouped notifications Port d67e11733e4159c736f4370ee7ea86240a297bb7 to glitch-soc Signed-off-by: Claire commit a9cef5c324db35a62e021d88384f13c02e701ae5 Author: KMY(雪あすか) Date: Wed Aug 21 22:11:36 2024 +0900 [Glitch] Fix boost dialog visibility selection not being taken into account Port 01a757d306276213276580a31ecbeffa21d88076 to glitch-soc Signed-off-by: Claire commit 66bc8d5717dbba486e7a95421eda33ec1b6dffdb Author: Claire Date: Wed Aug 21 12:25:14 2024 +0200 [Glitch] Fix distracting and confusing always-showing scrollbar track in boost confirmation modal Port e48a64d3b541087acd101f9149c956ffb07119f3 to glitch-soc Signed-off-by: Claire commit b2e6f11b813bd8a5faf7c5f4c7c7c13a93438b60 Author: mogaminsk Date: Wed Aug 21 17:56:36 2024 +0900 [Glitch] Change translation strings of grouped notification label to have full context Port 8c7642cd186315f364a3a2d9090ebd87c2d684c6 to glitch-soc Signed-off-by: Claire commit bae0b81779ccf798a7876f460c9841fb40540126 Author: Eugen Rochko Date: Wed Aug 21 09:08:58 2024 +0200 [Glitch] Change hints for missing remote content in web UI Port b06c7b6b5ae28cb81e5ba8ba632ebc629d1fed57 to glitch-soc Signed-off-by: Claire commit 0cec9077a42f75d627e9ba81382cb54312622f37 Merge: d815b3d100 edeae945c0 Author: Claire Date: Wed Aug 21 18:44:21 2024 +0200 Merge commit 'edeae945c0c9d6318d489ab720587621545063d0' into glitch-soc/merge-upstream Conflicts: - `spec/requests/api/v2/instance_spec.rb`: Upstream added a test for a new attribute, next to a line we modified in glitch-soc because of a different default value. Updated as upstream's did, keeping glitch-soc's default value. commit edeae945c0c9d6318d489ab720587621545063d0 Author: Claire Date: Wed Aug 21 17:55:35 2024 +0200 Remove fontawesome leftovers (#31525) commit 19a1acb38b66c9d9f6e1ca937c9f163c4ffe9194 Author: Claire Date: Wed Aug 21 16:54:59 2024 +0200 Add `api_versions` to `/api/v2/instance` (#31354) commit d67e11733e4159c736f4370ee7ea86240a297bb7 Author: Claire Date: Wed Aug 21 16:41:31 2024 +0200 Add automatic notification polling for grouped notifications (#31513) commit 01a757d306276213276580a31ecbeffa21d88076 Author: KMY(雪あすか) Date: Wed Aug 21 22:11:36 2024 +0900 Fix boost dialog visibility selection not being taken into account (#31523) commit e48a64d3b541087acd101f9149c956ffb07119f3 Author: Claire Date: Wed Aug 21 12:25:14 2024 +0200 Fix distracting and confusing always-showing scrollbar track in boost confirmation modal (#31524) commit 8c7642cd186315f364a3a2d9090ebd87c2d684c6 Author: mogaminsk Date: Wed Aug 21 17:56:36 2024 +0900 Change translation strings of grouped notification label to have full context (#31486) commit b91264b1f3dae6f2042c0f2320db0ba7267bba0e Author: Claire Date: Wed Aug 21 10:15:12 2024 +0200 Update dependency fugit (#31522) commit 3994195fea28d00611231da84c64eebcb277c7a8 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Aug 21 07:19:16 2024 +0000 New Crowdin Translations (automated) (#31521) Co-authored-by: GitHub Actions commit b06c7b6b5ae28cb81e5ba8ba632ebc629d1fed57 Author: Eugen Rochko Date: Wed Aug 21 09:08:58 2024 +0200 Change hints for missing remote content in web UI (#31516) commit d815b3d1009ae47a6600fa27c14369fca2cdf8f5 Merge: 89a61954a7 bdc0e0d27e Author: Claire Date: Tue Aug 20 22:02:24 2024 +0200 Merge pull request #2818 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 9ba7c90151463a6e4f7952317253fe8c113e9b0a commit bdc0e0d27e86e95b19b1a48e8f66532fd323aa2c Author: Claire Date: Tue Aug 20 18:18:33 2024 +0200 [Glitch] Fix non-grouped notifications not loading on page load Port 9ba7c90151463a6e4f7952317253fe8c113e9b0a to glitch-soc Signed-off-by: Claire commit 4c85fec9939a144bd03c3ce93022db3cf61f21cf Author: Matt Jankowski Date: Tue Aug 20 11:59:47 2024 -0400 [Glitch] Remove `font-awesome` npm package Port 4c4bcad866f513f69d6ea74e5acfdf3fc5f469ff to glitch-soc Signed-off-by: Claire commit e19b3aaaba9ed4267e18ef2b0fb953232c2f2aae Author: Renaud Chaput Date: Tue Aug 20 17:56:44 2024 +0200 [Glitch] Update CSS color variables to match our latest design system Port 4016fd512898e9226a40b1973a742cb1e827ae3b to glitch-soc Signed-off-by: Claire commit eb9405bed9f2167bc53b116170858df6e25a09b5 Author: Eugen Rochko Date: Tue Aug 20 16:03:09 2024 +0200 [Glitch] Fix margin in follow notification in web UI Port 05b438005101dff2321bc645a5c7101fccdf342f to glitch-soc Signed-off-by: Claire commit 57c38b91563b6eedff1bb7f73bdf861c953c63b2 Author: Michael Stanclift Date: Tue Aug 20 02:48:51 2024 -0500 [Glitch] Harmonize persistent scrollbar styles Port 2f01f5f4ea886c4a1bec2148d0ca82da5ae67f0c to glitch-soc Signed-off-by: Claire commit 4e5d85b63797b3dda8fce33a84807fbc496a74da Author: Renaud Chaput Date: Tue Aug 20 00:11:58 2024 +0200 [Glitch] Improve the list selection UI for notification requests Port 98bf2fc27c6204527d8da5bc3847bd8406f1bfe8 to glitch-soc Signed-off-by: Claire commit f5c0c32edd9826725512db350f6b53fafc6119a2 Merge: 89a61954a7 9ba7c90151 Author: Claire Date: Tue Aug 20 18:31:50 2024 +0200 Merge commit '9ba7c90151463a6e4f7952317253fe8c113e9b0a' into glitch-soc/merge-upstream Conflicts: - `app/javascript/material-icons/400-24px/chat.svg`: Glitch-soc used this one but not upstream. Upstream pulled a presumably more up-to-date version of the file. Switched to upstream's version. - `app/views/layouts/application.html.haml`: Upstream removed use of font-awesome. I hope we are ready. - `app/views/layouts/embedded.html.haml`: Upstream removed use of font-awesome. I hope we are ready. - `app/views/layouts/error.html.haml`: Upstream removed use of font-awesome. I hope we are ready. commit 9ba7c90151463a6e4f7952317253fe8c113e9b0a Author: Claire Date: Tue Aug 20 18:18:33 2024 +0200 Fix non-grouped notifications not loading on page load (#31514) commit f91403ccaaf480891bb37746ad2634d3792a094c Author: Matt Jankowski Date: Tue Aug 20 11:59:59 2024 -0400 Remove unused `fa_icon` helper method (#31511) commit 4c4bcad866f513f69d6ea74e5acfdf3fc5f469ff Author: Matt Jankowski Date: Tue Aug 20 11:59:47 2024 -0400 Remove `font-awesome` npm package (#31512) commit 4016fd512898e9226a40b1973a742cb1e827ae3b Author: Renaud Chaput Date: Tue Aug 20 17:56:44 2024 +0200 Update CSS color variables to match our latest design system (#31510) commit 6c26fb0ed63f080627ede26b73ed3f4f8e0e5220 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 20 16:36:14 2024 +0200 Update dependency core-js to v3.38.1 (#31507) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 05b438005101dff2321bc645a5c7101fccdf342f Author: Eugen Rochko Date: Tue Aug 20 16:03:09 2024 +0200 Fix margin in follow notification in web UI (#31508) commit 711e1fce0a6f0b883125614aade04d78bb4217ce Author: Claire Date: Tue Aug 20 15:54:08 2024 +0200 Fix pagination parameters in `GET /api/v2_alpha/notificatins` (#31509) commit fa2e7b1708385c4277a67f04e540cc39fc661390 Author: Matt Jankowski Date: Tue Aug 20 07:52:45 2024 -0400 Migrate fontawesome->material in more views (#31360) commit 3be1b1eaaee1e315e4612012f431619b20861107 Author: Matt Jankowski Date: Tue Aug 20 07:52:27 2024 -0400 Use material symbol for filters/statuses views (#31371) commit 71405eabfca60776b0351b022e61248861cce971 Author: Matt Jankowski Date: Tue Aug 20 07:48:15 2024 -0400 Use material symbols in table link helper (#31359) commit c75f7262ed32b7eb12aea154b0a41f876b7b58e9 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Aug 20 07:59:21 2024 +0000 New Crowdin Translations (automated) (#31504) Co-authored-by: GitHub Actions commit 2f01f5f4ea886c4a1bec2148d0ca82da5ae67f0c Author: Michael Stanclift Date: Tue Aug 20 02:48:51 2024 -0500 Harmonize persistent scrollbar styles (#31445) commit 98bf2fc27c6204527d8da5bc3847bd8406f1bfe8 Author: Renaud Chaput Date: Tue Aug 20 00:11:58 2024 +0200 Improve the list selection UI for notification requests (#31457) commit a7a2ff6c1d61223220590ccb3af4bfa0480587c1 Author: Michael Stanclift Date: Mon Aug 19 14:44:28 2024 -0500 Use Dockerfile ADD to obtain ffmpeg and libvips source (#31498) commit 89a61954a744b7dbf383e9ec7cea57f28f75a12e Merge: ec1ee7a732 bfd01110d8 Author: Claire Date: Mon Aug 19 20:43:17 2024 +0200 Merge pull request #2817 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 53c183f899b5382f1eebd72e34a090c30f8eba6a commit bfd01110d86001e29b746d026655982e5dab21ea Author: Claire Date: Mon Aug 19 17:59:06 2024 +0200 [Glitch] Reload notifications when accepted notifications are merged (streaming only) Port 53c183f899b5382f1eebd72e34a090c30f8eba6a to glitch-soc Signed-off-by: Claire commit 99ffae7d4486059496033b93fde486539a3e60b0 Author: Claire Date: Mon Aug 19 16:41:32 2024 +0200 [Glitch] Refactor some actions to be proper async actions instead of passing a continuation Port 1e612c5a09097ef62f26bb9882125dc2d53c92df to glitch-soc Signed-off-by: Claire commit a7751d26e7293a7d93bdc2270ebd22a79e647d1e Author: Emelia Smith Date: Mon Aug 19 14:28:06 2024 +0200 [Glitch] Disable rule selector in ReportReasonSelector if instance has no rules Port 71f257d5291a091cfb005d28221d4ab38698ef42 to glitch-soc Signed-off-by: Claire commit 1760f8434940c1cc0b8eeb8847516fdfd85a323b Merge: ec1ee7a732 53c183f899 Author: Claire Date: Mon Aug 19 18:25:31 2024 +0200 Merge commit '53c183f899b5382f1eebd72e34a090c30f8eba6a' into glitch-soc/merge-upstream commit 53c183f899b5382f1eebd72e34a090c30f8eba6a Author: Claire Date: Mon Aug 19 17:59:06 2024 +0200 Reload notifications when accepted notifications are merged (streaming only) (#31419) commit d4f135bc6d280f834a7b3365fe0ef644cfe606b6 Author: Edward Moulsdale <161692702+wheatear-dev@users.noreply.github.com> Date: Mon Aug 19 16:55:42 2024 +0100 Fix in memoriam accounts appearing in follow recommendations (#31474) Co-authored-by: Utkarsh Wankar <46633523+kernal053@users.noreply.github.com> commit d2e4be045655816fb0c512c3a953cfe9b062240d Author: Claire Date: Mon Aug 19 16:53:54 2024 +0200 Hopefully fix notifications pagination flaky test (#31494) commit 1e612c5a09097ef62f26bb9882125dc2d53c92df Author: Claire Date: Mon Aug 19 16:41:32 2024 +0200 Refactor some actions to be proper async actions instead of passing a continuation (#31453) commit 40f6631ac9474e2c78c15b9d6d360c8c45e26dd9 Author: Renaud Chaput Date: Mon Aug 19 15:55:18 2024 +0200 Fix Husky git hooks not being installed anymore (#31435) commit 99051479c137b04367266992514914c8b4e016db Author: Emelia Smith Date: Mon Aug 19 15:25:40 2024 +0200 Fix Trending Tags pending review having an unstable sort order (#31473) Co-authored-by: Claire commit 71f257d5291a091cfb005d28221d4ab38698ef42 Author: Emelia Smith Date: Mon Aug 19 14:28:06 2024 +0200 Disable rule selector in ReportReasonSelector if instance has no rules (#31458) commit 31d374e5f57c797e4d4e5bd40ed4c4bb12bfd5fc Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 19 13:42:33 2024 +0200 Update opentelemetry-ruby (non-major) (#31451) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3db3e3dae58ac691fa525ce68b6eed5c1d45998e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 19 10:56:08 2024 +0200 Update dependency postcss-preset-env to v10.0.2 (#31488) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c4e0a7dcede811f7be8165938fcf104031b059de Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Aug 19 10:29:48 2024 +0200 New Crowdin Translations (automated) (#31463) Co-authored-by: GitHub Actions commit 9cda8c0197799cd6980457bbdfa4f18db783fd42 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 19 08:12:01 2024 +0000 Update dependency use-debounce to v10.0.3 (#31468) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit d57ee3141353720aa530892f2d7b724295941774 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 19 10:10:15 2024 +0200 Update devDependencies (non-major) (#31489) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit d6404714b60b646dfc94dff107fe6a264f232040 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 19 10:10:13 2024 +0200 Update eslint (non-major) (#31490) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ec1ee7a732896b7666ba636f59b401d6e270a051 Merge: d6c80f67fb ceeabffee5 Author: Claire Date: Fri Aug 16 21:44:46 2024 +0200 Merge pull request #2815 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 2d589a5ed445b474ab7cec27b0db2a331ed7bd49 commit ceeabffee547e165158b80b786f4688b5002c4be Author: Renaud Chaput Date: Fri Aug 16 12:00:59 2024 +0200 [Glitch] Add a follow button & follower count on follow notifications Port 32a78e56e0a9934f65b89a455f2d118642b998de to glitch-soc Signed-off-by: Claire commit 3ea00508ac41962516aa048f9947176d01a4ea4e Merge: d6c80f67fb 2d589a5ed4 Author: Claire Date: Fri Aug 16 20:06:59 2024 +0200 Merge commit '2d589a5ed445b474ab7cec27b0db2a331ed7bd49' into glitch-soc/merge-upstream commit 2d589a5ed445b474ab7cec27b0db2a331ed7bd49 Author: Claire Date: Fri Aug 16 19:11:23 2024 +0200 Fix incorrect activity matching in notification unfiltering worker (#31456) commit 1acbb628b93f0304c4f77ec74cd18fc7d860a9e2 Author: Claire Date: Fri Aug 16 14:52:57 2024 +0200 Update changelog for v4.2.11 (#31452) commit 367d3841af5c358848b84efac49f63a93ff1e2e1 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 16 10:34:40 2024 +0000 Update dependency aws-sdk-s3 to v1.158.0 (#31447) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a2dfe5a7797ca6e265f3f91cbfdbedf50bb03c1e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 16 10:33:24 2024 +0000 Update dependency test-prof to v1.4.0 (#31431) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 32a78e56e0a9934f65b89a455f2d118642b998de Author: Renaud Chaput Date: Fri Aug 16 12:00:59 2024 +0200 Add a follow button & follower count on follow notifications (#31433) commit 622628a199d42a43adc57b8f42faf1fb4500dd91 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 16 10:00:15 2024 +0000 Update dependency rspec-rails to v6.1.4 (#31442) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a0afbba54d272a0b1c2068b05ec95fc21701e8f5 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 16 11:54:27 2024 +0200 Update dependency sanitize to v6.1.3 (#31434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 78d08da1fb52caa3408bba7c46733c85b9bdf194 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 16 11:53:33 2024 +0200 Update opentelemetry-ruby (non-major) (#31446) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 9a245527329b8fac8019945a8831991dca0bdd82 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Aug 16 11:11:33 2024 +0200 New Crowdin Translations (automated) (#31440) Co-authored-by: GitHub Actions commit d6c80f67fb81b4494f97918dfebed0e882e62639 Merge: d84453796b 104c378cb4 Author: Claire Date: Thu Aug 15 23:30:33 2024 +0200 Merge pull request #2814 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 5d04e297755c4a8b4e908f706d272520521341d4 commit 104c378cb4f2f885c34c4478aed5c7a63843c04f Author: Michael Stanclift Date: Wed Aug 14 14:23:45 2024 -0500 [Glitch] Modify profile directory page image borders Port 9194197de580242e7572aa00b7c07bff6170cf7e to glitch-soc Signed-off-by: Claire commit 9f2775830c69a975664380934a9571f4cea36039 Merge: d84453796b 5d04e29775 Author: Claire Date: Thu Aug 15 21:58:04 2024 +0200 Merge commit '5d04e297755c4a8b4e908f706d272520521341d4' into glitch-soc/merge-upstream commit d84453796bd4baf1cca9f95c11c18de21be8f1ef Merge: 115fb0a513 0dbdf6a7f3 Author: Claire Date: Thu Aug 15 09:15:00 2024 +0200 Merge pull request #2813 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to a1ddaa9ee96ab1d05f4e37f3472b0418e0d5628e commit 5d04e297755c4a8b4e908f706d272520521341d4 Author: Renaud Chaput Date: Thu Aug 15 08:45:00 2024 +0200 Disable Chrome's search engine selection screen when running system specs (#31437) commit 4545b8d6cbab59591135ce8d0dfc75ad84c46e73 Author: Renaud Chaput Date: Thu Aug 15 08:44:13 2024 +0200 Add the ability to ignore specific browser errors for a spec (#31436) commit 0dbdf6a7f3f05a451bf299b75a56a288e73431a7 Author: Michael Stanclift Date: Wed Aug 14 12:09:23 2024 -0500 [Glitch] Fix removal of border from account listing Port a1ddaa9ee96ab1d05f4e37f3472b0418e0d5628e to glitch-soc Signed-off-by: Claire commit 524fc8563b1304c2d736e70b41fbae3d15b44c2a Author: Renaud Chaput Date: Wed Aug 14 08:47:15 2024 +0200 [Glitch] Fix notification screen crashing in rare cases where the status no longer exists Port 0d85a79f19fef0c604e8fecfd5dfa9654adc4b95 to glitch-soc Signed-off-by: Claire commit cf96857038e792bf8d8fe5067fd18dcd68ac54ad Author: Michael Stanclift Date: Tue Aug 13 16:54:03 2024 -0500 [Glitch] Fix collapsable column borders in Safari and improve Safari scrollbars Port 7d4b602cb28675da01df6ae27faacff8d70c1711 to glitch-soc Signed-off-by: Claire commit bf0129968eb2251fda13d8b652b29728025624b4 Author: Claire Date: Tue Aug 13 21:32:27 2024 +0200 [Glitch] Fix styling of notification browser permission denied banner Port 12582d095ed7f4a40bb95d94560b9bc9928b813e to glitch-soc Signed-off-by: Claire commit 09929a42f7963cfac825e833dfa9ffe4b70c7d9a Author: Renaud Chaput Date: Tue Aug 13 19:49:23 2024 +0200 [Glitch] Fix log out from user menu not working on Safari Port c3e1d86d589d4f54df6d5b2752822aa7b577bf29 to glitch-soc Signed-off-by: Claire commit 9194197de580242e7572aa00b7c07bff6170cf7e Author: Michael Stanclift Date: Wed Aug 14 14:23:45 2024 -0500 Modify profile directory page image borders (#31391) commit a190efcd6d76d7e3c1e2455881a93ad60562bb5a Author: Claire Date: Tue Aug 13 19:48:28 2024 +0200 [Glitch] Fix modal border and padding inconsistencies Port 2b1670da48ea532300db79a82f0e6e4202f5b337 to glitch-soc Signed-off-by: Claire commit 072f560174958571636ff5e01b7363bb632d3c6b Author: Renaud Chaput Date: Tue Aug 13 09:26:23 2024 +0200 [Glitch] Change avatars border radius Port f6d090fdf5912f390c3d1fe5b43f15c1f0704bd3 to glitch-soc Signed-off-by: Claire commit d3db2d04adfd14561b77006e9e0c99817475874f Author: Renaud Chaput Date: Tue Aug 13 09:14:41 2024 +0200 [Glitch] Add a border above the timeline hint for statuses with replies Port 7e501c59c2acc0bba7fb5b3d1b6ca43171c89f02 to glitch-soc Signed-off-by: Claire commit 169b35869f6684a2f5d71b851f6b0b6402526b55 Merge: 115fb0a513 a1ddaa9ee9 Author: Claire Date: Wed Aug 14 21:17:43 2024 +0200 Merge commit 'a1ddaa9ee96ab1d05f4e37f3472b0418e0d5628e' into glitch-soc/merge-upstream commit a1ddaa9ee96ab1d05f4e37f3472b0418e0d5628e Author: Michael Stanclift Date: Wed Aug 14 12:09:23 2024 -0500 Fix removal of border from account listing (#31432) commit 3cc2968344b204449fa6808df2333ce8d5a73d10 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 14:55:01 2024 +0000 Update dependency wicg-inert to v3.1.3 (#31423) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 5c91610e5391b888d2e25f1c2c52cb395944fd70 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 14:23:17 2024 +0000 Update dependency postcss-preset-env to v10.0.1 (#31422) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b5e799d165386525bebbd7ae7dde68a163332307 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 13:12:16 2024 +0000 Update dependency postcss to v8.4.41 (#31420) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b5ad4aae238d6beded6afd69132ff3770efe4ac6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 14:48:01 2024 +0200 Update dependency propshaft to v0.9.1 (#31421) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 5b2750e384539a68c31a538bdc0a0842095cc902 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 11:45:14 2024 +0200 Update dependency libvips to v8.15.3 (#31416) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4fdaf4513dbfb53a57b9a30857ef62b47a375757 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 11:21:51 2024 +0200 Update dependency oj to v3.16.5 (#31417) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 95c11d365d9f3e4581fbafda0e3e47be39ee23a2 Author: Jeong Arm Date: Wed Aug 14 17:57:42 2024 +0900 Don't push to cache buster if attachment path is nil (#31414) commit 8d969079334afc8b5abf04e4791fd404096214b4 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 07:35:33 2024 +0000 Update dependency @types/webpack to v4.41.39 (#31379) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 7996a9543dd893c772355f41a9ac41b3854fee18 Author: Claire Date: Wed Aug 14 09:34:30 2024 +0200 Change notification request acceptance to immediately delete the request (#31256) commit 3e3450be3613afd522db99e230ec5f47528ba509 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 07:33:32 2024 +0000 Update dependency cssnano to v7.0.5 (#31413) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ee6d3a83f125a4f5eac604c5ee32856aa2c68b70 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Aug 14 09:32:19 2024 +0200 Update dependency concurrent-ruby to v1.3.4 (#31412) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 202f43ccc658237bff7c8a072510e4bc20c980d1 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Aug 14 09:04:01 2024 +0200 New Crowdin Translations (automated) (#31411) Co-authored-by: GitHub Actions commit feaf2f24377f01eef1929becc8270a979149bc40 Author: Renaud Chaput Date: Wed Aug 14 08:53:12 2024 +0200 Update renovate config to fix #31379 (#31408) commit 0d85a79f19fef0c604e8fecfd5dfa9654adc4b95 Author: Renaud Chaput Date: Wed Aug 14 08:47:15 2024 +0200 Fix notification screen crashing in rare cases where the status no longer exists (#31403) commit 6bd7da72e9394eca4a8ee1addaad1a5118d50881 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 13 22:28:13 2024 +0000 Update crowdin/github-action action to v2 (#31380) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 7d4b602cb28675da01df6ae27faacff8d70c1711 Author: Michael Stanclift Date: Tue Aug 13 16:54:03 2024 -0500 Fix collapsable column borders in Safari and improve Safari scrollbars (#31389) commit d7674392059f8a3939fdfa8d835b1d31f883c094 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 13 21:53:36 2024 +0000 Update dependency axios to v1.7.4 [SECURITY] (#31409) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2e85167188bcded572c5839bcabdf1c920fbd927 Author: Matt Jankowski Date: Tue Aug 13 17:37:26 2024 -0400 Only run PR rebase needed check on non-fork repos (#31401) commit 3a787d785c1bac120304e0e5a0c6353f93acd92c Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 13 20:09:38 2024 +0000 Update docker/build-push-action action to v6 (#31381) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 12582d095ed7f4a40bb95d94560b9bc9928b813e Author: Claire Date: Tue Aug 13 21:32:27 2024 +0200 Fix styling of notification browser permission denied banner (#31406) commit c3e1d86d589d4f54df6d5b2752822aa7b577bf29 Author: Renaud Chaput Date: Tue Aug 13 19:49:23 2024 +0200 Fix log out from user menu not working on Safari (#31402) commit 2b1670da48ea532300db79a82f0e6e4202f5b337 Author: Claire Date: Tue Aug 13 19:48:28 2024 +0200 Fix modal border and padding inconsistencies (#31399) commit 2ed13071ef110f3d7d11938e760fde7cabf58388 Author: Claire Date: Tue Aug 13 10:48:10 2024 +0200 Fix what was intended as a comment being interpreted as strings (#31398) commit 862e793b455dc7f44b8ecd39a6ba32b9c4abd628 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Aug 13 07:42:08 2024 +0000 New Crowdin Translations (automated) (#31394) Co-authored-by: GitHub Actions commit 02df1b4e4a1690c934b0e4fb9aa32b832d6bc2a1 Author: Matt Jankowski Date: Tue Aug 13 03:37:32 2024 -0400 Finish email allow/deny list naming migration (#30530) commit f6d090fdf5912f390c3d1fe5b43f15c1f0704bd3 Author: Renaud Chaput Date: Tue Aug 13 09:26:23 2024 +0200 Change avatars border radius (#31390) commit 7e501c59c2acc0bba7fb5b3d1b6ca43171c89f02 Author: Renaud Chaput Date: Tue Aug 13 09:14:41 2024 +0200 Add a border above the timeline hint for statuses with replies (#31387) commit 115fb0a513b4c225a03d1b229a5045c0e1a88443 Merge: 9edf98c02a 8426c20d34 Author: Claire Date: Mon Aug 12 19:37:25 2024 +0200 Merge pull request #2811 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to b42661ba95b7872ba278fca9b0fee8faffd89e52 commit 8426c20d344424f435b934125aab5a04c44d98b9 Author: Claire Date: Mon Aug 12 15:40:29 2024 +0200 [Glitch] Fix all streamed notification types being stored without filtering Port a7b718c31adbfee9015c84bc2379129df612a5f2 to glitch-soc Signed-off-by: Claire commit 61b2139267249e73596fd5991115125c3d2650e5 Author: Michael Stanclift Date: Sun Aug 11 16:32:22 2024 -0500 [Glitch] Fix account header avatar border Port fbdda9f6c18fbd282fe7f3a2dba90ed8ec65e0b6 to glitch-soc Signed-off-by: Claire commit 47df10e9ed838d40999f03eac13c49afd1ef5cb7 Author: Michael Stanclift Date: Sun Aug 11 16:30:52 2024 -0500 [Glitch] Revert Safari scrollbar changes Port 7365a13ee7743b774c7490cb1ce6977b0c3d7b7b to glitch-soc Signed-off-by: Claire commit 939af853e65675076d78b7cc63b2c9343e5bcd3b Author: Essem Date: Sun Aug 11 16:28:43 2024 -0500 [Glitch] Fix extra slash on notification policy request Port 2e03dc9fbf932cd4ea42b7dd7a20dd48b21c73b9 to glitch-soc Signed-off-by: Claire commit 83480df8200dcbad986172460f04365dacb71f45 Merge: 9edf98c02a b42661ba95 Author: Claire Date: Mon Aug 12 17:46:24 2024 +0200 Merge commit 'b42661ba95b7872ba278fca9b0fee8faffd89e52' into glitch-soc/merge-upstream Conflicts: - `lib/sanitize_ext/sanitize_config.rb`: Upstream added `` to the list of allowed tags, the conflict is because we have a different list of allowed tags. Added `` like upstream did. commit b42661ba95b7872ba278fca9b0fee8faffd89e52 Author: Emelia Smith Date: Mon Aug 12 16:45:30 2024 +0200 Add missing Appeals link under Moderation in navigiation (#31071) commit a1f723a6a4063b001a01886dc4e0f61a85100c6b Author: Emelia Smith Date: Mon Aug 12 16:32:52 2024 +0200 Add support for PKCE Extension in OmniAuth OIDC (#31131) commit a7b718c31adbfee9015c84bc2379129df612a5f2 Author: Claire Date: Mon Aug 12 15:40:29 2024 +0200 Fix all streamed notification types being stored without filtering (#31384) commit 709dcd07f24d65d0bacb57db2a461410f28bff12 Author: Django Date: Mon Aug 12 05:10:05 2024 -0600 Add support for incoming tag (#31375) commit 3abb5c0eaabb408337bcd2b9a36cf1d8527f467e Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Aug 12 09:22:50 2024 +0200 New Crowdin Translations (automated) (#31382) Co-authored-by: GitHub Actions commit fbdda9f6c18fbd282fe7f3a2dba90ed8ec65e0b6 Author: Michael Stanclift Date: Sun Aug 11 16:32:22 2024 -0500 Fix account header avatar border (#31373) commit 7365a13ee7743b774c7490cb1ce6977b0c3d7b7b Author: Michael Stanclift Date: Sun Aug 11 16:30:52 2024 -0500 Revert Safari scrollbar changes (#31372) commit 2e03dc9fbf932cd4ea42b7dd7a20dd48b21c73b9 Author: Essem Date: Sun Aug 11 16:28:43 2024 -0500 Fix extra slash on notification policy request (#31378) commit 9edf98c02a0114c73f3099c99326df79abed3a46 Merge: e6feabf6c5 dff29c83c5 Author: Claire Date: Sun Aug 11 22:02:50 2024 +0200 Merge pull request #2810 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 85152af95f51642bcef0ba781a1e7213d79e8f03 commit dff29c83c54ae9acee96e28854065156844e2348 Author: Renaud Chaput Date: Sat Aug 10 20:14:37 2024 +0200 [Glitch] Fix typos in localisation from #31342 Port 19dbc74d827d382cadef0d5e77980ffc7fe4e633 to glitch-soc Signed-off-by: Claire commit 4515bf9d45339850bf7b42518f968d11809ac007 Author: Emelia Smith Date: Sat Aug 10 11:17:10 2024 +0200 [Glitch] Move Follow Recommendations to Trends menu, rename to Recommendations & Trends Port SCSS changes from d3089018d5508af2951401e8d7ba8c43dac1d909 to glitch-soc Signed-off-by: Claire commit f299f8bac10f37acf1dc09681f1ac16833ba431a Author: Matt Jankowski Date: Sat Aug 10 05:12:47 2024 -0400 [Glitch] Use material symbol for responsive menu toggle Port SCSS changes from 7519ef2fa116bcc7577483900379e497d7878a9e to glitch-soc Signed-off-by: Claire commit d6e340b4dd5a8d26f4d45406c08215e130055a5e Author: Michael Stanclift Date: Sat Aug 10 04:11:34 2024 -0500 [Glitch] Improve legibility of account/hashtag autosuggest Port caf0164f00a35f892a945fcec352d865f479b447 to glitch-soc Signed-off-by: Claire commit f441b280dc257cf3fbab8780c3f5eb646259816e Merge: e6feabf6c5 85152af95f Author: Claire Date: Sun Aug 11 21:05:09 2024 +0200 Merge commit '85152af95f51642bcef0ba781a1e7213d79e8f03' into glitch-soc/merge-upstream commit 85152af95f51642bcef0ba781a1e7213d79e8f03 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun Aug 11 18:51:39 2024 +0000 New Crowdin Translations (automated) (#31377) Co-authored-by: GitHub Actions commit 634ab0bad087756a9fe98afc3eec77faf3625035 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun Aug 11 20:13:10 2024 +0200 New Crowdin Translations (automated) (#31351) Co-authored-by: GitHub Actions commit 19dbc74d827d382cadef0d5e77980ffc7fe4e633 Author: Renaud Chaput Date: Sat Aug 10 20:14:37 2024 +0200 Fix typos in localisation from #31342 (#31369) commit c39a8e106144c3bb98a5815859ef5772c45f1a10 Author: Robin <94416535+beanieyi@users.noreply.github.com> Date: Sat Aug 10 03:32:57 2024 -0600 Change “e-mail” to “email” in en.yml (#31317) commit d3089018d5508af2951401e8d7ba8c43dac1d909 Author: Emelia Smith Date: Sat Aug 10 11:17:10 2024 +0200 Move Follow Recommendations to Trends menu, rename to Recommendations & Trends (#31292) commit 885e67b2ed8672344007fd94fd1fd5f2e8aed613 Author: Matt Jankowski Date: Sat Aug 10 05:13:08 2024 -0400 Use material symbol for modal layout sign out link (#31363) commit 7519ef2fa116bcc7577483900379e497d7878a9e Author: Matt Jankowski Date: Sat Aug 10 05:12:47 2024 -0400 Use material symbol for responsive menu toggle (#31362) commit caf0164f00a35f892a945fcec352d865f479b447 Author: Michael Stanclift Date: Sat Aug 10 04:11:34 2024 -0500 Improve legibility of account/hashtag autosuggest (#31361) commit e6feabf6c5a69e8894d9ff30f3e800a796ddc67a Merge: 42c9488032 082c71f4ea Author: Claire Date: Fri Aug 9 19:33:08 2024 +0200 Merge pull request #2809 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 28411acebb5626acf43b44a7b6c33ac783156f72 commit 082c71f4eaf0db2aee0bf35f733bd36304925ba5 Author: Claire Date: Fri Aug 9 18:40:15 2024 +0200 [Glitch] Fix “Accept all”/“Dismiss all” notification requests not working Port 28411acebb5626acf43b44a7b6c33ac783156f72 to glitch-soc Signed-off-by: Claire commit 57a6307228040e55027ed2d48d01ad4fd0dbe3c9 Author: Travis Briggs Date: Fri Aug 9 09:12:51 2024 -0700 [Glitch] Add hint to user that other remote statuses may not be displayed Port bcec8f53a48cc3892bd646ca7960b30edc402dcf to glitch-soc Signed-off-by: Claire commit f43a4842f743b70f584948c451d020e1cf3f292e Merge: b6961d08ab 28411acebb Author: Claire Date: Fri Aug 9 18:51:31 2024 +0200 Merge commit '28411acebb5626acf43b44a7b6c33ac783156f72' into glitch-soc/merge-upstream commit 28411acebb5626acf43b44a7b6c33ac783156f72 Author: Claire Date: Fri Aug 9 18:40:15 2024 +0200 Fix “Accept all”/“Dismiss all” notification requests not working (#31358) commit bcec8f53a48cc3892bd646ca7960b30edc402dcf Author: Travis Briggs Date: Fri Aug 9 09:12:51 2024 -0700 Add hint to user that other remote statuses may not be displayed (#26910) commit b6961d08abafdee930040ec25265acfee7ae6019 Author: Claire Date: Fri Aug 9 16:56:39 2024 +0200 [Glitch] Add ability to report, block and mute from notification requests list Port 658addcbf783f6baa922d11c9524ebb9ddbcbc59 to glitch-soc Co-authored-by: Renaud Chaput Signed-off-by: Claire commit 58b9b80be57e898ebeba81fd41038795539dfb28 Author: Claire Date: Fri Aug 9 16:21:55 2024 +0200 [Glitch] Add option to ignore filtered notifications to the web interface Port 170157570447d30732445f6339b0c7b2fe7617d8 to glitch-soc Signed-off-by: Claire commit 99d38167a3484b51b6d182aaa0792092213a688f Author: Michael Stanclift Date: Fri Aug 9 07:45:39 2024 -0500 [Glitch] Fix post filter & report styling Port 9538d9c298ed98127e3ba297a1933608976b1906 to glitch-soc Signed-off-by: Claire commit ce9715d6516b1aff66ed6135e571377e13c2e068 Author: Claire Date: Thu Aug 8 22:20:52 2024 +0200 [Glitch] Change unread notification count to only cover the selected notification type Port 6ca731e9b69962a0023df2c5314562293bb4b6b6 to glitch-soc Signed-off-by: Claire commit 5a9f526a172b115eac3b6aa486ef4e613891b361 Author: Renaud Chaput Date: Thu Aug 8 22:20:35 2024 +0200 [Glitch] Update notification labels for mentions Port 2095d0f2b08c52a39380bb8b303851e475c6b3a7 to glitch-soc Signed-off-by: Claire commit e7be55fd737f9b6e1664561f034006fbdd187846 Author: Michael Stanclift Date: Thu Aug 8 14:23:15 2024 -0500 [Glitch] Fix list creation textbox styling Port 389549e7838291f09bc291c7559730fe3f2aad58 to glitch-soc Signed-off-by: Claire commit cc2949b797ca85b841d023bb54db27d70878356c Author: Michael Stanclift Date: Thu Aug 8 12:31:06 2024 -0500 [Glitch] Fix styling issues with notification settings and mobile borders Port 664bef35730542791c44c739b8f39e37d7baddd3 to glitch-soc Signed-off-by: Claire commit 31a00c0c1af52f27af08e3ad11a2ebaccbc51672 Merge: 42c9488032 658addcbf7 Author: Claire Date: Fri Aug 9 17:15:32 2024 +0200 Merge commit '658addcbf783f6baa922d11c9524ebb9ddbcbc59' into glitch-soc/merge-upstream commit 658addcbf783f6baa922d11c9524ebb9ddbcbc59 Author: Claire Date: Fri Aug 9 16:56:39 2024 +0200 Add ability to report, block and mute from notification requests list (#31309) Co-authored-by: Renaud Chaput commit eaedd52def6bec787c48386f5e102f57de94403e Author: Claire Date: Fri Aug 9 16:48:05 2024 +0200 Fix incorrect rate limit on PUT requests (#31356) commit 170157570447d30732445f6339b0c7b2fe7617d8 Author: Claire Date: Fri Aug 9 16:21:55 2024 +0200 Add option to ignore filtered notifications to the web interface (#31342) commit 8a5b57f66874dd936bcaa2532f0fb9d3fabc6e5c Author: Claire Date: Fri Aug 9 15:48:54 2024 +0200 Revert "Support JSON-LD named graph (#31288)" (#31355) commit cbdd8edf68321b384d871855cd73b717ca394de2 Author: Claire Date: Fri Aug 9 15:30:55 2024 +0200 Revamp notification policy options (#31343) commit e29c401f774613b5c47fb69faf6ec99abf7c61a6 Author: Christian Schmidt Date: Fri Aug 9 15:05:34 2024 +0200 Add lang attribute on preview card title (#31303) commit 994ef16b72478c3c33f81466a13b77ef4fee5ebb Author: Claire Date: Fri Aug 9 14:48:34 2024 +0200 Bust CDN cache on media deletion (#31353) commit 9bae2377924f4cda71bdff54fd270ef03ac9443c Author: Jeong Arm Date: Fri Aug 9 21:47:02 2024 +0900 Change confirmation prompt on trending management (#19626) commit 9538d9c298ed98127e3ba297a1933608976b1906 Author: Michael Stanclift Date: Fri Aug 9 07:45:39 2024 -0500 Fix post filter & report styling (#31349) commit 6ca731e9b69962a0023df2c5314562293bb4b6b6 Author: Claire Date: Thu Aug 8 22:20:52 2024 +0200 Change unread notification count to only cover the selected notification type (#31326) commit 2095d0f2b08c52a39380bb8b303851e475c6b3a7 Author: Renaud Chaput Date: Thu Aug 8 22:20:35 2024 +0200 Update notification labels for mentions (#31304) commit 6e01a23e3bea35f7bf90bd420f9372a6a7421fae Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 8 21:31:00 2024 +0200 Update dependency eslint-plugin-promise to v7 (#31120) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f045ef8e927b19a53fb4c399306a661c6e7eca63 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 8 21:30:42 2024 +0200 Update dependency eslint-plugin-jsdoc to v50 (#31330) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 389549e7838291f09bc291c7559730fe3f2aad58 Author: Michael Stanclift Date: Thu Aug 8 14:23:15 2024 -0500 Fix list creation textbox styling (#31348) commit a207a1f7dcf85b3cea24c016e0d35c4a8e308265 Author: Renaud Chaput Date: Thu Aug 8 21:22:16 2024 +0200 Disable stylelint rules that are conflicting with Prettier (#31339) commit 42c9488032e94b6aff412a5d8555a04a120378b6 Merge: e4e1173beb dad9baaa54 Author: Claire Date: Thu Aug 8 21:00:19 2024 +0200 Merge pull request #2808 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 079d681ac6f279f3a7a6be5c3734549f3be8f912 commit dad9baaa5456cc6ea58b54e05a4e96bf891b34e7 Author: Claire Date: Thu Aug 8 19:00:05 2024 +0200 [Glitch] Fix uninitialized grouped notifications read marker on initial load Port 079d681ac6f279f3a7a6be5c3734549f3be8f912 to glitch-soc Signed-off-by: Claire commit 29db81e1bb244b41c8041aaffa21911f37cc0b8e Author: Claire Date: Thu Aug 8 12:57:21 2024 +0200 [Glitch] Convert PrivacyDropdownMenu to Typescript and generalize it to DropdownSelector component Port 2edae5ea28bcddb59f2d38416d03d2b52175b58c to glitch-soc Signed-off-by: Claire commit eacfb9fc5523fc1880c3457286e09fc2d3d5d169 Author: Valtteri Laitinen Date: Thu Aug 8 12:22:48 2024 +0300 [Glitch] Really fix duplicate border around search results Port a95fe931d71ea0fa1d81a94c779553048b4e69f5 to glitch-soc Signed-off-by: Claire commit e01f4378e115d9a90d39fe9c5e5c488ce66021f0 Author: Michael Stanclift Date: Thu Aug 8 04:21:54 2024 -0500 [Glitch] Follow up tweaking of admin UI changes part 2 Port 176ba984d4812717c5cad5fcd7d5bcbb8ece0f2a to glitch-soc Signed-off-by: Claire commit 3ef5adc526daab6815462fbf93e7015ca4184543 Author: Claire Date: Thu Aug 8 11:16:33 2024 +0200 [Glitch] Add explainer for filtered notifications from limited accounts Port ac9040b76b22212865df932936ee62d7ab9a9adb to glitch-soc Signed-off-by: Claire commit ca6ad45121ab78a15f54567ce22ed77d057b7f90 Author: Claire Date: Thu Aug 8 01:09:30 2024 +0200 [Glitch] Add unchangeable filtered notification setting for limited accounts Port f8629367d2cbb6495bb81d5357611e3759dbf35a to glitch-soc Signed-off-by: Claire commit 48e4c57905f835ba86a42165e20374d4a430fb2b Author: Matt Jankowski Date: Wed Aug 7 19:08:36 2024 -0400 [Glitch] Replace more `font-awesome` icons in `views/admin` area Port 84c3cc4e5bf3c148982231222baab9ccfcc107b3 to glitch-soc Signed-off-by: Claire commit 15dc195029e4a39b31c9f2832bccd0a604a02962 Author: Matt Jankowski Date: Tue Apr 23 12:43:49 2024 -0400 [Glitch] Add material design icons to admin/settings views Port 32ead51e5a8d6abbc0b4bacb00192ddc72a9817a to glitch-soc Co-authored-by: Claire Signed-off-by: Claire commit 664bef35730542791c44c739b8f39e37d7baddd3 Author: Michael Stanclift Date: Thu Aug 8 12:31:06 2024 -0500 Fix styling issues with notification settings and mobile borders (#31346) commit dd2a991e24febd53497c6e163905f09bb527a425 Merge: e4e1173beb 079d681ac6 Author: Claire Date: Thu Aug 8 19:30:16 2024 +0200 Merge commit '079d681ac6f279f3a7a6be5c3734549f3be8f912' into glitch-soc/merge-upstream Conflicts: - `app/javascript/material-icons/400-24px/code.svg`: Icon newly-introduced upstream. Used upstream's more recent version. - `app/javascript/material-icons/400-24px/mail.svg`: Icon newly-introduced upstream. Used upstream's more recent version. - `app/javascript/material-icons/400-24px/manufacturing.svg`: Icon newly-introduced upstream. Used upstream's more recent version. - `app/views/admin/settings/shared/_links.html.haml`: Glitch-soc had extra menu items, ported the changes for them too. - `config/navigation.rb`: Glitch-soc had extra menu items, ported the changes for them too. commit 079d681ac6f279f3a7a6be5c3734549f3be8f912 Author: Claire Date: Thu Aug 8 19:00:05 2024 +0200 Fix uninitialized grouped notifications read marker on initial load (#31347) commit 0e4d3c0403d087d36c9259155d42928651dbb90e Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Aug 8 13:54:10 2024 +0000 New Crowdin Translations (automated) (#31337) Co-authored-by: GitHub Actions commit 2edae5ea28bcddb59f2d38416d03d2b52175b58c Author: Claire Date: Thu Aug 8 12:57:21 2024 +0200 Convert PrivacyDropdownMenu to Typescript and generalize it to DropdownSelector component (#31338) commit a95fe931d71ea0fa1d81a94c779553048b4e69f5 Author: Valtteri Laitinen Date: Thu Aug 8 12:22:48 2024 +0300 Really fix duplicate border around search results (#31305) commit 176ba984d4812717c5cad5fcd7d5bcbb8ece0f2a Author: Michael Stanclift Date: Thu Aug 8 04:21:54 2024 -0500 Follow up tweaking of admin UI changes part 2 (#31268) commit ac9040b76b22212865df932936ee62d7ab9a9adb Author: Claire Date: Thu Aug 8 11:16:33 2024 +0200 Add explainer for filtered notifications from limited accounts (#31331) commit f8629367d2cbb6495bb81d5357611e3759dbf35a Author: Claire Date: Thu Aug 8 01:09:30 2024 +0200 Add unchangeable filtered notification setting for limited accounts (#31324) commit 84c3cc4e5bf3c148982231222baab9ccfcc107b3 Author: Matt Jankowski Date: Wed Aug 7 19:08:36 2024 -0400 Replace more `font-awesome` icons in `views/admin` area (#30961) commit 52a626f39b1daab1b8573eaa0613ee5b70afc79f Author: Matt Jankowski Date: Wed Aug 7 18:53:15 2024 -0400 Replace more `font-awesome` icons in `app/helpers` (#30962) commit e4092cc73a5647b5c880cb312928cc9c4cea94fd Author: Matt Jankowski Date: Wed Aug 7 18:52:35 2024 -0400 Replace more `font-awesome` icons in `views/settings` (#30963) commit abc4ed48f26a2998d6b6d69f68af681693a46dfb Author: Matt Jankowski Date: Wed Aug 7 18:52:08 2024 -0400 Replace more `font-awesome` icons in navigation sidebar area (#30974) commit e4e1173beba14496bd3a0348fa26486b8364ff68 Merge: 241d76075c 56b280186f Author: Claire Date: Wed Aug 7 22:42:41 2024 +0200 Merge pull request #2807 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 670e4655d13975e0597bd1c74ebeeeeffc4edc37 commit 56b280186fd16a0c17668ec2fce53c707abaf698 Author: Claire Date: Wed Aug 7 13:12:42 2024 +0200 [Glitch] Change group notifications unread markers to only be cleared when focusing/navigating again Port 6f285bb2a606467bac555b630364f82fb1f3eaaf to glitch-soc Signed-off-by: Claire commit 06e034db15db6e5fb82fcc0695dbbbcff6d5dabd Merge: 241d76075c 670e4655d1 Author: Claire Date: Wed Aug 7 19:22:25 2024 +0200 Merge commit '670e4655d13975e0597bd1c74ebeeeeffc4edc37' into glitch-soc/merge-upstream commit 670e4655d13975e0597bd1c74ebeeeeffc4edc37 Author: Claire Date: Wed Aug 7 17:14:37 2024 +0200 Change dismissing a notification to clear existing filtered notifications for that account (#31329) commit 6f285bb2a606467bac555b630364f82fb1f3eaaf Author: Claire Date: Wed Aug 7 13:12:42 2024 +0200 Change group notifications unread markers to only be cleared when focusing/navigating again (#31325) commit af2aec1a82a13dc755d0dae893861d35c01fb0c6 Author: Claire Date: Wed Aug 7 13:12:36 2024 +0200 Change notification requests to only count mentions (#31322) commit fc964c9bfdc59d69b758919520f56d060ac2eeac Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Aug 7 11:32:16 2024 +0200 New Crowdin Translations (automated) (#31321) Co-authored-by: GitHub Actions commit 719cabe024e87fcc5cc57d3ec66de956af2d3db7 Author: Claire Date: Wed Aug 7 08:52:10 2024 +0200 Fix logic of block/mute bypass for mentions from moderators (#31271) commit 241d76075c9c31b16f998efc1d5c7619987b48fa Merge: a31ab56b3a 43546659bf Author: Claire Date: Wed Aug 7 08:48:46 2024 +0200 Merge pull request #2806 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to c8b9e60ec123c458efff83eedcfd07f067ef05ae commit 43546659bf0d5672c76c4d26b6f571958dd725ed Author: Claire Date: Tue Aug 6 15:35:15 2024 +0200 [Glitch] Fix mutes and blocks not immediately cleaning up notification requests in Web UI Port c8b9e60ec123c458efff83eedcfd07f067ef05ae to glitch-soc Signed-off-by: Claire commit 1c91b363d557a7a6443d3a643d3da59e4c694d0c Author: Claire Date: Tue Aug 6 15:34:55 2024 +0200 [Glitch] Fix broken “mute” button in mutes list Port 30430a62e2a049c924ba33273b9c3c90178a0eb8 to glitch-soc Signed-off-by: Claire commit 7bb171a9eae6b9857f8b6f23400678a0103fd65c Author: Renaud Chaput Date: Tue Aug 6 14:22:18 2024 +0200 [Glitch] Remove usage of non-public RTK types Port 57a1f86626ad00f12ccf055c4f0e0ade506b8fba to glitch-soc Signed-off-by: Claire commit f0f2ce2855ba3151a4831bf2ab72b757b1074097 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 6 07:54:00 2024 +0000 [Glitch] fix(deps): update dependency @reduxjs/toolkit to v2.2.7 - abandoned Port 103e544cfaadd33f33369cf6e8496accbebc3906 to glitch-soc Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput Signed-off-by: Claire commit 01b4c996b2712d200dde1517ec58d65b06173608 Author: Renaud Chaput Date: Tue Aug 6 08:53:59 2024 +0200 [Glitch] Add account notes to hover cards Port 97b9e8befd7355af7a2a2905a16f5f0527f0b48c to glitch-soc Signed-off-by: Claire commit ad786cb7af150b99f2952f4dc8ab5d2f2630f5c7 Author: Valtteri Laitinen Date: Mon Aug 5 14:35:16 2024 +0300 [Glitch] Improve look of verified header fields in profile Port c01a6a6eeb055c594df9b846d60afe05465b56f3 to glitch-soc Signed-off-by: Claire commit 316132bdbd99cd84fc4cb0afd418fc55cac04a11 Author: Valtteri Laitinen Date: Sun Aug 4 18:14:11 2024 +0300 [Glitch] Fix duplicate border around search results Port 315308b10cf1d6431053c1553a2f0b596471f039 to glitch-soc Signed-off-by: Claire commit c5b7f48ccef57eb18aa514d5ada5150c10df82bb Author: Valtteri Laitinen Date: Sun Aug 4 18:13:15 2024 +0300 [Glitch] Fix missing border around tab/filter bar Port b6c1b8f7480d87340a128c593ad267e4b5501beb to glitch-soc Signed-off-by: Claire commit 5cdc0c2b43e78fb582837b8b3c2be165549c857a Author: Christian Schmidt Date: Sun Aug 4 10:57:46 2024 +0200 [Glitch] Disable irrelevant fields unless cleanup is enabled Port 3d6e8d68344cb6b8604d2321705c83f2eebf8add to glitch-soc Signed-off-by: Claire commit 700ebdb5e268522658f828e630ec075eec38d93e Author: Renaud Chaput Date: Fri Aug 2 21:55:13 2024 +0200 [Glitch] Fix typo in english message (filtred => filtered) Port 19f4aa11472eb5bedd97e0541a48126078715193 to glitch-soc Signed-off-by: Claire commit 08adca0c63d49c32d7aa6877202bb3c7f0ecd0b3 Merge: a31ab56b3a c8b9e60ec1 Author: Claire Date: Tue Aug 6 17:27:48 2024 +0200 Merge commit 'c8b9e60ec123c458efff83eedcfd07f067ef05ae' into glitch-soc/merge-upstream commit c8b9e60ec123c458efff83eedcfd07f067ef05ae Author: Claire Date: Tue Aug 6 15:35:15 2024 +0200 Fix mutes and blocks not immediately cleaning up notification requests in Web UI (#31316) commit 30430a62e2a049c924ba33273b9c3c90178a0eb8 Author: Claire Date: Tue Aug 6 15:34:55 2024 +0200 Fix broken “mute” button in mutes list (#31315) commit 57a1f86626ad00f12ccf055c4f0e0ade506b8fba Author: Renaud Chaput Date: Tue Aug 6 14:22:18 2024 +0200 Remove usage of non-public RTK types (#31312) commit 438dac99d6afcb5873f5aafee29bf9de2cabb864 Author: Claire Date: Tue Aug 6 14:09:35 2024 +0200 Add option to request partial accounts in grouped notifications API (#31299) commit 5d890ebc574a8ec778619c3ddfe2530b3e0a7297 Author: Claire Date: Tue Aug 6 12:07:16 2024 +0200 Delete pending notification requests on block and notification mutes (#31310) commit 9d0cafd06b45bd8169727d8994a849a222c3515e Author: Christian Schmidt Date: Tue Aug 6 10:23:48 2024 +0200 Check Content-Length in ResponseWithLimitAdapter (#31285) commit 103e544cfaadd33f33369cf6e8496accbebc3906 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 6 07:54:00 2024 +0000 fix(deps): update dependency @reduxjs/toolkit to v2.2.7 - abandoned (#31173) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput commit e9e63ed203996a4e06e31a7220e9d8a2df71f67c Author: Christian Schmidt Date: Tue Aug 6 09:52:47 2024 +0200 Support JSON-LD named graph (#31288) commit 135493c0b4d87ed9d2fb0d1dcc81f8b7f6315e42 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Aug 6 09:47:03 2024 +0200 chore(deps): update dependency rubocop-rspec to v3.0.4 (#31301) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit d15f46a0b888ff668a5eb3d97b222da2320a1634 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Aug 6 09:22:38 2024 +0200 New Crowdin Translations (automated) (#31307) Co-authored-by: GitHub Actions commit 97b9e8befd7355af7a2a2905a16f5f0527f0b48c Author: Renaud Chaput Date: Tue Aug 6 08:53:59 2024 +0200 Add account notes to hover cards (#31300) commit c01a6a6eeb055c594df9b846d60afe05465b56f3 Author: Valtteri Laitinen Date: Mon Aug 5 14:35:16 2024 +0300 Improve look of verified header fields in profile (#31275) commit 656373817ef10b6d988a0d69259839ed29ced632 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 13:30:35 2024 +0200 chore(deps): update dependency bootsnap to v1.18.4 (#31297) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit cb56a6dc7efa06c4a9c974fc60a4825d5cc89e1d Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Aug 5 07:43:04 2024 +0000 New Crowdin Translations (automated) (#31276) Co-authored-by: GitHub Actions commit a1eaf12d63422f227dfe5f486253abdcb51d279d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 07:14:05 2024 +0000 chore(deps): update dependency fog-core to '<= 2.5.0' (#31267) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 02c22228790bec1cbce527edd711fbf995078578 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 07:13:47 2024 +0000 fix(deps): update dependency postcss-preset-env to v10 (#31279) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 29d6310b806c3d8d940396250bd8af080d6437b9 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 09:13:14 2024 +0200 chore(deps): update dependency sidekiq-scheduler to v5.0.6 (#31245) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 9e440bee195f7107fb7b7ec9371ab360dcb6de67 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 09:13:00 2024 +0200 chore(deps): update dependency aws-sdk-s3 to v1.157.0 (#31252) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 176d1feadf26e635f3b3e83da3d688f002b9c342 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 09:12:47 2024 +0200 chore(deps): update yarn to v4.4.0 (#31274) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3a368933b400c8fb6d49749efd6674c22c9a34e7 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 09:11:57 2024 +0200 fix(deps): update dependency core-js to v3.38.0 (#31290) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f33049ffe43edf8886a4d549d506dd13ee06c36f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 08:29:38 2024 +0200 chore(deps): update dependency ffmpeg to v7.0.2 (#31289) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e99c0e61ea12233904aeb4a0581d14b7ae4ce619 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 06:29:03 2024 +0000 chore(deps): update dependency @types/ws to v8.5.12 (#31293) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3fec1baefdeb7da5685e109fabaf56a3575201bb Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Aug 5 08:28:22 2024 +0200 chore(deps): update devdependencies (non-major) (#31294) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 315308b10cf1d6431053c1553a2f0b596471f039 Author: Valtteri Laitinen Date: Sun Aug 4 18:14:11 2024 +0300 Fix duplicate border around search results (#31284) commit b6c1b8f7480d87340a128c593ad267e4b5501beb Author: Valtteri Laitinen Date: Sun Aug 4 18:13:15 2024 +0300 Fix missing border around tab/filter bar (#31286) commit 3d6e8d68344cb6b8604d2321705c83f2eebf8add Author: Christian Schmidt Date: Sun Aug 4 10:57:46 2024 +0200 Disable irrelevant fields unless cleanup is enabled (#26562) commit 19f4aa11472eb5bedd97e0541a48126078715193 Author: Renaud Chaput Date: Fri Aug 2 21:55:13 2024 +0200 Fix typo in english message (filtred => filtered) (#31273) commit a31ab56b3a4de65cd92a50c42a1cd80bafc45b39 Merge: a9ffec4cbe 096f622496 Author: Claire Date: Fri Aug 2 20:29:10 2024 +0200 Merge pull request #2804 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to ad95c98054574080ac5d15584b3018d1db836531 commit 096f622496e8ed163fffb6ca30ecde6b873e1f8c Author: Claire Date: Fri Aug 2 16:59:37 2024 +0200 [Glitch] Further de-emphasize filtered notifications banner and add setting to minimize it Port ad95c98054574080ac5d15584b3018d1db836531 to glitch-soc Signed-off-by: Claire commit f2736715e494dbed28a9a4da0c516661a35aa37b Author: Claire Date: Fri Aug 2 15:55:31 2024 +0200 [Glitch] Fix contrast between background and form elements on some pages Port 2ec1181ee5c409dd6d2f89cdf04e983e84fce9ab to glitch-soc Signed-off-by: Claire commit 61f5f5c4d1d7397ab4348bf634c3a8366054a7a1 Author: Renaud Chaput Date: Fri Aug 2 15:18:19 2024 +0200 [Glitch] Change the filtered notification count to be in the account avatar Port cc453f222146bf1d48af3edbdc6396e856e81893 to glitch-soc Signed-off-by: Claire commit a51cdd6b6dd7e5f7a8ef1ce0497c2943970e88a0 Author: Claire Date: Fri Aug 2 15:15:18 2024 +0200 [Glitch] Change `DropdownMenu` component's `items` prop type Port bb3941f885beee3843742edd31d67901c6ba0995 to glitch-soc Signed-off-by: Claire commit 7946d986a771262ac9fb4b23d04ab6db3d65adf9 Author: Claire Date: Thu Aug 1 22:50:36 2024 +0200 [Glitch] Fix click event handling when clicking outside of an open dropdown menu Port afdfeb585640af53cf7e9c63d82aa56ca8bae1e4 to glitch-soc Signed-off-by: Claire commit 80d315826f4476aea96c68bb86e19aa872d3db1e Author: Claire Date: Thu Aug 1 09:41:32 2024 +0200 [Glitch] Fix handling of long display names in notification requests Port f6dc8ae8e39cbc626b001cd1026a6fa2de8f4215 to glitch-soc Signed-off-by: Claire commit e67e07211f1e09b98c77d145fc0ec391548f425d Merge: a9ffec4cbe ad95c98054 Author: Claire Date: Fri Aug 2 18:09:48 2024 +0200 Merge commit 'ad95c98054574080ac5d15584b3018d1db836531' into glitch-soc/merge-upstream Conflicts: - `package.json`: Upstream removed their direct dependency `autoprefixer`, which was textually adjacent to glitch-soc-only dependency `atrament`. Removed direct dependency on `autoprefixer`. - `yarn.lock`: Upstream removed their direct dependency `autoprefixer`, which was textually adjacent to glitch-soc-only dependency `atrament`. Removed direct dependency on `autoprefixer`. commit ad95c98054574080ac5d15584b3018d1db836531 Author: Claire Date: Fri Aug 2 16:59:37 2024 +0200 Further de-emphasize filtered notifications banner and add setting to minimize it (#31250) commit 2ec1181ee5c409dd6d2f89cdf04e983e84fce9ab Author: Claire Date: Fri Aug 2 15:55:31 2024 +0200 Fix contrast between background and form elements on some pages (#31266) commit cc453f222146bf1d48af3edbdc6396e856e81893 Author: Renaud Chaput Date: Fri Aug 2 15:18:19 2024 +0200 Change the filtered notification count to be in the account avatar (#31262) commit 99c446b7cf6dc1ade27ba2658ce1812442ebffbc Author: Renaud Chaput Date: Fri Aug 2 15:17:36 2024 +0200 Change PostCSS config to allow logical properties (#31264) commit bb3941f885beee3843742edd31d67901c6ba0995 Author: Claire Date: Fri Aug 2 15:15:18 2024 +0200 Change `DropdownMenu` component's `items` prop type (#31263) commit 2a704add90a9853db357711e41605bb6b12cec19 Author: Claire Date: Fri Aug 2 12:39:12 2024 +0200 Fix status processing failing halfway when a remote post has a malformed `replies` attribute (#31246) commit 6a27a8c3e74d08ae8d3477ae0a40c1b2e2995e4b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 2 12:01:41 2024 +0200 fix(deps): update babel monorepo (#31167) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit caeae25b558e733d887b0f7cf6420a28d331068e Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Aug 2 07:01:04 2024 +0000 New Crowdin Translations (automated) (#31261) Co-authored-by: GitHub Actions commit 74900195353313f83bbf8fa9e55e67890792c0e7 Author: Emelia Smith Date: Fri Aug 2 08:56:09 2024 +0200 Fix support for IPv6 redis connections in streaming (#31229) commit f55099fea3f25a42d2ed3733caa8402d9a0a3f10 Author: Emelia Smith Date: Fri Aug 2 08:54:48 2024 +0200 Increase maximum page size for Admin Domain Management APIs (#31253) commit d19edc4c4ab0d700efa70f0df4981ec9931aca22 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Aug 2 08:53:41 2024 +0200 fix(deps): update dependency axios to v1.7.3 (#31248) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit afdfeb585640af53cf7e9c63d82aa56ca8bae1e4 Author: Claire Date: Thu Aug 1 22:50:36 2024 +0200 Fix click event handling when clicking outside of an open dropdown menu (#31251) commit da5b45a573808d345839507cf024c8be73b1d610 Author: Claire Date: Thu Aug 1 14:36:54 2024 +0200 Add endpoints to accept and dismiss multiple notification requests at once (#31242) commit 584b1524dd64a3fb4daa4ffb80f38c522972bade Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Aug 1 11:27:24 2024 +0200 New Crowdin Translations (automated) (#31237) Co-authored-by: GitHub Actions commit 4853a2badaef7916c90e2fc546c9d7551ce8a706 Author: Christian Schmidt Date: Thu Aug 1 11:14:24 2024 +0200 Add Accept-Language header when fetching preview card (#31232) commit 06c3a41fafacd8de16004409c47e4eaa354d26dc Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Aug 1 11:13:10 2024 +0200 chore(deps): update dependency rubocop to v1.65.1 (#31239) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit f6dc8ae8e39cbc626b001cd1026a6fa2de8f4215 Author: Claire Date: Thu Aug 1 09:41:32 2024 +0200 Fix handling of long display names in notification requests (#31225) commit a9ffec4cbe93ff05a99628e31228ca12503596c8 Merge: 32717657ce 49ad1475fb Author: Claire Date: Wed Jul 31 20:05:52 2024 +0200 Merge pull request #2803 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to a50c8e951f03a8eb53957ad1c3703155b223ed24 commit 49ad1475fba20876761a3725a7405299877607b4 Author: Claire Date: Wed Jul 31 15:23:08 2024 +0200 [Glitch] Fix issue with grouped notifications UI due to recent API change Port a50c8e951f03a8eb53957ad1c3703155b223ed24 to glitch-soc Signed-off-by: Claire commit de8a31f7df1a79f722182c7eb1f3b0faf5786b3f Author: Claire Date: Wed Jul 31 14:36:08 2024 +0200 [Glitch] Change filtered notification banner design to take up less space Port 2c1e75727dbf84cc0c3590a0a8e53d28640b37d0 to glitch-soc Signed-off-by: Claire commit feed8163981c8c7631f49e662ed902cb1ba7202a Author: Claire Date: Wed Jul 31 12:50:13 2024 +0200 [Glitch] Change grouped notifications API shape (take 2) Port front-end changes from 549ab089eed07ee3ad90288ee5e134b4cfdc1e76 to glitch-soc Signed-off-by: Claire commit de1ef5b4701bcdf4c0b4802787e41ec560c613b8 Author: Claire Date: Wed Jul 31 12:26:43 2024 +0200 [Glitch] Change private mention icon for consistency in grouped notifications Port 288961bbb99b626128e4bc222deb4f749922edb8 to glitch-soc Signed-off-by: Claire commit 2be70ae7dcf0b2482b71437fa4b818fecdf4b419 Author: Claire Date: Wed Jul 31 09:52:59 2024 +0200 [Glitch] Fix inconsistent dismiss icon for notification requests Port a50c8e951f03a8eb53957ad1c3703155b223ed24 to glitch-soc Signed-off-by: Claire commit 8dd671a977c213a647679b0058cdf05f9f07b187 Merge: 32717657ce a50c8e951f Author: Claire Date: Wed Jul 31 18:16:01 2024 +0200 Merge commit 'a50c8e951f03a8eb53957ad1c3703155b223ed24' into glitch-soc/merge-upstream commit a50c8e951f03a8eb53957ad1c3703155b223ed24 Author: Claire Date: Wed Jul 31 15:23:08 2024 +0200 Fix issue with grouped notifications UI due to recent API change (#31224) commit 2c1e75727dbf84cc0c3590a0a8e53d28640b37d0 Author: Claire Date: Wed Jul 31 14:36:08 2024 +0200 Change filtered notification banner design to take up less space (#31222) commit 549ab089eed07ee3ad90288ee5e134b4cfdc1e76 Author: Claire Date: Wed Jul 31 12:50:13 2024 +0200 Change grouped notifications API shape (take 2) (#31214) commit 288961bbb99b626128e4bc222deb4f749922edb8 Author: Claire Date: Wed Jul 31 12:26:43 2024 +0200 Change private mention icon for consistency in grouped notifications (#31223) commit 520ff042480ac4772fb84d02677fc7c6825816a9 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Jul 31 08:09:49 2024 +0000 New Crowdin Translations (automated) (#31219) Co-authored-by: GitHub Actions commit 66a16bf49cf7729d8d2fac866832b12f8dec42a0 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 31 10:01:07 2024 +0200 chore(deps): update dependency opentelemetry-instrumentation-active_job to v0.7.4 (#31218) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit fd1bade13524f281ec93b03e3a2b6ae5435ffa5c Author: Claire Date: Wed Jul 31 09:52:59 2024 +0200 Fix inconsistent dismiss icon for notification requests (#31220) commit 32717657ceb9898e9d502a87043b5716e86bd67c Merge: 25c6b52fc8 1f796d129d Author: Claire Date: Wed Jul 31 08:35:45 2024 +0200 Merge pull request #2801 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 598ae4f2da86029b1c3c3e35e64b89873037b598 commit 4eab6aef95554d74237fcdbe13c986373a643739 Author: Claire Date: Tue Jul 30 23:40:42 2024 +0200 Change User-Agent to use Mastodon as the product, and http.rb as platform details (#31192) commit 1f796d129d19af78d4566d79ad052c2ae968aed6 Merge: 25c6b52fc8 598ae4f2da Author: Claire Date: Tue Jul 30 20:47:34 2024 +0200 Merge commit '598ae4f2da86029b1c3c3e35e64b89873037b598' into glitch-soc/merge-upstream Conflicts: - `config/routes/api.rb`: Upstream added an endpoint, textually close to a glitch-soc-only endpoint. Ported upstream changes. commit 598ae4f2da86029b1c3c3e35e64b89873037b598 Author: Claire Date: Tue Jul 30 10:39:11 2024 +0200 Add endpoints for unread notifications count (#31191) commit 2ce99c51dd37ace101ff43a701c51bd7778a3666 Author: Tim Rogers Date: Tue Jul 30 03:18:00 2024 -0500 Fixed Rails route covering %40-encoded profile URL paths to not 404 (#31184) commit 7d11a6c9b0e75868f803c11d97957359e3e2d218 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Jul 30 10:15:40 2024 +0200 New Crowdin Translations (automated) (#31206) Co-authored-by: GitHub Actions commit e1f7ca7cedd22ecf402abe484aefacaa93f994ab Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 30 10:00:33 2024 +0200 chore(deps): update dependency json-ld to v3.3.2 (#31205) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 25c6b52fc86d447b686efc5d8a8a015432939a47 Merge: e79b2a742c ceb7972e6e Author: Claire Date: Mon Jul 29 22:42:04 2024 +0200 Merge pull request #2800 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 1229d2907a4a7ee09ee42cd24043d74561507e0a commit ceb7972e6e6ae709f1d3f6cc9ff3a19d61873d71 Author: Emelia Smith Date: Mon Jul 29 17:49:44 2024 +0200 [Glitch] Implement UI for Admin Search of Hashtags Port SCSS changes from c40e48116993e9a0b1701c40eded924dd496d5a7 to glitch-soc Signed-off-by: Claire commit eae81d32544d4433f7b46b7a527304757fa8183a Author: Michael Stanclift Date: Mon Jul 29 03:10:23 2024 -0500 [Glitch] Follow up tweaking of admin UI changes Port 848a5ca53d47d335cf74e82c584c36dce701172a to glitch-soc Signed-off-by: Claire commit 7e33583daaeff838c649a2720858017e9bea1d22 Author: Matt Jankowski Date: Mon Jul 29 13:19:05 2024 -0400 Dont run crowdin upload workflow on forks (#31195) commit 654187a995bcdc78f13c9c9bc2c674a22968a34b Merge: e79b2a742c 1229d2907a Author: Claire Date: Mon Jul 29 19:16:58 2024 +0200 Merge commit '1229d2907a4a7ee09ee42cd24043d74561507e0a' into glitch-soc/merge-upstream commit 1229d2907a4a7ee09ee42cd24043d74561507e0a Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 18:00:55 2024 +0200 chore(deps): update docker/dockerfile docker tag to v1.9 (#31187) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c40e48116993e9a0b1701c40eded924dd496d5a7 Author: Emelia Smith Date: Mon Jul 29 17:49:44 2024 +0200 Implement UI for Admin Search of Hashtags (#30880) commit 6d2ed0dcba69329062234687645a9b6f4c705344 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 17:00:01 2024 +0200 chore(deps): update dependency pg to v1.5.7 (#31176) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 91fbd5b422625bdf30b9ce6655378db7f804e510 Author: Michael Stanclift Date: Mon Jul 29 09:32:29 2024 -0500 Adjust magick version detection in admin panel (#30845) commit 8edd77a7552875abafb76ea7703364b76311c57a Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 09:07:22 2024 +0000 chore(deps): update dependency typescript to v5.5.4 (#31186) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 95eadabe4419a6c50ad836289f97a75d152a8f36 Author: Matt Jankowski Date: Mon Jul 29 04:31:42 2024 -0400 Extrude `fill_in_auth_details` method to `ProfileStories` spec support module (#31163) commit 6ad477d146552bf8ee5415ad2bc629f1bbef188b Author: kyori19 Date: Mon Jul 29 17:27:11 2024 +0900 Fix Codespaces startup fails due to Corepack download prompt (#31189) commit ec5a860924183f1f21d73c6660b9fff197b889cb Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Jul 29 10:24:15 2024 +0200 New Crowdin Translations (automated) (#31169) Co-authored-by: GitHub Actions commit 848a5ca53d47d335cf74e82c584c36dce701172a Author: Michael Stanclift Date: Mon Jul 29 03:10:23 2024 -0500 Follow up tweaking of admin UI changes (#31168) commit 37f57184824e8ca688314bfdb34e359fc36f0a43 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 08:08:07 2024 +0000 chore(deps): update dependency sanitize to v6.1.2 (#31172) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4cc634dc4454148b918b27057703ccfab8950a47 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 10:07:28 2024 +0200 fix(deps): update dependency use-debounce to v10.0.2 (#31177) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit cefd8b54848d111c4a6ad8366ed2951768311be2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 08:06:53 2024 +0000 chore(deps): update dependency husky to v9.1.3 (#31185) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 90d6297191ddf5ebd9e290d9725df96cfda00681 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 29 10:06:12 2024 +0200 chore(deps): update eslint (non-major) (#31188) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e79b2a742c93d744f47d6674bb954f3a443c6991 Merge: 8af71d021b 0e18e1ba31 Author: Claire Date: Sat Jul 27 18:20:23 2024 +0200 Merge pull request #2798 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to dd5379271410219de0806bb33e7cdfa427ea6988 commit 0e18e1ba31034ac103c7a7b5acd0e7cd299ed062 Author: David Roetzel Date: Fri Jul 26 11:36:54 2024 +0200 [Glitch] Decrease count of filtered notifications when notification requests are accepted or dismissed Port dfd43869c9180d4f4ebfc26ebce30f468a8f5422 to glitch-soc Signed-off-by: Claire commit 14bc73e94cb40b10404468bb6bda75af2c9995a6 Author: Eugen Rochko Date: Thu Jul 25 19:05:54 2024 +0200 [Glitch] Change design of confirmation modals in web UI Port 8818748b9023acd84f42bf887e361d9244521df4 to glitch-soc Co-authored-by: Renaud Chaput Signed-off-by: Claire commit fb411b6d0f333c936f4b88940fe535437cc5d989 Merge: 8af71d021b dd53792714 Author: Claire Date: Sat Jul 27 13:19:38 2024 +0200 Merge commit 'dd5379271410219de0806bb33e7cdfa427ea6988' into glitch-soc/merge-upstream commit dd5379271410219de0806bb33e7cdfa427ea6988 Author: David Roetzel Date: Fri Jul 26 16:53:49 2024 +0200 Move UI tests from controller to system spec (#31158) commit b120792f2752d358ea8142ab3f91f2ed93652fce Author: Michael Stanclift Date: Fri Jul 26 09:13:56 2024 -0500 Adjust ffmpeg version detection in admin panel (#31130) Co-authored-by: Claire commit dfd43869c9180d4f4ebfc26ebce30f468a8f5422 Author: David Roetzel Date: Fri Jul 26 11:36:54 2024 +0200 Decrease count of filtered notifications when notification requests are accepted or dismissed (#31149) commit c091fa71052690deab98f41dec42096935f0f94e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 26 11:27:48 2024 +0200 chore(deps): update devdependencies (non-major) (#31096) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 693d9b03ed37f5d74cae66dd8bfece4447cb973f Author: Emelia Smith Date: Fri Jul 26 10:53:10 2024 +0200 Enable OAuth PKCE Extension (#31129) commit 3793c845c9f7e8edf00fb3b90d31f94562d9cc0c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Jul 26 09:51:37 2024 +0200 New Crowdin Translations (automated) (#31154) Co-authored-by: GitHub Actions commit 8af71d021b8cc671a59b2e87e348d416e5b2de87 Merge: 836719edf0 cf5d2c3fe4 Author: Claire Date: Thu Jul 25 19:06:12 2024 +0200 Merge pull request #2797 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 887e64efd4abbf3980e008c7a5441b44fbd6c766 commit 8818748b9023acd84f42bf887e361d9244521df4 Author: Eugen Rochko Date: Thu Jul 25 19:05:54 2024 +0200 Change design of confirmation modals in web UI (#30884) Co-authored-by: Renaud Chaput commit cf5d2c3fe409bcb69bb2bc966c3a7c32feb6f778 Merge: 836719edf0 887e64efd4 Author: Claire Date: Thu Jul 25 17:47:02 2024 +0200 Merge commit '887e64efd4abbf3980e008c7a5441b44fbd6c766' into glitch-soc/merge-upstream commit 836719edf0c9aface8899c4833ce0bf819624950 Merge: 6be21ae8ac c94c5da7b4 Author: Claire Date: Thu Jul 25 17:46:10 2024 +0200 Merge pull request #2796 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 4d374cf73096be1e5347e131c91c99842e3c6dbb commit ff6d2ec34306462e3c548ca92df5992887a9d7fa Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 25 15:38:05 2024 +0000 fix(deps): update dependency pino to v9.3.2 (#31148) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 887e64efd4abbf3980e008c7a5441b44fbd6c766 Author: Adam Niedzielski Date: Thu Jul 25 17:02:58 2024 +0200 Allow @ at the end of an URL (#31124) commit 5f5373397fd6d1bfde907c078174de6ca14d925e Author: Matt Jankowski Date: Thu Jul 25 10:59:56 2024 -0400 Remove duplicate `omniauth_only?` helper method (#31066) commit fbf95216c55adac8af18bc709b4e3f456641013a Author: Adam Niedzielski Date: Thu Jul 25 16:51:44 2024 +0200 Fix LinkCrawlWorker NoMethodError: undefined method `[]' for nil (#31144) commit bfaa53343a0806b82181073f413d1b811b259ef7 Author: Matt Jankowski Date: Thu Jul 25 10:28:08 2024 -0400 Improve failure message on pagination matcher (#31146) commit 337a7fcf30b7253830633dfe962d4411b6b2a370 Author: Adam Niedzielski Date: Thu Jul 25 16:24:19 2024 +0200 Fix ß bug in regexp for mentions and tags (#31122) commit e881a5967149e34046f91d3f4445ebb457348b93 Author: Matt Jankowski Date: Thu Jul 25 10:18:24 2024 -0400 Add `User.unconfirmed` scope, reduce factories in `scheduler/user_cleanup` spec (#31063) commit c94c5da7b473142d92f7b7422bb3439a22e0121f Merge: 6be21ae8ac 4d374cf730 Author: Claire Date: Thu Jul 25 12:43:25 2024 +0200 Merge commit '4d374cf73096be1e5347e131c91c99842e3c6dbb' into glitch-soc/merge-upstream commit 34626b8291db22fafaa7963496bc304f2725ae58 Author: Matt Jankowski Date: Thu Jul 25 06:37:48 2024 -0400 Update schema to reflect full `db:migrate` run results (#31128) commit 4d374cf73096be1e5347e131c91c99842e3c6dbb Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 25 12:00:06 2024 +0200 chore(deps): update dependency opentelemetry-exporter-otlp to v0.28.1 (#31139) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit efa7ad9d750316917b3931ada5ed90bebed891f0 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 25 07:44:54 2024 +0000 chore(deps): update dependency node to 20.16 (#31127) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ef0e3e447a7596f336939787bbccf01c00d4f6e1 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Jul 25 09:44:00 2024 +0200 New Crowdin Translations (automated) (#31119) Co-authored-by: GitHub Actions commit 9c39fb52f300c447dce5f279e448edeb0291d002 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 25 09:21:01 2024 +0200 chore(deps): update opentelemetry-ruby (non-major) (#31138) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 8117977c882c93d93ccf4ed7a11affa453d42d9d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 25 09:20:55 2024 +0200 fix(deps): update dependency postcss to v8.4.40 (#31137) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 6be21ae8ac9b910677e983c25a6154b4ed905823 Author: Claire Date: Wed Jul 24 22:35:39 2024 +0200 Fix double indent for post attachments and metadata in grouped notifications (#2793) commit 0adf31c007cf66474041940bee2b53cdd42c984f Merge: 44caf314b8 2919d8b097 Author: Claire Date: Wed Jul 24 22:34:01 2024 +0200 Merge pull request #2794 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to e507d17520facdba0375791c5530485abe9f59ee commit 9e04007020cce3dea76bd3ed6d24f129f7ede03e Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 24 21:27:39 2024 +0200 chore(deps): update opentelemetry-ruby (non-major) (#31126) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3a49687ca0a521bbfaa4c354b817e2673b973e22 Author: Claire Date: Wed Jul 24 20:59:15 2024 +0200 Fix performance issue by using LATERAL in group notification CTE (#31123) commit 2919d8b0979f0da5467105fb311212acf15a24ac Author: Michael Stanclift Date: Tue Jul 23 10:30:45 2024 -0500 [Glitch] Recolor Preferences/Admin UI to better match main design Port 8b7f93cc7fa7a8421ceddeaa79e487360a4ad223 to glitch-soc Signed-off-by: Claire commit d999fc52ba7f7ce10d1320b081231eae37965e71 Merge: 44caf314b8 06f070d86d Author: Claire Date: Wed Jul 24 20:07:37 2024 +0200 Merge commit '06f070d86d448b97c082c038220becaec8a038ce' into glitch-soc/merge-upstream commit 44caf314b8727980dc7bf236e517a30dfe13a37e Merge: 2656381656 e507d17520 Author: Claire Date: Wed Jul 24 20:07:23 2024 +0200 Merge pull request #2791 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to cd0ca4b99473f54464e5134f91b7b1c8d5544011 commit 06f070d86d448b97c082c038220becaec8a038ce Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 24 10:13:09 2024 +0200 fix(deps): update dependency fuzzysort to v3 (#30315) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput commit e507d17520facdba0375791c5530485abe9f59ee Author: Claire Date: Tue Jul 23 14:11:08 2024 +0200 [Glitch] Widen the clickable area for statuses in grouped notifications Port a8330be93ee825948a17c810af33e28bfa2c56c8 to glitch-soc Signed-off-by: Claire commit 977337f2d245a617b970021379189555e8e1edb9 Author: Nick Schonning Date: Tue Jul 23 02:46:09 2024 -0400 [Glitch] Update Prettier to 3.3.3 Port 9a015a2a157b43ea63d911327248635e629a72c9 to glitch-soc Signed-off-by: Claire commit 838ea5f9cdac103a6f5cc9f63c35315f8985eeb1 Author: Claire Date: Tue Jul 23 08:20:17 2024 +0200 [Glitch] Fix keyboard shortcuts and navigation in grouped notifications Port af06d74574745deb738e6f526f4d74c31760102d to glitch-soc Signed-off-by: Claire commit 68000956f4b43123383f121506a1fbec5a3d2aa2 Merge: 2656381656 cd0ca4b994 Author: Claire Date: Tue Jul 23 19:31:23 2024 +0200 Merge commit 'cd0ca4b99473f54464e5134f91b7b1c8d5544011' into glitch-soc/merge-upstream commit 8b7f93cc7fa7a8421ceddeaa79e487360a4ad223 Author: Michael Stanclift Date: Tue Jul 23 10:30:45 2024 -0500 Recolor Preferences/Admin UI to better match main design (#31034) commit cd0ca4b99473f54464e5134f91b7b1c8d5544011 Author: Adam Niedzielski Date: Tue Jul 23 16:42:31 2024 +0200 Select correct self link when parsing Webfinger response (#31110) commit a8330be93ee825948a17c810af33e28bfa2c56c8 Author: Claire Date: Tue Jul 23 14:11:08 2024 +0200 Widen the clickable area for statuses in grouped notifications (#31111) commit 2656381656350ccc0fd2e3dc4afd605e696c307f Merge: ddc1f7ee44 cbf25634a9 Author: Claire Date: Tue Jul 23 14:03:56 2024 +0200 Merge pull request #2789 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 55705d8191f31c1089095956fb4124f7505b4bd7 commit 871b6197df0be1be9ea597163b8cac0740a8b9e2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 23 10:59:18 2024 +0200 chore(deps): update dependency public_suffix to v6.0.1 (#31109) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit bb2e5a4b585875b85f5025a9124b9b476b408c25 Author: Emelia Smith Date: Tue Jul 23 10:12:30 2024 +0200 Add audit logs to Admin::InstancesController (#27386) commit 1b839d2cbab2acf6730c73ee7250c4f436cf8489 Author: Matt Jankowski Date: Tue Jul 23 02:51:57 2024 -0400 Fix `mastodon:stats` decoration of stats rake task (#31104) commit 9a015a2a157b43ea63d911327248635e629a72c9 Author: Nick Schonning Date: Tue Jul 23 02:46:09 2024 -0400 Update Prettier to 3.3.3 (#31106) commit 44bdfe1fed87c77be49b948d9b7ec334558c4c85 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 23 08:42:28 2024 +0200 chore(deps): update dependency opentelemetry-instrumentation-active_job to v0.7.3 (#31107) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit af06d74574745deb738e6f526f4d74c31760102d Author: Claire Date: Tue Jul 23 08:20:17 2024 +0200 Fix keyboard shortcuts and navigation in grouped notifications (#31076) commit cbf25634a9144bb6420fb0350d7ea64bed4f763f Author: Claire Date: Mon Jul 22 21:30:06 2024 +0200 [Glitch] Fix reblogging after refactor Port 55705d8191f31c1089095956fb4124f7505b4bd7 to glitch-soc Signed-off-by: Claire commit 643b1ef3e97684da49879f9ca7e8781b2f1b3b00 Author: Claire Date: Mon Jul 22 18:03:58 2024 +0200 [Glitch] Refactor CW handling in an action Port 9cb94271333ccfe488fa84d49e3351f18594e480 to glitch-soc Signed-off-by: Claire commit f13a231b3980f76fc5b105ac8e430599df19e956 Author: Claire Date: Mon Jul 22 17:45:07 2024 +0200 [Glitch] Refactor code for reblogging and favouriting Port 03dea64b794f3e6cd1e03df72578ed0004a4d84c to glitch-soc Signed-off-by: Claire commit dcfcfdcb14e86efe48ab3fa670cb586b341f4384 Merge: ddc1f7ee44 55705d8191 Author: Claire Date: Mon Jul 22 21:41:31 2024 +0200 Merge commit '55705d8191f31c1089095956fb4124f7505b4bd7' into glitch-soc/merge-upstream commit 55705d8191f31c1089095956fb4124f7505b4bd7 Author: Claire Date: Mon Jul 22 21:30:06 2024 +0200 Fix reblogging after refactor (#31105) commit ddc1f7ee44c3058e7b8430145e88660f4cc9bdc9 Merge: c72b6e03ec 2aac73341a Author: Claire Date: Mon Jul 22 19:38:53 2024 +0200 Merge pull request #2788 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 80d9bff6df137afc3376f47b62d10a2e3e9456e2 commit 9cb94271333ccfe488fa84d49e3351f18594e480 Author: Claire Date: Mon Jul 22 18:03:58 2024 +0200 Refactor CW handling in an action (#31103) commit 03dea64b794f3e6cd1e03df72578ed0004a4d84c Author: Claire Date: Mon Jul 22 17:45:07 2024 +0200 Refactor code for reblogging and favouriting (#31102) commit 2aac73341a91e61d0b12a2a0272d64500614066e Merge: c72b6e03ec 80d9bff6df Author: Claire Date: Mon Jul 22 17:38:30 2024 +0200 Merge commit '80d9bff6df137afc3376f47b62d10a2e3e9456e2' into glitch-soc/merge-upstream Conflicts: - `app/services/backup_service.rb`: Conflict due to glitch-soc's local-only posts. Ported upstream's changes while keeping glitch-soc's feature. commit 80d9bff6df137afc3376f47b62d10a2e3e9456e2 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 22 15:39:37 2024 +0200 fix(deps): update dependency immutable to v4.3.7 (#31100) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit ced5e853c7d7c7f2b849d904964ef92e93ad27c8 Author: Claire Date: Mon Jul 22 10:56:05 2024 +0200 Fix duplicate `orderedItems` in user archive's `outbox.json` (#31099) commit 6e4305de69bb3356d5d0038611052490527d3325 Author: Matt Jankowski Date: Mon Jul 22 04:02:31 2024 -0400 Fix spec descriptions around configurable limit values (#31079) commit 5a60a3b80c8fe1769ba737a286169636476e686c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Jul 22 10:01:24 2024 +0200 New Crowdin Translations (automated) (#31087) Co-authored-by: GitHub Actions commit ef796446e5b0827bc73a27d573b930b27efef579 Author: Matt Jankowski Date: Mon Jul 22 03:46:41 2024 -0400 Ignore manifest JS parse/interrupt error on CI (#31080) commit 6ee5d3b5591d96c492035274e4668cfa7891fe70 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 22 09:39:56 2024 +0200 fix(deps): update dependency jsdom to v24.1.1 (#31088) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 22d2fba2790e258096334d13e4688ae7810ebb4f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 22 07:39:38 2024 +0000 chore(deps): update definitelytyped types (non-major) (#31095) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 77ec5e11e4385546e9b10c597c0b40002a809082 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 22 07:38:52 2024 +0000 chore(deps): update dependency email_spec to v2.3.0 (#31097) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2774980589fd5d95a2a812527c269a4368e6889e Author: Claire Date: Mon Jul 22 09:37:27 2024 +0200 Fix syntax error in grouped notifications CTE on some PostgreSQL versions (#31098) commit c72b6e03ec6b4042dbf958a979b02cc6870128a9 Merge: 2e63e802b3 95984b729a Author: Claire Date: Fri Jul 19 18:57:05 2024 +0200 Merge pull request #2786 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 0397df9bef82042221f35e9938ad5b917fa1d4fc commit 95984b729a8465da36c51182e0fe5a8e518475cb Author: Claire Date: Fri Jul 19 17:26:44 2024 +0200 [Glitch] Remove routerHistory parameters from composer actions Port e768b23aa995130c14a7160165eabcf1e8570dfd to glitch-soc Signed-off-by: Claire commit 9f05a06dee264a80827a03569664931f8d443588 Author: Michael Stanclift Date: Fri Jul 19 03:30:26 2024 -0500 [Glitch] Fix double border on column filter on narrow screens Port 784e0885333769b47c8a94fde0c34bb14b1b93bb to glitch-soc Signed-off-by: Claire commit f7598b267bf952392d8125d8a60bcdb977510ddd Merge: 2e63e802b3 0397df9bef Author: Claire Date: Fri Jul 19 17:45:19 2024 +0200 Merge commit '0397df9bef82042221f35e9938ad5b917fa1d4fc' into glitch-soc/merge-upstream commit 0397df9bef82042221f35e9938ad5b917fa1d4fc Author: Matt Jankowski Date: Fri Jul 19 11:32:42 2024 -0400 Resolve `TODO` in `api/v1/admin/domain_*` controllers (#31067) commit 65a8dc7869360bd4e4fb45d876f7a2bd019d16c8 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 19 17:32:06 2024 +0200 chore(deps): update dependency selenium-webdriver to v4.23.0 (#31073) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3a00f89aa1f2280b995512cd5f91568e6d349cc6 Author: kyori19 Date: Sat Jul 20 00:31:48 2024 +0900 Respect `Account::DISPLAY_NAME_LENGTH_LIMIT` in account spec correctly (#31075) commit e768b23aa995130c14a7160165eabcf1e8570dfd Author: Claire Date: Fri Jul 19 17:26:44 2024 +0200 Remove routerHistory parameters from composer actions (#31077) commit 2e63e802b32599537d80f524628a5affeb089df5 Author: Claire Date: Fri Jul 19 12:13:50 2024 +0200 Fix inconsistent padding in glitch-soc's grouped notifications (#2784) commit adadfdbc0355d9195815d25ad22fdee96e13ce6c Author: Matt Jankowski Date: Fri Jul 19 04:32:43 2024 -0400 Update `strong_migrations` to version 2.0.0 (#31061) commit 05342529dd5ecdd6a737451f5c3ca55de24af3e9 Author: Matt Jankowski Date: Fri Jul 19 04:31:34 2024 -0400 Reduce factory creation in AP activity move spec (#31064) commit 784e0885333769b47c8a94fde0c34bb14b1b93bb Author: Michael Stanclift Date: Fri Jul 19 03:30:26 2024 -0500 Fix double border on column filter on narrow screens (#31068) commit 8e0aed8ac73dda2138a71a090e1560ace9b9bcf1 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Jul 19 10:21:09 2024 +0200 New Crowdin Translations (automated) (#31072) Co-authored-by: GitHub Actions commit d55ecf4145c84c4b4e6a093f01bd84b24d0fc804 Merge: fb29f40a28 7224e24054 Author: Claire Date: Thu Jul 18 20:42:27 2024 +0200 Merge pull request #2782 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 82344342c1c5adb3f6a4b376559db737a9e982b7 commit 7224e2405413b816b2fbc171a9a9e7b86bae0261 Author: Renaud Chaput Date: Thu Jul 18 16:36:09 2024 +0200 [Glitch] Grouped Notifications UI Port f587ff643f552a32a1c43e103a474a5065cd3657 to glitch-soc Co-authored-by: Eugen Rochko Co-authored-by: Claire Signed-off-by: Claire commit c75fe09e2b1283c600591d76918921a71ceae989 Merge: fb29f40a28 82344342c1 Author: Claire Date: Thu Jul 18 17:56:25 2024 +0200 Merge commit '82344342c1c5adb3f6a4b376559db737a9e982b7' into glitch-soc/merge-upstream commit 82344342c1c5adb3f6a4b376559db737a9e982b7 Author: Matt Jankowski Date: Thu Jul 18 11:45:40 2024 -0400 Add link to org-level contribution guidelines to contributing doc (#31043) commit 848b59c8ae366895eb690a062698bd8f653e5959 Author: Matt Jankowski Date: Thu Jul 18 11:23:46 2024 -0400 Reduce factory creation in `MediaAttachment` model spec (#31058) commit 41b7281b56ea64b13fdf07d5ce7efadcbe65bd1c Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 18 17:23:43 2024 +0200 fix(deps): update dependency use-debounce to v10.0.1 (#31060) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 6e47637dd4f93169ec783c01f4f9b4dfb7cb66ce Author: Claire Date: Thu Jul 18 17:23:40 2024 +0200 Fix grouping across hourly buckets happening in a 12 seconds window instead of 12 hours window (#31062) commit f587ff643f552a32a1c43e103a474a5065cd3657 Author: Renaud Chaput Date: Thu Jul 18 16:36:09 2024 +0200 Grouped Notifications UI (#30440) Co-authored-by: Eugen Rochko Co-authored-by: Claire commit 7d090b2ab6a76676c861f737c3b6922da8c1292b Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Jul 18 10:00:29 2024 +0200 New Crowdin Translations (automated) (#31055) Co-authored-by: GitHub Actions commit 47ea83d2469e461b82e6d837ea83ad561128fe7a Author: Matt Jankowski Date: Thu Jul 18 04:00:19 2024 -0400 Reduce factory creation in `AP::ProcessStatusUpdateService` spec (#31051) commit 64c7ffdc656135b7986ce92d645f5355f638cfe4 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 18 09:53:36 2024 +0200 chore(deps): update dependency ruby-vips to v2.2.2 (#31050) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2616fde9e6edfbdbf31efad5d1818ad950ab4d4c Author: Matt Jankowski Date: Thu Jul 18 03:49:44 2024 -0400 Use change-requiring records in admin/reports controller spec (#31052) commit c5f8256801c8c840becf0ea7201bb891adf3c35a Author: Matt Jankowski Date: Thu Jul 18 03:45:59 2024 -0400 Reduce extra factories in `FanOutOnWriteService` spec (#31053) commit fb29f40a288b742f4724d50b9d47b800b43aadbb Merge: d6a2635a77 5e7720d11b Author: Claire Date: Wed Jul 17 22:42:32 2024 +0200 Merge pull request #2781 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream up to aa4d8987a00fe82490fb949b82d3baa33d0acd49 commit 5e7720d11bf0dab1be352be0de32598aec0c2c81 Merge: d6a2635a77 aa4d8987a0 Author: Claire Date: Wed Jul 17 22:20:12 2024 +0200 Merge commit 'aa4d8987a00fe82490fb949b82d3baa33d0acd49' into glitch-soc/merge-upstream commit aa4d8987a00fe82490fb949b82d3baa33d0acd49 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 17 12:42:54 2024 +0200 chore(deps): update dependency faker to v3.4.2 (#31046) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 4957771a8ae36e46cba4b8c4a6278f0e95e5850a Author: Claire Date: Wed Jul 17 11:18:25 2024 +0200 Update rexml to version 3.3.2 (#31048) commit 76c2c5c748ba47c2b7bc13570cd4301516290d90 Author: Matt Jankowski Date: Wed Jul 17 04:09:34 2024 -0400 Reduce extra round trips in `activitypub` controller specs (#31041) commit f5e90f3de3efa52c9f8ea72ffdbf091d5032cc4b Author: Matt Jankowski Date: Wed Jul 17 03:33:08 2024 -0400 Reduce extra round trips in `AP::SynchronizeFollowersService` spec (#31044) commit 81877e79505f387284c7a9de88f631eab758a319 Author: Matt Jankowski Date: Wed Jul 17 03:24:14 2024 -0400 Reduce extra round trips in `AP::FetchRemoteStatusService` spec (#31045) commit 00c110ac7ba0dd82840f1ff32113ed0e616c3470 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Jul 17 09:23:07 2024 +0200 New Crowdin Translations (automated) (#31047) Co-authored-by: GitHub Actions commit d6a2635a774248520e1affd58d3317b0dd72ab48 Merge: b7b6f1c89a c546757cd1 Author: Claire Date: Tue Jul 16 18:51:02 2024 +0200 Merge pull request #2780 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 66430cb25c824cfad0394216d8e7a523533bcf4b commit c546757cd1c93a4b34b232e9f911b06ffe0e326a Merge: b7b6f1c89a 66430cb25c Author: Claire Date: Tue Jul 16 17:54:36 2024 +0200 Merge commit '66430cb25c824cfad0394216d8e7a523533bcf4b' into glitch-soc/merge-upstream commit 66430cb25c824cfad0394216d8e7a523533bcf4b Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Jul 16 17:24:56 2024 +0200 New Crowdin Translations (automated) (#31038) Co-authored-by: GitHub Actions commit a609940ec9a370a18789ad87532a098fe6e564c9 Author: Adam Niedzielski Date: Tue Jul 16 15:23:26 2024 +0200 Fix test description in hashtag_bar (#30827) commit aa88aca0ad89f24fead6a1c6dbfad9def94bd47e Author: Emelia Smith Date: Tue Jul 16 15:23:08 2024 +0200 Add optional OAuth application to reports (#30539) commit fa54b6121691dfb5d64a42aa6bf07b4d67aa504f Author: Adam Niedzielski Date: Tue Jul 16 15:21:16 2024 +0200 Handle missing links in Webfinger response (#31030) commit c27d194eb27aeedb16e17dfb2a8f2be7c0636851 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 16 15:20:34 2024 +0200 fix(deps): update dependency pino to v9.3.1 (#31032) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c3a2f9d99309bbe2754be9ea3f5257c434ff34b0 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 16 14:14:25 2024 +0200 chore(deps): update dependency json-schema to v4.3.1 (#31012) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 905921b2efaa7bda5acca1c19056a18186ec24ff Author: Michael Stanclift Date: Tue Jul 16 02:06:19 2024 -0500 Add missing "Update Report" string in audit log (#31033) commit b7b6f1c89a001a004ca97937d8f43a4555159b31 Merge: d329eda295 70969ac64c Author: Claire Date: Mon Jul 15 19:35:20 2024 +0200 Merge pull request #2777 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 9d0bce40724eb77b7cc3917091b62e4ab159e29e commit 70969ac64c4cf2811be9aa2f8510e3d831f2533c Author: David Roetzel Date: Mon Jul 15 15:42:47 2024 +0200 [Glitch] Move filtered notifications bar in scrollable area Port 9d0bce40724eb77b7cc3917091b62e4ab159e29e to glitch-soc Co-authored-by: Claire Signed-off-by: Claire commit 64b2c712d4318445716a1f3f6e77fd005d07a7d9 Merge: d329eda295 9d0bce4072 Author: Claire Date: Mon Jul 15 18:51:38 2024 +0200 Merge commit '9d0bce40724eb77b7cc3917091b62e4ab159e29e' into glitch-soc/merge-upstream Conflicts: - `app/helpers/theme_helper.rb`: Conflict because upstream refactored theme-related code, and glitch-soc has a different theming system. commit 9d0bce40724eb77b7cc3917091b62e4ab159e29e Author: David Roetzel Date: Mon Jul 15 15:42:47 2024 +0200 Move filtered notifications bar in scrollable area (#30996) Co-authored-by: Claire commit 0b97ec3f7b0922067c1047d621975e65bfe96ad7 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 15 15:03:57 2024 +0200 fix(deps): update dependency @babel/core to v7.24.9 (#31029) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 543b59fa14a7e9b55a5a96d2cb0f38391108a561 Author: Matt Jankowski Date: Mon Jul 15 09:03:23 2024 -0400 Clean up `theme_helper` style builders (#30617) commit 91ef4a6fc5d8536378a2d3bc456711bcb95bd8f4 Author: Matt Jankowski Date: Mon Jul 15 06:42:18 2024 -0400 Add assertion about key columns to account key generate spec (#30635) commit 1dd82620712eecc18f1acd72b5a8585d37e254cf Author: Claire Date: Mon Jul 15 11:29:57 2024 +0200 Add optional `filtered` attribute to notification entities in REST API (#31011) commit 17117109adacd5811317b4927594992a9c5ddffb Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Jul 15 07:44:37 2024 +0000 New Crowdin Translations (automated) (#31018) Co-authored-by: GitHub Actions commit d61b536df30c6368a45fd4750c01322b14011b48 Author: mogaminsk Date: Mon Jul 15 16:38:48 2024 +0900 Add i18n strings for instance favicon and logo settings label (#31016) commit d329eda295dc73a1f2aaf0d412b5ce12314d1fc9 Merge: 54642244ed edec2e9fdf Author: Claire Date: Sun Jul 14 19:40:29 2024 +0200 Merge pull request #2776 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 00cb4a0313190bfa118966692a649db9c8328094 commit edec2e9fdfdf18ffa5d5591e7ae9d75e94209265 Merge: 54642244ed 00cb4a0313 Author: Claire Date: Sun Jul 14 18:43:35 2024 +0200 Merge commit '00cb4a0313190bfa118966692a649db9c8328094' into glitch-soc/merge-upstream commit 54642244ed0392cc2464ffdb354298549c646f61 Merge: 813f86d6ff 8d2a93b0cb Author: Claire Date: Fri Jul 12 17:14:23 2024 +0200 Merge pull request #2775 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to c929b4cace3f95fe54fdafe449ea7e972c8d61e8 commit 00cb4a0313190bfa118966692a649db9c8328094 Author: Matt Jankowski Date: Fri Jul 12 10:09:16 2024 -0400 Avoid repeated factory creation in media_attachments_vacuum_spec (#31000) commit c953dca1dee71f32b547e68977568cd076a6f7ae Author: Emelia Smith Date: Fri Jul 12 14:23:09 2024 +0200 Streaming: use pgPool.query instead of manually acquiring & releasing a connection (#30964) commit b87c41115e99becdfc8a6a66300b4fc6fe39bf3b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 12 14:20:32 2024 +0200 chore(deps): update dependency rubocop-rspec to v3.0.3 (#31009) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 35a437a03f4e1f606afea8953f0be62807da91cc Author: David Roetzel Date: Fri Jul 12 14:09:52 2024 +0200 Destroy `NotificationRequest`s that are dismissed (#31008) commit 8d2a93b0cba756d1fffdbc6f2d2ffa39b571044b Author: Claire Date: Thu Jul 11 21:42:58 2024 +0200 [Glitch] Add setting to disable hover cards Port ad52b04a1c88574ae3be2c56bead1b0638b253fc to glitch-soc Co-authored-by: Eugen Rochko commit 55cf5e0188834680efdc8ea4fa411ddd797ca372 Merge: 813f86d6ff c929b4cace Author: Claire Date: Fri Jul 12 13:41:54 2024 +0200 Merge commit 'c929b4cace3f95fe54fdafe449ea7e972c8d61e8' into glitch-soc/merge-upstream commit c929b4cace3f95fe54fdafe449ea7e972c8d61e8 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 12 11:29:43 2024 +0200 chore(deps): update dependency pghero to v3.6.0 (#30994) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 9cc0607358dda4e3dd46e7bcee05e6545175f626 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 12 11:29:10 2024 +0200 chore(deps): update dependency database_cleaner-active_record to v2.2.0 (#31007) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 43e24dbb13f497cf13bf301e40f8790ba5960f2d Author: Matt Jankowski Date: Fri Jul 12 04:30:52 2024 -0400 Use `include_pagination_headers` in more places (#30999) commit 28ad3588e4936f3429e5f062c76c37f50a2f38fb Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Jul 12 08:25:27 2024 +0000 New Crowdin Translations (automated) (#31006) Co-authored-by: GitHub Actions commit fdad4dc918d0eb8538d79173e86c82fd6d0290a6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 12 10:23:04 2024 +0200 fix(deps): update babel monorepo to v7.24.8 (#31002) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit cd1bc94cd2232b2583c6d3d1924fd0ae00f542bc Author: Nick Schonning Date: Fri Jul 12 04:22:31 2024 -0400 Regen RuboCop TODO for 1.65.0 (#31003) commit 73d53827ea3ef1605f97f99bf3cbeeccb30638be Author: Matt Jankowski Date: Fri Jul 12 04:19:15 2024 -0400 Add change assertion to invites destroy spec (#31004) commit bb702e6b2037b5b0f2e76b6f9d390fa0fd7abc54 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 12 10:18:35 2024 +0200 fix(deps): update dependency sass to v1.77.8 (#31005) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 813f86d6ffaedc0398c7c69e75bbd8af77dd04c6 Merge: 182fee1c45 e26052192d Author: Claire Date: Thu Jul 11 22:57:59 2024 +0200 Merge pull request #2774 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 8c8bee5a36e0cd0b5d35903f8891896447c3e060 commit ad52b04a1c88574ae3be2c56bead1b0638b253fc Author: Claire Date: Thu Jul 11 21:42:58 2024 +0200 Add setting to disable hover cards (#30931) Co-authored-by: Eugen Rochko commit e26052192d2bc11ef8adb7bb5f9d4d0fcbfc94f4 Author: Renaud Chaput Date: Thu Jul 11 15:43:42 2024 +0200 [Glitch] Change disabled buttons color in light mode to make it more visible Port 8c8bee5a36e0cd0b5d35903f8891896447c3e060 to glitch-soc Signed-off-by: Claire commit db0b12e5dcadf18c266dd2e4baa7e083a5830a3e Merge: 182fee1c45 8c8bee5a36 Author: Claire Date: Thu Jul 11 21:07:03 2024 +0200 Merge commit '8c8bee5a36e0cd0b5d35903f8891896447c3e060' into glitch-soc/merge-upstream commit 8c8bee5a36e0cd0b5d35903f8891896447c3e060 Author: Renaud Chaput Date: Thu Jul 11 15:43:42 2024 +0200 Change disabled buttons color in light mode to make it more visible (#30998) commit 6c375297236ecd1df7a5e82c24ad025b46be46cc Author: Matt Jankowski Date: Thu Jul 11 07:13:55 2024 -0400 Use `module: :auth` to wrap `devise_for` routes config (#30990) commit c244b70dc21f1a41f16588820490082a1e99b7ae Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Jul 11 10:38:35 2024 +0000 New Crowdin Translations (automated) (#30993) Co-authored-by: GitHub Actions commit 24bdba34132b0a6e193e7246304601a8ad453425 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Thu Jul 11 12:30:55 2024 +0200 chore(deps): update dependency rubocop to v1.65.0 (#30985) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 631a5eec85946848bf0b15562f82260c1f7721d8 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 10 21:59:34 2024 +0200 chore(deps): update dependency charlock_holmes to v0.7.9 (#30992) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 182fee1c454dcd71ecf408ddc2c534bf6ee3a49a Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Jul 10 18:18:15 2024 +0200 New Crowdin Translations (automated) (#2738) * New Crowdin translations * Fix bogus no.yml * Fix bogus simple_form.no.yml --------- Co-authored-by: GitHub Actions Co-authored-by: Claire commit 5c9c02417a0cde8a0b73d31f5b3f0551f83ab936 Merge: 56e347d149 959ad1d6be Author: Claire Date: Wed Jul 10 18:11:50 2024 +0200 Merge pull request #2772 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 2ea9336b6855b44126a55106a81e96ea68eaf8ff commit d436696f46814eb4c786e48dec6dd05b4bb5c278 Author: Emelia Smith Date: Wed Jul 10 17:59:18 2024 +0200 Streaming: Fix incorrect type definitions (#30977) commit 959ad1d6be5b84bd55df4e7ad04cc94e824fce5c Author: Claire Date: Wed Jul 10 17:46:33 2024 +0200 Fix deprecation warning in win95 theme commit 0d4a8a53d548aa4db43e52085f85126c2bf543d1 Author: Renaud Chaput Date: Wed Jul 10 14:23:24 2024 +0200 [Glitch] Fix SCSS mixed declarations deprecation Port 182b9248c0e798e4b0fba8339d2817ed2f094b42 to glitch-soc commit 52fb4f16ef561adb79e47e91f803176929d7ace4 Merge: 56e347d149 2ea9336b68 Author: Claire Date: Wed Jul 10 16:58:06 2024 +0200 Merge commit '2ea9336b6855b44126a55106a81e96ea68eaf8ff' into glitch-soc/merge-upstream commit 2ea9336b6855b44126a55106a81e96ea68eaf8ff Author: David Roetzel Date: Wed Jul 10 16:25:39 2024 +0200 Do not pass unknown encoding names to nokogiri. (#30987) commit 36592d10aa497db6c9a9764ee539242cc2cfdec7 Author: Renaud Chaput Date: Wed Jul 10 14:57:25 2024 +0200 Change Sidekiq readiness file to use an environment variable (#30988) commit 182b9248c0e798e4b0fba8339d2817ed2f094b42 Author: Renaud Chaput Date: Wed Jul 10 14:23:24 2024 +0200 Fix SCSS mixed declarations deprecation (#30986) commit 9984fca9a065e49acde0858487bc3cf10a744cea Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Jul 10 12:40:19 2024 +0200 New Crowdin Translations (automated) (#30983) Co-authored-by: GitHub Actions commit 8dea897a3b2a6be08911515d291eb679dc3cd792 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 10 10:04:52 2024 +0000 chore(deps): update docker.io/ruby docker tag to v3.3.4 (#30980) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit d0137910c61a565cfdaa8cf29d3e15e6345e5066 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 10 12:04:11 2024 +0200 chore(deps): update dependency ruby to v3.3.4 (#30969) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c9f08f77ed8a262a4db806d814e2701794873a70 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Jul 10 08:55:26 2024 +0200 fix(deps): update dependency sass to v1.77.7 (#30981) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 56e347d1493b81bb8f6c25aef2616cadf327313d Merge: 3e47d01a30 388672ff0d Author: Claire Date: Tue Jul 9 23:20:17 2024 +0200 Merge pull request #2771 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 967505ee9bcacf0e5189aa06c654ff586c198a46 commit 388672ff0de782350a3b18d5831614dfdefe70a2 Merge: 3e47d01a30 967505ee9b Author: Claire Date: Tue Jul 9 20:39:09 2024 +0200 Merge commit '967505ee9bcacf0e5189aa06c654ff586c198a46' into glitch-soc/merge-upstream commit 967505ee9bcacf0e5189aa06c654ff586c198a46 Author: David Roetzel Date: Tue Jul 9 15:11:34 2024 +0200 Add size limit for all PreviewCard URLs (#30973) commit ef2e48e6dac1ed327fc6ac07b0adf252d10ff607 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 9 14:53:31 2024 +0200 fix(deps): update dependency glob to v10.4.5 (#30972) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3875bd138d279eb26efce9f446fe91f49cf38f55 Author: Daniel M Brasil Date: Tue Jul 9 09:41:49 2024 -0300 Fix HTTP 500 in `/api/v1/polls/:id/votes` (#25598) commit 7542a134d5fecf82d14dcc1860be87cf6645ec7f Author: Renaud Chaput Date: Tue Jul 9 12:47:08 2024 +0200 Add a file for Sidekiq to signal it is ready to process jobs (#30971) commit 249b4117f9fbdac3888d3807a81c0e83e39d7de5 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Jul 9 07:36:13 2024 +0000 New Crowdin Translations (automated) (#30970) Co-authored-by: GitHub Actions commit f47d761e12a16c4338447aa8dbeca8365ee812cc Author: Matt Jankowski Date: Tue Jul 9 03:34:19 2024 -0400 Remove unneeded `controller` option in routes (#30958) commit 7a30c689530c93e8ea473e39cfb2e2ff6d9d2807 Author: Matt Jankowski Date: Tue Jul 9 03:34:15 2024 -0400 Use `scope module: ...` block for `.well-known` routes (#30959) commit 0dd4595704896fecb69315c1617dcb74b1cfaf67 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Jul 9 09:27:13 2024 +0200 fix(deps): update dependency glob to v10.4.4 (#30967) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 3e47d01a3035db72aa8fe4b978d03c671fbd55ec Merge: 69766370fd 80179d53ba Author: Claire Date: Mon Jul 8 22:02:56 2024 +0200 Merge pull request #2770 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to fa8e972722fb8fc056aa348dddaee4005b4a8ac4 commit 80179d53ba825c2c82178a267498311edde077f3 Author: Tianwei Dong Date: Mon Jul 8 09:10:57 2024 +0100 [Glitch] Change to use an unified constant for max media attachments per status Port 36d819bef34279bb36cdfa3ed89711405ad79591 to glitch-soc Co-authored-by: Renaud Chaput Signed-off-by: Claire commit aa8ad92fa423d02991e92cfd571ef7b5393ebbb5 Author: Renaud Chaput Date: Sun Jul 7 18:14:15 2024 +0200 [Glitch] Remove the `title` attribute when hovering a card anchor Port 981395e4d68a1c0cfccbdb8924bc11ac912d1e05 to glitch-soc Signed-off-by: Claire commit 2fa3c3a748a3a647bae2d8fc2d1bf4776871ea8b Author: Renaud Chaput Date: Sun Jul 7 18:13:10 2024 +0200 [Glitch] Add the account hover card for account search results Port 0899c91d4be0e0846caf53a4b065c4904f34d23a to glitch-soc Signed-off-by: Claire commit 6a552329881a896edb27d0eb955baabcb45938da Merge: 69766370fd fa8e972722 Author: Claire Date: Mon Jul 8 19:41:14 2024 +0200 Merge commit 'fa8e972722fb8fc056aa348dddaee4005b4a8ac4' into glitch-soc/merge-upstream commit fa8e972722fb8fc056aa348dddaee4005b4a8ac4 Author: David Roetzel Date: Mon Jul 8 18:04:36 2024 +0200 Fix author names as arrays in linked data. (#30957) commit f1300ad284d8c7877a7406e253cf7558596d9837 Author: Matt Jankowski Date: Mon Jul 8 12:01:08 2024 -0400 Rename jobs/attachments rspec tag names (#29762) commit 79b0e192d9fb06dbf203e05e6f621dc3ef4d8c73 Author: Matt Jankowski Date: Mon Jul 8 04:16:00 2024 -0400 Move test migrations paths check to workflow level (#30702) commit 36d819bef34279bb36cdfa3ed89711405ad79591 Author: Tianwei Dong Date: Mon Jul 8 09:10:57 2024 +0100 Change to use an unified constant for max media attachments per status (#29073) Co-authored-by: Renaud Chaput commit 1a37862a7606058026b1e55b767f38a6f82da504 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Jul 8 10:03:44 2024 +0200 New Crowdin Translations (automated) (#30940) Co-authored-by: GitHub Actions commit d41b43ed4fff8ccbee5eac62064c5def14f88973 Author: Claire Date: Mon Jul 8 09:41:50 2024 +0200 Limit attachments to `MEDIA_ATTACHMENTS_LIMIT` when returning posts through the API (#30932) commit fd3bfc0710999923c722222579395e9a3d9e3c73 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 8 07:22:28 2024 +0000 fix(deps): update dependency postcss-preset-env to v9.6.0 (#30944) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c29fdadefdaae5a68f6bea85d6ae3b529b6ab7e7 Author: Matt Jankowski Date: Mon Jul 8 03:21:49 2024 -0400 Use `scope module: ...` for more API routes (#30935) commit bd285cdd02a079b6c1412be04cd28cf759fd0d9d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 8 09:16:47 2024 +0200 fix(deps): update dependency glob to v10.4.3 (#30941) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit bd8481784870b04cd4fda20fa18fdeeb7a07430d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 8 07:15:48 2024 +0000 chore(deps): update dependency irb to v1.14.0 (#30947) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 5c3ec727ecff6fe74b12ae533388dbc28b5061fe Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 8 09:11:29 2024 +0200 chore(deps): update dependency typescript to v5.5.3 (#30953) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c5883e099937971e30eb17f6da3e5e8800523cfa Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Jul 8 09:11:15 2024 +0200 chore(deps): update dependency @testing-library/dom to v10.3.1 (#30954) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 981395e4d68a1c0cfccbdb8924bc11ac912d1e05 Author: Renaud Chaput Date: Sun Jul 7 18:14:15 2024 +0200 Remove the `title` attribute when hovering a card anchor (#30948) commit 0899c91d4be0e0846caf53a4b065c4904f34d23a Author: Renaud Chaput Date: Sun Jul 7 18:13:10 2024 +0200 Add the account hover card for account search results (#30949) commit 69766370fd65bb7a48dddfd247e0b22f72409f4f Merge: 05cfe04415 a99ae90d76 Author: Claire Date: Sun Jul 7 15:22:37 2024 +0200 Merge pull request #2768 from ClearlyClaire/glitch-soc/merge-upstream Merge upstream changes up to 63ba69810eca80fc2d10114a79f2988c1b75892f commit 1d35626dc7f8422e7b2da9a5e3560fa8f6aa0a25 Author: Matt Jankowski Date: Sun Jul 7 05:39:31 2024 -0400 Limit CI push triggers to `main` and `stable-*` branches (#30934) commit a99ae90d76d91285c0336411742fa88618af8775 Author: Claire Date: Sat Jul 6 09:22:24 2024 +0200 [Glitch] Fix overflow behavior on profile fields in hover cards Port 63ba69810eca80fc2d10114a79f2988c1b75892f to glitch-soc Signed-off-by: Claire commit aca1decf541ed7ac60176e2f0cf33ee4a481685f Author: Claire Date: Fri Jul 5 15:40:53 2024 +0200 [Glitch] Fix right-to-left text in preview cards Port 8f5694d79e531b94784697d92bed24d003d77353 to glitch-soc Signed-off-by: Claire commit 11dd51ef44b14d483b49f7bebed845c1ee85a107 Merge: 05cfe04415 63ba69810e Author: Claire Date: Sat Jul 6 21:02:42 2024 +0200 Merge commit '63ba69810eca80fc2d10114a79f2988c1b75892f' into glitch-soc/merge-upstream Conflicts: - `.env.production.sample`: Upstream and glitch-soc had different comments, some comments got updated upstream. Updated them in glitch-soc accordingly. commit 63ba69810eca80fc2d10114a79f2988c1b75892f Author: Claire Date: Sat Jul 6 09:22:24 2024 +0200 Fix overflow behavior on profile fields in hover cards (#30928) commit 8f5694d79e531b94784697d92bed24d003d77353 Author: Claire Date: Fri Jul 5 15:40:53 2024 +0200 Fix right-to-left text in preview cards (#30930) commit 97eddb5906640a79a1cba20823ce10e986f7f317 Author: David Roetzel Date: Fri Jul 5 15:28:52 2024 +0200 Fix details extraction when no title exists. (#30933) commit 016c1e4e788890f0c81a47640f76de136a0a8f32 Author: David Roetzel Date: Fri Jul 5 13:54:38 2024 +0200 Improve handling of encoding problems when creating link previews (#30929) commit 05f0d510052fb56478986c474192abc7cea3e775 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 5 13:32:29 2024 +0200 chore(deps): update dependency sidekiq-scheduler to v5.0.5 (#30918) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit a16c2c99b576b6815c9fefede9acc0be0d60d54d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Fri Jul 5 11:51:55 2024 +0200 fix(deps): update dependency cssnano to v7.0.4 (#30927) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 81547845ac73f860df2c86594fe0bf346745ce0e Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri Jul 5 11:09:40 2024 +0200 New Crowdin Translations (automated) (#30925) Co-authored-by: GitHub Actions commit 8c375d8a5c899b735950a7a88670a1bb2b7adcd2 Author: Matt Jankowski Date: Fri Jul 5 04:57:54 2024 -0400 Use `scope module: ...` for settings/2FA routes (#30919) commit 8de5df225edb89ef13f5ea2697876018953a97d9 Author: Claire Date: Fri Jul 5 10:54:45 2024 +0200 Change instructions to use `bundle exec rails` instead of `rake` (#30917) --- .browserslistrc | 1 + .devcontainer/Dockerfile | 3 + .devcontainer/compose.yaml | 2 +- .env.production.sample | 16 +- .eslintrc.js | 3 +- .github/ISSUE_TEMPLATE/1.web_bug_report.yml | 13 +- .../ISSUE_TEMPLATE/2.server_bug_report.yml | 13 +- .github/ISSUE_TEMPLATE/3.troubleshooting.yml | 74 + ...ture_request.yml => 4.feature_request.yml} | 2 +- .github/codecov.yml | 2 + .github/renovate.json5 | 16 +- .github/workflows/build-container-image.yml | 2 +- .github/workflows/build-nightly.yml | 4 +- .github/workflows/build-push-pr.yml | 6 +- .github/workflows/build-releases.yml | 2 +- .github/workflows/build-security.yml | 4 +- .github/workflows/bundler-audit.yml | 6 +- .github/workflows/check-i18n.yml | 8 +- .github/workflows/codeql.yml | 10 +- .github/workflows/crowdin-download-stable.yml | 70 + .github/workflows/crowdin-download.yml | 4 +- .github/workflows/crowdin-upload.yml | 8 +- .github/workflows/format-check.yml | 4 + .github/workflows/lint-css.yml | 7 +- .github/workflows/lint-haml.yml | 7 +- .github/workflows/lint-js.yml | 7 +- .github/workflows/lint-ruby.yml | 7 +- .github/workflows/rebase-needed.yml | 1 + .github/workflows/test-js.yml | 7 +- .github/workflows/test-migrations.yml | 36 +- .github/workflows/test-ruby.yml | 49 +- .gitignore | 3 + .nvmrc | 2 +- .profile | 1 - .rspec | 1 - .rubocop/strict.yml | 5 + .rubocop_todo.yml | 8 +- .ruby-version | 2 +- Aptfile | 10 +- CHANGELOG.md | 388 ++ CONTRIBUTING.md | 5 + Dockerfile | 30 +- Gemfile | 21 +- Gemfile.lock | 425 +- Procfile | 2 +- SECURITY.md | 11 +- app.json | 9 +- .../activitypub/claims_controller.rb | 18 - .../activitypub/collections_controller.rb | 6 +- .../activitypub/likes_controller.rb | 36 + .../activitypub/replies_controller.rb | 2 +- .../activitypub/shares_controller.rb | 36 + .../account_moderation_notes_controller.rb | 2 +- app/controllers/admin/accounts_controller.rb | 2 +- .../admin/announcements_controller.rb | 1 + app/controllers/admin/base_controller.rb | 5 - app/controllers/admin/dashboard_controller.rb | 8 +- .../admin/disputes/appeals_controller.rb | 1 + app/controllers/admin/instances_controller.rb | 1 + .../admin/report_notes_controller.rb | 2 +- app/controllers/admin/reports_controller.rb | 2 +- app/controllers/admin/tags_controller.rb | 18 +- .../preview_card_providers_controller.rb | 1 + .../admin/trends/tags_controller.rb | 1 + app/controllers/api/base_controller.rb | 4 +- app/controllers/api/oembed_controller.rb | 10 +- app/controllers/api/v1/accounts_controller.rb | 5 + .../api/v1/admin/domain_allows_controller.rb | 10 +- .../api/v1/admin/domain_blocks_controller.rb | 10 +- .../api/v1/crypto/deliveries_controller.rb | 30 - .../crypto/encrypted_messages_controller.rb | 47 - .../api/v1/crypto/keys/claims_controller.rb | 25 - .../api/v1/crypto/keys/counts_controller.rb | 17 - .../api/v1/crypto/keys/queries_controller.rb | 26 - .../api/v1/crypto/keys/uploads_controller.rb | 29 - .../v1/domain_blocks/previews_controller.rb | 27 + .../v1/notifications/policies_controller.rb | 4 +- .../v1/notifications/requests_controller.rb | 41 +- .../api/v1/notifications_controller.rb | 14 + .../api/v1/peers/search_controller.rb | 6 +- .../api/v1/polls/votes_controller.rb | 4 +- app/controllers/api/v1/reports_controller.rb | 2 +- .../v1/statuses/translations_controller.rb | 2 +- .../v2/notifications/accounts_controller.rb | 50 + .../v2/notifications/policies_controller.rb | 38 + .../api/v2/notifications_controller.rb | 133 + .../api/v2_alpha/notifications_controller.rb | 91 - app/controllers/api/web/embeds_controller.rb | 2 +- app/controllers/application_controller.rb | 7 +- .../auth/confirmations_controller.rb | 5 - app/controllers/auth/passwords_controller.rb | 5 - .../auth/registrations_controller.rb | 5 - app/controllers/auth/sessions_controller.rb | 23 +- app/controllers/auth/setup_controller.rb | 5 - .../concerns/account_controller_concern.rb | 2 +- .../concerns/api/error_handling.rb | 2 +- app/controllers/concerns/api/pagination.rb | 2 +- .../auth/two_factor_authentication_concern.rb | 1 - .../concerns/challengable_concern.rb | 1 - .../concerns/signature_verification.rb | 2 +- .../concerns/web_app_controller_concern.rb | 12 +- app/controllers/disputes/base_controller.rb | 5 - .../filters/statuses_controller.rb | 5 - app/controllers/filters_controller.rb | 5 - app/controllers/invites_controller.rb | 5 - .../mail_subscriptions_controller.rb | 5 - app/controllers/media_controller.rb | 4 +- app/controllers/media_proxy_controller.rb | 2 +- .../authorized_applications_controller.rb | 5 - app/controllers/redirect/base_controller.rb | 5 - app/controllers/relationships_controller.rb | 5 - app/controllers/settings/base_controller.rb | 5 - .../settings/exports_controller.rb | 13 +- .../otp_authentication_controller.rb | 2 +- .../settings/verifications_controller.rb | 20 +- .../severed_relationships_controller.rb | 5 - app/controllers/shares_controller.rb | 7 - .../statuses_cleanup_controller.rb | 5 - app/controllers/statuses_controller.rb | 9 +- .../well_known/host_meta_controller.rb | 18 +- app/helpers/accounts_helper.rb | 8 - app/helpers/admin/action_logs_helper.rb | 7 + app/helpers/admin/dashboard_helper.rb | 7 + app/helpers/admin/filter_helper.rb | 2 +- app/helpers/admin/tags_helper.rb | 15 + app/helpers/admin/trends/statuses_helper.rb | 2 +- app/helpers/application_helper.rb | 69 +- app/helpers/context_helper.rb | 18 +- app/helpers/formatting_helper.rb | 78 +- app/helpers/instance_helper.rb | 16 + app/helpers/jsonld_helper.rb | 8 - app/helpers/languages_helper.rb | 5 +- app/helpers/media_component_helper.rb | 36 - app/helpers/settings_helper.rb | 25 +- app/helpers/statuses_helper.rb | 22 +- app/helpers/theme_helper.rb | 12 +- app/helpers/webfinger_helper.rb | 7 - app/javascript/entrypoints/common.js | 1 - app/javascript/entrypoints/embed.tsx | 74 + app/javascript/entrypoints/public.tsx | 77 +- .../flavours/glitch/actions/account_notes.ts | 1 - .../flavours/glitch/actions/accounts.js | 35 +- .../flavours/glitch/actions/alerts.js | 7 + app/javascript/flavours/glitch/actions/app.ts | 3 + .../flavours/glitch/actions/compose.js | 52 +- .../flavours/glitch/actions/interactions.js | 62 + .../flavours/glitch/actions/languages.js | 12 - .../flavours/glitch/actions/markers.ts | 9 +- .../glitch/actions/notification_groups.ts | 250 + .../glitch/actions/notification_policies.ts | 6 + .../glitch/actions/notification_requests.ts | 214 + .../flavours/glitch/actions/notifications.js | 303 +- .../actions/notifications_migration.tsx | 10 + .../glitch/actions/notifications_typed.ts | 9 +- .../flavours/glitch/actions/statuses.js | 43 +- .../flavours/glitch/actions/streaming.js | 50 +- .../flavours/glitch/actions/timelines.js | 52 +- app/javascript/flavours/glitch/api.ts | 4 + .../glitch/api/notification_policies.ts | 4 +- .../flavours/glitch/api/notifications.ts | 96 + .../flavours/glitch/api_types/accounts.ts | 11 +- .../glitch/api_types/notification_policies.ts | 11 +- .../glitch/api_types/notifications.ts | 160 + .../flavours/glitch/api_types/reports.ts | 16 + .../flavours/glitch/api_types/statuses.ts | 26 +- app/javascript/flavours/glitch/common.js | 3 +- .../flavours/glitch/components/account.jsx | 4 +- .../components/admin/ReportReasonSelector.jsx | 2 +- .../glitch/components/alt_text_badge.tsx | 67 + .../flavours/glitch/components/avatar.tsx | 37 +- .../flavours/glitch/components/button.tsx | 3 + .../flavours/glitch/components/check_box.tsx | 13 +- .../glitch/components/content_warning.tsx | 27 + .../glitch/components/copy_paste_text.tsx | 90 + .../flavours/glitch/components/domain.tsx | 14 +- .../glitch/components/dropdown_menu.jsx | 5 +- .../glitch/components/dropdown_selector.tsx | 185 + .../glitch/components/error_boundary.jsx | 4 +- .../glitch/components/filter_warning.tsx | 23 + .../glitch/components/follow_button.tsx | 24 +- .../glitch/components/hover_card_account.tsx | 18 + .../components/hover_card_controller.tsx | 15 +- .../flavours/glitch/components/load_gap.tsx | 12 +- .../flavours/glitch/components/logo.tsx | 7 + .../glitch/components/media_gallery.jsx | 58 +- .../flavours/glitch/components/modal_root.jsx | 2 +- .../glitch/components/more_from_author.jsx | 6 +- .../glitch/components/navigation_portal.tsx | 32 +- .../flavours/glitch/components/router.tsx | 5 +- .../flavours/glitch/components/status.jsx | 74 +- .../glitch/components/status_action_bar.jsx | 74 +- .../glitch/components/status_banner.tsx | 37 + .../glitch/components/status_content.jsx | 75 +- .../glitch/components/status_header.jsx | 5 +- .../glitch/components/status_list.jsx | 2 +- .../glitch/components/status_prepend.jsx | 18 +- .../glitch/components/status_thread_label.tsx | 50 + .../glitch/components/timeline_hint.tsx | 30 +- .../glitch/containers/account_container.jsx | 21 +- .../glitch/containers/domain_container.jsx | 36 - .../glitch/containers/status_container.js | 133 +- .../flavours/glitch/entrypoints/common.js | 1 - .../flavours/glitch/entrypoints/embed.tsx | 74 + .../flavours/glitch/entrypoints/public.tsx | 77 +- .../account/components/account_note.jsx | 2 +- .../glitch/features/account/navigation.jsx | 5 +- .../account_gallery/components/media_item.jsx | 158 - .../account_gallery/components/media_item.tsx | 203 + .../glitch/features/account_gallery/index.jsx | 2 +- .../account_timeline/components/header.jsx | 11 +- .../containers/header_container.jsx | 27 +- .../features/account_timeline/index.jsx | 21 +- .../components/column_settings.jsx | 22 +- .../compose/components/action_bar.jsx | 15 +- .../compose/components/compose_form.jsx | 9 +- .../components/dropdown_icon_button.jsx | 5 +- .../compose/components/edit_indicator.jsx | 10 +- .../compose/components/language_dropdown.jsx | 4 - .../features/compose/components/poll_form.jsx | 2 +- .../compose/components/privacy_dropdown.jsx | 5 +- .../components/privacy_dropdown_menu.jsx | 128 - .../compose/components/reply_indicator.jsx | 10 +- .../compose/components/sensitive_button.jsx | 10 +- .../features/compose/components/upload.jsx | 81 - .../features/compose/components/upload.tsx | 130 + .../compose/components/upload_form.jsx | 56 - .../compose/components/upload_form.tsx | 188 + .../containers/compose_form_container.js | 8 +- .../containers/language_dropdown_container.js | 6 - .../containers/upload_button_container.js | 2 +- .../glitch/features/compose/index.jsx | 15 +- .../components/conversation.jsx | 25 +- .../directory/components/account_card.tsx | 52 +- .../glitch/features/directory/index.tsx | 35 +- .../glitch/features/domain_blocks/index.jsx | 5 +- .../glitch/features/followers/index.jsx | 21 +- .../glitch/features/following/index.jsx | 21 +- .../glitch/features/getting_started/index.jsx | 13 +- .../components/inline_follow_suggestions.jsx | 18 +- .../features/interaction_modal/index.jsx | 2 +- .../glitch/features/link_timeline/index.tsx | 4 +- .../glitch/features/list_timeline/index.jsx | 23 +- .../components/checkbox_with_label.jsx | 31 - .../components/checkbox_with_label.tsx | 40 + .../components/column_settings.jsx | 65 +- .../filtered_notifications_banner.tsx | 75 +- .../components/moderation_warning.tsx | 51 +- .../notifications/components/notification.jsx | 4 +- .../components/notification_request.jsx | 84 +- .../components/policy_controls.tsx | 220 + .../relationships_severance_event.jsx | 15 +- .../components/select_with_label.tsx | 153 + .../containers/column_settings_container.js | 31 +- .../containers/notification_container.js | 34 +- .../glitch/features/notifications/index.jsx | 22 +- .../glitch/features/notifications/request.jsx | 56 +- .../features/notifications/requests.jsx | 202 +- .../components/avatar_group.tsx | 31 + .../components/displayed_name.tsx | 22 + .../components/embedded_status.tsx | 178 + .../components/embedded_status_content.tsx | 93 + .../components/notification_admin_report.tsx | 124 + .../components/notification_admin_sign_up.tsx | 45 + .../components/notification_favourite.tsx | 63 + .../components/notification_follow.tsx | 86 + .../notification_follow_request.tsx | 92 + .../components/notification_group.tsx | 151 + .../notification_group_with_status.tsx | 128 + .../components/notification_mention.tsx | 72 + .../notification_moderation_warning.tsx | 13 + .../components/notification_poll.tsx | 41 + .../components/notification_reblog.tsx | 63 + .../notification_severed_relationships.tsx | 15 + .../components/notification_status.tsx | 31 + .../components/notification_update.tsx | 31 + .../components/notification_with_status.tsx | 121 + .../features/notifications_v2/filter_bar.tsx | 151 + .../features/notifications_v2/index.tsx | 343 ++ .../glitch/features/notifications_wrapper.jsx | 9 + .../glitch/features/onboarding/index.jsx | 7 +- .../glitch/features/onboarding/share.jsx | 63 +- .../picture_in_picture/components/footer.jsx | 53 +- .../features/standalone/status/index.tsx | 94 + .../features/status/components/action_bar.jsx | 17 +- .../features/status/components/card.jsx | 2 +- .../status/components/detailed_status.jsx | 336 -- .../status/components/detailed_status.tsx | 446 ++ .../containers/detailed_status_container.js | 175 - .../flavours/glitch/features/status/index.jsx | 120 +- .../features/ui/components/block_modal.jsx | 2 +- .../features/ui/components/boost_modal.tsx | 180 +- .../features/ui/components/column_link.jsx | 13 +- .../features/ui/components/columns_area.jsx | 38 +- .../ui/components/confirmation_modal.jsx | 83 - .../clear_notifications.tsx | 46 + .../confirmation_modal.tsx | 90 + .../confirmation_modals/delete_list.tsx | 58 + .../confirmation_modals/delete_status.tsx | 67 + .../confirmation_modals/edit_status.tsx | 45 + .../components/confirmation_modals/index.ts | 8 + .../confirmation_modals/log_out.tsx | 40 + .../components/confirmation_modals/reply.tsx | 46 + .../confirmation_modals/unfollow.tsx | 50 + .../ui/components/disabled_account_banner.jsx | 20 +- .../ui/components/domain_block_modal.jsx | 106 - .../ui/components/domain_block_modal.tsx | 223 + .../features/ui/components/embed_modal.jsx | 101 - .../features/ui/components/embed_modal.tsx | 116 + .../ui/components/favourite_modal.jsx | 92 - .../ui/components/favourite_modal.tsx | 90 + .../components/ignore_notifications_modal.jsx | 108 + .../features/ui/components/image_loader.jsx | 7 +- .../features/ui/components/link_footer.jsx | 21 +- .../features/ui/components/media_modal.jsx | 52 +- .../features/ui/components/modal_root.jsx | 22 +- .../features/ui/components/mute_modal.jsx | 3 +- .../ui/components/navigation_panel.jsx | 127 +- .../features/ui/components/zoomable_image.jsx | 129 +- .../features/ui/containers/modal_container.js | 4 +- .../ui/containers/notifications_container.js | 19 +- .../ui/containers/status_list_container.js | 2 +- .../flavours/glitch/features/ui/index.jsx | 28 +- .../features/ui/util/async-components.js | 14 +- .../flavours/glitch/hooks/useRenderSignal.ts | 32 + .../flavours/glitch/hooks/useSearchParam.ts | 31 + .../flavours/glitch/initial_state.js | 4 +- .../flavours/glitch/locales/ar.json | 7 +- .../flavours/glitch/locales/cs.json | 1 - .../flavours/glitch/locales/cy.json | 3 - .../flavours/glitch/locales/de.json | 15 +- .../flavours/glitch/locales/en.json | 11 +- .../flavours/glitch/locales/eo.json | 4 - .../flavours/glitch/locales/es-AR.json | 14 +- .../flavours/glitch/locales/es-MX.json | 5 - .../flavours/glitch/locales/es.json | 5 - .../flavours/glitch/locales/fa.json | 3 - .../flavours/glitch/locales/fr-CA.json | 5 - .../flavours/glitch/locales/fr.json | 5 - .../flavours/glitch/locales/id.json | 5 - .../flavours/glitch/locales/intl_provider.tsx | 2 +- .../flavours/glitch/locales/ja.json | 5 - .../flavours/glitch/locales/ko.json | 16 +- .../flavours/glitch/locales/nl.json | 3 - .../flavours/glitch/locales/pl.json | 4 - .../flavours/glitch/locales/pt-BR.json | 5 - .../flavours/glitch/locales/sv.json | 5 - .../flavours/glitch/locales/tr.json | 5 - .../flavours/glitch/locales/uk.json | 5 - .../flavours/glitch/locales/zh-CN.json | 13 +- .../flavours/glitch/locales/zh-TW.json | 7 +- .../flavours/glitch/models/account.ts | 3 + .../glitch/models/media_attachment.ts | 2 + .../glitch/models/notification_group.ts | 206 + .../glitch/models/notification_request.ts | 19 + .../flavours/glitch/models/status.ts | 2 + app/javascript/flavours/glitch/permissions.ts | 19 + .../flavours/glitch/reducers/compose.js | 8 +- .../flavours/glitch/reducers/index.ts | 2 + .../flavours/glitch/reducers/markers.ts | 25 +- .../glitch/reducers/notification_groups.ts | 634 +++ .../glitch/reducers/notification_policy.ts | 21 +- .../glitch/reducers/notification_requests.js | 96 - .../glitch/reducers/notification_requests.ts | 182 + .../flavours/glitch/reducers/notifications.js | 17 +- .../flavours/glitch/reducers/search.js | 3 +- .../flavours/glitch/reducers/settings.js | 9 +- app/javascript/flavours/glitch/scroll.ts | 27 +- .../flavours/glitch/selectors/filters.ts | 50 + .../flavours/glitch/selectors/index.js | 26 +- .../glitch/selectors/notifications.ts | 97 + .../flavours/glitch/selectors/settings.ts | 58 + app/javascript/flavours/glitch/settings.js | 7 +- .../glitch/store/middlewares/errors.ts | 2 +- .../glitch/store/middlewares/loading_bar.ts | 5 +- .../glitch/store/middlewares/sounds.ts | 2 +- .../flavours/glitch/store/typed_functions.ts | 80 +- .../flavours/glitch/styles/_mixins.scss | 14 +- .../flavours/glitch/styles/accounts.scss | 28 +- .../flavours/glitch/styles/admin.scss | 223 +- .../flavours/glitch/styles/application.scss | 1 - .../flavours/glitch/styles/basics.scss | 9 +- .../flavours/glitch/styles/components.scss | 1762 ++++--- .../flavours/glitch/styles/containers.scss | 12 +- .../glitch/styles/contrast/variables.scss | 8 +- .../flavours/glitch/styles/dashboard.scss | 13 +- .../flavours/glitch/styles/emoji_picker.scss | 8 +- .../flavours/glitch/styles/forms.scss | 95 +- .../glitch/styles/mastodon-light/diff.scss | 184 +- .../styles/mastodon-light/variables.scss | 51 +- .../flavours/glitch/styles/reset.scss | 39 +- .../flavours/glitch/styles/rtl.scss | 20 +- .../flavours/glitch/styles/statuses.scss | 239 - .../flavours/glitch/styles/tables.scss | 84 +- .../flavours/glitch/styles/variables.scss | 20 +- .../flavours/glitch/styles/widgets.scss | 247 +- .../flavours/glitch/utils/content_warning.js | 2 +- .../flavours/glitch/utils/debounce.ts | 23 + .../flavours/glitch/utils/log_out.ts | 56 +- .../flavours/glitch/utils/resize_image.js | 6 +- app/javascript/hooks/useRenderSignal.ts | 32 + app/javascript/hooks/useSearchParam.ts | 31 + app/javascript/images/filter-stripes.svg | 24 + .../mastodon/actions/account_notes.ts | 1 - app/javascript/mastodon/actions/accounts.js | 35 +- app/javascript/mastodon/actions/alerts.js | 7 + app/javascript/mastodon/actions/compose.js | 51 +- .../mastodon/actions/interactions.js | 50 + app/javascript/mastodon/actions/languages.js | 12 - app/javascript/mastodon/actions/markers.ts | 9 +- .../mastodon/actions/notification_groups.ts | 250 + .../mastodon/actions/notification_policies.ts | 6 + .../mastodon/actions/notification_requests.ts | 214 + .../mastodon/actions/notifications.js | 303 +- .../actions/notifications_migration.tsx | 10 + .../mastodon/actions/notifications_typed.ts | 9 +- app/javascript/mastodon/actions/statuses.js | 43 +- app/javascript/mastodon/actions/streaming.js | 50 +- app/javascript/mastodon/actions/timelines.js | 50 +- app/javascript/mastodon/api.ts | 4 + .../mastodon/api/notification_policies.ts | 4 +- app/javascript/mastodon/api/notifications.ts | 96 + app/javascript/mastodon/api_types/accounts.ts | 11 +- .../api_types/notification_policies.ts | 11 +- .../mastodon/api_types/notifications.ts | 160 + app/javascript/mastodon/api_types/reports.ts | 16 + app/javascript/mastodon/api_types/statuses.ts | 26 +- app/javascript/mastodon/common.js | 3 +- .../__snapshots__/avatar-test.jsx.snap | 8 +- .../components/__tests__/hashtag_bar.tsx | 2 +- .../mastodon/components/account.jsx | 4 +- .../components/admin/ReportReasonSelector.jsx | 2 +- .../mastodon/components/alt_text_badge.tsx | 67 + app/javascript/mastodon/components/avatar.tsx | 37 +- app/javascript/mastodon/components/button.tsx | 3 + .../mastodon/components/check_box.tsx | 13 +- .../mastodon/components/content_warning.tsx | 15 + .../mastodon/components/copy_paste_text.tsx | 90 + app/javascript/mastodon/components/domain.tsx | 14 +- .../mastodon/components/dropdown_menu.jsx | 5 +- .../mastodon/components/dropdown_selector.tsx | 185 + .../mastodon/components/error_boundary.jsx | 4 +- .../mastodon/components/filter_warning.tsx | 23 + .../mastodon/components/follow_button.tsx | 33 +- .../components/hover_card_account.tsx | 18 + .../components/hover_card_controller.tsx | 15 +- .../mastodon/components/load_gap.tsx | 12 +- app/javascript/mastodon/components/logo.tsx | 7 + .../mastodon/components/media_gallery.jsx | 58 +- .../mastodon/components/modal_root.jsx | 2 +- .../mastodon/components/more_from_author.jsx | 6 +- .../mastodon/components/navigation_portal.tsx | 32 +- app/javascript/mastodon/components/router.tsx | 5 +- app/javascript/mastodon/components/status.jsx | 164 +- .../mastodon/components/status_action_bar.jsx | 65 +- .../mastodon/components/status_banner.tsx | 37 + .../mastodon/components/status_content.jsx | 58 +- .../mastodon/components/status_list.jsx | 2 +- .../components/status_thread_label.tsx | 50 + .../mastodon/components/timeline_hint.tsx | 30 +- .../mastodon/containers/account_container.jsx | 21 +- .../mastodon/containers/domain_container.jsx | 36 - .../mastodon/containers/status_container.jsx | 105 +- .../account/components/account_note.jsx | 2 +- .../features/account/components/header.jsx | 4 +- .../mastodon/features/account/navigation.jsx | 5 +- .../account_gallery/components/media_item.jsx | 158 - .../account_gallery/components/media_item.tsx | 200 + .../features/account_gallery/index.jsx | 2 +- .../account_timeline/components/header.jsx | 11 +- .../containers/header_container.jsx | 27 +- .../features/account_timeline/index.jsx | 21 +- .../components/column_settings.jsx | 8 +- .../compose/components/action_bar.jsx | 15 +- .../compose/components/compose_form.jsx | 7 +- .../compose/components/edit_indicator.jsx | 10 +- .../compose/components/language_dropdown.jsx | 4 - .../features/compose/components/poll_form.jsx | 2 +- .../compose/components/privacy_dropdown.jsx | 5 +- .../components/privacy_dropdown_menu.jsx | 128 - .../compose/components/reply_indicator.jsx | 10 +- .../features/compose/components/upload.jsx | 81 - .../features/compose/components/upload.tsx | 130 + .../compose/components/upload_form.jsx | 53 - .../compose/components/upload_form.tsx | 185 + .../containers/compose_form_container.js | 4 +- .../containers/language_dropdown_container.js | 6 - .../containers/upload_button_container.js | 2 +- .../mastodon/features/compose/index.jsx | 15 +- .../components/conversation.jsx | 25 +- .../directory/components/account_card.tsx | 52 +- .../mastodon/features/directory/index.tsx | 35 +- .../mastodon/features/domain_blocks/index.jsx | 5 +- .../mastodon/features/followers/index.jsx | 21 +- .../mastodon/features/following/index.jsx | 21 +- .../features/getting_started/index.jsx | 14 +- .../components/inline_follow_suggestions.jsx | 18 +- .../features/interaction_modal/index.jsx | 2 +- .../mastodon/features/link_timeline/index.tsx | 4 +- .../mastodon/features/list_timeline/index.jsx | 23 +- .../components/checkbox_with_label.jsx | 31 - .../components/checkbox_with_label.tsx | 40 + .../components/column_settings.jsx | 62 +- .../filtered_notifications_banner.tsx | 75 +- .../components/moderation_warning.tsx | 51 +- .../notifications/components/notification.jsx | 18 +- .../components/notification_request.jsx | 84 +- .../components/policy_controls.tsx | 220 + .../relationships_severance_event.jsx | 15 +- .../components/select_with_label.tsx | 153 + .../containers/column_settings_container.js | 31 +- .../containers/notification_container.js | 41 +- .../mastodon/features/notifications/index.jsx | 47 +- .../features/notifications/request.jsx | 56 +- .../features/notifications/requests.jsx | 202 +- .../components/avatar_group.tsx | 31 + .../components/displayed_name.tsx | 22 + .../components/embedded_status.tsx | 178 + .../components/embedded_status_content.tsx | 93 + .../components/notification_admin_report.tsx | 124 + .../components/notification_admin_sign_up.tsx | 45 + .../components/notification_favourite.tsx | 63 + .../components/notification_follow.tsx | 86 + .../notification_follow_request.tsx | 92 + .../components/notification_group.tsx | 151 + .../notification_group_with_status.tsx | 128 + .../components/notification_mention.tsx | 72 + .../notification_moderation_warning.tsx | 13 + .../components/notification_poll.tsx | 41 + .../components/notification_reblog.tsx | 63 + .../notification_severed_relationships.tsx | 15 + .../components/notification_status.tsx | 31 + .../components/notification_update.tsx | 31 + .../components/notification_with_status.tsx | 117 + .../features/notifications_v2/filter_bar.tsx | 145 + .../features/notifications_v2/index.tsx | 343 ++ .../features/notifications_wrapper.jsx | 9 + .../mastodon/features/onboarding/index.jsx | 7 +- .../mastodon/features/onboarding/share.jsx | 63 +- .../picture_in_picture/components/footer.jsx | 51 +- .../features/standalone/status/index.tsx | 87 + .../features/status/components/action_bar.jsx | 17 +- .../features/status/components/card.jsx | 2 +- .../status/components/detailed_status.jsx | 318 -- .../status/components/detailed_status.tsx | 395 ++ .../containers/detailed_status_container.js | 186 - .../mastodon/features/status/index.jsx | 100 +- .../features/ui/components/block_modal.jsx | 2 +- .../features/ui/components/boost_modal.tsx | 170 +- .../features/ui/components/column_link.jsx | 11 +- .../features/ui/components/columns_area.jsx | 38 +- .../ui/components/confirmation_modal.jsx | 65 - .../clear_notifications.tsx | 46 + .../confirmation_modal.tsx | 82 + .../confirmation_modals/delete_list.tsx | 58 + .../confirmation_modals/delete_status.tsx | 67 + .../confirmation_modals/edit_status.tsx | 45 + .../components/confirmation_modals/index.ts | 8 + .../confirmation_modals/log_out.tsx | 40 + .../components/confirmation_modals/reply.tsx | 46 + .../confirmation_modals/unfollow.tsx | 50 + .../ui/components/disabled_account_banner.jsx | 20 +- .../ui/components/domain_block_modal.jsx | 106 - .../ui/components/domain_block_modal.tsx | 223 + .../features/ui/components/embed_modal.jsx | 101 - .../features/ui/components/embed_modal.tsx | 116 + .../components/ignore_notifications_modal.jsx | 108 + .../features/ui/components/image_loader.jsx | 7 +- .../features/ui/components/link_footer.jsx | 21 +- .../features/ui/components/media_modal.jsx | 52 +- .../features/ui/components/modal_root.jsx | 20 +- .../features/ui/components/mute_modal.jsx | 3 +- .../ui/components/navigation_panel.jsx | 121 +- .../features/ui/components/zoomable_image.jsx | 129 +- .../features/ui/containers/modal_container.js | 4 +- .../ui/containers/notifications_container.js | 19 +- app/javascript/mastodon/features/ui/index.jsx | 21 +- .../features/ui/util/async-components.js | 14 +- app/javascript/mastodon/initial_state.js | 2 + app/javascript/mastodon/locales/af.json | 5 - app/javascript/mastodon/locales/an.json | 20 - app/javascript/mastodon/locales/ar.json | 141 +- app/javascript/mastodon/locales/ast.json | 84 +- app/javascript/mastodon/locales/be.json | 74 +- app/javascript/mastodon/locales/bg.json | 85 +- app/javascript/mastodon/locales/bn.json | 17 - app/javascript/mastodon/locales/br.json | 24 +- app/javascript/mastodon/locales/ca.json | 119 +- app/javascript/mastodon/locales/ckb.json | 21 - app/javascript/mastodon/locales/co.json | 16 - app/javascript/mastodon/locales/cs.json | 61 +- app/javascript/mastodon/locales/cy.json | 228 +- app/javascript/mastodon/locales/da.json | 126 +- app/javascript/mastodon/locales/de.json | 156 +- app/javascript/mastodon/locales/el.json | 256 +- app/javascript/mastodon/locales/en-GB.json | 120 +- app/javascript/mastodon/locales/en.json | 531 ++- app/javascript/mastodon/locales/eo.json | 383 +- app/javascript/mastodon/locales/es-AR.json | 122 +- app/javascript/mastodon/locales/es-MX.json | 232 +- app/javascript/mastodon/locales/es.json | 128 +- app/javascript/mastodon/locales/et.json | 122 +- app/javascript/mastodon/locales/eu.json | 115 +- app/javascript/mastodon/locales/fa.json | 164 +- app/javascript/mastodon/locales/fi.json | 370 +- app/javascript/mastodon/locales/fil.json | 52 +- app/javascript/mastodon/locales/fo.json | 130 +- app/javascript/mastodon/locales/fr-CA.json | 149 +- app/javascript/mastodon/locales/fr.json | 163 +- app/javascript/mastodon/locales/fy.json | 163 +- app/javascript/mastodon/locales/ga.json | 494 +- app/javascript/mastodon/locales/gd.json | 139 +- app/javascript/mastodon/locales/gl.json | 150 +- app/javascript/mastodon/locales/he.json | 142 +- app/javascript/mastodon/locales/hi.json | 13 +- app/javascript/mastodon/locales/hr.json | 17 - app/javascript/mastodon/locales/hu.json | 124 +- app/javascript/mastodon/locales/hy.json | 19 - app/javascript/mastodon/locales/ia.json | 121 +- app/javascript/mastodon/locales/id.json | 42 +- app/javascript/mastodon/locales/ie.json | 26 - app/javascript/mastodon/locales/ig.json | 9 +- .../mastodon/locales/intl_provider.tsx | 2 +- app/javascript/mastodon/locales/io.json | 229 +- app/javascript/mastodon/locales/is.json | 124 +- app/javascript/mastodon/locales/it.json | 124 +- app/javascript/mastodon/locales/ja.json | 141 +- app/javascript/mastodon/locales/ka.json | 9 - app/javascript/mastodon/locales/kab.json | 186 +- app/javascript/mastodon/locales/kk.json | 14 - app/javascript/mastodon/locales/kn.json | 2 - app/javascript/mastodon/locales/ko.json | 166 +- app/javascript/mastodon/locales/ku.json | 20 - app/javascript/mastodon/locales/kw.json | 16 - app/javascript/mastodon/locales/la.json | 33 +- app/javascript/mastodon/locales/lad.json | 80 +- app/javascript/mastodon/locales/lt.json | 213 +- app/javascript/mastodon/locales/lv.json | 49 +- app/javascript/mastodon/locales/mk.json | 3 - app/javascript/mastodon/locales/ml.json | 120 +- app/javascript/mastodon/locales/mr.json | 5 - app/javascript/mastodon/locales/ms.json | 25 +- app/javascript/mastodon/locales/my.json | 20 - app/javascript/mastodon/locales/ne.json | 1 - app/javascript/mastodon/locales/nl.json | 130 +- app/javascript/mastodon/locales/nn.json | 128 +- app/javascript/mastodon/locales/no.json | 138 +- app/javascript/mastodon/locales/oc.json | 29 +- app/javascript/mastodon/locales/pa.json | 11 +- app/javascript/mastodon/locales/pl.json | 123 +- app/javascript/mastodon/locales/pt-BR.json | 123 +- app/javascript/mastodon/locales/pt-PT.json | 182 +- app/javascript/mastodon/locales/ro.json | 21 - app/javascript/mastodon/locales/ru.json | 128 +- app/javascript/mastodon/locales/ry.json | 88 +- app/javascript/mastodon/locales/sa.json | 14 - app/javascript/mastodon/locales/sc.json | 433 +- app/javascript/mastodon/locales/sco.json | 19 - app/javascript/mastodon/locales/si.json | 31 +- app/javascript/mastodon/locales/sk.json | 68 +- app/javascript/mastodon/locales/sl.json | 62 +- app/javascript/mastodon/locales/sq.json | 120 +- app/javascript/mastodon/locales/sr-Latn.json | 26 - app/javascript/mastodon/locales/sr.json | 26 - app/javascript/mastodon/locales/sv.json | 124 +- app/javascript/mastodon/locales/szl.json | 3 - app/javascript/mastodon/locales/ta.json | 14 - app/javascript/mastodon/locales/tai.json | 1 - app/javascript/mastodon/locales/te.json | 9 - app/javascript/mastodon/locales/th.json | 116 +- app/javascript/mastodon/locales/tok.json | 43 +- app/javascript/mastodon/locales/tr.json | 126 +- app/javascript/mastodon/locales/tt.json | 14 - app/javascript/mastodon/locales/ug.json | 1 - app/javascript/mastodon/locales/uk.json | 154 +- app/javascript/mastodon/locales/ur.json | 6 - app/javascript/mastodon/locales/uz.json | 7 - app/javascript/mastodon/locales/vi.json | 204 +- app/javascript/mastodon/locales/zgh.json | 7 - app/javascript/mastodon/locales/zh-CN.json | 204 +- app/javascript/mastodon/locales/zh-HK.json | 28 +- app/javascript/mastodon/locales/zh-TW.json | 150 +- app/javascript/mastodon/models/account.ts | 3 + .../mastodon/models/media_attachment.ts | 2 + .../mastodon/models/notification_group.ts | 206 + .../mastodon/models/notification_request.ts | 19 + app/javascript/mastodon/models/status.ts | 2 + app/javascript/mastodon/permissions.ts | 19 + .../mastodon/reducers/accounts_map.js | 9 +- app/javascript/mastodon/reducers/compose.js | 5 +- app/javascript/mastodon/reducers/index.ts | 2 + app/javascript/mastodon/reducers/markers.ts | 22 +- .../mastodon/reducers/notification_groups.ts | 634 +++ .../mastodon/reducers/notification_policy.ts | 21 +- .../reducers/notification_requests.js | 96 - .../reducers/notification_requests.ts | 182 + .../mastodon/reducers/notifications.js | 7 +- app/javascript/mastodon/reducers/search.js | 3 +- app/javascript/mastodon/reducers/settings.js | 9 +- app/javascript/mastodon/scroll.ts | 27 +- app/javascript/mastodon/selectors/filters.ts | 50 + app/javascript/mastodon/selectors/index.js | 26 +- .../mastodon/selectors/notifications.ts | 97 + app/javascript/mastodon/selectors/settings.ts | 58 + .../service_worker/web_push_locales.js | 8 +- app/javascript/mastodon/settings.js | 7 +- .../mastodon/store/middlewares/errors.ts | 2 +- .../mastodon/store/middlewares/loading_bar.ts | 5 +- .../mastodon/store/middlewares/sounds.ts | 2 +- .../mastodon/store/typed_functions.ts | 80 +- app/javascript/mastodon/stream.js | 1 - app/javascript/mastodon/test_helpers.tsx | 8 + app/javascript/mastodon/utils/debounce.ts | 23 + app/javascript/mastodon/utils/log_out.ts | 50 +- .../material-icons/400-20px/mood-fill.svg | 2 +- .../material-icons/400-20px/mood.svg | 2 +- .../material-icons/400-20px/warning-fill.svg | 2 +- .../material-icons/400-20px/warning.svg | 2 +- .../400-24px/add_photo_alternate-fill.svg | 2 +- .../400-24px/add_photo_alternate.svg | 2 +- .../400-24px/arrow_left_alt.svg | 1 + .../400-24px/bookmarks-fill.svg | 2 +- .../material-icons/400-24px/bookmarks.svg | 2 +- .../400-24px/breaking_news-fill.svg | 1 + .../material-icons/400-24px/breaking_news.svg | 1 + .../400-24px/captive_portal-fill.svg | 1 + .../400-24px/captive_portal.svg | 1 + .../material-icons/400-24px/chat.svg | 6 +- .../400-24px/chat_bubble-fill.svg | 1 + .../material-icons/400-24px/chat_bubble.svg | 1 + .../check_indeterminate_small-fill.svg | 1 + .../400-24px/check_indeterminate_small.svg | 1 + .../material-icons/400-24px/cloud-fill.svg | 1 + .../material-icons/400-24px/cloud.svg | 1 + .../400-24px/cloud_download-fill.svg | 1 + .../400-24px/cloud_download.svg | 1 + .../400-24px/cloud_sync-fill.svg | 1 + .../material-icons/400-24px/cloud_sync.svg | 1 + .../400-24px/cloud_upload-fill.svg | 1 + .../material-icons/400-24px/cloud_upload.svg | 1 + .../material-icons/400-24px/comment.svg | 1 + .../material-icons/400-24px/computer-fill.svg | 1 + .../material-icons/400-24px/computer.svg | 1 + .../400-24px/contact_mail-fill.svg | 1 + .../material-icons/400-24px/contact_mail.svg | 1 + .../material-icons/400-24px/database-fill.svg | 1 + .../material-icons/400-24px/database.svg | 1 + .../material-icons/400-24px/desktop_mac.svg | 5 + .../material-icons/400-24px/diamond-fill.svg | 1 + .../material-icons/400-24px/diamond.svg | 1 + .../material-icons/400-24px/feedback-fill.svg | 1 + .../material-icons/400-24px/feedback.svg | 1 + .../400-24px/filter_alt-fill.svg | 1 + .../material-icons/400-24px/filter_alt.svg | 1 + .../400-24px/fit_screen-fill.svg | 1 + .../material-icons/400-24px/fit_screen.svg | 1 + .../400-24px/format_paragraph.svg | 5 + .../material-icons/400-24px/groups-fill.svg | 1 + .../material-icons/400-24px/groups.svg | 1 + .../400-24px/headphones-fill.svg | 1 + .../material-icons/400-24px/headphones.svg | 1 + .../400-24px/hide_source-fill.svg | 1 + .../material-icons/400-24px/hide_source.svg | 1 + .../material-icons/400-24px/hourglass.svg | 1 + .../material-icons/400-24px/inbox-fill.svg | 1 + .../material-icons/400-24px/inbox.svg | 1 + .../material-icons/400-24px/key.svg | 1 + .../400-24px/keyboard_double_arrow_down.svg | 1 + .../material-icons/400-24px/list-fill.svg | 1 + .../material-icons/400-24px/list.svg | 1 + .../material-icons/400-24px/mood-fill.svg | 1 + .../material-icons/400-24px/mood.svg | 1 + .../400-24px/person_alert-fill.svg | 1 + .../material-icons/400-24px/person_alert.svg | 1 + .../material-icons/400-24px/photo_camera.svg | 1 + .../material-icons/400-24px/power.svg | 1 + .../material-icons/400-24px/power_off.svg | 1 + .../400-24px/quiet_time-fill.svg | 2 +- .../material-icons/400-24px/quiet_time.svg | 2 +- .../400-24px/radio_button_checked.svg | 1 + .../400-24px/radio_button_unchecked.svg | 1 + .../material-icons/400-24px/report-fill.svg | 1 + .../material-icons/400-24px/report.svg | 1 + .../400-24px/safety_check-fill.svg | 1 + .../material-icons/400-24px/safety_check.svg | 1 + .../material-icons/400-24px/save.svg | 1 + .../material-icons/400-24px/share-fill.svg | 2 +- .../material-icons/400-24px/share.svg | 2 +- .../400-24px/shield_question-fill.svg | 1 + .../400-24px/shield_question.svg | 1 + .../material-icons/400-24px/smartphone.svg | 5 + .../material-icons/400-24px/speed-fill.svg | 1 + .../material-icons/400-24px/speed.svg | 1 + .../material-icons/400-24px/sync_alt.svg | 1 + .../material-icons/400-24px/tablet.svg | 5 + .../material-icons/400-24px/toggle_off.svg | 5 + .../material-icons/400-24px/toggle_on.svg | 5 + .../400-24px/trending_up-fill.svg | 1 + .../material-icons/400-24px/trending_up.svg | 1 + app/javascript/styles/application.scss | 1 - app/javascript/styles/contrast/variables.scss | 8 +- app/javascript/styles/mailer.scss | 21 + .../styles/mastodon-light/diff.scss | 184 +- .../styles/mastodon-light/variables.scss | 51 +- app/javascript/styles/mastodon/_mixins.scss | 15 +- app/javascript/styles/mastodon/accounts.scss | 26 +- app/javascript/styles/mastodon/admin.scss | 218 +- app/javascript/styles/mastodon/basics.scss | 9 +- .../styles/mastodon/components.scss | 1773 ++++--- .../styles/mastodon/containers.scss | 4 +- app/javascript/styles/mastodon/dashboard.scss | 13 +- .../styles/mastodon/emoji_picker.scss | 8 +- app/javascript/styles/mastodon/forms.scss | 95 +- app/javascript/styles/mastodon/reset.scss | 39 +- app/javascript/styles/mastodon/rtl.scss | 20 +- app/javascript/styles/mastodon/statuses.scss | 152 - app/javascript/styles/mastodon/tables.scss | 84 +- app/javascript/styles/mastodon/variables.scss | 20 +- app/javascript/styles/mastodon/widgets.scss | 243 +- app/javascript/styles/win95.scss | 3 +- app/javascript/svg-icons/actual_size.svg | 4 + app/lib/activitypub/activity/create.rb | 61 +- app/lib/activitypub/adapter.rb | 2 +- app/lib/activitypub/linked_data_signature.rb | 9 +- app/lib/activitypub/tag_manager.rb | 12 + .../dimension/software_versions_dimension.rb | 16 +- .../system_check/software_version_check.rb | 6 +- app/lib/annual_report/archetype.rb | 12 +- .../commonly_interacted_with_accounts.rb | 2 +- .../annual_report/most_reblogged_accounts.rb | 2 +- app/lib/annual_report/most_used_apps.rb | 2 +- app/lib/annual_report/percentiles.rb | 2 +- app/lib/annual_report/source.rb | 19 +- app/lib/annual_report/time_series.rb | 2 +- app/lib/annual_report/top_hashtags.rb | 2 +- app/lib/annual_report/top_statuses.rb | 2 +- app/lib/annual_report/type_distribution.rb | 14 +- app/lib/content_security_policy.rb | 26 +- app/lib/emoji_formatter.rb | 8 +- app/lib/entity_cache.rb | 2 +- app/lib/feed_manager.rb | 2 +- app/lib/inline_renderer.rb | 2 - app/lib/link_details_extractor.rb | 32 +- app/lib/oauth_pre_authorization_extension.rb | 13 + app/lib/permalink_redirector.rb | 2 +- app/lib/plain_text_formatter.rb | 2 +- ...s_configuration.rb => redis_connection.rb} | 29 +- app/lib/request.rb | 10 +- app/lib/search_query_transformer.rb | 17 +- app/lib/themes.rb | 2 +- app/lib/vacuum/imports_vacuum.rb | 4 +- app/lib/vacuum/system_keys_vacuum.rb | 13 - app/lib/web_push_request.rb | 72 + app/lib/webfinger.rb | 17 +- app/mailers/admin_mailer.rb | 14 +- app/mailers/application_mailer.rb | 10 +- app/mailers/notification_mailer.rb | 44 +- app/mailers/user_mailer.rb | 24 +- app/models/account.rb | 84 +- app/models/account/field.rb | 4 +- app/models/account_alias.rb | 2 +- app/models/account_filter.rb | 2 +- app/models/account_migration.rb | 8 +- app/models/account_moderation_note.rb | 2 +- app/models/account_statuses_cleanup_policy.rb | 25 +- .../friends_of_friends_source.rb | 1 + app/models/account_suggestions/source.rb | 1 + app/models/admin/account_action.rb | 8 + app/models/admin/action_log_filter.rb | 11 + app/models/admin/tag_filter.rb | 74 + app/models/announcement_reaction.rb | 2 +- app/models/concerns/account/associations.rb | 3 - .../concerns/account/attribution_domains.rb | 29 + app/models/concerns/account/avatar.rb | 7 +- app/models/concerns/account/header.rb | 5 +- app/models/concerns/account/suspensions.rb | 44 + app/models/concerns/redisable.rb | 4 +- app/models/concerns/remotable.rb | 2 +- app/models/concerns/reviewable.rb | 26 + app/models/concerns/user/has_settings.rb | 4 + app/models/custom_emoji.rb | 6 +- app/models/device.rb | 36 - app/models/domain_block.rb | 4 +- app/models/encrypted_message.rb | 49 - app/models/export.rb | 36 - app/models/featured_tag.rb | 4 +- app/models/follow_recommendation.rb | 3 +- app/models/follow_recommendation_filter.rb | 13 +- app/models/form/admin_settings.rb | 4 +- app/models/form/redirect.rb | 2 +- app/models/list.rb | 10 +- app/models/list_account.rb | 8 +- app/models/media_attachment.rb | 28 + app/models/mention.rb | 4 - app/models/message_franking.rb | 19 - app/models/notification.rb | 133 +- app/models/notification_group.rb | 112 +- app/models/notification_policy.rb | 49 +- app/models/notification_request.rb | 9 +- app/models/one_time_key.rb | 22 - app/models/preview_card.rb | 9 +- app/models/preview_card_provider.rb | 19 +- app/models/remote_follow.rb | 5 +- app/models/report.rb | 2 + app/models/report_filter.rb | 14 +- app/models/report_note.rb | 2 +- app/models/session_activation.rb | 4 +- app/models/status.rb | 4 +- app/models/status_edit.rb | 14 +- app/models/system_key.rb | 41 - app/models/tag.rb | 33 +- .../trends/preview_card_provider_filter.rb | 2 +- app/models/trends/tag_filter.rb | 2 +- app/models/user.rb | 10 +- app/models/user_settings.rb | 1 + app/models/web/push_subscription.rb | 28 - .../activitypub/activity_presenter.rb | 11 - .../domain_block_preview_presenter.rb | 5 + app/presenters/export_summary.rb | 70 + .../grouped_notifications_presenter.rb | 44 + app/presenters/oauth_metadata_presenter.rb | 5 + .../activitypub/activity_serializer.rb | 2 - .../activitypub/actor_serializer.rb | 10 +- .../activitypub/collection_serializer.rb | 2 - .../activitypub/device_serializer.rb | 52 - .../encrypted_message_serializer.rb | 61 - .../activitypub/note_serializer.rb | 18 + .../activitypub/one_time_key_serializer.rb | 35 - app/serializers/initial_state_serializer.rb | 1 + app/serializers/manifest_serializer.rb | 29 +- app/serializers/oauth_metadata_serializer.rb | 1 + app/serializers/oembed_serializer.rb | 59 +- .../dedup_notification_group_serializer.rb | 22 + .../rest/domain_block_preview_serializer.rb | 5 + .../rest/encrypted_message_serializer.rb | 19 - app/serializers/rest/instance_serializer.rb | 23 +- .../rest/keys/claim_result_serializer.rb | 9 - .../rest/keys/device_serializer.rb | 6 - .../rest/keys/query_result_serializer.rb | 11 - .../rest/notification_group_serializer.rb | 24 +- .../rest/notification_policy_serializer.rb | 9 +- .../rest/notification_serializer.rb | 5 + .../rest/v1/instance_serializer.rb | 2 +- .../rest/v1/notification_policy_serializer.rb | 32 + .../accept_notification_request_service.rb | 15 +- .../activitypub/fetch_remote_actor_service.rb | 10 +- .../activitypub/fetch_replies_service.rb | 2 +- .../activitypub/process_account_service.rb | 8 +- .../activitypub/process_collection_service.rb | 4 + .../process_status_update_service.rb | 2 +- app/services/after_block_service.rb | 5 + app/services/approve_appeal_service.rb | 2 +- app/services/backup_service.rb | 6 +- app/services/delete_account_service.rb | 2 - app/services/deliver_to_device_service.rb | 78 - .../dismiss_notification_request_service.rb | 8 + app/services/fetch_link_card_service.rb | 24 +- app/services/fetch_oembed_service.rb | 2 +- app/services/fetch_resource_service.rb | 4 +- app/services/import_service.rb | 2 +- app/services/keys/claim_service.rb | 79 - app/services/keys/query_service.rb | 79 - app/services/notify_service.rb | 220 +- app/services/post_status_service.rb | 3 + app/services/process_mentions_service.rb | 2 +- app/services/purge_domain_service.rb | 4 +- app/services/report_service.rb | 4 +- app/services/resolve_account_service.rb | 13 +- app/services/software_update_check_service.rb | 2 +- app/services/translate_status_service.rb | 12 +- app/services/update_status_service.rb | 3 + app/services/verify_link_service.rb | 4 +- app/validators/domain_validator.rb | 21 +- app/validators/ed25519_key_validator.rb | 19 - app/validators/ed25519_signature_validator.rb | 29 - app/validators/email_mx_validator.rb | 8 +- app/validators/lines_validator.rb | 9 + ...l_validator.rb => user_email_validator.rb} | 10 +- app/views/admin/account_actions/new.html.haml | 8 + .../admin/accounts/_local_account.html.haml | 12 +- .../admin/accounts/_remote_account.html.haml | 2 +- app/views/admin/action_logs/index.html.haml | 2 +- .../announcements/_announcement.html.haml | 8 +- app/views/admin/announcements/index.html.haml | 2 +- app/views/admin/custom_emojis/index.html.haml | 6 +- app/views/admin/dashboard/index.html.haml | 12 +- .../admin/disputes/appeals/index.html.haml | 2 +- .../admin/email_domain_blocks/new.html.haml | 2 +- .../follow_recommendations/show.html.haml | 2 +- .../admin/instances/_dashboard.html.haml | 66 + app/views/admin/instances/_instance.html.haml | 2 +- app/views/admin/instances/show.html.haml | 81 +- app/views/admin/invites/_invite.html.haml | 6 +- app/views/admin/relays/_relay.html.haml | 8 +- .../admin/report_notes/_report_note.html.haml | 4 +- app/views/admin/reports/_actions.html.haml | 12 +- .../admin/reports/_header_details.html.haml | 10 +- app/views/admin/reports/_status.html.haml | 6 +- app/views/admin/reports/index.html.haml | 4 +- app/views/admin/reports/show.html.haml | 2 +- app/views/admin/roles/_role.html.haml | 2 +- app/views/admin/roles/index.html.haml | 4 +- app/views/admin/rules/_rule.html.haml | 2 +- .../admin/settings/appearance/show.html.haml | 2 +- .../admin/settings/branding/show.html.haml | 8 +- .../admin/settings/shared/_links.html.haml | 12 +- app/views/admin/statuses/index.html.haml | 2 +- app/views/admin/tags/_tag.html.haml | 27 + app/views/admin/tags/index.html.haml | 39 + app/views/admin/tags/show.html.haml | 14 +- .../trends/links/_preview_card.html.haml | 4 +- app/views/admin/trends/links/index.html.haml | 8 +- .../preview_card_providers/index.html.haml | 2 +- .../admin/trends/statuses/index.html.haml | 13 +- app/views/admin/trends/tags/_tag.html.haml | 4 +- app/views/admin/trends/tags/index.html.haml | 6 +- app/views/admin/users/roles/show.html.haml | 3 +- .../warning_presets/_warning_preset.html.haml | 2 +- app/views/admin/webhooks/_form.html.haml | 3 +- app/views/admin/webhooks/_webhook.html.haml | 6 +- app/views/admin/webhooks/show.html.haml | 6 +- app/views/application/_card.html.haml | 2 +- .../application/mailer/_hashtag.html.haml | 3 +- .../registrations/_account_warning.html.haml | 14 +- .../auth/registrations/_session.html.haml | 4 +- app/views/auth/registrations/new.html.haml | 2 +- app/views/disputes/strikes/_card.html.haml | 2 +- app/views/disputes/strikes/show.html.haml | 6 +- app/views/filters/_filter.html.haml | 8 +- app/views/filters/_filter_fields.html.haml | 2 +- app/views/filters/_keyword_fields.html.haml | 2 +- .../filters/statuses/_status_filter.html.haml | 6 +- app/views/filters/statuses/index.html.haml | 4 +- app/views/invites/_invite.html.haml | 8 +- app/views/kaminari/_next_page.html.haml | 2 +- app/views/kaminari/_prev_page.html.haml | 2 +- app/views/layouts/admin.html.haml | 6 +- app/views/layouts/application.html.haml | 3 +- app/views/layouts/embedded.html.haml | 4 +- app/views/layouts/error.html.haml | 1 - app/views/layouts/modal.html.haml | 4 +- app/views/media/player.html.haml | 2 + app/views/oauth/authorizations/new.html.haml | 6 +- app/views/oauth/authorizations/show.html.haml | 2 +- .../authorized_applications/index.html.haml | 6 +- app/views/redirects/show.html.haml | 2 + app/views/relationships/show.html.haml | 8 +- app/views/settings/aliases/index.html.haml | 2 +- .../settings/applications/_fields.html.haml | 36 - .../settings/applications/_form.html.haml | 36 + .../settings/applications/index.html.haml | 6 +- app/views/settings/applications/new.html.haml | 6 +- .../settings/applications/show.html.haml | 9 +- app/views/settings/exports/show.html.haml | 21 +- .../settings/featured_tags/index.html.haml | 4 +- app/views/settings/imports/index.html.haml | 9 +- app/views/settings/imports/show.html.haml | 4 +- .../_login_activity.html.haml | 2 +- .../preferences/appearance/show.html.haml | 3 +- .../preferences/notifications/show.html.haml | 2 +- .../settings/preferences/other/show.html.haml | 2 +- app/views/settings/privacy/show.html.haml | 2 +- app/views/settings/profiles/show.html.haml | 14 +- .../shared/_profile_navigation.html.haml | 8 +- .../confirmations/new.html.haml | 2 +- .../webauthn_credentials/index.html.haml | 2 +- .../index.html.haml | 6 +- .../settings/verifications/show.html.haml | 47 +- .../severed_relationships/index.html.haml | 4 +- app/views/statuses/_attachment_list.html.haml | 2 +- app/views/statuses/_detailed_status.html.haml | 80 - app/views/statuses/_poll.html.haml | 40 - app/views/statuses/_simple_status.html.haml | 70 - app/views/statuses/_status.html.haml | 2 - app/views/statuses/embed.html.haml | 3 +- app/views/statuses_cleanup/show.html.haml | 9 + app/views/user_mailer/welcome.html.haml | 2 +- app/views/user_mailer/welcome.text.erb | 2 +- .../filtered_notification_cleanup_worker.rb | 9 + app/workers/mention_resolve_worker.rb | 37 + app/workers/push_encrypted_message_worker.rb | 16 - app/workers/refollow_worker.rb | 2 +- .../auto_close_registrations_scheduler.rb | 2 +- .../scheduler/user_cleanup_scheduler.rb | 2 +- app/workers/unfilter_notifications_worker.rb | 44 +- app/workers/web/push_notification_worker.rb | 32 +- babel.config.js | 2 +- config/application.rb | 8 +- config/environments/development.rb | 2 +- config/environments/production.rb | 2 +- config/i18n-tasks.yml | 4 +- config/initializers/0_duplicate_migrations.rb | 56 - config/initializers/3_omniauth.rb | 1 + .../initializers/active_record_encryption.rb | 9 +- config/initializers/blacklists.rb | 6 - .../initializers/content_security_policy.rb | 31 +- config/initializers/cors.rb | 1 + config/initializers/doorkeeper.rb | 20 +- config/initializers/email_domains_lists.rb | 6 + config/initializers/inflections.rb | 1 - config/initializers/opentelemetry.rb | 7 +- config/initializers/paperclip.rb | 3 +- config/initializers/rack_attack.rb | 2 +- config/initializers/sidekiq.rb | 21 +- config/initializers/statsd.rb | 19 - config/initializers/stoplight.rb | 2 +- config/initializers/twitter_regex.rb | 2 +- config/initializers/vapid.rb | 2 +- config/locales-glitch/simple_form.ko.yml | 2 + config/locales/activerecord.ast.yml | 2 +- config/locales/activerecord.be.yml | 2 + config/locales/activerecord.bg.yml | 6 + config/locales/activerecord.ca.yml | 6 + config/locales/activerecord.cy.yml | 6 + config/locales/activerecord.da.yml | 6 + config/locales/activerecord.de.yml | 6 + config/locales/activerecord.el.yml | 10 +- config/locales/activerecord.en-GB.yml | 6 + config/locales/activerecord.en.yml | 6 + config/locales/activerecord.eo.yml | 8 +- config/locales/activerecord.es-AR.yml | 6 + config/locales/activerecord.es-MX.yml | 6 + config/locales/activerecord.es.yml | 6 + config/locales/activerecord.et.yml | 6 + config/locales/activerecord.fi.yml | 14 +- config/locales/activerecord.fo.yml | 6 + config/locales/activerecord.fr-CA.yml | 6 + config/locales/activerecord.fr.yml | 6 + config/locales/activerecord.fy.yml | 6 + config/locales/activerecord.ga.yml | 39 + config/locales/activerecord.gd.yml | 6 + config/locales/activerecord.gl.yml | 6 + config/locales/activerecord.he.yml | 6 + config/locales/activerecord.hu.yml | 6 + config/locales/activerecord.ia.yml | 6 + config/locales/activerecord.io.yml | 6 + config/locales/activerecord.is.yml | 6 + config/locales/activerecord.it.yml | 6 + config/locales/activerecord.ja.yml | 6 + config/locales/activerecord.kab.yml | 28 + config/locales/activerecord.ko.yml | 6 + config/locales/activerecord.lad.yml | 5 + config/locales/activerecord.lt.yml | 6 + config/locales/activerecord.lv.yml | 6 + config/locales/activerecord.ml.yml | 18 +- config/locales/activerecord.nl.yml | 6 + config/locales/activerecord.nn.yml | 6 + config/locales/activerecord.pl.yml | 6 + config/locales/activerecord.pt-BR.yml | 20 +- config/locales/activerecord.pt-PT.yml | 10 +- config/locales/activerecord.ro.yml | 12 +- config/locales/activerecord.ru.yml | 6 + config/locales/activerecord.sc.yml | 2 +- config/locales/activerecord.sk.yml | 5 + config/locales/activerecord.sq.yml | 6 + config/locales/activerecord.sv.yml | 6 + config/locales/activerecord.th.yml | 6 + config/locales/activerecord.tr.yml | 6 + config/locales/activerecord.uk.yml | 6 + config/locales/activerecord.vi.yml | 6 + config/locales/activerecord.zh-CN.yml | 8 +- config/locales/activerecord.zh-TW.yml | 8 +- config/locales/af.yml | 4 - config/locales/an.yml | 55 - config/locales/ar.yml | 127 +- config/locales/ast.yml | 111 +- config/locales/be.yml | 82 +- config/locales/bg.yml | 110 +- config/locales/bn.yml | 8 - config/locales/br.yml | 6 - config/locales/ca.yml | 172 +- config/locales/ckb.yml | 42 - config/locales/co.yml | 42 - config/locales/cs.yml | 115 +- config/locales/cy.yml | 288 +- config/locales/da.yml | 161 +- config/locales/de.yml | 199 +- config/locales/devise.ast.yml | 22 +- config/locales/devise.cy.yml | 2 +- config/locales/devise.de.yml | 4 +- config/locales/devise.el.yml | 1 + config/locales/devise.eo.yml | 9 +- config/locales/devise.fi.yml | 58 +- config/locales/devise.ga.yml | 95 + config/locales/devise.io.yml | 10 + config/locales/devise.kab.yml | 31 +- config/locales/devise.ko.yml | 2 +- config/locales/devise.lt.yml | 2 +- config/locales/devise.lv.yml | 8 +- config/locales/devise.nl.yml | 2 +- config/locales/devise.pt-BR.yml | 10 +- config/locales/devise.pt-PT.yml | 106 +- config/locales/devise.ro.yml | 109 +- config/locales/devise.ru.yml | 3 +- config/locales/devise.sc.yml | 4 +- config/locales/devise.zh-CN.yml | 46 +- config/locales/devise.zh-TW.yml | 26 +- config/locales/doorkeeper.af.yml | 1 - config/locales/doorkeeper.an.yml | 1 - config/locales/doorkeeper.ar.yml | 4 +- config/locales/doorkeeper.ast.yml | 13 +- config/locales/doorkeeper.be.yml | 2 +- config/locales/doorkeeper.bg.yml | 3 +- config/locales/doorkeeper.ca.yml | 3 +- config/locales/doorkeeper.ckb.yml | 1 - config/locales/doorkeeper.cs.yml | 2 +- config/locales/doorkeeper.cy.yml | 11 +- config/locales/doorkeeper.da.yml | 3 +- config/locales/doorkeeper.de.yml | 3 +- config/locales/doorkeeper.el.yml | 108 +- config/locales/doorkeeper.en-GB.yml | 3 +- config/locales/doorkeeper.en.yml | 3 +- config/locales/doorkeeper.eo.yml | 1 - config/locales/doorkeeper.es-AR.yml | 3 +- config/locales/doorkeeper.es-MX.yml | 5 +- config/locales/doorkeeper.es.yml | 3 +- config/locales/doorkeeper.et.yml | 3 +- config/locales/doorkeeper.eu.yml | 1 - config/locales/doorkeeper.fa.yml | 6 +- config/locales/doorkeeper.fi.yml | 57 +- config/locales/doorkeeper.fo.yml | 3 +- config/locales/doorkeeper.fr-CA.yml | 3 +- config/locales/doorkeeper.fr.yml | 7 +- config/locales/doorkeeper.fy.yml | 3 +- config/locales/doorkeeper.ga.yml | 147 + config/locales/doorkeeper.gd.yml | 5 +- config/locales/doorkeeper.gl.yml | 5 +- config/locales/doorkeeper.he.yml | 3 +- config/locales/doorkeeper.hu.yml | 13 +- config/locales/doorkeeper.ia.yml | 1 - config/locales/doorkeeper.id.yml | 1 - config/locales/doorkeeper.ie.yml | 1 - config/locales/doorkeeper.io.yml | 1 - config/locales/doorkeeper.is.yml | 3 +- config/locales/doorkeeper.it.yml | 3 +- config/locales/doorkeeper.ja.yml | 3 +- config/locales/doorkeeper.kab.yml | 46 +- config/locales/doorkeeper.ko.yml | 5 +- config/locales/doorkeeper.ku.yml | 1 - config/locales/doorkeeper.lad.yml | 1 - config/locales/doorkeeper.lt.yml | 91 +- config/locales/doorkeeper.lv.yml | 8 +- config/locales/doorkeeper.ms.yml | 1 - config/locales/doorkeeper.my.yml | 1 - config/locales/doorkeeper.nl.yml | 5 +- config/locales/doorkeeper.nn.yml | 3 +- config/locales/doorkeeper.no.yml | 1 - config/locales/doorkeeper.oc.yml | 1 - config/locales/doorkeeper.pl.yml | 3 +- config/locales/doorkeeper.pt-BR.yml | 35 +- config/locales/doorkeeper.pt-PT.yml | 74 +- config/locales/doorkeeper.ro.yml | 57 +- config/locales/doorkeeper.ru.yml | 6 +- config/locales/doorkeeper.sc.yml | 10 +- config/locales/doorkeeper.sco.yml | 1 - config/locales/doorkeeper.si.yml | 1 - config/locales/doorkeeper.sk.yml | 1 - config/locales/doorkeeper.sl.yml | 1 - config/locales/doorkeeper.sq.yml | 3 +- config/locales/doorkeeper.sr-Latn.yml | 2 +- config/locales/doorkeeper.sr.yml | 2 +- config/locales/doorkeeper.sv.yml | 5 +- config/locales/doorkeeper.th.yml | 2 +- config/locales/doorkeeper.tr.yml | 3 +- config/locales/doorkeeper.uk.yml | 3 +- config/locales/doorkeeper.vi.yml | 29 +- config/locales/doorkeeper.zh-CN.yml | 13 +- config/locales/doorkeeper.zh-HK.yml | 1 - config/locales/doorkeeper.zh-TW.yml | 5 +- config/locales/el.yml | 239 +- config/locales/en-GB.yml | 223 +- config/locales/en.yml | 227 +- config/locales/eo.yml | 175 +- config/locales/es-AR.yml | 119 +- config/locales/es-MX.yml | 213 +- config/locales/es.yml | 155 +- config/locales/et.yml | 224 +- config/locales/eu.yml | 90 - config/locales/fa.yml | 127 +- config/locales/fi.yml | 935 ++-- config/locales/fo.yml | 108 +- config/locales/fr-CA.yml | 223 +- config/locales/fr.yml | 225 +- config/locales/fy.yml | 135 +- config/locales/ga.yml | 1626 ++++++- config/locales/gd.yml | 156 +- config/locales/gl.yml | 235 +- config/locales/he.yml | 161 +- config/locales/hi.yml | 21 +- config/locales/hr.yml | 16 - config/locales/hu.yml | 190 +- config/locales/hy.yml | 28 - config/locales/ia.yml | 130 +- config/locales/id.yml | 53 - config/locales/ie.yml | 88 - config/locales/io.yml | 87 - config/locales/is.yml | 117 +- config/locales/it.yml | 213 +- config/locales/ja.yml | 171 +- config/locales/ka.yml | 10 - config/locales/kab.yml | 70 +- config/locales/kk.yml | 27 - config/locales/ko.yml | 150 +- config/locales/ku.yml | 55 - config/locales/la.yml | 1 - config/locales/lad.yml | 54 +- config/locales/lt.yml | 167 +- config/locales/lv.yml | 157 +- config/locales/ml.yml | 21 +- config/locales/ms.yml | 85 - config/locales/my.yml | 84 - config/locales/nl.yml | 133 +- config/locales/nn.yml | 174 +- config/locales/no.yml | 88 +- config/locales/oc.yml | 26 - config/locales/pa.yml | 1 - config/locales/pl.yml | 103 +- config/locales/pt-BR.yml | 165 +- config/locales/pt-PT.yml | 497 +- config/locales/ro.yml | 32 +- config/locales/ru.yml | 239 +- config/locales/ry.yml | 19 + config/locales/sc.yml | 264 +- config/locales/sco.yml | 55 - config/locales/si.yml | 47 - config/locales/simple_form.an.yml | 2 - config/locales/simple_form.ar.yml | 10 +- config/locales/simple_form.ast.yml | 48 +- config/locales/simple_form.be.yml | 6 +- config/locales/simple_form.bg.yml | 7 +- config/locales/simple_form.br.yml | 1 - config/locales/simple_form.ca.yml | 7 +- config/locales/simple_form.ckb.yml | 1 - config/locales/simple_form.co.yml | 1 - config/locales/simple_form.cs.yml | 6 +- config/locales/simple_form.cy.yml | 9 +- config/locales/simple_form.da.yml | 9 +- config/locales/simple_form.de.yml | 9 +- config/locales/simple_form.el.yml | 45 +- config/locales/simple_form.en-GB.yml | 7 +- config/locales/simple_form.en.yml | 9 +- config/locales/simple_form.eo.yml | 12 +- config/locales/simple_form.es-AR.yml | 9 +- config/locales/simple_form.es-MX.yml | 45 +- config/locales/simple_form.es.yml | 9 +- config/locales/simple_form.et.yml | 7 +- config/locales/simple_form.eu.yml | 2 - config/locales/simple_form.fa.yml | 7 +- config/locales/simple_form.fi.yml | 141 +- config/locales/simple_form.fo.yml | 9 +- config/locales/simple_form.fr-CA.yml | 13 +- config/locales/simple_form.fr.yml | 13 +- config/locales/simple_form.fy.yml | 7 +- config/locales/simple_form.ga.yml | 265 ++ config/locales/simple_form.gd.yml | 13 +- config/locales/simple_form.gl.yml | 19 +- config/locales/simple_form.he.yml | 13 +- config/locales/simple_form.hi.yml | 5 + config/locales/simple_form.hu.yml | 7 +- config/locales/simple_form.hy.yml | 1 - config/locales/simple_form.ia.yml | 5 +- config/locales/simple_form.id.yml | 2 - config/locales/simple_form.ie.yml | 2 - config/locales/simple_form.io.yml | 20 +- config/locales/simple_form.is.yml | 9 +- config/locales/simple_form.it.yml | 9 +- config/locales/simple_form.ja.yml | 7 +- config/locales/simple_form.kab.yml | 48 +- config/locales/simple_form.kk.yml | 1 - config/locales/simple_form.ko.yml | 7 +- config/locales/simple_form.ku.yml | 2 - config/locales/simple_form.lad.yml | 6 +- config/locales/simple_form.lt.yml | 11 +- config/locales/simple_form.lv.yml | 9 +- config/locales/simple_form.ms.yml | 2 - config/locales/simple_form.my.yml | 2 - config/locales/simple_form.nl.yml | 11 +- config/locales/simple_form.nn.yml | 13 +- config/locales/simple_form.no.yml | 2 - config/locales/simple_form.oc.yml | 1 - config/locales/simple_form.pl.yml | 9 +- config/locales/simple_form.pt-BR.yml | 9 +- config/locales/simple_form.pt-PT.yml | 39 +- config/locales/simple_form.ro.yml | 19 +- config/locales/simple_form.ru.yml | 17 +- config/locales/simple_form.sc.yml | 7 +- config/locales/simple_form.sco.yml | 2 - config/locales/simple_form.si.yml | 1 - config/locales/simple_form.sk.yml | 5 +- config/locales/simple_form.sl.yml | 6 +- config/locales/simple_form.sq.yml | 7 +- config/locales/simple_form.sr-Latn.yml | 6 +- config/locales/simple_form.sr.yml | 6 +- config/locales/simple_form.sv.yml | 9 +- config/locales/simple_form.th.yml | 7 +- config/locales/simple_form.tr.yml | 11 +- config/locales/simple_form.uk.yml | 13 +- config/locales/simple_form.vi.yml | 37 +- config/locales/simple_form.zh-CN.yml | 51 +- config/locales/simple_form.zh-HK.yml | 2 - config/locales/simple_form.zh-TW.yml | 29 +- config/locales/sk.yml | 72 +- config/locales/sl.yml | 66 +- config/locales/sq.yml | 194 +- config/locales/sr-Latn.yml | 92 +- config/locales/sr.yml | 114 +- config/locales/sv.yml | 140 +- config/locales/ta.yml | 9 - config/locales/te.yml | 1 - config/locales/th.yml | 88 +- config/locales/tr.yml | 169 +- config/locales/tt.yml | 11 - config/locales/uk.yml | 147 +- config/locales/uz.yml | 2 - config/locales/vi.yml | 369 +- config/locales/zgh.yml | 1 - config/locales/zh-CN.yml | 319 +- config/locales/zh-HK.yml | 88 +- config/locales/zh-TW.yml | 219 +- config/navigation.rb | 102 +- config/routes.rb | 38 +- config/routes/admin.rb | 8 +- config/routes/api.rb | 57 +- config/routes/settings.rb | 18 +- config/secrets.yml | 22 - config/webpack/rules/babel.js | 14 +- db/migrate/.rubocop.yml | 5 + .../20161122163057_remove_unneeded_indexes.rb | 6 +- ...0170508230434_create_conversation_mutes.rb | 2 +- .../20170823162448_create_status_pins.rb | 2 +- .../20170920032311_fix_reblogs_in_feeds.rb | 2 +- .../20171116161857_create_list_accounts.rb | 2 +- ...71129172043_add_index_on_stream_entries.rb | 2 +- ...95226_remove_duplicate_indexes_in_lists.rb | 4 +- ...4803_more_faster_index_on_notifications.rb | 2 +- ...for_api_v1_accounts_account_id_statuses.rb | 2 +- ...20180410220657_glitch_create_bookmarks.rb} | 11 +- .../20180617162849_remove_unused_indexes.rb | 6 +- db/migrate/20180831171112_create_bookmarks.rb | 11 +- ...0929222014_create_account_conversations.rb | 2 +- ...0181007025445_create_pghero_space_stats.rb | 2 +- ...0190103124649_create_scheduled_statuses.rb | 2 +- ...00407202420_migrate_unavailable_inboxes.rb | 2 +- .../20220824233535_create_status_trends.rb | 2 +- ...221006061337_create_preview_card_trends.rb | 2 +- ...240713171841_add_application_to_reports.rb | 8 + ...909_validate_add_application_to_reports.rb | 7 + db/migrate/20240724181224_enable_pkce.rb | 8 + ...808114841_add_new_notification_policies.rb | 11 + ...8124338_migrate_notifications_policy_v2.rb | 26 + ...637_add_attribution_domains_to_accounts.rb | 7 + ...ix_notification_permission_foreign_keys.rb | 39 + ...ve_dismissed_from_notification_requests.rb | 14 + ...20140205_drop_end_to_end_message_tables.rb | 15 + ...loyment_migrate_notifications_policy_v2.rb | 26 + ..._old_policies_from_notifications_policy.rb | 12 + ...240916190140_remove_crypto_scope_values.rb | 33 + db/schema.rb | 98 +- db/seeds.rb | 2 +- docker-compose.yml | 20 +- lib/chewy/strategy/mastodon.rb | 2 +- lib/exceptions.rb | 8 + lib/mastodon/cli/accounts.rb | 41 +- lib/mastodon/cli/base.rb | 2 +- lib/mastodon/cli/ip_blocks.rb | 2 +- lib/mastodon/cli/media.rb | 49 +- lib/mastodon/cli/progress_helper.rb | 2 +- lib/mastodon/rack_middleware.rb | 2 +- lib/mastodon/redis_config.rb | 53 - lib/mastodon/redis_configuration.rb | 120 + lib/mastodon/sidekiq_middleware.rb | 2 +- lib/mastodon/version.rb | 12 +- lib/paperclip/blurhash_transcoder.rb | 2 +- lib/paperclip/response_with_limit_adapter.rb | 7 +- lib/sanitize_ext/sanitize_config.rb | 10 +- lib/tasks/branding.rake | 2 +- lib/tasks/db.rake | 13 +- lib/tasks/emojis.rake | 2 +- lib/tasks/icons.rake | 16 +- lib/tasks/repo.rake | 34 +- lib/tasks/statistics.rake | 4 +- lib/tasks/tests.rake | 4 +- package.json | 31 +- postcss.config.js | 9 +- public/embed.js | 105 +- spec/chewy/accounts_index_spec.rb | 2 +- spec/chewy/public_statuses_index_spec.rb | 2 +- spec/chewy/statuses_index_spec.rb | 2 +- spec/chewy/tags_index_spec.rb | 2 +- spec/config/initializers/rack/attack_spec.rb | 2 +- spec/controllers/about_controller_spec.rb | 17 - .../activitypub/claims_controller_spec.rb | 19 - .../collections_controller_spec.rb | 41 +- ...lowers_synchronizations_controller_spec.rb | 26 +- .../activitypub/outboxes_controller_spec.rb | 127 +- .../activitypub/replies_controller_spec.rb | 93 +- .../admin/account_actions_controller_spec.rb | 2 +- .../admin/accounts_controller_spec.rb | 28 +- .../admin/action_logs_controller_spec.rb | 2 +- .../admin/announcements_controller_spec.rb | 102 - .../controllers/admin/base_controller_spec.rb | 2 +- .../admin/custom_emojis_controller_spec.rb | 2 +- .../admin/dashboard_controller_spec.rb | 29 +- .../admin/disputes/appeals_controller_spec.rb | 4 +- .../admin/domain_allows_controller_spec.rb | 1 - .../admin/domain_blocks_controller_spec.rb | 4 +- .../export_domain_blocks_controller_spec.rb | 22 +- .../follow_recommendations_controller_spec.rb | 2 +- .../admin/instances_controller_spec.rb | 31 +- .../admin/invites_controller_spec.rb | 58 - .../admin/ip_blocks_controller_spec.rb | 2 +- .../admin/relationships_controller_spec.rb | 2 +- .../admin/relays_controller_spec.rb | 2 +- .../admin/report_notes_controller_spec.rb | 2 +- .../admin/reports/actions_controller_spec.rb | 2 +- .../admin/reports_controller_spec.rb | 50 +- .../admin/resets_controller_spec.rb | 35 - .../admin/roles_controller_spec.rb | 2 +- .../admin/rules_controller_spec.rb | 2 +- .../admin/settings/about_controller_spec.rb | 29 - .../settings/appearance_controller_spec.rb | 29 - .../settings/branding_controller_spec.rb | 17 - .../content_retention_controller_spec.rb | 29 - .../settings/discovery_controller_spec.rb | 29 - .../settings/registrations_controller_spec.rb | 29 - .../admin/site_uploads_controller_spec.rb | 2 +- .../admin/statuses_controller_spec.rb | 2 +- .../controllers/admin/tags_controller_spec.rb | 45 - .../preview_card_providers_controller_spec.rb | 2 +- .../admin/trends/links_controller_spec.rb | 2 +- .../admin/trends/statuses_controller_spec.rb | 2 +- .../admin/trends/tags_controller_spec.rb | 2 +- .../admin/users/roles_controller_spec.rb | 2 +- ..._factor_authentications_controller_spec.rb | 2 +- .../admin/warning_presets_controller_spec.rb | 2 +- .../admin/webhooks/secrets_controller_spec.rb | 2 +- .../admin/webhooks_controller_spec.rb | 2 +- spec/controllers/api/base_controller_spec.rb | 2 +- .../controllers/api/oembed_controller_spec.rb | 22 - .../web/push_subscriptions_controller_spec.rb | 2 +- .../api/web/settings_controller_spec.rb | 24 - .../application_controller_spec.rb | 2 +- .../auth/challenges_controller_spec.rb | 2 +- .../auth/confirmations_controller_spec.rb | 2 +- .../auth/passwords_controller_spec.rb | 2 +- .../auth/registrations_controller_spec.rb | 2 +- .../auth/sessions_controller_spec.rb | 52 +- .../controllers/auth/setup_controller_spec.rb | 2 +- .../authorize_interactions_controller_spec.rb | 12 +- .../account_controller_concern_spec.rb | 22 +- .../concerns/api/error_handling_spec.rb | 2 +- .../concerns/api/rate_limit_headers_spec.rb | 2 +- spec/controllers/concerns/localized_spec.rb | 2 +- .../export_controller_concern_spec.rb | 2 +- .../concerns/user_tracking_concern_spec.rb | 4 +- .../controllers/custom_css_controller_spec.rb | 19 - .../disputes/appeals_controller_spec.rb | 4 +- spec/controllers/emojis_controller_spec.rb | 18 - .../filters/statuses_controller_spec.rb | 2 +- spec/controllers/filters_controller_spec.rb | 2 +- .../follower_accounts_controller_spec.rb | 39 +- .../following_accounts_controller_spec.rb | 39 +- spec/controllers/health_controller_spec.rb | 14 - spec/controllers/home_controller_spec.rb | 30 - .../instance_actors_controller_spec.rb | 54 - spec/controllers/invites_controller_spec.rb | 87 - spec/controllers/manifests_controller_spec.rb | 19 - spec/controllers/media_controller_spec.rb | 65 - .../media_proxy_controller_spec.rb | 42 - .../oauth/authorizations_controller_spec.rb | 48 +- ...authorized_applications_controller_spec.rb | 57 +- .../oauth/tokens_controller_spec.rb | 19 +- spec/controllers/privacy_controller_spec.rb | 14 - .../relationships_controller_spec.rb | 2 +- .../settings/aliases_controller_spec.rb | 2 +- .../settings/applications_controller_spec.rb | 178 - .../settings/deletes_controller_spec.rb | 4 +- .../blocked_accounts_controller_spec.rb | 19 - .../blocked_domains_controller_spec.rb | 20 - .../exports/bookmarks_controller_spec.rb | 24 - .../following_accounts_controller_spec.rb | 19 - .../settings/exports/lists_controller_spec.rb | 21 - .../exports/muted_accounts_controller_spec.rb | 19 - .../settings/exports_controller_spec.rb | 47 - .../settings/featured_tags_controller_spec.rb | 10 +- .../settings/imports_controller_spec.rb | 8 +- .../login_activities_controller_spec.rb | 2 +- .../migration/redirects_controller_spec.rb | 2 +- .../settings/migrations_controller_spec.rb | 12 +- .../settings/pictures_controller_spec.rb | 2 +- .../preferences/appearance_controller_spec.rb | 2 +- .../preferences/base_controller_spec.rb | 2 +- .../notifications_controller_spec.rb | 2 +- .../preferences/other_controller_spec.rb | 2 +- .../settings/sessions_controller_spec.rb | 2 +- .../confirmations_controller_spec.rb | 15 +- .../otp_authentication_controller_spec.rb | 2 +- .../recovery_codes_controller_spec.rb | 5 +- .../webauthn_credentials_controller_spec.rb | 2 +- ..._authentication_methods_controller_spec.rb | 2 +- spec/controllers/shares_controller_spec.rb | 22 - spec/controllers/statuses_controller_spec.rb | 126 +- spec/controllers/tags_controller_spec.rb | 45 - spec/fabrication/fabricators_spec.rb | 2 +- .../account_domain_block_fabricator.rb | 2 +- .../account_moderation_note_fabricator.rb | 2 +- spec/fabricators/device_fabricator.rb | 10 - .../encrypted_message_fabricator.rb | 7 - .../generated_annual_report_fabricator.rb | 8 + spec/fabricators/ip_block_fabricator.rb | 6 + spec/fabricators/list_account_fabricator.rb | 6 +- .../notification_request_fabricator.rb | 1 - spec/fabricators/one_time_key_fabricator.rb | 13 - spec/fabricators/report_note_fabricator.rb | 2 +- spec/fabricators/system_key_fabricator.rb | 3 - .../requests/activitypub-webfinger.txt | 2 +- .../alternative_utf8_spelling_in_header.txt | 18 + .../requests/latin1_posing_as_utf8_broken.txt | 17 + .../latin1_posing_as_utf8_recoverable.txt | 17 + spec/fixtures/requests/long_canonical_url.txt | 18 + spec/fixtures/requests/page_without_title.txt | 17 + spec/fixtures/requests/webfinger.txt | 2 +- ...ost_deployment_migration_generator_spec.rb | 2 +- spec/helpers/admin/dashboard_helper_spec.rb | 2 +- spec/helpers/admin/disputes_helper_spec.rb | 2 +- spec/helpers/admin/filter_helper_spec.rb | 2 +- .../admin/trends/statuses_helper_spec.rb | 2 +- spec/helpers/application_helper_spec.rb | 56 +- spec/helpers/flashes_helper_spec.rb | 2 +- spec/helpers/formatting_helper_spec.rb | 56 +- spec/helpers/instance_helper_spec.rb | 31 +- spec/helpers/json_ld_helper_spec.rb | 30 +- spec/helpers/languages_helper_spec.rb | 2 +- spec/helpers/media_component_helper_spec.rb | 24 +- spec/helpers/react_component_helper_spec.rb | 2 +- spec/helpers/settings_helper_spec.rb | 6 +- spec/helpers/statuses_helper_spec.rb | 33 +- spec/helpers/theme_helper_spec.rb | 2 +- spec/lib/account_reach_finder_spec.rb | 19 +- spec/lib/activitypub/activity/block_spec.rb | 104 +- spec/lib/activitypub/activity/create_spec.rb | 95 +- spec/lib/activitypub/activity/delete_spec.rb | 2 +- spec/lib/activitypub/activity/flag_spec.rb | 1 + spec/lib/activitypub/activity/move_spec.rb | 69 +- spec/lib/activitypub/adapter_spec.rb | 10 +- .../activitypub/linked_data_signature_spec.rb | 9 +- .../instance_accounts_dimension_spec.rb | 2 +- .../instance_languages_dimension_spec.rb | 2 +- .../dimension/languages_dimension_spec.rb | 2 +- .../dimension/servers_dimension_spec.rb | 2 +- .../software_versions_dimension_spec.rb | 2 +- .../dimension/sources_dimension_spec.rb | 2 +- .../dimension/space_usage_dimension_spec.rb | 2 +- .../dimension/tag_languages_dimension_spec.rb | 2 +- .../dimension/tag_servers_dimension_spec.rb | 2 +- spec/lib/admin/metrics/dimension_spec.rb | 2 +- .../measure/active_users_measure_spec.rb | 2 +- .../measure/instance_accounts_measure_spec.rb | 2 +- .../instance_followers_measure_spec.rb | 2 +- .../measure/instance_follows_measure_spec.rb | 2 +- ...instance_media_attachments_measure_spec.rb | 2 +- .../measure/instance_reports_measure_spec.rb | 2 +- .../measure/instance_statuses_measure_spec.rb | 2 +- .../measure/interactions_measure_spec.rb | 2 +- .../metrics/measure/new_users_measure_spec.rb | 2 +- .../measure/opened_reports_measure_spec.rb | 2 +- .../measure/resolved_reports_measure_spec.rb | 2 +- .../measure/tag_accounts_measure_spec.rb | 2 +- .../measure/tag_servers_measure_spec.rb | 2 +- .../metrics/measure/tag_uses_measure_spec.rb | 2 +- spec/lib/admin/metrics/measure_spec.rb | 2 +- .../lib/admin/system_check/base_check_spec.rb | 2 +- .../database_schema_check_spec.rb | 2 +- .../system_check/elasticsearch_check_spec.rb | 2 +- .../system_check/media_privacy_check_spec.rb | 2 +- spec/lib/admin/system_check/message_spec.rb | 2 +- .../admin/system_check/rules_check_spec.rb | 2 +- .../sidekiq_process_check_spec.rb | 2 +- .../software_version_check_spec.rb | 6 +- spec/lib/admin/system_check_spec.rb | 2 +- .../commonly_interacted_with_accounts_spec.rb | 41 + .../most_reblogged_accounts_spec.rb | 41 + spec/lib/annual_report/most_used_apps_spec.rb | 40 + spec/lib/annual_report/percentiles_spec.rb | 44 + spec/lib/annual_report/time_series_spec.rb | 46 + spec/lib/annual_report/top_hashtags_spec.rb | 43 + spec/lib/annual_report/top_statuses_spec.rb | 50 + .../annual_report/type_distribution_spec.rb | 48 + spec/lib/annual_report_spec.rb | 16 + spec/lib/cache_buster_spec.rb | 2 +- .../shared_connection_pool_spec.rb | 2 +- .../shared_timed_stack_spec.rb | 2 +- spec/lib/content_security_policy_spec.rb | 2 +- spec/lib/delivery_failure_tracker_spec.rb | 2 +- spec/lib/extractor_spec.rb | 2 +- spec/lib/fast_ip_map_spec.rb | 2 +- spec/lib/hashtag_normalizer_spec.rb | 2 +- .../importer/accounts_index_importer_spec.rb | 2 +- spec/lib/importer/base_importer_spec.rb | 2 +- .../public_statuses_index_importer_spec.rb | 2 +- .../importer/statuses_index_importer_spec.rb | 2 +- spec/lib/importer/tags_index_importer_spec.rb | 2 +- spec/lib/link_details_extractor_spec.rb | 55 + spec/lib/mastodon/cli/accounts_spec.rb | 21 +- spec/lib/mastodon/cli/cache_spec.rb | 2 +- .../cli/canonical_email_blocks_spec.rb | 2 +- spec/lib/mastodon/cli/domains_spec.rb | 2 +- .../mastodon/cli/email_domain_blocks_spec.rb | 2 +- spec/lib/mastodon/cli/emoji_spec.rb | 2 +- spec/lib/mastodon/cli/feeds_spec.rb | 2 +- spec/lib/mastodon/cli/ip_blocks_spec.rb | 2 +- spec/lib/mastodon/cli/main_spec.rb | 2 +- spec/lib/mastodon/cli/maintenance_spec.rb | 2 +- spec/lib/mastodon/cli/media_spec.rb | 2 +- spec/lib/mastodon/cli/preview_cards_spec.rb | 2 +- spec/lib/mastodon/cli/search_spec.rb | 2 +- spec/lib/mastodon/cli/settings_spec.rb | 2 +- spec/lib/mastodon/cli/statuses_spec.rb | 2 +- spec/lib/mastodon/cli/upgrade_spec.rb | 2 +- spec/lib/mastodon/migration_warning_spec.rb | 2 +- spec/lib/mastodon/redis_configuration_spec.rb | 263 + spec/lib/ostatus/tag_manager_spec.rb | 2 +- .../response_with_limit_adapter_spec.rb | 93 + spec/lib/permalink_redirector_spec.rb | 17 +- spec/lib/plain_text_formatter_spec.rb | 20 +- spec/lib/request_pool_spec.rb | 2 +- spec/lib/request_spec.rb | 10 +- spec/lib/sanitize/config_spec.rb | 2 +- spec/lib/scope_transformer_spec.rb | 19 +- spec/lib/search_query_parser_spec.rb | 2 +- spec/lib/search_query_transformer_spec.rb | 59 +- spec/lib/status_cache_hydrator_spec.rb | 2 +- spec/lib/status_filter_spec.rb | 2 +- spec/lib/status_finder_spec.rb | 2 +- spec/lib/status_reach_finder_spec.rb | 2 +- spec/lib/text_formatter_spec.rb | 8 + spec/lib/vacuum/access_tokens_vacuum_spec.rb | 34 +- spec/lib/vacuum/backups_vacuum_spec.rb | 13 +- spec/lib/vacuum/feeds_vacuum_spec.rb | 4 +- .../vacuum/media_attachments_vacuum_spec.rb | 37 +- spec/lib/vacuum/preview_cards_vacuum_spec.rb | 22 +- spec/lib/vacuum/statuses_vacuum_spec.rb | 22 +- spec/lib/vacuum/system_keys_vacuum_spec.rb | 24 - spec/lib/webfinger_resource_spec.rb | 2 +- spec/lib/webfinger_spec.rb | 41 + spec/lib/webhooks/payload_renderer_spec.rb | 2 +- spec/locales/i18n_spec.rb | 2 +- spec/mailers/notification_mailer_spec.rb | 73 +- spec/mailers/user_mailer_spec.rb | 2 +- spec/models/account_alias_spec.rb | 11 + spec/models/account_deletion_request_spec.rb | 19 + spec/models/account_filter_spec.rb | 2 +- spec/models/account_migration_spec.rb | 6 + spec/models/account_moderation_note_spec.rb | 31 + spec/models/account_spec.rb | 145 +- .../account_statuses_cleanup_policy_spec.rb | 82 +- .../friends_of_friends_source_spec.rb | 8 +- .../models/account_suggestions/source_spec.rb | 2 + spec/models/account_warning_preset_spec.rb | 2 +- spec/models/account_warning_spec.rb | 11 + spec/models/admin/account_action_spec.rb | 2 +- spec/models/admin/appeal_filter_spec.rb | 2 +- spec/models/admin/tag_filter_spec.rb | 36 + spec/models/announcement_spec.rb | 11 +- spec/models/appeal_spec.rb | 2 +- spec/models/block_spec.rb | 37 +- spec/models/bookmark_spec.rb | 43 + spec/models/concerns/account/counters_spec.rb | 2 +- .../concerns/account/finder_concern_spec.rb | 2 +- .../concerns/account/interactions_spec.rb | 2 +- .../concerns/account/statuses_search_spec.rb | 2 +- .../concerns/status/threading_concern_spec.rb | 2 +- spec/models/custom_emoji_category_spec.rb | 9 +- spec/models/custom_emoji_spec.rb | 28 +- spec/models/custom_filter_spec.rb | 21 +- spec/models/domain_allow_spec.rb | 8 +- spec/models/domain_block_spec.rb | 39 +- spec/models/export_spec.rb | 112 +- spec/models/extended_description_spec.rb | 2 +- spec/models/featured_tag_spec.rb | 141 + spec/models/follow_spec.rb | 13 +- spec/models/form/admin_settings_spec.rb | 2 +- spec/models/form/custom_emoji_batch_spec.rb | 2 +- .../form/status_filter_batch_action_spec.rb | 2 +- spec/models/import_spec.rb | 17 +- spec/models/ip_block_spec.rb | 17 +- spec/models/list_account_spec.rb | 46 + spec/models/list_spec.rb | 27 + spec/models/marker_spec.rb | 13 +- spec/models/media_attachment_spec.rb | 125 +- spec/models/mention_spec.rb | 13 +- spec/models/notification_policy_spec.rb | 20 +- spec/models/notification_request_spec.rb | 14 +- spec/models/notification_spec.rb | 127 +- spec/models/one_time_key_spec.rb | 23 - spec/models/poll_spec.rb | 33 +- spec/models/preview_card_provider_spec.rb | 20 +- spec/models/preview_card_spec.rb | 8 +- spec/models/privacy_policy_spec.rb | 2 +- spec/models/public_feed_spec.rb | 20 +- spec/models/relationship_filter_spec.rb | 2 +- spec/models/relay_spec.rb | 11 + spec/models/report_filter_spec.rb | 15 +- spec/models/report_note_spec.rb | 31 + spec/models/report_spec.rb | 2 +- spec/models/rule_spec.rb | 2 +- spec/models/status_edit_spec.rb | 2 +- spec/models/status_spec.rb | 87 +- spec/models/tag_feed_spec.rb | 2 +- spec/models/tag_spec.rb | 40 + spec/models/user_spec.rb | 178 +- spec/models/webauthn_credential_spec.rb | 35 +- spec/models/webhook_spec.rb | 35 +- .../account_moderation_note_policy_spec.rb | 5 +- spec/policies/account_policy_spec.rb | 3 +- spec/policies/account_warning_policy_spec.rb | 42 + .../account_warning_preset_policy_spec.rb | 7 +- spec/policies/admin/status_policy_spec.rb | 7 +- spec/policies/announcement_policy_spec.rb | 7 +- spec/policies/appeal_policy_spec.rb | 9 +- spec/policies/audit_log_policy_spec.rb | 20 + spec/policies/backup_policy_spec.rb | 1 - .../canonical_email_block_policy_spec.rb | 7 +- spec/policies/custom_emoji_policy_spec.rb | 1 - spec/policies/dashboard_policy_spec.rb | 20 + spec/policies/delivery_policy_spec.rb | 7 +- spec/policies/domain_allow_policy_spec.rb | 24 + spec/policies/domain_block_policy_spec.rb | 3 +- .../email_domain_block_policy_spec.rb | 1 - .../follow_recommendation_policy_spec.rb | 7 +- spec/policies/instance_policy_spec.rb | 1 - spec/policies/invite_policy_spec.rb | 1 - spec/policies/ip_block_policy_spec.rb | 7 +- spec/policies/poll_policy_spec.rb | 36 + spec/policies/preview_card_policy_spec.rb | 7 +- .../preview_card_provider_policy_spec.rb | 7 +- spec/policies/relay_policy_spec.rb | 1 - spec/policies/report_note_policy_spec.rb | 1 - spec/policies/report_policy_spec.rb | 1 - spec/policies/rule_policy_spec.rb | 7 +- spec/policies/settings_policy_spec.rb | 1 - spec/policies/software_update_policy_spec.rb | 1 - spec/policies/status_policy_spec.rb | 1 - spec/policies/tag_policy_spec.rb | 1 - spec/policies/user_policy_spec.rb | 39 +- spec/policies/user_role_policy_spec.rb | 56 + spec/policies/webhook_policy_spec.rb | 3 +- spec/presenters/export_summary_spec.rb | 86 + spec/presenters/instance_presenter_spec.rb | 2 +- spec/rails_helper.rb | 36 +- spec/requests/account_show_page_spec.rb | 18 +- spec/requests/accounts_spec.rb | 75 +- spec/requests/anonymous_cookies_spec.rb | 2 +- spec/requests/api/oembed_spec.rb | 37 + .../api/v1/accounts/credentials_spec.rb | 16 +- .../v1/accounts/familiar_followers_spec.rb | 6 +- .../api/v1/accounts/featured_tags_spec.rb | 8 +- .../api/v1/accounts/follower_accounts_spec.rb | 28 +- .../v1/accounts/following_accounts_spec.rb | 28 +- .../api/v1/accounts/identity_proofs_spec.rb | 4 +- spec/requests/api/v1/accounts/lists_spec.rb | 4 +- spec/requests/api/v1/accounts/lookup_spec.rb | 4 +- spec/requests/api/v1/accounts/notes_spec.rb | 6 +- spec/requests/api/v1/accounts/pins_spec.rb | 6 +- .../api/v1/accounts/relationships_spec.rb | 26 +- spec/requests/api/v1/accounts/search_spec.rb | 4 +- .../requests/api/v1/accounts/statuses_spec.rb | 72 +- spec/requests/api/v1/accounts_spec.rb | 88 +- .../api/v1/admin/account_actions_spec.rb | 16 +- spec/requests/api/v1/admin/accounts_spec.rb | 54 +- .../v1/admin/canonical_email_blocks_spec.rb | 69 +- spec/requests/api/v1/admin/dimensions_spec.rb | 9 +- .../api/v1/admin/domain_allows_spec.rb | 41 +- .../api/v1/admin/domain_blocks_spec.rb | 82 +- .../api/v1/admin/email_domain_blocks_spec.rb | 48 +- spec/requests/api/v1/admin/ip_blocks_spec.rb | 69 +- spec/requests/api/v1/admin/measures_spec.rb | 8 +- spec/requests/api/v1/admin/reports_spec.rb | 44 +- spec/requests/api/v1/admin/retention_spec.rb | 8 +- spec/requests/api/v1/admin/tags_spec.rb | 62 +- .../api/v1/admin/trends/links/links_spec.rb | 20 +- .../links/preview_card_providers_spec.rb | 8 +- .../api/v1/admin/trends/statuses_spec.rb | 8 +- .../requests/api/v1/admin/trends/tags_spec.rb | 8 +- .../api/v1/announcements/reactions_spec.rb | 12 +- spec/requests/api/v1/announcements_spec.rb | 12 +- spec/requests/api/v1/annual_reports_spec.rb | 63 + spec/requests/api/v1/apps/credentials_spec.rb | 39 +- spec/requests/api/v1/apps_spec.rb | 66 +- spec/requests/api/v1/blocks_spec.rb | 27 +- spec/requests/api/v1/bookmarks_spec.rb | 17 +- spec/requests/api/v1/conversations_spec.rb | 20 +- spec/requests/api/v1/csp_spec.rb | 2 +- spec/requests/api/v1/custom_emojis_spec.rb | 10 +- spec/requests/api/v1/directories_spec.rb | 41 +- spec/requests/api/v1/domain_blocks_spec.rb | 16 +- .../api/v1/emails/confirmations_spec.rb | 32 +- spec/requests/api/v1/endorsements_spec.rb | 12 +- spec/requests/api/v1/favourites_spec.rb | 24 +- .../api/v1/featured_tags/suggestions_spec.rb | 6 +- spec/requests/api/v1/featured_tags_spec.rb | 64 +- spec/requests/api/v1/filters_spec.rb | 14 +- spec/requests/api/v1/follow_requests_spec.rb | 14 +- spec/requests/api/v1/followed_tags_spec.rb | 21 +- spec/requests/api/v1/instance_spec.rb | 10 +- .../api/v1/instances/activity_spec.rb | 5 +- .../api/v1/instances/domain_blocks_spec.rb | 5 +- .../instances/extended_descriptions_spec.rb | 4 +- .../api/v1/instances/languages_spec.rb | 9 +- spec/requests/api/v1/instances/peers_spec.rb | 4 +- .../api/v1/instances/privacy_policies_spec.rb | 4 +- spec/requests/api/v1/instances/rules_spec.rb | 4 +- .../instances/translation_languages_spec.rb | 12 +- spec/requests/api/v1/lists/accounts_spec.rb | 29 +- spec/requests/api/v1/lists_spec.rb | 32 +- spec/requests/api/v1/markers_spec.rb | 21 +- spec/requests/api/v1/media_spec.rb | 35 +- spec/requests/api/v1/mutes_spec.rb | 36 +- .../api/v1/notifications/policies_spec.rb | 12 +- .../api/v1/notifications/requests_spec.rb | 108 +- spec/requests/api/v1/notifications_spec.rb | 147 +- spec/requests/api/v1/peers/search_spec.rb | 20 +- spec/requests/api/v1/polls/votes_spec.rb | 15 +- spec/requests/api/v1/polls_spec.rb | 6 +- spec/requests/api/v1/preferences_spec.rb | 9 +- spec/requests/api/v1/profiles_spec.rb | 42 +- .../api/v1/push/subscriptions_spec.rb | 8 +- spec/requests/api/v1/reports_spec.rb | 9 +- spec/requests/api/v1/scheduled_status_spec.rb | 14 +- .../api/v1/statuses/bookmarks_spec.rb | 42 +- .../statuses/favourited_by_accounts_spec.rb | 23 +- .../api/v1/statuses/favourites_spec.rb | 42 +- .../api/v1/statuses/histories_spec.rb | 6 +- spec/requests/api/v1/statuses/mutes_spec.rb | 6 +- spec/requests/api/v1/statuses/pins_spec.rb | 36 +- .../v1/statuses/reblogged_by_accounts_spec.rb | 23 +- spec/requests/api/v1/statuses/reblogs_spec.rb | 49 +- spec/requests/api/v1/statuses/sources_spec.rb | 12 +- .../api/v1/statuses/translations_spec.rb | 6 +- spec/requests/api/v1/statuses_spec.rb | 50 +- spec/requests/api/v1/streaming_spec.rb | 9 +- spec/requests/api/v1/suggestions_spec.rb | 28 +- spec/requests/api/v1/tags_spec.rb | 22 +- spec/requests/api/v1/timelines/direct_spec.rb | 2 +- spec/requests/api/v1/timelines/home_spec.rb | 33 +- spec/requests/api/v1/timelines/link_spec.rb | 26 +- spec/requests/api/v1/timelines/list_spec.rb | 11 +- spec/requests/api/v1/timelines/public_spec.rb | 20 +- spec/requests/api/v1/timelines/tag_spec.rb | 31 +- spec/requests/api/v1/trends/links_spec.rb | 13 +- spec/requests/api/v1/trends/statuses_spec.rb | 13 +- spec/requests/api/v1/trends/tags_spec.rb | 14 +- spec/requests/api/v2/admin/accounts_spec.rb | 47 +- spec/requests/api/v2/filters/keywords_spec.rb | 38 +- spec/requests/api/v2/filters/statuses_spec.rb | 28 +- spec/requests/api/v2/filters_spec.rb | 78 +- spec/requests/api/v2/instance_spec.rb | 22 +- spec/requests/api/v2/media_spec.rb | 22 +- .../api/v2/notifications/accounts_spec.rb | 84 + .../api/v2/notifications/policies_spec.rb | 76 + spec/requests/api/v2/notifications_spec.rb | 384 ++ spec/requests/api/v2/search_spec.rb | 30 +- spec/requests/api/v2/suggestions_spec.rb | 6 +- .../api/v2_alpha/notifications_spec.rb | 162 - spec/requests/api/web/embeds_spec.rb | 30 +- spec/requests/api/web/settings_spec.rb | 45 + .../sessions/security_key_options_spec.rb | 50 + spec/requests/backups_spec.rb | 2 +- spec/requests/cache_spec.rb | 2 +- spec/requests/catch_all_route_request_spec.rb | 2 +- spec/requests/content_security_policy_spec.rb | 4 +- spec/requests/custom_css_spec.rb | 2 +- spec/requests/custom_stylesheets_spec.rb | 18 + .../requests/disabled_oauth_endpoints_spec.rb | 2 +- spec/requests/emojis_spec.rb | 21 + spec/requests/health_spec.rb | 16 + spec/requests/instance_actor_spec.rb | 65 + spec/requests/invite_spec.rb | 4 +- spec/requests/invites_spec.rb | 31 + spec/requests/link_headers_spec.rb | 26 +- spec/requests/localization_spec.rb | 2 +- spec/requests/log_out_spec.rb | 30 + spec/requests/manifest_spec.rb | 23 + spec/requests/media_proxy_spec.rb | 72 + spec/requests/media_spec.rb | 90 + spec/requests/oauth/token_spec.rb | 107 + spec/requests/omniauth_callbacks_spec.rb | 2 +- .../remote_interaction_helper_spec.rb | 2 +- spec/requests/self_destruct_spec.rb | 2 +- spec/requests/settings/applications_spec.rb | 44 + .../settings/exports/blocked_accounts_spec.rb | 42 + .../settings/exports/blocked_domains_spec.rb | 39 + .../settings/exports/bookmarks_spec.rb | 44 + .../exports/following_accounts_spec.rb | 44 + spec/requests/settings/exports/lists_spec.rb | 40 + .../settings/exports/muted_accounts_spec.rb | 43 + spec/requests/settings/exports_spec.rb | 25 + spec/requests/severed_relationships_spec.rb | 43 + spec/requests/signature_verification_spec.rb | 32 +- spec/requests/statuses/embed_spec.rb | 74 + spec/requests/tags_spec.rb | 44 + .../well_known/change_password_spec.rb | 2 +- spec/requests/well_known/host_meta_spec.rb | 73 +- spec/requests/well_known/node_info_spec.rb | 6 +- .../well_known/oauth_metadata_spec.rb | 7 +- spec/requests/well_known/webfinger_spec.rb | 40 +- spec/routing/accounts_routing_spec.rb | 103 +- spec/routing/api_routing_spec.rb | 2 +- spec/routing/well_known_routes_spec.rb | 11 +- .../models/concerns/account/search_spec.rb | 2 +- .../concerns/account/statuses_search_spec.rb | 2 +- .../activitypub/device_serializer_spec.rb | 14 - .../activitypub/note_serializer_spec.rb | 33 +- .../one_time_key_serializer_spec.rb | 14 - .../activitypub/undo_like_serializer_spec.rb | 2 +- .../update_poll_serializer_spec.rb | 2 +- .../activitypub/vote_serializer_spec.rb | 2 +- .../rest/account_serializer_spec.rb | 2 +- .../rest/encrypted_message_serializer_spec.rb | 14 - .../rest/instance_serializer_spec.rb | 2 +- .../rest/keys/claim_result_serializer_spec.rb | 14 - .../rest/keys/device_serializer_spec.rb | 14 - .../rest/keys/query_result_serializer_spec.rb | 14 - .../rest/suggestion_serializer_spec.rb | 2 +- ...ccept_notification_request_service_spec.rb | 20 + spec/services/account_search_service_spec.rb | 2 +- .../account_statuses_cleanup_service_spec.rb | 83 +- .../fetch_remote_account_service_spec.rb | 10 +- .../fetch_remote_actor_service_spec.rb | 10 +- .../fetch_remote_key_service_spec.rb | 2 +- .../fetch_remote_status_service_spec.rb | 85 +- .../process_account_service_spec.rb | 24 +- .../process_status_update_service_spec.rb | 167 +- .../synchronize_followers_service_spec.rb | 31 +- spec/services/appeal_service_spec.rb | 2 +- spec/services/approve_appeal_service_spec.rb | 62 +- .../services/authorize_follow_service_spec.rb | 30 +- spec/services/backup_service_spec.rb | 1 + .../batched_remove_status_service_spec.rb | 44 +- spec/services/block_domain_service_spec.rb | 2 +- spec/services/block_service_spec.rb | 13 +- spec/services/bulk_import_service_spec.rb | 257 +- spec/services/delete_account_service_spec.rb | 4 +- ...smiss_notification_request_service_spec.rb | 19 + .../services/fan_out_on_write_service_spec.rb | 85 +- spec/services/favourite_service_spec.rb | 17 +- spec/services/fetch_link_card_service_spec.rb | 68 +- spec/services/fetch_oembed_service_spec.rb | 2 +- spec/services/follow_service_spec.rb | 13 +- spec/services/import_service_spec.rb | 2 +- spec/services/mute_service_spec.rb | 2 +- spec/services/notify_service_spec.rb | 127 +- spec/services/post_status_service_spec.rb | 39 +- .../services/process_mentions_service_spec.rb | 38 +- spec/services/reject_follow_service_spec.rb | 34 +- .../remove_from_followers_service_spec.rb | 23 +- spec/services/remove_status_service_spec.rb | 46 +- spec/services/report_service_spec.rb | 51 +- spec/services/resolve_account_service_spec.rb | 130 +- spec/services/resolve_url_service_spec.rb | 46 +- spec/services/search_service_spec.rb | 2 +- spec/services/suspend_account_service_spec.rb | 2 +- .../services/translate_status_service_spec.rb | 65 +- spec/services/unallow_domain_service_spec.rb | 2 +- spec/services/unblock_domain_service_spec.rb | 40 +- spec/services/unblock_service_spec.rb | 22 +- spec/services/unfollow_service_spec.rb | 38 +- .../unsuspend_account_service_spec.rb | 2 +- spec/services/update_account_service_spec.rb | 22 +- spec/services/update_status_service_spec.rb | 131 +- spec/services/verify_link_service_spec.rb | 30 +- spec/spec_helper.rb | 18 +- ...javascript_errors.rb => browser_errors.rb} | 20 +- spec/support/capybara.rb | 12 +- spec/support/examples/api.rb | 4 +- spec/support/examples/cache.rb | 14 - spec/support/examples/cli.rb | 2 +- spec/support/examples/lib/admin/checks.rb | 2 +- spec/support/examples/mailers.rb | 31 +- .../models/concerns/account_avatar.rb | 6 +- .../models/concerns/account_header.rb | 4 +- .../examples/models/concerns/reviewable.rb | 79 + spec/support/matchers/api_pagination.rb | 6 +- spec/support/matchers/cacheable_response.rb | 48 + spec/support/matchers/http_link_header.rb | 33 + .../matchers/json/match_json_schema.rb | 4 +- .../support/matchers/private_cache_control.rb | 14 + spec/support/response_encoders.rb | 4 + spec/support/shoulda_matchers.rb | 8 + spec/support/stories/profile_stories.rb | 10 +- spec/support/streaming_server_manager.rb | 2 +- spec/support/system_helpers.rb | 23 + spec/system/about_spec.rb | 12 + spec/system/admin/accounts_spec.rb | 4 +- spec/system/admin/announcements_spec.rb | 126 + spec/system/admin/custom_emojis_spec.rb | 2 +- spec/system/admin/domain_blocks_spec.rb | 4 +- spec/system/admin/email_domain_blocks_spec.rb | 2 +- spec/system/admin/invites_spec.rb | 63 + spec/system/admin/ip_blocks_spec.rb | 2 +- spec/system/admin/reset_spec.rb | 45 + spec/system/admin/settings/about_spec.rb | 22 + spec/system/admin/settings/appearance_spec.rb | 22 + spec/system/admin/settings/branding_spec.rb | 37 + .../admin/settings/content_retention_spec.rb | 22 + spec/system/admin/settings/discovery_spec.rb | 21 + .../admin/settings/registrations_spec.rb | 26 + spec/system/admin/software_updates_spec.rb | 2 +- spec/system/admin/statuses_spec.rb | 2 +- spec/system/admin/tags_spec.rb | 38 + .../links/preview_card_providers_spec.rb | 2 +- spec/system/admin/trends/links_spec.rb | 2 +- spec/system/admin/trends/statuses_spec.rb | 2 +- spec/system/admin/trends/tags_spec.rb | 2 +- spec/system/captcha_spec.rb | 2 +- spec/system/filters_spec.rb | 4 +- spec/system/home_spec.rb | 25 + spec/system/invites_spec.rb | 79 + spec/system/log_in_spec.rb | 14 +- spec/system/log_out_spec.rb | 46 + spec/system/media_spec.rb | 23 + spec/system/new_statuses_spec.rb | 2 +- spec/system/oauth_spec.rb | 190 +- spec/system/ocr_spec.rb | 2 +- spec/system/privacy_spec.rb | 12 + spec/system/profile_spec.rb | 2 +- spec/system/redirections_spec.rb | 40 +- spec/system/report_interface_spec.rb | 15 +- spec/system/settings/applications_spec.rb | 144 + spec/system/settings/exports_spec.rb | 40 + spec/system/severed_relationships_spec.rb | 2 +- spec/system/share_entrypoint_spec.rb | 39 +- spec/system/tags_spec.rb | 19 + spec/system/unlogged_spec.rb | 2 +- spec/validators/domain_validator_spec.rb | 125 + spec/validators/email_mx_validator_spec.rb | 10 +- .../existing_username_validator_spec.rb | 2 +- spec/validators/language_validator_spec.rb | 2 +- spec/validators/lines_validator_spec.rb | 46 + spec/validators/note_length_validator_spec.rb | 20 +- spec/validators/reaction_validator_spec.rb | 7 +- .../status_length_validator_spec.rb | 20 +- .../unique_username_validator_spec.rb | 2 +- .../unreserved_username_validator_spec.rb | 2 +- spec/validators/url_validator_spec.rb | 2 +- ...r_spec.rb => user_email_validator_spec.rb} | 2 +- .../links/_preview_card.html.haml_spec.rb | 2 +- spec/views/statuses/show.html.haml_spec.rb | 22 +- spec/workers/account_refresh_worker_spec.rb | 2 +- .../activitypub/delivery_worker_spec.rb | 2 +- .../distribute_poll_update_worker_spec.rb | 2 +- .../activitypub/distribution_worker_spec.rb | 2 +- .../activitypub/fetch_replies_worker_spec.rb | 2 +- .../move_distribution_worker_spec.rb | 2 +- .../activitypub/post_upgrade_worker_spec.rb | 2 +- .../activitypub/processing_worker_spec.rb | 2 +- .../status_update_distribution_worker_spec.rb | 2 +- ...ze_featured_tags_collection_worker_spec.rb | 2 +- .../update_distribution_worker_spec.rb | 2 +- ...dd_to_public_statuses_index_worker_spec.rb | 2 +- .../admin/account_deletion_worker_spec.rb | 2 +- .../workers/admin/domain_purge_worker_spec.rb | 2 +- spec/workers/admin/suspension_worker_spec.rb | 2 +- .../after_account_domain_block_worker_spec.rb | 2 +- spec/workers/backup_worker_spec.rb | 4 +- spec/workers/bulk_import_worker_spec.rb | 2 +- spec/workers/cache_buster_worker_spec.rb | 2 +- spec/workers/delete_mute_worker_spec.rb | 2 +- spec/workers/domain_block_worker_spec.rb | 2 +- .../workers/domain_clear_media_worker_spec.rb | 2 +- spec/workers/feed_insert_worker_spec.rb | 2 +- ...ltered_notification_cleanup_worker_spec.rb | 24 + .../generate_annual_report_worker_spec.rb | 27 + spec/workers/import/row_worker_spec.rb | 2 +- spec/workers/import_worker_spec.rb | 2 +- spec/workers/mention_resolve_worker_spec.rb | 38 + spec/workers/move_worker_spec.rb | 4 +- .../poll_expiration_notify_worker_spec.rb | 2 +- .../workers/post_process_media_worker_spec.rb | 2 +- ...blish_announcement_reaction_worker_spec.rb | 2 +- ...lish_scheduled_announcement_worker_spec.rb | 2 +- .../publish_scheduled_status_worker_spec.rb | 2 +- spec/workers/push_conversation_worker_spec.rb | 2 +- .../push_encrypted_message_worker_spec.rb | 13 - spec/workers/push_update_worker_spec.rb | 2 +- spec/workers/redownload_avatar_worker_spec.rb | 2 +- spec/workers/redownload_header_worker_spec.rb | 2 +- spec/workers/redownload_media_worker_spec.rb | 2 +- spec/workers/refollow_worker_spec.rb | 2 +- spec/workers/regeneration_worker_spec.rb | 2 +- spec/workers/removal_worker_spec.rb | 2 +- .../remove_featured_tag_worker_spec.rb | 2 +- ..._from_public_statuses_index_worker_spec.rb | 2 +- spec/workers/resolve_account_worker_spec.rb | 2 +- ...ccounts_statuses_cleanup_scheduler_spec.rb | 2 +- ...auto_close_registrations_scheduler_spec.rb | 2 +- .../follow_recommendations_scheduler_spec.rb | 2 +- .../scheduler/indexing_scheduler_spec.rb | 2 +- .../instance_refresh_scheduler_spec.rb | 2 +- .../scheduler/ip_cleanup_scheduler_spec.rb | 49 +- .../scheduler/pghero_scheduler_spec.rb | 2 +- .../scheduled_statuses_scheduler_spec.rb | 2 +- .../scheduler/self_destruct_scheduler_spec.rb | 2 +- .../software_update_check_scheduler_spec.rb | 2 +- .../suspended_user_cleanup_scheduler_spec.rb | 2 +- .../trends/refresh_scheduler_spec.rb | 2 +- .../review_notifications_scheduler_spec.rb | 2 +- .../scheduler/user_cleanup_scheduler_spec.rb | 32 +- .../scheduler/vacuum_scheduler_spec.rb | 2 +- spec/workers/tag_unmerge_worker_spec.rb | 2 +- .../unfilter_notifications_worker_spec.rb | 89 + spec/workers/unfollow_follow_worker_spec.rb | 2 +- .../unpublish_announcement_worker_spec.rb | 2 +- .../verify_account_links_worker_spec.rb | 2 +- .../web/push_notification_worker_spec.rb | 47 +- spec/workers/webhooks/delivery_worker_spec.rb | 2 +- streaming/Dockerfile | 2 +- streaming/database.js | 128 + streaming/index.js | 418 +- streaming/metrics.js | 19 +- streaming/package.json | 4 +- streaming/redis.js | 135 + streaming/utils.js | 20 + stylelint.config.js | 2 +- yarn.lock | 4233 +++++++++-------- 2224 files changed, 55997 insertions(+), 29952 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/3.troubleshooting.yml rename .github/ISSUE_TEMPLATE/{3.feature_request.yml => 4.feature_request.yml} (96%) create mode 100644 .github/workflows/crowdin-download-stable.yml delete mode 100644 .profile delete mode 100644 app/controllers/activitypub/claims_controller.rb create mode 100644 app/controllers/activitypub/likes_controller.rb create mode 100644 app/controllers/activitypub/shares_controller.rb delete mode 100644 app/controllers/api/v1/crypto/deliveries_controller.rb delete mode 100644 app/controllers/api/v1/crypto/encrypted_messages_controller.rb delete mode 100644 app/controllers/api/v1/crypto/keys/claims_controller.rb delete mode 100644 app/controllers/api/v1/crypto/keys/counts_controller.rb delete mode 100644 app/controllers/api/v1/crypto/keys/queries_controller.rb delete mode 100644 app/controllers/api/v1/crypto/keys/uploads_controller.rb create mode 100644 app/controllers/api/v1/domain_blocks/previews_controller.rb create mode 100644 app/controllers/api/v2/notifications/accounts_controller.rb create mode 100644 app/controllers/api/v2/notifications/policies_controller.rb create mode 100644 app/controllers/api/v2/notifications_controller.rb delete mode 100644 app/controllers/api/v2_alpha/notifications_controller.rb create mode 100644 app/helpers/admin/tags_helper.rb delete mode 100644 app/helpers/webfinger_helper.rb create mode 100644 app/javascript/entrypoints/embed.tsx delete mode 100644 app/javascript/flavours/glitch/actions/languages.js create mode 100644 app/javascript/flavours/glitch/actions/notification_groups.ts create mode 100644 app/javascript/flavours/glitch/actions/notification_requests.ts create mode 100644 app/javascript/flavours/glitch/actions/notifications_migration.tsx create mode 100644 app/javascript/flavours/glitch/api/notifications.ts create mode 100644 app/javascript/flavours/glitch/api_types/notifications.ts create mode 100644 app/javascript/flavours/glitch/api_types/reports.ts create mode 100644 app/javascript/flavours/glitch/components/alt_text_badge.tsx create mode 100644 app/javascript/flavours/glitch/components/content_warning.tsx create mode 100644 app/javascript/flavours/glitch/components/copy_paste_text.tsx create mode 100644 app/javascript/flavours/glitch/components/dropdown_selector.tsx create mode 100644 app/javascript/flavours/glitch/components/filter_warning.tsx create mode 100644 app/javascript/flavours/glitch/components/status_banner.tsx create mode 100644 app/javascript/flavours/glitch/components/status_thread_label.tsx delete mode 100644 app/javascript/flavours/glitch/containers/domain_container.jsx create mode 100644 app/javascript/flavours/glitch/entrypoints/embed.tsx delete mode 100644 app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx create mode 100644 app/javascript/flavours/glitch/features/account_gallery/components/media_item.tsx delete mode 100644 app/javascript/flavours/glitch/features/compose/components/privacy_dropdown_menu.jsx delete mode 100644 app/javascript/flavours/glitch/features/compose/components/upload.jsx create mode 100644 app/javascript/flavours/glitch/features/compose/components/upload.tsx delete mode 100644 app/javascript/flavours/glitch/features/compose/components/upload_form.jsx create mode 100644 app/javascript/flavours/glitch/features/compose/components/upload_form.tsx delete mode 100644 app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.jsx create mode 100644 app/javascript/flavours/glitch/features/notifications/components/checkbox_with_label.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications/components/policy_controls.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications/components/select_with_label.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/avatar_group.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/displayed_name.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/embedded_status.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/embedded_status_content.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_admin_report.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_admin_sign_up.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_favourite.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_follow.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_follow_request.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_group.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_group_with_status.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_mention.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_moderation_warning.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_poll.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_reblog.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_severed_relationships.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_status.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_update.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/components/notification_with_status.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/filter_bar.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_v2/index.tsx create mode 100644 app/javascript/flavours/glitch/features/notifications_wrapper.jsx create mode 100644 app/javascript/flavours/glitch/features/standalone/status/index.tsx delete mode 100644 app/javascript/flavours/glitch/features/status/components/detailed_status.jsx create mode 100644 app/javascript/flavours/glitch/features/status/components/detailed_status.tsx delete mode 100644 app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js delete mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modal.jsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/clear_notifications.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_list.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/delete_status.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/edit_status.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/index.ts create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/log_out.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/reply.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/confirmation_modals/unfollow.tsx delete mode 100644 app/javascript/flavours/glitch/features/ui/components/domain_block_modal.jsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/domain_block_modal.tsx delete mode 100644 app/javascript/flavours/glitch/features/ui/components/embed_modal.jsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/embed_modal.tsx delete mode 100644 app/javascript/flavours/glitch/features/ui/components/favourite_modal.jsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/favourite_modal.tsx create mode 100644 app/javascript/flavours/glitch/features/ui/components/ignore_notifications_modal.jsx create mode 100644 app/javascript/flavours/glitch/hooks/useRenderSignal.ts create mode 100644 app/javascript/flavours/glitch/hooks/useSearchParam.ts create mode 100644 app/javascript/flavours/glitch/models/media_attachment.ts create mode 100644 app/javascript/flavours/glitch/models/notification_group.ts create mode 100644 app/javascript/flavours/glitch/models/notification_request.ts create mode 100644 app/javascript/flavours/glitch/reducers/notification_groups.ts delete mode 100644 app/javascript/flavours/glitch/reducers/notification_requests.js create mode 100644 app/javascript/flavours/glitch/reducers/notification_requests.ts create mode 100644 app/javascript/flavours/glitch/selectors/filters.ts create mode 100644 app/javascript/flavours/glitch/selectors/notifications.ts create mode 100644 app/javascript/flavours/glitch/selectors/settings.ts delete mode 100644 app/javascript/flavours/glitch/styles/statuses.scss create mode 100644 app/javascript/flavours/glitch/utils/debounce.ts create mode 100644 app/javascript/hooks/useRenderSignal.ts create mode 100644 app/javascript/hooks/useSearchParam.ts create mode 100755 app/javascript/images/filter-stripes.svg delete mode 100644 app/javascript/mastodon/actions/languages.js create mode 100644 app/javascript/mastodon/actions/notification_groups.ts create mode 100644 app/javascript/mastodon/actions/notification_requests.ts create mode 100644 app/javascript/mastodon/actions/notifications_migration.tsx create mode 100644 app/javascript/mastodon/api/notifications.ts create mode 100644 app/javascript/mastodon/api_types/notifications.ts create mode 100644 app/javascript/mastodon/api_types/reports.ts create mode 100644 app/javascript/mastodon/components/alt_text_badge.tsx create mode 100644 app/javascript/mastodon/components/content_warning.tsx create mode 100644 app/javascript/mastodon/components/copy_paste_text.tsx create mode 100644 app/javascript/mastodon/components/dropdown_selector.tsx create mode 100644 app/javascript/mastodon/components/filter_warning.tsx create mode 100644 app/javascript/mastodon/components/status_banner.tsx create mode 100644 app/javascript/mastodon/components/status_thread_label.tsx delete mode 100644 app/javascript/mastodon/containers/domain_container.jsx delete mode 100644 app/javascript/mastodon/features/account_gallery/components/media_item.jsx create mode 100644 app/javascript/mastodon/features/account_gallery/components/media_item.tsx delete mode 100644 app/javascript/mastodon/features/compose/components/privacy_dropdown_menu.jsx delete mode 100644 app/javascript/mastodon/features/compose/components/upload.jsx create mode 100644 app/javascript/mastodon/features/compose/components/upload.tsx delete mode 100644 app/javascript/mastodon/features/compose/components/upload_form.jsx create mode 100644 app/javascript/mastodon/features/compose/components/upload_form.tsx delete mode 100644 app/javascript/mastodon/features/notifications/components/checkbox_with_label.jsx create mode 100644 app/javascript/mastodon/features/notifications/components/checkbox_with_label.tsx create mode 100644 app/javascript/mastodon/features/notifications/components/policy_controls.tsx create mode 100644 app/javascript/mastodon/features/notifications/components/select_with_label.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/avatar_group.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/displayed_name.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_admin_report.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_admin_sign_up.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_favourite.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_follow.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_follow_request.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_group_with_status.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_moderation_warning.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_poll.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_reblog.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_severed_relationships.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_status.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_update.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/filter_bar.tsx create mode 100644 app/javascript/mastodon/features/notifications_v2/index.tsx create mode 100644 app/javascript/mastodon/features/notifications_wrapper.jsx create mode 100644 app/javascript/mastodon/features/standalone/status/index.tsx delete mode 100644 app/javascript/mastodon/features/status/components/detailed_status.jsx create mode 100644 app/javascript/mastodon/features/status/components/detailed_status.tsx delete mode 100644 app/javascript/mastodon/features/status/containers/detailed_status_container.js delete mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modal.jsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/clear_notifications.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/delete_list.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/delete_status.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/edit_status.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/log_out.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/reply.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/unfollow.tsx delete mode 100644 app/javascript/mastodon/features/ui/components/domain_block_modal.jsx create mode 100644 app/javascript/mastodon/features/ui/components/domain_block_modal.tsx delete mode 100644 app/javascript/mastodon/features/ui/components/embed_modal.jsx create mode 100644 app/javascript/mastodon/features/ui/components/embed_modal.tsx create mode 100644 app/javascript/mastodon/features/ui/components/ignore_notifications_modal.jsx create mode 100644 app/javascript/mastodon/models/media_attachment.ts create mode 100644 app/javascript/mastodon/models/notification_group.ts create mode 100644 app/javascript/mastodon/models/notification_request.ts create mode 100644 app/javascript/mastodon/reducers/notification_groups.ts delete mode 100644 app/javascript/mastodon/reducers/notification_requests.js create mode 100644 app/javascript/mastodon/reducers/notification_requests.ts create mode 100644 app/javascript/mastodon/selectors/filters.ts create mode 100644 app/javascript/mastodon/selectors/notifications.ts create mode 100644 app/javascript/mastodon/selectors/settings.ts create mode 100644 app/javascript/mastodon/utils/debounce.ts create mode 100644 app/javascript/material-icons/400-24px/arrow_left_alt.svg create mode 100644 app/javascript/material-icons/400-24px/breaking_news-fill.svg create mode 100644 app/javascript/material-icons/400-24px/breaking_news.svg create mode 100644 app/javascript/material-icons/400-24px/captive_portal-fill.svg create mode 100644 app/javascript/material-icons/400-24px/captive_portal.svg create mode 100644 app/javascript/material-icons/400-24px/chat_bubble-fill.svg create mode 100644 app/javascript/material-icons/400-24px/chat_bubble.svg create mode 100644 app/javascript/material-icons/400-24px/check_indeterminate_small-fill.svg create mode 100644 app/javascript/material-icons/400-24px/check_indeterminate_small.svg create mode 100644 app/javascript/material-icons/400-24px/cloud-fill.svg create mode 100644 app/javascript/material-icons/400-24px/cloud.svg create mode 100644 app/javascript/material-icons/400-24px/cloud_download-fill.svg create mode 100644 app/javascript/material-icons/400-24px/cloud_download.svg create mode 100644 app/javascript/material-icons/400-24px/cloud_sync-fill.svg create mode 100644 app/javascript/material-icons/400-24px/cloud_sync.svg create mode 100644 app/javascript/material-icons/400-24px/cloud_upload-fill.svg create mode 100644 app/javascript/material-icons/400-24px/cloud_upload.svg create mode 100644 app/javascript/material-icons/400-24px/comment.svg create mode 100644 app/javascript/material-icons/400-24px/computer-fill.svg create mode 100644 app/javascript/material-icons/400-24px/computer.svg create mode 100644 app/javascript/material-icons/400-24px/contact_mail-fill.svg create mode 100644 app/javascript/material-icons/400-24px/contact_mail.svg create mode 100644 app/javascript/material-icons/400-24px/database-fill.svg create mode 100644 app/javascript/material-icons/400-24px/database.svg create mode 100644 app/javascript/material-icons/400-24px/desktop_mac.svg create mode 100644 app/javascript/material-icons/400-24px/diamond-fill.svg create mode 100644 app/javascript/material-icons/400-24px/diamond.svg create mode 100644 app/javascript/material-icons/400-24px/feedback-fill.svg create mode 100644 app/javascript/material-icons/400-24px/feedback.svg create mode 100644 app/javascript/material-icons/400-24px/filter_alt-fill.svg create mode 100644 app/javascript/material-icons/400-24px/filter_alt.svg create mode 100644 app/javascript/material-icons/400-24px/fit_screen-fill.svg create mode 100644 app/javascript/material-icons/400-24px/fit_screen.svg create mode 100644 app/javascript/material-icons/400-24px/format_paragraph.svg create mode 100644 app/javascript/material-icons/400-24px/groups-fill.svg create mode 100644 app/javascript/material-icons/400-24px/groups.svg create mode 100644 app/javascript/material-icons/400-24px/headphones-fill.svg create mode 100644 app/javascript/material-icons/400-24px/headphones.svg create mode 100644 app/javascript/material-icons/400-24px/hide_source-fill.svg create mode 100644 app/javascript/material-icons/400-24px/hide_source.svg create mode 100644 app/javascript/material-icons/400-24px/hourglass.svg create mode 100644 app/javascript/material-icons/400-24px/inbox-fill.svg create mode 100644 app/javascript/material-icons/400-24px/inbox.svg create mode 100644 app/javascript/material-icons/400-24px/key.svg create mode 100644 app/javascript/material-icons/400-24px/keyboard_double_arrow_down.svg create mode 100644 app/javascript/material-icons/400-24px/list-fill.svg create mode 100644 app/javascript/material-icons/400-24px/list.svg create mode 100644 app/javascript/material-icons/400-24px/mood-fill.svg create mode 100644 app/javascript/material-icons/400-24px/mood.svg create mode 100644 app/javascript/material-icons/400-24px/person_alert-fill.svg create mode 100644 app/javascript/material-icons/400-24px/person_alert.svg create mode 100644 app/javascript/material-icons/400-24px/photo_camera.svg create mode 100644 app/javascript/material-icons/400-24px/power.svg create mode 100644 app/javascript/material-icons/400-24px/power_off.svg create mode 100644 app/javascript/material-icons/400-24px/radio_button_checked.svg create mode 100644 app/javascript/material-icons/400-24px/radio_button_unchecked.svg create mode 100644 app/javascript/material-icons/400-24px/report-fill.svg create mode 100644 app/javascript/material-icons/400-24px/report.svg create mode 100644 app/javascript/material-icons/400-24px/safety_check-fill.svg create mode 100644 app/javascript/material-icons/400-24px/safety_check.svg create mode 100644 app/javascript/material-icons/400-24px/save.svg create mode 100644 app/javascript/material-icons/400-24px/shield_question-fill.svg create mode 100644 app/javascript/material-icons/400-24px/shield_question.svg create mode 100644 app/javascript/material-icons/400-24px/smartphone.svg create mode 100644 app/javascript/material-icons/400-24px/speed-fill.svg create mode 100644 app/javascript/material-icons/400-24px/speed.svg create mode 100644 app/javascript/material-icons/400-24px/sync_alt.svg create mode 100644 app/javascript/material-icons/400-24px/tablet.svg create mode 100644 app/javascript/material-icons/400-24px/toggle_off.svg create mode 100644 app/javascript/material-icons/400-24px/toggle_on.svg create mode 100644 app/javascript/material-icons/400-24px/trending_up-fill.svg create mode 100644 app/javascript/material-icons/400-24px/trending_up.svg delete mode 100644 app/javascript/styles/mastodon/statuses.scss create mode 100644 app/javascript/svg-icons/actual_size.svg create mode 100644 app/lib/oauth_pre_authorization_extension.rb rename app/lib/{redis_configuration.rb => redis_connection.rb} (65%) delete mode 100644 app/lib/vacuum/system_keys_vacuum.rb create mode 100644 app/lib/web_push_request.rb create mode 100644 app/models/admin/tag_filter.rb create mode 100644 app/models/concerns/account/attribution_domains.rb create mode 100644 app/models/concerns/account/suspensions.rb create mode 100644 app/models/concerns/reviewable.rb delete mode 100644 app/models/device.rb delete mode 100644 app/models/encrypted_message.rb delete mode 100644 app/models/message_franking.rb delete mode 100644 app/models/one_time_key.rb delete mode 100644 app/models/system_key.rb create mode 100644 app/presenters/domain_block_preview_presenter.rb create mode 100644 app/presenters/export_summary.rb create mode 100644 app/presenters/grouped_notifications_presenter.rb delete mode 100644 app/serializers/activitypub/device_serializer.rb delete mode 100644 app/serializers/activitypub/encrypted_message_serializer.rb delete mode 100644 app/serializers/activitypub/one_time_key_serializer.rb create mode 100644 app/serializers/rest/dedup_notification_group_serializer.rb create mode 100644 app/serializers/rest/domain_block_preview_serializer.rb delete mode 100644 app/serializers/rest/encrypted_message_serializer.rb delete mode 100644 app/serializers/rest/keys/claim_result_serializer.rb delete mode 100644 app/serializers/rest/keys/device_serializer.rb delete mode 100644 app/serializers/rest/keys/query_result_serializer.rb create mode 100644 app/serializers/rest/v1/notification_policy_serializer.rb delete mode 100644 app/services/deliver_to_device_service.rb create mode 100644 app/services/dismiss_notification_request_service.rb delete mode 100644 app/services/keys/claim_service.rb delete mode 100644 app/services/keys/query_service.rb delete mode 100644 app/validators/ed25519_key_validator.rb delete mode 100644 app/validators/ed25519_signature_validator.rb create mode 100644 app/validators/lines_validator.rb rename app/validators/{blacklisted_email_validator.rb => user_email_validator.rb} (74%) create mode 100644 app/views/admin/instances/_dashboard.html.haml create mode 100644 app/views/admin/tags/_tag.html.haml create mode 100644 app/views/admin/tags/index.html.haml delete mode 100644 app/views/settings/applications/_fields.html.haml create mode 100644 app/views/settings/applications/_form.html.haml delete mode 100644 app/views/statuses/_detailed_status.html.haml delete mode 100644 app/views/statuses/_poll.html.haml delete mode 100644 app/views/statuses/_simple_status.html.haml delete mode 100644 app/views/statuses/_status.html.haml create mode 100644 app/workers/filtered_notification_cleanup_worker.rb create mode 100644 app/workers/mention_resolve_worker.rb delete mode 100644 app/workers/push_encrypted_message_worker.rb delete mode 100644 config/initializers/0_duplicate_migrations.rb delete mode 100644 config/initializers/blacklists.rb create mode 100644 config/initializers/email_domains_lists.rb delete mode 100644 config/initializers/statsd.rb delete mode 100644 config/secrets.yml rename db/migrate/{20180410220657_create_bookmarks.rb => 20180410220657_glitch_create_bookmarks.rb} (70%) create mode 100644 db/migrate/20240713171841_add_application_to_reports.rb create mode 100644 db/migrate/20240713171909_validate_add_application_to_reports.rb create mode 100644 db/migrate/20240724181224_enable_pkce.rb create mode 100644 db/migrate/20240808114841_add_new_notification_policies.rb create mode 100644 db/migrate/20240808124338_migrate_notifications_policy_v2.rb create mode 100644 db/migrate/20240909014637_add_attribution_domains_to_accounts.rb create mode 100644 db/migrate/20241007071624_fix_notification_permission_foreign_keys.rb create mode 100644 db/post_migrate/20240712064044_remove_dismissed_from_notification_requests.rb create mode 100644 db/post_migrate/20240720140205_drop_end_to_end_message_tables.rb create mode 100644 db/post_migrate/20240808124339_post_deployment_migrate_notifications_policy_v2.rb create mode 100644 db/post_migrate/20240808125420_drop_old_policies_from_notifications_policy.rb create mode 100644 db/post_migrate/20240916190140_remove_crypto_scope_values.rb delete mode 100644 lib/mastodon/redis_config.rb create mode 100644 lib/mastodon/redis_configuration.rb delete mode 100644 spec/controllers/about_controller_spec.rb delete mode 100644 spec/controllers/activitypub/claims_controller_spec.rb delete mode 100644 spec/controllers/admin/announcements_controller_spec.rb delete mode 100644 spec/controllers/admin/invites_controller_spec.rb delete mode 100644 spec/controllers/admin/resets_controller_spec.rb delete mode 100644 spec/controllers/admin/settings/about_controller_spec.rb delete mode 100644 spec/controllers/admin/settings/appearance_controller_spec.rb delete mode 100644 spec/controllers/admin/settings/content_retention_controller_spec.rb delete mode 100644 spec/controllers/admin/settings/discovery_controller_spec.rb delete mode 100644 spec/controllers/admin/settings/registrations_controller_spec.rb delete mode 100644 spec/controllers/admin/tags_controller_spec.rb delete mode 100644 spec/controllers/api/oembed_controller_spec.rb delete mode 100644 spec/controllers/api/web/settings_controller_spec.rb delete mode 100644 spec/controllers/custom_css_controller_spec.rb delete mode 100644 spec/controllers/emojis_controller_spec.rb delete mode 100644 spec/controllers/health_controller_spec.rb delete mode 100644 spec/controllers/home_controller_spec.rb delete mode 100644 spec/controllers/instance_actors_controller_spec.rb delete mode 100644 spec/controllers/invites_controller_spec.rb delete mode 100644 spec/controllers/manifests_controller_spec.rb delete mode 100644 spec/controllers/media_controller_spec.rb delete mode 100644 spec/controllers/media_proxy_controller_spec.rb delete mode 100644 spec/controllers/privacy_controller_spec.rb delete mode 100644 spec/controllers/settings/applications_controller_spec.rb delete mode 100644 spec/controllers/settings/exports/blocked_accounts_controller_spec.rb delete mode 100644 spec/controllers/settings/exports/blocked_domains_controller_spec.rb delete mode 100644 spec/controllers/settings/exports/bookmarks_controller_spec.rb delete mode 100644 spec/controllers/settings/exports/following_accounts_controller_spec.rb delete mode 100644 spec/controllers/settings/exports/lists_controller_spec.rb delete mode 100644 spec/controllers/settings/exports/muted_accounts_controller_spec.rb delete mode 100644 spec/controllers/settings/exports_controller_spec.rb delete mode 100644 spec/controllers/shares_controller_spec.rb delete mode 100644 spec/controllers/tags_controller_spec.rb delete mode 100644 spec/fabricators/device_fabricator.rb delete mode 100644 spec/fabricators/encrypted_message_fabricator.rb create mode 100644 spec/fabricators/generated_annual_report_fabricator.rb create mode 100644 spec/fabricators/ip_block_fabricator.rb delete mode 100644 spec/fabricators/one_time_key_fabricator.rb delete mode 100644 spec/fabricators/system_key_fabricator.rb create mode 100644 spec/fixtures/requests/alternative_utf8_spelling_in_header.txt create mode 100644 spec/fixtures/requests/latin1_posing_as_utf8_broken.txt create mode 100644 spec/fixtures/requests/latin1_posing_as_utf8_recoverable.txt create mode 100644 spec/fixtures/requests/long_canonical_url.txt create mode 100644 spec/fixtures/requests/page_without_title.txt create mode 100644 spec/lib/annual_report/commonly_interacted_with_accounts_spec.rb create mode 100644 spec/lib/annual_report/most_reblogged_accounts_spec.rb create mode 100644 spec/lib/annual_report/most_used_apps_spec.rb create mode 100644 spec/lib/annual_report/percentiles_spec.rb create mode 100644 spec/lib/annual_report/time_series_spec.rb create mode 100644 spec/lib/annual_report/top_hashtags_spec.rb create mode 100644 spec/lib/annual_report/top_statuses_spec.rb create mode 100644 spec/lib/annual_report/type_distribution_spec.rb create mode 100644 spec/lib/annual_report_spec.rb create mode 100644 spec/lib/mastodon/redis_configuration_spec.rb create mode 100644 spec/lib/paperclip/response_with_limit_adapter_spec.rb delete mode 100644 spec/lib/vacuum/system_keys_vacuum_spec.rb create mode 100644 spec/lib/webfinger_spec.rb create mode 100644 spec/models/account_alias_spec.rb create mode 100644 spec/models/account_deletion_request_spec.rb create mode 100644 spec/models/account_moderation_note_spec.rb create mode 100644 spec/models/account_warning_spec.rb create mode 100644 spec/models/admin/tag_filter_spec.rb create mode 100644 spec/models/bookmark_spec.rb create mode 100644 spec/models/featured_tag_spec.rb create mode 100644 spec/models/list_account_spec.rb create mode 100644 spec/models/list_spec.rb delete mode 100644 spec/models/one_time_key_spec.rb create mode 100644 spec/models/relay_spec.rb create mode 100644 spec/models/report_note_spec.rb create mode 100644 spec/policies/account_warning_policy_spec.rb create mode 100644 spec/policies/audit_log_policy_spec.rb create mode 100644 spec/policies/dashboard_policy_spec.rb create mode 100644 spec/policies/domain_allow_policy_spec.rb create mode 100644 spec/policies/poll_policy_spec.rb create mode 100644 spec/policies/user_role_policy_spec.rb create mode 100644 spec/presenters/export_summary_spec.rb create mode 100644 spec/requests/api/oembed_spec.rb create mode 100644 spec/requests/api/v1/annual_reports_spec.rb create mode 100644 spec/requests/api/v2/notifications/accounts_spec.rb create mode 100644 spec/requests/api/v2/notifications/policies_spec.rb create mode 100644 spec/requests/api/v2/notifications_spec.rb delete mode 100644 spec/requests/api/v2_alpha/notifications_spec.rb create mode 100644 spec/requests/api/web/settings_spec.rb create mode 100644 spec/requests/auth/sessions/security_key_options_spec.rb create mode 100644 spec/requests/custom_stylesheets_spec.rb create mode 100644 spec/requests/emojis_spec.rb create mode 100644 spec/requests/health_spec.rb create mode 100644 spec/requests/instance_actor_spec.rb create mode 100644 spec/requests/invites_spec.rb create mode 100644 spec/requests/log_out_spec.rb create mode 100644 spec/requests/manifest_spec.rb create mode 100644 spec/requests/media_proxy_spec.rb create mode 100644 spec/requests/media_spec.rb create mode 100644 spec/requests/oauth/token_spec.rb create mode 100644 spec/requests/settings/applications_spec.rb create mode 100644 spec/requests/settings/exports/blocked_accounts_spec.rb create mode 100644 spec/requests/settings/exports/blocked_domains_spec.rb create mode 100644 spec/requests/settings/exports/bookmarks_spec.rb create mode 100644 spec/requests/settings/exports/following_accounts_spec.rb create mode 100644 spec/requests/settings/exports/lists_spec.rb create mode 100644 spec/requests/settings/exports/muted_accounts_spec.rb create mode 100644 spec/requests/settings/exports_spec.rb create mode 100644 spec/requests/severed_relationships_spec.rb create mode 100644 spec/requests/statuses/embed_spec.rb create mode 100644 spec/requests/tags_spec.rb delete mode 100644 spec/serializers/activitypub/device_serializer_spec.rb delete mode 100644 spec/serializers/activitypub/one_time_key_serializer_spec.rb delete mode 100644 spec/serializers/rest/encrypted_message_serializer_spec.rb delete mode 100644 spec/serializers/rest/keys/claim_result_serializer_spec.rb delete mode 100644 spec/serializers/rest/keys/device_serializer_spec.rb delete mode 100644 spec/serializers/rest/keys/query_result_serializer_spec.rb create mode 100644 spec/services/accept_notification_request_service_spec.rb create mode 100644 spec/services/dismiss_notification_request_service_spec.rb rename spec/support/{javascript_errors.rb => browser_errors.rb} (58%) delete mode 100644 spec/support/examples/cache.rb create mode 100644 spec/support/examples/models/concerns/reviewable.rb create mode 100644 spec/support/matchers/cacheable_response.rb create mode 100644 spec/support/matchers/http_link_header.rb create mode 100644 spec/support/matchers/private_cache_control.rb create mode 100644 spec/support/response_encoders.rb create mode 100644 spec/support/shoulda_matchers.rb create mode 100644 spec/support/system_helpers.rb create mode 100644 spec/system/about_spec.rb create mode 100644 spec/system/admin/announcements_spec.rb create mode 100644 spec/system/admin/invites_spec.rb create mode 100644 spec/system/admin/reset_spec.rb create mode 100644 spec/system/admin/settings/about_spec.rb create mode 100644 spec/system/admin/settings/appearance_spec.rb create mode 100644 spec/system/admin/settings/branding_spec.rb create mode 100644 spec/system/admin/settings/content_retention_spec.rb create mode 100644 spec/system/admin/settings/discovery_spec.rb create mode 100644 spec/system/admin/settings/registrations_spec.rb create mode 100644 spec/system/admin/tags_spec.rb create mode 100644 spec/system/home_spec.rb create mode 100644 spec/system/invites_spec.rb create mode 100644 spec/system/log_out_spec.rb create mode 100644 spec/system/media_spec.rb create mode 100644 spec/system/privacy_spec.rb create mode 100644 spec/system/settings/applications_spec.rb create mode 100644 spec/system/settings/exports_spec.rb create mode 100644 spec/system/tags_spec.rb create mode 100644 spec/validators/domain_validator_spec.rb create mode 100644 spec/validators/lines_validator_spec.rb rename spec/validators/{blacklisted_email_validator_spec.rb => user_email_validator_spec.rb} (96%) create mode 100644 spec/workers/filtered_notification_cleanup_worker_spec.rb create mode 100644 spec/workers/generate_annual_report_worker_spec.rb create mode 100644 spec/workers/mention_resolve_worker_spec.rb delete mode 100644 spec/workers/push_encrypted_message_worker_spec.rb create mode 100644 spec/workers/unfilter_notifications_worker_spec.rb create mode 100644 streaming/database.js create mode 100644 streaming/redis.js diff --git a/.browserslistrc b/.browserslistrc index 0376af4bccd794..6367e4d35817fc 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1,6 +1,7 @@ [production] defaults > 0.2% +firefox >= 78 ios >= 15.6 not dead not OperaMini all diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index c6dcc4d46a37d6..3aa0bbf7da4ec3 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -11,5 +11,8 @@ RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get -y install --no-install-recommends libicu-dev libidn11-dev ffmpeg imagemagick libvips42 libpam-dev +# Disable download prompt for Corepack +ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + # Move welcome message to where VS Code expects it COPY .devcontainer/welcome-message.txt /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.devcontainer/compose.yaml b/.devcontainer/compose.yaml index 1e2e1ba7de2274..5c7263c87467d9 100644 --- a/.devcontainer/compose.yaml +++ b/.devcontainer/compose.yaml @@ -69,7 +69,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.5.7 + image: libretranslate/libretranslate:v1.6.1 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local diff --git a/.env.production.sample b/.env.production.sample index 5939c12146757d..6a9a941b30c4d3 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -1,5 +1,5 @@ # This is a sample configuration file. You can generate your configuration -# with the `rake mastodon:setup` interactive setup wizard, but to customize +# with the `bundle exec rails mastodon:setup` interactive setup wizard, but to customize # your setup even further, you'll need to edit it manually. This sample does # not demonstrate all available configuration options. Please look at # https://docs.joinmastodon.org/admin/config/ for the full documentation. @@ -68,15 +68,25 @@ DB_PORT=5432 # Secrets # ------- -# Generate each with the `RAILS_ENV=production bundle exec rake secret` task (`docker-compose run --rm web bundle exec rake secret` if you use docker compose) +# Generate each with the `RAILS_ENV=production bundle exec rails secret` task (`docker-compose run --rm web bundle exec rails secret` if you use docker compose) # ------- SECRET_KEY_BASE= OTP_SECRET= +# Encryption secrets +# ------------------ +# Must be available (and set to same values) for all server processes +# These are private/secret values, do not share outside hosting environment +# Use `bin/rails db:encryption:init` to generate fresh secrets +# Do not change these secrets once in use, as this would cause data loss and other issues +# ------------------ +# ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY= +# ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT= +# ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY= # Web Push # -------- -# Generate with `rake mastodon:webpush:generate_vapid_key` (first is the private key, second is the public one) +# Generate with `bundle exec rails mastodon:webpush:generate_vapid_key` (first is the private key, second is the public one) # You should only generate this once per instance. If you later decide to change it, all push subscription will # be invalidated, requiring the users to access the website again to resubscribe. # -------- diff --git a/.eslintrc.js b/.eslintrc.js index 66a0f12ba1f6a1..ce9fb0927e4432 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -64,7 +64,6 @@ module.exports = defineConfig({ 'indent': ['error', 2], 'jsx-quotes': ['error', 'prefer-single'], 'semi': ['error', 'always'], - 'no-case-declarations': 'off', 'no-catch-shadow': 'error', 'no-console': [ 'warn', @@ -333,7 +332,7 @@ module.exports = defineConfig({ ], parserOptions: { - project: true, + projectService: true, tsconfigRootDir: __dirname, }, diff --git a/.github/ISSUE_TEMPLATE/1.web_bug_report.yml b/.github/ISSUE_TEMPLATE/1.web_bug_report.yml index 20e27d103cdb07..f897a7d7da434e 100644 --- a/.github/ISSUE_TEMPLATE/1.web_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.web_bug_report.yml @@ -1,6 +1,7 @@ name: Bug Report (Web Interface) -description: If you are using Mastodon's web interface and something is not working as expected -labels: [bug, 'status/to triage', 'area/web interface'] +description: There is a problem using Mastodon's web interface. +labels: ['status/to triage', 'area/web interface'] +type: Bug body: - type: markdown attributes: @@ -47,8 +48,8 @@ body: attributes: label: Mastodon version description: | - This is displayed at the bottom of the About page, eg. `v4.1.2+nightly-20230627` - placeholder: v4.1.2 + This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1` + placeholder: v4.3.0 validations: required: true - type: input @@ -56,7 +57,7 @@ body: label: Browser name and version description: | What browser are you using when getting this bug? Please specify the version as well. - placeholder: Firefox 105.0.3 + placeholder: Firefox 131.0.0 validations: required: true - type: input @@ -64,7 +65,7 @@ body: label: Operating system description: | What OS are you running? Please specify the version as well. - placeholder: macOS 13.4.1 + placeholder: macOS 15.0.1 validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/2.server_bug_report.yml b/.github/ISSUE_TEMPLATE/2.server_bug_report.yml index 49d5f57209fd80..a66f5c1076d504 100644 --- a/.github/ISSUE_TEMPLATE/2.server_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/2.server_bug_report.yml @@ -1,7 +1,8 @@ name: Bug Report (server / API) description: | - If something is not working as expected, but is not from using the web interface. -labels: [bug, 'status/to triage'] + There is a problem with the HTTP server, REST API, ActivityPub interaction, etc. +labels: ['status/to triage'] +type: 'Bug' body: - type: markdown attributes: @@ -48,8 +49,8 @@ body: attributes: label: Mastodon version description: | - This is displayed at the bottom of the About page, eg. `v4.1.2+nightly-20230627` - placeholder: v4.1.2 + This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1` + placeholder: v4.3.0 validations: required: false - type: textarea @@ -59,7 +60,7 @@ body: Any additional technical details you may have, like logs or error traces value: | If this is happening on your own Mastodon server, please fill out those: - - Ruby version: (from `ruby --version`, eg. v3.1.2) - - Node.js version: (from `node --version`, eg. v18.16.0) + - Ruby version: (from `ruby --version`, eg. v3.3.5) + - Node.js version: (from `node --version`, eg. v20.18.0) validations: required: false diff --git a/.github/ISSUE_TEMPLATE/3.troubleshooting.yml b/.github/ISSUE_TEMPLATE/3.troubleshooting.yml new file mode 100644 index 00000000000000..eeb74b160b1040 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3.troubleshooting.yml @@ -0,0 +1,74 @@ +name: Deployment troubleshooting +description: | + You are a server administrator and you are encountering a technical issue during installation, upgrade or operations of Mastodon. +labels: ['status/to triage'] +type: 'Troubleshooting' +body: + - type: markdown + attributes: + value: | + Make sure that you are submitting a new bug that was not previously reported or already fixed. + + Please use a concise and distinct title for the issue. + - type: textarea + attributes: + label: Steps to reproduce the problem + description: What were you trying to do? + value: | + 1. + 2. + 3. + ... + validations: + required: true + - type: input + attributes: + label: Expected behaviour + description: What should have happened? + validations: + required: true + - type: input + attributes: + label: Actual behaviour + description: What happened? + validations: + required: true + - type: textarea + attributes: + label: Detailed description + validations: + required: false + - type: input + attributes: + label: Mastodon instance + description: The address of the Mastodon instance where you experienced the issue + placeholder: mastodon.social + validations: + required: true + - type: input + attributes: + label: Mastodon version + description: | + This is displayed at the bottom of the About page, eg. `v4.4.0-alpha.1` + placeholder: v4.3.0 + validations: + required: false + - type: textarea + attributes: + label: Environment + description: | + Details about your environment, like how Mastodon is deployed, if containers are used, version numbers, etc. + value: | + Please at least include those informations: + - Operating system: (eg. Ubuntu 22.04) + - Ruby version: (from `ruby --version`, eg. v3.3.5) + - Node.js version: (from `node --version`, eg. v20.18.0) + validations: + required: false + - type: textarea + attributes: + label: Technical details + description: | + Any additional technical details you may have, like logs or error traces + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/3.feature_request.yml b/.github/ISSUE_TEMPLATE/4.feature_request.yml similarity index 96% rename from .github/ISSUE_TEMPLATE/3.feature_request.yml rename to .github/ISSUE_TEMPLATE/4.feature_request.yml index 2cabcf61e08ecc..7146b4f8a3e436 100644 --- a/.github/ISSUE_TEMPLATE/3.feature_request.yml +++ b/.github/ISSUE_TEMPLATE/4.feature_request.yml @@ -1,6 +1,6 @@ name: Feature Request description: I have a suggestion -labels: [suggestion] +type: Suggestion body: - type: markdown attributes: diff --git a/.github/codecov.yml b/.github/codecov.yml index 701ba3af8f72d5..21af6d0d457da9 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -9,3 +9,5 @@ coverage: default: # GitHub status check is not blocking informational: true +github_checks: + annotations: false diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 2cf7bec8eebd21..8a106762838bcb 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -7,6 +7,7 @@ ':prConcurrentLimitNone', // Remove limit for open PRs at any time. ':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour. ], + rebaseWhen: 'conflicted', minimumReleaseAge: '3', // Wait 3 days after the package has been published before upgrading it // packageRules order is important, they are applied from top to bottom and are merged, // meaning the most important ones must be at the bottom, for example grouping rules @@ -87,6 +88,7 @@ }, { // Update devDependencies every week, with one grouped PR + matchManagers: ['npm'], matchDepTypes: 'devDependencies', matchUpdateTypes: ['patch', 'minor'], groupName: 'devDependencies (non-major)', @@ -95,8 +97,7 @@ { // Group all eslint-related packages with `eslint` in the same PR matchManagers: ['npm'], - matchPackageNames: ['eslint'], - matchPackagePrefixes: ['eslint-', '@typescript-eslint/'], + matchPackageNames: ['eslint', 'eslint-*', '@typescript-eslint/*'], matchUpdateTypes: ['patch', 'minor'], groupName: 'eslint (non-major)', }, @@ -112,7 +113,8 @@ }, { // Update @types/* packages every week, with one grouped PR - matchPackagePrefixes: '@types/', + matchManagers: ['npm'], + matchPackageNames: '@types/*', matchUpdateTypes: ['patch', 'minor'], groupName: 'DefinitelyTyped types (non-major)', extends: ['schedule:weekly'], @@ -129,23 +131,21 @@ { // Group all RuboCop packages with `rubocop` in the same PR matchManagers: ['bundler'], - matchPackageNames: ['rubocop'], - matchPackagePrefixes: ['rubocop-'], + matchPackageNames: ['rubocop', 'rubocop-*'], matchUpdateTypes: ['patch', 'minor'], groupName: 'RuboCop (non-major)', }, { // Group all RSpec packages with `rspec` in the same PR matchManagers: ['bundler'], - matchPackageNames: ['rspec'], - matchPackagePrefixes: ['rspec-'], + matchPackageNames: ['rspec', 'rspec-*'], matchUpdateTypes: ['patch', 'minor'], groupName: 'RSpec (non-major)', }, { // Group all opentelemetry-ruby packages in the same PR matchManagers: ['bundler'], - matchPackagePrefixes: ['opentelemetry-'], + matchPackageNames: ['opentelemetry-*'], matchUpdateTypes: ['patch', 'minor'], groupName: 'opentelemetry-ruby (non-major)', }, diff --git a/.github/workflows/build-container-image.yml b/.github/workflows/build-container-image.yml index dbb32af9bf5487..03a0f5bf37b81b 100644 --- a/.github/workflows/build-container-image.yml +++ b/.github/workflows/build-container-image.yml @@ -85,7 +85,7 @@ jobs: tags: ${{ inputs.tags }} labels: ${{ inputs.labels }} - - uses: docker/build-push-action@v5 + - uses: docker/build-push-action@v6 with: context: . file: ${{ inputs.file_to_build }} diff --git a/.github/workflows/build-nightly.yml b/.github/workflows/build-nightly.yml index eddcd80f266fe5..0ea553cfda2335 100644 --- a/.github/workflows/build-nightly.yml +++ b/.github/workflows/build-nightly.yml @@ -35,7 +35,7 @@ jobs: labels: | org.opencontainers.image.description=Nightly build image used for testing purposes flavor: | - latest=true + latest=auto tags: | type=raw,value=edge type=raw,value=nightly @@ -56,7 +56,7 @@ jobs: labels: | org.opencontainers.image.description=Nightly build image used for testing purposes flavor: | - latest=true + latest=auto tags: | type=raw,value=edge type=raw,value=nightly diff --git a/.github/workflows/build-push-pr.yml b/.github/workflows/build-push-pr.yml index 4505151e1a6af7..d6324bad89259a 100644 --- a/.github/workflows/build-push-pr.yml +++ b/.github/workflows/build-push-pr.yml @@ -21,9 +21,11 @@ jobs: uses: actions/checkout@v4 - id: version_vars run: | - echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short HEAD) >> $GITHUB_OUTPUT + echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short ${{github.event.pull_request.head.sha}}) >> $GITHUB_OUTPUT + echo mastodon_short_sha=$(git rev-parse --short ${{github.event.pull_request.head.sha}}) >> $GITHUB_OUTPUT outputs: metadata: ${{ steps.version_vars.outputs.mastodon_version_metadata }} + short_sha: ${{ steps.version_vars.outputs.mastodon_short_sha }} build-image: needs: compute-suffix @@ -39,6 +41,7 @@ jobs: latest=auto tags: | type=ref,event=pr + type=ref,event=pr,suffix=-${{ needs.compute-suffix.outputs.short_sha }} secrets: inherit build-image-streaming: @@ -55,4 +58,5 @@ jobs: latest=auto tags: | type=ref,event=pr + type=ref,event=pr,suffix=-${{ needs.compute-suffix.outputs.short_sha }} secrets: inherit diff --git a/.github/workflows/build-releases.yml b/.github/workflows/build-releases.yml index 8e0fe5dfa8a862..808ffe115d952e 100644 --- a/.github/workflows/build-releases.yml +++ b/.github/workflows/build-releases.yml @@ -22,7 +22,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.2.') }} + latest=${{ startsWith(github.ref, 'refs/tags/v4.3.') }} tags: | type=pep440,pattern={{raw}} type=pep440,pattern=v{{major}}.{{minor}} diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml index e9f1862f5d1b54..37c8ba59a37d54 100644 --- a/.github/workflows/build-security.yml +++ b/.github/workflows/build-security.yml @@ -32,7 +32,7 @@ jobs: labels: | org.opencontainers.image.description=Nightly build image used for testing purposes flavor: | - latest=true + latest=auto tags: | type=raw,value=edge type=raw,value=nightly @@ -53,7 +53,7 @@ jobs: labels: | org.opencontainers.image.description=Nightly build image used for testing purposes flavor: | - latest=true + latest=auto tags: | type=raw,value=edge type=raw,value=nightly diff --git a/.github/workflows/bundler-audit.yml b/.github/workflows/bundler-audit.yml index e3e2da0c787a54..2341d6e67f6241 100644 --- a/.github/workflows/bundler-audit.yml +++ b/.github/workflows/bundler-audit.yml @@ -1,8 +1,10 @@ name: Bundler Audit on: + merge_group: push: - branches-ignore: - - 'dependabot/**' + branches: + - 'main' + - 'stable-*' paths: - 'Gemfile*' - '.ruby-version' diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index ceb385933b29bb..5a1c0519665873 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -2,9 +2,13 @@ name: Check i18n on: push: - branches: [main] + branches: + - 'main' + - 'stable-*' pull_request: - branches: [main] + branches: + - 'main' + - 'stable-*' env: RAILS_ENV: test diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6fb93b7fef45a6..8690e9ed6d1639 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,11 +1,15 @@ name: 'CodeQL' on: + merge_group: push: - branches: ['main'] + branches: + - 'main' + - 'stable-*' pull_request: - # The branches below must be a subset of the branches above - branches: ['main'] + branches: + - 'main' + - 'stable-*' schedule: - cron: '22 6 * * 1' diff --git a/.github/workflows/crowdin-download-stable.yml b/.github/workflows/crowdin-download-stable.yml new file mode 100644 index 00000000000000..18911d49c2ff25 --- /dev/null +++ b/.github/workflows/crowdin-download-stable.yml @@ -0,0 +1,70 @@ +name: Crowdin / Download translations (stable branches) +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + download-translations-stable: + runs-on: ubuntu-latest + if: github.repository == 'mastodon/mastodon' + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Increase Git http.postBuffer + # This is needed due to a bug in Ubuntu's cURL version? + # See https://github.com/orgs/community/discussions/55820 + run: | + git config --global http.version HTTP/1.1 + git config --global http.postBuffer 157286400 + + # Download the translation files from Crowdin + - name: crowdin action + uses: crowdin/github-action@v2 + with: + config: crowdin-glitch.yml + upload_sources: false + upload_translations: false + download_translations: true + crowdin_branch_name: ${{ github.base_ref || github.ref_name }} + push_translations: false + create_pull_request: false + env: + CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + # As the files are extracted from a Docker container, they belong to root:root + # We need to fix this before the next steps + - name: Fix file permissions + run: sudo chown -R runner:docker . + + # This is needed to run the normalize step + - name: Set up Ruby environment + uses: ./.github/actions/setup-ruby + + - name: Run i18n normalize task + run: bundle exec i18n-tasks normalize + + # Create or update the pull request + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7.0.5 + with: + commit-message: 'New Crowdin translations' + title: 'New Crowdin Translations for ${{ github.base_ref || github.ref_name }} (automated)' + author: 'GitHub Actions ' + body: | + New Crowdin translations, automated with GitHub Actions + + See `.github/workflows/crowdin-download.yml` + + This PR will be updated every day with new translations. + + Due to a limitation in GitHub Actions, checks are not running on this PR without manual action. + If you want to run the checks, then close and re-open it. + branch: i18n/crowdin/translations-${{ github.base_ref || github.ref_name }} + base: ${{ github.base_ref || github.ref_name }} + labels: i18n diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index 1212e66296eae2..02d8a949dec541 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -26,7 +26,7 @@ jobs: # Download the translation files from Crowdin - name: crowdin action - uses: crowdin/github-action@v1 + uses: crowdin/github-action@v2 with: config: crowdin-glitch.yml upload_sources: false @@ -53,7 +53,7 @@ jobs: # Create or update the pull request - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.5 + uses: peter-evans/create-pull-request@v7.0.5 with: commit-message: 'New Crowdin translations' title: 'New Crowdin Translations (automated)' diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 32c09802b42a0c..c48668d3bc3e55 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -3,7 +3,8 @@ name: Crowdin / Upload translations on: push: branches: - - main + - 'main' + - 'stable-*' paths: - crowdin-glitch.yml - app/javascript/flavours/glitch/locales/en.json @@ -17,19 +18,20 @@ on: jobs: upload-translations: runs-on: ubuntu-latest + if: github.repository == 'glitch-soc/mastodon' steps: - name: Checkout uses: actions/checkout@v4 - name: crowdin action - uses: crowdin/github-action@v1 + uses: crowdin/github-action@v2 with: config: crowdin-glitch.yml upload_sources: true upload_translations: false download_translations: false - crowdin_branch_name: main + crowdin_branch_name: ${{ github.base_ref || github.ref_name }} env: CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_PROJECT_ID }} diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 2d483b50229626..c10f350a02ef28 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -1,6 +1,10 @@ name: Check formatting on: + merge_group: push: + branches: + - 'main' + - 'stable-*' pull_request: jobs: diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml index d3b8035cd86521..95fcd569420fdf 100644 --- a/.github/workflows/lint-css.yml +++ b/.github/workflows/lint-css.yml @@ -1,9 +1,10 @@ name: CSS Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'package.json' - 'yarn.lock' diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml index ca4b0c80bfdc3e..a1a9e99c902bfb 100644 --- a/.github/workflows/lint-haml.yml +++ b/.github/workflows/lint-haml.yml @@ -1,9 +1,10 @@ name: Haml Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - '.github/workflows/haml-lint-problem-matcher.json' - '.github/workflows/lint-haml.yml' diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml index 1c1ecc2b22049b..7d31a5e20e7804 100644 --- a/.github/workflows/lint-js.yml +++ b/.github/workflows/lint-js.yml @@ -1,9 +1,10 @@ name: JavaScript Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'package.json' - 'yarn.lock' diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml index b3a89c3caf1cbd..277e456146fdcf 100644 --- a/.github/workflows/lint-ruby.yml +++ b/.github/workflows/lint-ruby.yml @@ -1,9 +1,10 @@ name: Ruby Linting on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'Gemfile*' - '.rubocop*.yml' diff --git a/.github/workflows/rebase-needed.yml b/.github/workflows/rebase-needed.yml index 8784397a8fb03d..945315d52d4bb8 100644 --- a/.github/workflows/rebase-needed.yml +++ b/.github/workflows/rebase-needed.yml @@ -10,6 +10,7 @@ permissions: jobs: label-rebase-needed: runs-on: ubuntu-latest + if: github.repository == 'glitch-soc/mastodon' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/test-js.yml b/.github/workflows/test-js.yml index 481afdba30366d..e9e43ac9e80184 100644 --- a/.github/workflows/test-js.yml +++ b/.github/workflows/test-js.yml @@ -1,9 +1,10 @@ name: JavaScript Testing on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' paths: - 'package.json' - 'yarn.lock' diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml index 3eaf2c2d7402b8..5b80fef03724db 100644 --- a/.github/workflows/test-migrations.yml +++ b/.github/workflows/test-migrations.yml @@ -1,29 +1,29 @@ name: Historical data migration test on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' + paths: + - 'Gemfile*' + - '.ruby-version' + - '**/*.rb' + - '.github/workflows/test-migrations.yml' + - 'lib/tasks/tests.rake' + pull_request: + paths: + - 'Gemfile*' + - '.ruby-version' + - '**/*.rb' + - '.github/workflows/test-migrations.yml' + - 'lib/tasks/tests.rake' jobs: - pre_job: - runs-on: ubuntu-latest - - outputs: - should_skip: ${{ steps.skip_check.outputs.should_skip }} - - steps: - - id: skip_check - uses: fkirc/skip-duplicate-actions@v5 - with: - paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations.yml", "lib/tasks/tests.rake"]' - test: runs-on: ubuntu-latest - needs: pre_job - if: needs.pre_job.outputs.should_skip != 'true' strategy: fail-fast: false @@ -32,6 +32,8 @@ jobs: postgres: - 14-alpine - 15-alpine + - 16-alpine + - 17-alpine services: postgres: diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index ef898968d0128c..c05c8333b2048c 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -1,10 +1,11 @@ name: Ruby Testing on: + merge_group: push: - branches-ignore: - - 'dependabot/**' - - 'renovate/**' + branches: + - 'main' + - 'stable-*' pull_request: env: @@ -41,11 +42,24 @@ jobs: with: onlyProduction: 'true' + - name: Cache assets from compilation + uses: actions/cache@v4 + with: + path: | + public/assets + public/packs + public/packs-test + tmp/cache/webpacker + key: ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }} + restore-keys: | + ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }} + ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }} + ${{ matrix.mode }}-assets-main + ${{ matrix.mode }}-assets + - name: Precompile assets - # Previously had set this, but it's not supported - # export NODE_OPTIONS=--openssl-legacy-provider run: |- - ./bin/rails assets:precompile + bin/rails assets:precompile - name: Archive asset artifacts run: | @@ -129,13 +143,26 @@ jobs: uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} - additional-system-dependencies: ffmpeg libpam-dev + additional-system-dependencies: ffmpeg imagemagick libpam-dev - name: Load database schema run: | bin/rails db:setup bin/flatware fan bin/rails db:test:prepare + - name: Cache RSpec persistence file + uses: actions/cache@v4 + with: + path: | + tmp/rspec/examples.txt + key: rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }} + restore-keys: | + rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }}-${{ matrix.ruby-version }} + rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }} + rspec-persistence-${{ github.head_ref || github.ref_name }} + rspec-persistence-main + rspec-persistence + - run: bin/flatware rspec -r ./spec/flatware_helper.rb - name: Upload coverage reports to Codecov @@ -218,12 +245,12 @@ jobs: uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} - additional-system-dependencies: ffmpeg libpam-dev libyaml-dev + additional-system-dependencies: ffmpeg libpam-dev - name: Load database schema run: './bin/rails db:create db:schema:load db:seed' - - run: bin/rspec --tag paperclip_processing + - run: bin/rspec --tag attachment_processing - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' @@ -298,7 +325,7 @@ jobs: uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} - additional-system-dependencies: ffmpeg + additional-system-dependencies: ffmpeg imagemagick - name: Set up Javascript environment uses: ./.github/actions/setup-javascript @@ -418,7 +445,7 @@ jobs: uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} - additional-system-dependencies: ffmpeg + additional-system-dependencies: ffmpeg imagemagick - name: Set up Javascript environment uses: ./.github/actions/setup-javascript diff --git a/.gitignore b/.gitignore index a70f30f952854e..a74317bd7d81b2 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,6 @@ docker-compose.override.yml # Ignore dotenv .local files .env*.local + +# Ignore local-only rspec configuration +.rspec-local diff --git a/.nvmrc b/.nvmrc index cecb93628953cd..10fef252a9f178 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.15 +20.18 diff --git a/.profile b/.profile deleted file mode 100644 index f4826ea30339ca..00000000000000 --- a/.profile +++ /dev/null @@ -1 +0,0 @@ -LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/lib/x86_64-linux-gnu/pulseaudio:/app/.apt/usr/lib/x86_64-linux-gnu/openblas-pthread diff --git a/.rspec b/.rspec index 9a8e706d0911b2..83e16f80447460 100644 --- a/.rspec +++ b/.rspec @@ -1,3 +1,2 @@ --color --require spec_helper ---format Fuubar diff --git a/.rubocop/strict.yml b/.rubocop/strict.yml index 2222c6d8b93402..c2655a1470cc8f 100644 --- a/.rubocop/strict.yml +++ b/.rubocop/strict.yml @@ -7,8 +7,13 @@ RSpec/Focus: # Require full spec run on CI Exclude: [] Rails/Output: # Remove any `puts` debugging + inherit_mode: + merge: + - Include Enabled: true Exclude: [] + Include: + - spec/**/*.rb Rails/FindEach: # Using `each` could impact performance, use `find_each` Enabled: true diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 4a86051c421dca..3322bce2bf8b7a 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp` -# using RuboCop version 1.64.1. +# using RuboCop version 1.66.1. # 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 @@ -14,7 +14,7 @@ Lint/NonLocalExitFromIterator: Metrics/AbcSize: Max: 90 -# Configuration parameters: CountBlocks, Max. +# Configuration parameters: CountBlocks, CountModifierForms, Max. Metrics/BlockNesting: Exclude: - 'lib/tasks/mastodon.rake' @@ -35,17 +35,14 @@ Rails/OutputSafety: # Configuration parameters: AllowedVars. Style/FetchEnvVar: Exclude: - - 'app/lib/redis_configuration.rb' - 'app/lib/translation_service.rb' - 'config/environments/production.rb' - 'config/initializers/2_limited_federation_mode.rb' - 'config/initializers/3_omniauth.rb' - - 'config/initializers/blacklists.rb' - 'config/initializers/cache_buster.rb' - 'config/initializers/devise.rb' - 'config/initializers/paperclip.rb' - 'config/initializers/vapid.rb' - - 'lib/mastodon/redis_config.rb' - 'lib/tasks/repo.rake' # This cop supports safe autocorrection (--autocorrect). @@ -94,7 +91,6 @@ Style/OptionalBooleanParameter: - 'app/services/fetch_resource_service.rb' - 'app/workers/domain_block_worker.rb' - 'app/workers/unfollow_follow_worker.rb' - - 'lib/mastodon/redis_config.rb' # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. diff --git a/.ruby-version b/.ruby-version index 619b537668489e..fa7adc7ac72a28 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.3 +3.3.5 diff --git a/Aptfile b/Aptfile index 5e033f13650b9f..06c91d4c7b034b 100644 --- a/Aptfile +++ b/Aptfile @@ -1,5 +1,5 @@ -ffmpeg -libopenblas0-pthread -libpq-dev -libxdamage1 -libxfixes3 +libidn12 +# for idn-ruby on heroku-24 stack + +# use https://github.com/heroku/heroku-buildpack-activestorage-preview +# in place for ffmpeg and its dependent packages to reduce slag size diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c3d96ba4a4832..0fc5291d7226b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,394 @@ All notable changes to this project will be documented in this file. +## [4.3.0] - 2024-10-08 + +The following changelog entries focus on changes visible to users, administrators, client developers or federated software developers, but there has also been a lot of code modernization, refactoring, and tooling work, in particular by @mjankowski. + +### Security + +- **Add confirmation interstitial instead of silently redirecting logged-out visitors to remote resources** (#27792, #28902, and #30651 by @ClearlyClaire and @Gargron)\ + This fixes a longstanding open redirect in Mastodon, at the cost of added friction when local links to remote resources are shared. +- Fix ReDoS vulnerability on some Ruby versions ([GHSA-jpxp-r43f-rhvx](https://github.com/mastodon/mastodon/security/advisories/GHSA-jpxp-r43f-rhvx)) +- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 and #32241 by @ClearlyClaire) +- Update dependencies + +### Added + +- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610, #31929, #32089, #32085, #32243, #32179 and #32254 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\ + Group notifications of the same type for the same target, so that your notifications no longer get cluttered by boost and favorite notifications as soon as a couple of your posts get traction.\ + This is done server-side so that clients can efficiently get relevant groups without having to go through numerous pages of individual notifications.\ + As part of this, the visual design of the entire notifications feature has been revamped.\ + This feature is intended to eventually replace the existing notifications column, but for this first beta, users will have to enable it in the “Experimental features” section of the notifications column settings.\ + The API is not final yet, but it consists of: + - a new `group_key` attribute to `Notification` entities + - `GET /api/v2/notifications`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-grouped + - `GET /api/v2/notifications/:group_key`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-notification-group + - `GET /api/v2/notifications/:group_key/accounts`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-group-accounts + - `POST /api/v2/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/grouped_notifications/#dismiss-group + - `GET /api/v2/notifications/:unread_count`: https://docs.joinmastodon.org/methods/grouped_notifications/#unread-group-count +- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, #31723, #32062 and #32281 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\ + The old “Block notifications from non-followers”, “Block notifications from people you don't follow” and “Block direct messages from people you don't follow” notification settings have been replaced by a new set of settings found directly in the notification column.\ + 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 + - `GET /api/v1/notifications/requests/:id`: https://docs.joinmastodon.org/methods/notifications/#get-one-request + - `POST /api/v1/notifications/requests/:id/accept`: https://docs.joinmastodon.org/methods/notifications/#accept-request + - `POST /api/v1/notifications/requests/:id/dismiss`: https://docs.joinmastodon.org/methods/notifications/#dismiss-request + - `POST /api/v1/notifications/requests/accept`: https://docs.joinmastodon.org/methods/notifications/#accept-multiple-requests + - `POST /api/v1/notifications/requests/dismiss`: https://docs.joinmastodon.org/methods/notifications/#dismiss-multiple-requests + - `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)\ + Notify local users when they lose relationships as a result of a local moderator blocking a remote account or server, allowing the affected user to retrieve the list of broken relationships.\ + Note that this does not notify remote users.\ + This adds the `severed_relationships` notification type to the REST API and streaming, with a new [`relationship_severance_event` attribute](https://docs.joinmastodon.org/entities/Notification/#relationship_severance_event). +- **Add hover cards in web UI** (#30754, #30864, #30850, #30879, #30928, #30949, #30948, #30931, and #31300 by @ClearlyClaire, @Gargron, and @renchap)\ + Hovering over an avatar or username will now display a hover card with the first two lines of the user's description and their first two profile fields.\ + This can be disabled in the “Animations and accessibility” section of the preferences. +- **Add "system" theme setting (light/dark theme depending on user system preference)** (#29748, #29553, #29795, #29918, #30839, and #30861 by @nshki, @ErikUden, @mjankowski, @renchap, and @vmstan)\ + Add a “system” theme that automatically switch between default dark and light themes depending on the user's system preferences.\ + Also changes the default server theme to this new “system” theme so that automatic theme selection happens even when logged out. +- **Add timeline of public posts about a trending link** (#30381 and #30840 by @Gargron)\ + You can now see public posts mentioning currently-trending articles from people who have opted into discovery features.\ + This adds a new REST API endpoint: https://docs.joinmastodon.org/methods/timelines/#link +- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, #31900 and #32188 by @Gargron, @mjankowski and @oneiros)\ + This adds a mechanism to [highlight the author of news articles](https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/) shared on Mastodon.\ + Articles hosted outside the fediverse can indicate a fediverse author with a meta tag: + ```html + + ``` + On the API side, this is represented by a new `authors` attribute to the `PreviewCard` entity: https://docs.joinmastodon.org/entities/PreviewCard/#authors \ + Users can allow arbitrary domains to use `fediverse:creator` to credit them by visiting `/settings/verification`.\ + This is federated as a new `attributionDomains` property in the `http://joinmastodon.org/ns` namespace, containing an array of domain names: https://docs.joinmastodon.org/spec/activitypub/#properties-used-1 +- **Add in-app notifications for moderation actions and warnings** (#30065, #30082, and #30081 by @ClearlyClaire)\ + In addition to email notifications, also notify users of moderation actions or warnings against them directly within the app, so they are less likely to miss important communication from their moderators.\ + This adds the `moderation_warning` notification type to the REST API and streaming, with a new [`moderation_warning` attribute](https://docs.joinmastodon.org/entities/Notification/#moderation_warning). +- **Add domain information to profiles in web UI** (#29602 by @Gargron)\ + Clicking the domain of a user in their profile will now open a tooltip with a short explanation about servers and federation. +- **Add support for Redis sentinel** (#31694, #31623, #31744, #31767, and #31768 by @ThisIsMissEm and @oneiros)\ + See https://docs.joinmastodon.org/admin/scaling/#redis-sentinel +- **Add ability to reorder uploaded media before posting in web UI** (#28456 and #32093 by @Gargron) +- Add “A Mastodon update is available.” message on admin dashboard for non-bugfix updates (#32106 by @ClearlyClaire) +- Add ability to view alt text by clicking the ALT badge in web UI (#32058 by @Gargron) +- Add preview of followers removed in domain block modal in web UI (#32032 and #32105 by @ClearlyClaire and @Gargron) +- Add reblogs and favourites counts to statuses in ActivityPub (#32007 by @Gargron) +- Add moderation interface for searching hashtags (#30880 by @ThisIsMissEm) +- Add ability for admins to configure instance favicon and logo (#30040, #30208, #30259, #30375, #30734, #31016, and #30205 by @ClearlyClaire, @FawazFarid, @JasonPunyon, @mgmn, and @renchap)\ + This is also exposed through the REST API: https://docs.joinmastodon.org/entities/Instance/#icon +- Add `api_versions` to `/api/v2/instance` (#31354 by @ClearlyClaire)\ + Add API version number to make it easier for clients to detect compatible features going forward.\ + See API documentation at https://docs.joinmastodon.org/entities/Instance/#api-versions +- Add quick links to Administration and Moderation Reports from Web UI (#24838 by @ThisIsMissEm) +- Add link to `/admin/roles` in moderation interface when changing someone's role (#31791 by @ClearlyClaire) +- Add recent audit log entries in federation moderation interface (#27386 by @ThisIsMissEm) +- Add profile setup to onboarding in web UI (#27829, #27876, and #28453 by @Gargron) +- Add prominent share/copy button on profiles in web UI (#27865 and #27889 by @ClearlyClaire and @Gargron) +- Add optional hints for server rules (#29539 and #29758 by @ClearlyClaire and @Gargron)\ + Server rules can now be broken into a short rule name and a longer explanation of the rule.\ + This adds a new [`hint` attribute](https://docs.joinmastodon.org/entities/Rule/#hint) to `Rule` entities in the REST API. +- Add support for PKCE in OAuth flow (#31129 by @ThisIsMissEm) +- Add CDN cache busting on media deletion (#31353 and #31414 by @ClearlyClaire and @tribela) +- Add the OAuth application used in local reports (#30539 by @ThisIsMissEm) +- Add hint to user that other remote statuses may be missing (#26910, #31387, and #31516 by @Gargron, @audiodude, and @renchap) +- Add lang attribute on preview card title (#31303 by @c960657) +- Add check for `Content-Length` in `ResponseWithLimitAdapter` (#31285 by @c960657) +- Add `Accept-Language` header to fetch preview cards in the server's default language (#31232 by @c960657) +- Add support for PKCE Extension in OmniAuth OIDC through the `OIDC_USE_PKCE` environment variable (#31131 by @ThisIsMissEm) +- Add API endpoints for unread notifications count (#31191 by @ClearlyClaire)\ + This adds the following REST API endpoints: + - `GET /api/v1/notifications/unread_count`: https://docs.joinmastodon.org/methods/notifications/#unread-count +- Add `/` keyboard shortcut to focus the search field (#29921 by @ClearlyClaire) +- Add button to view the Hashtag on the instance from Hashtags in Moderation UI (#31533 by @ThisIsMissEm) +- Add list of pending releases directly in mail notifications for version updates (#29436 and #30035 by @ClearlyClaire) +- Add “Appeals” link under “Moderation” navigation category in moderation interface (#31071 by @ThisIsMissEm) +- Add badge on account card in report moderation interface when account is already suspended (#29592 by @ClearlyClaire) +- Add admin comments directly to the `admin/instances` page (#29240 by @tribela) +- Add ability to require approval when users sign up using specific email domains (#28468, #28732, #28607, and #28608 by @ClearlyClaire) +- Add banner for forwarded reports made by remote users about remote content (#27549 by @ClearlyClaire) +- Add support HTML ruby tags in remote posts for east-asian languages (#30897 by @ThisIsMissEm) +- Add link to manage warning presets in admin navigation (#26199 by @vmstan) +- Add volume saving/reuse to video player (#27488 by @thehydrogen) +- Add Elasticsearch index size, ffmpeg and ImageMagick versions to the admin dashboard (#27301, #30710, #31130, and #30845 by @vmstan) +- Add `MASTODON_SIDEKIQ_READY_FILENAME` environment variable to use a file for Sidekiq to signal it is ready to process jobs (#30971 and #30988 by @renchap)\ + In the official Docker image, this is set to `sidekiq_process_has_started_and_will_begin_processing_jobs` so that Sidekiq will touch `tmp/sidekiq_process_has_started_and_will_begin_processing_jobs` to signal readiness. +- Add `S3_RETRY_LIMIT` environment variable to make S3 retries configurable (#23215 by @smiba) +- Add `S3_KEY_PREFIX` environment variable (#30181 by @S0yKaf) +- Add support for multiple `redirect_uris` when creating OAuth 2.0 Applications (#29192 by @ThisIsMissEm) +- Add Interlingue and Interlingua to interface languages (#28630 and #30828 by @Dhghomon and @renchap) +- Add Kashubian, Pennsylvania Dutch, Vai, Jawi Malay, Mohawk and Low German to posting languages (#26024, #26634, #27136, #29098, #27115, and #27434 by @EngineerDali, @HelgeKrueger, and @gunchleoc) +- Add option to use native Ruby driver for Redis through `REDIS_DRIVER=ruby` (#30717 by @vmstan) +- Add support for libvips in addition to ImageMagick (#30090, #30590, #30597, #30632, #30857, #30869, #30858 and #32104 by @ClearlyClaire, @Gargron, and @mjankowski)\ + Server admins can now use libvips as a faster and lighter alternative to ImageMagick for processing user-uploaded images.\ + This requires libvips 8.13 or newer, and needs to be enabled with `MASTODON_USE_LIBVIPS=true`.\ + This is enabled by default in the official Docker images, and is intended to completely replace ImageMagick in the future. +- Add validations to `Web::PushSubscription` (#30540 and #30542 by @ThisIsMissEm) +- Add anchors to each authorized application in `/oauth/authorized_applications` (#31677 by @fowl2) +- Add active animation to header settings button (#30221, #30307, and #30388 by @daudix) +- Add OpenTelemetry instrumentation (#30130, #30322, #30353, #30350 and #31998 by @julianocosta89, @renchap, @robbkidd and @timetinytim)\ + See https://docs.joinmastodon.org/admin/config/#otel for documentation +- Add API to get multiple accounts and statuses (#27871 and #30465 by @ClearlyClaire)\ + This adds `GET /api/v1/accounts` and `GET /api/v1/statuses` to the REST API, see https://docs.joinmastodon.org/methods/accounts/#index and https://docs.joinmastodon.org/methods/statuses/#index +- Add support for CORS to `POST /oauth/revoke` (#31743 by @ClearlyClaire) +- Add redirection back to previous page after site upload deletion (#30141 by @FawazFarid) +- Add RFC8414 OAuth 2.0 server metadata (#29191 by @ThisIsMissEm) +- Add loading indicator and empty result message to advanced interface search (#30085 by @ClearlyClaire) +- Add `profile` OAuth 2.0 scope, allowing more limited access to user data (#29087 and #30357 by @ThisIsMissEm) +- Add the role ID to the badge component (#29707 by @renchap) +- Add diagnostic message for failure during CLI search deploy (#29462 by @mjankowski) +- Add pagination `Link` headers on API accounts/statuses when pinned true (#29442 by @mjankowski) +- Add support for specifying custom CA cert for Elasticsearch through `ES_CA_FILE` (#29122 and #29147 by @ClearlyClaire) +- Add groundwork for annual reports for accounts (#28693 by @Gargron)\ + This lays the groundwork for a “year-in-review”/“wrapped” style report for local users, but is currently not in use. +- Add notification email on invalid second authenticator (#28822 by @ClearlyClaire) +- Add date of account deletion in list of accounts in the admin interface (#25640 by @tribela) +- Add new emojis from `jdecked/twemoji` 15.0 (#28404 by @TheEssem) +- Add configurable error handling in attachment batch deletion (#28184 by @vmstan)\ + This makes the S3 batch size configurable through the `S3_BATCH_DELETE_LIMIT` environment variable (defaults to 1000), and adds some retry logic, configurable through the `S3_BATCH_DELETE_RETRY` environment variable (defaults to 3). +- Add VAPID public key to instance serializer (#28006 by @ThisIsMissEm) +- Add support for serving JRD `/.well-known/host-meta.json` in addition to XRD host-meta (#32206 by @c960657) +- Add `nodeName` and `nodeDescription` to nodeinfo `metadata` (#28079 by @6543) +- Add Thai diacritics and tone marks in `HASHTAG_INVALID_CHARS_RE` (#26576 by @ppnplus) +- Add variable delay before link verification of remote account links (#27774 by @ClearlyClaire) +- Add support for invite codes in the registration API (#27805 by @ClearlyClaire) +- Add HTML lang attribute to preview card descriptions (#27503 by @srapilly) +- Add display of relevant account warnings to report action logs (#27425 by @ClearlyClaire) +- Add validation of allowed schemes on preview card URLs (#27485 by @mjankowski) +- Add token introspection without read scope to `/api/v1/apps/verify_credentials` (#27142 by @ThisIsMissEm) +- Add support for cross-origin request to `/nodeinfo/2.0` (#27413 by @palant) +- Add variable delay before link verification of remote account links (#27351 by @ClearlyClaire) +- Add PWA shortcut to `/explore` page (#27235 by @jake-anto) + +### Changed + +- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, #31525, #32153, and #32201 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\ + This changes all the interface icons from FontAwesome to Material Symbols for a more modern look, consistent with the official Mastodon Android app.\ + In addition, better care is given to pixel alignment, and icon variants are used to better highlight active/inactive state. +- **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, #29659, #31889 and #32033 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\ + The compose form has been completely redesigned for a more modern and consistent look, as well as spelling out the chosen privacy setting and language name at all times.\ + As part of this, the “Unlisted” privacy setting has been renamed to “Quiet public”. +- **Change design of modals in the web UI** (#29576, #29614, #29640, #29644, #30131, #30884, #31399, #31555, #31752, #31801, #31883, #31844, #31864, and #31943 by @ClearlyClaire, @Gargron, @tribela and @vmstan)\ + The mute, block, and domain block confirmation modals have been completely redesigned to be clearer and include more detailed information on the action to be performed.\ + They also have a more modern and consistent design, along with other confirmation modals in the application. +- **Change colors throughout the web UI** (#29522, #29584, #29653, #29779, #29803, #29809, #29808, #29828, #31034, #31168, #31266, #31348, #31349, #31361, #31510 and #32128 by @ClearlyClaire, @Gargron, @mjankowski, @renchap, and @vmstan) +- **Change onboarding prompt to follow suggestions carousel in web UI** (#28878, #29272, and #31912 by @Gargron) +- **Change email templates** (#28416, #28755, #28814, #29064, #28883, #29470, #29607, #29761, #29760, #29879, #32073 and #32132 by @c960657, @ClearlyClaire, @Gargron, @hteumeuleu, and @mjankowski)\ + All emails to end-users have been completely redesigned with a fresh new look, providing more information while making them easier to read and keeping maximum compatibility across mail clients. +- **Change follow recommendations algorithm** (#28314, #28433, #29017, #29108, #29306, #29550, #29619, and #31474 by @ClearlyClaire, @Gargron, @kernal053, @mjankowski, and @wheatear-dev)\ + This replaces the “past interactions” recommendation algorithm with a “friends of friends” algorithm that suggests accounts followed by people you follow, and a “similar profiles” algorithm that suggests accounts with a profile similar to your most recent follows.\ + In addition, the implementation has been significantly reworked, and all follow recommendations are now dismissable.\ + This change deprecates the `source` attribute in `Suggestion` entities in the REST API, and replaces it with the new [`sources` attribute](https://docs.joinmastodon.org/entities/Suggestion/#sources). +- Change account search algorithm (#30803 by @Gargron) +- **Change streaming server to use its own dependencies and its own docker image** (#24702, #27967, #26850, #28112, #28115, #28137, #28138, #28497, #28548, #30795, #31612, and #31615 by @TheEssem, @ThisIsMissEm, @jippi, @renchap, @timetinytim, and @vmstan)\ + In order to reduce the amount of runtime dependencies, the streaming server has been moved into a separate package and Docker image.\ + The `mastodon` image does not contain the streaming server anymore, as it has been moved to its own `mastodon-streaming` image.\ + Administrators may need to update their setup accordingly. +- Change how content warnings and filters are displayed in web UI (#31365, and #31761 by @Gargron) +- Change preview card processing to ignore `undefined` as canonical url (#31882 by @oneiros) +- Change embedded posts to use web UI (#31766, #32135 and #32271 by @Gargron) +- Change inner borders in media galleries in web UI (#31852 by @Gargron) +- Change design of media attachments and profile media tab in web UI (#31807, #32048, #31967, #32217, #32224 and #32257 by @ClearlyClaire and @Gargron) +- Change labels on thread indicators in web UI (#31806 by @Gargron) +- Change label of "Data export" menu item in settings interface (#32099 by @c960657) +- Change responsive break points on navigation panel in web UI (#32034 by @Gargron) +- Change cursor to `not-allowed` on disabled buttons (#32076 by @mjankowski) +- Change OAuth authorization prompt to not refer to apps as “third-party” (#32005 by @Gargron) +- Change Mastodon to issue correct HTTP signatures by default (#31994 by @ClearlyClaire) +- Change zoom icon in web UI (#29683 by @Gargron) +- Change directory page to use URL query strings for options (#31980, #31977 and #31984 by @ClearlyClaire and @renchap) +- Change report action buttons to be disabled when action has already been taken (#31773, #31822, and #31899 by @ClearlyClaire and @ThisIsMissEm) +- Change width of columns in advanced web UI (#31762 by @Gargron) +- Change design of unread conversations in web UI (#31763 by @Gargron) +- Change Web UI to allow viewing and severing relationships with suspended accounts (#27667 by @ClearlyClaire)\ + This also adds a `with_suspended` parameter to `GET /api/v1/accounts/relationships` in the REST API. +- Change preview card image size limit from 2MB to 8MB when using libvips (#31904 by @ClearlyClaire) +- Change avatars border radius (#31390 by @renchap) +- Change counters to be displayed on profile timelines in web UI (#30525 by @Gargron) +- Change disabled buttons color in light mode to make the difference more visible (#30998 by @renchap) +- Change design of people tab on explore in web UI (#30059 by @Gargron) +- Change sidebar text in web UI (#30696 by @Gargron) +- Change "Follow" to "Follow back" and "Mutual" when appropriate in web UI (#28452, #28465, and #31934 by @ClearlyClaire, @Gargron and @renchap) +- Change media to be hidden/blurred by default in report modal (#28522 by @ClearlyClaire) +- Change order of the "muting" and "blocking" list options in “Data Exports” (#26088 by @fixermark) +- Change admin and moderation notes character limit from 500 to 2000 characters (#30288 by @ThisIsMissEm) +- Change mute options to be in dropdown on muted users list in web UI (#30049 and #31315 by @ClearlyClaire and @Gargron) +- Change out-of-band hashtags design in web UI (#29732 by @Gargron) +- Change design of metadata underneath detailed posts in web UI (#29585, #29605, and #29648 by @ClearlyClaire and @Gargron) +- Change action button to be last on profiles in web UI (#29533 and #29923 by @ClearlyClaire and @Gargron) +- Change confirmation prompts in trending moderation interface to be more specific (#19626 by @tribela) +- Change “Trends” moderation menu to “Recommendations & Trends” and move follow recommendations there (#31292 by @ThisIsMissEm) +- Change irrelevant fields in account cleanup settings to be disabled unless automatic cleanup is enabled (#26562 by @c960657) +- Change dropdown menu icon to not be replaced by close icon when open in web UI (#29532 by @Gargron) +- Change back button to always appear in advanced web UI (#29551 and #29669 by @Gargron) +- Change border of active compose field search inputs (#29832 and #29839 by @vmstan) +- Change instances of Nokogiri HTML4 parsing to HTML5 (#31812, #31815, #31813, and #31814 by @flavorjones) +- Change link detection to allow `@` at the end of an URL (#31124 by @adamniedzielski) +- Change User-Agent to use Mastodon as the product, and http.rb as platform details (#31192 by @ClearlyClaire) +- Change layout and wording of the Content Retention server settings page (#27733 by @vmstan) +- Change unconfirmed users to be kept for one week instead of two days (#30285 by @renchap) +- Change maximum page size for Admin Domain Management APIs from 200 to 500 (#31253 by @ThisIsMissEm) +- Change database pool size to default to Sidekiq concurrency settings in Sidekiq processes (#26488 by @sinoru) +- Change alt text to empty string for avatars (#21875 by @jasminjohal) +- Change Docker images to use custom-built libvips and ffmpeg (#30571, #30569, and #31498 by @vmstan) +- Change external links in the admin audit log to plain text or local administration pages (#27139 and #27150 by @ClearlyClaire and @ThisIsMissEm) +- Change YJIT to be enabled when available (#30310 and #27283 by @ClearlyClaire and @mjankowski)\ + Enable Ruby's built-in just-in-time compiler. This improves performances substantially, at the cost of a slightly increased memory usage. +- Change `.env` file loading from deprecated `dotenv-rails` gem to `dotenv` gem (#29173 and #30121 by @mjankowski)\ + This should have no effect except in the unlikely case an environment variable included a newline. +- Change “Panjabi” language name to the more common spelling “Punjabi” (#27117 by @gunchleoc) +- Change encryption of OTP secrets to use ActiveRecord Encryption (#29831, #28325, #30151, #30202, #30340, and #30344 by @ClearlyClaire and @mjankowski)\ + This requires a manual step from administrators of existing servers. Indeed, they need to generate new secrets, which can be done using `bundle exec rails db:encryption:init`.\ + Furthermore, there is a risk that the introduced migration fails if the server was misconfigured in the past. If that happens, the migration error will include the relevant information. +- Change `/api/v1/announcements` to return regular `Status` entities (#26736 by @ClearlyClaire) +- Change imports to convert case-insensitive fields to lowercase (#29739 and #29740 by @ThisIsMissEm) +- Change stats in the admin interface to be inclusive of the full selected range, from beginning of day to end of day (#29416 and #29841 by @mjankowski) +- Change materialized views to be refreshed concurrently to avoid locks (#29015 by @Gargron) +- Change compose form to use server-provided post character and poll options limits (#28928 and #29490 by @ClearlyClaire and @renchap) +- Change streaming server logging from `npmlog` to `pino` and `pino-http` (#27828 by @ThisIsMissEm)\ + This changes the Mastodon streaming server log format, so this might be considered a breaking change if you were parsing the logs. +- Change media “ALT” label to use a specific CSS class (#28777 by @ClearlyClaire) +- Change streaming API host to not be overridden to localhost in development mode (#28557 by @ClearlyClaire) +- Change cookie rotator to use SHA1 digest for new cookies (#27392 by @ClearlyClaire)\ + Note that this requires that no pre-4.2.0 Mastodon web server is running when this code is deployed, as those would not understand the new cookies.\ + Therefore, zero-downtime updates are only supported if you're coming from 4.2.0 or newer. If you want to skip Mastodon 4.2, you will need to completely stop Mastodon services before updating. +- Change preview card deletes to be done using batch method (#28183 by @vmstan) +- Change `img-src` and `media-src` CSP directives to not include `https:` (#28025 and #28561 by @ClearlyClaire) +- Change self-destruct procedure (#26439, #29049, and #29420 by @ClearlyClaire and @zunda)\ + Instead of enqueuing deletion jobs immediately, `tootctl self-destruct` now outputs a value for the `SELF_DESTRUCT` environment variable, which puts a server in self-destruct mode, processing deletions in the background, while giving users access to their export archives. + +### Removed + +- Remove unused E2EE messaging code and related `crypto` OAuth scope (#31193, #31945, #31963, and #31964 by @ClearlyClaire and @mjankowski) +- Remove StatsD integration (replaced by OpenTelemetry) (#30240 by @mjankowski) +- Remove `CacheBuster` default options (#30718 by @mjankowski) +- Remove home marker updates from the Web UI (#22721 by @davbeck)\ + The web interface was unconditionally updating the home marker to the most recent received post, discarding any value set by other clients, thus making the feature unreliable. +- Remove support for Ruby 3.0 (reaching EOL) (#29702 by @mjankowski) +- Remove setting for unfollow confirmation modal (#29373 by @ClearlyClaire)\ + Instead, the unfollow confirmation modal will always be displayed. +- Remove support for Capistrano (#27295 and #30009 by @mjankowski and @renchap) + +### Fixed + +- **Fix link preview cards not always preserving the original URL from the status** (#27312 by @Gargron) +- Fix log out from user menu not working on Safari (#31402 by @renchap) +- Fix various issues when in link preview card generation (#28748, #30017, #30362, #30173, #30853, #30929, #30933, #30957, #30987, and #31144 by @adamniedzielski, @oneiros, @phocks, @timothyjrogers, and @tribela) +- Fix handling of missing links in Webfinger responses (#31030 by @adamniedzielski) +- Fix error when accepting an appeal for sensitive posts deleted in the meantime (#32037 by @ClearlyClaire) +- Fix error when encountering reblog of deleted post in feed rebuild (#32001 by @ClearlyClaire) +- Fix Safari browser glitch related to horizontal scrolling (#31960 by @Gargron) +- Fix unresolvable mentions sometimes preventing processing incoming posts (#29215 by @tribela and @ClearlyClaire) +- Fix too many requests caused by relationship look-ups in web UI (#32042 by @Gargron) +- Fix links for reblogs in moderation interface (#31979 by @ClearlyClaire) +- Fix the appearance of avatars when they do not load (#31966 and #32270 by @Gargron and @renchap) +- Fix spurious error notifications for aborted requests in web UI (#31952 by @c960657) +- Fix HTTP 500 error in `/api/v1/polls/:id/votes` when required `choices` parameter is missing (#25598 by @danielmbrasil) +- Fix security context sometimes not being added in LD-Signed activities (#31871 by @ClearlyClaire) +- Fix cross-origin loading of `inert.css` polyfill (#30687 by @louis77) +- Fix wrapping in dashboard quick access buttons (#32043 by @renchap) +- Fix recently used tags hint being displayed in profile edition page when there is none (#32120 by @mjankowski) +- Fix checkbox lists on narrow screens in the settings interface (#32112 by @mjankowski) +- Fix the position of status action buttons being affected by interaction counters (#32084 by @renchap) +- Fix the summary of converted ActivityPub object types to be treated as HTML (#28629 by @Menrath) +- Fix cutoff of instance name in sign-up form (#30598 by @oneiros) +- Fix invalid date searches returning 503 errors (#31526 by @notchairmk) +- Fix invalid `visibility` values in `POST /api/v1/statuses` returning 500 errors (#31571 by @c960657) +- Fix some components re-rendering spuriously in web UI (#31879 and #31881 by @ClearlyClaire and @Gargron) +- Fix sort order of moderation notes on Reports and Accounts (#31528 by @ThisIsMissEm) +- Fix email language when recipient has no selected locale (#31747 by @ClearlyClaire) +- Fix frequently-used languages not correctly updating in the web UI (#31386 by @c960657) +- Fix `POST /api/v1/statuses` silently ignoring invalid `media_ids` parameter (#31681 by @c960657) +- Fix handling of the `BIND` environment variable in the streaming server (#31624 by @ThisIsMissEm) +- Fix empty `aria-hidden` attribute value in logo resources area (#30570 by @mjankowski) +- Fix “Redirect URI” field not being marked as required in “New application” form (#30311 by @ThisIsMissEm) +- Fix right-to-left text in preview cards (#30930 by @ClearlyClaire) +- Fix rack attack `match_type` value typo in logging config (#30514 by @mjankowski) +- Fix various cases of duplicate, missing, or inconsistent borders or scrollbar styles (#31068, #31286, #31268, #31275, #31284, #31305, #31346, #31372, #31373, #31389, #31432, #31391, #31445, #32091, #32147 and #32137 by @ClearlyClaire, @mjankowski, @valtlai and @vmstan) +- Fix editing description of media uploads with custom thumbnails (#32221 by @ClearlyClaire) +- Fix race condition in `POST /api/v1/push/subscription` (#30166 by @ClearlyClaire) +- Fix post deletion not being delayed when those are part of an account warning (#30163 by @ClearlyClaire) +- Fix rendering error on `/start` when not logged in (#30023 by @timothyjrogers) +- Fix unneeded requests to blocked domains when receiving relayed signed activities from them (#31161 by @ClearlyClaire) +- Fix logo pushing header buttons out of view on certain conditions in mobile layout (#29787 by @ClearlyClaire) +- Fix notification-related records not being reattributed when merging accounts (#29694 by @ClearlyClaire) +- Fix results/query in `api/v1/featured_tags/suggestions` (#29597 by @mjankowski) +- Fix distracting and confusing always-showing scrollbar track in boost confirmation modal (#31524 by @ClearlyClaire) +- Fix being able to upload more than 4 media attachments in some cases (#29183 by @mashirozx) +- Fix preview card player getting embedded when clicking on the external link button (#29457 by @ClearlyClaire) +- Fix full date display not respecting the locale 12/24h format (#29448 by @renchap) +- Fix filters title and keywords overflow (#29396 by @GeopJr) +- Fix incorrect date format in “Follows and followers” (#29390 by @JasonPunyon) +- Fix navigation item active highlight for some paths (#32159 by @mjankowski) +- Fix “Edit media” modal sizing and layout when space-constrained (#27095 by @ronilaukkarinen) +- Fix modal container bounds (#29185 by @nico3333fr) +- Fix inefficient HTTP signature parsing using regexps and `StringScanner` (#29133 by @ClearlyClaire) +- Fix moderation report updates through `PUT /api/v1/admin/reports/:id` not being logged in the audit log (#29044, #30342, and #31033 by @mjankowski, @tribela, and @vmstan) +- Fix moderation interface allowing to select rule violation when there are no server rules (#31458 by @ThisIsMissEm) +- Fix redirection from paths with url-encoded `@` to their decoded form (#31184 by @timothyjrogers) +- Fix Trending Tags pending review having an unstable sort order (#31473 by @ThisIsMissEm) +- Fix the emoji dropdown button always opening the dropdown instead of behaving like a toggle (#29012 by @jh97uk) +- Fix processing of incoming posts with bearcaps (#26527 by @kmycode) +- Fix support for IPv6 redis connections in streaming (#31229 by @ThisIsMissEm) +- Fix search form re-rendering spuriously in web UI (#28876 by @Gargron) +- Fix `RedownloadMediaWorker` not being called on transient S3 failure (#28714 by @ClearlyClaire) +- Fix ISO code for Canadian French from incorrect `fr-QC` to `fr-CA` (#26015 by @gunchleoc) +- Fix `.opus` file uploads being misidentified by Paperclip (#28580 by @vmstan) +- Fix loading local accounts with extraneous domain part in WebUI (#28559 by @ClearlyClaire) +- Fix destructive actions in dropdowns not using error color in light theme (#28484 by @logicalmoody) +- Fix call to inefficient `delete_matched` cache method in domain blocks (#28374 by @ClearlyClaire) +- Fix status edits not always being streamed to mentioned users (#28324 by @ClearlyClaire) +- Fix onboarding step descriptions being truncated on narrow screens (#28021 by @ClearlyClaire) +- Fix duplicate IDs in relationships and familiar_followers APIs (#27982 by @KevinBongart) +- Fix modal content not being selectable (#27813 by @pajowu) +- Fix Web UI not displaying appropriate explanation when a user hides their follows/followers (#27791 by @ClearlyClaire) +- Fix format-dependent redirects being cached regardless of requested format (#27632 by @ClearlyClaire) +- Fix confusing screen when visiting a confirmation link for an already-confirmed email (#27368 by @ClearlyClaire) +- Fix explore page reloading when you navigate back to it in web UI (#27489 by @Gargron) +- Fix missing redirection from `/home` to `/deck/home` in the advanced interface (#27378 by @Signez) +- Fix empty environment variables not using default nil value (#27400 by @renchap) +- Fix language sorting in settings (#27158 by @gunchleoc) + +## |4.2.11] - 2024-08-16 + +### Added + +- Add support for incoming `` tag ([mediaformat](https://github.com/mastodon/mastodon/pull/31375)) + +### Changed + +- Change logic of block/mute bypass for mentions from moderators to only apply to visible roles with moderation powers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/31271)) + +### Fixed + +- Fix incorrect rate limit on PUT requests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/31356)) +- Fix presence of `ß` in adjacent word preventing mention and hashtag matching ([adamniedzielski](https://github.com/mastodon/mastodon/pull/31122)) +- Fix processing of webfinger responses with multiple `self` links ([adamniedzielski](https://github.com/mastodon/mastodon/pull/31110)) +- Fix duplicate `orderedItems` in user archive's `outbox.json` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/31099)) +- Fix click event handling when clicking outside of an open dropdown menu ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/31251)) +- Fix status processing failing halfway when a remote post has a malformed `replies` attribute ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/31246)) +- Fix `--verbose` option of `tootctl media remove`, which was previously erroneously removed ([mjankowski](https://github.com/mastodon/mastodon/pull/30536)) +- Fix division by zero on some video/GIF files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30600)) +- Fix Web UI trying to save user settings despite being logged out ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30324)) +- Fix hashtag regexp matching some link anchors ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30190)) +- Fix local account search on LDAP login being case-sensitive ([raucao](https://github.com/mastodon/mastodon/pull/30113)) +- Fix development environment admin account not being auto-approved ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29958)) +- Fix report reason selector in moderation interface not unselecting rules when changing category ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29026)) +- Fix already-invalid reports failing to resolve ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29027)) +- Fix OCR when using S3/CDN for assets ([vmstan](https://github.com/mastodon/mastodon/pull/28551)) +- Fix error when encountering malformed `Tag` objects from Kbin ([ShadowJonathan](https://github.com/mastodon/mastodon/pull/28235)) +- Fix not all allowed image formats showing in file picker when uploading custom emoji ([june128](https://github.com/mastodon/mastodon/pull/28076)) +- Fix search popout listing unusable search options when logged out ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27918)) +- Fix processing of featured collections lacking an `items` attribute ([tribela](https://github.com/mastodon/mastodon/pull/27581)) +- Fix `mastodon:stats` decoration of stats rake task ([mjankowski](https://github.com/mastodon/mastodon/pull/31104)) + ## [4.2.10] - 2024-07-04 ### Security diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2271802ca961a9..66aa01ffe4f206 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,6 +50,11 @@ You can contribute in the following ways: If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon). +Please review the org-level [contribution guidelines] for high-level acceptance +criteria guidance. + +[contribution guidelines]: https://github.com/mastodon/.github/blob/main/CONTRIBUTING.md + ## API Changes and Additions Please note that any changes or additions made to the API should have an accompanying pull request on [our documentation repository](https://github.com/mastodon/documentation). diff --git a/Dockerfile b/Dockerfile index 7f7eca06dac040..a5e35025ae2f6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1.8 +# syntax=docker/dockerfile:1.10 # 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/README.md#docker @@ -12,7 +12,7 @@ ARG BUILDPLATFORM=${BUILDPLATFORM} # Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.x"] # renovate: datasource=docker depName=docker.io/ruby -ARG RUBY_VERSION="3.3.3" +ARG RUBY_VERSION="3.3.5" # # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] # renovate: datasource=node-version depName=node ARG NODE_MAJOR_VERSION="20" @@ -67,7 +67,9 @@ ENV \ # Optimize jemalloc 5.x performance MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \ # Enable libvips, should not be changed - MASTODON_USE_LIBVIPS=true + MASTODON_USE_LIBVIPS=true \ +# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes + MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs # Set default shell used for running commands SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"] @@ -189,16 +191,19 @@ 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.15.2 +ARG VIPS_VERSION=8.15.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 WORKDIR /usr/local/libvips/src +# Download and extract libvips source code +ADD ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz /usr/local/libvips/src/ +RUN tar xf vips-${VIPS_VERSION}.tar.xz; +WORKDIR /usr/local/libvips/src/vips-${VIPS_VERSION} + +# Configure and compile libvips RUN \ - curl -sSL -o vips-${VIPS_VERSION}.tar.xz ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz; \ - tar xf vips-${VIPS_VERSION}.tar.xz; \ - cd vips-${VIPS_VERSION}; \ meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false; \ cd build; \ ninja; \ @@ -209,16 +214,19 @@ 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.0.1 +ARG FFMPEG_VERSION=7.1 # ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"] ARG FFMPEG_URL=https://ffmpeg.org/releases 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; + +WORKDIR /usr/local/ffmpeg/src/ffmpeg-${FFMPEG_VERSION} +# Configure and compile ffmpeg RUN \ - curl -sSL -o ffmpeg-${FFMPEG_VERSION}.tar.xz ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz; \ - tar xf ffmpeg-${FFMPEG_VERSION}.tar.xz; \ - cd ffmpeg-${FFMPEG_VERSION}; \ ./configure \ --prefix=/usr/local/ffmpeg \ --toolchain=hardened \ diff --git a/Gemfile b/Gemfile index ef52d50cac128d..bcb19421ab9afe 100644 --- a/Gemfile +++ b/Gemfile @@ -16,7 +16,7 @@ gem 'pghero' gem 'aws-sdk-s3', '~> 1.123', require: false gem 'blurhash', '~> 0.1' -gem 'fog-core', '<= 2.4.0' +gem 'fog-core', '<= 2.5.0' gem 'fog-openstack', '~> 1.0', require: false gem 'kt-paperclip', '~> 7.2' gem 'md-paperclip-azure', '~> 2.2', require: false @@ -47,7 +47,6 @@ gem 'color_diff', '~> 0.1' gem 'csv', '~> 3.2' gem 'discard', '~> 1.2' gem 'doorkeeper', '~> 5.6' -gem 'ed25519', '~> 1.3' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'hiredis', '~> 0.6' @@ -64,7 +63,6 @@ gem 'link_header', '~> 0.0' gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar' gem 'nokogiri', '~> 1.15' -gem 'nsa' gem 'oj', '~> 3.14' gem 'ox', '~> 2.14' gem 'parslet' @@ -88,7 +86,7 @@ gem 'sidekiq-unique-jobs', '~> 7.1' gem 'simple_form', '~> 5.2' gem 'simple-navigation', '~> 4.4' gem 'stoplight', '~> 4.1' -gem 'strong_migrations', '1.8.0' +gem 'strong_migrations' gem 'tty-prompt', '~> 0.23', require: false gem 'twitter-text', '~> 3.1.0' gem 'tzinfo-data', '~> 1.2023' @@ -100,10 +98,10 @@ gem 'json-ld' gem 'json-ld-preloaded', '~> 3.2' gem 'rdf-normalize', '~> 0.5' -gem 'opentelemetry-api', '~> 1.2.5' +gem 'opentelemetry-api', '~> 1.4.0' group :opentelemetry do - gem 'opentelemetry-exporter-otlp', '~> 0.28.0', require: false + gem 'opentelemetry-exporter-otlp', '~> 0.29.0', require: false gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.20.1', require: false gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false @@ -112,7 +110,7 @@ group :opentelemetry do gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false - gem 'opentelemetry-instrumentation-pg', '~> 0.27.1', require: false + gem 'opentelemetry-instrumentation-pg', '~> 0.29.0', require: false gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false gem 'opentelemetry-instrumentation-rails', '~> 0.31.0', require: false gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false @@ -127,9 +125,6 @@ group :test do # Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab gem 'rspec-github', '~> 2.4', require: false - # RSpec progress bar formatter - gem 'fuubar', '~> 2.5' - # RSpec helpers for email specs gem 'email_spec' @@ -150,11 +145,13 @@ group :test do gem 'rails-controller-testing', '~> 1.0' # Validate schemas in specs - gem 'json-schema', '~> 4.0' + gem 'json-schema', '~> 5.0' # Test harness fo rack components gem 'rack-test', '~> 2.1' + gem 'shoulda-matchers' + # Coverage formatter for RSpec test if DISABLE_SIMPLECOV is false gem 'simplecov', '~> 0.22', require: false gem 'simplecov-lcov', '~> 0.8', require: false @@ -211,7 +208,7 @@ group :development, :test do gem 'test-prof' # RSpec runner for rails - gem 'rspec-rails', '~> 6.0' + gem 'rspec-rails', '~> 7.0' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index eb6720e4542b77..d1ee8e0fa8eacd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,35 +10,35 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) + actioncable (7.1.4.1) + actionpack (= 7.1.4.1) + activesupport (= 7.1.4.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionmailbox (7.1.4.1) + actionpack (= 7.1.4.1) + activejob (= 7.1.4.1) + activerecord (= 7.1.4.1) + activestorage (= 7.1.4.1) + activesupport (= 7.1.4.1) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.3.4) - actionpack (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionmailer (7.1.4.1) + actionpack (= 7.1.4.1) + actionview (= 7.1.4.1) + activejob (= 7.1.4.1) + activesupport (= 7.1.4.1) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.3.4) - actionview (= 7.1.3.4) - activesupport (= 7.1.3.4) + actionpack (7.1.4.1) + actionview (= 7.1.4.1) + activesupport (= 7.1.4.1) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -46,15 +46,15 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.3.4) - actionpack (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + actiontext (7.1.4.1) + actionpack (= 7.1.4.1) + activerecord (= 7.1.4.1) + activestorage (= 7.1.4.1) + activesupport (= 7.1.4.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.3.4) - activesupport (= 7.1.3.4) + actionview (7.1.4.1) + activesupport (= 7.1.4.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -64,22 +64,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (7.1.3.4) - activesupport (= 7.1.3.4) + activejob (7.1.4.1) + activesupport (= 7.1.4.1) globalid (>= 0.3.6) - activemodel (7.1.3.4) - activesupport (= 7.1.3.4) - activerecord (7.1.3.4) - activemodel (= 7.1.3.4) - activesupport (= 7.1.3.4) + activemodel (7.1.4.1) + activesupport (= 7.1.4.1) + activerecord (7.1.4.1) + activemodel (= 7.1.4.1) + activesupport (= 7.1.4.1) timeout (>= 0.4.0) - activestorage (7.1.3.4) - actionpack (= 7.1.3.4) - activejob (= 7.1.3.4) - activerecord (= 7.1.3.4) - activesupport (= 7.1.3.4) + activestorage (7.1.4.1) + actionpack (= 7.1.4.1) + activejob (= 7.1.4.1) + activerecord (= 7.1.4.1) + activesupport (= 7.1.4.1) marcel (~> 1.0) - activesupport (7.1.3.4) + activesupport (7.1.4.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -100,20 +100,20 @@ GEM attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.950.0) - aws-sdk-core (3.201.0) + aws-partitions (1.983.0) + aws-sdk-core (3.209.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) + aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.88.0) - aws-sdk-core (~> 3, >= 3.201.0) + aws-sdk-kms (1.94.0) + aws-sdk-core (~> 3, >= 3.207.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.156.0) - aws-sdk-core (~> 3, >= 3.201.0) + aws-sdk-s3 (1.167.0) + aws-sdk-core (~> 3, >= 3.207.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.8.0) + aws-sigv4 (1.10.0) aws-eventstream (~> 1, >= 1.0.2) azure-storage-blob (2.0.3) azure-storage-common (~> 2.0) @@ -134,17 +134,17 @@ GEM bindata (2.5.0) binding_of_caller (1.0.1) debug_inspector (>= 1.2.0) - blurhash (0.1.7) - bootsnap (1.18.3) + blurhash (0.1.8) + bootsnap (1.18.4) msgpack (~> 1.2) - brakeman (6.1.2) + brakeman (6.2.1) racc browser (5.3.1) brpoplpush-redis_script (0.1.3) concurrent-ruby (~> 1.0, >= 1.0.5) redis (>= 1.0, < 6) builder (3.3.0) - bundler-audit (0.9.1) + bundler-audit (0.9.2) bundler (>= 1.2.0, < 3) thor (~> 1.0) capybara (3.40.0) @@ -159,28 +159,30 @@ GEM case_transform (0.2) activesupport cbor (0.5.9.8) - charlock_holmes (0.7.8) + charlock_holmes (0.7.9) chewy (7.6.0) activesupport (>= 5.2) elasticsearch (>= 7.14.0, < 8) elasticsearch-dsl + childprocess (5.1.0) + logger (~> 1.5) chunky_png (1.4.0) climate_control (1.2.0) cocoon (1.2.15) color_diff (0.1) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) - cose (1.3.0) + cose (1.3.1) cbor (~> 0.5.9) openssl-signature_algorithm (~> 1.0) crack (1.0.0) bigdecimal rexml crass (1.0.6) - css_parser (1.17.1) + css_parser (1.19.0) addressable csv (3.3.0) - database_cleaner-active_record (2.1.0) + database_cleaner-active_record (2.2.0) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) @@ -195,7 +197,7 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-two-factor (5.1.0) + devise-two-factor (6.0.0) activesupport (~> 7.0) devise (~> 4.0) railties (~> 7.0) @@ -206,32 +208,32 @@ GEM diff-lcs (1.5.1) discard (1.3.0) activerecord (>= 4.2, < 8) - docile (1.4.0) + docile (1.4.1) domain_name (0.6.20240107) doorkeeper (5.7.1) railties (>= 5) - dotenv (3.1.2) + dotenv (3.1.4) drb (2.2.1) - ed25519 (1.3.0) - elasticsearch (7.17.10) - elasticsearch-api (= 7.17.10) - elasticsearch-transport (= 7.17.10) - elasticsearch-api (7.17.10) + elasticsearch (7.17.11) + elasticsearch-api (= 7.17.11) + elasticsearch-transport (= 7.17.11) + elasticsearch-api (7.17.11) multi_json elasticsearch-dsl (0.1.10) - elasticsearch-transport (7.17.10) + elasticsearch-transport (7.17.11) + base64 faraday (>= 1, < 3) multi_json - email_spec (2.2.2) + email_spec (2.3.0) htmlentities (~> 4.3.3) - launchy (~> 2.1) + launchy (>= 2.1, < 4.0) mail (~> 2.7) erubi (1.13.0) et-orbi (1.2.11) tzinfo - excon (0.110.0) + excon (0.111.0) fabrication (2.31.0) - faker (3.4.1) + faker (3.4.2) i18n (>= 1.8.11, < 2) faraday (1.10.3) faraday-em_http (~> 1.0) @@ -251,7 +253,7 @@ GEM faraday-httpclient (1.0.1) faraday-multipart (1.0.4) multipart-post (~> 2) - faraday-net_http (1.0.1) + faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) @@ -264,12 +266,13 @@ GEM ffi-compiler (1.3.2) ffi (>= 1.15.5) rake - flatware (2.3.2) + flatware (2.3.3) + drb thor (< 2.0) - flatware-rspec (2.3.2) - flatware (= 2.3.2) + flatware-rspec (2.3.3) + flatware (= 2.3.3) rspec (>= 3.6) - fog-core (2.4.0) + fog-core (2.5.0) builder excon (~> 0.71) formatador (>= 0.2, < 2.0) @@ -281,17 +284,14 @@ GEM fog-core (~> 2.1) fog-json (>= 1.0) formatador (1.1.0) - fugit (1.10.1) - et-orbi (~> 1, >= 1.2.7) + fugit (1.11.1) + et-orbi (~> 1, >= 1.2.11) raabro (~> 1.4) - fuubar (2.5.1) - rspec-core (~> 3.0) - ruby-progressbar (~> 1.4) globalid (1.2.1) activesupport (>= 6.1) - google-protobuf (3.25.3) - googleapis-common-protos-types (1.14.0) - google-protobuf (~> 3.18) + google-protobuf (3.25.5) + googleapis-common-protos-types (1.15.0) + google-protobuf (>= 3.18, < 5.a) haml (6.3.0) temple (>= 0.8.2) thor @@ -301,17 +301,18 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.58.0) + haml_lint (0.59.0) haml (>= 5.0) parallel (~> 1.10) rainbow rubocop (>= 1.0) sysexits (~> 1.1) - hashdiff (1.1.0) + hashdiff (1.1.1) hashie (5.0.0) hcaptcha (7.1.0) json - highline (3.0.1) + highline (3.1.1) + reline hiredis (0.6.3) hkdf (0.3.0) htmlentities (4.3.4) @@ -329,7 +330,7 @@ GEM httplog (1.7.0) rack (>= 2.0) rainbow (>= 2.0.0) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) i18n-tasks (1.0.14) activesupport (>= 4.0.2) @@ -342,11 +343,11 @@ GEM rainbow (>= 2.2.2, < 4.0) terminal-table (>= 1.5.1) idn-ruby (0.1.5) - inline_svg (1.9.0) + inline_svg (1.10.0) activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.7.2) - irb (1.13.2) + irb (1.14.1) rdoc (>= 4.0.0) reline (>= 0.4.2) jmespath (1.6.2) @@ -357,18 +358,19 @@ GEM aes_key_wrap bindata httpclient - json-ld (3.3.1) + json-ld (3.3.2) htmlentities (~> 4.3) json-canonicalization (~> 1.0) link_header (~> 0.0, >= 0.0.8) multi_json (~> 1.15) rack (>= 2.2, < 4) rdf (~> 3.3) + rexml (~> 3.2) json-ld-preloaded (3.3.0) json-ld (~> 3.3) rdf (~> 3.3) - json-schema (4.3.0) - addressable (>= 2.8) + json-schema (5.0.1) + addressable (~> 2.8) jsonapi-renderer (0.2.2) jwt (2.7.1) kaminari (1.2.2) @@ -390,8 +392,9 @@ GEM mime-types terrapin (>= 0.6.0, < 2.0) language_server-protocol (3.17.0.3) - launchy (2.5.2) + launchy (3.0.1) addressable (~> 2.8) + childprocess (~> 5.0) letter_opener (1.10.0) launchy (>= 2.2, < 4) letter_opener_web (3.0.0) @@ -403,7 +406,7 @@ GEM llhttp-ffi (0.5.0) ffi-compiler (~> 1.0) rake (~> 13.0) - logger (1.6.0) + logger (1.6.1) lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) @@ -425,22 +428,22 @@ GEM addressable (~> 2.5) azure-storage-blob (~> 2.0.1) hashie (~> 5.0) - memory_profiler (1.0.2) + memory_profiler (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2024.0604) + mime-types-data (3.2024.0820) mini_mime (1.1.5) mini_portile2 (2.8.7) - minitest (5.24.1) + minitest (5.25.1) msgpack (1.7.2) multi_json (1.15.0) - multipart-post (2.4.0) + multipart-post (2.4.1) mutex_m (0.2.0) net-http (0.4.1) uri net-http-persistent (4.0.2) connection_pool (~> 2.2) - net-imap (0.4.12) + net-imap (0.4.15) date net-protocol net-ldap (0.19.0) @@ -451,16 +454,12 @@ GEM net-smtp (0.5.0) net-protocol nio4r (2.7.3) - nokogiri (1.16.6) + nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nsa (0.3.0) - activesupport (>= 4.2, < 7.2) - concurrent-ruby (~> 1.0, >= 1.0.2) - sidekiq (>= 3.5) - statsd-ruby (~> 1.4, >= 1.4.0) - oj (3.16.4) + oj (3.16.6) bigdecimal (>= 3.0) + ostruct (>= 0.2) omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) @@ -469,12 +468,12 @@ GEM addressable (~> 2.8) nokogiri (~> 1.12) omniauth (~> 2.1) - omniauth-rails_csrf_protection (1.0.1) + omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) - omniauth-saml (2.1.0) - omniauth (~> 2.0) - ruby-saml (~> 1.12) + omniauth-saml (2.2.1) + omniauth (~> 2.1) + ruby-saml (~> 1.17) omniauth_openid_connect (0.6.1) omniauth (>= 1.9, < 3) openid_connect (~> 1.1) @@ -492,18 +491,18 @@ GEM openssl (3.2.0) openssl-signature_algorithm (1.3.0) openssl (> 2.0) - opentelemetry-api (1.2.5) - opentelemetry-common (0.20.1) + opentelemetry-api (1.4.0) + opentelemetry-common (0.21.0) opentelemetry-api (~> 1.0) - opentelemetry-exporter-otlp (0.28.0) + opentelemetry-exporter-otlp (0.29.0) google-protobuf (>= 3.18) googleapis-common-protos-types (~> 1.3) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-sdk (~> 1.2) opentelemetry-semantic_conventions - opentelemetry-helpers-sql-obfuscation (0.1.0) - opentelemetry-common (~> 0.20) + opentelemetry-helpers-sql-obfuscation (0.2.0) + opentelemetry-common (~> 0.21) opentelemetry-instrumentation-action_mailer (0.1.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) @@ -512,51 +511,52 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-action_view (0.7.0) + opentelemetry-instrumentation-action_view (0.7.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_job (0.7.2) + opentelemetry-instrumentation-active_job (0.7.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_model_serializers (0.20.1) + opentelemetry-instrumentation-active_model_serializers (0.20.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_record (0.7.2) + opentelemetry-instrumentation-active_record (0.7.3) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-active_support (0.6.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-base (0.22.3) + opentelemetry-instrumentation-base (0.22.6) opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.21) opentelemetry-registry (~> 0.1) - opentelemetry-instrumentation-concurrent_ruby (0.21.3) + opentelemetry-instrumentation-concurrent_ruby (0.21.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-excon (0.22.3) + opentelemetry-instrumentation-excon (0.22.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-faraday (0.24.5) + opentelemetry-instrumentation-faraday (0.24.6) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-http (0.23.3) + opentelemetry-instrumentation-http (0.23.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-http_client (0.22.6) + opentelemetry-instrumentation-http_client (0.22.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-net_http (0.22.6) + opentelemetry-instrumentation-net_http (0.22.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-pg (0.27.3) + opentelemetry-instrumentation-pg (0.29.0) opentelemetry-api (~> 1.0) opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rack (0.24.5) + opentelemetry-instrumentation-rack (0.24.6) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rails (0.31.0) + opentelemetry-instrumentation-rails (0.31.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-action_mailer (~> 0.1.0) opentelemetry-instrumentation-action_pack (~> 0.9.0) @@ -565,56 +565,57 @@ GEM opentelemetry-instrumentation-active_record (~> 0.7.0) opentelemetry-instrumentation-active_support (~> 0.6.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-redis (0.25.6) + opentelemetry-instrumentation-redis (0.25.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-sidekiq (0.25.6) + opentelemetry-instrumentation-sidekiq (0.25.7) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-registry (0.3.1) opentelemetry-api (~> 1.1) - opentelemetry-sdk (1.4.1) + opentelemetry-sdk (1.5.0) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) opentelemetry-semantic_conventions - opentelemetry-semantic_conventions (1.10.0) + opentelemetry-semantic_conventions (1.10.1) opentelemetry-api (~> 1.0) orm_adapter (0.5.0) + ostruct (0.6.0) ox (2.14.18) - parallel (1.25.1) - parser (3.3.3.0) + parallel (1.26.3) + parser (3.3.5.0) ast (~> 2.4.1) racc parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.5.6) - pghero (3.5.0) - activerecord (>= 6) - premailer (1.23.0) + pg (1.5.8) + pghero (3.6.1) + activerecord (>= 6.1) + premailer (1.27.0) addressable - css_parser (>= 1.12.0) + css_parser (>= 1.19.0) htmlentities (>= 4.0.0) premailer-rails (1.12.0) actionmailer (>= 3) net-smtp premailer (~> 1.7, >= 1.7.9) - propshaft (0.9.0) + propshaft (1.1.0) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack railties (>= 7.0.0) psych (5.1.2) stringio - public_suffix (6.0.0) - puma (6.4.2) + public_suffix (6.0.1) + puma (6.4.3) nio4r (~> 2.0) - pundit (2.3.2) + pundit (2.4.0) activesupport (>= 3.0.0) raabro (1.4.0) - racc (1.8.0) - rack (2.2.9) + racc (1.8.1) + rack (2.2.10) rack-attack (6.7.0) rack (>= 1.0, < 4) rack-cors (2.0.2) @@ -637,20 +638,20 @@ GEM rackup (1.0.0) rack (< 3) webrick - rails (7.1.3.4) - actioncable (= 7.1.3.4) - actionmailbox (= 7.1.3.4) - actionmailer (= 7.1.3.4) - actionpack (= 7.1.3.4) - actiontext (= 7.1.3.4) - actionview (= 7.1.3.4) - activejob (= 7.1.3.4) - activemodel (= 7.1.3.4) - activerecord (= 7.1.3.4) - activestorage (= 7.1.3.4) - activesupport (= 7.1.3.4) + rails (7.1.4.1) + actioncable (= 7.1.4.1) + actionmailbox (= 7.1.4.1) + actionmailer (= 7.1.4.1) + actionpack (= 7.1.4.1) + actiontext (= 7.1.4.1) + actionview (= 7.1.4.1) + activejob (= 7.1.4.1) + activemodel (= 7.1.4.1) + activerecord (= 7.1.4.1) + activestorage (= 7.1.4.1) + activesupport (= 7.1.4.1) bundler (>= 1.15.0) - railties (= 7.1.3.4) + railties (= 7.1.4.1) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -665,9 +666,9 @@ GEM rails-i18n (7.0.9) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.3.4) - actionpack (= 7.1.3.4) - activesupport (= 7.1.3.4) + railties (7.1.4.1) + actionpack (= 7.1.4.1) + activesupport (= 7.1.4.1) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -675,8 +676,9 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.2.1) - rdf (3.3.1) + rdf (3.3.2) bcp47_spec (~> 0.2) + bigdecimal (~> 3.1, >= 3.1.5) link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.7.0) rdf (~> 3.3) @@ -689,17 +691,16 @@ GEM redlock (1.3.2) redis (>= 3.0.0, < 6.0) regexp_parser (2.9.2) - reline (0.5.9) + reline (0.5.10) io-console (~> 0.5) request_store (1.6.0) rack (>= 1.4) responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.3.1) - strscan + rexml (3.3.8) rotp (6.3.0) - rouge (4.2.1) + rouge (4.3.0) rpam2 (4.0.2) rqrcode (2.2.0) chunky_png (~> 1.0) @@ -709,9 +710,9 @@ GEM rspec-core (~> 3.13.0) rspec-expectations (~> 3.13.0) rspec-mocks (~> 3.13.0) - rspec-core (3.13.0) + rspec-core (3.13.1) rspec-support (~> 3.13.0) - rspec-expectations (3.13.1) + rspec-expectations (3.13.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-github (2.4.0) @@ -719,10 +720,10 @@ GEM rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.3) - actionpack (>= 6.1) - activesupport (>= 6.1) - railties (>= 6.1) + rspec-rails (7.0.1) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) rspec-core (~> 3.13) rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) @@ -733,70 +734,72 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.1) - rubocop (1.64.1) + rubocop (1.66.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.31.1, < 2.0) + regexp_parser (>= 2.4, < 3.0) + rubocop-ast (>= 1.32.2, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.3) + rubocop-ast (1.32.3) parser (>= 3.3.1.0) rubocop-capybara (2.21.0) rubocop (~> 1.41) - rubocop-performance (1.21.1) + rubocop-performance (1.22.1) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rails (2.25.1) + rubocop-rails (2.26.2) activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 1.33.0, < 2.0) + rubocop (>= 1.52.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (3.0.2) + rubocop-rspec (3.1.0) rubocop (~> 1.61) rubocop-rspec_rails (2.30.0) rubocop (~> 1.61) rubocop-rspec (~> 3, >= 3.0.1) ruby-prof (1.7.0) ruby-progressbar (1.13.0) - ruby-saml (1.16.0) + ruby-saml (1.17.0) nokogiri (>= 1.13.10) rexml - ruby-vips (2.2.1) + ruby-vips (2.2.2) ffi (~> 1.12) + logger ruby2_keywords (0.0.5) rubyzip (2.3.2) rufus-scheduler (3.9.1) fugit (~> 1.1, >= 1.1.6) safety_net_attestation (0.4.0) jwt (~> 2.0) - sanitize (6.1.1) + sanitize (6.1.3) crass (~> 1.0.2) nokogiri (>= 1.12.0) scenic (1.8.0) activerecord (>= 4.0.0) railties (>= 4.0.0) - selenium-webdriver (4.22.0) + selenium-webdriver (4.25.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) semantic_range (3.0.0) + shoulda-matchers (6.4.0) + activesupport (>= 5.2.0) sidekiq (6.5.12) connection_pool (>= 2.2.5, < 3) rack (~> 2.0) redis (>= 4.5.0, < 5) sidekiq-bulk (0.2.0) sidekiq - sidekiq-scheduler (5.0.3) + sidekiq-scheduler (5.0.6) rufus-scheduler (~> 3.2) sidekiq (>= 6, < 8) - tilt (>= 1.4.0) + tilt (>= 1.4.0, < 3) sidekiq-unique-jobs (7.1.33) brpoplpush-redis_script (> 0.1.1, <= 2.0.0) concurrent-ruby (~> 1.0, >= 1.0.5) @@ -812,17 +815,15 @@ GEM docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-html (0.12.3) + simplecov-html (0.13.1) simplecov-lcov (0.8.0) simplecov_json_formatter (0.1.4) stackprof (0.2.26) - statsd-ruby (1.5.0) stoplight (4.1.0) redlock (~> 1.0) stringio (3.1.1) - strong_migrations (1.8.0) - activerecord (>= 5.2) - strscan (3.1.0) + strong_migrations (2.0.1) + activerecord (>= 6.1) swd (1.3.0) activesupport (>= 3) attr_required (>= 0.0.5) @@ -833,11 +834,11 @@ GEM unicode-display_width (>= 1.1.1, < 3) terrapin (1.0.1) climate_control - test-prof (1.3.3.1) - thor (1.3.1) - tilt (2.3.0) + test-prof (1.4.2) + thor (1.3.2) + tilt (2.4.0) timeout (0.4.1) - tpm-key_attestation (0.12.0) + tpm-key_attestation (0.12.1) bindata (~> 2.4) openssl (> 2.0) openssl-signature_algorithm (~> 1.0) @@ -856,13 +857,13 @@ GEM unf (~> 0.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2024.1) + tzinfo-data (1.2024.2) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext unf_ext (0.0.9.1) - unicode-display_width (2.5.0) - uri (0.13.0) + unicode-display_width (2.6.0) + uri (0.13.1) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -883,7 +884,7 @@ GEM webfinger (1.2.0) activesupport httpclient (>= 2.4) - webmock (3.23.1) + webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -892,8 +893,8 @@ GEM rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) - webrick (1.8.1) - websocket (1.2.10) + webrick (1.8.2) + websocket (1.2.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -901,7 +902,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.16) + zeitwerk (2.6.18) PLATFORMS ruby @@ -935,16 +936,14 @@ DEPENDENCIES discard (~> 1.2) doorkeeper (~> 5.6) dotenv - ed25519 (~> 1.3) email_spec fabrication (~> 2.30) faker (~> 3.2) fast_blank (~> 1.0) fastimage flatware-rspec - fog-core (<= 2.4.0) + fog-core (<= 2.5.0) fog-openstack (~> 1.0) - fuubar (~> 2.5) haml-rails (~> 2.0) haml_lint hcaptcha (~> 7.1) @@ -960,7 +959,7 @@ DEPENDENCIES irb (~> 1.8) json-ld json-ld-preloaded (~> 3.2) - json-schema (~> 4.0) + json-schema (~> 5.0) kaminari (~> 1.2) kt-paperclip (~> 7.2) letter_opener (~> 1.8) @@ -975,15 +974,14 @@ DEPENDENCIES net-http (~> 0.4.0) net-ldap (~> 0.18) nokogiri (~> 1.15) - nsa oj (~> 3.14) omniauth (~> 2.0) omniauth-cas (~> 3.0.0.beta.1) omniauth-rails_csrf_protection (~> 1.0) omniauth-saml (~> 2.0) omniauth_openid_connect (~> 0.6.1) - opentelemetry-api (~> 1.2.5) - opentelemetry-exporter-otlp (~> 0.28.0) + opentelemetry-api (~> 1.4.0) + opentelemetry-exporter-otlp (~> 0.29.0) opentelemetry-instrumentation-active_job (~> 0.7.1) opentelemetry-instrumentation-active_model_serializers (~> 0.20.1) opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2) @@ -992,7 +990,7 @@ DEPENDENCIES opentelemetry-instrumentation-http (~> 0.23.2) opentelemetry-instrumentation-http_client (~> 0.22.3) opentelemetry-instrumentation-net_http (~> 0.22.4) - opentelemetry-instrumentation-pg (~> 0.27.1) + opentelemetry-instrumentation-pg (~> 0.29.0) opentelemetry-instrumentation-rack (~> 0.24.1) opentelemetry-instrumentation-rails (~> 0.31.0) opentelemetry-instrumentation-redis (~> 0.25.3) @@ -1020,7 +1018,7 @@ DEPENDENCIES redis-namespace (~> 1.10) rqrcode (~> 2.2) rspec-github (~> 2.4) - rspec-rails (~> 6.0) + rspec-rails (~> 7.0) rspec-sidekiq (~> 5.0) rubocop rubocop-capybara @@ -1035,6 +1033,7 @@ DEPENDENCIES sanitize (~> 6.0) scenic (~> 1.7) selenium-webdriver + shoulda-matchers sidekiq (~> 6.5) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 5.0) @@ -1045,7 +1044,7 @@ DEPENDENCIES simplecov-lcov (~> 0.8) stackprof stoplight (~> 4.1) - strong_migrations (= 1.8.0) + strong_migrations test-prof thor (~> 1.2) tty-prompt (~> 0.23) @@ -1058,7 +1057,7 @@ DEPENDENCIES xorcist (~> 1.1) RUBY VERSION - ruby 3.3.2p78 + ruby 3.3.4p94 BUNDLED WITH - 2.5.11 + 2.5.18 diff --git a/Procfile b/Procfile index d15c835b867517..f033fd36c6bd22 100644 --- a/Procfile +++ b/Procfile @@ -11,4 +11,4 @@ worker: bundle exec sidekiq # # and let the main app use the separate app: # -# heroku config:set STREAMING_API_BASE_URL=wss://.herokuapp.com -a +# heroku config:set STREAMING_API_BASE_URL=wss://.herokuapp.com -a diff --git a/SECURITY.md b/SECURITY.md index 156954ce02352e..43ab4454c456f0 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,8 +13,9 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through ## Supported Versions -| Version | Supported | -| ------- | --------- | -| 4.2.x | Yes | -| 4.1.x | Yes | -| < 4.1 | No | +| Version | Supported | +| ------- | ---------------- | +| 4.3.x | Yes | +| 4.2.x | Yes | +| 4.1.x | Until 2025-04-08 | +| < 4.1 | No | diff --git a/app.json b/app.json index 4f05a64f516800..5e5a3dc1e7b802 100644 --- a/app.json +++ b/app.json @@ -90,9 +90,15 @@ } }, "buildpacks": [ + { + "url": "https://github.com/heroku/heroku-buildpack-activestorage-preview" + }, { "url": "https://github.com/heroku/heroku-buildpack-apt" }, + { + "url": "heroku/nodejs" + }, { "url": "heroku/ruby" } @@ -100,5 +106,6 @@ "scripts": { "postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed" }, - "addons": ["heroku-postgresql", "heroku-redis"] + "addons": ["heroku-postgresql", "heroku-redis"], + "stack": "heroku-24" } diff --git a/app/controllers/activitypub/claims_controller.rb b/app/controllers/activitypub/claims_controller.rb deleted file mode 100644 index 480baaf2bcce0f..00000000000000 --- a/app/controllers/activitypub/claims_controller.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -class ActivityPub::ClaimsController < ActivityPub::BaseController - skip_before_action :authenticate_user! - - before_action :require_account_signature! - before_action :set_claim_result - - def create - render json: @claim_result, serializer: ActivityPub::OneTimeKeySerializer - end - - private - - def set_claim_result - @claim_result = ::Keys::ClaimService.new.call(@account.id, params[:id]) - end -end diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb index 15985c7f65e65c..e9779260f32fba 100644 --- a/app/controllers/activitypub/collections_controller.rb +++ b/app/controllers/activitypub/collections_controller.rb @@ -22,8 +22,6 @@ def set_items @items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) } when 'tags' @items = for_signed_account { @account.featured_tags } - when 'devices' - @items = @account.devices else not_found end @@ -31,7 +29,7 @@ def set_items def set_size case params[:id] - when 'featured', 'devices', 'tags' + when 'featured', 'tags' @size = @items.size else not_found @@ -42,7 +40,7 @@ def set_type case params[:id] when 'featured' @type = :ordered - when 'devices', 'tags' + when 'tags' @type = :unordered else not_found diff --git a/app/controllers/activitypub/likes_controller.rb b/app/controllers/activitypub/likes_controller.rb new file mode 100644 index 00000000000000..4aa6a4a771f156 --- /dev/null +++ b/app/controllers/activitypub/likes_controller.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class ActivityPub::LikesController < ActivityPub::BaseController + include Authorization + + vary_by -> { 'Signature' if authorized_fetch_mode? } + + before_action :require_account_signature!, if: :authorized_fetch_mode? + before_action :set_status + + def index + expires_in 0, public: @status.distributable? && public_fetch_mode? + render json: likes_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' + end + + private + + def pundit_user + signed_request_account + end + + def set_status + @status = @account.statuses.find(params[:status_id]) + authorize @status, :show? + rescue Mastodon::NotPermittedError + not_found + end + + def likes_collection_presenter + ActivityPub::CollectionPresenter.new( + id: account_status_likes_url(@account, @status), + type: :unordered, + size: @status.favourites_count + ) + end +end diff --git a/app/controllers/activitypub/replies_controller.rb b/app/controllers/activitypub/replies_controller.rb index 11aac48c9c34b1..0a19275d38e942 100644 --- a/app/controllers/activitypub/replies_controller.rb +++ b/app/controllers/activitypub/replies_controller.rb @@ -12,7 +12,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController before_action :set_replies def index - expires_in 0, public: public_fetch_mode? + expires_in 0, public: @status.distributable? && public_fetch_mode? render json: replies_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json', skip_activities: true end diff --git a/app/controllers/activitypub/shares_controller.rb b/app/controllers/activitypub/shares_controller.rb new file mode 100644 index 00000000000000..65b4a5b3831326 --- /dev/null +++ b/app/controllers/activitypub/shares_controller.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class ActivityPub::SharesController < ActivityPub::BaseController + include Authorization + + vary_by -> { 'Signature' if authorized_fetch_mode? } + + before_action :require_account_signature!, if: :authorized_fetch_mode? + before_action :set_status + + def index + expires_in 0, public: @status.distributable? && public_fetch_mode? + render json: shares_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' + end + + private + + def pundit_user + signed_request_account + end + + def set_status + @status = @account.statuses.find(params[:status_id]) + authorize @status, :show? + rescue Mastodon::NotPermittedError + not_found + end + + def shares_collection_presenter + ActivityPub::CollectionPresenter.new( + id: account_status_shares_url(@account, @status), + type: :unordered, + size: @status.reblogs_count + ) + end +end diff --git a/app/controllers/admin/account_moderation_notes_controller.rb b/app/controllers/admin/account_moderation_notes_controller.rb index 8b6c1a4454ebd0..a3c4adf59a7815 100644 --- a/app/controllers/admin/account_moderation_notes_controller.rb +++ b/app/controllers/admin/account_moderation_notes_controller.rb @@ -13,7 +13,7 @@ def create redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.created_msg') else @account = @account_moderation_note.target_account - @moderation_notes = @account.targeted_moderation_notes.latest + @moderation_notes = @account.targeted_moderation_notes.chronological.includes(:account) @warnings = @account.strikes.custom.latest render 'admin/accounts/show' diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 9beb8fde6b2fda..7b169ba26a3d14 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -33,7 +33,7 @@ def show @deletion_request = @account.deletion_request @account_moderation_note = current_account.account_moderation_notes.new(target_account: @account) - @moderation_notes = @account.targeted_moderation_notes.latest + @moderation_notes = @account.targeted_moderation_notes.chronological.includes(:account) @warnings = @account.strikes.includes(:target_account, :account, :appeal).latest @domain_block = DomainBlock.rule_for(@account.domain) end diff --git a/app/controllers/admin/announcements_controller.rb b/app/controllers/admin/announcements_controller.rb index 8f9708183a81cf..12230a6506d929 100644 --- a/app/controllers/admin/announcements_controller.rb +++ b/app/controllers/admin/announcements_controller.rb @@ -6,6 +6,7 @@ class Admin::AnnouncementsController < Admin::BaseController def index authorize :announcement, :index? + @published_announcements_count = Announcement.published.async_count end def new diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 4b5afbe157c84b..48685db17a2b8d 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -7,17 +7,12 @@ class BaseController < ApplicationController layout 'admin' - before_action :set_body_classes before_action :set_cache_headers after_action :verify_authorized private - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 3a6df662ea2eee..5b0867dcfbac2f 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -7,12 +7,12 @@ class DashboardController < BaseController def index authorize :dashboard, :index? + @pending_appeals_count = Appeal.pending.async_count + @pending_reports_count = Report.unresolved.async_count + @pending_tags_count = Tag.pending_review.async_count + @pending_users_count = User.pending.async_count @system_checks = Admin::SystemCheck.perform(current_user) @time_period = (29.days.ago.to_date...Time.now.utc.to_date) - @pending_users_count = User.pending.count - @pending_reports_count = Report.unresolved.count - @pending_tags_count = Tag.pending_review.count - @pending_appeals_count = Appeal.pending.count end end end diff --git a/app/controllers/admin/disputes/appeals_controller.rb b/app/controllers/admin/disputes/appeals_controller.rb index 5e342409b021cb..0c41553676735a 100644 --- a/app/controllers/admin/disputes/appeals_controller.rb +++ b/app/controllers/admin/disputes/appeals_controller.rb @@ -6,6 +6,7 @@ class Admin::Disputes::AppealsController < Admin::BaseController def index authorize :appeal, :index? + @pending_appeals_count = Appeal.pending.async_count @appeals = filtered_appeals.page(params[:page]) end diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb index a6997b62f7db6b..d7f88a71f3698f 100644 --- a/app/controllers/admin/instances_controller.rb +++ b/app/controllers/admin/instances_controller.rb @@ -13,6 +13,7 @@ def index def show authorize :instance, :show? @time_period = (6.days.ago.to_date...Time.now.utc.to_date) + @action_logs = Admin::ActionLogFilter.new(target_domain: @instance.domain).results.limit(5) end def destroy diff --git a/app/controllers/admin/report_notes_controller.rb b/app/controllers/admin/report_notes_controller.rb index b5f04a1caa0998..6b16c29fc7dce2 100644 --- a/app/controllers/admin/report_notes_controller.rb +++ b/app/controllers/admin/report_notes_controller.rb @@ -21,7 +21,7 @@ def create redirect_to after_create_redirect_path, notice: I18n.t('admin.report_notes.created_msg') else - @report_notes = @report.notes.includes(:account).order(id: :desc) + @report_notes = @report.notes.chronological.includes(:account) @action_logs = @report.history.includes(:target) @form = Admin::StatusBatchAction.new @statuses = @report.statuses.with_includes diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 00d200d7c88ccc..aa877f1448c98e 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -13,7 +13,7 @@ def show authorize @report, :show? @report_note = @report.notes.new - @report_notes = @report.notes.includes(:account).order(id: :desc) + @report_notes = @report.notes.chronological.includes(:account) @action_logs = @report.history.includes(:target) @form = Admin::StatusBatchAction.new @statuses = @report.statuses.with_includes diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 4f727c398a0be0..4759d15bc4b047 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -2,7 +2,15 @@ module Admin class TagsController < BaseController - before_action :set_tag + before_action :set_tag, except: [:index] + + PER_PAGE = 20 + + def index + authorize :tag, :index? + + @tags = filtered_tags.page(params[:page]).per(PER_PAGE) + end def show authorize @tag, :show? @@ -31,5 +39,13 @@ def set_tag def tag_params params.require(:tag).permit(:name, :display_name, :trendable, :usable, :listable) end + + def filtered_tags + TagFilter.new(filter_params.with_defaults(order: 'newest')).results + end + + def filter_params + params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS) + end end end diff --git a/app/controllers/admin/trends/links/preview_card_providers_controller.rb b/app/controllers/admin/trends/links/preview_card_providers_controller.rb index 768b79f8dbce45..5e4b4084f808d2 100644 --- a/app/controllers/admin/trends/links/preview_card_providers_controller.rb +++ b/app/controllers/admin/trends/links/preview_card_providers_controller.rb @@ -4,6 +4,7 @@ class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseControll def index authorize :preview_card_provider, :review? + @pending_preview_card_providers_count = PreviewCardProvider.unreviewed.async_count @preview_card_providers = filtered_preview_card_providers.page(params[:page]) @form = Trends::PreviewCardProviderBatch.new end diff --git a/app/controllers/admin/trends/tags_controller.rb b/app/controllers/admin/trends/tags_controller.rb index f5946448ae1f71..fcd23fbf66b676 100644 --- a/app/controllers/admin/trends/tags_controller.rb +++ b/app/controllers/admin/trends/tags_controller.rb @@ -4,6 +4,7 @@ class Admin::Trends::TagsController < Admin::BaseController def index authorize :tag, :review? + @pending_tags_count = Tag.pending_review.async_count @tags = filtered_tags.page(params[:page]) @form = Trends::TagBatch.new end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index c1a5e43f882dd0..0980e0ebbc60be 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -30,10 +30,10 @@ def doorkeeper_forbidden_render_options(*) protected - def limit_param(default_limit) + def limit_param(default_limit, max_limit = nil) return default_limit unless params[:limit] - [params[:limit].to_i.abs, default_limit * 2].min + [params[:limit].to_i.abs, max_limit || (default_limit * 2)].min end def params_slice(*keys) diff --git a/app/controllers/api/oembed_controller.rb b/app/controllers/api/oembed_controller.rb index 66da65bedaf741..b7f22824a7afbf 100644 --- a/app/controllers/api/oembed_controller.rb +++ b/app/controllers/api/oembed_controller.rb @@ -7,7 +7,7 @@ class Api::OEmbedController < Api::BaseController before_action :require_public_status! def show - render json: @status, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default + render json: @status, serializer: OEmbedSerializer, width: params[:maxwidth], height: params[:maxheight] end private @@ -23,12 +23,4 @@ def require_public_status! def status_finder StatusFinder.new(params[:url]) end - - def maxwidth_or_default - (params[:maxwidth].presence || 400).to_i - end - - def maxheight_or_default - params[:maxheight].present? ? params[:maxheight].to_i : nil - end end diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 84b604b305e7a7..28acaeea051834 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -16,6 +16,7 @@ class Api::V1::AccountsController < Api::BaseController before_action :check_account_confirmation, except: [:index, :create] before_action :check_enabled_registrations, only: [:create] before_action :check_accounts_limit, only: [:index] + before_action :check_following_self, only: [:follow] skip_before_action :require_authenticated_user!, only: :create @@ -101,6 +102,10 @@ def check_accounts_limit raise(Mastodon::ValidationError) if account_ids.size > DEFAULT_ACCOUNTS_LIMIT end + def check_following_self + render json: { error: I18n.t('accounts.self_follow_error') }, status: 403 if current_user.account.id == @account.id + end + def relationships(**options) AccountRelationshipsPresenter.new([@account], current_user.account_id, **options) end diff --git a/app/controllers/api/v1/admin/domain_allows_controller.rb b/app/controllers/api/v1/admin/domain_allows_controller.rb index 9801d832b8ba84..24f68aa1bd8746 100644 --- a/app/controllers/api/v1/admin/domain_allows_controller.rb +++ b/app/controllers/api/v1/admin/domain_allows_controller.rb @@ -5,6 +5,7 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController include AccountableConcern LIMIT = 100 + MAX_LIMIT = 500 before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_allows' }, only: [:index, :show] before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_allows' }, except: [:index, :show] @@ -47,18 +48,13 @@ def destroy private def set_domain_allows - @domain_allows = filtered_domain_allows.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + @domain_allows = DomainAllow.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_domain_allow @domain_allow = DomainAllow.find(params[:id]) end - def filtered_domain_allows - # TODO: no filtering yet - DomainAllow.all - end - def next_path api_v1_admin_domain_allows_url(pagination_params(max_id: pagination_max_id)) if records_continue? end @@ -72,7 +68,7 @@ def pagination_collection end def records_continue? - @domain_allows.size == limit_param(LIMIT) + @domain_allows.size == limit_param(LIMIT, MAX_LIMIT) end def resource_params diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index a20a4a9c7f8fbe..b44ae2ae2a2130 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -5,6 +5,7 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController include AccountableConcern LIMIT = 100 + MAX_LIMIT = 500 before_action -> { authorize_if_got_token! :'admin:read', :'admin:read:domain_blocks' }, only: [:index, :show] before_action -> { authorize_if_got_token! :'admin:write', :'admin:write:domain_blocks' }, except: [:index, :show] @@ -59,18 +60,13 @@ def conflicts_with_existing_block?(domain_block, existing_domain_block) end def set_domain_blocks - @domain_blocks = filtered_domain_blocks.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) + @domain_blocks = DomainBlock.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT, MAX_LIMIT), params_slice(:max_id, :since_id, :min_id)) end def set_domain_block @domain_block = DomainBlock.find(params[:id]) end - def filtered_domain_blocks - # TODO: no filtering yet - DomainBlock.all - end - def domain_block_params params.permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) end @@ -88,7 +84,7 @@ def pagination_collection end def records_continue? - @domain_blocks.size == limit_param(LIMIT) + @domain_blocks.size == limit_param(LIMIT, MAX_LIMIT) end def resource_params diff --git a/app/controllers/api/v1/crypto/deliveries_controller.rb b/app/controllers/api/v1/crypto/deliveries_controller.rb deleted file mode 100644 index aa9df6e03b20f2..00000000000000 --- a/app/controllers/api/v1/crypto/deliveries_controller.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Crypto::DeliveriesController < Api::BaseController - before_action -> { doorkeeper_authorize! :crypto } - before_action :require_user! - before_action :set_current_device - - def create - devices.each do |device_params| - DeliverToDeviceService.new.call(current_account, @current_device, device_params) - end - - render_empty - end - - private - - def set_current_device - @current_device = Device.find_by!(access_token: doorkeeper_token) - end - - def resource_params - params.require(:device) - params.permit(device: [:account_id, :device_id, :type, :body, :hmac]) - end - - def devices - Array(resource_params[:device]) - end -end diff --git a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb deleted file mode 100644 index 93ae0e777139c3..00000000000000 --- a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController - LIMIT = 80 - - before_action -> { doorkeeper_authorize! :crypto } - before_action :require_user! - before_action :set_current_device - - before_action :set_encrypted_messages, only: :index - after_action :insert_pagination_headers, only: :index - - def index - render json: @encrypted_messages, each_serializer: REST::EncryptedMessageSerializer - end - - def clear - @current_device.encrypted_messages.up_to(params[:up_to_id]).delete_all - render_empty - end - - private - - def set_current_device - @current_device = Device.find_by!(access_token: doorkeeper_token) - end - - def set_encrypted_messages - @encrypted_messages = @current_device.encrypted_messages.to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) - end - - def next_path - api_v1_crypto_encrypted_messages_url pagination_params(max_id: pagination_max_id) if records_continue? - end - - def prev_path - api_v1_crypto_encrypted_messages_url pagination_params(min_id: pagination_since_id) unless @encrypted_messages.empty? - end - - def pagination_collection - @encrypted_messages - end - - def records_continue? - @encrypted_messages.size == limit_param(LIMIT) - end -end diff --git a/app/controllers/api/v1/crypto/keys/claims_controller.rb b/app/controllers/api/v1/crypto/keys/claims_controller.rb deleted file mode 100644 index f9d202d67b8ed8..00000000000000 --- a/app/controllers/api/v1/crypto/keys/claims_controller.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Crypto::Keys::ClaimsController < Api::BaseController - before_action -> { doorkeeper_authorize! :crypto } - before_action :require_user! - before_action :set_claim_results - - def create - render json: @claim_results, each_serializer: REST::Keys::ClaimResultSerializer - end - - private - - def set_claim_results - @claim_results = devices.filter_map { |device_params| ::Keys::ClaimService.new.call(current_account, device_params[:account_id], device_params[:device_id]) } - end - - def resource_params - params.permit(device: [:account_id, :device_id]) - end - - def devices - Array(resource_params[:device]) - end -end diff --git a/app/controllers/api/v1/crypto/keys/counts_controller.rb b/app/controllers/api/v1/crypto/keys/counts_controller.rb deleted file mode 100644 index ffd7151b78291e..00000000000000 --- a/app/controllers/api/v1/crypto/keys/counts_controller.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Crypto::Keys::CountsController < Api::BaseController - before_action -> { doorkeeper_authorize! :crypto } - before_action :require_user! - before_action :set_current_device - - def show - render json: { one_time_keys: @current_device.one_time_keys.count } - end - - private - - def set_current_device - @current_device = Device.find_by!(access_token: doorkeeper_token) - end -end diff --git a/app/controllers/api/v1/crypto/keys/queries_controller.rb b/app/controllers/api/v1/crypto/keys/queries_controller.rb deleted file mode 100644 index e6ce9f9192ac86..00000000000000 --- a/app/controllers/api/v1/crypto/keys/queries_controller.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Crypto::Keys::QueriesController < Api::BaseController - before_action -> { doorkeeper_authorize! :crypto } - before_action :require_user! - before_action :set_accounts - before_action :set_query_results - - def create - render json: @query_results, each_serializer: REST::Keys::QueryResultSerializer - end - - private - - def set_accounts - @accounts = Account.where(id: account_ids).includes(:devices) - end - - def set_query_results - @query_results = @accounts.filter_map { |account| ::Keys::QueryService.new.call(account) } - end - - def account_ids - Array(params[:id]).map(&:to_i) - end -end diff --git a/app/controllers/api/v1/crypto/keys/uploads_controller.rb b/app/controllers/api/v1/crypto/keys/uploads_controller.rb deleted file mode 100644 index fc4abf63b3a421..00000000000000 --- a/app/controllers/api/v1/crypto/keys/uploads_controller.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Crypto::Keys::UploadsController < Api::BaseController - before_action -> { doorkeeper_authorize! :crypto } - before_action :require_user! - - def create - device = Device.find_or_initialize_by(access_token: doorkeeper_token) - - device.transaction do - device.account = current_account - device.update!(resource_params[:device]) - - if resource_params[:one_time_keys].present? && resource_params[:one_time_keys].is_a?(Enumerable) - resource_params[:one_time_keys].each do |one_time_key_params| - device.one_time_keys.create!(one_time_key_params) - end - end - end - - render json: device, serializer: REST::Keys::DeviceSerializer - end - - private - - def resource_params - params.permit(device: [:device_id, :name, :fingerprint_key, :identity_key], one_time_keys: [:key_id, :key, :signature]) - end -end diff --git a/app/controllers/api/v1/domain_blocks/previews_controller.rb b/app/controllers/api/v1/domain_blocks/previews_controller.rb new file mode 100644 index 00000000000000..a917bddd98ed4c --- /dev/null +++ b/app/controllers/api/v1/domain_blocks/previews_controller.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class Api::V1::DomainBlocks::PreviewsController < Api::BaseController + before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' } + before_action :require_user! + before_action :set_domain + before_action :set_domain_block_preview + + def show + render json: @domain_block_preview, serializer: REST::DomainBlockPreviewSerializer + end + + private + + def set_domain + @domain = TagManager.instance.normalize_domain(params[:domain]) + end + + def set_domain_block_preview + @domain_block_preview = with_read_replica do + DomainBlockPreviewPresenter.new( + following_count: current_account.following.where(domain: @domain).count, + followers_count: current_account.followers.where(domain: @domain).count + ) + end + end +end diff --git a/app/controllers/api/v1/notifications/policies_controller.rb b/app/controllers/api/v1/notifications/policies_controller.rb index 1ec336f9a594dc..9d70c283bec001 100644 --- a/app/controllers/api/v1/notifications/policies_controller.rb +++ b/app/controllers/api/v1/notifications/policies_controller.rb @@ -8,12 +8,12 @@ class Api::V1::Notifications::PoliciesController < Api::BaseController before_action :set_policy def show - render json: @policy, serializer: REST::NotificationPolicySerializer + render json: @policy, serializer: REST::V1::NotificationPolicySerializer end def update @policy.update!(resource_params) - render json: @policy, serializer: REST::NotificationPolicySerializer + render json: @policy, serializer: REST::V1::NotificationPolicySerializer end private diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb index 0e58379a382e85..3c90f13ce24ec9 100644 --- a/app/controllers/api/v1/notifications/requests_controller.rb +++ b/app/controllers/api/v1/notifications/requests_controller.rb @@ -1,11 +1,14 @@ # frozen_string_literal: true class Api::V1::Notifications::RequestsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: :index - before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index + include Redisable + + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: [:index, :show, :merged?] + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: [:index, :show, :merged?] before_action :require_user! - before_action :set_request, except: :index + before_action :set_request, only: [:show, :accept, :dismiss] + before_action :set_requests, only: [:accept_bulk, :dismiss_bulk] after_action :insert_pagination_headers, only: :index @@ -18,6 +21,10 @@ def index render json: @requests, each_serializer: REST::NotificationRequestSerializer, relationships: @relationships end + def merged? + render json: { merged: redis.get("notification_unfilter_jobs:#{current_account.id}").to_i <= 0 } + end + def show render json: @request, serializer: REST::NotificationRequestSerializer end @@ -28,14 +35,24 @@ def accept end def dismiss - @request.update!(dismissed: true) + DismissNotificationRequestService.new.call(@request) + render_empty + end + + def accept_bulk + @requests.each { |request| AcceptNotificationRequestService.new.call(request) } + render_empty + end + + def dismiss_bulk + @requests.each(&:destroy!) render_empty end private def load_requests - requests = NotificationRequest.where(account: current_account).where(dismissed: truthy_param?(:dismissed) || false).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( + requests = NotificationRequest.where(account: current_account).without_suspended.includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id( limit_param(DEFAULT_ACCOUNTS_LIMIT), params_slice(:max_id, :since_id, :min_id) ) @@ -53,14 +70,22 @@ def set_request @request = NotificationRequest.where(account: current_account).find(params[:id]) end + def set_requests + @requests = NotificationRequest.where(account: current_account, id: Array(params[:id]).uniq.map(&:to_i)) + end + def next_path - api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty? + api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) if records_continue? end def prev_path api_v1_notifications_requests_url pagination_params(min_id: pagination_since_id) unless @requests.empty? end + def records_continue? + @requests.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) + end + def pagination_max_id @requests.last.id end @@ -68,8 +93,4 @@ def pagination_max_id def pagination_since_id @requests.first.id end - - def pagination_params(core_params) - params.slice(:dismissed).permit(:dismissed).merge(core_params) - end end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index c82900ef661812..bdc163d4b67036 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -7,6 +7,8 @@ class Api::V1::NotificationsController < Api::BaseController after_action :insert_pagination_headers, only: :index DEFAULT_NOTIFICATIONS_LIMIT = 40 + DEFAULT_NOTIFICATIONS_COUNT_LIMIT = 100 + MAX_NOTIFICATIONS_COUNT_LIMIT = 1_000 def index with_read_replica do @@ -17,6 +19,14 @@ def index render json: @notifications, each_serializer: REST::NotificationSerializer, relationships: @relationships end + def unread_count + limit = limit_param(DEFAULT_NOTIFICATIONS_COUNT_LIMIT, MAX_NOTIFICATIONS_COUNT_LIMIT) + + with_read_replica do + render json: { count: browserable_account_notifications.paginate_by_min_id(limit, notification_marker&.last_read_id).count } + end + end + def show @notification = current_account.notifications.without_suspended.find(params[:id]) render json: @notification, serializer: REST::NotificationSerializer @@ -63,6 +73,10 @@ def browserable_account_notifications ) end + def notification_marker + current_user.markers.find_by(timeline: 'notifications') + end + def target_statuses_from_notifications @notifications.reject { |notification| notification.target_status.nil? }.map(&:target_status) end diff --git a/app/controllers/api/v1/peers/search_controller.rb b/app/controllers/api/v1/peers/search_controller.rb index 1780554c5d8bc0..d9c82327022194 100644 --- a/app/controllers/api/v1/peers/search_controller.rb +++ b/app/controllers/api/v1/peers/search_controller.rb @@ -7,6 +7,8 @@ class Api::V1::Peers::SearchController < Api::BaseController skip_before_action :require_authenticated_user!, unless: :limited_federation_mode? skip_around_action :set_locale + LIMIT = 10 + vary_by '' def index @@ -35,10 +37,10 @@ def set_domains field: 'accounts_count', modifier: 'log2p', }, - }).limit(10).pluck(:domain) + }).limit(LIMIT).pluck(:domain) else domain = normalized_domain - @domains = Instance.searchable.domain_starts_with(domain).limit(10).pluck(:domain) + @domains = Instance.searchable.domain_starts_with(domain).limit(LIMIT).pluck(:domain) end rescue Addressable::URI::InvalidURIError @domains = [] diff --git a/app/controllers/api/v1/polls/votes_controller.rb b/app/controllers/api/v1/polls/votes_controller.rb index 513b937ef2de34..ad1b82cb522c69 100644 --- a/app/controllers/api/v1/polls/votes_controller.rb +++ b/app/controllers/api/v1/polls/votes_controller.rb @@ -8,7 +8,7 @@ class Api::V1::Polls::VotesController < Api::BaseController before_action :set_poll def create - VoteService.new.call(current_account, @poll, vote_params[:choices]) + VoteService.new.call(current_account, @poll, vote_params) render json: @poll, serializer: REST::PollSerializer end @@ -22,6 +22,6 @@ def set_poll end def vote_params - params.permit(choices: []) + params.require(:choices) end end diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb index 300c9faa3f0ee9..72f358bb5bcd95 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/reports_controller.rb @@ -10,7 +10,7 @@ def create @report = ReportService.new.call( current_account, reported_account, - report_params + report_params.merge(application: doorkeeper_token.application) ) render json: @report, serializer: REST::ReportSerializer diff --git a/app/controllers/api/v1/statuses/translations_controller.rb b/app/controllers/api/v1/statuses/translations_controller.rb index 8cf495f78ac95d..bd5cd9bb07febc 100644 --- a/app/controllers/api/v1/statuses/translations_controller.rb +++ b/app/controllers/api/v1/statuses/translations_controller.rb @@ -23,6 +23,6 @@ def create private def set_translation - @translation = TranslateStatusService.new.call(@status, content_locale) + @translation = TranslateStatusService.new.call(@status, I18n.locale.to_s) end end diff --git a/app/controllers/api/v2/notifications/accounts_controller.rb b/app/controllers/api/v2/notifications/accounts_controller.rb new file mode 100644 index 00000000000000..771e9663883479 --- /dev/null +++ b/app/controllers/api/v2/notifications/accounts_controller.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +class Api::V2::Notifications::AccountsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:notifications' } + before_action :require_user! + before_action :set_notifications! + after_action :insert_pagination_headers, only: :index + + def index + @accounts = load_accounts + render json: @accounts, each_serializer: REST::AccountSerializer + end + + private + + def load_accounts + @paginated_notifications.map(&:from_account) + end + + def set_notifications! + @paginated_notifications = begin + current_account + .notifications + .without_suspended + .where(group_key: params[:notification_group_key]) + .includes(from_account: [:account_stat, :user]) + .paginate_by_max_id( + limit_param(DEFAULT_ACCOUNTS_LIMIT), + params[:max_id], + params[:since_id] + ) + end + end + + def next_path + api_v2_notification_accounts_url pagination_params(max_id: pagination_max_id) if records_continue? + end + + def prev_path + api_v2_notification_accounts_url pagination_params(min_id: pagination_since_id) unless @paginated_notifications.empty? + end + + def pagination_collection + @paginated_notifications + end + + def records_continue? + @paginated_notifications.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) + end +end diff --git a/app/controllers/api/v2/notifications/policies_controller.rb b/app/controllers/api/v2/notifications/policies_controller.rb new file mode 100644 index 00000000000000..637587967fe328 --- /dev/null +++ b/app/controllers/api/v2/notifications/policies_controller.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +class Api::V2::Notifications::PoliciesController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, only: :show + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: :update + + before_action :require_user! + before_action :set_policy + + def show + render json: @policy, serializer: REST::NotificationPolicySerializer + end + + def update + @policy.update!(resource_params) + render json: @policy, serializer: REST::NotificationPolicySerializer + end + + private + + def set_policy + @policy = NotificationPolicy.find_or_initialize_by(account: current_account) + + with_read_replica do + @policy.summarize! + end + end + + def resource_params + params.permit( + :for_not_following, + :for_not_followers, + :for_new_accounts, + :for_private_mentions, + :for_limited_accounts + ) + end +end diff --git a/app/controllers/api/v2/notifications_controller.rb b/app/controllers/api/v2/notifications_controller.rb new file mode 100644 index 00000000000000..c070c0e5e71892 --- /dev/null +++ b/app/controllers/api/v2/notifications_controller.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +class Api::V2::NotificationsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss] + before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss] + before_action :require_user! + after_action :insert_pagination_headers, only: :index + + DEFAULT_NOTIFICATIONS_LIMIT = 40 + DEFAULT_NOTIFICATIONS_COUNT_LIMIT = 100 + MAX_NOTIFICATIONS_COUNT_LIMIT = 1_000 + + def index + with_read_replica do + @notifications = load_notifications + @grouped_notifications = load_grouped_notifications + @relationships = StatusRelationshipsPresenter.new(target_statuses_from_notifications, current_user&.account_id) + @presenter = GroupedNotificationsPresenter.new(@grouped_notifications, expand_accounts: expand_accounts_param) + + # Preload associations to avoid N+1s + ActiveRecord::Associations::Preloader.new(records: @presenter.accounts, associations: [:account_stat, { user: :role }]).call + end + + MastodonOTELTracer.in_span('Api::V2::NotificationsController#index rendering') do |span| + statuses = @grouped_notifications.filter_map { |group| group.target_status&.id } + + span.add_attributes( + 'app.notification_grouping.count' => @grouped_notifications.size, + 'app.notification_grouping.account.count' => @presenter.accounts.size, + 'app.notification_grouping.partial_account.count' => @presenter.partial_accounts.size, + 'app.notification_grouping.status.count' => statuses.size, + 'app.notification_grouping.status.unique_count' => statuses.uniq.size, + 'app.notification_grouping.expand_accounts_param' => expand_accounts_param + ) + + render json: @presenter, serializer: REST::DedupNotificationGroupSerializer, relationships: @relationships, expand_accounts: expand_accounts_param + end + end + + def unread_count + limit = limit_param(DEFAULT_NOTIFICATIONS_COUNT_LIMIT, MAX_NOTIFICATIONS_COUNT_LIMIT) + + with_read_replica do + render json: { count: browserable_account_notifications.paginate_groups_by_min_id(limit, min_id: notification_marker&.last_read_id, grouped_types: params[:grouped_types]).count } + end + end + + def show + @notification = current_account.notifications.without_suspended.find_by!(group_key: params[:group_key]) + presenter = GroupedNotificationsPresenter.new(NotificationGroup.from_notifications([@notification])) + render json: presenter, serializer: REST::DedupNotificationGroupSerializer + end + + def clear + current_account.notifications.delete_all + render_empty + end + + def dismiss + current_account.notifications.where(group_key: params[:group_key]).destroy_all + render_empty + end + + private + + def load_notifications + MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_notifications') do + notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id( + limit_param(DEFAULT_NOTIFICATIONS_LIMIT), + params.slice(:max_id, :since_id, :min_id, :grouped_types).permit(:max_id, :since_id, :min_id, grouped_types: []) + ) + + Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| + preload_collection(target_statuses, Status) + end + end + end + + def load_grouped_notifications + return [] if @notifications.empty? + + MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do + NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types]) + end + end + + def browserable_account_notifications + current_account.notifications.without_suspended.browserable( + types: Array(browserable_params[:types]), + exclude_types: Array(browserable_params[:exclude_types]), + include_filtered: truthy_param?(:include_filtered) + ) + end + + def notification_marker + current_user.markers.find_by(timeline: 'notifications') + end + + def target_statuses_from_notifications + @notifications.filter_map(&:target_status) + end + + def next_path + api_v2_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty? + end + + def prev_path + api_v2_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty? + end + + def pagination_collection + @notifications + end + + def browserable_params + params.slice(:include_filtered, :types, :exclude_types, :grouped_types).permit(:include_filtered, types: [], exclude_types: [], grouped_types: []) + end + + def pagination_params(core_params) + params.slice(:limit, :include_filtered, :types, :exclude_types, :grouped_types).permit(:limit, :include_filtered, types: [], exclude_types: [], grouped_types: []).merge(core_params) + end + + def expand_accounts_param + case params[:expand_accounts] + when nil, 'full' + 'full' + when 'partial_avatars' + 'partial_avatars' + else + raise Mastodon::InvalidParameterError, "Invalid value for 'expand_accounts': '#{params[:expand_accounts]}', allowed values are 'full' and 'partial_avatars'" + end + end +end diff --git a/app/controllers/api/v2_alpha/notifications_controller.rb b/app/controllers/api/v2_alpha/notifications_controller.rb deleted file mode 100644 index edba23ab4a823c..00000000000000 --- a/app/controllers/api/v2_alpha/notifications_controller.rb +++ /dev/null @@ -1,91 +0,0 @@ -# frozen_string_literal: true - -class Api::V2Alpha::NotificationsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read, :'read:notifications' }, except: [:clear, :dismiss] - before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, only: [:clear, :dismiss] - before_action :require_user! - after_action :insert_pagination_headers, only: :index - - DEFAULT_NOTIFICATIONS_LIMIT = 40 - - def index - with_read_replica do - @notifications = load_notifications - @group_metadata = load_group_metadata - @relationships = StatusRelationshipsPresenter.new(target_statuses_from_notifications, current_user&.account_id) - end - - render json: @notifications.map { |notification| NotificationGroup.from_notification(notification, max_id: @group_metadata.dig(notification.group_key, :max_id)) }, each_serializer: REST::NotificationGroupSerializer, relationships: @relationships, group_metadata: @group_metadata - end - - def show - @notification = current_account.notifications.without_suspended.find_by!(group_key: params[:id]) - render json: NotificationGroup.from_notification(@notification), serializer: REST::NotificationGroupSerializer - end - - def clear - current_account.notifications.delete_all - render_empty - end - - def dismiss - current_account.notifications.where(group_key: params[:id]).destroy_all - render_empty - end - - private - - def load_notifications - notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_grouped_paginated_by_id( - limit_param(DEFAULT_NOTIFICATIONS_LIMIT), - params_slice(:max_id, :since_id, :min_id) - ) - - Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses| - preload_collection(target_statuses, Status) - end - end - - def load_group_metadata - return {} if @notifications.empty? - - browserable_account_notifications - .where(group_key: @notifications.filter_map(&:group_key)) - .where(id: (@notifications.last.id)..(@notifications.first.id)) - .group(:group_key) - .pluck(:group_key, 'min(notifications.id) as min_id', 'max(notifications.id) as max_id', 'max(notifications.created_at) as latest_notification_at') - .to_h { |group_key, min_id, max_id, latest_notification_at| [group_key, { min_id: min_id, max_id: max_id, latest_notification_at: latest_notification_at }] } - end - - def browserable_account_notifications - current_account.notifications.without_suspended.browserable( - types: Array(browserable_params[:types]), - exclude_types: Array(browserable_params[:exclude_types]), - include_filtered: truthy_param?(:include_filtered) - ) - end - - def target_statuses_from_notifications - @notifications.filter_map(&:target_status) - end - - def next_path - api_v2_alpha_notifications_url pagination_params(max_id: pagination_max_id) unless @notifications.empty? - end - - def prev_path - api_v2_alpha_notifications_url pagination_params(min_id: pagination_since_id) unless @notifications.empty? - end - - def pagination_collection - @notifications - end - - def browserable_params - params.permit(:include_filtered, types: [], exclude_types: []) - end - - def pagination_params(core_params) - params.slice(:limit, :types, :exclude_types, :include_filtered).permit(:limit, :include_filtered, types: [], exclude_types: []).merge(core_params) - end -end diff --git a/app/controllers/api/web/embeds_controller.rb b/app/controllers/api/web/embeds_controller.rb index 63c3f2d90a79c6..f82c1c50d79502 100644 --- a/app/controllers/api/web/embeds_controller.rb +++ b/app/controllers/api/web/embeds_controller.rb @@ -9,7 +9,7 @@ def show return not_found if @status.hidden? if @status.local? - render json: @status, serializer: OEmbedSerializer, width: 400 + render json: @status, serializer: OEmbedSerializer else return not_found unless user_signed_in? diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1d700fa282e458..9ed35c523faee7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -23,7 +23,6 @@ class ApplicationController < ActionController::Base helper_method :current_theme helper_method :single_user_mode? helper_method :use_seamless_external_login? - helper_method :omniauth_only? helper_method :sso_account_settings helper_method :limited_federation_mode? helper_method :body_class_string @@ -36,7 +35,7 @@ class ApplicationController < ActionController::Base rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests - rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error) rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight, ActiveRecord::SerializationFailure, with: :service_unavailable rescue_from Seahorse::Client::NetworkingError do |e| @@ -140,10 +139,6 @@ def use_seamless_external_login? Devise.pam_authentication || Devise.ldap_authentication end - def omniauth_only? - ENV['OMNIAUTH_ONLY'] == 'true' - end - def sso_account_settings ENV.fetch('SSO_ACCOUNT_SETTINGS', nil) end diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 7ca7be5f8ef8ec..bf5c84ccf45a88 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -5,7 +5,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController layout 'auth' - before_action :set_body_classes before_action :set_confirmation_user!, only: [:show, :confirm_captcha] before_action :redirect_confirmed_user, if: :signed_in_confirmed_user? @@ -73,10 +72,6 @@ def signed_in_confirmed_user? user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank? end - def set_body_classes - @body_classes = 'lighter' - end - def after_resending_confirmation_instructions_path_for(_resource_name) if user_signed_in? if current_user.confirmed? && current_user.approved? diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index de001f062b04d7..7c1ff59671d94c 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -3,7 +3,6 @@ class Auth::PasswordsController < Devise::PasswordsController skip_before_action :check_self_destruct! before_action :redirect_invalid_reset_token, only: :edit, unless: :reset_password_token_is_valid? - before_action :set_body_classes layout 'auth' @@ -24,10 +23,6 @@ def redirect_invalid_reset_token redirect_to new_password_path(resource_name) end - def set_body_classes - @body_classes = 'lighter' - end - def reset_password_token_is_valid? resource_class.with_reset_password_token(params[:reset_password_token]).present? end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index e5a2ac0270f012..4d94c801586354 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -11,7 +11,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] before_action :set_sessions, only: [:edit, :update] before_action :set_strikes, only: [:edit, :update] - before_action :set_body_classes, only: [:new, :create, :edit, :update] before_action :require_not_suspended!, only: [:update] before_action :set_cache_headers, only: [:edit, :update] before_action :set_rules, only: :new @@ -104,10 +103,6 @@ def invite_code private - def set_body_classes - @body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter' - end - def set_invite @invite = begin invite = Invite.find_by(code: invite_code) if invite_code.present? diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 6ed7b2baacc7c4..ecac4c5ba8e517 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -16,17 +16,10 @@ class Auth::SessionsController < Devise::SessionsController include Auth::TwoFactorAuthenticationConcern - before_action :set_body_classes - content_security_policy only: :new do |p| p.form_action(false) end - def check_suspicious! - user = find_user - @login_is_suspicious = suspicious_sign_in?(user) unless user.nil? - end - def create super do |resource| # We only need to call this if this hasn't already been @@ -103,8 +96,9 @@ def require_no_authentication private - def set_body_classes - @body_classes = 'lighter' + def check_suspicious! + user = find_user + @login_is_suspicious = suspicious_sign_in?(user) unless user.nil? end def home_paths(resource) @@ -193,4 +187,15 @@ def on_authentication_failure(user, security_measure, failure_reason) def second_factor_attempts_key(user) "2fa_auth_attempts:#{user.id}:#{Time.now.utc.hour}" end + + def respond_to_on_destroy + respond_to do |format| + format.json do + render json: { + redirect_to: after_sign_out_path_for(resource_name), + }, status: 200 + end + format.all { super } + end + end end diff --git a/app/controllers/auth/setup_controller.rb b/app/controllers/auth/setup_controller.rb index 40916d2887702c..ad872dc607285f 100644 --- a/app/controllers/auth/setup_controller.rb +++ b/app/controllers/auth/setup_controller.rb @@ -5,7 +5,6 @@ class Auth::SetupController < ApplicationController before_action :authenticate_user! before_action :require_unconfirmed_or_pending! - before_action :set_body_classes before_action :set_user skip_before_action :require_functional! @@ -35,10 +34,6 @@ def set_user @user = current_user end - def set_body_classes - @body_classes = 'lighter' - end - def user_params params.require(:user).permit(:email) end diff --git a/app/controllers/concerns/account_controller_concern.rb b/app/controllers/concerns/account_controller_concern.rb index d63bcc85c95d13..b75f3e358195a8 100644 --- a/app/controllers/concerns/account_controller_concern.rb +++ b/app/controllers/concerns/account_controller_concern.rb @@ -20,7 +20,7 @@ def set_link_headers webfinger_account_link, actor_url_link, ] - ) + ).to_s end def webfinger_account_link diff --git a/app/controllers/concerns/api/error_handling.rb b/app/controllers/concerns/api/error_handling.rb index ad559fe2d713e1..9ce4795b02bcac 100644 --- a/app/controllers/concerns/api/error_handling.rb +++ b/app/controllers/concerns/api/error_handling.rb @@ -20,7 +20,7 @@ module Api::ErrorHandling render json: { error: 'Record not found' }, status: 404 end - rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError) do render json: { error: 'Remote data could not be fetched' }, status: 503 end diff --git a/app/controllers/concerns/api/pagination.rb b/app/controllers/concerns/api/pagination.rb index 7f06dc0202345f..b0b4ae4603f24b 100644 --- a/app/controllers/concerns/api/pagination.rb +++ b/app/controllers/concerns/api/pagination.rb @@ -19,7 +19,7 @@ def set_pagination_headers(next_path = nil, prev_path = nil) links = [] links << [next_path, [%w(rel next)]] if next_path links << [prev_path, [%w(rel prev)]] if prev_path - response.headers['Link'] = LinkHeader.new(links) unless links.empty? + response.headers['Link'] = LinkHeader.new(links).to_s unless links.empty? end def require_valid_pagination_options! diff --git a/app/controllers/concerns/auth/two_factor_authentication_concern.rb b/app/controllers/concerns/auth/two_factor_authentication_concern.rb index 404164751a86cb..0fb11428dca520 100644 --- a/app/controllers/concerns/auth/two_factor_authentication_concern.rb +++ b/app/controllers/concerns/auth/two_factor_authentication_concern.rb @@ -83,7 +83,6 @@ def authenticate_with_two_factor_via_otp(user) def prompt_for_two_factor(user) register_attempt_in_session(user) - @body_classes = 'lighter' @webauthn_enabled = user.webauthn_enabled? @scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank? 'webauthn' diff --git a/app/controllers/concerns/challengable_concern.rb b/app/controllers/concerns/challengable_concern.rb index 09874fb4054435..c8d1a0bef7f013 100644 --- a/app/controllers/concerns/challengable_concern.rb +++ b/app/controllers/concerns/challengable_concern.rb @@ -42,7 +42,6 @@ def require_challenge! end def render_challenge - @body_classes = 'lighter' render 'auth/challenges/new', layout: 'auth' end diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 68f09ee0238eb2..4ae63632c0cf0d 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -80,7 +80,7 @@ def signed_request_actor fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri} using rsa-sha256 (RSASSA-PKCS1-v1_5 with SHA-256)", signed_string: compare_signed_string, signature: signature_params['signature'] rescue SignatureVerificationError => e fail_with! e.message - rescue HTTP::Error, OpenSSL::SSL::SSLError => e + rescue *Mastodon::HTTP_CONNECTION_ERRORS => e fail_with! "Failed to fetch remote data: #{e.message}" rescue Mastodon::UnexpectedResponseError fail_with! 'Failed to fetch remote data (got unexpected reply from server)' diff --git a/app/controllers/concerns/web_app_controller_concern.rb b/app/controllers/concerns/web_app_controller_concern.rb index 24cccf166770c5..3447bb0d5cc5d9 100644 --- a/app/controllers/concerns/web_app_controller_concern.rb +++ b/app/controllers/concerns/web_app_controller_concern.rb @@ -8,6 +8,16 @@ module WebAppControllerConcern before_action :redirect_unauthenticated_to_permalinks! before_action :set_app_body_class + + content_security_policy do |p| + policy = ContentSecurityPolicy.new + + if policy.sso_host.present? + p.form_action policy.sso_host, -> { "https://#{request.host}/auth/auth/" } + else + p.form_action :none + end + end end def skip_csrf_meta_tags? @@ -21,7 +31,7 @@ def set_app_body_class def redirect_unauthenticated_to_permalinks! return if user_signed_in? # NOTE: Different from upstream because we allow moved users to log in - permalink_redirector = PermalinkRedirector.new(request.path) + permalink_redirector = PermalinkRedirector.new(request.original_fullpath) return if permalink_redirector.redirect_path.blank? expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in? diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb index 1054f3db805593..dd24a1b7408c98 100644 --- a/app/controllers/disputes/base_controller.rb +++ b/app/controllers/disputes/base_controller.rb @@ -7,16 +7,11 @@ class Disputes::BaseController < ApplicationController skip_before_action :require_functional! - before_action :set_body_classes before_action :authenticate_user! before_action :set_cache_headers private - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/filters/statuses_controller.rb b/app/controllers/filters/statuses_controller.rb index 94993f938b5318..7ada13f680d745 100644 --- a/app/controllers/filters/statuses_controller.rb +++ b/app/controllers/filters/statuses_controller.rb @@ -6,7 +6,6 @@ class Filters::StatusesController < ApplicationController before_action :authenticate_user! before_action :set_filter before_action :set_status_filters - before_action :set_body_classes before_action :set_cache_headers PER_PAGE = 20 @@ -42,10 +41,6 @@ def action_from_button 'remove' if params[:remove] end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb index bd9964426b8064..8c4e867e93a542 100644 --- a/app/controllers/filters_controller.rb +++ b/app/controllers/filters_controller.rb @@ -5,7 +5,6 @@ class FiltersController < ApplicationController before_action :authenticate_user! before_action :set_filter, only: [:edit, :update, :destroy] - before_action :set_body_classes before_action :set_cache_headers def index @@ -52,10 +51,6 @@ def resource_params params.require(:custom_filter).permit(:title, :expires_in, :filter_action, context: [], keywords_attributes: [:id, :keyword, :whole_word, :_destroy]) end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 9bc5164d599b50..070852695eebfe 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -6,7 +6,6 @@ class InvitesController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_body_classes before_action :set_cache_headers def index @@ -47,10 +46,6 @@ def resource_params params.require(:invite).permit(:max_uses, :expires_in, :autofollow, :comment) end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/mail_subscriptions_controller.rb b/app/controllers/mail_subscriptions_controller.rb index 1caeaaacf4ce44..34df75f63ad6c4 100644 --- a/app/controllers/mail_subscriptions_controller.rb +++ b/app/controllers/mail_subscriptions_controller.rb @@ -5,7 +5,6 @@ class MailSubscriptionsController < ApplicationController skip_before_action :require_functional! - before_action :set_body_classes before_action :set_user before_action :set_type @@ -25,10 +24,6 @@ def set_user not_found unless @user end - def set_body_classes - @body_classes = 'lighter' - end - def set_type @type = email_type_from_param end diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 53eee40012a612..9d10468e69330e 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -19,9 +19,7 @@ def show redirect_to @media_attachment.file.url(:original) end - def player - @body_classes = 'player' - end + def player; end private diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index c4230d62c38479..f68d85e44e2fdd 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -13,7 +13,7 @@ class MediaProxyController < ApplicationController rescue_from ActiveRecord::RecordInvalid, with: :not_found rescue_from Mastodon::UnexpectedResponseError, with: :not_found rescue_from Mastodon::NotPermittedError, with: :not_found - rescue_from HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, with: :internal_server_error + rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error) def show with_redis_lock("media_download:#{params[:id]}") do diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 7bb22453ca0e11..267409a9ce4ef6 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -6,7 +6,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio before_action :store_current_location before_action :authenticate_resource_owner! before_action :require_not_suspended!, only: :destroy - before_action :set_body_classes before_action :set_cache_headers before_action :set_last_used_at_by_app, only: :index, unless: -> { request.format == :json } @@ -23,10 +22,6 @@ def destroy private - def set_body_classes - @body_classes = 'admin' - end - def store_current_location store_location_for(:user, request.url) end diff --git a/app/controllers/redirect/base_controller.rb b/app/controllers/redirect/base_controller.rb index 90894ec1ed832c..34558a41261472 100644 --- a/app/controllers/redirect/base_controller.rb +++ b/app/controllers/redirect/base_controller.rb @@ -4,7 +4,6 @@ class Redirect::BaseController < ApplicationController vary_by 'Accept-Language' before_action :set_resource - before_action :set_app_body_class def show @redirect_path = ActivityPub::TagManager.instance.url_for(@resource) @@ -14,10 +13,6 @@ def show private - def set_app_body_class - @body_classes = 'app-body' - end - def set_resource raise NotImplementedError end diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb index dd794f3199eeec..d351afcfb72cff 100644 --- a/app/controllers/relationships_controller.rb +++ b/app/controllers/relationships_controller.rb @@ -6,7 +6,6 @@ class RelationshipsController < ApplicationController before_action :authenticate_user! before_action :set_accounts, only: :show before_action :set_relationships, only: :show - before_action :set_body_classes before_action :set_cache_headers helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship? @@ -68,10 +67,6 @@ def action_from_button end end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb index f15140aa2be3da..188334ac234663 100644 --- a/app/controllers/settings/base_controller.rb +++ b/app/controllers/settings/base_controller.rb @@ -4,15 +4,10 @@ class Settings::BaseController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_body_classes before_action :set_cache_headers private - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb index 076ed5dadb178f..263d20eaeae683 100644 --- a/app/controllers/settings/exports_controller.rb +++ b/app/controllers/settings/exports_controller.rb @@ -9,7 +9,7 @@ class Settings::ExportsController < Settings::BaseController skip_before_action :require_functional! def show - @export = Export.new(current_account) + @export_summary = ExportSummary.new(preloaded_account) @backups = current_user.backups end @@ -25,4 +25,15 @@ def create redirect_to settings_export_path end + + private + + def preloaded_account + current_account.tap do |account| + ActiveRecord::Associations::Preloader.new( + records: [account], + associations: :account_stat + ).call + end + end end diff --git a/app/controllers/settings/two_factor_authentication/otp_authentication_controller.rb b/app/controllers/settings/two_factor_authentication/otp_authentication_controller.rb index 0bff01ec2793a4..ca8d46afe48199 100644 --- a/app/controllers/settings/two_factor_authentication/otp_authentication_controller.rb +++ b/app/controllers/settings/two_factor_authentication/otp_authentication_controller.rb @@ -15,7 +15,7 @@ def show end def create - session[:new_otp_secret] = User.generate_otp_secret(32) + session[:new_otp_secret] = User.generate_otp_secret redirect_to new_settings_two_factor_authentication_confirmation_path end diff --git a/app/controllers/settings/verifications_controller.rb b/app/controllers/settings/verifications_controller.rb index fc4f23bb186040..4e0663253cc82e 100644 --- a/app/controllers/settings/verifications_controller.rb +++ b/app/controllers/settings/verifications_controller.rb @@ -2,14 +2,30 @@ class Settings::VerificationsController < Settings::BaseController before_action :set_account + before_action :set_verified_links - def show - @verified_links = @account.fields.select(&:verified?) + def show; end + + def update + if UpdateAccountService.new.call(@account, account_params) + ActivityPub::UpdateDistributionWorker.perform_async(@account.id) + redirect_to settings_verification_path, notice: I18n.t('generic.changes_saved_msg') + else + render :show + end end private + def account_params + params.require(:account).permit(:attribution_domains_as_text) + end + def set_account @account = current_account end + + def set_verified_links + @verified_links = @account.fields.select(&:verified?) + end end diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb index 168e85e3fe4717..965753a26f8ac9 100644 --- a/app/controllers/severed_relationships_controller.rb +++ b/app/controllers/severed_relationships_controller.rb @@ -4,7 +4,6 @@ class SeveredRelationshipsController < ApplicationController layout 'admin' before_action :authenticate_user! - before_action :set_body_classes before_action :set_cache_headers before_action :set_event, only: [:following, :followers] @@ -51,10 +50,6 @@ def acct(account) account.local? ? account.local_username_and_domain : account.acct end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/shares_controller.rb b/app/controllers/shares_controller.rb index 6546b8497808c4..1aa0ce5a0d4ff4 100644 --- a/app/controllers/shares_controller.rb +++ b/app/controllers/shares_controller.rb @@ -4,13 +4,6 @@ class SharesController < ApplicationController layout 'modal' before_action :authenticate_user! - before_action :set_body_classes def show; end - - private - - def set_body_classes - @body_classes = 'modal-layout compose-standalone' - end end diff --git a/app/controllers/statuses_cleanup_controller.rb b/app/controllers/statuses_cleanup_controller.rb index 4a3fc10ca4fbd5..e517bf3ae88a44 100644 --- a/app/controllers/statuses_cleanup_controller.rb +++ b/app/controllers/statuses_cleanup_controller.rb @@ -5,7 +5,6 @@ class StatusesCleanupController < ApplicationController before_action :authenticate_user! before_action :set_policy - before_action :set_body_classes before_action :set_cache_headers def show; end @@ -34,10 +33,6 @@ def resource_params params.require(:account_statuses_cleanup_policy).permit(:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :min_favs, :min_reblogs) end - def set_body_classes - @body_classes = 'admin' - end - def set_cache_headers response.cache_control.replace(private: true, no_store: true) end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index db7eddd78b35d5..341b0e64729ccd 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -11,7 +11,6 @@ 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 :set_body_classes, only: :embed after_action :set_link_headers @@ -51,12 +50,10 @@ def embed private - def set_body_classes - @body_classes = 'with-modals' - end - def set_link_headers - response.headers['Link'] = LinkHeader.new([[ActivityPub::TagManager.instance.uri_for(@status), [%w(rel alternate), %w(type application/activity+json)]]]) + response.headers['Link'] = LinkHeader.new( + [[ActivityPub::TagManager.instance.uri_for(@status), [%w(rel alternate), %w(type application/activity+json)]]] + ).to_s end def set_status diff --git a/app/controllers/well_known/host_meta_controller.rb b/app/controllers/well_known/host_meta_controller.rb index 201da9fbc3b440..6dee587baf4fc8 100644 --- a/app/controllers/well_known/host_meta_controller.rb +++ b/app/controllers/well_known/host_meta_controller.rb @@ -7,7 +7,23 @@ class HostMetaController < ActionController::Base # rubocop:disable Rails/Applic def show @webfinger_template = "#{webfinger_url}?resource={uri}" expires_in 3.days, public: true - render content_type: 'application/xrd+xml', formats: [:xml] + + respond_to do |format| + format.any do + render content_type: 'application/xrd+xml', formats: [:xml] + end + + format.json do + render json: { + links: [ + { + rel: 'lrdd', + template: @webfinger_template, + }, + ], + } + end + end end end end diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index 110a53e4e16d1d..8e32a92923ebfb 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -19,14 +19,6 @@ def acct(account) end end - def account_action_button(account) - return if account.memorial? || account.moved? - - link_to ActivityPub::TagManager.instance.url_for(account), class: 'button logo-button', target: '_new' do - safe_join([logo_as_symbol, t('accounts.follow')]) - end - end - def hide_followers_count?(account) Setting.hide_followers_count || account.user&.settings&.[]('hide_followers_count') end diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb index e8d56341262cc5..51e28d8b4e9234 100644 --- a/app/helpers/admin/action_logs_helper.rb +++ b/app/helpers/admin/action_logs_helper.rb @@ -35,4 +35,11 @@ def log_target(log) end end end + + def sorted_action_log_types + Admin::ActionLogFilter::ACTION_TYPE_MAP + .keys + .map { |key| [I18n.t("admin.action_logs.action_types.#{key}"), key] } + .sort_by(&:first) + end end diff --git a/app/helpers/admin/dashboard_helper.rb b/app/helpers/admin/dashboard_helper.rb index 6096ff1381e7bb..f87fdad70832de 100644 --- a/app/helpers/admin/dashboard_helper.rb +++ b/app/helpers/admin/dashboard_helper.rb @@ -18,6 +18,11 @@ def relevant_account_ip(account, ip_query) end end + def date_range(range) + [l(range.first), l(range.last)] + .join(' - ') + end + def relevant_account_timestamp(account) timestamp, exact = if account.user_current_sign_in_at && account.user_current_sign_in_at < 24.hours.ago [account.user_current_sign_in_at, true] @@ -25,6 +30,8 @@ def relevant_account_timestamp(account) [account.user_current_sign_in_at, false] elsif account.user_pending? [account.user_created_at, true] + elsif account.suspended_at.present? && account.local? && account.user.nil? + [account.suspended_at, true] elsif account.last_status_at.present? [account.last_status_at, true] else diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 140fc73ede4124..40806a451586df 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -25,7 +25,7 @@ def filter_link_to(text, link_to_params, link_class_params = link_to_params) end def table_link_to(icon, text, path, **options) - link_to safe_join([fa_icon(icon), text]), path, options.merge(class: 'table-action-link') + link_to safe_join([material_symbol(icon), text]), path, options.merge(class: 'table-action-link') end def selected?(more_params) diff --git a/app/helpers/admin/tags_helper.rb b/app/helpers/admin/tags_helper.rb new file mode 100644 index 00000000000000..eb928a6db2beb0 --- /dev/null +++ b/app/helpers/admin/tags_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Admin::TagsHelper + def admin_tags_moderation_options + [ + [t('admin.tags.moderation.reviewed'), 'reviewed'], + [t('admin.tags.moderation.review_requested'), 'review_requested'], + [t('admin.tags.moderation.unreviewed'), 'unreviewed'], + [t('admin.tags.moderation.trendable'), 'trendable'], + [t('admin.tags.moderation.not_trendable'), 'not_trendable'], + [t('admin.tags.moderation.usable'), 'usable'], + [t('admin.tags.moderation.not_usable'), 'not_usable'], + ] + end +end diff --git a/app/helpers/admin/trends/statuses_helper.rb b/app/helpers/admin/trends/statuses_helper.rb index 79fee44dc4b003..c7a59660cf797b 100644 --- a/app/helpers/admin/trends/statuses_helper.rb +++ b/app/helpers/admin/trends/statuses_helper.rb @@ -5,7 +5,7 @@ def one_line_preview(status) text = if status.local? status.text.split("\n").first else - Nokogiri::HTML(status.text).css('html > body > *').first&.text + Nokogiri::HTML5(status.text).css('html > body > *').first&.text end return '' if text.blank? diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 2369cff7e65140..7665c0011a24d6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,12 +1,6 @@ # frozen_string_literal: true module ApplicationHelper - DANGEROUS_SCOPES = %w( - read - write - follow - ).freeze - RTL_LOCALES = %i( ar ckb @@ -86,7 +80,7 @@ def locale_direction def html_title safe_join( [content_for(:page_title).to_s.chomp, title] - .select(&:present?), + .compact_blank, ' - ' ) end @@ -95,8 +89,11 @@ def title Rails.env.production? ? site_title : "#{site_title} (Dev)" end - def class_for_scope(scope) - 'scope-danger' if DANGEROUS_SCOPES.include?(scope.to_s) + def label_for_scope(scope) + safe_join [ + tag.samp(scope, class: { 'scope-danger' => SessionActivation::DEFAULT_SCOPES.include?(scope.to_s) }), + tag.span(t("doorkeeper.scopes.#{scope}"), class: :hint), + ] end def can?(action, record) @@ -105,19 +102,17 @@ def can?(action, record) policy(record).public_send(:"#{action}?") end - def fa_icon(icon, attributes = {}) - class_names = attributes[:class]&.split || [] - class_names << 'fa' - class_names += icon.split.map { |cl| "fa-#{cl}" } - - content_tag(:i, nil, attributes.merge(class: class_names.join(' '))) - end - def material_symbol(icon, attributes = {}) - inline_svg_tag( - "400-24px/#{icon}.svg", - class: %w(icon).concat(attributes[:class].to_s.split), - role: :img + safe_join( + [ + inline_svg_tag( + "400-24px/#{icon}.svg", + class: ['icon', "material-#{icon}"].concat(attributes[:class].to_s.split), + role: :img, + data: attributes[:data] + ), + ' ', + ] ) end @@ -127,23 +122,23 @@ def check_icon def visibility_icon(status) if status.public_visibility? - fa_icon('globe', title: I18n.t('statuses.visibilities.public')) + material_symbol('globe', title: I18n.t('statuses.visibilities.public')) elsif status.unlisted_visibility? - fa_icon('unlock', title: I18n.t('statuses.visibilities.unlisted')) + material_symbol('lock_open', title: I18n.t('statuses.visibilities.unlisted')) elsif status.private_visibility? || status.limited_visibility? - fa_icon('lock', title: I18n.t('statuses.visibilities.private')) + material_symbol('lock', title: I18n.t('statuses.visibilities.private')) elsif status.direct_visibility? - fa_icon('at', title: I18n.t('statuses.visibilities.direct')) + material_symbol('alternate_email', title: I18n.t('statuses.visibilities.direct')) end end def interrelationships_icon(relationships, account_id) if relationships.following[account_id] && relationships.followed_by[account_id] - fa_icon('exchange', title: I18n.t('relationships.mutual'), class: 'fa-fw active passive') + material_symbol('sync_alt', title: I18n.t('relationships.mutual'), class: 'active passive') elsif relationships.following[account_id] - fa_icon(locale_direction == 'ltr' ? 'arrow-right' : 'arrow-left', title: I18n.t('relationships.following'), class: 'fa-fw active') + material_symbol(locale_direction == 'ltr' ? 'arrow_right_alt' : 'arrow_left_alt', title: I18n.t('relationships.following'), class: 'active') elsif relationships.followed_by[account_id] - fa_icon(locale_direction == 'ltr' ? 'arrow-left' : 'arrow-right', title: I18n.t('relationships.followers'), class: 'fa-fw passive') + material_symbol(locale_direction == 'ltr' ? 'arrow_left_alt' : 'arrow_right_alt', title: I18n.t('relationships.followers'), class: 'passive') end end @@ -161,6 +156,7 @@ def opengraph(property, content) def body_classes output = body_class_string.split + output << content_for(:body_classes) output << "flavour-#{current_flavour.parameterize}" output << "skin-#{current_skin.parameterize}" output << 'system-font' if current_account&.user&.setting_system_font_ui @@ -245,20 +241,13 @@ def mascot_url full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg')) end - def instance_presenter - @instance_presenter ||= InstancePresenter.new - end - - def favicon_path(size = '48') - instance_presenter.favicon&.file&.url(size) - end - - def app_icon_path(size = '48') - instance_presenter.app_icon&.file&.url(size) + def copyable_input(options = {}) + tag.input(type: :text, maxlength: 999, spellcheck: false, readonly: true, **options) end - def use_mask_icon? - instance_presenter.app_icon.blank? + 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 end # glitch-soc addition to handle the multiple flavors diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index d70b2a88fd4c7b..b36e25c092b57e 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -24,24 +24,8 @@ module ContextHelper indexable: { 'toot' => 'http://joinmastodon.org/ns#', 'indexable' => 'toot:indexable' }, memorial: { 'toot' => 'http://joinmastodon.org/ns#', 'memorial' => 'toot:memorial' }, voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, - olm: { - 'toot' => 'http://joinmastodon.org/ns#', - 'Device' => 'toot:Device', - 'Ed25519Signature' => 'toot:Ed25519Signature', - 'Ed25519Key' => 'toot:Ed25519Key', - 'Curve25519Key' => 'toot:Curve25519Key', - 'EncryptedMessage' => 'toot:EncryptedMessage', - 'publicKeyBase64' => 'toot:publicKeyBase64', - 'deviceId' => 'toot:deviceId', - 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, - 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, - 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, - 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, - 'messageFranking' => 'toot:messageFranking', - 'messageType' => 'toot:messageType', - 'cipherText' => 'toot:cipherText', - }, suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, + attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } }, }.freeze def full_context diff --git a/app/helpers/formatting_helper.rb b/app/helpers/formatting_helper.rb index f0d583bc541ec7..bc3d07a6bb01af 100644 --- a/app/helpers/formatting_helper.rb +++ b/app/helpers/formatting_helper.rb @@ -1,6 +1,14 @@ # frozen_string_literal: true module FormattingHelper + SYNDICATED_EMOJI_STYLES = <<~CSS.squish + height: 1.1em; + margin: -.2ex .15em .2ex; + object-fit: contain; + vertical-align: middle; + width: 1.1em; + CSS + def html_aware_format(text, local, options = {}) HtmlAwareFormatter.new(text, local, options).to_s end @@ -23,33 +31,10 @@ def status_content_format(status) end def rss_status_content_format(status) - html = status_content_format(status) - - before_html = if status.spoiler_text? - tag.p do - tag.strong do - I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale) - end - - status.spoiler_text - end + tag.hr - end - - after_html = if status.preloadable_poll - tag.p do - safe_join( - status.preloadable_poll.options.map do |o| - tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true) - end, - tag.br - ) - end - end - prerender_custom_emojis( - safe_join([before_html, html, after_html]), + wrapped_status_content_format(status), status.emojis, - style: 'width: 1.1em; height: 1.1em; object-fit: contain; vertical-align: middle; margin: -.2ex .15em .2ex' + style: SYNDICATED_EMOJI_STYLES ).to_str end @@ -64,4 +49,47 @@ def account_field_value_format(field, with_rel_me: true) html_aware_format(field.value, field.account.local?, with_rel_me: with_rel_me, with_domains: true, multiline: false) end end + + private + + def wrapped_status_content_format(status) + safe_join [ + rss_content_preroll(status), + status_content_format(status), + rss_content_postroll(status), + ] + end + + def rss_content_preroll(status) + if status.spoiler_text? + safe_join [ + tag.p { spoiler_with_warning(status) }, + tag.hr, + ] + end + end + + def spoiler_with_warning(status) + safe_join [ + tag.strong { I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale) }, + status.spoiler_text, + ] + end + + def rss_content_postroll(status) + if status.preloadable_poll + tag.p do + poll_option_tags(status) + end + end + end + + def poll_option_tags(status) + safe_join( + status.preloadable_poll.options.map do |option| + tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', option, disabled: true) + end, + tag.br + ) + end end diff --git a/app/helpers/instance_helper.rb b/app/helpers/instance_helper.rb index 893afdd51ff100..018c69e62074a1 100644 --- a/app/helpers/instance_helper.rb +++ b/app/helpers/instance_helper.rb @@ -13,6 +13,22 @@ def description_for_sign_up(invite = nil) safe_join([description_prefix(invite), I18n.t('auth.description.suffix')], ' ') end + def instance_presenter + @instance_presenter ||= InstancePresenter.new + end + + def favicon_path(size = '48') + instance_presenter.favicon&.file&.url(size) + end + + def app_icon_path(size = '48') + instance_presenter.app_icon&.file&.url(size) + end + + def use_mask_icon? + instance_presenter.app_icon.blank? + end + private def description_prefix(invite) diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index 932a3420db9d61..ba096427cfc9fb 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -200,14 +200,6 @@ def body_to_json(body, compare_id: nil) nil end - def merge_context(context, new_context) - if context.is_a?(Array) - context << new_context - else - [context, new_context] - end - end - def response_successful?(response) (200...300).cover?(response.code) end diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index 9e1c0a7db1d416..394202e39ad78a 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -193,6 +193,7 @@ module LanguagesHelper ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze, cnr: ['Montenegrin', 'crnogorski'].freeze, csb: ['Kashubian', 'Kaszëbsczi'].freeze, + gsw: ['Swiss German', 'Schwiizertütsch'].freeze, jbo: ['Lojban', 'la .lojban.'].freeze, kab: ['Kabyle', 'Taqbaylit'].freeze, ldn: ['Láadan', 'Láadan'].freeze, @@ -238,9 +239,7 @@ module LanguagesHelper # Helper for self.sorted_locale_keys private_class_method def self.locale_name_for_sorting(locale) - if locale.blank? || locale == 'und' - '000' - elsif (supported_locale = SUPPORTED_LOCALES[locale.to_sym]) + if (supported_locale = SUPPORTED_LOCALES[locale.to_sym]) ASCIIFolding.new.fold(supported_locale[1]).downcase elsif (regional_locale = REGIONAL_LOCALE_NAMES[locale.to_sym]) ASCIIFolding.new.fold(regional_locale).downcase diff --git a/app/helpers/media_component_helper.rb b/app/helpers/media_component_helper.rb index fa8f34fb4d3d73..60ccdd08359038 100644 --- a/app/helpers/media_component_helper.rb +++ b/app/helpers/media_component_helper.rb @@ -57,26 +57,6 @@ def render_media_gallery_component(status, **options) end end - def render_card_component(status, **options) - component_params = { - sensitive: sensitive_viewer?(status, current_account), - card: serialize_status_card(status).as_json, - }.merge(**options) - - react_component :card, component_params - end - - def render_poll_component(status, **options) - component_params = { - disabled: true, - poll: serialize_status_poll(status).as_json, - }.merge(**options) - - react_component :poll, component_params do - render partial: 'statuses/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: prefers_autoplay? } - end - end - private def serialize_media_attachment(attachment) @@ -86,22 +66,6 @@ def serialize_media_attachment(attachment) ) end - def serialize_status_card(status) - ActiveModelSerializers::SerializableResource.new( - status.preview_card, - serializer: REST::PreviewCardSerializer - ) - end - - def serialize_status_poll(status) - ActiveModelSerializers::SerializableResource.new( - status.preloadable_poll, - serializer: REST::PollSerializer, - scope: current_user, - scope_name: :current_user - ) - end - def sensitive_viewer?(status, account) if !account.nil? && account.id == status.account_id status.sensitive diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 10863a316c93b8..fd631ce92ecd30 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -10,27 +10,28 @@ def ui_languages end def featured_tags_hint(recently_used_tags) - safe_join( - [ - t('simple_form.hints.featured_tag.name'), - safe_join( - links_for_featured_tags(recently_used_tags), - ', ' - ), - ], - ' ' - ) + recently_used_tags.present? && + safe_join( + [ + t('simple_form.hints.featured_tag.name'), + safe_join( + links_for_featured_tags(recently_used_tags), + ', ' + ), + ], + ' ' + ) end def session_device_icon(session) device = session.detection.device if device.mobile? - 'mobile' + 'smartphone' elsif device.tablet? 'tablet' else - 'desktop' + 'desktop_mac' end end diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index ca693a8a78a9af..9bbb03fd820230 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -4,8 +4,15 @@ module StatusesHelper EMBEDDED_CONTROLLER = 'statuses' EMBEDDED_ACTION = 'embed' + VISIBLITY_ICONS = { + public: 'globe', + unlisted: 'lock_open', + private: 'lock', + direct: 'alternate_email', + }.freeze + def nothing_here(extra_classes = '') - content_tag(:div, class: "nothing-here #{extra_classes}") do + tag.div(class: ['nothing-here', extra_classes]) do t('accounts.nothing_here') end end @@ -57,17 +64,8 @@ def stream_link_target embedded_view? ? '_blank' : nil end - def fa_visibility_icon(status) - case status.visibility - when 'public' - fa_icon 'globe fw' - when 'unlisted' - fa_icon 'unlock fw' - when 'private' - fa_icon 'lock fw' - when 'direct' - fa_icon 'at fw' - end + def visibility_icon(status) + VISIBLITY_ICONS[status.visibility.to_sym] end def embedded_view? diff --git a/app/helpers/theme_helper.rb b/app/helpers/theme_helper.rb index bb8ef4547c8c4e..c5d226f70e6205 100644 --- a/app/helpers/theme_helper.rb +++ b/app/helpers/theme_helper.rb @@ -5,8 +5,10 @@ def theme_style_tags(flavour_and_skin) flavour, theme = flavour_and_skin if theme == 'system' - stylesheet_pack_tag("skins/#{flavour}/mastodon-light", media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') + - stylesheet_pack_tag("skins/#{flavour}/default", media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous') + ''.html_safe.tap do |tags| + tags << stylesheet_pack_tag("skins/#{flavour}/mastodon-light", media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') + tags << stylesheet_pack_tag("skins/#{flavour}/default", media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous') + end else stylesheet_pack_tag "skins/#{flavour}/#{theme}", media: 'all', crossorigin: 'anonymous' end @@ -16,8 +18,10 @@ def theme_color_tags(flavour_and_skin) _, theme = flavour_and_skin if theme == 'system' - tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') + - tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)') + ''.html_safe.tap do |tags| + tags << tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') + tags << tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)') + end else tag.meta name: 'theme-color', content: theme_color_for(theme) end diff --git a/app/helpers/webfinger_helper.rb b/app/helpers/webfinger_helper.rb deleted file mode 100644 index 482f4e19eabef0..00000000000000 --- a/app/helpers/webfinger_helper.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module WebfingerHelper - def webfinger!(uri) - Webfinger.new(uri).perform - end -end diff --git a/app/javascript/entrypoints/common.js b/app/javascript/entrypoints/common.js index 489041458f3700..fce857be920086 100644 --- a/app/javascript/entrypoints/common.js +++ b/app/javascript/entrypoints/common.js @@ -2,4 +2,3 @@ that is implicitly generated as the common chunk through webpack's `splitChunks` config */ import './public-path'; -import 'font-awesome/css/font-awesome.css'; diff --git a/app/javascript/entrypoints/embed.tsx b/app/javascript/entrypoints/embed.tsx new file mode 100644 index 00000000000000..f8c824d287ad31 --- /dev/null +++ b/app/javascript/entrypoints/embed.tsx @@ -0,0 +1,74 @@ +import './public-path'; +import { createRoot } from 'react-dom/client'; + +import { afterInitialRender } from 'mastodon/../hooks/useRenderSignal'; + +import { start } from '../mastodon/common'; +import { Status } from '../mastodon/features/standalone/status'; +import { loadPolyfills } from '../mastodon/polyfills'; +import ready from '../mastodon/ready'; + +start(); + +function loaded() { + const mountNode = document.getElementById('mastodon-status'); + + if (mountNode) { + const attr = mountNode.getAttribute('data-props'); + + if (!attr) return; + + const props = JSON.parse(attr) as { id: string; locale: string }; + const root = createRoot(mountNode); + + root.render(); + } +} + +function main() { + ready(loaded).catch((error: unknown) => { + console.error(error); + }); +} + +loadPolyfills() + .then(main) + .catch((error: unknown) => { + console.error(error); + }); + +interface SetHeightMessage { + type: 'setHeight'; + id: string; + height: number; +} + +function isSetHeightMessage(data: unknown): data is SetHeightMessage { + if ( + data && + typeof data === 'object' && + 'type' in data && + data.type === 'setHeight' + ) + return true; + else return false; +} + +window.addEventListener('message', (e) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases + if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return; + + const data = e.data; + + // We use a timeout to allow for the React page to render before calculating the height + afterInitialRender(() => { + window.parent.postMessage( + { + type: 'setHeight', + id: data.id, + height: document.getElementsByTagName('html')[0]?.scrollHeight, + }, + '*', + ); + }); +}); diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index 40a9b7c0ca6470..d33e00d5da88ce 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -37,43 +37,6 @@ const messages = defineMessages({ }, }); -interface SetHeightMessage { - type: 'setHeight'; - id: string; - height: number; -} - -function isSetHeightMessage(data: unknown): data is SetHeightMessage { - if ( - data && - typeof data === 'object' && - 'type' in data && - data.type === 'setHeight' - ) - return true; - else return false; -} - -window.addEventListener('message', (e) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases - if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return; - - const data = e.data; - - ready(() => { - window.parent.postMessage( - { - type: 'setHeight', - id: data.id, - height: document.getElementsByTagName('html')[0]?.scrollHeight, - }, - '*', - ); - }).catch((e: unknown) => { - console.error('Error in setHeightMessage postMessage', e); - }); -}); - function loaded() { const { messages: localeData } = getLocale(); @@ -316,8 +279,8 @@ function loaded() { const message = statusEl.dataset.spoiler === 'expanded' - ? localeData['status.show_less'] ?? 'Show less' - : localeData['status.show_more'] ?? 'Show more'; + ? (localeData['status.show_less'] ?? 'Show less') + : (localeData['status.show_more'] ?? 'Show more'); spoilerLink.textContent = new IntlMessageFormat( message, locale, @@ -431,6 +394,42 @@ Rails.delegate(document, 'img.custom-emoji', 'mouseout', ({ target }) => { target.src = target.dataset.static; }); +const setInputDisabled = ( + input: HTMLInputElement | HTMLSelectElement, + disabled: boolean, +) => { + input.disabled = disabled; + + const wrapper = input.closest('.with_label'); + if (wrapper) { + wrapper.classList.toggle('disabled', input.disabled); + + const hidden = + input.type === 'checkbox' && + wrapper.querySelector('input[type=hidden][value="0"]'); + if (hidden) { + hidden.disabled = input.disabled; + } + } +}; + +Rails.delegate( + document, + '#account_statuses_cleanup_policy_enabled', + 'change', + ({ target }) => { + if (!(target instanceof HTMLInputElement) || !target.form) return; + + target.form + .querySelectorAll< + HTMLInputElement | HTMLSelectElement + >('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select') + .forEach((input) => { + setInputDisabled(input, !target.checked); + }); + }, +); + // Empty the honeypot fields in JS in case something like an extension // automatically filled them. Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { diff --git a/app/javascript/flavours/glitch/actions/account_notes.ts b/app/javascript/flavours/glitch/actions/account_notes.ts index a71b342b060638..162fa675050dd2 100644 --- a/app/javascript/flavours/glitch/actions/account_notes.ts +++ b/app/javascript/flavours/glitch/actions/account_notes.ts @@ -6,5 +6,4 @@ export const submitAccountNote = createDataLoadingThunk( ({ accountId, note }: { accountId: string; note: string }) => apiSubmitAccountNote(accountId, note), (relationship) => ({ relationship }), - { skipLoading: true }, ); diff --git a/app/javascript/flavours/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js index 7c31c16998d0a3..e8f81048a6d476 100644 --- a/app/javascript/flavours/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -1,3 +1,6 @@ +import { browserHistory } from 'flavours/glitch/components/router'; +import { debounceWithDispatchAndArguments } from 'flavours/glitch/utils/debounce'; + import api, { getLinks } from '../api'; import { @@ -460,6 +463,20 @@ export function expandFollowingFail(id, error) { }; } +const debouncedFetchRelationships = debounceWithDispatchAndArguments((dispatch, ...newAccountIds) => { + if (newAccountIds.length === 0) { + return; + } + + dispatch(fetchRelationshipsRequest(newAccountIds)); + + api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => { + dispatch(fetchRelationshipsSuccess({ relationships: response.data })); + }).catch(error => { + dispatch(fetchRelationshipsFail(error)); + }); +}, { delay: 500 }); + export function fetchRelationships(accountIds) { return (dispatch, getState) => { const state = getState(); @@ -471,13 +488,7 @@ export function fetchRelationships(accountIds) { return; } - dispatch(fetchRelationshipsRequest(newAccountIds)); - - api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => { - dispatch(fetchRelationshipsSuccess({ relationships: response.data })); - }).catch(error => { - dispatch(fetchRelationshipsFail(error)); - }); + debouncedFetchRelationships(dispatch, ...newAccountIds); }; } @@ -722,6 +733,16 @@ export const updateAccount = ({ displayName, note, avatar, header, discoverable, }); }; +export const navigateToProfile = (accountId) => { + return (_dispatch, getState) => { + const acct = getState().accounts.getIn([accountId, 'acct']); + + if (acct) { + browserHistory.push(`/@${acct}`); + } + }; +}; + export function fetchPinnedAccountsSuggestions(q) { return (dispatch) => { dispatch(fetchPinnedAccountsSuggestionsRequest()); diff --git a/app/javascript/flavours/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js index 42834146bf5ba6..48dee2587fe523 100644 --- a/app/javascript/flavours/glitch/actions/alerts.js +++ b/app/javascript/flavours/glitch/actions/alerts.js @@ -1,5 +1,7 @@ import { defineMessages } from 'react-intl'; +import { AxiosError } from 'axios'; + const messages = defineMessages({ unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' }, unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' }, @@ -50,6 +52,11 @@ export const showAlertForError = (error, skipNotFound = false) => { }); } + // An aborted request, e.g. due to reloading the browser window, it not really error + if (error.code === AxiosError.ECONNABORTED) { + return { type: ALERT_NOOP }; + } + console.error(error); return showAlert({ diff --git a/app/javascript/flavours/glitch/actions/app.ts b/app/javascript/flavours/glitch/actions/app.ts index 6fbfc07f68c931..be1a5cced20f4d 100644 --- a/app/javascript/flavours/glitch/actions/app.ts +++ b/app/javascript/flavours/glitch/actions/app.ts @@ -2,6 +2,9 @@ import { createAction } from '@reduxjs/toolkit'; import type { LayoutType } from '../is_mobile'; +export const focusApp = createAction('APP_FOCUS'); +export const unfocusApp = createAction('APP_UNFOCUS'); + interface ChangeLayoutPayload { layout: LayoutType; } diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 61245acdba9873..e850a83a855a60 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -4,6 +4,7 @@ import axios from 'axios'; import { throttle } from 'lodash'; import api from 'flavours/glitch/api'; +import { browserHistory } from 'flavours/glitch/components/router'; import { search as emojiSearch } from 'flavours/glitch/features/emoji/emoji_mart_search_light'; import { tagHistory } from 'flavours/glitch/settings'; import { recoverHashtags } from 'flavours/glitch/utils/hashtag'; @@ -94,9 +95,9 @@ const messages = defineMessages({ saved: { id: 'compose.saved.body', defaultMessage: 'Post saved.' }, }); -export const ensureComposeIsVisible = (getState, routerHistory) => { +export const ensureComposeIsVisible = (getState) => { if (!getState().getIn(['compose', 'mounted'])) { - routerHistory.push('/publish'); + browserHistory.push('/publish'); } }; @@ -117,7 +118,7 @@ export function changeCompose(text) { }; } -export function replyCompose(status, routerHistory) { +export function replyCompose(status) { return (dispatch, getState) => { const prependCWRe = getState().getIn(['local_settings', 'prepend_cw_re']); dispatch({ @@ -126,7 +127,19 @@ export function replyCompose(status, routerHistory) { prependCWRe: prependCWRe, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); + }; +} + +export function replyComposeById(statusId) { + return (dispatch, getState) => { + const state = getState(); + const status = state.statuses.get(statusId); + + if (status) { + const account = state.accounts.get(status.get('account')); + dispatch(replyCompose(status.set('account', account))); + } }; } @@ -142,38 +155,44 @@ export function resetCompose() { }; } -export const focusCompose = (routerHistory, defaultText) => (dispatch, getState) => { +export const focusCompose = (defaultText) => (dispatch, getState) => { dispatch({ type: COMPOSE_FOCUS, defaultText, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); }; -export function mentionCompose(account, routerHistory) { +export function mentionCompose(account) { return (dispatch, getState) => { dispatch({ type: COMPOSE_MENTION, account: account, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); + }; +} + +export function mentionComposeById(accountId) { + return (dispatch, getState) => { + dispatch(mentionCompose(getState().accounts.get(accountId))); }; } -export function directCompose(account, routerHistory) { +export function directCompose(account) { return (dispatch, getState) => { dispatch({ type: COMPOSE_DIRECT, account: account, }); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); }; } -export function submitCompose(routerHistory, overridePrivacy = null) { +export function submitCompose(overridePrivacy = null) { return function (dispatch, getState) { let status = getState().getIn(['compose', 'text'], ''); const media = getState().getIn(['compose', 'media_attachments']); @@ -230,11 +249,10 @@ export function submitCompose(routerHistory, overridePrivacy = null) { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), }, }).then(function (response) { - if (routerHistory - && (routerHistory.location.pathname === '/publish' || routerHistory.location.pathname === '/statuses/new') + if ((browserHistory.location.pathname === '/publish' || browserHistory.location.pathname === '/statuses/new') && window.history.state && !getState().getIn(['compose', 'advanced_options', 'threaded_mode'])) { - routerHistory.goBack(); + browserHistory.goBack(); } dispatch(insertIntoTagHistory(response.data.tags, status)); @@ -272,7 +290,7 @@ export function submitCompose(routerHistory, overridePrivacy = null) { message: statusId === null ? messages.published : messages.saved, action: messages.open, dismissAfter: 10000, - onClick: () => routerHistory.push(`/@${response.data.account.username}/${response.data.id}`), + onClick: () => browserHistory.push(`/@${response.data.account.username}/${response.data.id}`), })); } }).catch(function (error) { @@ -310,7 +328,7 @@ export function doodleSet(options) { export function uploadCompose(files) { return function (dispatch, getState) { - const uploadLimit = 4; + const uploadLimit = getState().getIn(['server', 'server', 'configuration', 'statuses', 'max_media_attachments']); const media = getState().getIn(['compose', 'media_attachments']); const pending = getState().getIn(['compose', 'pending_media_attachments']); const progress = new Array(files.length).fill(0); @@ -330,7 +348,7 @@ export function uploadCompose(files) { dispatch(uploadComposeRequest()); for (const [i, f] of Array.from(files).entries()) { - if (media.size + i > 3) break; + if (media.size + i > (uploadLimit - 1)) break; resizeImage(f).then(file => { const data = new FormData(); diff --git a/app/javascript/flavours/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js index 57f2459c016fa4..92142d782c1c90 100644 --- a/app/javascript/flavours/glitch/actions/interactions.js +++ b/app/javascript/flavours/glitch/actions/interactions.js @@ -1,7 +1,11 @@ +import { boostModal, favouriteModal } from 'flavours/glitch/initial_state'; + import api, { getLinks } from '../api'; import { fetchRelationships } from './accounts'; import { importFetchedAccounts, importFetchedStatus } from './importer'; +import { unreblog, reblog } from './interactions_typed'; +import { openModal } from './modal'; export const REBLOGS_EXPAND_REQUEST = 'REBLOGS_EXPAND_REQUEST'; export const REBLOGS_EXPAND_SUCCESS = 'REBLOGS_EXPAND_SUCCESS'; @@ -432,3 +436,61 @@ export function unpinFail(status, error) { skipLoading: true, }; } + +function toggleReblogWithoutConfirmation(status, visibility) { + return (dispatch) => { + if (status.get('reblogged')) { + dispatch(unreblog({ statusId: status.get('id') })); + } else { + dispatch(reblog({ statusId: status.get('id'), visibility })); + } + }; +} + +export function toggleReblog(statusId, skipModal = false) { + return (dispatch, getState) => { + const state = getState(); + let status = state.statuses.get(statusId); + + if (!status) + return; + + // The reblog modal expects a pre-filled account in status + // TODO: fix this by having the reblog modal get a statusId and do the work itself + status = status.set('account', state.accounts.get(status.get('account'))); + + const missing_description_setting = state.getIn(['local_settings', 'confirm_boost_missing_media_description']); + const missing_description = status.get('media_attachments').some(item => !item.get('description')); + if (missing_description_setting && missing_description && !status.get('reblogged')) { + dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: (status, privacy) => dispatch(toggleReblogWithoutConfirmation(status, privacy)), missingMediaDescription: true } })); + } else if (boostModal && !skipModal) { + dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: (status, privacy) => dispatch(toggleReblogWithoutConfirmation(status, privacy)) } })); + } else { + dispatch(toggleReblogWithoutConfirmation(status)); + } + }; +} + +export function toggleFavourite(statusId, skipModal = false) { + return (dispatch, getState) => { + const state = getState(); + let status = state.statuses.get(statusId); + + if (!status) + return; + + // The favourite modal expects a pre-filled account in status + // TODO: fix this by having the reblog modal get a statusId and do the work itself + status = status.set('account', state.accounts.get(status.get('account'))); + + if (status.get('favourited')) { + dispatch(unfavourite(status)); + } else { + if (favouriteModal && !skipModal) { + dispatch(openModal({ modalType: 'FAVOURITE', modalProps: { status, onFavourite: (status) => dispatch(favourite(status)) } })); + } else { + dispatch(favourite(status)); + } + } + }; +} diff --git a/app/javascript/flavours/glitch/actions/languages.js b/app/javascript/flavours/glitch/actions/languages.js deleted file mode 100644 index ad186ba0ccd3e5..00000000000000 --- a/app/javascript/flavours/glitch/actions/languages.js +++ /dev/null @@ -1,12 +0,0 @@ -import { saveSettings } from './settings'; - -export const LANGUAGE_USE = 'LANGUAGE_USE'; - -export const useLanguage = language => dispatch => { - dispatch({ - type: LANGUAGE_USE, - language, - }); - - dispatch(saveSettings()); -}; diff --git a/app/javascript/flavours/glitch/actions/markers.ts b/app/javascript/flavours/glitch/actions/markers.ts index a85af1c4beec48..ea325109c5ea3b 100644 --- a/app/javascript/flavours/glitch/actions/markers.ts +++ b/app/javascript/flavours/glitch/actions/markers.ts @@ -37,8 +37,7 @@ export const synchronouslySubmitMarkers = createAppAsyncThunk( }); return; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - } else if ('navigator' && 'sendBeacon' in navigator) { + } else if ('sendBeacon' in navigator) { // Failing that, we can use sendBeacon, but we have to encode the data as // FormData for DoorKeeper to recognize the token. const formData = new FormData(); @@ -64,7 +63,7 @@ export const synchronouslySubmitMarkers = createAppAsyncThunk( client.setRequestHeader('Content-Type', 'application/json'); client.setRequestHeader('Authorization', `Bearer ${accessToken}`); client.send(JSON.stringify(params)); - } catch (e) { + } catch { // Do not make the BeforeUnload handler error out } }, @@ -75,9 +74,7 @@ interface MarkerParam { } function getLastNotificationId(state: RootState): string | undefined { - // @ts-expect-error state.notifications is not yet typed - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call - return state.getIn(['notifications', 'lastReadId']); + return state.notificationGroups.lastReadId; } const buildPostMarkersParams = (state: RootState) => { diff --git a/app/javascript/flavours/glitch/actions/notification_groups.ts b/app/javascript/flavours/glitch/actions/notification_groups.ts new file mode 100644 index 00000000000000..f85dfac9335e72 --- /dev/null +++ b/app/javascript/flavours/glitch/actions/notification_groups.ts @@ -0,0 +1,250 @@ +import { createAction } from '@reduxjs/toolkit'; + +import { + apiClearNotifications, + apiFetchNotificationGroups, +} from 'flavours/glitch/api/notifications'; +import type { ApiAccountJSON } from 'flavours/glitch/api_types/accounts'; +import type { + ApiNotificationGroupJSON, + ApiNotificationJSON, + NotificationType, +} from 'flavours/glitch/api_types/notifications'; +import { allNotificationTypes } from 'flavours/glitch/api_types/notifications'; +import type { ApiStatusJSON } from 'flavours/glitch/api_types/statuses'; +import { usePendingItems } from 'flavours/glitch/initial_state'; +import type { NotificationGap } from 'flavours/glitch/reducers/notification_groups'; +import { + selectSettingsNotificationsExcludedTypes, + selectSettingsNotificationsGroupFollows, + selectSettingsNotificationsQuickFilterActive, + selectSettingsNotificationsShows, +} from 'flavours/glitch/selectors/settings'; +import type { AppDispatch, RootState } from 'flavours/glitch/store'; +import { + createAppAsyncThunk, + createDataLoadingThunk, +} from 'flavours/glitch/store/typed_functions'; + +import { importFetchedAccounts, importFetchedStatuses } from './importer'; +import { NOTIFICATIONS_FILTER_SET } from './notifications'; +import { saveSettings } from './settings'; + +function excludeAllTypesExcept(filter: string) { + return allNotificationTypes.filter((item) => item !== filter); +} + +function getExcludedTypes(state: RootState) { + const activeFilter = selectSettingsNotificationsQuickFilterActive(state); + + return activeFilter === 'all' + ? selectSettingsNotificationsExcludedTypes(state) + : excludeAllTypesExcept(activeFilter); +} + +function dispatchAssociatedRecords( + dispatch: AppDispatch, + notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[], +) { + const fetchedAccounts: ApiAccountJSON[] = []; + const fetchedStatuses: ApiStatusJSON[] = []; + + notifications.forEach((notification) => { + if (notification.type === 'admin.report') { + fetchedAccounts.push(notification.report.target_account); + } + + if (notification.type === 'moderation_warning') { + fetchedAccounts.push(notification.moderation_warning.target_account); + } + + if ('status' in notification && notification.status) { + fetchedStatuses.push(notification.status); + } + }); + + if (fetchedAccounts.length > 0) + dispatch(importFetchedAccounts(fetchedAccounts)); + + if (fetchedStatuses.length > 0) + dispatch(importFetchedStatuses(fetchedStatuses)); +} + +function selectNotificationGroupedTypes(state: RootState) { + const types: NotificationType[] = ['favourite', 'reblog']; + + if (selectSettingsNotificationsGroupFollows(state)) types.push('follow'); + + return types; +} + +export const fetchNotifications = createDataLoadingThunk( + 'notificationGroups/fetch', + async (_params, { getState }) => + apiFetchNotificationGroups({ + grouped_types: selectNotificationGroupedTypes(getState()), + exclude_types: getExcludedTypes(getState()), + }), + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); + dispatchAssociatedRecords(dispatch, notifications); + const payload: (ApiNotificationGroupJSON | NotificationGap)[] = + notifications; + + // TODO: might be worth not using gaps for that… + // if (nextLink) payload.push({ type: 'gap', loadUrl: nextLink.uri }); + if (notifications.length > 1) + payload.push({ type: 'gap', maxId: notifications.at(-1)?.page_min_id }); + + return payload; + // dispatch(submitMarkers()); + }, +); + +export const fetchNotificationsGap = createDataLoadingThunk( + 'notificationGroups/fetchGap', + async (params: { gap: NotificationGap }, { getState }) => + apiFetchNotificationGroups({ + grouped_types: selectNotificationGroupedTypes(getState()), + max_id: params.gap.maxId, + exclude_types: getExcludedTypes(getState()), + }), + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications }; + }, +); + +export const pollRecentNotifications = createDataLoadingThunk( + 'notificationGroups/pollRecentNotifications', + async (_params, { getState }) => { + return apiFetchNotificationGroups({ + grouped_types: selectNotificationGroupedTypes(getState()), + max_id: undefined, + exclude_types: getExcludedTypes(getState()), + // In slow mode, we don't want to include notifications that duplicate the already-displayed ones + since_id: usePendingItems + ? getState().notificationGroups.groups.find( + (group) => group.type !== 'gap', + )?.page_max_id + : undefined, + }); + }, + ({ notifications, accounts, statuses }, { dispatch }) => { + dispatch(importFetchedAccounts(accounts)); + dispatch(importFetchedStatuses(statuses)); + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications }; + }, +); + +export const processNewNotificationForGroups = createAppAsyncThunk( + 'notificationGroups/processNew', + (notification: ApiNotificationJSON, { dispatch, getState }) => { + const state = getState(); + const activeFilter = selectSettingsNotificationsQuickFilterActive(state); + const notificationShows = selectSettingsNotificationsShows(state); + + const showInColumn = + activeFilter === 'all' + ? notificationShows[notification.type] + : activeFilter === notification.type; + + if (!showInColumn) return; + + if ( + (notification.type === 'mention' || notification.type === 'update') && + notification.status?.filtered + ) { + const filters = notification.status.filtered.filter((result) => + result.filter.context.includes('notifications'), + ); + + if (filters.some((result) => result.filter.filter_action === 'hide')) { + return; + } + } + + dispatchAssociatedRecords(dispatch, [notification]); + + return { + notification, + groupedTypes: selectNotificationGroupedTypes(state), + }; + }, +); + +export const loadPending = createAction('notificationGroups/loadPending'); + +export const updateScrollPosition = createAppAsyncThunk( + 'notificationGroups/updateScrollPosition', + ({ top }: { top: boolean }, { dispatch, getState }) => { + if ( + top && + getState().notificationGroups.mergedNotifications === 'needs-reload' + ) { + void dispatch(fetchNotifications()); + } + + return { top }; + }, +); + +export const setNotificationsFilter = createAppAsyncThunk( + 'notifications/filter/set', + ({ filterType }: { filterType: string }, { dispatch }) => { + dispatch({ + type: NOTIFICATIONS_FILTER_SET, + path: ['notifications', 'quickFilter', 'active'], + value: filterType, + }); + void dispatch(fetchNotifications()); + dispatch(saveSettings()); + }, +); + +export const clearNotifications = createDataLoadingThunk( + 'notifications/clear', + () => apiClearNotifications(), +); + +export const markNotificationsAsRead = createAction( + 'notificationGroups/markAsRead', +); + +export const mountNotifications = createAppAsyncThunk( + 'notificationGroups/mount', + (_, { dispatch, getState }) => { + const state = getState(); + + if ( + state.notificationGroups.mounted === 0 && + state.notificationGroups.mergedNotifications === 'needs-reload' + ) { + void dispatch(fetchNotifications()); + } + }, +); + +export const unmountNotifications = createAction('notificationGroups/unmount'); + +export const refreshStaleNotificationGroups = createAppAsyncThunk<{ + deferredRefresh: boolean; +}>('notificationGroups/refreshStale', (_, { dispatch, getState }) => { + const state = getState(); + + if ( + state.notificationGroups.scrolledToTop || + !state.notificationGroups.mounted + ) { + void dispatch(fetchNotifications()); + return { deferredRefresh: false }; + } + + return { deferredRefresh: true }; +}); diff --git a/app/javascript/flavours/glitch/actions/notification_policies.ts b/app/javascript/flavours/glitch/actions/notification_policies.ts index 76452de324b426..a64175831f3b1f 100644 --- a/app/javascript/flavours/glitch/actions/notification_policies.ts +++ b/app/javascript/flavours/glitch/actions/notification_policies.ts @@ -1,3 +1,5 @@ +import { createAction } from '@reduxjs/toolkit'; + import { apiGetNotificationPolicy, apiUpdateNotificationsPolicy, @@ -14,3 +16,7 @@ export const updateNotificationsPolicy = createDataLoadingThunk( 'notificationPolicy/update', (policy: Partial) => apiUpdateNotificationsPolicy(policy), ); + +export const decreasePendingRequestsCount = createAction( + 'notificationPolicy/decreasePendingRequestsCount', +); diff --git a/app/javascript/flavours/glitch/actions/notification_requests.ts b/app/javascript/flavours/glitch/actions/notification_requests.ts new file mode 100644 index 00000000000000..f53668abd529f8 --- /dev/null +++ b/app/javascript/flavours/glitch/actions/notification_requests.ts @@ -0,0 +1,214 @@ +import { + apiFetchNotificationRequest, + apiFetchNotificationRequests, + apiFetchNotifications, + apiAcceptNotificationRequest, + apiDismissNotificationRequest, + apiAcceptNotificationRequests, + apiDismissNotificationRequests, +} from 'flavours/glitch/api/notifications'; +import type { ApiAccountJSON } from 'flavours/glitch/api_types/accounts'; +import type { + ApiNotificationGroupJSON, + ApiNotificationJSON, +} from 'flavours/glitch/api_types/notifications'; +import type { ApiStatusJSON } from 'flavours/glitch/api_types/statuses'; +import type { AppDispatch } from 'flavours/glitch/store'; +import { createDataLoadingThunk } from 'flavours/glitch/store/typed_functions'; + +import { importFetchedAccounts, importFetchedStatuses } from './importer'; +import { decreasePendingRequestsCount } from './notification_policies'; + +// TODO: refactor with notification_groups +function dispatchAssociatedRecords( + dispatch: AppDispatch, + notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[], +) { + const fetchedAccounts: ApiAccountJSON[] = []; + const fetchedStatuses: ApiStatusJSON[] = []; + + notifications.forEach((notification) => { + if (notification.type === 'admin.report') { + fetchedAccounts.push(notification.report.target_account); + } + + if (notification.type === 'moderation_warning') { + fetchedAccounts.push(notification.moderation_warning.target_account); + } + + if ('status' in notification && notification.status) { + fetchedStatuses.push(notification.status); + } + }); + + if (fetchedAccounts.length > 0) + dispatch(importFetchedAccounts(fetchedAccounts)); + + if (fetchedStatuses.length > 0) + dispatch(importFetchedStatuses(fetchedStatuses)); +} + +export const fetchNotificationRequests = createDataLoadingThunk( + 'notificationRequests/fetch', + async (_params, { getState }) => { + let sinceId = undefined; + + if (getState().notificationRequests.items.length > 0) { + sinceId = getState().notificationRequests.items[0]?.id; + } + + return apiFetchNotificationRequests({ + since_id: sinceId, + }); + }, + ({ requests, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatch(importFetchedAccounts(requests.map((request) => request.account))); + + return { requests, next: next?.uri }; + }, + { + condition: (_params, { getState }) => + !getState().notificationRequests.isLoading, + }, +); + +export const fetchNotificationRequest = createDataLoadingThunk( + 'notificationRequest/fetch', + async ({ id }: { id: string }) => apiFetchNotificationRequest(id), + { + condition: ({ id }, { getState }) => + !( + getState().notificationRequests.current.item?.id === id || + getState().notificationRequests.current.isLoading + ), + }, +); + +export const expandNotificationRequests = createDataLoadingThunk( + 'notificationRequests/expand', + async (_, { getState }) => { + const nextUrl = getState().notificationRequests.next; + if (!nextUrl) throw new Error('missing URL'); + + return apiFetchNotificationRequests(undefined, nextUrl); + }, + ({ requests, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatch(importFetchedAccounts(requests.map((request) => request.account))); + + return { requests, next: next?.uri }; + }, + { + condition: (_, { getState }) => + !!getState().notificationRequests.next && + !getState().notificationRequests.isLoading, + }, +); + +export const fetchNotificationsForRequest = createDataLoadingThunk( + 'notificationRequest/fetchNotifications', + async ({ accountId }: { accountId: string }, { getState }) => { + const sinceId = + // @ts-expect-error current.notifications.items is not yet typed + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + getState().notificationRequests.current.notifications.items[0]?.get( + 'id', + ) as string | undefined; + + return apiFetchNotifications({ + since_id: sinceId, + account_id: accountId, + }); + }, + ({ notifications, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications, next: next?.uri }; + }, + { + condition: ({ accountId }, { getState }) => { + const current = getState().notificationRequests.current; + return !( + current.item?.account_id === accountId && + current.notifications.isLoading + ); + }, + }, +); + +export const expandNotificationsForRequest = createDataLoadingThunk( + 'notificationRequest/expandNotifications', + async (_, { getState }) => { + const nextUrl = getState().notificationRequests.current.notifications.next; + if (!nextUrl) throw new Error('missing URL'); + + return apiFetchNotifications(undefined, nextUrl); + }, + ({ notifications, links }, { dispatch }) => { + const next = links.refs.find((link) => link.rel === 'next'); + + dispatchAssociatedRecords(dispatch, notifications); + + return { notifications, next: next?.uri }; + }, + { + condition: ({ accountId }: { accountId: string }, { getState }) => { + const url = getState().notificationRequests.current.notifications.next; + + return ( + !!url && + !getState().notificationRequests.current.notifications.isLoading && + getState().notificationRequests.current.item?.account_id === accountId + ); + }, + }, +); + +export const acceptNotificationRequest = createDataLoadingThunk( + 'notificationRequest/accept', + ({ id }: { id: string }) => apiAcceptNotificationRequest(id), + (_data, { dispatch, discardLoadData }) => { + dispatch(decreasePendingRequestsCount(1)); + + // The payload is not used in any functions + return discardLoadData; + }, +); + +export const dismissNotificationRequest = createDataLoadingThunk( + 'notificationRequest/dismiss', + ({ id }: { id: string }) => apiDismissNotificationRequest(id), + (_data, { dispatch, discardLoadData }) => { + dispatch(decreasePendingRequestsCount(1)); + + // The payload is not used in any functions + return discardLoadData; + }, +); + +export const acceptNotificationRequests = createDataLoadingThunk( + 'notificationRequests/acceptBulk', + ({ ids }: { ids: string[] }) => apiAcceptNotificationRequests(ids), + (_data, { dispatch, discardLoadData, actionArg: { ids } }) => { + dispatch(decreasePendingRequestsCount(ids.length)); + + // The payload is not used in any functions + return discardLoadData; + }, +); + +export const dismissNotificationRequests = createDataLoadingThunk( + 'notificationRequests/dismissBulk', + ({ ids }: { ids: string[] }) => apiDismissNotificationRequests(ids), + (_data, { dispatch, discardLoadData, actionArg: { ids } }) => { + dispatch(decreasePendingRequestsCount(ids.length)); + + // The payload is not used in any functions + return discardLoadData; + }, +); diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index 3a1af501c8d9e6..7b80663f3ddb52 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -10,7 +10,7 @@ import api, { getLinks } from '../api'; import { unescapeHTML } from '../utils/html'; import { requestNotificationPermission } from '../utils/notifications'; -import { fetchFollowRequests, fetchRelationships } from './accounts'; +import { fetchFollowRequests } from './accounts'; import { importFetchedAccount, importFetchedAccounts, @@ -43,7 +43,6 @@ export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL'; export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET'; -export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING'; @@ -57,46 +56,18 @@ export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ'; export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT'; export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION'; -export const NOTIFICATION_REQUESTS_FETCH_REQUEST = 'NOTIFICATION_REQUESTS_FETCH_REQUEST'; -export const NOTIFICATION_REQUESTS_FETCH_SUCCESS = 'NOTIFICATION_REQUESTS_FETCH_SUCCESS'; -export const NOTIFICATION_REQUESTS_FETCH_FAIL = 'NOTIFICATION_REQUESTS_FETCH_FAIL'; +export const NOTIFICATION_REQUESTS_ACCEPT_REQUEST = 'NOTIFICATION_REQUESTS_ACCEPT_REQUEST'; +export const NOTIFICATION_REQUESTS_ACCEPT_SUCCESS = 'NOTIFICATION_REQUESTS_ACCEPT_SUCCESS'; +export const NOTIFICATION_REQUESTS_ACCEPT_FAIL = 'NOTIFICATION_REQUESTS_ACCEPT_FAIL'; -export const NOTIFICATION_REQUESTS_EXPAND_REQUEST = 'NOTIFICATION_REQUESTS_EXPAND_REQUEST'; -export const NOTIFICATION_REQUESTS_EXPAND_SUCCESS = 'NOTIFICATION_REQUESTS_EXPAND_SUCCESS'; -export const NOTIFICATION_REQUESTS_EXPAND_FAIL = 'NOTIFICATION_REQUESTS_EXPAND_FAIL'; - -export const NOTIFICATION_REQUEST_FETCH_REQUEST = 'NOTIFICATION_REQUEST_FETCH_REQUEST'; -export const NOTIFICATION_REQUEST_FETCH_SUCCESS = 'NOTIFICATION_REQUEST_FETCH_SUCCESS'; -export const NOTIFICATION_REQUEST_FETCH_FAIL = 'NOTIFICATION_REQUEST_FETCH_FAIL'; - -export const NOTIFICATION_REQUEST_ACCEPT_REQUEST = 'NOTIFICATION_REQUEST_ACCEPT_REQUEST'; -export const NOTIFICATION_REQUEST_ACCEPT_SUCCESS = 'NOTIFICATION_REQUEST_ACCEPT_SUCCESS'; -export const NOTIFICATION_REQUEST_ACCEPT_FAIL = 'NOTIFICATION_REQUEST_ACCEPT_FAIL'; - -export const NOTIFICATION_REQUEST_DISMISS_REQUEST = 'NOTIFICATION_REQUEST_DISMISS_REQUEST'; -export const NOTIFICATION_REQUEST_DISMISS_SUCCESS = 'NOTIFICATION_REQUEST_DISMISS_SUCCESS'; -export const NOTIFICATION_REQUEST_DISMISS_FAIL = 'NOTIFICATION_REQUEST_DISMISS_FAIL'; - -export const NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST'; -export const NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS'; -export const NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL = 'NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL'; - -export const NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST'; -export const NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS'; -export const NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL = 'NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL'; +export const NOTIFICATION_REQUESTS_DISMISS_REQUEST = 'NOTIFICATION_REQUESTS_DISMISS_REQUEST'; +export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS'; +export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL'; defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, }); -const fetchRelatedRelationships = (dispatch, notifications) => { - const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id); - - if (accountIds.length > 0) { - dispatch(fetchRelationships(accountIds)); - } -}; - export const loadPending = () => ({ type: NOTIFICATIONS_LOAD_PENDING, }); @@ -139,8 +110,6 @@ export function updateNotifications(notification, intlMessages, intlLocale) { dispatch(notificationsUpdate({ notification, preferPendingItems, playSound: playSound && !filtered})); - - fetchRelatedRelationships(dispatch, [notification]); } else if (playSound && !filtered) { dispatch({ type: NOTIFICATIONS_UPDATE_NOOP, @@ -186,8 +155,8 @@ const noOp = () => {}; let expandNotificationsController = new AbortController(); -export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { - return (dispatch, getState) => { +export function expandNotifications({ maxId = undefined, forceLoad = false }) { + return async (dispatch, getState) => { const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); const notifications = getState().get('notifications'); const isLoadingMore = !!maxId; @@ -197,7 +166,6 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { expandNotificationsController.abort(); expandNotificationsController = new AbortController(); } else { - done(); return; } } @@ -224,7 +192,8 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { dispatch(expandNotificationsRequest(isLoadingMore)); - api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => { + try { + const response = await api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }); const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.map(item => item.account))); @@ -232,13 +201,10 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) { dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems)); - fetchRelatedRelationships(dispatch, response.data); dispatch(submitMarkers()); - }).catch(error => { + } catch(error) { dispatch(expandNotificationsFail(error, isLoadingMore)); - }).finally(() => { - done(); - }); + } }; } @@ -269,16 +235,6 @@ export function expandNotificationsFail(error, isLoadingMore) { }; } -export function clearNotifications() { - return (dispatch) => { - dispatch({ - type: NOTIFICATIONS_CLEAR, - }); - - api().post('/api/v1/notifications/clear'); - }; -} - export function scrollTopNotifications(top) { return { type: NOTIFICATIONS_SCROLL_TOP, @@ -429,236 +385,3 @@ export function setBrowserPermission (value) { value, }; } - -export const fetchNotificationRequests = () => (dispatch, getState) => { - const params = {}; - - if (getState().getIn(['notificationRequests', 'isLoading'])) { - return; - } - - if (getState().getIn(['notificationRequests', 'items'])?.size > 0) { - params.since_id = getState().getIn(['notificationRequests', 'items', 0, 'id']); - } - - dispatch(fetchNotificationRequestsRequest()); - - api().get('/api/v1/notifications/requests', { params }).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(x => x.account))); - dispatch(fetchNotificationRequestsSuccess(response.data, next ? next.uri : null)); - }).catch(err => { - dispatch(fetchNotificationRequestsFail(err)); - }); -}; - -export const fetchNotificationRequestsRequest = () => ({ - type: NOTIFICATION_REQUESTS_FETCH_REQUEST, -}); - -export const fetchNotificationRequestsSuccess = (requests, next) => ({ - type: NOTIFICATION_REQUESTS_FETCH_SUCCESS, - requests, - next, -}); - -export const fetchNotificationRequestsFail = error => ({ - type: NOTIFICATION_REQUESTS_FETCH_FAIL, - error, -}); - -export const expandNotificationRequests = () => (dispatch, getState) => { - const url = getState().getIn(['notificationRequests', 'next']); - - if (!url || getState().getIn(['notificationRequests', 'isLoading'])) { - return; - } - - dispatch(expandNotificationRequestsRequest()); - - api().get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(x => x.account))); - dispatch(expandNotificationRequestsSuccess(response.data, next?.uri)); - }).catch(err => { - dispatch(expandNotificationRequestsFail(err)); - }); -}; - -export const expandNotificationRequestsRequest = () => ({ - type: NOTIFICATION_REQUESTS_EXPAND_REQUEST, -}); - -export const expandNotificationRequestsSuccess = (requests, next) => ({ - type: NOTIFICATION_REQUESTS_EXPAND_SUCCESS, - requests, - next, -}); - -export const expandNotificationRequestsFail = error => ({ - type: NOTIFICATION_REQUESTS_EXPAND_FAIL, - error, -}); - -export const fetchNotificationRequest = id => (dispatch, getState) => { - const current = getState().getIn(['notificationRequests', 'current']); - - if (current.getIn(['item', 'id']) === id || current.get('isLoading')) { - return; - } - - dispatch(fetchNotificationRequestRequest(id)); - - api().get(`/api/v1/notifications/requests/${id}`).then(({ data }) => { - dispatch(fetchNotificationRequestSuccess(data)); - }).catch(err => { - dispatch(fetchNotificationRequestFail(id, err)); - }); -}; - -export const fetchNotificationRequestRequest = id => ({ - type: NOTIFICATION_REQUEST_FETCH_REQUEST, - id, -}); - -export const fetchNotificationRequestSuccess = request => ({ - type: NOTIFICATION_REQUEST_FETCH_SUCCESS, - request, -}); - -export const fetchNotificationRequestFail = (id, error) => ({ - type: NOTIFICATION_REQUEST_FETCH_FAIL, - id, - error, -}); - -export const acceptNotificationRequest = id => (dispatch) => { - dispatch(acceptNotificationRequestRequest(id)); - - api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { - dispatch(acceptNotificationRequestSuccess(id)); - }).catch(err => { - dispatch(acceptNotificationRequestFail(id, err)); - }); -}; - -export const acceptNotificationRequestRequest = id => ({ - type: NOTIFICATION_REQUEST_ACCEPT_REQUEST, - id, -}); - -export const acceptNotificationRequestSuccess = id => ({ - type: NOTIFICATION_REQUEST_ACCEPT_SUCCESS, - id, -}); - -export const acceptNotificationRequestFail = (id, error) => ({ - type: NOTIFICATION_REQUEST_ACCEPT_FAIL, - id, - error, -}); - -export const dismissNotificationRequest = id => (dispatch) => { - dispatch(dismissNotificationRequestRequest(id)); - - api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ - dispatch(dismissNotificationRequestSuccess(id)); - }).catch(err => { - dispatch(dismissNotificationRequestFail(id, err)); - }); -}; - -export const dismissNotificationRequestRequest = id => ({ - type: NOTIFICATION_REQUEST_DISMISS_REQUEST, - id, -}); - -export const dismissNotificationRequestSuccess = id => ({ - type: NOTIFICATION_REQUEST_DISMISS_SUCCESS, - id, -}); - -export const dismissNotificationRequestFail = (id, error) => ({ - type: NOTIFICATION_REQUEST_DISMISS_FAIL, - id, - error, -}); - -export const fetchNotificationsForRequest = accountId => (dispatch, getState) => { - const current = getState().getIn(['notificationRequests', 'current']); - const params = { account_id: accountId }; - - if (current.getIn(['item', 'account']) === accountId) { - if (current.getIn(['notifications', 'isLoading'])) { - return; - } - - if (current.getIn(['notifications', 'items'])?.size > 0) { - params.since_id = current.getIn(['notifications', 'items', 0, 'id']); - } - } - - dispatch(fetchNotificationsForRequestRequest()); - - api().get('/api/v1/notifications', { params }).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(item => item.account))); - dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); - dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); - - dispatch(fetchNotificationsForRequestSuccess(response.data, next?.uri)); - }).catch(err => { - dispatch(fetchNotificationsForRequestFail(err)); - }); -}; - -export const fetchNotificationsForRequestRequest = () => ({ - type: NOTIFICATIONS_FOR_REQUEST_FETCH_REQUEST, -}); - -export const fetchNotificationsForRequestSuccess = (notifications, next) => ({ - type: NOTIFICATIONS_FOR_REQUEST_FETCH_SUCCESS, - notifications, - next, -}); - -export const fetchNotificationsForRequestFail = (error) => ({ - type: NOTIFICATIONS_FOR_REQUEST_FETCH_FAIL, - error, -}); - -export const expandNotificationsForRequest = () => (dispatch, getState) => { - const url = getState().getIn(['notificationRequests', 'current', 'notifications', 'next']); - - if (!url || getState().getIn(['notificationRequests', 'current', 'notifications', 'isLoading'])) { - return; - } - - dispatch(expandNotificationsForRequestRequest()); - - api().get(url).then(response => { - const next = getLinks(response).refs.find(link => link.rel === 'next'); - dispatch(importFetchedAccounts(response.data.map(item => item.account))); - dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); - dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account))); - - dispatch(expandNotificationsForRequestSuccess(response.data, next?.uri)); - }).catch(err => { - dispatch(expandNotificationsForRequestFail(err)); - }); -}; - -export const expandNotificationsForRequestRequest = () => ({ - type: NOTIFICATIONS_FOR_REQUEST_EXPAND_REQUEST, -}); - -export const expandNotificationsForRequestSuccess = (notifications, next) => ({ - type: NOTIFICATIONS_FOR_REQUEST_EXPAND_SUCCESS, - notifications, - next, -}); - -export const expandNotificationsForRequestFail = (error) => ({ - type: NOTIFICATIONS_FOR_REQUEST_EXPAND_FAIL, - error, -}); diff --git a/app/javascript/flavours/glitch/actions/notifications_migration.tsx b/app/javascript/flavours/glitch/actions/notifications_migration.tsx new file mode 100644 index 00000000000000..6f2d38b9e94677 --- /dev/null +++ b/app/javascript/flavours/glitch/actions/notifications_migration.tsx @@ -0,0 +1,10 @@ +import { createAppAsyncThunk } from 'flavours/glitch/store'; + +import { fetchNotifications } from './notification_groups'; + +export const initializeNotifications = createAppAsyncThunk( + 'notifications/initialize', + (_, { dispatch }) => { + void dispatch(fetchNotifications()); + }, +); diff --git a/app/javascript/flavours/glitch/actions/notifications_typed.ts b/app/javascript/flavours/glitch/actions/notifications_typed.ts index 176362f4b1edd4..55896f4c378f49 100644 --- a/app/javascript/flavours/glitch/actions/notifications_typed.ts +++ b/app/javascript/flavours/glitch/actions/notifications_typed.ts @@ -1,11 +1,6 @@ import { createAction } from '@reduxjs/toolkit'; -import type { ApiAccountJSON } from '../api_types/accounts'; -// To be replaced once ApiNotificationJSON type exists -interface FakeApiNotificationJSON { - type: string; - account: ApiAccountJSON; -} +import type { ApiNotificationJSON } from 'flavours/glitch/api_types/notifications'; export const notificationsUpdate = createAction( 'notifications/update', @@ -13,7 +8,7 @@ export const notificationsUpdate = createAction( playSound, ...args }: { - notification: FakeApiNotificationJSON; + notification: ApiNotificationJSON; usePendingItems: boolean; playSound: boolean; }) => ({ diff --git a/app/javascript/flavours/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js index c4d292567d4d0c..2b6b589b374d5b 100644 --- a/app/javascript/flavours/glitch/actions/statuses.js +++ b/app/javascript/flavours/glitch/actions/statuses.js @@ -1,3 +1,5 @@ +import { browserHistory } from 'flavours/glitch/components/router'; + import api from '../api'; import { ensureComposeIsVisible, setComposeToStatus } from './compose'; @@ -47,11 +49,13 @@ export function fetchStatusRequest(id, skipLoading) { }; } -export function fetchStatus(id, forceFetch = false) { +export function fetchStatus(id, forceFetch = false, alsoFetchContext = true) { return (dispatch, getState) => { const skipLoading = !forceFetch && getState().getIn(['statuses', id], null) !== null; - dispatch(fetchContext(id)); + if (alsoFetchContext) { + dispatch(fetchContext(id)); + } if (skipLoading) { return; @@ -94,7 +98,7 @@ export function redraft(status, raw_text, content_type) { }; } -export const editStatus = (id, routerHistory) => (dispatch, getState) => { +export const editStatus = (id) => (dispatch, getState) => { let status = getState().getIn(['statuses', id]); if (status.get('poll')) { @@ -105,7 +109,7 @@ export const editStatus = (id, routerHistory) => (dispatch, getState) => { api().get(`/api/v1/statuses/${id}/source`).then(response => { dispatch(fetchStatusSourceSuccess()); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); dispatch(setComposeToStatus(status, response.data.text, response.data.spoiler_text, response.data.content_type)); }).catch(error => { dispatch(fetchStatusSourceFail(error)); @@ -125,7 +129,7 @@ export const fetchStatusSourceFail = error => ({ error, }); -export function deleteStatus(id, routerHistory, withRedraft = false) { +export function deleteStatus(id, withRedraft = false) { return (dispatch, getState) => { let status = getState().getIn(['statuses', id]); @@ -142,7 +146,7 @@ export function deleteStatus(id, routerHistory, withRedraft = false) { if (withRedraft) { dispatch(redraft(status, response.data.text, response.data.content_type)); - ensureComposeIsVisible(getState, routerHistory); + ensureComposeIsVisible(getState); } }).catch(error => { dispatch(deleteStatusFail(id, error)); @@ -309,6 +313,21 @@ export function revealStatus(ids) { }; } +export function toggleStatusSpoilers(statusId) { + return (dispatch, getState) => { + const status = getState().statuses.get(statusId); + + if (!status) + return; + + if (status.get('hidden')) { + dispatch(revealStatus(statusId)); + } else { + dispatch(hideStatus(statusId)); + } + }; +} + export function toggleStatusCollapse(id, isCollapsed) { return { type: STATUS_COLLAPSE, @@ -349,3 +368,15 @@ export const undoStatusTranslation = (id, pollId) => ({ id, pollId, }); + +export const navigateToStatus = (statusId) => { + return (_dispatch, getState) => { + const state = getState(); + const accountId = state.statuses.getIn([statusId, 'account']); + const acct = state.accounts.getIn([accountId, 'acct']); + + if (acct) { + browserHistory.push(`/@${acct}/${statusId}`); + } + }; +}; diff --git a/app/javascript/flavours/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js index a55240646f3e69..fa7af7055e6180 100644 --- a/app/javascript/flavours/glitch/actions/streaming.js +++ b/app/javascript/flavours/glitch/actions/streaming.js @@ -10,6 +10,7 @@ import { deleteAnnouncement, } from './announcements'; import { updateConversations } from './conversations'; +import { processNewNotificationForGroups, refreshStaleNotificationGroups, pollRecentNotifications as pollRecentGroupNotifications } from './notification_groups'; import { updateNotifications, expandNotifications } from './notifications'; import { updateStatus } from './statuses'; import { @@ -36,7 +37,7 @@ const randomUpTo = max => * @param {string} channelName * @param {Object.} params * @param {Object} options - * @param {function(Function, Function): void} [options.fallback] + * @param {function(Function, Function): Promise} [options.fallback] * @param {function(): void} [options.fillGaps] * @param {function(object): boolean} [options.accept] * @returns {function(): void} @@ -51,14 +52,13 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti let pollingId; /** - * @param {function(Function, Function): void} fallback + * @param {function(Function, Function): Promise} fallback */ - const useFallback = fallback => { - fallback(dispatch, () => { - // eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook - pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000)); - }); + const useFallback = async fallback => { + await fallback(dispatch, getState); + // eslint-disable-next-line react-hooks/rules-of-hooks -- this is not a react hook + pollingId = setTimeout(() => useFallback(fallback), 20000 + randomUpTo(20000)); }; return { @@ -98,10 +98,21 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti case 'delete': dispatch(deleteFromTimelines(data.payload)); break; - case 'notification': + case 'notification': { // @ts-expect-error - dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); + const notificationJSON = JSON.parse(data.payload); + dispatch(updateNotifications(notificationJSON, messages, locale)); + // TODO: remove this once the groups feature replaces the previous one + dispatch(processNewNotificationForGroups(notificationJSON)); break; + } + case 'notifications_merged': { + const state = getState(); + if (state.notifications.top || !state.notifications.mounted) + dispatch(expandNotifications({ forceLoad: true, maxId: undefined })); + dispatch(refreshStaleNotificationGroups()); + break; + } case 'conversation': // @ts-expect-error dispatch(updateConversations(JSON.parse(data.payload))); @@ -125,21 +136,24 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti /** * @param {Function} dispatch - * @param {function(): void} done */ -const refreshHomeTimelineAndNotification = (dispatch, done) => { - // @ts-expect-error - dispatch(expandHomeTimeline({}, () => - // @ts-expect-error - dispatch(expandNotifications({}, () => - dispatch(fetchAnnouncements(done)))))); -}; +async function refreshHomeTimelineAndNotification(dispatch) { + await dispatch(expandHomeTimeline({ maxId: undefined })); + + // TODO: polling for merged notifications + try { + await dispatch(pollRecentGroupNotifications()); + } catch { + // TODO + } + + await dispatch(fetchAnnouncements()); +} /** * @returns {function(): void} */ export const connectUserStream = () => - // @ts-expect-error connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps }); /** diff --git a/app/javascript/flavours/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js index eb5050f1524f0a..1d5a696c92da5b 100644 --- a/app/javascript/flavours/glitch/actions/timelines.js +++ b/app/javascript/flavours/glitch/actions/timelines.js @@ -87,21 +87,18 @@ export function clearTimeline(timeline) { }; } -const noOp = () => {}; - const parseTags = (tags = {}, mode) => { return (tags[mode] || []).map((tag) => { return tag.value; }); }; -export function expandTimeline(timelineId, path, params = {}, done = noOp) { - return (dispatch, getState) => { +export function expandTimeline(timelineId, path, params = {}) { + return async (dispatch, getState) => { const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); const isLoadingMore = !!params.max_id; if (timeline.get('isLoading')) { - done(); return; } @@ -120,7 +117,8 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { dispatch(expandTimelineRequest(timelineId, isLoadingMore)); - api().get(path, { params }).then(response => { + try { + const response = await api().get(path, { params }); const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); @@ -138,53 +136,49 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { if (timelineId === 'home') { dispatch(submitMarkers()); } - }).catch(error => { + } catch(error) { dispatch(expandTimelineFail(timelineId, error, isLoadingMore)); - }).finally(() => { - done(); - }); + } }; } -export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) { - return (dispatch, getState) => { +export function fillTimelineGaps(timelineId, path, params = {}) { + return async (dispatch, getState) => { const timeline = getState().getIn(['timelines', timelineId], ImmutableMap()); const items = timeline.get('items'); const nullIndexes = items.map((statusId, index) => statusId === null ? index : null); const gaps = nullIndexes.map(index => index > 0 ? items.get(index - 1) : null); // Only expand at most two gaps to avoid doing too many requests - done = gaps.take(2).reduce((done, maxId) => { - return (() => dispatch(expandTimeline(timelineId, path, { ...params, maxId }, done))); - }, done); - - done(); + for (const maxId of gaps.take(2)) { + await dispatch(expandTimeline(timelineId, path, { ...params, maxId })); + } }; } -export const expandHomeTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }, done); -export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => expandTimeline(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, allow_local_only: !!allowLocalOnly, max_id: maxId, only_media: !!onlyMedia }, done); -export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noOp) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }, done); -export const expandDirectTimeline = ({ maxId } = {}, done = noOp) => expandTimeline('direct', '/api/v1/timelines/direct', { max_id: maxId }, done); +export const expandHomeTimeline = ({ maxId } = {}) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }); +export const expandPublicTimeline = ({ maxId, onlyMedia, onlyRemote, allowLocalOnly } = {}) => expandTimeline(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, allow_local_only: !!allowLocalOnly, max_id: maxId, only_media: !!onlyMedia }); +export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}) => expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, max_id: maxId, only_media: !!onlyMedia }); +export const expandDirectTimeline = ({ maxId } = {}) => expandTimeline('direct', '/api/v1/timelines/direct', { max_id: maxId }); export const expandAccountTimeline = (accountId, { maxId, withReplies, tagged } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, exclude_reblogs: withReplies, tagged, max_id: maxId }); export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); -export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); -export const expandLinkTimeline = (url, { maxId } = {}, done = noOp) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }, done); -export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => { +export const expandListTimeline = (id, { maxId } = {}) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }); +export const expandLinkTimeline = (url, { maxId } = {}) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }); +export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}) => { return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { max_id: maxId, any: parseTags(tags, 'any'), all: parseTags(tags, 'all'), none: parseTags(tags, 'none'), local: local, - }, done); + }); }; -export const fillHomeTimelineGaps = (done = noOp) => fillTimelineGaps('home', '/api/v1/timelines/home', {}, done); -export const fillPublicTimelineGaps = ({ onlyMedia, onlyRemote, allowLocalOnly } = {}, done = noOp) => fillTimelineGaps(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, only_media: !!onlyMedia, allow_local_only: !!allowLocalOnly }, done); -export const fillCommunityTimelineGaps = ({ onlyMedia } = {}, done = noOp) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia }, done); -export const fillListTimelineGaps = (id, done = noOp) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {}, done); +export const fillHomeTimelineGaps = () => fillTimelineGaps('home', '/api/v1/timelines/home', {}); +export const fillPublicTimelineGaps = ({ onlyMedia, onlyRemote, allowLocalOnly } = {}) => fillTimelineGaps(`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { remote: !!onlyRemote, only_media: !!onlyMedia, allow_local_only: !!allowLocalOnly }); +export const fillCommunityTimelineGaps = ({ onlyMedia } = {}) => fillTimelineGaps(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', { local: true, only_media: !!onlyMedia }); +export const fillListTimelineGaps = (id) => fillTimelineGaps(`list:${id}`, `/api/v1/timelines/list/${id}`, {}); export function expandTimelineRequest(timeline, isLoadingMore) { return { diff --git a/app/javascript/flavours/glitch/api.ts b/app/javascript/flavours/glitch/api.ts index 24672290c74f94..51cbe0b6954e09 100644 --- a/app/javascript/flavours/glitch/api.ts +++ b/app/javascript/flavours/glitch/api.ts @@ -42,6 +42,9 @@ const authorizationTokenFromInitialState = (): RawAxiosRequestHeaders => { // eslint-disable-next-line import/no-default-export export default function api(withAuthorization = true) { return axios.create({ + transitional: { + clarifyTimeoutError: true, + }, headers: { ...csrfHeader, ...(withAuthorization ? authorizationTokenFromInitialState() : {}), @@ -67,6 +70,7 @@ export async function apiRequest( args: { params?: RequestParamsOrData; data?: RequestParamsOrData; + timeout?: number; } = {}, ) { const { data } = await api().request({ diff --git a/app/javascript/flavours/glitch/api/notification_policies.ts b/app/javascript/flavours/glitch/api/notification_policies.ts index e52ea64f4142d8..48b78f96fc8333 100644 --- a/app/javascript/flavours/glitch/api/notification_policies.ts +++ b/app/javascript/flavours/glitch/api/notification_policies.ts @@ -2,8 +2,8 @@ import { apiRequestGet, apiRequestPut } from 'flavours/glitch/api'; import type { NotificationPolicyJSON } from 'flavours/glitch/api_types/notification_policies'; export const apiGetNotificationPolicy = () => - apiRequestGet('/v1/notifications/policy'); + apiRequestGet('v2/notifications/policy'); export const apiUpdateNotificationsPolicy = ( policy: Partial, -) => apiRequestPut('/v1/notifications/policy', policy); +) => apiRequestPut('v2/notifications/policy', policy); diff --git a/app/javascript/flavours/glitch/api/notifications.ts b/app/javascript/flavours/glitch/api/notifications.ts new file mode 100644 index 00000000000000..9453f545e61c5d --- /dev/null +++ b/app/javascript/flavours/glitch/api/notifications.ts @@ -0,0 +1,96 @@ +import api, { + apiRequest, + getLinks, + apiRequestGet, + apiRequestPost, +} from 'flavours/glitch/api'; +import type { + ApiNotificationGroupsResultJSON, + ApiNotificationRequestJSON, + ApiNotificationJSON, +} from 'flavours/glitch/api_types/notifications'; + +export const apiFetchNotifications = async ( + params?: { + account_id?: string; + since_id?: string; + }, + url?: string, +) => { + const response = await api().request({ + method: 'GET', + url: url ?? '/api/v1/notifications', + params, + }); + + return { + notifications: response.data, + links: getLinks(response), + }; +}; + +export const apiFetchNotificationGroups = async (params?: { + url?: string; + grouped_types?: string[]; + exclude_types?: string[]; + max_id?: string; + since_id?: string; +}) => { + const response = await api().request({ + method: 'GET', + url: '/api/v2/notifications', + params, + }); + + const { statuses, accounts, notification_groups } = response.data; + + return { + statuses, + accounts, + notifications: notification_groups, + links: getLinks(response), + }; +}; + +export const apiClearNotifications = () => + apiRequest('POST', 'v1/notifications/clear'); + +export const apiFetchNotificationRequests = async ( + params?: { + since_id?: string; + }, + url?: string, +) => { + const response = await api().request({ + method: 'GET', + url: url ?? '/api/v1/notifications/requests', + params, + }); + + return { + requests: response.data, + links: getLinks(response), + }; +}; + +export const apiFetchNotificationRequest = async (id: string) => { + return apiRequestGet( + `v1/notifications/requests/${id}`, + ); +}; + +export const apiAcceptNotificationRequest = async (id: string) => { + return apiRequestPost(`v1/notifications/requests/${id}/accept`); +}; + +export const apiDismissNotificationRequest = async (id: string) => { + return apiRequestPost(`v1/notifications/requests/${id}/dismiss`); +}; + +export const apiAcceptNotificationRequests = async (id: string[]) => { + return apiRequestPost('v1/notifications/requests/accept', { id }); +}; + +export const apiDismissNotificationRequests = async (id: string[]) => { + return apiRequestPost('v1/notifications/requests/dismiss', { id }); +}; diff --git a/app/javascript/flavours/glitch/api_types/accounts.ts b/app/javascript/flavours/glitch/api_types/accounts.ts index 5bf3e64288c76e..fdbd7523fc15cd 100644 --- a/app/javascript/flavours/glitch/api_types/accounts.ts +++ b/app/javascript/flavours/glitch/api_types/accounts.ts @@ -13,7 +13,7 @@ export interface ApiAccountRoleJSON { } // See app/serializers/rest/account_serializer.rb -export interface ApiAccountJSON { +export interface BaseApiAccountJSON { acct: string; avatar: string; avatar_static: string; @@ -45,3 +45,12 @@ export interface ApiAccountJSON { memorial?: boolean; hide_collections: boolean; } + +// See app/serializers/rest/muted_account_serializer.rb +export interface ApiMutedAccountJSON extends BaseApiAccountJSON { + mute_expires_at?: string | null; +} + +// For now, we have the same type representing both `Account` and `MutedAccount` +// objects, but we should refactor this in the future. +export type ApiAccountJSON = ApiMutedAccountJSON; diff --git a/app/javascript/flavours/glitch/api_types/notification_policies.ts b/app/javascript/flavours/glitch/api_types/notification_policies.ts index 0f4a2d132e0e0e..1c3970782cb464 100644 --- a/app/javascript/flavours/glitch/api_types/notification_policies.ts +++ b/app/javascript/flavours/glitch/api_types/notification_policies.ts @@ -1,10 +1,13 @@ // See app/serializers/rest/notification_policy_serializer.rb +export type NotificationPolicyValue = 'accept' | 'filter' | 'drop'; + export interface NotificationPolicyJSON { - filter_not_following: boolean; - filter_not_followers: boolean; - filter_new_accounts: boolean; - filter_private_mentions: boolean; + for_not_following: NotificationPolicyValue; + for_not_followers: NotificationPolicyValue; + for_new_accounts: NotificationPolicyValue; + for_private_mentions: NotificationPolicyValue; + for_limited_accounts: NotificationPolicyValue; summary: { pending_requests_count: number; pending_notifications_count: number; diff --git a/app/javascript/flavours/glitch/api_types/notifications.ts b/app/javascript/flavours/glitch/api_types/notifications.ts new file mode 100644 index 00000000000000..17c2ede32bd86e --- /dev/null +++ b/app/javascript/flavours/glitch/api_types/notifications.ts @@ -0,0 +1,160 @@ +// See app/serializers/rest/notification_group_serializer.rb + +import type { AccountWarningAction } from 'flavours/glitch/models/notification_group'; + +import type { ApiAccountJSON } from './accounts'; +import type { ApiReportJSON } from './reports'; +import type { ApiStatusJSON } from './statuses'; + +// See app/model/notification.rb +export const allNotificationTypes = [ + 'follow', + 'follow_request', + 'favourite', + 'reblog', + 'mention', + 'poll', + 'status', + 'update', + 'admin.sign_up', + 'admin.report', + 'moderation_warning', + 'severed_relationships', +]; + +export type NotificationWithStatusType = + | 'favourite' + | 'reblog' + | 'status' + | 'mention' + | 'poll' + | 'update'; + +export type NotificationType = + | NotificationWithStatusType + | 'follow' + | 'follow_request' + | 'moderation_warning' + | 'severed_relationships' + | 'admin.sign_up' + | 'admin.report'; + +export interface BaseNotificationJSON { + id: string; + type: NotificationType; + created_at: string; + group_key: string; + account: ApiAccountJSON; +} + +export interface BaseNotificationGroupJSON { + group_key: string; + notifications_count: number; + type: NotificationType; + sample_account_ids: string[]; + latest_page_notification_at: string; // FIXME: This will only be present if the notification group is returned in a paginated list, not requested directly + most_recent_notification_id: string; + page_min_id?: string; + page_max_id?: string; +} + +interface NotificationGroupWithStatusJSON extends BaseNotificationGroupJSON { + type: NotificationWithStatusType; + status_id: string | null; +} + +interface NotificationWithStatusJSON extends BaseNotificationJSON { + type: NotificationWithStatusType; + status: ApiStatusJSON | null; +} + +interface ReportNotificationGroupJSON extends BaseNotificationGroupJSON { + type: 'admin.report'; + report: ApiReportJSON; +} + +interface ReportNotificationJSON extends BaseNotificationJSON { + type: 'admin.report'; + report: ApiReportJSON; +} + +type SimpleNotificationTypes = 'follow' | 'follow_request' | 'admin.sign_up'; +interface SimpleNotificationGroupJSON extends BaseNotificationGroupJSON { + type: SimpleNotificationTypes; +} + +interface SimpleNotificationJSON extends BaseNotificationJSON { + type: SimpleNotificationTypes; +} + +export interface ApiAccountWarningJSON { + id: string; + action: AccountWarningAction; + text: string; + status_ids: string[]; + created_at: string; + target_account: ApiAccountJSON; + appeal: unknown; +} + +interface ModerationWarningNotificationGroupJSON + extends BaseNotificationGroupJSON { + type: 'moderation_warning'; + moderation_warning: ApiAccountWarningJSON; +} + +interface ModerationWarningNotificationJSON extends BaseNotificationJSON { + type: 'moderation_warning'; + moderation_warning: ApiAccountWarningJSON; +} + +export interface ApiAccountRelationshipSeveranceEventJSON { + id: string; + type: 'account_suspension' | 'domain_block' | 'user_domain_block'; + purged: boolean; + target_name: string; + followers_count: number; + following_count: number; + created_at: string; +} + +interface AccountRelationshipSeveranceNotificationGroupJSON + extends BaseNotificationGroupJSON { + type: 'severed_relationships'; + event: ApiAccountRelationshipSeveranceEventJSON; +} + +interface AccountRelationshipSeveranceNotificationJSON + extends BaseNotificationJSON { + type: 'severed_relationships'; + event: ApiAccountRelationshipSeveranceEventJSON; +} + +export type ApiNotificationJSON = + | SimpleNotificationJSON + | ReportNotificationJSON + | AccountRelationshipSeveranceNotificationJSON + | NotificationWithStatusJSON + | ModerationWarningNotificationJSON; + +export type ApiNotificationGroupJSON = + | SimpleNotificationGroupJSON + | ReportNotificationGroupJSON + | AccountRelationshipSeveranceNotificationGroupJSON + | NotificationGroupWithStatusJSON + | ModerationWarningNotificationGroupJSON; + +export interface ApiNotificationGroupsResultJSON { + accounts: ApiAccountJSON[]; + statuses: ApiStatusJSON[]; + notification_groups: ApiNotificationGroupJSON[]; +} + +export interface ApiNotificationRequestJSON { + id: string; + created_at: string; + updated_at: string; + notifications_count: string; + account: ApiAccountJSON; + last_status?: ApiStatusJSON; +} diff --git a/app/javascript/flavours/glitch/api_types/reports.ts b/app/javascript/flavours/glitch/api_types/reports.ts new file mode 100644 index 00000000000000..b11cfdd2eb59c8 --- /dev/null +++ b/app/javascript/flavours/glitch/api_types/reports.ts @@ -0,0 +1,16 @@ +import type { ApiAccountJSON } from './accounts'; + +export type ReportCategory = 'other' | 'spam' | 'legal' | 'violation'; + +export interface ApiReportJSON { + id: string; + action_taken: unknown; + action_taken_at: unknown; + category: ReportCategory; + comment: string; + forwarded: boolean; + created_at: string; + status_ids: string[]; + rule_ids: string[]; + target_account: ApiAccountJSON; +} diff --git a/app/javascript/flavours/glitch/api_types/statuses.ts b/app/javascript/flavours/glitch/api_types/statuses.ts index 9de86e7fa686fe..c84ecc7afc4266 100644 --- a/app/javascript/flavours/glitch/api_types/statuses.ts +++ b/app/javascript/flavours/glitch/api_types/statuses.ts @@ -58,6 +58,29 @@ export interface ApiPreviewCardJSON { authors: ApiPreviewCardAuthorJSON[]; } +export type FilterContext = + | 'home' + | 'notifications' + | 'public' + | 'thread' + | 'account'; + +export interface ApiFilterJSON { + id: string; + title: string; + context: FilterContext; + expires_at: string; + filter_action: 'warn' | 'hide'; + keywords?: unknown[]; // TODO: FilterKeywordSerializer + statuses?: unknown[]; // TODO: FilterStatusSerializer +} + +export interface ApiFilterResultJSON { + filter: ApiFilterJSON; + keyword_matches: string[]; + status_matches: string[]; +} + export interface ApiStatusJSON { id: string; created_at: string; @@ -80,8 +103,7 @@ export interface ApiStatusJSON { bookmarked?: boolean; pinned?: boolean; - // filtered: FilterResult[] - filtered: unknown; // TODO + filtered?: ApiFilterResultJSON[]; content?: string; text?: string; diff --git a/app/javascript/flavours/glitch/common.js b/app/javascript/flavours/glitch/common.js index 1bcb1d00f1b87e..71f45dbf3bfe6a 100644 --- a/app/javascript/flavours/glitch/common.js +++ b/app/javascript/flavours/glitch/common.js @@ -1,12 +1,11 @@ import Rails from '@rails/ujs'; -import 'font-awesome/css/font-awesome.css'; export function start() { require.context('@/images/', true, /\.(jpg|png|svg)$/); try { Rails.start(); - } catch (e) { + } catch { // If called twice } } diff --git a/app/javascript/flavours/glitch/components/account.jsx b/app/javascript/flavours/glitch/components/account.jsx index 038009cfa86e5a..29ffc60c6bacd5 100644 --- a/app/javascript/flavours/glitch/components/account.jsx +++ b/app/javascript/flavours/glitch/components/account.jsx @@ -106,7 +106,7 @@ const Account = ({ size = 46, account, onFollow, onBlock, onMute, onMuteNotifica ); } else if (defaultAction === 'mute') { - buttons = + + + {({ props }) => ( +
+
+

+ +

+

{description}

+
+
+ )} +
+ + ); +}; diff --git a/app/javascript/flavours/glitch/components/avatar.tsx b/app/javascript/flavours/glitch/components/avatar.tsx index c45c26981f8089..bb146f0edbd0f7 100644 --- a/app/javascript/flavours/glitch/components/avatar.tsx +++ b/app/javascript/flavours/glitch/components/avatar.tsx @@ -1,16 +1,19 @@ +import { useState, useCallback } from 'react'; + import classNames from 'classnames'; +import { useHovering } from 'flavours/glitch/hooks/useHovering'; +import { autoPlayGif } from 'flavours/glitch/initial_state'; import type { Account } from 'flavours/glitch/models/account'; -import { useHovering } from '../hooks/useHovering'; -import { autoPlayGif } from '../initial_state'; - interface Props { account: Account | undefined; // FIXME: remove `undefined` once we know for sure its always there size: number; style?: React.CSSProperties; inline?: boolean; animate?: boolean; + counter?: number | string; + counterBorderColor?: string; } export const Avatar: React.FC = ({ @@ -19,8 +22,12 @@ export const Avatar: React.FC = ({ size = 20, inline = false, style: styleFromParent, + counter, + counterBorderColor, }) => { const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); const style = { ...styleFromParent, @@ -33,17 +40,37 @@ export const Avatar: React.FC = ({ ? account?.get('avatar') : account?.get('avatar_static'); + const handleLoad = useCallback(() => { + setLoading(false); + }, [setLoading]); + + const handleError = useCallback(() => { + setError(true); + }, [setError]); + return (
- {src && {account?.get('acct')}} + {src && !error && ( + + )} + + {counter && ( +
+ {counter} +
+ )}
); }; diff --git a/app/javascript/flavours/glitch/components/button.tsx b/app/javascript/flavours/glitch/components/button.tsx index c76aaea42f26fc..3e720f7ceead2a 100644 --- a/app/javascript/flavours/glitch/components/button.tsx +++ b/app/javascript/flavours/glitch/components/button.tsx @@ -7,6 +7,7 @@ interface BaseProps extends Omit, 'children'> { block?: boolean; secondary?: boolean; + dangerous?: boolean; } interface PropsChildren extends PropsWithChildren { @@ -26,6 +27,7 @@ export const Button: React.FC = ({ disabled, block, secondary, + dangerous, className, title, text, @@ -46,6 +48,7 @@ export const Button: React.FC = ({ className={classNames('button', className, { 'button-secondary': secondary, 'button--block': block, + 'button--dangerous': dangerous, })} disabled={disabled} onClick={handleClick} diff --git a/app/javascript/flavours/glitch/components/check_box.tsx b/app/javascript/flavours/glitch/components/check_box.tsx index 7da8ef0ac5602d..9bd137abf57cce 100644 --- a/app/javascript/flavours/glitch/components/check_box.tsx +++ b/app/javascript/flavours/glitch/components/check_box.tsx @@ -1,5 +1,6 @@ import classNames from 'classnames'; +import CheckIndeterminateSmallIcon from '@/material-icons/400-24px/check_indeterminate_small.svg?react'; import DoneIcon from '@/material-icons/400-24px/done.svg?react'; import { Icon } from './icon'; @@ -7,6 +8,7 @@ import { Icon } from './icon'; interface Props { value: string; checked: boolean; + indeterminate: boolean; name: string; onChange: (event: React.ChangeEvent) => void; label: React.ReactNode; @@ -16,6 +18,7 @@ export const CheckBox: React.FC = ({ name, value, checked, + indeterminate, onChange, label, }) => { @@ -29,8 +32,14 @@ export const CheckBox: React.FC = ({ onChange={onChange} /> - - {checked && } + + {indeterminate ? ( + + ) : ( + checked && + )} {label} diff --git a/app/javascript/flavours/glitch/components/content_warning.tsx b/app/javascript/flavours/glitch/components/content_warning.tsx new file mode 100644 index 00000000000000..82f9ca83ed4907 --- /dev/null +++ b/app/javascript/flavours/glitch/components/content_warning.tsx @@ -0,0 +1,27 @@ +/* Significantly rewritten from upstream to keep the old design for now */ + +import { FormattedMessage } from 'react-intl'; + +export const ContentWarning: React.FC<{ + text: string; + expanded?: boolean; + onClick?: () => void; + icons?: React.ReactNode[]; +}> = ({ text, expanded, onClick, icons }) => ( +

+ {' '} + +

+); diff --git a/app/javascript/flavours/glitch/components/copy_paste_text.tsx b/app/javascript/flavours/glitch/components/copy_paste_text.tsx new file mode 100644 index 00000000000000..053654b6e0f561 --- /dev/null +++ b/app/javascript/flavours/glitch/components/copy_paste_text.tsx @@ -0,0 +1,90 @@ +import { useRef, useState, useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; + +import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react'; +import { Icon } from 'flavours/glitch/components/icon'; +import { useTimeout } from 'flavours/glitch/hooks/useTimeout'; + +export const CopyPasteText: React.FC<{ value: string }> = ({ value }) => { + const inputRef = useRef(null); + const [copied, setCopied] = useState(false); + const [focused, setFocused] = useState(false); + const [setAnimationTimeout] = useTimeout(); + + const handleInputClick = useCallback(() => { + setCopied(false); + + if (inputRef.current) { + inputRef.current.focus(); + inputRef.current.select(); + inputRef.current.setSelectionRange(0, value.length); + } + }, [setCopied, value]); + + const handleButtonClick = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + void navigator.clipboard.writeText(value); + inputRef.current?.blur(); + setCopied(true); + setAnimationTimeout(() => { + setCopied(false); + }, 700); + }, + [setCopied, setAnimationTimeout, value], + ); + + const handleKeyUp = useCallback( + (e: React.KeyboardEvent) => { + if (e.key !== ' ') return; + void navigator.clipboard.writeText(value); + setCopied(true); + setAnimationTimeout(() => { + setCopied(false); + }, 700); + }, + [setCopied, setAnimationTimeout, value], + ); + + const handleFocus = useCallback(() => { + setFocused(true); + }, [setFocused]); + + const handleBlur = useCallback(() => { + setFocused(false); + }, [setFocused]); + + return ( +
+