Compare commits

...

316 Commits

Author SHA1 Message Date
dependabot[bot]
d84ecc1707 Bump browserify-sign from 4.2.1 to 4.2.2
Bumps [browserify-sign](https://github.com/crypto-browserify/browserify-sign) from 4.2.1 to 4.2.2.
- [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md)
- [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.2.1...v4.2.2)

---
updated-dependencies:
- dependency-name: browserify-sign
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-27 15:45:53 +00:00
Claire
59893a4eab Merge pull request #2449 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 9a3d047f3e
2023-10-27 17:45:19 +02:00
Claire
36c8570e50 Fix HAML linting issue 2023-10-25 20:01:51 +02:00
Claire
62620956d5 Merge commit '9a3d047f3e604e581e18346424569e28fc9c5b96' into glitch-soc/merge-upstream 2023-10-25 19:59:17 +02:00
Matt Jankowski
9a3d047f3e Run bin/rails app:update with Rails 7.1 (#27522) 2023-10-25 13:56:09 +00:00
Claire
235a4cfdc8 Fix batch attachment deletion when using OpenStack Swift (#27554) 2023-10-25 13:55:57 +00:00
Renaud Chaput
a4e6fe36cb Add missing ban icons (#27555) 2023-10-25 12:47:37 +00:00
Matt Jankowski
70dbf84b9b Solve simplest haml-lint Rubocop lints (#27529) 2023-10-25 12:38:01 +00:00
Claire
fa65c8244f Fix cache store pool config deprecation warnings (#27551) 2023-10-25 12:01:21 +00:00
Matt Jankowski
c926f5fd67 Fix haml-lint UnnecessaryStringOutput for views (#27531) 2023-10-25 12:01:00 +00:00
Renaud Chaput
85d4846d8a [Glitch] Fix <ColumnBackButtonSlim>
Port cb92cdf9af to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-25 12:22:59 +02:00
Claire
6e9f89e5b6 Merge commit 'c85e0a6b047f1a72ad970bc04c4e1be3f028b3d1' into glitch-soc/merge-upstream
Conflicts:
- `app/javascript/packs/admin.jsx`:
  Upstream fixed `@rails/ujs` imports.
  Already taken care of in 8a131fb7bc
- `app/javascript/packs/public.jsx`:
  Upstream fixed `@rails/ujs` imports.
  Already taken care of in 8a131fb7bc
2023-10-25 12:18:45 +02:00
Claire
ba527c071f Merge commit '134de736dcbc6aa613fd5aec21d983d92d8b0be8' into glitch-soc/merge-upstream
Conflicts:
- `app/javascript/mastodon/features/compose/components/poll_form.jsx`:
  Upstream changed how icons are handled, including on a line modified by
  glitch-soc to bump the number of poll options.
  Applied upstream's change, while keeping the increased number of poll
  options.
2023-10-25 12:14:24 +02:00
github-actions[bot]
c85e0a6b04 New Crowdin Translations (automated) (#27544)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-25 07:36:07 +00:00
renovate[bot]
f261b6499f Update dependency node to 20.9 (#27534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-25 07:16:19 +00:00
Matt Jankowski
cec7f0ed72 Remove unused #error_explanation id from error partials (#27536) 2023-10-25 07:12:32 +00:00
Renaud Chaput
cb92cdf9af Fix <ColumnBackButtonSlim> (#27540) 2023-10-24 20:43:55 +00:00
Renaud Chaput
f08ca3f042 Fix missing icon props (#27539) 2023-10-24 20:43:06 +00:00
Matt Jankowski
bc3afb6311 Update rails/ujs delegate method usage (#27538) 2023-10-24 20:38:19 +00:00
Claire
b19d4eb43d Fix HAML linting issues 2023-10-24 20:53:58 +02:00
Claire
8123e86623 [Glitch] Fix double scroll bars in some columns in advanced interface
Port 37bbd3c106 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 20:46:11 +02:00
Claire
b73e4b59fc [Glitch] Fix history handling not properly handling states after update to react-router v5
Port 15182d1e5e to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 20:34:30 +02:00
たいち ひ
c6f990997d [Glitch] Rewrite emoji_unicode_mapping_light to TS
Port 9482810703 to glitch-soc

Co-authored-by: taichi.fukuda ひ <taichi.fukuda@systemi.co.jp>
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 20:33:55 +02:00
Claire
4ef66d6538 Merge commit '15182d1e5e595b21c47b48c5d258f30a0251e753' into glitch-soc/merge-upstream
Conflicts:
- `.rubocop_todo.yml`:
  glitch-soc had extra ignores.
  Removed them.
2023-10-24 20:31:20 +02:00
Claire
3c9c0299c0 Fix ActiveRecord::Migrator monkey-patch 2023-10-24 20:23:46 +02:00
Claire
8a131fb7bc Fix @rails/ujs imports 2023-10-24 20:23:31 +02:00
Claire
4b0fb764c3 Merge commit 'e93a75f1a11d6dfdcbd39dbdc22526c5508ad881' into glitch-soc/merge-upstream
Conflicts and ported changes:
- updated `@rails/ujs` imports
2023-10-24 19:59:19 +02:00
Eugen Rochko
134de736dc Change icons in web UI (#27385)
Co-authored-by: Renaud Chaput <renchap@gmail.com>
2023-10-24 17:45:08 +00:00
Michael Stanclift
b1885387b6 Fix missing libyaml-dev dependency in Dockerfile (#27533) 2023-10-24 17:32:10 +00:00
Claire
e25cc4deb7 Merge commit '379115e601361c2b5da775fbf28b7dff9dc02e71' into glitch-soc/merge-upstream
Conflicts:
- `config/navigation.rb`:
  Conflict due to glitch-soc having extra navigation items for its theming
  system.
  Ported upstream changes.
2023-10-24 19:31:14 +02:00
Eugen Rochko
69ea596e55 [Glitch] Fix explore page reloading when you navigate back to it in web UI
Port d9503a1965 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 19:22:39 +02:00
Claire
e6c3d3c744 Merge commit 'd9503a1965a16328b62ea7bf0bb54e87cbe30d29' into glitch-soc/merge-upstream 2023-10-24 19:21:01 +02:00
Claire
79c154f602 Merge commit 'fc7734df8d8d53639bf244a2f2f3c39bc2fd12a7' into glitch-soc/merge-upstream 2023-10-24 19:20:14 +02:00
Claire
57c0de949b Merge commit '8b770ce8110e6cd609a6769c66210d95e291e3e5' into glitch-soc/merge-upstream
Conflicts:
- `config/initializers/content_security_policy.rb`:
  Upstream changed how asset host CSP directives are used, and glitch-soc has
  a pretty different CSP file.
  It may be worth reconsidering the differences between upstream and glitch-soc
  but for now, just port the change.
2023-10-24 19:17:20 +02:00
Claire
787d5ad386 Merge commit 'bcae7442757845191c0e82b61cd1d0cd3ca860d1' into glitch-soc/merge-upstream
Conflicts:
- `yarn.lock`:
  Caused by a glitch-soc-only dependency (`exif-js`).
  Kept it.
2023-10-24 19:05:18 +02:00
Claire
5323f0eeca [Glitch] Fix incorrect proptypes from react-router-v5 update
Port 0ad66175bf to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 19:03:16 +02:00
Renaud Chaput
9325cb5759 [Glitch] Convert <Button> to Typescript
Port 9d45a444f9 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 19:03:16 +02:00
Eugen Rochko
1138d44c7d [Glitch] Fix missing background behind dismissable banner in web UI
Port 33bd8eccd5 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-24 18:46:08 +02:00
Claire
b0c76eaadd Merge commit '0ad66175bf59a34b03d9ab2347181548d07089ea' into glitch-soc/merge-upstream
Conflicts:
- `app/javascript/mastodon/features/compose/components/compose_form.jsx`:
  Upstream changed one import, close to a glitch-soc-only import to handle
  different max character counts.
  Ported upstream's change.
2023-10-24 18:41:20 +02:00
Claire
15182d1e5e Fix history handling not properly handling states after update to react-router v5 (#27526) 2023-10-24 13:24:57 +00:00
Renaud Chaput
6cf9f1211b Create custom Github Actions for common steps (#27518) 2023-10-24 11:43:24 +00:00
Matt Jankowski
714e3ae5b5 Use Rails 7.1 normalizes feature (#27521) 2023-10-24 10:06:10 +00:00
github-actions[bot]
50b7ea810e New Crowdin Translations (automated) (#27523)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-24 09:51:34 +00:00
Matt Jankowski
e923bb9ec9 Use ENV.fetch in views, fixes rubocop haml-lint issue (#27527) 2023-10-24 09:30:14 +00:00
Matt Jankowski
4fdc548fa5 Regenerate lint todos (#27513) 2023-10-24 08:08:31 +00:00
たいち ひ
9482810703 Rewrite emoji_unicode_mapping_light to TS (#25444)
Co-authored-by: taichi.fukuda ひ <taichi.fukuda@systemi.co.jp>
2023-10-24 08:06:14 +00:00
Matt Jankowski
e93a75f1a1 Rails 7.1 update (#25963) 2023-10-23 17:58:29 +00:00
Claire
379115e601 Add SELF_DESTRUCT env variable to process self-destructions in the background (#26439) 2023-10-23 15:46:21 +00:00
Daniel M Brasil
26d2a2a0cc Migrate to request specs in /api/v1/media (#25543) 2023-10-23 15:46:21 +00:00
Eugen Rochko
d9503a1965 Fix explore page reloading when you navigate back to it in web UI (#27489) 2023-10-23 17:07:13 +02:00
Claire
79a63201a9 Fix Layout/EmptyLineAfterGuardClause issues caused by merging an old PR (#27512) 2023-10-23 16:21:48 +02:00
Renaud Chaput
fc7734df8d Remove Renovate's Lock File Maintenance task (#27510) 2023-10-23 14:38:36 +02:00
Matt Jankowski
3cfdab6b48 Prune the changelog of older entries (#27432) 2023-10-23 14:35:56 +02:00
renovate[bot]
d5408dbb54 Update dependency prom-client to v15 (#27330)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 14:33:17 +02:00
Claire
8b770ce811 Add warnings to report action logs (#27425) 2023-10-23 14:30:46 +02:00
Claire
44edf3aa91 Improve error handling in mastodon:setup task (#21464) 2023-10-23 14:28:32 +02:00
Claire
99f2534cee Add support for displaying unknown servers on /admin/instances/:domain (#27150) 2023-10-23 14:27:57 +02:00
Claire
c3e0eb3699 Change Content-Security-Policy to be tighter on media paths (#26889) 2023-10-23 14:27:07 +02:00
Claire
bcae744275 Fix some link anchors being recognized as hashtags (#27271) 2023-10-23 14:19:38 +02:00
renovate[bot]
53fd28b889 Update dependency react-select to v5.7.7 (#27003)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:45:14 +02:00
renovate[bot]
f7b34707a8 Update babel monorepo to v7.23.2 (#27118)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:36:47 +02:00
renovate[bot]
25751c653e Update DefinitelyTyped types (non-major) (#27414)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:35:54 +02:00
renovate[bot]
132204031f Update dependency core-js to v3.33.1 (#27481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:20:01 +02:00
renovate[bot]
bb5bae186f Update dependency webpack-merge to v5.10.0 (#27420)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:18:16 +02:00
renovate[bot]
69d3318055 Update dependency rimraf to v5.0.5 (#27140)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:16:02 +02:00
renovate[bot]
cd08b436ab Update dependency sass to v1.69.4 (#27004)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:15:31 +02:00
renovate[bot]
6f1eb89d21 Update dependency ws to v8.14.2 (#26980)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:14:16 +02:00
renovate[bot]
6f429d3f1b Update formatjs monorepo (#27416)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:13:12 +02:00
renovate[bot]
773133befa Update eslint (non-major) (#27415)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-23 12:12:17 +02:00
Claire
0ad66175bf Fix incorrect proptypes from react-router-v5 update (#27507) 2023-10-23 11:39:53 +02:00
github-actions[bot]
70fd819935 New Crowdin Translations (automated) (#27490)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-23 10:04:54 +02:00
Matt Jankowski
b0213472df Validate allowed schemes on preview card URLs (#27485) 2023-10-23 09:50:02 +02:00
Renaud Chaput
9d45a444f9 Convert <Button> to Typescript (#27492) 2023-10-23 09:43:00 +02:00
Renaud Chaput
d6eacb79c6 [Glitch] Upgrade to react-router v5
Port 1b70d7ed7c to glitch-soc

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-21 22:14:24 +02:00
Claire
245513d630 Merge commit '1b70d7ed7c0fd3a9fcf028bf76b8c62ac8b3897f' into glitch-soc/merge-upstream 2023-10-21 14:33:33 +02:00
Claire
18eacc7a07 Merge pull request #2447 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 126cd7705d
2023-10-21 14:32:30 +02:00
Matt Jankowski
ab0fb81479 Configure brakeman to ignore url safe preview card urls (#25883) 2023-10-20 15:32:16 +02:00
Claire
13688539bc Fix processing LDSigned activities from actors with unknown public keys (#27474) 2023-10-20 10:45:46 +02:00
github-actions[bot]
284c719f64 New Crowdin Translations (automated) (#27480)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-20 10:11:40 +02:00
Eugen Rochko
33bd8eccd5 Fix missing background behind dismissable banner in web UI (#27479) 2023-10-20 04:08:13 +02:00
Renaud Chaput
5d9df170cf [Glitch] Do not display the navigation banner in the logo container
Port 126cd7705d to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-19 20:50:44 +02:00
Claire
cc000c8859 Merge commit '126cd7705dbeca5712da941a72661e26c189658b' into glitch-soc/merge-upstream 2023-10-19 20:48:22 +02:00
Claire
1c53aec00e Merge pull request #2446 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 9f218c9924
2023-10-19 20:47:22 +02:00
Brian Campbell
1a3248dc90 [Glitch] Consider shown and pending status in explore prompt calculation
Port f76e5111f0 to glitch-soc

Co-authored-by: Brian Campbell <brcampbell@beta.team>
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-19 20:23:08 +02:00
Renaud Chaput
41f58e945c [Glitch] The class props should be className
Port 10df97c542 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-19 20:23:08 +02:00
Renaud Chaput
1b70d7ed7c Upgrade to react-router v5 (#25047)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2023-10-19 19:44:55 +02:00
Renaud Chaput
126cd7705d Do not display the navigation banner in the logo container (#27476) 2023-10-19 19:36:08 +02:00
Claire
74fd46d3ab Merge commit '9f218c9924b883207a3463a29314c92032cf06df' into glitch-soc/merge-upstream 2023-10-19 19:14:04 +02:00
Claire
918137babc Merge pull request #2444 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 5ef26d8fd5
2023-10-19 19:12:51 +02:00
Jeong Arm
68401fc426 [Glitch] Support "in:public" search filter
Port ad44d832b8 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-19 18:56:18 +02:00
Matt Jankowski
9f218c9924 Refactor appeal partial to avoid brakeman XSS warning (#25880) 2023-10-19 17:25:54 +02:00
Matt Jankowski
bcd0171e5e Fix Lint/UselessAssignment cop (#27472) 2023-10-19 16:55:06 +02:00
Daniel M Brasil
7bc8f03162 Add test coverage for Mastodon::CLI::Accounts#migrate (#25284) 2023-10-19 16:11:15 +02:00
github-actions[bot]
1ffd5a98a9 New Crowdin Translations (automated) (#27465)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-19 14:31:25 +02:00
Brian Campbell
f76e5111f0 Consider shown and pending status in explore prompt calculation (#27466)
Co-authored-by: Brian Campbell <brcampbell@beta.team>
2023-10-19 14:25:57 +02:00
Renaud Chaput
10df97c542 The class props should be className (#27462) 2023-10-19 13:22:44 +02:00
Claire
510845b6b9 Only enable github-rspec for pull_request events (#27456) 2023-10-18 15:20:24 +02:00
Matt Jankowski
a1b27d8b61 Fix Naming/VariableNumber cop (#27447) 2023-10-18 14:26:22 +02:00
Emelia Smith
7c3fea7275 Feature: Allow token introspection without read scope (#27142) 2023-10-18 14:10:07 +02:00
github-actions[bot]
4612576c68 New Crowdin Translations (automated) (#27454)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-18 11:08:10 +02:00
Matt Jankowski
63a2a4b074 Fix Performance/DeletePrefix cop (#27448) 2023-10-18 10:32:09 +02:00
Daniel M Brasil
091a21e1bc Add test coverage for Mastodon::CLI::Accounts#prune (#25204) 2023-10-18 10:20:50 +02:00
Claire
e9dc30cdba Fix duplicate github annotations for rspec failures (#27450) 2023-10-18 10:18:34 +02:00
Claire
0d18c47c18 Enable scheduled actions only on glitch-soc's repo 2023-10-17 22:03:54 +02:00
Claire
63179f0bf4 Merge commit '5ef26d8fd50081c642b858a82bf0c5431b1c7e83' into glitch-soc/merge-upstream 2023-10-17 21:59:58 +02:00
Stanislas Signoud
8bbbd012d4 [Glitch] Fix missing redirections to make sure /home redirect to the advanced UI
Port 935d54124e to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-17 21:48:36 +02:00
Claire
c10a667ac2 Merge commit '935d54124e80e9fe5365c724e5c8827a2b3ed5b3' into glitch-soc/merge-upstream 2023-10-17 21:42:49 +02:00
Claire
b867d4581e Merge commit 'c91c0175db1cc8b954a977d29472886234ce9586' into glitch-soc/merge-upstream
Conflicts:
- `spec/controllers/api/v1/timelines/tag_controller_spec.rb`:
  Glitch-soc had a few extra lines in this file to account for a different
  default setting. This file got replaced by
  `spec/requests/api/v1/timelines/tag_spec.rb`, into which the glitch-soc
  additions were moved too.

Additional changes:
- `spec/requests/api/v1/statuses/sources_spec.rb`:
  Add glitch-soc-only attribute `content_type`.
2023-10-17 21:35:07 +02:00
Claire
656a41db2a Merge commit '77098c6f1c25958960df98a1510b28352a39704f' into glitch-soc/merge-upstream
Conflicts:
- `README.md`:
  Upstream has updated its README, we have a completely different one.
  Kept ours.
- `app/views/auth/sessions/two_factor.html.haml`:
  Upstream refactored stuff and the conflict is because of glitch-soc's theming
  system.
  Ported upstream changes while accounting for the different theming system.
2023-10-17 20:59:18 +02:00
Nick Schonning
5ef26d8fd5 Add RSpec GitHub annotations gem (#24040) 2023-10-17 18:28:09 +02:00
Matt Jankowski
71447ab19f Fix Capybara/ClickLinkOrButtonStyle cop in spec/features/admin area (#27445) 2023-10-17 16:57:19 +02:00
renovate[bot]
0036de46bc Update dependency rubocop-performance to v1.19.1 (#26949)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-17 16:16:12 +02:00
Jeong Arm
ad44d832b8 Support "in:public" search filter (#26976) 2023-10-17 16:12:03 +02:00
Matt Jankowski
2528a0721f Update rubocop-capybara to version 2.19.0 (#26982) 2023-10-17 16:10:50 +02:00
renovate[bot]
1996fb6fd6 Update dependency puma to v6.4.0 (#27006)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-17 16:10:16 +02:00
Matt Jankowski
65cd0700e4 Refactor domains cli to remove model call from regex (#25878) 2023-10-17 15:58:42 +02:00
Claire
b34a2b1b33 Fix errors in CLI specs (#27399) 2023-10-17 15:30:12 +02:00
Jeong Arm
c0cda1adaf Let use http_hidden_proxy on docker-compose (#27054) 2023-10-17 15:24:45 +02:00
Renaud Chaput
1fb4e40145 Run scheduled actions only on the main repo (#27343) 2023-10-17 14:59:39 +02:00
Stanislas Signoud
935d54124e Fix missing redirections to make sure /home redirect to the advanced UI (#27378) 2023-10-17 14:59:07 +02:00
Victor Lee
c4bddc9855 Add spec for poll model (#23399)
Co-authored-by: Nick Schonning <nschonni@gmail.com>
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2023-10-17 14:56:24 +02:00
Matt Jankowski
12bb7be8b5 Spec speed ups on AccountsController spec (#25391) 2023-10-17 13:32:10 +02:00
Matt Jankowski
d54fec24e5 Add coverage for CLI::PreviewCards#remove command (#27441) 2023-10-17 13:06:16 +02:00
Matt Jankowski
19900f647e Add coverage for UnreservedUsernameValidator (#25590) 2023-10-17 13:05:28 +02:00
Claire
1084703417 Update changelog (#27440) 2023-10-17 13:03:54 +02:00
Matt Jankowski
fc9ab61448 Expand spec coverage of CLI::Media (#27437) 2023-10-16 18:20:58 +02:00
Matt Jankowski
33b073f77d Extract partials from admin/reports/show view (#27427) 2023-10-16 18:07:17 +02:00
Matt Jankowski
8d0f12f776 Extract partials from admin/accounts/show view (#27428) 2023-10-16 18:02:15 +02:00
Matt Jankowski
893b2f33fd Extract shared example for cacheable response in specs (#25388) 2023-10-16 17:52:06 +02:00
Matt Jankowski
708299bb0d Misc coverage improvements for Admin:: and Settings:: controllers (#25346) 2023-10-16 17:20:28 +02:00
Daniel M Brasil
e0ed0f8c7c Migrate to request specs in /api/v1/notifications (#25553) 2023-10-16 17:15:24 +02:00
Matt Jankowski
08a376cbcb Fix Style/CombinableLoops cop (#27429) 2023-10-16 16:36:28 +02:00
Matt Jankowski
c91c0175db Extract card partial from disputes/strikes/show view (#27426) 2023-10-16 16:04:29 +02:00
Daniel M Brasil
cafdaec6cf Migrate to request specs in /api/v1/lists/:id/accounts (#25468) 2023-10-16 16:03:48 +02:00
Daniel M Brasil
8e6116503d Migrate to request specs in /api/v1/blocks (#25517) 2023-10-16 16:03:35 +02:00
Daniel M Brasil
d9caa6ed24 Migrate to request specs in /api/v1/admin/accounts (#25563) 2023-10-16 15:49:12 +02:00
Matt Jankowski
f5bc1f20e2 Add coverage for ExistingUsernameValidator (#25592)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2023-10-16 15:41:23 +02:00
Matt Jankowski
f8afa0f614 Remove unused stub json ld context (#25454) 2023-10-16 15:38:27 +02:00
Matt Jankowski
00e92b4038 Add coverage for CLI::Statuses command (#25321) 2023-10-16 15:37:22 +02:00
Claire
299aa71c8f Fix handling of inLanguage attribute in preview card processing (#27423) 2023-10-16 15:24:14 +02:00
Wladimir Palant
23f8e93c64 Fixes #23135 - Allow cross origin request for /nodeinfo/2.0 API (#27413) 2023-10-16 13:39:25 +02:00
github-actions[bot]
13456efd7b New Crowdin Translations (automated) (#27410)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-16 11:31:52 +02:00
renovate[bot]
a00fc83701 Update dependency bufferutil to v4.0.8 (#27412)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 11:09:20 +02:00
renovate[bot]
f0ef87b84d Update dependency i18n-tasks to v1.0.13 (#27403)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 11:08:13 +02:00
Renaud Chaput
e0da64bb4e Fix empty ENV variables not using default nil value (#27400) 2023-10-13 19:00:53 +02:00
Daniel M Brasil
82beeb2f7e Migrate to request specs in /api/v1/admin/trends/links (#25739) 2023-10-13 16:23:16 +02:00
Matt Jankowski
1b195ce115 Speed-up on Rack::Attack spec (#25542) 2023-10-13 16:14:23 +02:00
Claire
71cfdd7865 Fix duplicate tests (#27395) 2023-10-13 16:10:43 +02:00
Matt Jankowski
cad8cc90ba Speed-up on MoveWorker spec (#25528) 2023-10-13 15:50:46 +02:00
Daniel M Brasil
058f73a4f5 Add request specs for /api/v1/reports (#25475) 2023-10-13 15:30:40 +02:00
Matt Jankowski
abf0e1fa39 Move SignedReqestHelpers rspec config to separate file (#25453) 2023-10-13 15:19:40 +02:00
Daniel M Brasil
bc6cd27d9e Migrate to request specs in /api/v1/followed_tags (#25472) 2023-10-13 14:43:50 +02:00
Matt Jankowski
fd9dea21d0 DB speedup in API:: controller/request specs (#25516) 2023-10-13 14:42:09 +02:00
Daniel M Brasil
ecdb31d479 Migrate to request specs in /api/v1/favourites (#25518) 2023-10-13 14:19:12 +02:00
Daniel M Brasil
7664e3b692 Migrate to request specs in /api/v1/statuses/:status_id/source (#25634) 2023-10-13 14:08:21 +02:00
Daniel M Brasil
4230d1ee0a Migrate to request specs in /api/v1/timelines/tag/:hashtag (#25797) 2023-10-13 14:04:37 +02:00
Renaud Chaput
77098c6f1c Delete .github/FUNDING.yml (#27390) 2023-10-13 12:01:33 +02:00
renovate[bot]
5c287c4958 Update dependency rubocop to v1.57.1 (#27389)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-13 11:46:25 +02:00
KMY(雪あすか)
45bdd60f3c Fix when unfollow a tag, my post also disappears from the home timeline (#27391) 2023-10-13 11:15:47 +02:00
github-actions[bot]
773d25e8df New Crowdin Translations (automated) (#27388)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-13 11:01:40 +02:00
renovate[bot]
6a9aab38d7 Update dependency devise-two-factor to v4.1.1 (#27382)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-13 10:52:55 +02:00
Matt Jankowski
133f218a4d Add system specs for admin area batch actions (#25027) 2023-10-13 10:42:59 +02:00
Claire
c86ad45660 Change PWA start URL from /home to / (#27377) 2023-10-12 16:47:18 +02:00
Claire
45a19ddfe4 Merge pull request #2440 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 27e84c0691
2023-10-12 12:18:43 +02:00
github-actions[bot]
c348b904a5 New Crowdin Translations (automated) (#27376)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-12 10:07:40 +02:00
Matt Jankowski
d4c2dca874 Fix haml-lint InstanceVariables rule for auth/sessions/two_factor/o… (#27372) 2023-10-12 09:44:20 +02:00
renovate[bot]
85b36fbbd3 Update dependency devise to v4.9.3 (#27373)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-12 09:35:25 +02:00
Matt Jankowski
d7a8f6b658 Fix haml-lint InstanceVariables rule for relationships/account (#27342) 2023-10-11 17:06:26 +02:00
github-actions[bot]
f1ae72ba46 New Crowdin Translations (automated) (#27364)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-11 16:37:01 +02:00
renovate[bot]
d0a3331caa Update dependency rubocop to v1.57.0 (#27371)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-11 16:36:50 +02:00
François Hodierne
608cd66239 Update README requirements from node 14 to node 16 (#27369) 2023-10-11 16:24:28 +02:00
renovate[bot]
1afb7f4104 Update dependency lograge to v0.14.0 (#27363)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-11 16:21:59 +02:00
Matt Jankowski
f9abe700e7 Fix haml-lint InstanceVariables rule for auth/registrations/status (#27341) 2023-10-11 16:20:26 +02:00
renovate[bot]
0111e48893 Update dependency sidekiq to v6.5.12 (#27358)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-11 16:02:51 +02:00
Matt Jankowski
66becf9a1e Fix haml-lint InstanceVariables rule for admin/reports/actions (#27339) 2023-10-11 15:58:33 +02:00
Claire
7d2cd7195b Add variable delay before link verification of remote account links (#27351) 2023-10-11 15:14:18 +02:00
Claire
99c72830bc [Glitch] Fix scroll position in thread view reseting when closing a modal
Port 9d1c3d0678 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-10 19:53:59 +02:00
Claire
3735e6f79d Merge commit '27e84c069112a3d2abfad947642457cc997a261a' into glitch-soc/merge-upstream 2023-10-10 19:53:41 +02:00
Claire
1a4a23b5c8 Merge pull request #2439 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 4c2aca777f
2023-10-10 19:51:17 +02:00
Claire
27e84c0691 Fix duplicate reports being sent when reporting some remote posts (#27355) 2023-10-10 16:00:50 +02:00
Claire
9d1c3d0678 Fix scroll position in thread view reseting when closing a modal (#27350) 2023-10-10 11:35:32 +02:00
github-actions[bot]
1a2a4c389f New Crowdin Translations (automated) (#27347)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-10 10:06:37 +02:00
renovate[bot]
1745c582f8 Update dependency sidekiq to v6.5.11 (#27345)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-10 09:52:09 +02:00
Claire
05159d2f94 [Glitch] Fix clicking on already-loaded thread scrolling to the top of the thread
Port 4c2aca777f to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-09 21:15:59 +02:00
Claire
8ef1a95b1c Merge commit '4c2aca777f6ae6942d0cf11aee56a925694ccdef' into glitch-soc/merge-upstream 2023-10-09 21:14:57 +02:00
Renaud Chaput
7b325aa81b [Glitch] Autofix missing comma and indentation in JS files
Port 774e1189d2 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-09 21:14:25 +02:00
Claire
4a9cdfb928 Merge commit '774e1189d26fffd914107a4236f6287043c988f8' into glitch-soc/merge-upstream 2023-10-09 21:12:28 +02:00
Claire
b63d526590 [Glitch] Fix clicking on already-opened thread post scrolling to the top of the thread
Port c310374a2f to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-09 21:11:44 +02:00
Claire
3da7afdeed Merge commit 'c310374a2f83a890520ace50e41c1e3d046e15e1' into glitch-soc/merge-upstream 2023-10-09 21:10:47 +02:00
Claire
4c2aca777f Fix clicking on already-loaded thread scrolling to the top of the thread (#27338) 2023-10-09 16:46:09 +02:00
Claire
9af24835f6 Merge pull request #2434 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 640421f661
2023-10-09 15:44:35 +02:00
Renaud Chaput
774e1189d2 Change eslint config to autofix missing comma and indentation in JS files (#26711) 2023-10-09 13:38:29 +02:00
Claire
c310374a2f Fix clicking on already-opened thread post scrolling to the top of the thread (#27331) 2023-10-09 12:21:02 +02:00
github-actions[bot]
89b48681cf New Crowdin Translations (automated) (#27321)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-09 10:32:06 +02:00
renovate[bot]
5fc5a548b4 Update DefinitelyTyped types (non-major) (#27327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 10:19:13 +02:00
renovate[bot]
eabe839744 Update eslint (non-major) (#27328)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 09:43:42 +02:00
Claire
967bd543bb [Glitch] Fix auto-loading-more when not scrolled
Port 2b98e2ecd6 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-08 17:34:10 +02:00
Claire
53f5b27bd1 Merge commit '640421f661ee4d7e76a2aab607e7b15687940b6f' into glitch-soc/merge-upstream 2023-10-08 17:30:48 +02:00
Claire
86c9c5afa0 Merge commit '40ba6e119b7457161fd43b449875d0fb9d473c1a' into glitch-soc/merge-upstream
Conflicts:
- `app/controllers/concerns/web_app_controller_concern.rb`:
  Upstream changed the order of Action Controller filters for web app
  controllers.
  Glitch-soc has an extra filter due to its theming system.
  Changed the order accordingly.
- `app/views/settings/preferences/appearance/show.html.haml`:
  Conflict due to an extra newline in glitch-soc.
  Removed that newline and applied upstream's changes.
2023-10-08 17:26:43 +02:00
Claire
ac2370778a Merge commit 'c676bc91e9c3aa81eb7cfbce3c5c5e80b84d3d02' into glitch-soc/merge-upstream
Conflicts:
- `config/environments/production.rb`:
  Upstream enforced a code style change and glitch-soc had a few different lines.
  Applied upstream's code style to glitch-soc's changes.
2023-10-08 17:21:12 +02:00
Claire
74c27e33e3 Merge commit '37bbd3c1064380a756b4e821655d7697105f99f5' into glitch-soc/merge-upstream 2023-10-08 17:10:39 +02:00
Michael Stanclift
8eb09c6f72 [Glitch] Keep version string displayed without breakpoints in UI
Port 5a437edc7f to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-08 17:09:02 +02:00
Claire
a5dbb1ee5a Merge commit '5a437edc7f22d5797e5af29d9b450a03eccec304' into glitch-soc/merge-upstream 2023-10-08 17:05:40 +02:00
Claire
e83059fd9d [Glitch] Fix explore prompt appearing because of posts being received out of order
Port d80a819fc6 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-08 17:03:40 +02:00
Claire
e9a181c52c Merge commit 'e95d25e1013b6328457b81bd98e8d6a841d45ec2' into glitch-soc/merge-upstream 2023-10-08 16:53:05 +02:00
Claire
702d162998 Merge commit '5393be7a21331c8615ffb79c2271db92f6959458' into glitch-soc/merge-upstream
Conflicts:
- `app/controllers/auth/registrations_controller.rb`:
  Not a real conflict. Upstream removed the `set_instance_presenter` private
  method from this class, and glitch-soc has an extra private method right
  besides it for the theming system.
  Removed `set_instance_presenter` as upstream did.
- `app/controllers/auth/sessions_controller.rb`:
  Not a real conflict. Upstream removed the `set_instance_presenter` private
  method from this class, and glitch-soc has an extra private method right
  besides it for the theming system.
  Removed `set_instance_presenter` as upstream did.
2023-10-08 16:48:19 +02:00
Claire
d7fcd70023 Merge commit '2016c5d912f400ae98ee03ce269112de2f9ec62d' into glitch-soc/merge-upstream
Conflicts:
- `config/initializers/cors.rb`:
  Upstream refactored this file, and glitch-soc had local changes.
  I could not find the rationale for the glitch-soc changes, so I
  used upstream's version.
2023-10-08 16:41:56 +02:00
Michael Stanclift
cfc0da77ac [Glitch] Fix retention dashboard not displaying correct month
Port 7fddeca190 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-10-08 16:33:37 +02:00
Claire
19ebf7797e Merge commit 'e6b903b21e0682c1156ffec583ac2836fda7d657' into glitch-soc/merge-upstream 2023-10-08 16:30:00 +02:00
Andy Piper
640421f661 Add 4.2.x to supported versions in SECURITY.md (#27317) 2023-10-07 21:12:21 +02:00
Claire
3262d1f1b6 Fix incorrect serialization of regional languages in contentMap (#27207) 2023-10-06 17:46:04 +02:00
Michael Stanclift
3171afc36a Add Elasticsearch index size to Admin dashboard (#27301)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2023-10-06 17:02:55 +02:00
Claire
340c390849 Fix crash when filtering for “dormant” relationships (#27306) 2023-10-06 12:58:16 +02:00
Claire
4d59dfb1c6 Fix some remote posts getting truncated (#27307) 2023-10-06 12:58:02 +02:00
github-actions[bot]
e0b54ed3e1 New Crowdin Translations (automated) (#27304)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-06 11:49:09 +02:00
renovate[bot]
027c1bef8d Update dependency active_model_serializers to v0.10.14 (#27303)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-06 11:43:30 +02:00
Renaud Chaput
c4cff3d762 Remove Capistrano (#27295) 2023-10-06 11:33:43 +02:00
Matt Jankowski
165ec6c779 Remove bundle audit skipping sidekiq CVE (#27291) 2023-10-05 21:23:42 +02:00
renovate[bot]
5606a17933 Update dependency sidekiq to v6.5.10 (#27287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-05 16:35:05 +02:00
Claire
2b98e2ecd6 Fix auto-loading-more when not scrolled (#27286) 2023-10-05 16:33:54 +02:00
github-actions[bot]
32ab474472 New Crowdin Translations (automated) (#27277)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-05 13:13:14 +02:00
Claire
3c13d70600 Add mention of YJIT in admin dashboard if enabled (#27283) 2023-10-05 13:10:17 +02:00
renovate[bot]
d22515861e Update dependency @reduxjs/toolkit to v1.9.7 (#27275)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-05 10:28:47 +02:00
Claire
40ba6e119b Fix Vary headers not being set on some redirects (#27272) 2023-10-05 09:50:08 +02:00
github-actions[bot]
8e4251f9e7 New Crowdin Translations (automated) (#27270)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-04 10:53:04 +02:00
Matt Jankowski
72cec47c13 Silence deprecation warning in CacheBuster spec (#27264) 2023-10-04 10:17:36 +02:00
gunchleoc
68ec1d180a Fix language sorting in settings (#27158) 2023-10-04 09:23:50 +02:00
Matt Jankowski
c676bc91e9 Dont match mention in url query string (#25656)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2023-10-03 17:01:45 +02:00
Matt Jankowski
2f8f92df48 Fix Elastic check deprecation warning about gem version (#27262) 2023-10-03 15:52:47 +02:00
Nick Schonning
85db392464 Autofix Rubocop cops for config/ (#24145) 2023-10-03 15:24:12 +02:00
Matt Jankowski
e715da6d25 Fix haml-lint Rubocop Rails/* cops (#26042) 2023-10-03 15:00:40 +02:00
Nick Schonning
8bb4706e11 Move migration_helpers Rubocop ignore to config (#24236) 2023-10-03 14:58:40 +02:00
Claire
37bbd3c106 Fix double scroll bars in some columns in advanced interface (#27187) 2023-10-03 13:12:39 +02:00
Claire
ceb365c419 Fix boosts of local users being filtered in account timelines (#27204) 2023-10-03 12:21:42 +02:00
Claire
4e55001e65 Add a short-lived lock to trend refresh scheduler (#27253) 2023-10-03 12:21:32 +02:00
Michael Stanclift
5a437edc7f Keep version string displayed without breakpoints in UI (#26986) 2023-10-03 11:52:21 +02:00
David Aaron
6320c52630 Change min age of backup policy from 1 week to 6 days (#27200) 2023-10-03 11:48:57 +02:00
jsgoldstein
ad637eacd1 Add a test case for ES8 (#27248) 2023-10-03 10:48:32 +02:00
renovate[bot]
e836d078bb Update dependency haml_lint to v0.51.0 (#27250)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-03 10:48:05 +02:00
Jakob Gillich
770fd993ec Fix importer returning negative row estimates (#27258) 2023-10-03 10:47:50 +02:00
github-actions[bot]
e95d25e101 New Crowdin Translations (automated) (#27260)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-03 10:47:28 +02:00
Claire
5e56f3db65 Change some worker lock TTLs (#27246) 2023-10-03 10:09:00 +02:00
Claire
7e7d6e695b Fix incorrectly keeping outdated update notices absent from the API endpoint (#27021) 2023-10-02 16:42:52 +02:00
Claire
1e2d4975cf Fix import progress not updating on certain failures (#27247) 2023-10-02 16:20:04 +02:00
github-actions[bot]
ee866ec0e0 New Crowdin Translations (automated) (#27220)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-10-02 13:35:29 +02:00
Emelia Smith
f68d540271 Fix websocket connections being incorrectly decremented twice on errors (#27238) 2023-10-02 13:21:43 +02:00
renovate[bot]
5f2d494f0d Update dependency react-redux to v8.1.3 (#27229)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 13:18:29 +02:00
Jake Anto
c2f13769cd Add PWA shortcut to /explore page (#27235) 2023-10-02 13:18:16 +02:00
renovate[bot]
bad1629dcd Update dependency core-js to v3.33.0 (#27237)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 13:18:06 +02:00
renovate[bot]
73a92f9e7a Update DefinitelyTyped types (non-major) (#27239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 13:17:55 +02:00
renovate[bot]
829be02abe Update Node.js to v20.8 (#27240)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 13:16:02 +02:00
Claire
d80a819fc6 Fix explore prompt appearing because of posts being received out of order (#27211) 2023-09-29 15:51:36 +02:00
renovate[bot]
5393be7a21 Update eslint (non-major) to v6.7.3 (#27213)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-29 15:51:27 +02:00
renovate[bot]
48ef7d0f06 Update libretranslate/libretranslate Docker tag to v1.3.12 (#27214)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-29 15:34:55 +02:00
renovate[bot]
9b785877d2 Update DefinitelyTyped types (non-major) (#27212)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-29 15:34:32 +02:00
github-actions[bot]
695e42de0d New Crowdin Translations (automated) (#27202)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-09-29 10:04:18 +02:00
renovate[bot]
665093a7b6 Update dependency postcss to v8.4.31 (#27199)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-29 09:50:33 +02:00
renovate[bot]
a1becc9189 Update dependency node to 20.8 (#27201)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-29 09:50:15 +02:00
Matt Jankowski
340f1a68be Simplify instance presenter view access (#26046) 2023-09-28 16:52:37 +02:00
Matt Jankowski
2016c5d912 Fix deprecation warning about rewhere: true being default behavior (Rails 7.1 prep) (#27190) 2023-09-28 16:52:23 +02:00
Matt Jankowski
99e289f03f Fix include Rails.application.routes.url_helpers (Rails 7.1 prep) (#27189) 2023-09-28 16:52:11 +02:00
Matt Jankowski
89a17878ef Fix haml-lint InstanceVariables rule for admin/roles/_form (#26063) 2023-09-28 16:36:24 +02:00
renovate[bot]
f9eefb2785 Update dependency rubocop to v1.56.4 (#27188)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-28 16:25:14 +02:00
Matt Jankowski
9d56c1949b Fix haml-lint InstanceVariables rule for admin/webhooks/_form (#26062) 2023-09-28 16:23:35 +02:00
Matt Jankowski
3060bfa4bd Extract filename and csv helper methods from Form::Import (#26129) 2023-09-28 16:22:05 +02:00
Matt Jankowski
937dc42f10 Extract methods for file movement in CLI::Upgrade (#25120) 2023-09-28 16:04:05 +02:00
Matt Jankowski
56c0babc0b Fix rubocop Layout/ArgumentAlignment cop (#26060) 2023-09-28 15:48:47 +02:00
Matt Jankowski
e6b903b21e Fix haml-lint InstanceVariables rule for invites/_form (#26064) 2023-09-28 15:40:28 +02:00
Claire
1da3c588ca Fix link handling of mentions in user profiles when logged out (#27185) 2023-09-28 15:29:07 +02:00
Claire
686406cc2d Fix filtering audit log for entries about disabling 2FA (#27186) 2023-09-28 13:41:24 +02:00
Claire
f0c720cfc9 Bump version to v4.3.0-alpha.0 (#27022) 2023-09-28 13:40:43 +02:00
github-actions[bot]
b93ce7d8b3 New Crowdin Translations (automated) (#27168)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-09-28 10:44:16 +02:00
Christian Schmidt
6d0767558a Make notification respect reduce-motion (#27178) 2023-09-28 10:39:38 +02:00
renovate[bot]
66a7bc215c Update dependency glob to v10.3.10 (#27169)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-28 10:30:19 +02:00
renovate[bot]
0f588a4a86 Update dependency axios to v1.5.1 (#27159)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-28 10:17:08 +02:00
Michael Stanclift
7fddeca190 Fix retention dashboard not displaying correct month (#27180) 2023-09-28 10:16:15 +02:00
renovate[bot]
2979a5924b Update dependency @material-design-icons/svg to v0.14.13 (#27181)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-28 10:14:43 +02:00
gunchleoc
ce79caca4e Only strip country code when language not listed in SUPPORTED_LOCALES (#27099) 2023-09-28 10:13:44 +02:00
Georg Gadinger
ebd2017524 fix Content-Security-Policy when using Azure storage (#2427) 2023-09-26 20:09:56 +02:00
Claire
fde89a8fc0 Merge pull request #2426 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 57f592fed5
2023-09-26 19:03:36 +02:00
Claire
1eeaa0d84f [Glitch] Fix width of large text icon buttons
Port 38753acaa5 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-09-26 13:25:01 +02:00
gunchleoc
ca7d16912e [Glitch] Fix line wrapping of language selection button with long locale codes
Port 88fa8e710a to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-09-26 13:24:29 +02:00
Claire
02e6d9f8f9 [Glitch] Fix explore prompt sometimes showing up when the home TL is loading
Port a001ae2f39 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-09-26 13:20:18 +02:00
Renaud Chaput
919ed0e469 [Glitch] Convert dropdown_menu state to Typescript
Port 4b7bc1f07c to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-09-26 13:19:27 +02:00
Renaud Chaput
b2d67fbe33 [Glitch] Improve modals reducer types
Port b93ffb74bb to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2023-09-26 13:17:08 +02:00
Claire
abdb58840a Merge commit '57f592fed50747f3c97718a2761e17bafe6c8698' into glitch-soc/merge-upstream 2023-09-26 13:13:27 +02:00
Renaud Chaput
57f592fed5 Add Typescript types for some API objects (#26602) 2023-09-26 11:25:01 +02:00
renovate[bot]
2054ee7cd5 Update dependency glob to v10.3.9 (#27148)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-26 11:12:21 +02:00
Claire
82eaa26d87 Update tootctl maintenance fix-duplicates to Mastodon v4.2.0 (#27147) 2023-09-26 11:11:52 +02:00
renovate[bot]
fdc9f971f7 Update dependency selenium-webdriver to v4.13.1 (#27141)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-26 10:47:34 +02:00
github-actions[bot]
5ea3e8e765 New Crowdin Translations (automated) (#27144)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-09-26 10:47:16 +02:00
renovate[bot]
33a066a952 Update dependency glob to v10.3.8 (#27145)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-26 10:47:04 +02:00
Essem
bd810391d6 Properly remove tIME chunk from PNG uploads (#27111) 2023-09-25 19:21:07 +02:00
renovate[bot]
530f48610d Update docker/setup-qemu-action action to v3 (#27124)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 18:41:20 +02:00
renovate[bot]
cdd8c4eb2a Update docker/setup-buildx-action action to v3 (#27123)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 18:40:41 +02:00
renovate[bot]
8ea98aa384 Update docker/metadata-action action to v5 (#27122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 18:40:03 +02:00
renovate[bot]
19bc73b736 Update docker/login-action action to v3 (#27121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 18:39:14 +02:00
renovate[bot]
cf9230fa1c Update docker/build-push-action action to v5 (#27120)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 18:38:55 +02:00
Claire
06444c86c7 Fix division by zero in video in bitrate computation code (#27129) 2023-09-25 17:07:52 +02:00
Claire
a001ae2f39 Fix explore prompt sometimes showing up when the home TL is loading (#27062) 2023-09-25 17:07:01 +02:00
Claire
3de6dcf634 Add redirection on /deck URLs for logged-out users (#27128) 2023-09-25 15:07:10 +02:00
Claire
38753acaa5 Fix width of large text icon buttons (#27127) 2023-09-25 15:06:57 +02:00
Claire
1bd7455d81 Fix inefficient queries in “Follows and followers” as well as several admin pages (#27116) 2023-09-25 15:06:43 +02:00
gunchleoc
88fa8e710a Fix line wrapping of language selection button with long locale codes (#27100) 2023-09-25 12:59:37 +02:00
renovate[bot]
aeeddb9d46 Update DefinitelyTyped types (non-major) (#27109)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 11:56:21 +02:00
renovate[bot]
82c44f492d Update dependency glob to v10.3.7 (#27078)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 11:03:19 +02:00
github-actions[bot]
736fe75346 New Crowdin Translations (automated) (#27080)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-09-25 10:50:09 +02:00
renovate[bot]
c56d7d702f Update dependency @reduxjs/toolkit to v1.9.6 (#27110)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 10:36:46 +02:00
renovate[bot]
a4c29a4e51 Update Node.js to v20.7 (#27112)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 10:23:12 +02:00
renovate[bot]
1fa40cff70 Update eslint (non-major) (#27113)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 10:09:51 +02:00
Renaud Chaput
4b7bc1f07c Convert dropdown_menu state to Typescript (#25585) 2023-09-22 18:18:46 +02:00
Renaud Chaput
b93ffb74bb Improve modals reducer types (#26610) 2023-09-22 16:41:50 +02:00
Claire
39da3d86f8 Fix ActiveRecord using two connection pools when no replica is defined (#27061) 2023-09-22 16:01:59 +02:00
github-actions[bot]
e824585523 New Crowdin Translations (automated) (#27052)
Co-authored-by: GitHub Actions <noreply@github.com>
2023-09-22 11:06:48 +02:00
Renaud Chaput
4aaaf0dde3 Fix the search documentation URL in system checks (#27036) 2023-09-22 10:13:53 +02:00
Renaud Chaput
a011d3a7c6 Ignore CVE-2023-26141 (Sidekiq) from bundler audit (#27037) 2023-09-22 10:13:09 +02:00
790 changed files with 11874 additions and 11707 deletions

View File

@@ -70,7 +70,7 @@ services:
hard: -1
libretranslate:
image: libretranslate/libretranslate:v1.3.11
image: libretranslate/libretranslate:v1.3.12
restart: unless-stopped
volumes:
- lt-data:/home/libretranslate/.local

View File

@@ -9,7 +9,6 @@ module.exports = {
'plugin:import/recommended',
'plugin:promise/recommended',
'plugin:jsdoc/recommended',
'plugin:prettier/recommended',
],
env: {
@@ -63,7 +62,9 @@ module.exports = {
'consistent-return': 'error',
'dot-notation': 'error',
eqeqeq: ['error', 'always', { 'null': 'ignore' }],
'indent': ['error', 2],
'jsx-quotes': ['error', 'prefer-single'],
'semi': ['error', 'always'],
'no-case-declarations': 'off',
'no-catch-shadow': 'error',
'no-console': [
@@ -235,7 +236,7 @@ module.exports = {
},
// Common React utilities
{
pattern: '{classnames,react-helmet,react-router-dom}',
pattern: '{classnames,react-helmet,react-router,react-router-dom}',
group: 'external',
position: 'before',
},

3
.github/FUNDING.yml vendored
View File

@@ -1,3 +0,0 @@
patreon: mastodon
open_collective: mastodon
custom: https://sponsor.joinmastodon.org

View File

@@ -0,0 +1,19 @@
name: 'Setup Javascript'
description: 'Setup a Javascript environment ready to run the Mastodon code'
inputs:
onlyProduction:
description: Only install production dependencies
default: 'false'
runs:
using: 'composite'
steps:
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
shell: bash
run: yarn --frozen-lockfile ${{ inputs.onlyProduction != 'false' && '--production' || '' }}

23
.github/actions/setup-ruby/action.yml vendored Normal file
View File

@@ -0,0 +1,23 @@
name: 'Setup RUby'
description: 'Setup a Ruby environment ready to run the Mastodon code'
inputs:
ruby-version:
description: The Ruby version to install
default: '.ruby-version'
additional-system-dependencies:
description: 'Additional packages to install'
runs:
using: 'composite'
steps:
- name: Install system dependencies
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev ${{ inputs.additional-system-dependencies }}
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ inputs.ruby-version }}
bundler-cache: true

View File

@@ -3,7 +3,6 @@
extends: [
'config:recommended',
':labels(dependencies)',
':maintainLockFilesMonthly', // update non-direct dependencies monthly
':prConcurrentLimitNone', // Remove limit for open PRs at any time.
':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour.
],

View File

@@ -29,10 +29,10 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v2
- uses: docker/setup-qemu-action@v3
if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder
- uses: docker/setup-buildx-action@v2
- uses: docker/setup-buildx-action@v3
id: buildx
if: ${{ !(inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')) }}
@@ -41,7 +41,7 @@ jobs:
run: |
docker run --rm -d --name buildkitd -p 1234:1234 --privileged moby/buildkit:latest --addr tcp://0.0.0.0:1234
- uses: docker/setup-buildx-action@v2
- uses: docker/setup-buildx-action@v3
id: buildx-native
if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')
with:
@@ -61,20 +61,20 @@ jobs:
- name: Log in to Docker Hub
if: contains(inputs.push_to_images, 'tootsuite')
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Log in to the Github Container registry
if: contains(inputs.push_to_images, 'ghcr.io')
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/metadata-action@v4
- uses: docker/metadata-action@v5
id: meta
if: ${{ inputs.push_to_images != '' }}
with:
@@ -83,7 +83,7 @@ jobs:
tags: ${{ inputs.tags }}
labels: ${{ inputs.labels }}
- uses: docker/build-push-action@v4
- uses: docker/build-push-action@v5
with:
context: .
build-args: |

View File

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

View File

@@ -27,14 +27,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Run bundler-audit
run: bundle exec bundler-audit

View File

@@ -19,25 +19,11 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Check for missing strings in English JSON
run: |

View File

@@ -11,6 +11,7 @@ permissions:
jobs:
download-translations:
runs-on: ubuntu-latest
if: github.repository == 'glitch-soc/mastodon'
steps:
- name: Checkout
@@ -44,14 +45,8 @@ jobs:
run: sudo chown -R runner:docker .
# This is needed to run the normalize step
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Run i18n normalize task
run: bundle exec i18n-tasks normalize

View File

@@ -35,14 +35,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- uses: xt0rted/stylelint-problem-matcher@v1

View File

@@ -30,16 +30,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Install native Ruby dependencies
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Run haml-lint
run: |

View File

@@ -39,14 +39,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: ESLint
run: yarn lint:js --max-warnings 0

View File

@@ -31,14 +31,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Prettier
run: yarn lint:json

View File

@@ -31,14 +31,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Prettier
run: yarn lint:md

View File

@@ -31,14 +31,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Set-up RuboCop Problem Matcher
uses: r7kamura/rubocop-problem-matchers-action@v1

View File

@@ -33,14 +33,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Prettier
run: yarn lint:yml

View File

@@ -35,14 +35,8 @@ jobs:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Jest testing
run: yarn jest --reporters github-actions summary

View File

@@ -72,16 +72,8 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install native Ruby dependencies
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Create database
run: './bin/rails db:create'

View File

@@ -71,16 +71,8 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install native Ruby dependencies
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Create database
run: './bin/rails db:create'

View File

@@ -34,24 +34,14 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v3
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
with:
cache: yarn
node-version-file: '.nvmrc'
onlyProduction: 'true'
- name: Install native Ruby dependencies
run: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- run: yarn --frozen-lockfile --production
- name: Precompile assets
# Previously had set this, but it's not supported
# export NODE_OPTIONS=--openssl-legacy-provider
@@ -113,6 +103,7 @@ jobs:
CAS_ENABLED: true
BUNDLE_WITH: 'pam_authentication test'
CI_JOBS: ${{ matrix.ci_job }}/4
GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }}
strategy:
fail-fast: false
@@ -134,20 +125,11 @@ jobs:
path: './public'
name: ${{ github.sha }}
- name: Update package index
run: sudo apt-get update
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Install additional system dependencies
run: sudo apt-get install -y ffmpeg imagemagick libpam-dev
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
with:
ruby-version: ${{ matrix.ruby-version}}
bundler-cache: true
additional-system-dependencies: ffmpeg imagemagick libpam-dev
- name: Load database schema
run: './bin/rails db:create db:schema:load db:seed'
@@ -209,28 +191,14 @@ jobs:
path: './public'
name: ${{ github.sha }}
- name: Update package index
run: sudo apt-get update
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Install additional system dependencies
run: sudo apt-get install -y ffmpeg imagemagick
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
with:
ruby-version: ${{ matrix.ruby-version}}
bundler-cache: true
additional-system-dependencies: ffmpeg imagemagick
- run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Load database schema
run: './bin/rails db:create db:schema:load db:seed'
@@ -282,8 +250,8 @@ jobs:
ports:
- 6379:6379
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.13
search:
image: ${{ matrix.search-image }}
env:
discovery.type: single-node
xpack.security.enabled: false
@@ -313,6 +281,11 @@ jobs:
- '3.0'
- '3.1'
- '.ruby-version'
search-image:
- docker.elastic.co/elasticsearch/elasticsearch:7.17.13
include:
- ruby-version: '.ruby-version'
search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
steps:
- uses: actions/checkout@v4
@@ -322,28 +295,14 @@ jobs:
path: './public'
name: ${{ github.sha }}
- name: Update package index
run: sudo apt-get update
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Install additional system dependencies
run: sudo apt-get install -y ffmpeg imagemagick
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
with:
ruby-version: ${{ matrix.ruby-version}}
bundler-cache: true
additional-system-dependencies: ffmpeg imagemagick
- run: yarn --frozen-lockfile
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
- name: Load database schema
run: './bin/rails db:create db:schema:load db:seed'

3
.gitignore vendored
View File

@@ -31,9 +31,6 @@
# Ignore Vagrant files
.vagrant/
# Ignore Capistrano customizations
/config/deploy/*
# Ignore IDE files
.vscode/
.idea/

View File

@@ -1,47 +1,21 @@
# This configuration was generated by
# `haml-lint --auto-gen-config`
# on 2023-07-20 09:47:50 -0400 using Haml-Lint version 0.48.0.
# on 2023-10-25 08:29:48 -0400 using Haml-Lint version 0.51.0.
# The point is for the user to remove these configuration records
# one by one as the lints are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of Haml-Lint, may require this file to be generated again.
linters:
# Offense count: 951
# Offense count: 945
LineLength:
enabled: false
# Offense count: 22
UnnecessaryStringOutput:
enabled: false
# Offense count: 57
# Offense count: 10
RuboCop:
enabled: false
# Offense count: 3
ViewLength:
exclude:
- 'app/views/admin/accounts/show.html.haml'
- 'app/views/admin/reports/show.html.haml'
- 'app/views/disputes/strikes/show.html.haml'
# Offense count: 32
InstanceVariables:
exclude:
- 'app/views/admin/reports/_actions.html.haml'
- 'app/views/admin/accounts/_buttons.html.haml'
- 'app/views/admin/accounts/_local_account.html.haml'
- 'app/views/admin/accounts/index.html.haml'
- 'app/views/admin/roles/_form.html.haml'
- 'app/views/admin/webhooks/_form.html.haml'
- 'app/views/auth/registrations/_status.html.haml'
- 'app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml'
- 'app/views/authorize_interactions/_post_follow_actions.html.haml'
- 'app/views/invites/_form.html.haml'
- 'app/views/relationships/_account.html.haml'
- 'app/views/shared/_og.html.haml'
# Offense count: 3
IdNames:
exclude:
- 'app/views/authorize_interactions/error.html.haml'
- 'app/views/oauth/authorizations/error.html.haml'
- 'app/views/shared/_error_messages.html.haml'
- 'app/views/layouts/application.html.haml'

2
.nvmrc
View File

@@ -1 +1 @@
20.7
20.9

View File

@@ -31,9 +31,6 @@
# Ignore Vagrant files
.vagrant/
# Ignore Capistrano customizations
/config/deploy/*
# Ignore IDE files
.vscode/
.idea/

View File

@@ -28,6 +28,7 @@ AllCops:
- 'Vagrantfile'
- 'vendor/**/*'
- 'lib/json_ld/*' # Generated files
- 'lib/mastodon/migration_helpers.rb' # Vendored from GitLab
- 'lib/templates/**/*'
# Reason: Prefer Hashes without extreme indentation
@@ -75,12 +76,6 @@ Metrics/AbcSize:
- 'lib/mastodon/cli/*.rb'
- db/*migrate/**/*
# Reason:
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting
Metrics/BlockNesting:
Exclude:
- 'lib/mastodon/cli/*.rb'
# Reason: Currently disabled in .rubocop_todo.yml
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
Metrics/CyclomaticComplexity:

View File

@@ -1,6 +1,6 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
# using RuboCop version 1.56.1.
# using RuboCop version 1.57.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
@@ -13,32 +13,6 @@ Bundler/OrderedGems:
Exclude:
- 'Gemfile'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: with_first_argument, with_fixed_indentation
Layout/ArgumentAlignment:
Exclude:
- 'config/initializers/cors.rb'
- 'config/initializers/session_store.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
# SupportedHashRocketStyles: key, separator, table
# SupportedColonStyles: key, separator, table
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
Layout/HashAlignment:
Exclude:
- 'config/environments/production.rb'
- 'config/initializers/rack_attack.rb'
- 'config/routes.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowDoxygenCommentStyle, AllowGemfileRubyComment.
Layout/LeadingCommentSpace:
Exclude:
- 'config/application.rb'
- 'config/initializers/3_omniauth.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
# URISchemes: http, https
@@ -46,14 +20,6 @@ Layout/LineLength:
Exclude:
- 'app/models/account.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: require_no_space, require_space
Layout/SpaceInLambdaLiteral:
Exclude:
- 'config/environments/production.rb'
- 'config/initializers/content_security_policy.rb'
# Configuration parameters: AllowComments, AllowEmptyLambdas.
Lint/EmptyBlock:
Exclude:
@@ -82,27 +48,6 @@ Lint/UnusedBlockArgument:
- 'config/initializers/paperclip.rb'
- 'config/initializers/simple_form.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
Lint/UselessAssignment:
Exclude:
- 'app/services/activitypub/process_status_update_service.rb'
- 'config/initializers/3_omniauth.rb'
- 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb'
- 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb'
- 'spec/controllers/api/v1/favourites_controller_spec.rb'
- 'spec/controllers/concerns/account_controller_concern_spec.rb'
- 'spec/helpers/jsonld_helper_spec.rb'
- 'spec/models/account_spec.rb'
- 'spec/models/domain_block_spec.rb'
- 'spec/models/status_spec.rb'
- 'spec/models/user_spec.rb'
- 'spec/models/webauthn_credentials_spec.rb'
- 'spec/services/account_search_service_spec.rb'
- 'spec/services/post_status_service_spec.rb'
- 'spec/services/precompute_feed_service_spec.rb'
- 'spec/services/resolve_url_service_spec.rb'
- 'spec/views/statuses/show.html.haml_spec.rb'
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
Max: 144
@@ -122,26 +67,6 @@ Metrics/CyclomaticComplexity:
Metrics/PerceivedComplexity:
Max: 27
# Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
# SupportedStyles: snake_case, normalcase, non_integer
# AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339, x86_64
Naming/VariableNumber:
Exclude:
- 'db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
- 'db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
- 'db/migrate/20190820003045_update_statuses_index.rb'
- 'db/migrate/20190823221802_add_local_index_to_statuses.rb'
- 'db/migrate/20200119112504_add_public_index_to_statuses.rb'
- 'spec/models/account_spec.rb'
- 'spec/models/domain_block_spec.rb'
- 'spec/models/user_spec.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: SafeMultiline.
Performance/DeletePrefix:
Exclude:
- 'app/models/featured_tag.rb'
Performance/MapMethodChain:
Exclude:
- 'app/models/feed.rb'
@@ -155,7 +80,6 @@ RSpec/AnyInstance:
- 'spec/controllers/admin/accounts_controller_spec.rb'
- 'spec/controllers/admin/resets_controller_spec.rb'
- 'spec/controllers/admin/settings/branding_controller_spec.rb'
- 'spec/controllers/api/v1/media_controller_spec.rb'
- 'spec/controllers/auth/sessions_controller_spec.rb'
- 'spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb'
- 'spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb'
@@ -214,9 +138,7 @@ RSpec/LetSetup:
- 'spec/controllers/admin/reports/actions_controller_spec.rb'
- 'spec/controllers/admin/statuses_controller_spec.rb'
- 'spec/controllers/api/v1/accounts/statuses_controller_spec.rb'
- 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
- 'spec/controllers/api/v1/filters_controller_spec.rb'
- 'spec/controllers/api/v1/followed_tags_controller_spec.rb'
- 'spec/controllers/api/v2/admin/accounts_controller_spec.rb'
- 'spec/controllers/api/v2/filters/keywords_controller_spec.rb'
- 'spec/controllers/api/v2/filters/statuses_controller_spec.rb'
@@ -257,7 +179,6 @@ RSpec/LetSetup:
RSpec/MessageChain:
Exclude:
- 'spec/controllers/api/v1/media_controller_spec.rb'
- 'spec/models/concerns/remotable_spec.rb'
- 'spec/models/session_activation_spec.rb'
- 'spec/models/setting_spec.rb'
@@ -291,28 +212,11 @@ RSpec/MultipleMemoizedHelpers:
RSpec/NestedGroups:
Max: 6
RSpec/PendingWithoutReason:
Exclude:
- 'spec/models/account_spec.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationController:
Exclude:
- 'app/controllers/health_controller.rb'
# Configuration parameters: Include.
# Include: db/**/*.rb
Rails/CreateTableWithTimestamps:
Exclude:
- 'db/migrate/20170508230434_create_conversation_mutes.rb'
- 'db/migrate/20170823162448_create_status_pins.rb'
- 'db/migrate/20171116161857_create_list_accounts.rb'
- 'db/migrate/20180929222014_create_account_conversations.rb'
- 'db/migrate/20181007025445_create_pghero_space_stats.rb'
- 'db/migrate/20190103124649_create_scheduled_statuses.rb'
- 'db/migrate/20220824233535_create_status_trends.rb'
- 'db/migrate/20221006061337_create_preview_card_trends.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Severity.
Rails/DuplicateAssociation:
@@ -354,7 +258,6 @@ Rails/LexicallyScopedActionFilter:
Exclude:
- 'app/controllers/auth/passwords_controller.rb'
- 'app/controllers/auth/registrations_controller.rb'
- 'app/controllers/auth/sessions_controller.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/NegateInclude:
@@ -370,7 +273,6 @@ Rails/NegateInclude:
- 'app/models/custom_filter.rb'
- 'app/services/activitypub/process_status_update_service.rb'
- 'app/services/fetch_link_card_service.rb'
- 'app/services/search_service.rb'
- 'app/workers/web/push_notification_worker.rb'
- 'lib/paperclip/color_extractor.rb'
@@ -390,24 +292,6 @@ Rails/RakeEnvironment:
- 'lib/tasks/repo.rake'
- 'lib/tasks/statistics.rake'
# Configuration parameters: Include.
# Include: db/**/*.rb
Rails/ReversibleMigration:
Exclude:
- 'db/migrate/20160223164502_make_uris_nullable_in_statuses.rb'
- 'db/migrate/20161122163057_remove_unneeded_indexes.rb'
- 'db/migrate/20170205175257_remove_devices.rb'
- 'db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb'
- 'db/migrate/20170520145338_change_language_filter_to_opt_out.rb'
- 'db/migrate/20170609145826_remove_default_language_from_statuses.rb'
- 'db/migrate/20170711225116_fix_null_booleans.rb'
- 'db/migrate/20171129172043_add_index_on_stream_entries.rb'
- 'db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb'
- 'db/migrate/20171226094803_more_faster_index_on_notifications.rb'
- 'db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
- 'db/migrate/20180617162849_remove_unused_indexes.rb'
- 'db/migrate/20220827195229_change_canonical_email_blocks_nullable.rb'
# Configuration parameters: ForbiddenMethods, AllowedMethods.
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
Rails/SkipsModelValidations:
@@ -456,36 +340,10 @@ Rails/SkipsModelValidations:
- 'lib/mastodon/cli/accounts.rb'
- 'lib/mastodon/cli/main.rb'
- 'lib/mastodon/cli/maintenance.rb'
- 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
- 'spec/lib/activitypub/activity/follow_spec.rb'
- 'spec/services/follow_service_spec.rb'
- 'spec/services/update_account_service_spec.rb'
# Configuration parameters: Include.
# Include: db/**/*.rb
Rails/ThreeStateBooleanColumn:
Exclude:
- 'db/migrate/20160325130944_add_admin_to_users.rb'
- 'db/migrate/20161123093447_add_sensitive_to_statuses.rb'
- 'db/migrate/20170123203248_add_reject_media_to_domain_blocks.rb'
- 'db/migrate/20170127165745_add_devise_two_factor_to_users.rb'
- 'db/migrate/20170209184350_add_reply_to_statuses.rb'
- 'db/migrate/20170330163835_create_imports.rb'
- 'db/migrate/20170905165803_add_local_to_statuses.rb'
- 'db/migrate/20171210213213_add_local_only_flag_to_statuses.rb'
- 'db/migrate/20181203021853_add_discoverable_to_accounts.rb'
- 'db/migrate/20190509164208_add_by_moderator_to_tombstone.rb'
- 'db/migrate/20190805123746_add_capabilities_to_tags.rb'
- 'db/migrate/20191212163405_add_hide_collections_to_accounts.rb'
- 'db/migrate/20200309150742_add_forwarded_to_reports.rb'
- 'db/migrate/20210609202149_create_login_activities.rb'
- 'db/migrate/20210621221010_add_skip_sign_in_token_to_users.rb'
- 'db/migrate/20211031031021_create_preview_card_providers.rb'
- 'db/migrate/20211115032527_add_trendable_to_preview_cards.rb'
- 'db/migrate/20220202200743_add_trendable_to_accounts.rb'
- 'db/migrate/20220202200926_add_trendable_to_statuses.rb'
- 'db/migrate/20220303000827_add_ordered_media_attachment_ids_to_status_edits.rb'
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/UniqueValidationWithoutIndex:
@@ -549,7 +407,7 @@ Style/CaseEquality:
Exclude:
- 'config/initializers/trusted_proxies.rb'
# This cop supports safe autocorrection (--autocorrect).
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedMethods, AllowedPatterns.
# AllowedMethods: ==, equal?, eql?
Style/ClassEqualityComparison:
@@ -561,12 +419,6 @@ Style/ClassVars:
Exclude:
- 'config/initializers/devise.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/CombinableLoops:
Exclude:
- 'app/models/form/custom_emoji_batch.rb'
- 'app/models/form/ip_block_batch.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowedVars.
Style/FetchEnvVar:
@@ -763,7 +615,6 @@ Style/RedundantReturn:
Style/SafeNavigation:
Exclude:
- 'app/models/concerns/account_finder_concern.rb'
- 'app/models/status.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
@@ -844,6 +695,5 @@ Style/TrailingCommaInHashLiteral:
Style/WordArray:
Exclude:
- 'app/helpers/languages_helper.rb'
- 'config/initializers/cors.rb'
- 'spec/controllers/settings/imports_controller_spec.rb'
- 'spec/models/form/import_spec.rb'

File diff suppressed because it is too large Load Diff

15
Capfile
View File

@@ -1,15 +0,0 @@
# frozen_string_literal: true
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/scm/git'
install_plugin Capistrano::SCM::Git
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/yarn'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

View File

@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1.4
# This needs to be bookworm-slim because the Ruby image is built on bookworm-slim
ARG NODE_VERSION="20.6-bookworm-slim"
ARG NODE_VERSION="20.8-bookworm-slim"
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.2-slim as ruby
FROM node:${NODE_VERSION} as build
@@ -28,7 +28,7 @@ RUN apt-get update && \
libgdbm-dev \
libgmp-dev \
libssl-dev \
libyaml-0-2 \
libyaml-dev \
ca-certificates \
libreadline8 \
python3 \

11
Gemfile
View File

@@ -4,7 +4,7 @@ source 'https://rubygems.org'
ruby '>= 3.0.0'
gem 'puma', '~> 6.3'
gem 'rails', '~> 7.0'
gem 'rails', '~> 7.1.1'
gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.2'
gem 'rack', '~> 2.2.7'
@@ -106,6 +106,9 @@ group :test do
# Used to split testing into chunks in CI
gem 'rspec_chunked', '~> 0.6'
# 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'
@@ -170,12 +173,6 @@ group :development do
# Linter CLI for HAML files
gem 'haml_lint', require: false
# Deployment automation
gem 'capistrano', '~> 3.17'
gem 'capistrano-rails', '~> 1.6'
gem 'capistrano-rbenv', '~> 2.2'
gem 'capistrano-yarn', '~> 2.0'
# Validate missing i18n keys
gem 'i18n-tasks', '~> 1.0', require: false
end

View File

@@ -39,81 +39,87 @@ GIT
GEM
remote: https://rubygems.org/
specs:
actioncable (7.0.8)
actionpack (= 7.0.8)
activesupport (= 7.0.8)
actioncable (7.1.1)
actionpack (= 7.1.1)
activesupport (= 7.1.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.8)
actionpack (= 7.0.8)
activejob (= 7.0.8)
activerecord (= 7.0.8)
activestorage (= 7.0.8)
activesupport (= 7.0.8)
zeitwerk (~> 2.6)
actionmailbox (7.1.1)
actionpack (= 7.1.1)
activejob (= 7.1.1)
activerecord (= 7.1.1)
activestorage (= 7.1.1)
activesupport (= 7.1.1)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.8)
actionpack (= 7.0.8)
actionview (= 7.0.8)
activejob (= 7.0.8)
activesupport (= 7.0.8)
actionmailer (7.1.1)
actionpack (= 7.1.1)
actionview (= 7.1.1)
activejob (= 7.1.1)
activesupport (= 7.1.1)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.8)
actionview (= 7.0.8)
activesupport (= 7.0.8)
rack (~> 2.0, >= 2.2.4)
rails-dom-testing (~> 2.2)
actionpack (7.1.1)
actionview (= 7.1.1)
activesupport (= 7.1.1)
nokogiri (>= 1.8.5)
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.8)
actionpack (= 7.0.8)
activerecord (= 7.0.8)
activestorage (= 7.0.8)
activesupport (= 7.0.8)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
actiontext (7.1.1)
actionpack (= 7.1.1)
activerecord (= 7.1.1)
activestorage (= 7.1.1)
activesupport (= 7.1.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.8)
activesupport (= 7.0.8)
actionview (7.1.1)
activesupport (= 7.1.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_model_serializers (0.10.13)
actionpack (>= 4.1, < 7.1)
activemodel (>= 4.1, < 7.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
active_model_serializers (0.10.14)
actionpack (>= 4.1)
activemodel (>= 4.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
activejob (7.0.8)
activesupport (= 7.0.8)
activejob (7.1.1)
activesupport (= 7.1.1)
globalid (>= 0.3.6)
activemodel (7.0.8)
activesupport (= 7.0.8)
activerecord (7.0.8)
activemodel (= 7.0.8)
activesupport (= 7.0.8)
activestorage (7.0.8)
actionpack (= 7.0.8)
activejob (= 7.0.8)
activerecord (= 7.0.8)
activesupport (= 7.0.8)
activemodel (7.1.1)
activesupport (= 7.1.1)
activerecord (7.1.1)
activemodel (= 7.1.1)
activesupport (= 7.1.1)
timeout (>= 0.4.0)
activestorage (7.1.1)
actionpack (= 7.1.1)
activejob (= 7.1.1)
activerecord (= 7.1.1)
activesupport (= 7.1.1)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.8)
activesupport (7.1.1)
base64
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
minitest (>= 5.1)
mutex_m
tzinfo (~> 2.0)
addressable (2.8.5)
public_suffix (>= 2.0.2, < 6.0)
aes_key_wrap (1.1.0)
airbrussh (1.4.1)
sshkit (>= 1.6.1, != 1.7.0)
android_key_attestation (0.3.0)
annotate (3.2.0)
activerecord (>= 3.2, < 8.0)
@@ -148,18 +154,19 @@ GEM
net-http-persistent (~> 4.0)
nokogiri (~> 1, >= 1.10.8)
base64 (0.1.1)
bcrypt (3.1.18)
bcrypt (3.1.19)
better_errors (2.10.1)
erubi (>= 1.0.0)
rack (>= 0.9.0)
rouge (>= 1.0.0)
better_html (2.0.1)
better_html (2.0.2)
actionview (>= 6.0)
activesupport (>= 6.0)
ast (~> 2.0)
erubi (~> 1.4)
parser (>= 2.4)
smart_properties
bigdecimal (3.1.4)
bindata (2.4.15)
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1)
@@ -175,21 +182,6 @@ GEM
bundler-audit (0.9.1)
bundler (>= 1.2.0, < 3)
thor (~> 1.0)
capistrano (3.17.3)
airbrussh (>= 1.0.0)
i18n
rake (>= 10.0.0)
sshkit (>= 1.9.0)
capistrano-bundler (2.1.0)
capistrano (~> 3.1)
capistrano-rails (1.6.3)
capistrano (~> 3.1)
capistrano-bundler (>= 1.1, < 3)
capistrano-rbenv (2.2.0)
capistrano (~> 3.1)
sshkit (~> 1.3)
capistrano-yarn (2.0.2)
capistrano (~> 3.0)
capybara (3.39.2)
addressable
matrix
@@ -227,17 +219,17 @@ GEM
database_cleaner-core (2.0.1)
date (3.3.3)
debug_inspector (1.1.0)
devise (4.9.2)
devise (4.9.3)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
devise-two-factor (4.1.0)
activesupport (< 7.1)
devise-two-factor (4.1.1)
activesupport (~> 7.0)
attr_encrypted (>= 1.3, < 5, != 2)
devise (~> 4.0)
railties (< 7.1)
railties (~> 7.0)
rotp (~> 6.0)
devise_pam_authenticatable2 (9.2.0)
devise (>= 4.0.0)
@@ -254,6 +246,8 @@ GEM
dotenv-rails (2.8.1)
dotenv (= 2.8.1)
railties (>= 3.2)
drb (2.1.1)
ruby2_keywords
ed25519 (1.3.0)
elasticsearch (7.13.3)
elasticsearch-api (= 7.13.3)
@@ -322,9 +316,9 @@ GEM
fuubar (2.5.1)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
globalid (1.1.0)
activesupport (>= 5.0)
haml (6.1.2)
globalid (1.2.1)
activesupport (>= 6.1)
haml (6.2.0)
temple (>= 0.8.2)
thor
tilt
@@ -333,8 +327,8 @@ GEM
activesupport (>= 5.1)
haml (>= 4.0.6)
railties (>= 5.1)
haml_lint (0.50.0)
haml (>= 4.0, < 6.2)
haml_lint (0.51.0)
haml (>= 4.0)
parallel (~> 1.10)
rainbow
rubocop (>= 1.0)
@@ -362,19 +356,23 @@ GEM
rainbow (>= 2.0.0)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
i18n-tasks (1.0.12)
i18n-tasks (1.0.13)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
better_html (>= 1.0, < 3.0)
erubi
highline (>= 2.0.0)
i18n
parser (>= 2.2.3.0)
parser (>= 3.2.2.1)
rails-i18n
rainbow (>= 2.2.2, < 4.0)
terminal-table (>= 1.5.1)
idn-ruby (0.1.5)
io-console (0.6.0)
ipaddress (0.8.3)
irb (1.8.1)
rdoc
reline (>= 0.3.8)
jmespath (1.6.2)
json (2.6.3)
json-canonicalization (0.3.2)
@@ -429,12 +427,12 @@ GEM
llhttp-ffi (0.4.0)
ffi-compiler (~> 1.0)
rake (~> 13.0)
lograge (0.13.0)
lograge (0.14.0)
actionpack (>= 4)
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
loofah (2.21.3)
loofah (2.21.4)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
@@ -451,21 +449,21 @@ GEM
azure-storage-blob (~> 2.0.1)
hashie (~> 5.0)
memory_profiler (1.0.1)
method_source (1.0.0)
mime-types (3.5.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2023.0808)
mini_mime (1.1.5)
mini_portile2 (2.8.4)
minitest (5.19.0)
minitest (5.20.0)
msgpack (1.7.1)
multi_json (1.15.0)
multipart-post (2.3.0)
mutex_m (0.1.2)
net-http (0.3.2)
uri
net-http-persistent (4.0.2)
connection_pool (~> 2.2)
net-imap (0.3.7)
net-imap (0.4.1)
date
net-protocol
net-ldap (0.18.0)
@@ -473,11 +471,8 @@ GEM
net-protocol
net-protocol (0.2.1)
timeout
net-scp (4.0.0)
net-ssh (>= 2.6.5, < 8.0.0)
net-smtp (0.3.3)
net-smtp (0.4.0)
net-protocol
net-ssh (7.1.0)
nio4r (2.5.9)
nokogiri (1.15.4)
mini_portile2 (~> 2.8.2)
@@ -513,7 +508,7 @@ GEM
orm_adapter (0.5.0)
ox (2.14.17)
parallel (1.23.0)
parser (3.2.2.3)
parser (3.2.2.4)
ast (~> 2.4.1)
racc
parslet (2.0.0)
@@ -532,8 +527,10 @@ GEM
net-smtp
premailer (~> 1.7, >= 1.7.9)
private_address_check (0.5.0)
psych (5.1.1)
stringio
public_suffix (5.0.3)
puma (6.3.1)
puma (6.4.0)
nio4r (~> 2.0)
pundit (2.3.0)
activesupport (>= 3.0.0)
@@ -554,63 +551,73 @@ GEM
rack
rack-proxy (0.7.6)
rack
rack-session (1.0.1)
rack (< 3)
rack-test (2.1.0)
rack (>= 1.3)
rails (7.0.8)
actioncable (= 7.0.8)
actionmailbox (= 7.0.8)
actionmailer (= 7.0.8)
actionpack (= 7.0.8)
actiontext (= 7.0.8)
actionview (= 7.0.8)
activejob (= 7.0.8)
activemodel (= 7.0.8)
activerecord (= 7.0.8)
activestorage (= 7.0.8)
activesupport (= 7.0.8)
rackup (1.0.0)
rack (< 3)
webrick
rails (7.1.1)
actioncable (= 7.1.1)
actionmailbox (= 7.1.1)
actionmailer (= 7.1.1)
actionpack (= 7.1.1)
actiontext (= 7.1.1)
actionview (= 7.1.1)
activejob (= 7.1.1)
activemodel (= 7.1.1)
activerecord (= 7.1.1)
activestorage (= 7.1.1)
activesupport (= 7.1.1)
bundler (>= 1.15.0)
railties (= 7.0.8)
railties (= 7.1.1)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
activesupport (>= 5.0.1.rc1)
rails-dom-testing (2.1.1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
rails-i18n (7.0.7)
rails-i18n (7.0.8)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8)
railties (7.0.8)
actionpack (= 7.0.8)
activesupport (= 7.0.8)
method_source
railties (7.1.1)
actionpack (= 7.1.1)
activesupport (= 7.1.1)
irb
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0)
zeitwerk (~> 2.5)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.0.6)
rdf (3.2.11)
link_header (~> 0.0, >= 0.0.8)
rdf-normalize (0.6.1)
rdf (~> 3.2)
rdoc (6.5.0)
psych (>= 4.0.0)
redcarpet (3.6.0)
redis (4.8.1)
redis-namespace (1.11.0)
redis (>= 4)
redlock (1.3.2)
redis (>= 3.0.0, < 6.0)
regexp_parser (2.8.1)
regexp_parser (2.8.2)
reline (0.3.9)
io-console (~> 0.5)
request_store (1.5.1)
rack (>= 1.4)
responders (3.1.0)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
rotp (6.2.2)
rotp (6.3.0)
rouge (4.1.2)
rpam2 (4.0.2)
rqrcode (2.2.0)
@@ -622,6 +629,8 @@ GEM
rspec-expectations (3.12.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.12.0)
rspec-github (2.4.0)
rspec-core (~> 3.0)
rspec-mocks (3.12.5)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.12.0)
@@ -640,12 +649,12 @@ GEM
sidekiq (>= 5, < 8)
rspec-support (3.12.1)
rspec_chunked (0.6)
rubocop (1.56.3)
rubocop (1.57.1)
base64 (~> 0.1.1)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
parser (>= 3.2.2.3)
parser (>= 3.2.2.4)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
@@ -654,11 +663,11 @@ GEM
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.29.0)
parser (>= 3.2.1.0)
rubocop-capybara (2.18.0)
rubocop-capybara (2.19.0)
rubocop (~> 1.41)
rubocop-factory_bot (2.23.1)
rubocop (~> 1.33)
rubocop-performance (1.19.0)
rubocop-performance (1.19.1)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
rubocop-rails (2.20.2)
@@ -686,12 +695,12 @@ GEM
scenic (1.7.0)
activerecord (>= 4.0.0)
railties (>= 4.0.0)
selenium-webdriver (4.11.0)
selenium-webdriver (4.13.1)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
semantic_range (3.0.0)
sidekiq (6.5.9)
sidekiq (6.5.12)
connection_pool (>= 2.2.5, < 3)
rack (~> 2.0)
redis (>= 4.5.0, < 5)
@@ -726,13 +735,11 @@ GEM
actionpack (>= 5.2)
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sshkit (1.21.5)
net-scp (>= 1.1.2)
net-ssh (>= 2.8.0)
stackprof (0.2.25)
statsd-ruby (1.5.0)
stoplight (3.0.2)
redlock (~> 1.0)
stringio (3.0.8)
strong_migrations (0.8.0)
activerecord (>= 5.2)
swd (1.3.0)
@@ -747,7 +754,7 @@ GEM
climate_control (>= 0.0.3, < 1.0)
test-prof (1.2.3)
thor (1.2.2)
tilt (2.2.0)
tilt (2.3.0)
timeout (0.4.0)
tpm-key_attestation (0.12.0)
bindata (~> 2.4)
@@ -773,7 +780,7 @@ GEM
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (2.4.2)
unicode-display_width (2.5.0)
uri (0.12.2)
validate_email (0.1.6)
activemodel (>= 3.0)
@@ -804,7 +811,8 @@ GEM
rack-proxy (>= 0.6.1)
railties (>= 5.2)
semantic_range (>= 2.3.0)
websocket (1.2.9)
webrick (1.8.1)
websocket (1.2.10)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
@@ -812,7 +820,7 @@ GEM
xorcist (1.1.3)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.11)
zeitwerk (2.6.12)
PLATFORMS
ruby
@@ -829,10 +837,6 @@ DEPENDENCIES
brakeman (~> 6.0)
browser
bundler-audit (~> 0.9)
capistrano (~> 3.17)
capistrano-rails (~> 1.6)
capistrano-rbenv (~> 2.2)
capistrano-yarn (~> 2.0)
capybara (~> 3.39)
charlock_holmes (~> 0.7.7)
chewy (~> 7.3)
@@ -903,7 +907,7 @@ DEPENDENCIES
rack-attack (~> 6.6)
rack-cors (~> 2.0)
rack-test (~> 2.1)
rails (~> 7.0)
rails (~> 7.1.1)
rails-controller-testing (~> 1.0)
rails-i18n (~> 7.0)
rails-settings-cached (~> 0.6)!
@@ -912,6 +916,7 @@ DEPENDENCIES
redis (~> 4.5)
redis-namespace (~> 1.10)
rqrcode (~> 2.2)
rspec-github (~> 2.4)
rspec-rails (~> 6.0)
rspec-sidekiq (~> 4.0)
rspec_chunked (~> 0.6)
@@ -953,4 +958,4 @@ RUBY VERSION
ruby 3.2.2p53
BUNDLED WITH
2.4.13
2.4.20

View File

@@ -15,6 +15,7 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
| Version | Supported |
| ------- | ---------------- |
| 4.2.x | Yes |
| 4.1.x | Yes |
| 4.0.x | Until 2023-10-31 |
| 3.5.x | Until 2023-12-31 |

View File

@@ -5,15 +5,7 @@ class AboutController < ApplicationController
skip_before_action :require_functional!
before_action :set_instance_presenter
def show
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
end
private
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
end

View File

@@ -49,7 +49,7 @@ module Admin
private
def set_instance
@instance = Instance.find(TagManager.instance.normalize_domain(params[:id]&.strip))
@instance = Instance.find_or_initialize_by(domain: TagManager.instance.normalize_domain(params[:id]&.strip))
end
def set_instances

View File

@@ -1,9 +1,9 @@
# frozen_string_literal: true
class Api::V1::Apps::CredentialsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read }
def show
render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key)
return doorkeeper_render_error unless valid_doorkeeper_token?
render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key client_id scopes)
end
end

View File

@@ -13,6 +13,7 @@ class ApplicationController < ActionController::Base
include ThemingConcern
include DatabaseHelper
include AuthorizedFetchHelper
include SelfDestructHelper
helper_method :current_account
helper_method :current_session
@@ -41,6 +42,8 @@ class ApplicationController < ActionController::Base
service_unavailable
end
before_action :check_self_destruct!
before_action :store_referrer, except: :raise_not_found, if: :devise_controller?
before_action :require_functional!, if: :user_signed_in?
@@ -169,6 +172,15 @@ class ApplicationController < ActionController::Base
end
end
def check_self_destruct!
return unless self_destruct?
respond_to do |format|
format.any { render 'errors/self_destruct', layout: 'auth', status: 410, formats: [:html] }
format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[410] }, status: code }
end
end
def set_cache_control_defaults
response.cache_control.replace(private: true, no_store: true)
end

View File

@@ -8,6 +8,7 @@ class Auth::ChallengesController < ApplicationController
before_action :set_pack
before_action :authenticate_user!
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
def create

View File

@@ -13,6 +13,7 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
before_action :extend_csp_for_captcha!, only: [:show, :confirm_captcha]
before_action :require_captcha_if_needed!, only: [:show]
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
def show

View File

@@ -1,6 +1,7 @@
# frozen_string_literal: true
class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
skip_before_action :check_self_destruct!
skip_before_action :verify_authenticity_token
def self.provides_callback_for(provider)

View File

@@ -1,6 +1,7 @@
# frozen_string_literal: true
class Auth::PasswordsController < Devise::PasswordsController
skip_before_action :check_self_destruct!
before_action :check_validity_of_reset_password_token, only: :edit
before_action :set_pack
before_action :set_body_classes

View File

@@ -11,7 +11,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController
before_action :set_pack
before_action :set_sessions, only: [:edit, :update]
before_action :set_strikes, only: [:edit, :update]
before_action :set_instance_presenter, only: [:new, :create, :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]
@@ -19,6 +18,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
before_action :require_rules_acceptance!, only: :new
before_action :set_registration_form_time, only: :new
skip_before_action :check_self_destruct!, only: [:edit, :update]
skip_before_action :require_functional!, only: [:edit, :update]
def new
@@ -112,10 +112,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController
use_pack %w(edit update).include?(action_name) ? 'admin' : 'auth'
end
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
def set_body_classes
@body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter'
end

View File

@@ -3,6 +3,7 @@
class Auth::SessionsController < Devise::SessionsController
layout 'auth'
skip_before_action :check_self_destruct!
skip_before_action :require_no_authentication, only: [:create]
skip_before_action :require_functional!
skip_before_action :update_user_sign_in
@@ -12,7 +13,6 @@ class Auth::SessionsController < Devise::SessionsController
include TwoFactorAuthenticationConcern
before_action :set_instance_presenter, only: [:new]
before_action :set_body_classes
content_security_policy only: :new do |p|
@@ -104,10 +104,6 @@ class Auth::SessionsController < Devise::SessionsController
use_pack 'auth'
end
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
def set_body_classes
@body_classes = 'lighter'
end

View File

@@ -3,6 +3,7 @@
class BackupsController < ApplicationController
include RoutingHelper
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
before_action :authenticate_user!

View File

@@ -9,17 +9,11 @@ module AccountControllerConcern
FOLLOW_PER_PAGE = 12
included do
before_action :set_instance_presenter
after_action :set_link_headers, if: -> { request.format.nil? || request.format == :html }
end
private
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
def set_link_headers
response.headers['Link'] = LinkHeader.new(
[

View File

@@ -7,6 +7,7 @@ module ExportControllerConcern
before_action :authenticate_user!
before_action :load_export
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
end

View File

@@ -5,6 +5,7 @@ module TwoFactorAuthenticationConcern
included do
prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create]
helper_method :webauthn_enabled?
end
def two_factor_enabled?
@@ -89,4 +90,10 @@ module TwoFactorAuthenticationConcern
set_locale { render :two_factor }
end
protected
def webauthn_enabled?
@webauthn_enabled
end
end

View File

@@ -4,11 +4,11 @@ module WebAppControllerConcern
extend ActiveSupport::Concern
included do
prepend_before_action :redirect_unauthenticated_to_permalinks!
vary_by 'Accept, Accept-Language, Cookie'
before_action :redirect_unauthenticated_to_permalinks!
before_action :set_pack
before_action :set_app_body_class
vary_by 'Accept, Accept-Language, Cookie'
end
def skip_csrf_meta_tags?
@@ -23,8 +23,10 @@ module WebAppControllerConcern
return if user_signed_in? # NOTE: Different from upstream because we allow moved users to log in
redirect_path = PermalinkRedirector.new(request.path).redirect_path
return if redirect_path.blank?
redirect_to(redirect_path) if redirect_path.present?
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
redirect_to(redirect_path)
end
def set_pack

View File

@@ -3,7 +3,6 @@
class FollowerAccountsController < ApplicationController
include AccountControllerConcern
include SignatureVerification
include WebAppControllerConcern
vary_by -> { public_fetch_mode? ? 'Accept, Accept-Language, Cookie' : 'Accept, Accept-Language, Cookie, Signature' }

View File

@@ -3,7 +3,6 @@
class FollowingAccountsController < ApplicationController
include AccountControllerConcern
include SignatureVerification
include WebAppControllerConcern
vary_by -> { public_fetch_mode? ? 'Accept, Accept-Language, Cookie' : 'Accept, Accept-Language, Cookie, Signature' }

View File

@@ -3,15 +3,7 @@
class HomeController < ApplicationController
include WebAppControllerConcern
before_action :set_instance_presenter
def index
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
end
private
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
end

View File

@@ -5,15 +5,7 @@ class PrivacyController < ApplicationController
skip_before_action :require_functional!
before_action :set_instance_presenter
def show
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
end
private
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
end

View File

@@ -5,6 +5,7 @@ class Settings::ExportsController < Settings::BaseController
include Redisable
include Lockable
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
def show

View File

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

View File

@@ -3,6 +3,7 @@
module Settings
module TwoFactorAuthentication
class WebauthnCredentialsController < BaseController
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
before_action :require_otp_enabled

View File

@@ -4,6 +4,7 @@ module Settings
class TwoFactorAuthenticationMethodsController < BaseController
include ChallengableConcern
skip_before_action :check_self_destruct!
skip_before_action :require_functional!
before_action :require_challenge!, only: :disable

View File

@@ -10,7 +10,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 :set_instance_presenter
before_action :redirect_to_original, only: :show
before_action :set_body_classes, only: :embed
@@ -68,10 +67,6 @@ class StatusesController < ApplicationController
not_found
end
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
def redirect_to_original
redirect_to(ActivityPub::TagManager.instance.url_for(@status.reblog), allow_other_host: true) if @status.reblog?
end

View File

@@ -14,7 +14,6 @@ class TagsController < ApplicationController
before_action :set_local
before_action :set_tag
before_action :set_statuses, if: -> { request.format == :rss }
before_action :set_instance_presenter
skip_before_action :require_functional!, unless: :limited_federation_mode?
@@ -49,10 +48,6 @@ class TagsController < ApplicationController
@statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
end
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
def limit_param
params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
end

View File

@@ -0,0 +1,11 @@
# frozen_string_literal: true
module Admin::AnnouncementsHelper
def datetime_pattern
'[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}(:[0-9]{2}){1,2}'
end
def datetime_placeholder
Time.zone.now.strftime('%FT%R')
end
end

View File

@@ -0,0 +1,19 @@
# frozen_string_literal: true
module Admin
module DisputesHelper
def strike_action_label(appeal)
t(key_for_action(appeal),
scope: 'admin.strikes.actions',
name: content_tag(:span, appeal.strike.account.username, class: 'username'),
target: content_tag(:span, appeal.account.username, class: 'target'))
.html_safe
end
private
def key_for_action(appeal)
AccountWarning.actions.slice(appeal.strike.action).keys.first
end
end
end

View File

@@ -1,11 +1,24 @@
# frozen_string_literal: true
module DatabaseHelper
def replica_enabled?
ENV['REPLICA_DB_NAME'] || ENV.fetch('REPLICA_DATABASE_URL', nil)
end
module_function :replica_enabled?
def with_read_replica(&block)
ApplicationRecord.connected_to(role: :reading, prevent_writes: true, &block)
if replica_enabled?
ApplicationRecord.connected_to(role: :reading, prevent_writes: true, &block)
else
yield
end
end
def with_primary(&block)
ApplicationRecord.connected_to(role: :writing, &block)
if replica_enabled?
ApplicationRecord.connected_to(role: :writing, &block)
else
yield
end
end
end

View File

@@ -9,6 +9,10 @@ module FormattingHelper
TextFormatter.new(text, options).to_s
end
def url_for_preview_card(preview_card)
preview_card.url
end
def extract_status_plain_text(status)
PlainTextFormatter.new(status.text, status.local?).to_s
end

View File

@@ -0,0 +1,11 @@
# frozen_string_literal: true
module InvitesHelper
def invites_max_uses_options
[1, 5, 10, 25, 50, 100]
end
def invites_expires_options
[30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week]
end
end

View File

@@ -230,6 +230,24 @@ module LanguagesHelper
'sr-Latn': 'Srpski (latinica)',
}.freeze
# 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])
ASCIIFolding.new.fold(supported_locale[1]).downcase
elsif (regional_locale = REGIONAL_LOCALE_NAMES[locale.to_sym])
ASCIIFolding.new.fold(regional_locale).downcase
else
locale
end
end
# Sort locales by native name for dropdown menus
def self.sorted_locale_keys(locale_keys)
locale_keys.sort_by { |key, _| locale_name_for_sorting(key) }
end
def native_locale_name(locale)
if locale.blank? || locale == 'und'
I18n.t('generic.none')
@@ -254,6 +272,7 @@ module LanguagesHelper
def valid_locale_or_nil(str)
return if str.blank?
return str if valid_locale?(str)
code, = str.to_s.split(/[_-]/) # Strip out the region from e.g. en_US or ja-JP

View File

@@ -5,8 +5,6 @@ module MascotHelper
full_asset_url(instance_presenter.mascot&.file&.url || asset_pack_path('media/images/elephant_ui_plane.svg'))
end
private
def instance_presenter
@instance_presenter ||= InstancePresenter.new
end

View File

@@ -3,11 +3,12 @@
module RoutingHelper
extend ActiveSupport::Concern
include Rails.application.routes.url_helpers
include ActionView::Helpers::AssetTagHelper
include Webpacker::Helper
included do
include Rails.application.routes.url_helpers
def default_url_options
ActionMailer::Base.default_url_options
end

View File

@@ -0,0 +1,14 @@
# frozen_string_literal: true
module SelfDestructHelper
def self.self_destruct?
value = ENV.fetch('SELF_DESTRUCT', nil)
value.present? && Rails.application.message_verifier('self-destruct').verify(value) == ENV['LOCAL_DOMAIN']
rescue ActiveSupport::MessageVerifier::InvalidSignature
false
end
def self_destruct?
SelfDestructHelper.self_destruct?
end
end

View File

@@ -2,7 +2,11 @@
module SettingsHelper
def filterable_languages
LanguagesHelper::SUPPORTED_LOCALES.keys
LanguagesHelper.sorted_locale_keys(LanguagesHelper::SUPPORTED_LOCALES.keys)
end
def ui_languages
LanguagesHelper.sorted_locale_keys(I18n.available_locales)
end
def session_device_icon(session)

View File

@@ -0,0 +1,3 @@
// eslint-disable-next-line import/no-anonymous-default-export
export default 'SvgrURL';
export const ReactComponent = 'div';

View File

@@ -1,7 +1,7 @@
// This file will be loaded on admin pages, regardless of theme.
import 'packs/public-path';
import { delegate } from '@rails/ujs';
import Rails from '@rails/ujs';
import ready from '../mastodon/ready';
@@ -19,7 +19,7 @@ const setAnnouncementEndsAttributes = (target) => {
}
};
delegate(document, 'input[type="datetime-local"]#announcement_starts_at', 'change', ({ target }) => {
Rails.delegate(document, 'input[type="datetime-local"]#announcement_starts_at', 'change', ({ target }) => {
setAnnouncementEndsAttributes(target);
});
@@ -42,7 +42,7 @@ const hideSelectAll = () => {
hiddenField.value = '0';
};
delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
const selectAllMatchingElement = document.querySelector('.batch-table__select-all');
[].forEach.call(document.querySelectorAll(batchCheckboxClassName), (content) => {
@@ -58,7 +58,7 @@ delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
}
});
delegate(document, '.batch-table__select-all button', 'click', () => {
Rails.delegate(document, '.batch-table__select-all button', 'click', () => {
const hiddenField = document.querySelector('#select_all_matching');
const active = hiddenField.value === '1';
const selectedMsg = document.querySelector('.batch-table__select-all .selected');
@@ -75,7 +75,7 @@ delegate(document, '.batch-table__select-all button', 'click', () => {
}
});
delegate(document, batchCheckboxClassName, 'change', () => {
Rails.delegate(document, batchCheckboxClassName, 'change', () => {
const checkAllElement = document.querySelector('#batch_checkbox_all');
const selectAllMatchingElement = document.querySelector('.batch-table__select-all');
@@ -93,19 +93,19 @@ delegate(document, batchCheckboxClassName, 'change', () => {
}
});
delegate(document, '.media-spoiler-show-button', 'click', () => {
Rails.delegate(document, '.media-spoiler-show-button', 'click', () => {
[].forEach.call(document.querySelectorAll('button.media-spoiler'), (element) => {
element.click();
});
});
delegate(document, '.media-spoiler-hide-button', 'click', () => {
Rails.delegate(document, '.media-spoiler-hide-button', 'click', () => {
[].forEach.call(document.querySelectorAll('.spoiler-button.spoiler-button--visible button'), (element) => {
element.click();
});
});
delegate(document, '.filter-subset--with-select select', 'change', ({ target }) => {
Rails.delegate(document, '.filter-subset--with-select select', 'change', ({ target }) => {
target.form.submit();
});
@@ -122,7 +122,7 @@ const onDomainBlockSeverityChange = (target) => {
}
};
delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target));
Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target));
const onEnableBootstrapTimelineAccountsChange = (target) => {
const bootstrapTimelineAccountsField = document.querySelector('#form_admin_settings_bootstrap_timeline_accounts');
@@ -139,7 +139,7 @@ const onEnableBootstrapTimelineAccountsChange = (target) => {
}
};
delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target));
Rails.delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target));
const onChangeRegistrationMode = (target) => {
const enabled = target.value === 'approved';
@@ -176,7 +176,7 @@ const convertLocalDatetimeToUTC = (value) => {
return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6);
};
delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target));
Rails.delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target));
ready(() => {
const domainBlockSeverityInput = document.getElementById('domain_block_severity');
@@ -213,7 +213,7 @@ ready(() => {
}
});
delegate(document, 'form', 'submit', ({ target }) => {
Rails.delegate(document, 'form', 'submit', ({ target }) => {
[].forEach.call(target.querySelectorAll('input[type="datetime-local"]'), element => {
if (element.value && element.validity.valid) {
element.value = convertLocalDatetimeToUTC(element.value);

View File

@@ -1,9 +1,9 @@
// This file will be loaded on settings pages, regardless of theme.
import 'packs/public-path';
import { delegate } from '@rails/ujs';
import Rails from '@rails/ujs';
delegate(document, '#edit_profile input[type=file]', 'change', ({ target }) => {
Rails.delegate(document, '#edit_profile input[type=file]', 'change', ({ target }) => {
const avatar = document.getElementById(target.id + '-preview');
const [file] = target.files || [];
const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
@@ -11,13 +11,13 @@ delegate(document, '#edit_profile input[type=file]', 'change', ({ target }) => {
avatar.src = url;
});
delegate(document, '.input-copy input', 'click', ({ target }) => {
Rails.delegate(document, '.input-copy input', 'click', ({ target }) => {
target.focus();
target.select();
target.setSelectionRange(0, target.value.length);
});
delegate(document, '.input-copy button', 'click', ({ target }) => {
Rails.delegate(document, '.input-copy button', 'click', ({ target }) => {
const input = target.parentNode.querySelector('.input-copy__wrapper input');
const oldReadOnly = input.readonly;

View File

@@ -1,10 +0,0 @@
export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
export function openDropdownMenu(id, keyboard, scroll_key) {
return { type: DROPDOWN_MENU_OPEN, id, keyboard, scroll_key };
}
export function closeDropdownMenu(id) {
return { type: DROPDOWN_MENU_CLOSE, id };
}

View File

@@ -0,0 +1,11 @@
import { createAction } from '@reduxjs/toolkit';
export const openDropdownMenu = createAction<{
id: string;
keyboard: boolean;
scrollKey: string;
}>('dropdownMenu/open');
export const closeDropdownMenu = createAction<{ id: string }>(
'dropdownMenu/close',
);

View File

@@ -96,7 +96,7 @@ export function normalizeStatus(status, normalOldStatus, settings) {
normalStatus.media_attachments.forEach(item => {
const oldItem = list.find(i => i.get('id') === item.id);
if (oldItem && oldItem.get('description') === item.description) {
item.translation = oldItem.get('translation')
item.translation = oldItem.get('translation');
}
});
}
@@ -129,13 +129,13 @@ export function normalizePoll(poll, normalOldPoll) {
...option,
voted: poll.own_votes && poll.own_votes.includes(index),
titleHtml: emojify(escapeTextContentForBrowser(option.title), emojiMap),
}
};
if (normalOldPoll && normalOldPoll.getIn(['options', index, 'title']) === option.title) {
normalOption.translation = normalOldPoll.getIn(['options', index, 'translation']);
}
return normalOption
return normalOption;
});
return normalPoll;

View File

@@ -1,12 +1,14 @@
import { createAction } from '@reduxjs/toolkit';
import type { ModalProps } from 'flavours/glitch/reducers/modal';
import type { MODAL_COMPONENTS } from '../features/ui/components/modal_root';
export type ModalType = keyof typeof MODAL_COMPONENTS;
interface OpenModalPayload {
modalType: ModalType;
modalProps: unknown;
modalProps: ModalProps;
}
export const openModal = createAction<OpenModalPayload>('MODAL_OPEN');

View File

@@ -9,11 +9,12 @@ import api from 'flavours/glitch/api';
import { roundTo10 } from 'flavours/glitch/utils/numbers';
const dateForCohort = cohort => {
const timeZone = 'UTC';
switch(cohort.frequency) {
case 'day':
return <FormattedDate value={cohort.period} month='long' day='2-digit' />;
return <FormattedDate value={cohort.period} month='long' day='2-digit' timeZone={timeZone} />;
default:
return <FormattedDate value={cohort.period} month='long' year='numeric' />;
return <FormattedDate value={cohort.period} month='long' year='numeric' timeZone={timeZone} />;
}
};

View File

@@ -1,7 +1,7 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import { unicodeMapping } from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import { assetHost } from 'flavours/glitch/utils/config';
export default class AutosuggestEmoji extends PureComponent {

View File

@@ -1,53 +0,0 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import classNames from 'classnames';
export default class Button extends PureComponent {
static propTypes = {
text: PropTypes.node,
onClick: PropTypes.func,
disabled: PropTypes.bool,
block: PropTypes.bool,
secondary: PropTypes.bool,
className: PropTypes.string,
title: PropTypes.string,
children: PropTypes.node,
};
handleClick = (e) => {
if (!this.props.disabled) {
this.props.onClick(e);
}
};
setRef = (c) => {
this.node = c;
};
focus() {
this.node.focus();
}
render () {
let attrs = {
className: classNames('button', this.props.className, {
'button-secondary': this.props.secondary,
'button--block': this.props.block,
}),
disabled: this.props.disabled,
onClick: this.handleClick,
ref: this.setRef,
};
if (this.props.title) attrs.title = this.props.title;
return (
<button {...attrs}>
{this.props.text || this.props.children}
</button>
);
}
}

View File

@@ -0,0 +1,58 @@
import { useCallback } from 'react';
import classNames from 'classnames';
interface BaseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
block?: boolean;
secondary?: boolean;
text?: JSX.Element;
}
interface PropsWithChildren extends BaseProps {
text?: never;
}
interface PropsWithText extends BaseProps {
text: JSX.Element;
children: never;
}
type Props = PropsWithText | PropsWithChildren;
export const Button: React.FC<Props> = ({
text,
type = 'button',
onClick,
disabled,
block,
secondary,
className,
title,
children,
...props
}) => {
const handleClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>(
(e) => {
if (!disabled && onClick) {
onClick(e);
}
},
[disabled, onClick],
);
return (
<button
className={classNames('button', className, {
'button-secondary': secondary,
'button--block': block,
})}
disabled={disabled}
onClick={handleClick}
title={title}
type={type}
{...props}
>
{text ?? children}
</button>
);
};

View File

@@ -24,13 +24,7 @@ export default class Column extends PureComponent {
scrollable = document.scrollingElement;
} else {
scrollable = this.node.querySelector('.scrollable');
// Some columns have nested `.scrollable` containers, with the outer one
// being a wrapper while the actual scrollable content is deeper.
if (scrollable.classList.contains('scrollable--flex')) {
scrollable = scrollable?.querySelector('.scrollable') || scrollable;
}
}
}
if (!scrollable) {
return;

View File

@@ -4,26 +4,25 @@ import { createPortal } from 'react-dom';
import { FormattedMessage } from 'react-intl';
import { Icon } from 'flavours/glitch/components/icon';
import { withRouter } from 'react-router-dom';
import { Icon } from 'flavours/glitch/components/icon';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
export default class ColumnBackButton extends PureComponent {
static contextTypes = {
router: PropTypes.object,
};
export class ColumnBackButton extends PureComponent {
static propTypes = {
multiColumn: PropTypes.bool,
...WithRouterPropTypes,
};
handleClick = () => {
const { router } = this.context;
const { history } = this.props;
if (router.history.location?.state?.fromMastodon) {
router.history.goBack();
if (history.location?.state?.fromMastodon) {
history.goBack();
} else {
router.history.push('/');
history.push('/');
}
};
@@ -57,3 +56,5 @@ export default class ColumnBackButton extends PureComponent {
}
}
export default withRouter(ColumnBackButton);

View File

@@ -1,25 +1,27 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { FormattedMessage } from 'react-intl';
import { withRouter } from 'react-router-dom';
import { Icon } from 'flavours/glitch/components/icon';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
export default class ColumnBackButtonSlim extends PureComponent {
class ColumnBackButtonSlim extends PureComponent {
static contextTypes = {
router: PropTypes.object,
static propTypes = {
...WithRouterPropTypes,
};
handleClick = () => {
const { router } = this.context;
const { location, history } = this.props;
// Check if there is a previous page in the app to go back to per https://stackoverflow.com/a/70532858/9703201
// When upgrading to V6, check `location.key !== 'default'` instead per https://github.com/remix-run/history/blob/main/docs/api-reference.md#location
if (router.route.location.key) {
router.history.goBack();
if (location.key) {
history.goBack();
} else {
router.history.push('/');
history.push('/');
}
};
@@ -33,5 +35,6 @@ export default class ColumnBackButtonSlim extends PureComponent {
</div>
);
}
}
export default withRouter(ColumnBackButtonSlim);

View File

@@ -5,8 +5,10 @@ import { createPortal } from 'react-dom';
import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import classNames from 'classnames';
import { withRouter } from 'react-router-dom';
import { Icon } from 'flavours/glitch/components/icon';
import { Icon } from 'flavours/glitch/components/icon';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
const messages = defineMessages({
show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' },
@@ -18,7 +20,6 @@ const messages = defineMessages({
class ColumnHeader extends PureComponent {
static contextTypes = {
router: PropTypes.object,
identity: PropTypes.object,
};
@@ -38,6 +39,7 @@ class ColumnHeader extends PureComponent {
onClick: PropTypes.func,
appendContent: PropTypes.node,
collapseIssues: PropTypes.bool,
...WithRouterPropTypes,
};
state = {
@@ -63,12 +65,12 @@ class ColumnHeader extends PureComponent {
};
handleBackClick = () => {
const { router } = this.context;
const { history } = this.props;
if (router.history.location?.state?.fromMastodon) {
router.history.goBack();
if (history.location?.state?.fromMastodon) {
history.goBack();
} else {
router.history.push('/');
history.push('/');
}
};
@@ -78,15 +80,14 @@ class ColumnHeader extends PureComponent {
handlePin = () => {
if (!this.props.pinned) {
this.context.router.history.replace('/');
this.props.history.replace('/');
}
this.props.onPin();
};
render () {
const { router } = this.context;
const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues } = this.props;
const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues, history } = this.props;
const { collapsed, animating } = this.state;
const wrapperClassName = classNames('column-header__wrapper', {
@@ -129,7 +130,7 @@ class ColumnHeader extends PureComponent {
pinButton = <button key='pin-button' className='text-btn column-header__setting-btn' onClick={this.handlePin}><Icon id='plus' /> <FormattedMessage id='column_header.pin' defaultMessage='Pin' /></button>;
}
if (!pinned && ((multiColumn && router.history.location?.state?.fromMastodon) || showBackButton)) {
if (!pinned && ((multiColumn && history.location?.state?.fromMastodon) || showBackButton)) {
backButton = (
<button onClick={this.handleBackClick} className='column-header__back-button'>
<Icon id='chevron-left' className='column-back-button__icon' fixedWidth />
@@ -215,4 +216,4 @@ class ColumnHeader extends PureComponent {
}
export default injectIntl(ColumnHeader);
export default injectIntl(withRouter(ColumnHeader));

View File

@@ -2,13 +2,16 @@ import PropTypes from 'prop-types';
import { PureComponent, cloneElement, Children } from 'react';
import classNames from 'classnames';
import { withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { supportsPassiveEvents } from 'detect-passive-events';
import Overlay from 'react-overlays/Overlay';
import { CircularProgress } from "./circular_progress";
import { CircularProgress } from 'flavours/glitch/components/circular_progress';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
import { IconButton } from './icon_button';
const listenerOptions = supportsPassiveEvents ? { passive: true, capture: true } : true;
@@ -16,10 +19,6 @@ let id = 0;
class DropdownMenu extends PureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
items: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.list]).isRequired,
loading: PropTypes.bool,
@@ -159,11 +158,7 @@ class DropdownMenu extends PureComponent {
}
export default class Dropdown extends PureComponent {
static contextTypes = {
router: PropTypes.object,
};
class Dropdown extends PureComponent {
static propTypes = {
children: PropTypes.node,
@@ -183,6 +178,7 @@ export default class Dropdown extends PureComponent {
renderItem: PropTypes.func,
renderHeader: PropTypes.func,
onItemClick: PropTypes.func,
...WithRouterPropTypes
};
static defaultProps = {
@@ -250,7 +246,7 @@ export default class Dropdown extends PureComponent {
item.action();
} else if (item && item.to) {
e.preventDefault();
this.context.router.history.push(item.to);
this.props.history.push(item.to);
}
};
@@ -338,3 +334,5 @@ export default class Dropdown extends PureComponent {
}
}
export default withRouter(Dropdown);

View File

@@ -4,9 +4,14 @@ import { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dro
import { fetchHistory } from 'flavours/glitch/actions/history';
import DropdownMenu from 'flavours/glitch/components/dropdown_menu';
/**
*
* @param {import('flavours/glitch/store').RootState} state
* @param {*} props
*/
const mapStateToProps = (state, { statusId }) => ({
openDropdownId: state.getIn(['dropdown_menu', 'openId']),
openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
openDropdownId: state.dropdownMenu.openId,
openedViaKeyboard: state.dropdownMenu.keyboard,
items: state.getIn(['history', statusId, 'items']),
loading: state.getIn(['history', statusId, 'loading']),
});
@@ -15,11 +20,11 @@ const mapDispatchToProps = (dispatch, { statusId }) => ({
onOpen (id, onItemClick, keyboard) {
dispatch(fetchHistory(statusId));
dispatch(openDropdownMenu(id, keyboard));
dispatch(openDropdownMenu({ id, keyboard }));
},
onClose (id) {
dispatch(closeDropdownMenu(id));
dispatch(closeDropdownMenu({ id }));
},
});

View File

@@ -2,14 +2,13 @@ import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import 'wicg-inert';
import { multiply } from 'color-blend';
import { createBrowserHistory } from 'history';
export default class ModalRoot extends PureComponent {
import { WithOptionalRouterPropTypes, withOptionalRouter } from 'flavours/glitch/utils/react_router';
static contextTypes = {
router: PropTypes.object,
};
class ModalRoot extends PureComponent {
static propTypes = {
children: PropTypes.node,
@@ -21,6 +20,7 @@ export default class ModalRoot extends PureComponent {
}),
noEsc: PropTypes.bool,
ignoreFocus: PropTypes.bool,
...WithOptionalRouterPropTypes,
};
activeElement = this.props.children ? document.activeElement : null;
@@ -56,7 +56,7 @@ export default class ModalRoot extends PureComponent {
componentDidMount () {
window.addEventListener('keyup', this.handleKeyUp, false);
window.addEventListener('keydown', this.handleKeyDown, false);
this.history = this.context.router ? this.context.router.history : createBrowserHistory();
this.history = this.props.history || createBrowserHistory();
if (this.props.children) {
this._handleModalOpen();
@@ -160,3 +160,5 @@ export default class ModalRoot extends PureComponent {
}
}
export default withOptionalRouter(ModalRoot);

View File

@@ -1,36 +0,0 @@
import { PureComponent } from 'react';
import { Switch, Route, withRouter } from 'react-router-dom';
import AccountNavigation from 'flavours/glitch/features/account/navigation';
import Trends from 'flavours/glitch/features/getting_started/containers/trends_container';
import { showTrends } from 'flavours/glitch/initial_state';
const DefaultNavigation = () => (
showTrends ? (
<>
<div className='flex-spacer' />
<Trends />
</>
) : null
);
class NavigationPortal extends PureComponent {
render () {
return (
<Switch>
<Route path='/@:acct' exact component={AccountNavigation} />
<Route path='/@:acct/tagged/:tagged?' exact component={AccountNavigation} />
<Route path='/@:acct/with_replies' exact component={AccountNavigation} />
<Route path='/@:acct/followers' exact component={AccountNavigation} />
<Route path='/@:acct/following' exact component={AccountNavigation} />
<Route path='/@:acct/media' exact component={AccountNavigation} />
<Route component={DefaultNavigation} />
</Switch>
);
}
}
export default withRouter(NavigationPortal);

View File

@@ -0,0 +1,25 @@
import { Switch, Route } from 'react-router-dom';
import AccountNavigation from 'flavours/glitch/features/account/navigation';
import Trends from 'flavours/glitch/features/getting_started/containers/trends_container';
import { showTrends } from 'flavours/glitch/initial_state';
const DefaultNavigation: React.FC = () =>
showTrends ? (
<>
<div className='flex-spacer' />
<Trends />
</>
) : null;
export const NavigationPortal: React.FC = () => (
<Switch>
<Route path='/@:acct' exact component={AccountNavigation} />
<Route path='/@:acct/tagged/:tagged?' exact component={AccountNavigation} />
<Route path='/@:acct/with_replies' exact component={AccountNavigation} />
<Route path='/@:acct/followers' exact component={AccountNavigation} />
<Route path='/@:acct/following' exact component={AccountNavigation} />
<Route path='/@:acct/media' exact component={AccountNavigation} />
<Route component={DefaultNavigation} />
</Switch>
);

View File

@@ -1,11 +1,9 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
export default class Permalink extends PureComponent {
import { withOptionalRouter, WithOptionalRouterPropTypes } from 'flavours/glitch/utils/react_router';
static contextTypes = {
router: PropTypes.object,
};
class Permalink extends PureComponent {
static propTypes = {
className: PropTypes.string,
@@ -13,6 +11,7 @@ export default class Permalink extends PureComponent {
to: PropTypes.string.isRequired,
children: PropTypes.node,
onInterceptClick: PropTypes.func,
...WithOptionalRouterPropTypes,
};
handleClick = (e) => {
@@ -22,9 +21,9 @@ export default class Permalink extends PureComponent {
return;
}
if (this.context.router) {
if (this.props.history) {
e.preventDefault();
this.context.router.history.push(this.props.to);
this.props.history.push(this.props.to);
}
}
};
@@ -47,3 +46,5 @@ export default class Permalink extends PureComponent {
}
}
export default withOptionalRouter(Permalink);

View File

@@ -133,7 +133,7 @@ class Poll extends ImmutablePureComponent {
handleReveal = () => {
this.setState({ revealed: true });
}
};
renderOption (option, optionIndex, showResults) {
const { poll, lang, disabled, intl } = this.props;

View File

@@ -1,15 +1,22 @@
import type { PropsWithChildren } from 'react';
import React from 'react';
import { createBrowserHistory } from 'history';
import { Router as OriginalRouter } from 'react-router';
import type {
LocationDescriptor,
LocationDescriptorObject,
Path,
} from 'history';
import { createBrowserHistory } from 'history';
import { layoutFromWindow } from 'flavours/glitch/is_mobile';
interface MastodonLocationState {
fromMastodon?: boolean;
mastodonModalKey?: string;
}
type HistoryPath = Path | LocationDescriptor<MastodonLocationState>;
const browserHistory = createBrowserHistory<
MastodonLocationState | undefined
@@ -17,28 +24,55 @@ const browserHistory = createBrowserHistory<
const originalPush = browserHistory.push.bind(browserHistory);
const originalReplace = browserHistory.replace.bind(browserHistory);
browserHistory.push = (path: string, state?: MastodonLocationState) => {
state = state ?? {};
state.fromMastodon = true;
function normalizePath(
path: HistoryPath,
state?: MastodonLocationState,
): LocationDescriptorObject<MastodonLocationState> {
const location = typeof path === 'string' ? { pathname: path } : { ...path };
if (layoutFromWindow() === 'multi-column' && !path.startsWith('/deck')) {
originalPush(`/deck${path}`, state);
} else {
originalPush(path, state);
if (location.state === undefined && state !== undefined) {
location.state = state;
} else if (
location.state !== undefined &&
state !== undefined &&
process.env.NODE_ENV === 'development'
) {
// eslint-disable-next-line no-console
console.log(
'You should avoid providing a 2nd state argument to push when the 1st argument is a location-like object that already has state; it is ignored',
);
}
if (
layoutFromWindow() === 'multi-column' &&
!location.pathname?.startsWith('/deck')
) {
location.pathname = `/deck${location.pathname}`;
}
return location;
}
browserHistory.push = (path: HistoryPath, state?: MastodonLocationState) => {
const location = normalizePath(path, state);
location.state = location.state ?? {};
location.state.fromMastodon = true;
originalPush(location);
};
browserHistory.replace = (path: string, state?: MastodonLocationState) => {
browserHistory.replace = (path: HistoryPath, state?: MastodonLocationState) => {
const location = normalizePath(path, state);
if (!location.pathname) return;
if (browserHistory.location.state?.fromMastodon) {
state = state ?? {};
state.fromMastodon = true;
location.state = location.state ?? {};
location.state.fromMastodon = true;
}
if (layoutFromWindow() === 'multi-column' && !path.startsWith('/deck')) {
originalReplace(`/deck${path}`, state);
} else {
originalReplace(path, state);
}
originalReplace(location);
};
export const Router: React.FC<PropsWithChildren> = ({ children }) => {

View File

@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import { Children, cloneElement, PureComponent } from 'react';
import classNames from 'classnames';
import { useLocation } from 'react-router-dom';
import { List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';
@@ -23,17 +24,43 @@ const MOUSE_IDLE_DELAY = 300;
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
/**
*
* @param {import('flavours/glitch/store').RootState} state
* @param {*} props
*/
const mapStateToProps = (state, { scrollKey }) => {
return {
preventScroll: scrollKey === state.getIn(['dropdown_menu', 'scroll_key']),
preventScroll: scrollKey === state.dropdownMenu.scrollKey,
};
};
class ScrollableList extends PureComponent {
// This component only exists to be able to call useLocation()
const IOArticleContainerWrapper = ({id, index, listLength, intersectionObserverWrapper, trackScroll, scrollKey, children}) => {
const location = useLocation();
static contextTypes = {
router: PropTypes.object,
};
return (<IntersectionObserverArticleContainer
id={id}
index={index}
listLength={listLength}
intersectionObserverWrapper={intersectionObserverWrapper}
saveHeightKey={trackScroll ? `${location.key}:${scrollKey}` : null}
>
{children}
</IntersectionObserverArticleContainer>);
};
IOArticleContainerWrapper.propTypes = {
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
index: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
listLength: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
scrollKey: PropTypes.string.isRequired,
intersectionObserverWrapper: PropTypes.object.isRequired,
trackScroll: PropTypes.bool.isRequired,
children: PropTypes.node,
};
class ScrollableList extends PureComponent {
static propTypes = {
scrollKey: PropTypes.string.isRequired,
@@ -73,7 +100,7 @@ class ScrollableList extends PureComponent {
const clientHeight = this.getClientHeight();
const offset = scrollHeight - scrollTop - clientHeight;
if (400 > offset && this.props.onLoadMore && this.props.hasMore && !this.props.isLoading) {
if (scrollTop > 0 && offset < 400 && this.props.onLoadMore && this.props.hasMore && !this.props.isLoading) {
this.props.onLoadMore();
}
@@ -326,13 +353,14 @@ class ScrollableList extends PureComponent {
{loadPending}
{Children.map(this.props.children, (child, index) => (
<IntersectionObserverArticleContainer
<IOArticleContainerWrapper
key={child.key}
id={child.key}
index={index}
listLength={childrenCount}
intersectionObserverWrapper={this.intersectionObserverWrapper}
saveHeightKey={trackScroll ? `${this.context.router.route.location.key}:${scrollKey}` : null}
trackScroll={trackScroll}
scrollKey={scrollKey}
>
{cloneElement(child, {
getScrollPosition: this.getScrollPosition,
@@ -340,7 +368,7 @@ class ScrollableList extends PureComponent {
cachedMediaWidth: this.state.cachedMediaWidth,
cacheMediaWidth: this.cacheMediaWidth,
})}
</IntersectionObserverArticleContainer>
</IOArticleContainerWrapper>
))}
{loadMore}

View File

@@ -14,6 +14,7 @@ import PollContainer from 'flavours/glitch/containers/poll_container';
import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container';
import { displayMedia } from 'flavours/glitch/initial_state';
import { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';
import { withOptionalRouter, WithOptionalRouterPropTypes } from 'flavours/glitch/utils/react_router';
import Card from '../features/status/components/card';
import Bundle from '../features/ui/components/bundle';
@@ -67,10 +68,6 @@ export const defaultMediaVisibility = (status, settings) => {
class Status extends ImmutablePureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
containerId: PropTypes.string,
id: PropTypes.string,
@@ -117,6 +114,7 @@ class Status extends ImmutablePureComponent {
inUse: PropTypes.bool,
available: PropTypes.bool,
}),
...WithOptionalRouterPropTypes,
};
state = {
@@ -356,10 +354,9 @@ class Status extends ImmutablePureComponent {
// Otherwise, we open the url handed to us in `destination`, if
// applicable.
parseClick = (e, destination) => {
const { router } = this.context;
const { status } = this.props;
const { status, history } = this.props;
const { isCollapsed } = this.state;
if (!router) return;
if (!history) return;
if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey)) {
if (isCollapsed) this.setCollapsed(false);
@@ -377,7 +374,7 @@ class Status extends ImmutablePureComponent {
status.getIn(['reblog', 'id'], status.get('id'))
}`;
}
router.history.push(destination);
history.push(destination);
}
e.preventDefault();
}
@@ -431,7 +428,7 @@ class Status extends ImmutablePureComponent {
handleHotkeyReply = e => {
e.preventDefault();
this.props.onReply(this.props.status, this.context.router.history);
this.props.onReply(this.props.status, this.props.history);
};
handleHotkeyFavourite = (e) => {
@@ -448,16 +445,16 @@ class Status extends ImmutablePureComponent {
handleHotkeyMention = e => {
e.preventDefault();
this.props.onMention(this.props.status.get('account'), this.context.router.history);
this.props.onMention(this.props.status.get('account'), this.props.history);
};
handleHotkeyOpen = () => {
const status = this.props.status;
this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`);
this.props.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`);
};
handleHotkeyOpenProfile = () => {
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);
this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);
};
handleHotkeyMoveUp = e => {
@@ -514,7 +511,6 @@ class Status extends ImmutablePureComponent {
parseClick,
setCollapsed,
} = this;
const { router } = this.context;
const {
intl,
status,
@@ -533,6 +529,7 @@ class Status extends ImmutablePureComponent {
previousId,
nextInReplyToId,
rootId,
history,
...other
} = this.props;
const { isCollapsed } = this.state;
@@ -828,7 +825,7 @@ class Status extends ImmutablePureComponent {
onExpandedToggle={this.handleExpandedToggle}
onTranslate={this.handleTranslate}
parseClick={parseClick}
disabled={!router}
disabled={!history}
tagLinks={settings.get('tag_misleading_links')}
rewriteMentions={settings.get('rewrite_mentions')}
/>
@@ -854,4 +851,4 @@ class Status extends ImmutablePureComponent {
}
export default injectIntl(Status);
export default withOptionalRouter(injectIntl(Status));

View File

@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
import classNames from 'classnames';
import { withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
@@ -11,6 +12,7 @@ import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_cont
import { me } from 'flavours/glitch/initial_state';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
import { IconButton } from './icon_button';
import { RelativeTimestamp } from './relative_timestamp';
@@ -53,7 +55,6 @@ const messages = defineMessages({
class StatusActionBar extends ImmutablePureComponent {
static contextTypes = {
router: PropTypes.object,
identity: PropTypes.object,
};
@@ -80,6 +81,7 @@ class StatusActionBar extends ImmutablePureComponent {
showReplyCount: PropTypes.bool,
scrollKey: PropTypes.string,
intl: PropTypes.object.isRequired,
...WithRouterPropTypes,
};
// Avoid checking props that are functions (and whose equality will always
@@ -95,7 +97,7 @@ class StatusActionBar extends ImmutablePureComponent {
const { signedIn } = this.context.identity;
if (signedIn) {
this.props.onReply(this.props.status, this.context.router.history);
this.props.onReply(this.props.status, this.props.history);
} else {
this.props.onInteractionModal('reply', this.props.status);
}
@@ -132,15 +134,15 @@ class StatusActionBar extends ImmutablePureComponent {
};
handleDeleteClick = () => {
this.props.onDelete(this.props.status, this.context.router.history);
this.props.onDelete(this.props.status, this.props.history);
};
handleRedraftClick = () => {
this.props.onDelete(this.props.status, this.context.router.history, true);
this.props.onDelete(this.props.status, this.props.history, true);
};
handleEditClick = () => {
this.props.onEdit(this.props.status, this.context.router.history);
this.props.onEdit(this.props.status, this.props.history);
};
handlePinClick = () => {
@@ -148,11 +150,11 @@ class StatusActionBar extends ImmutablePureComponent {
};
handleMentionClick = () => {
this.props.onMention(this.props.status.get('account'), this.context.router.history);
this.props.onMention(this.props.status.get('account'), this.props.history);
};
handleDirectClick = () => {
this.props.onDirect(this.props.status.get('account'), this.context.router.history);
this.props.onDirect(this.props.status.get('account'), this.props.history);
};
handleMuteClick = () => {
@@ -164,12 +166,7 @@ class StatusActionBar extends ImmutablePureComponent {
};
handleOpen = () => {
let state = { ...this.context.router.history.location.state };
if (state.mastodonModalKey) {
this.context.router.history.replace(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`);
} else {
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`);
}
this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`);
};
handleEmbed = () => {
@@ -340,4 +337,4 @@ class StatusActionBar extends ImmutablePureComponent {
}
export default injectIntl(StatusActionBar);
export default withRouter(injectIntl(StatusActionBar));

View File

@@ -4,6 +4,7 @@ import { PureComponent } from 'react';
import { FormattedMessage, injectIntl } from 'react-intl';
import classnames from 'classnames';
import { withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
@@ -131,6 +132,10 @@ class StatusContent extends PureComponent {
rewriteMentions: PropTypes.string,
languages: ImmutablePropTypes.map,
intl: PropTypes.object,
// from react-router
match: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
};
static defaultProps = {
@@ -472,4 +477,4 @@ class StatusContent extends PureComponent {
}
export default connect(mapStateToProps)(injectIntl(StatusContent));
export default withRouter(connect(mapStateToProps)(injectIntl(StatusContent)));

View File

@@ -6,9 +6,12 @@ import DropdownMenu from 'flavours/glitch/components/dropdown_menu';
import { isUserTouching } from '../is_mobile';
/**
* @param {import('flavours/glitch/store').RootState} state
*/
const mapStateToProps = state => ({
openDropdownId: state.getIn(['dropdown_menu', 'openId']),
openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
openDropdownId: state.dropdownMenu.openId,
openedViaKeyboard: state.dropdownMenu.keyboard,
});
const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
@@ -20,7 +23,7 @@ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
actions: items,
onClick: onItemClick,
},
}) : openDropdownMenu(id, keyboard, scrollKey));
}) : openDropdownMenu({ id, keyboard, scrollKey }));
},
onClose(id) {
@@ -28,7 +31,7 @@ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
modalType: 'ACTIONS',
ignoreFocus: false,
}));
dispatch(closeDropdownMenu(id));
dispatch(closeDropdownMenu({ id }));
},
});

View File

@@ -14,10 +14,6 @@ const messages = defineMessages({
class FeaturedTags extends ImmutablePureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
account: ImmutablePropTypes.map,
featuredTags: ImmutablePropTypes.list,

View File

@@ -4,18 +4,20 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import { Helmet } from 'react-helmet';
import { withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { Avatar } from 'flavours/glitch/components/avatar';
import Button from 'flavours/glitch/components/button';
import { Button } from 'flavours/glitch/components/button';
import { Icon } from 'flavours/glitch/components/icon';
import { IconButton } from 'flavours/glitch/components/icon_button';
import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
import { autoPlayGif, me, domain } from 'flavours/glitch/initial_state';
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
import { preferencesLink, profileLink, accountAdminLink } from 'flavours/glitch/utils/backend_links';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
import AccountNoteContainer from '../containers/account_note_container';
import FollowRequestNoteContainer from '../containers/follow_request_note_container';
@@ -81,10 +83,6 @@ const dateFormatOptions = {
class Header extends ImmutablePureComponent {
static contextTypes = {
identity: PropTypes.object,
};
static propTypes = {
account: ImmutablePropTypes.map,
identity_props: ImmutablePropTypes.list,
@@ -107,6 +105,11 @@ class Header extends ImmutablePureComponent {
intl: PropTypes.object.isRequired,
domain: PropTypes.string.isRequired,
hidden: PropTypes.bool,
...WithRouterPropTypes,
};
static contextTypes = {
identity: PropTypes.object,
};
openEditProfile = () => {
@@ -406,4 +409,4 @@ class Header extends ImmutablePureComponent {
}
export default injectIntl(Header);
export default withRouter(injectIntl(Header));

View File

@@ -2,18 +2,19 @@ import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import { NavLink } from 'react-router-dom';
import { NavLink, withRouter } from 'react-router-dom';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ActionBar from 'flavours/glitch/features/account/components/action_bar';
import InnerHeader from 'flavours/glitch/features/account/components/header';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
import MemorialNote from './memorial_note';
import MovedNote from './moved_note';
export default class Header extends ImmutablePureComponent {
class Header extends ImmutablePureComponent {
static propTypes = {
account: ImmutablePropTypes.map,
@@ -34,10 +35,7 @@ export default class Header extends ImmutablePureComponent {
hideTabs: PropTypes.bool,
domain: PropTypes.string.isRequired,
hidden: PropTypes.bool,
};
static contextTypes = {
router: PropTypes.object,
...WithRouterPropTypes,
};
handleFollow = () => {
@@ -49,11 +47,11 @@ export default class Header extends ImmutablePureComponent {
};
handleMention = () => {
this.props.onMention(this.props.account, this.context.router.history);
this.props.onMention(this.props.account, this.props.history);
};
handleDirect = () => {
this.props.onDirect(this.props.account, this.context.router.history);
this.props.onDirect(this.props.account, this.props.history);
};
handleReport = () => {
@@ -162,3 +160,5 @@ export default class Header extends ImmutablePureComponent {
}
}
export default withRouter(Header);

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