diff --git a/.circleci/config.yml b/.circleci/config.yml index 2f3860d7c..e1c43ff80 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -167,8 +167,45 @@ jobs: name: Create database command: ./bin/rails db:create - run: - name: Run migrations + command: ./bin/rails db:migrate VERSION=20171010025614 + name: Run migrations up to v2.0.0 + - run: + command: ./bin/rails tests:migrations:populate_v2 + name: Populate database with test data + - run: command: ./bin/rails db:migrate + name: Run all remaining migrations + + test-two-step-migrations: + <<: *defaults + docker: + - image: circleci/ruby:2.7-buster-node + environment: *ruby_environment + - image: circleci/postgres:12.2 + environment: + POSTGRES_USER: root + POSTGRES_HOST_AUTH_METHOD: trust + - image: circleci/redis:5-alpine + steps: + - *attach_workspace + - *install_system_dependencies + - run: + command: ./bin/rails db:create + name: Create database + - run: + command: ./bin/rails db:migrate VERSION=20171010025614 + name: Run migrations up to v2.0.0 + - run: + command: ./bin/rails tests:migrations:populate_v2 + name: Populate database with test data + - run: + command: ./bin/rails db:migrate + name: Run all pre-deployment migrations + evironment: + SKIP_POST_DEPLOYMENT_MIGRATIONS: true + - run: + command: ./bin/rails db:migrate + name: Run all post-deployment remaining migrations test-ruby2.7: <<: *defaults @@ -216,24 +253,6 @@ jobs: name: Run jest command: yarn test:jest - check-i18n: - <<: *defaults - steps: - - *attach_workspace - - *install_system_dependencies - - run: - name: Check locale file normalization - command: bundle exec i18n-tasks check-normalized - - run: - name: Check for unused strings - command: bundle exec i18n-tasks unused -l en - - run: - name: Check for wrong string interpolations - command: bundle exec i18n-tasks check-consistent-interpolations - - run: - name: Check that all required locale files exist - command: bundle exec rake repo:check_locales_files - workflows: version: 2 build-and-test: @@ -256,6 +275,9 @@ workflows: - test-migrations: requires: - install-ruby2.7 + - test-two-step-migrations: + requires: + - install-ruby2.7 - test-ruby2.7: requires: - install-ruby2.7 @@ -271,6 +293,3 @@ workflows: - test-webui: requires: - install - - check-i18n: - requires: - - install-ruby2.7 diff --git a/.dockerignore b/.dockerignore index 9bc23d813..52397e75d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,10 @@ .bundle .env .env.* +.git +.gitattributes +.gitignore +.github public/system public/assets public/packs diff --git a/.env.production.sample b/.env.production.sample index 6f14c5804..ff6db83ca 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -4,6 +4,12 @@ # not demonstrate all available configuration options. Please look at # https://docs.joinmastodon.org/admin/config/ for the full documentation. +# Note that this file accepts slightly different syntax depending on whether +# you are using `docker-compose` or not. In particular, if you use +# `docker-compose`, the value of each declared variable will be taken verbatim, +# including surrounding quotes. +# See: https://github.com/mastodon/mastodon/issues/16895 + # Federation # ---------- # This identifies your server and cannot be changed safely later diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 32919bd50..fd6f74689 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -# CODEOWNERS for tootsuite/mastodon +# CODEOWNERS for mastodon/mastodon # Translators # To add translator, copy these lines, replace `fr` with appropriate language code and replace `@żelipapą` with user's GitHub nickname preceded by `@` sign or e-mail address. diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml new file mode 100644 index 000000000..58f2813d3 --- /dev/null +++ b/.github/workflows/build-image.yml @@ -0,0 +1,34 @@ +name: Build container image +on: + workflow_dispatch: + push: + branches: + - "main" + tags: + - "*" +jobs: + build-image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: docker/setup-buildx-action@v1 + - uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - uses: docker/metadata-action@v3 + id: meta + with: + images: tootsuite/mastodon + flavor: | + latest=auto + tags: | + type=edge,branch=main + type=semver,pattern={{ raw }} + - uses: docker/build-push-action@v2 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + cache-from: type=registry,ref=tootsuite/mastodon:latest + cache-to: type=inline diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml new file mode 100644 index 000000000..398e78b0f --- /dev/null +++ b/.github/workflows/check-i18n.yml @@ -0,0 +1,34 @@ +name: Check i18n + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + RAILS_ENV: test + +jobs: + check-i18n: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '2.7' + bundler-cache: true + - name: Check locale file normalization + run: bundle exec i18n-tasks check-normalized + - name: Check for unused strings + run: bundle exec i18n-tasks unused -l en + - name: Check for wrong string interpolations + run: bundle exec i18n-tasks check-consistent-interpolations + - name: Check that all required locale files exist + run: bundle exec rake repo:check_locales_files diff --git a/AUTHORS.md b/AUTHORS.md index 96412ff63..596451737 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,7 +1,7 @@ Authors ======= -Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) +Mastodon is available on [GitHub](https://github.com/mastodon/mastodon) and provided thanks to the work of the following contributors: * [Gargron](https://github.com/Gargron) @@ -719,7 +719,7 @@ and provided thanks to the work of the following contributors: * [西小倉宏信](mailto:nishiko@mindia.jp) * [雨宮美羽](mailto:k737566@gmail.com) -This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. +This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/mastodon/mastodon/graphs/contributors) instead. ## Translators diff --git a/CHANGELOG.md b/CHANGELOG.md index 12d1563c0..c2eff7fa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,409 +3,517 @@ Changelog All notable changes to this project will be documented in this file. +## [3.4.6] - 2022-02-03 +### Fixed +- Fix `mastodon:webpush:generate_vapid_key` task requiring a functional environment ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17338)) +- Fix spurious errors when receiving an Add activity for a private post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17425)) + +### Security +- Fix error-prone SQL queries ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15828)) +- Fix not compacting incoming signed JSON-LD activities ([puckipedia](https://github.com/mastodon/mastodon/pull/17426), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17428)) (CVE-2022-24307) +- Fix insufficient sanitization of report comments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17430)) +- Fix stop condition of a Common Table Expression ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17427)) +- Disable legacy XSS filtering ([Wonderfall](https://github.com/mastodon/mastodon/pull/17289)) + +## [3.4.5] - 2022-01-31 +### Added +- Add more advanced migration tests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17393)) +- Add github workflow to build Docker images ([unasuke](https://github.com/mastodon/mastodon/pull/16973), [Gargron](https://github.com/mastodon/mastodon/pull/16980), [Gargron](https://github.com/mastodon/mastodon/pull/17000)) + +### Fixed +- Fix some old migrations failing when skipping releases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17394)) +- Fix migrations script failing in certain edge cases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17398)) +- Fix Docker build ([tribela](https://github.com/mastodon/mastodon/pull/17188)) +- Fix Ruby 3.0 dependencies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16723)) +- Fix followers synchronization mechanism ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16510)) + +## [3.4.4] - 2021-11-26 +### Fixed + +- Fix error when suspending user with an already blocked canonical email ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17036)) +- Fix overflow of long profile fields in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17010)) +- Fix confusing error when WebFinger request returns empty document ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16986)) +- Fix upload of remote media with OpenStack Swift sometimes failing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16998)) +- Fix logout link not working in Safari ([noellabo](https://github.com/mastodon/mastodon/pull/16574)) +- Fix “open” link of media modal not closing modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16524)) +- Fix replying from modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16516)) +- Fix `mastodon:setup` command crashing in some circumstances ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16976)) + +### Security + +- Fix filtering DMs from non-followed users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17042)) +- Fix handling of recursive toots in WebUI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17041)) + +## [3.4.3] - 2021-11-06 +### Fixed + +- Fix login being broken due to inaccurately applied backport fix in 3.4.2 ([Gargron](https://github.com/mastodon/mastodon/commit/5c47a18c8df3231aa25c6d1f140a71a7fac9cbf9)) + +## [3.4.2] - 2021-11-06 +### Added + +- Add `configuration` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/mastodon/mastodon/pull/16485)) + +### Fixed + +- Fix handling of back button with modal windows in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16499)) +- Fix pop-in player when author has long username in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16468)) +- Fix crash when a status with a playing video gets deleted in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16384)) +- Fix crash with Microsoft Translate in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16525)) +- Fix PWA not being usable from alternate domains ([HolgerHuo](https://github.com/mastodon/mastodon/pull/16714)) +- Fix locale-specific number rounding errors ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16469)) +- Fix scheduling a status decreasing status count ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16791)) +- Fix user's canonical email address being blocked when user deletes own account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16503)) +- Fix not being able to suspend users that already have their canonical e-mail blocked ([Gargron](https://github.com/mastodon/mastodon/pull/16455)) +- Fix anonymous access to outbox not being cached by the reverse proxy ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16458)) +- Fix followers synchronization mechanism not working when URI has empty path ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16744)) +- Fix serialization of counts in REST API when user hides their network ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16418)) +- Fix inefficiencies in auto-linking code ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16506)) +- Fix `tootctl self-destruct` not sending delete activities for recently-suspended accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16688)) +- Fix suspicious sign-in e-mail text being out of date ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16690)) +- Fix some frameworks being unnecessarily loaded ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16725)) +- Fix canonical e-mail blocks missing foreign key constraints ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16448)) +- Fix inconsistent order on account's statuses page in admin UI ([tribela](https://github.com/mastodon/mastodon/pull/16937)) +- Fix media from blocked domains being redownloaded by `tootctl media refresh` ([tribela](https://github.com/mastodon/mastodon/pull/16914)) +- Fix `mastodon:setup` generated env-file syntax ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16896)) +- Fix link previews being incorrectly generated from earlier links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16885)) +- Fix wrong `to`/`cc` values for remote groups in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16700)) +- Fix mentions with non-ascii TLDs not being processed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16689)) +- Fix authentication failures halfway through a sign-in attempt ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16607), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16792)) +- Fix suspended accounts statuses being merged back into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16628)) +- Fix crash when encountering invalid account fields ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16598)) +- Fix invalid blurhash handling for remote activities ([noellabo](https://github.com/mastodon/mastodon/pull/16583)) +- Fix newlines being added to accout notes when an account moves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16415), [noellabo](https://github.com/mastodon/mastodon/pull/16576)) +- Fix crash when creating an announcement with links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16941)) +- Fix logging out from one browser logging out all other sessions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943)) + +### Security + +- Fix user notes not having a length limit ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16942)) +- Fix revoking a specific session not working ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943)) + +## [3.4.1] - 2021-06-03 +### Added + +- Add new emoji assets from Twemoji 13.1.0 ([Gargron](https://github.com/mastodon/mastodon/pull/16345)) + +### Fixed + +- Fix some ActivityPub identifiers in server actor outbox ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16343)) +- Fix custom CSS path setting cookies and being uncacheable due to it ([tribela](https://github.com/mastodon/mastodon/pull/16314)) +- Fix unread notification count when polling in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16272)) +- Fix health check not being accessible through localhost ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16270)) +- Fix some redis locks auto-releasing too fast ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16276), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16291)) +- Fix e-mail confirmations API not working correctly ([Gargron](https://github.com/mastodon/mastodon/pull/16348)) +- Fix migration script not being able to run if it fails midway ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16312)) +- Fix account deletion sometimes failing because of optimistic locks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16317)) +- Fix deprecated slash as division in SASS files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16347)) +- Fix `tootctl search deploy` compatibility error on Ruby 3 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16346)) +- Fix mailer jobs for deleted notifications erroring out ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16294)) + ## [3.4.0] - 2021-05-16 ### Added -- **Add follow recommendations for onboarding** ([Gargron](https://github.com/tootsuite/mastodon/pull/15945), [Gargron](https://github.com/tootsuite/mastodon/pull/16161), [Gargron](https://github.com/tootsuite/mastodon/pull/16060), [Gargron](https://github.com/tootsuite/mastodon/pull/16077), [Gargron](https://github.com/tootsuite/mastodon/pull/16078), [Gargron](https://github.com/tootsuite/mastodon/pull/16160), [Gargron](https://github.com/tootsuite/mastodon/pull/16079), [noellabo](https://github.com/tootsuite/mastodon/pull/16044), [noellabo](https://github.com/tootsuite/mastodon/pull/16045), [Gargron](https://github.com/tootsuite/mastodon/pull/16152), [Gargron](https://github.com/tootsuite/mastodon/pull/16153), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16082), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16173), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16159), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16189)) +- **Add follow recommendations for onboarding** ([Gargron](https://github.com/mastodon/mastodon/pull/15945), [Gargron](https://github.com/mastodon/mastodon/pull/16161), [Gargron](https://github.com/mastodon/mastodon/pull/16060), [Gargron](https://github.com/mastodon/mastodon/pull/16077), [Gargron](https://github.com/mastodon/mastodon/pull/16078), [Gargron](https://github.com/mastodon/mastodon/pull/16160), [Gargron](https://github.com/mastodon/mastodon/pull/16079), [noellabo](https://github.com/mastodon/mastodon/pull/16044), [noellabo](https://github.com/mastodon/mastodon/pull/16045), [Gargron](https://github.com/mastodon/mastodon/pull/16152), [Gargron](https://github.com/mastodon/mastodon/pull/16153), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16082), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16173), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16159), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16189)) - Tutorial on first web UI launch has been replaced with follow suggestions - Follow suggestions take user locale into account and are a mix of accounts most followed by currently active local users, and accounts that wrote the most shared/favourited posts in the last 30 days - Only accounts that have opted-in to being discoverable from their profile settings, and that do not require follow requests, will be suggested - Moderators can review suggestions for every supported locale and suppress specific suggestions from appearing and admins can ensure certain accounts always show up in suggestions from the settings area - New users no longer automatically follow admins -- **Add server rules** ([Gargron](https://github.com/tootsuite/mastodon/pull/15769), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15778)) +- **Add server rules** ([Gargron](https://github.com/mastodon/mastodon/pull/15769), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15778)) - Admins can create and edit itemized server rules - They are available through the REST API and on the about page -- **Add canonical e-mail blocks for suspended accounts** ([Gargron](https://github.com/tootsuite/mastodon/pull/16049)) +- **Add canonical e-mail blocks for suspended accounts** ([Gargron](https://github.com/mastodon/mastodon/pull/16049)) - Normally, people can make multiple accounts using the same e-mail address using the `+` trick or by inserting or removing `.` characters from the first part of their address - Once an account is suspended, it will no longer be possible for the e-mail address used by that account to be used for new sign-ups in any of its forms -- Add management of delivery availability in admin UI ([noellabo](https://github.com/tootsuite/mastodon/pull/15771)) -- **Add system checks to dashboard in admin UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15989), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15954), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16002)) +- Add management of delivery availability in admin UI ([noellabo](https://github.com/mastodon/mastodon/pull/15771)) +- **Add system checks to dashboard in admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/15989), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15954), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16002)) - The dashboard will now warn you if you some Sidekiq queues are not being processed, if you have not defined any server rules, or if you forgot to run database migrations from the latest Mastodon upgrade -- Add inline description of moderation actions in admin UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15792)) -- Add "recommended" label to activity/peers API toggles in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/16081)) -- Add joined date to profiles in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/16169), [rinsuki](https://github.com/tootsuite/mastodon/pull/16186)) -- Add transition to media modal background in web UI ([mkljczk](https://github.com/tootsuite/mastodon/pull/15843)) -- Add option to opt-out of unread notification markers in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15842)) -- Add borders to 📱, 🚲, and 📲 emojis in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15794), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16035)) -- Add dropdown for boost privacy in boost confirmation modal in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15704)) -- Add support for Ruby 3.0 ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16046), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16174)) -- Add `Message-ID` header to outgoing emails ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16076)) +- Add inline description of moderation actions in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15792)) +- Add "recommended" label to activity/peers API toggles in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16081)) +- Add joined date to profiles in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16169), [rinsuki](https://github.com/mastodon/mastodon/pull/16186)) +- Add transition to media modal background in web UI ([mkljczk](https://github.com/mastodon/mastodon/pull/15843)) +- Add option to opt-out of unread notification markers in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15842)) +- Add borders to 📱, 🚲, and 📲 emojis in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15794), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16035)) +- Add dropdown for boost privacy in boost confirmation modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15704)) +- Add support for Ruby 3.0 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16046), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16174)) +- Add `Message-ID` header to outgoing emails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16076)) - Some e-mail spam filters penalize e-mails that have a `Message-ID` header that uses a different domain name than the sending e-mail address. Now, the same domain will be used -- Add `af`, `gd` and `si` locales ([Gargron](https://github.com/tootsuite/mastodon/pull/16090)) -- Add guard against DNS rebinding attacks ([noellabo](https://github.com/tootsuite/mastodon/pull/16087), [noellabo](https://github.com/tootsuite/mastodon/pull/16095)) -- Add HTTP header to explicitly opt-out of FLoC by default ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16036)) -- Add missing push notification title for polls and statuses ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15929), [mkljczk](https://github.com/tootsuite/mastodon/pull/15564), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15931)) -- Add `POST /api/v1/emails/confirmations` to REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/15816), [Gargron](https://github.com/tootsuite/mastodon/pull/15949)) +- Add `af`, `gd` and `si` locales ([Gargron](https://github.com/mastodon/mastodon/pull/16090)) +- Add guard against DNS rebinding attacks ([noellabo](https://github.com/mastodon/mastodon/pull/16087), [noellabo](https://github.com/mastodon/mastodon/pull/16095)) +- Add HTTP header to explicitly opt-out of FLoC by default ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16036)) +- Add missing push notification title for polls and statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15929), [mkljczk](https://github.com/mastodon/mastodon/pull/15564), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15931)) +- Add `POST /api/v1/emails/confirmations` to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/15816), [Gargron](https://github.com/mastodon/mastodon/pull/15949)) - This method allows an app through which a user signed-up to request a new confirmation e-mail to be sent, or to change the e-mail of the account before it is confirmed -- Add `GET /api/v1/accounts/lookup` to REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/15740), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15750)) +- Add `GET /api/v1/accounts/lookup` to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/15740), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15750)) - This method allows to quickly convert a username of a known account to an ID that can be used with the REST API, or to check if a username is available for sign-up -- Add `policy` param to `POST /api/v1/push/subscriptions` in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/16040)) +- Add `policy` param to `POST /api/v1/push/subscriptions` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/16040)) - This param allows an app to control from whom notifications should be delivered as push notifications to the app -- Add `details` to error response for `POST /api/v1/accounts` in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/15803)) +- Add `details` to error response for `POST /api/v1/accounts` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/15803)) - This attribute allows an app to display more helpful information to the user about why the sign-up did not succeed -- Add `SIDEKIQ_REDIS_URL` and related environment variables to optionally use a separate Redis server for Sidekiq ([noellabo](https://github.com/tootsuite/mastodon/pull/16188)) +- Add `SIDEKIQ_REDIS_URL` and related environment variables to optionally use a separate Redis server for Sidekiq ([noellabo](https://github.com/mastodon/mastodon/pull/16188)) ### Changed -- Change trending hashtags to be affected be reblogs ([Gargron](https://github.com/tootsuite/mastodon/pull/16164)) +- Change trending hashtags to be affected be reblogs ([Gargron](https://github.com/mastodon/mastodon/pull/16164)) - Previously, only original posts contributed to a hashtag's trending score - Now, reblogs of posts will also contribute to that hashtag's trending score -- Change e-mail confirmation link to always redirect to web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16151)) -- Change log level of worker lifecycle to WARN in streaming API ([Gargron](https://github.com/tootsuite/mastodon/pull/16110)) +- Change e-mail confirmation link to always redirect to web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16151)) +- Change log level of worker lifecycle to WARN in streaming API ([Gargron](https://github.com/mastodon/mastodon/pull/16110)) - Since running with INFO log level in production is not always desirable, it is easy to miss when a worker is shutdown and a new one is started -- Change the nouns "toot" and "status" to "post" in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/16080), [Gargron](https://github.com/tootsuite/mastodon/pull/16089)) +- Change the nouns "toot" and "status" to "post" in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16080), [Gargron](https://github.com/mastodon/mastodon/pull/16089)) - To be clear, the button still says "Toot!" -- Change order of dropdown menu on posts to be more intuitive in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15647)) -- Change description of keyboard shortcuts in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/16129)) -- Change option labels on edit profile page ([Gargron](https://github.com/tootsuite/mastodon/pull/16041)) +- Change order of dropdown menu on posts to be more intuitive in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15647)) +- Change description of keyboard shortcuts in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/16129)) +- Change option labels on edit profile page ([Gargron](https://github.com/mastodon/mastodon/pull/16041)) - "Lock account" is now "Require follow requests" - "List this account on the directory" is now "Suggest account to others" - "Hide your network" is now "Hide your social graph" -- Change newly generated account IDs to not be enumerable ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15844)) -- Change Web Push API deliveries to use request pooling ([Gargron](https://github.com/tootsuite/mastodon/pull/16014)) -- Change multiple mentions with same username to render with domain ([Gargron](https://github.com/tootsuite/mastodon/pull/15718), [noellabo](https://github.com/tootsuite/mastodon/pull/16038)) +- Change newly generated account IDs to not be enumerable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15844)) +- Change Web Push API deliveries to use request pooling ([Gargron](https://github.com/mastodon/mastodon/pull/16014)) +- Change multiple mentions with same username to render with domain ([Gargron](https://github.com/mastodon/mastodon/pull/15718), [noellabo](https://github.com/mastodon/mastodon/pull/16038)) - When a post contains mentions of two or more users who have the same username, but on different domains, render their names with domain to help disambiguate them - Always render the domain of usernames used in profile metadata -- Change health check endpoint to reveal less information ([Gargron](https://github.com/tootsuite/mastodon/pull/15988)) -- Change account counters to use upsert (requires Postgres >= 9.5) ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15913)) -- Change `mastodon:setup` to not call `assets:precompile` in Docker ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/13942)) -- **Change max. image dimensions to 1920x1080px (1080p)** ([Gargron](https://github.com/tootsuite/mastodon/pull/15690)) +- Change health check endpoint to reveal less information ([Gargron](https://github.com/mastodon/mastodon/pull/15988)) +- Change account counters to use upsert (requires Postgres >= 9.5) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15913)) +- Change `mastodon:setup` to not call `assets:precompile` in Docker ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13942)) +- **Change max. image dimensions to 1920x1080px (1080p)** ([Gargron](https://github.com/mastodon/mastodon/pull/15690)) - Previously, this was 1280x1280px - This is the amount of pixels that original images get downsized to -- Change custom emoji to be animated when hovering container in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15637)) -- Change streaming API from deprecated ClusterWS/cws to ws ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15932)) -- Change systemd configuration to add sandboxing features ([Izorkin](https://github.com/tootsuite/mastodon/pull/15937), [Izorkin](https://github.com/tootsuite/mastodon/pull/16103), [Izorkin](https://github.com/tootsuite/mastodon/pull/16127)) -- Change nginx configuration to make running Onion service easier ([cohosh](https://github.com/tootsuite/mastodon/pull/15498)) -- Change Helm configuration ([dunn](https://github.com/tootsuite/mastodon/pull/15722), [dunn](https://github.com/tootsuite/mastodon/pull/15728), [dunn](https://github.com/tootsuite/mastodon/pull/15748), [dunn](https://github.com/tootsuite/mastodon/pull/15749), [dunn](https://github.com/tootsuite/mastodon/pull/15767)) -- Change Docker configuration ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10823), [mashirozx](https://github.com/tootsuite/mastodon/pull/15978)) +- Change custom emoji to be animated when hovering container in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15637)) +- Change streaming API from deprecated ClusterWS/cws to ws ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15932)) +- Change systemd configuration to add sandboxing features ([Izorkin](https://github.com/mastodon/mastodon/pull/15937), [Izorkin](https://github.com/mastodon/mastodon/pull/16103), [Izorkin](https://github.com/mastodon/mastodon/pull/16127)) +- Change nginx configuration to make running Onion service easier ([cohosh](https://github.com/mastodon/mastodon/pull/15498)) +- Change Helm configuration ([dunn](https://github.com/mastodon/mastodon/pull/15722), [dunn](https://github.com/mastodon/mastodon/pull/15728), [dunn](https://github.com/mastodon/mastodon/pull/15748), [dunn](https://github.com/mastodon/mastodon/pull/15749), [dunn](https://github.com/mastodon/mastodon/pull/15767)) +- Change Docker configuration ([SuperSandro2000](https://github.com/mastodon/mastodon/pull/10823), [mashirozx](https://github.com/mastodon/mastodon/pull/15978)) ### Removed -- Remove PubSubHubbub-related columns from accounts table ([Gargron](https://github.com/tootsuite/mastodon/pull/16170), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15857)) -- Remove dependency on @babel/plugin-proposal-class-properties ([ykzts](https://github.com/tootsuite/mastodon/pull/16155)) -- Remove dependency on pluck_each gem ([Gargron](https://github.com/tootsuite/mastodon/pull/16012)) -- Remove spam check and dependency on nilsimsa gem ([Gargron](https://github.com/tootsuite/mastodon/pull/16011)) -- Remove MySQL-specific code from Mastodon::MigrationHelpers ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15924)) -- Remove IE11 from supported browsers target ([gol-cha](https://github.com/tootsuite/mastodon/pull/15779)) +- Remove PubSubHubbub-related columns from accounts table ([Gargron](https://github.com/mastodon/mastodon/pull/16170), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15857)) +- Remove dependency on @babel/plugin-proposal-class-properties ([ykzts](https://github.com/mastodon/mastodon/pull/16155)) +- Remove dependency on pluck_each gem ([Gargron](https://github.com/mastodon/mastodon/pull/16012)) +- Remove spam check and dependency on nilsimsa gem ([Gargron](https://github.com/mastodon/mastodon/pull/16011)) +- Remove MySQL-specific code from Mastodon::MigrationHelpers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15924)) +- Remove IE11 from supported browsers target ([gol-cha](https://github.com/mastodon/mastodon/pull/15779)) ### Fixed -- Fix "You might be interested in" flashing while searching in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/16162)) -- Fix display of posts without text content in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15665)) -- Fix Google Translate breaking web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15610), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15611)) -- Fix web UI crashing when SVG support is disabled ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15809)) -- Fix web UI crash when a status opened in the media modal is deleted ([kaias1jp](https://github.com/tootsuite/mastodon/pull/15701)) -- Fix OCR language data failing to load in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15519)) -- Fix footer links not being clickable in Safari in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/15496)) -- Fix autofocus/autoselection not working on mobile in web UI ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15555), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15985)) -- Fix media redownload worker retrying on unexpected response codes ([Gargron](https://github.com/tootsuite/mastodon/pull/16111)) -- Fix thread resolve worker retrying when status no longer exists ([Gargron](https://github.com/tootsuite/mastodon/pull/16109)) -- Fix n+1 queries when rendering statuses in REST API ([abcang](https://github.com/tootsuite/mastodon/pull/15641)) -- Fix n+1 queries when rendering notifications in REST API ([abcang](https://github.com/tootsuite/mastodon/pull/15640)) -- Fix delete of local reply to local parent not being forwarded ([Gargron](https://github.com/tootsuite/mastodon/pull/16096)) -- Fix remote reporters not receiving suspend/unsuspend activities ([Gargron](https://github.com/tootsuite/mastodon/pull/16050)) -- Fix understanding (not fully qualified) `as:Public` and `Public` ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15948)) -- Fix actor update not being distributed on profile picture deletion ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15461)) -- Fix processing of incoming Delete activities ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16084)) -- Fix processing of incoming Block activities ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15546)) -- Fix processing of incoming Update activities of unknown accounts ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15514)) -- Fix URIs of repeat follow requests not being recorded ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15662)) -- Fix error on requests with no `Digest` header ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15782)) -- Fix activity object not requiring signature in secure mode ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15592)) -- Fix database serialization failure returning HTTP 500 ([Gargron](https://github.com/tootsuite/mastodon/pull/16101)) -- Fix media processing getting stuck on too much stdin/stderr ([Gargron](https://github.com/tootsuite/mastodon/pull/16136)) -- Fix some inefficient array manipulations ([007lva](https://github.com/tootsuite/mastodon/pull/15513), [007lva](https://github.com/tootsuite/mastodon/pull/15527)) -- Fix some inefficient regex matching ([007lva](https://github.com/tootsuite/mastodon/pull/15528)) -- Fix some inefficient SQL queries ([abcang](https://github.com/tootsuite/mastodon/pull/16104), [abcang](https://github.com/tootsuite/mastodon/pull/16106), [abcang](https://github.com/tootsuite/mastodon/pull/16105)) -- Fix trying to fetch key from empty URI when verifying HTTP signature ([Gargron](https://github.com/tootsuite/mastodon/pull/16100)) -- Fix `tootctl maintenance fix-duplicates` failures ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15923), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15515)) -- Fix error when removing status caused by race condition ([Gargron](https://github.com/tootsuite/mastodon/pull/16099)) -- Fix blocking someone not clearing up list feeds ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16205)) -- Fix misspelled URLs character counting ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15382)) -- Fix Sidekiq hanging forever due to a Resolv bug in Ruby 2.7.3 ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16157)) -- Fix edge case where follow limit interferes with accepting a follow ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16098)) -- Fix inconsistent lead text style in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/16052), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16086)) -- Fix reports of already suspended accounts being recorded ([Gargron](https://github.com/tootsuite/mastodon/pull/16047)) -- Fix sign-up restrictions based on IP addresses not being enforced ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15607)) -- Fix YouTube embeds failing due to YouTube serving wrong OEmbed URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/15716)) -- Fix error when rendering public pages with media without meta ([Gargron](https://github.com/tootsuite/mastodon/pull/16112)) -- Fix misaligned logo on follow button on public pages ([noellabo](https://github.com/tootsuite/mastodon/pull/15458)) -- Fix video modal not working on public pages ([noellabo](https://github.com/tootsuite/mastodon/pull/15469)) -- Fix race conditions on account migration creation ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15597)) -- Fix not being able to change world filter expiration back to “Never” ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15858)) -- Fix `.env.vagrant` not setting `RAILS_ENV` variable ([chandrn7](https://github.com/tootsuite/mastodon/pull/15709)) -- Fix error when muting users with `duration` in REST API ([Tak](https://github.com/tootsuite/mastodon/pull/15516)) -- Fix border padding on front page in light theme ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15926)) -- Fix wrong URL to custom CSS when `CDN_HOST` is used ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15927)) -- Fix `tootctl accounts unfollow` ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15639)) -- Fix `tootctl emoji import` wasting time on MacOS shadow files ([cortices](https://github.com/tootsuite/mastodon/pull/15430)) -- Fix `tootctl emoji import` not treating shortcodes as case-insensitive ([angristan](https://github.com/tootsuite/mastodon/pull/15738)) -- Fix some issues with SAML account creation ([Gargron](https://github.com/tootsuite/mastodon/pull/15222), [kaiyou](https://github.com/tootsuite/mastodon/pull/15511)) -- Fix MX validation applying for explicitly allowed e-mail domains ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15930)) -- Fix share page not using configured custom mascot ([tribela](https://github.com/tootsuite/mastodon/pull/15687)) -- Fix instance actor not being automatically created if it wasn't seeded properly ([ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15693)) -- Fix HTTPS enforcement preventing Mastodon from being run as an Onion service ([cohosh](https://github.com/tootsuite/mastodon/pull/15560), [jtracey](https://github.com/tootsuite/mastodon/pull/15741), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/15712), [cohosh](https://github.com/tootsuite/mastodon/pull/15725)) -- Fix app name, website and redirect URIs not having a maximum length ([Gargron](https://github.com/tootsuite/mastodon/pull/16042)) +- Fix "You might be interested in" flashing while searching in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16162)) +- Fix display of posts without text content in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15665)) +- Fix Google Translate breaking web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15610), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15611)) +- Fix web UI crashing when SVG support is disabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15809)) +- Fix web UI crash when a status opened in the media modal is deleted ([kaias1jp](https://github.com/mastodon/mastodon/pull/15701)) +- Fix OCR language data failing to load in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15519)) +- Fix footer links not being clickable in Safari in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/15496)) +- Fix autofocus/autoselection not working on mobile in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15555), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15985)) +- Fix media redownload worker retrying on unexpected response codes ([Gargron](https://github.com/mastodon/mastodon/pull/16111)) +- Fix thread resolve worker retrying when status no longer exists ([Gargron](https://github.com/mastodon/mastodon/pull/16109)) +- Fix n+1 queries when rendering statuses in REST API ([abcang](https://github.com/mastodon/mastodon/pull/15641)) +- Fix n+1 queries when rendering notifications in REST API ([abcang](https://github.com/mastodon/mastodon/pull/15640)) +- Fix delete of local reply to local parent not being forwarded ([Gargron](https://github.com/mastodon/mastodon/pull/16096)) +- Fix remote reporters not receiving suspend/unsuspend activities ([Gargron](https://github.com/mastodon/mastodon/pull/16050)) +- Fix understanding (not fully qualified) `as:Public` and `Public` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15948)) +- Fix actor update not being distributed on profile picture deletion ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15461)) +- Fix processing of incoming Delete activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16084)) +- Fix processing of incoming Block activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15546)) +- Fix processing of incoming Update activities of unknown accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15514)) +- Fix URIs of repeat follow requests not being recorded ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15662)) +- Fix error on requests with no `Digest` header ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15782)) +- Fix activity object not requiring signature in secure mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15592)) +- Fix database serialization failure returning HTTP 500 ([Gargron](https://github.com/mastodon/mastodon/pull/16101)) +- Fix media processing getting stuck on too much stdin/stderr ([Gargron](https://github.com/mastodon/mastodon/pull/16136)) +- Fix some inefficient array manipulations ([007lva](https://github.com/mastodon/mastodon/pull/15513), [007lva](https://github.com/mastodon/mastodon/pull/15527)) +- Fix some inefficient regex matching ([007lva](https://github.com/mastodon/mastodon/pull/15528)) +- Fix some inefficient SQL queries ([abcang](https://github.com/mastodon/mastodon/pull/16104), [abcang](https://github.com/mastodon/mastodon/pull/16106), [abcang](https://github.com/mastodon/mastodon/pull/16105)) +- Fix trying to fetch key from empty URI when verifying HTTP signature ([Gargron](https://github.com/mastodon/mastodon/pull/16100)) +- Fix `tootctl maintenance fix-duplicates` failures ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15923), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15515)) +- Fix error when removing status caused by race condition ([Gargron](https://github.com/mastodon/mastodon/pull/16099)) +- Fix blocking someone not clearing up list feeds ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16205)) +- Fix misspelled URLs character counting ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15382)) +- Fix Sidekiq hanging forever due to a Resolv bug in Ruby 2.7.3 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16157)) +- Fix edge case where follow limit interferes with accepting a follow ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16098)) +- Fix inconsistent lead text style in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16052), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16086)) +- Fix reports of already suspended accounts being recorded ([Gargron](https://github.com/mastodon/mastodon/pull/16047)) +- Fix sign-up restrictions based on IP addresses not being enforced ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15607)) +- Fix YouTube embeds failing due to YouTube serving wrong OEmbed URLs ([Gargron](https://github.com/mastodon/mastodon/pull/15716)) +- Fix error when rendering public pages with media without meta ([Gargron](https://github.com/mastodon/mastodon/pull/16112)) +- Fix misaligned logo on follow button on public pages ([noellabo](https://github.com/mastodon/mastodon/pull/15458)) +- Fix video modal not working on public pages ([noellabo](https://github.com/mastodon/mastodon/pull/15469)) +- Fix race conditions on account migration creation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15597)) +- Fix not being able to change world filter expiration back to “Never” ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15858)) +- Fix `.env.vagrant` not setting `RAILS_ENV` variable ([chandrn7](https://github.com/mastodon/mastodon/pull/15709)) +- Fix error when muting users with `duration` in REST API ([Tak](https://github.com/mastodon/mastodon/pull/15516)) +- Fix border padding on front page in light theme ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15926)) +- Fix wrong URL to custom CSS when `CDN_HOST` is used ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15927)) +- Fix `tootctl accounts unfollow` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15639)) +- Fix `tootctl emoji import` wasting time on MacOS shadow files ([cortices](https://github.com/mastodon/mastodon/pull/15430)) +- Fix `tootctl emoji import` not treating shortcodes as case-insensitive ([angristan](https://github.com/mastodon/mastodon/pull/15738)) +- Fix some issues with SAML account creation ([Gargron](https://github.com/mastodon/mastodon/pull/15222), [kaiyou](https://github.com/mastodon/mastodon/pull/15511)) +- Fix MX validation applying for explicitly allowed e-mail domains ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15930)) +- Fix share page not using configured custom mascot ([tribela](https://github.com/mastodon/mastodon/pull/15687)) +- Fix instance actor not being automatically created if it wasn't seeded properly ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15693)) +- Fix HTTPS enforcement preventing Mastodon from being run as an Onion service ([cohosh](https://github.com/mastodon/mastodon/pull/15560), [jtracey](https://github.com/mastodon/mastodon/pull/15741), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15712), [cohosh](https://github.com/mastodon/mastodon/pull/15725)) +- Fix app name, website and redirect URIs not having a maximum length ([Gargron](https://github.com/mastodon/mastodon/pull/16042)) ## [3.3.0] - 2020-12-27 ### Added -- **Add hotkeys for audio/video control in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15158), [Gargron](https://github.com/tootsuite/mastodon/pull/15198)) +- **Add hotkeys for audio/video control in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/15158), [Gargron](https://github.com/mastodon/mastodon/pull/15198)) - `Space` and `k` to toggle playback - `m` to toggle mute - `f` to toggle fullscreen - `j` and `l` to go back and forward by 10 seconds - `.` and `,` to go back and forward by a frame (video only) -- Add expand/compress button on media modal in web UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15068), [mashirozx](https://github.com/tootsuite/mastodon/pull/15088), [mashirozx](https://github.com/tootsuite/mastodon/pull/15094)) -- Add border around 🕺 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14769)) -- Add border around 🐞 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14712)) -- Add home link to the getting started column when home isn't mounted ([ThibG](https://github.com/tootsuite/mastodon/pull/14707)) -- Add option to disable swiping motions across the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13885)) -- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915), [noellabo](https://github.com/tootsuite/mastodon/pull/15309)) +- Add expand/compress button on media modal in web UI ([mashirozx](https://github.com/mastodon/mastodon/pull/15068), [mashirozx](https://github.com/mastodon/mastodon/pull/15088), [mashirozx](https://github.com/mastodon/mastodon/pull/15094)) +- Add border around 🕺 emoji in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14769)) +- Add border around 🐞 emoji in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14712)) +- Add home link to the getting started column when home isn't mounted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14707)) +- Add option to disable swiping motions across the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13885)) +- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/14870), [Gargron](https://github.com/mastodon/mastodon/pull/15157), [Gargron](https://github.com/mastodon/mastodon/pull/14915), [noellabo](https://github.com/mastodon/mastodon/pull/15309)) - Continue watching/listening when you scroll away - Action bar to interact with/open toot from the pop-out player -- Add unread notification markers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14818), [ThibG](https://github.com/tootsuite/mastodon/pull/14960), [ThibG](https://github.com/tootsuite/mastodon/pull/14954), [noellabo](https://github.com/tootsuite/mastodon/pull/14897), [noellabo](https://github.com/tootsuite/mastodon/pull/14907)) -- Add paragraph about browser add-ons when encountering errors in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14801)) -- Add import and export for bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/14956)) -- Add cache buster feature for media files ([Gargron](https://github.com/tootsuite/mastodon/pull/15155)) +- Add unread notification markers in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14818), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14960), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14954), [noellabo](https://github.com/mastodon/mastodon/pull/14897), [noellabo](https://github.com/mastodon/mastodon/pull/14907)) +- Add paragraph about browser add-ons when encountering errors in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14801)) +- Add import and export for bookmarks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14956)) +- Add cache buster feature for media files ([Gargron](https://github.com/mastodon/mastodon/pull/15155)) - If you have a proxy cache in front of object storage, deleted files will persist until the cache expires - If enabled, cache buster will make a special request to the proxy to signal a cache reset -- Add duration option to the mute function ([aquarla](https://github.com/tootsuite/mastodon/pull/13831)) -- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205), [trwnh](https://github.com/tootsuite/mastodon/pull/15304)) -- Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/tootsuite/mastodon/pull/14865)) -- **Add option to be notified when a followed user posts** ([Gargron](https://github.com/tootsuite/mastodon/pull/13546), [ThibG](https://github.com/tootsuite/mastodon/pull/14896), [Gargron](https://github.com/tootsuite/mastodon/pull/14822)) +- Add duration option to the mute function ([aquarla](https://github.com/mastodon/mastodon/pull/13831)) +- Add replies policy option to the list function ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9205), [trwnh](https://github.com/mastodon/mastodon/pull/15304)) +- Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/mastodon/mastodon/pull/14865)) +- **Add option to be notified when a followed user posts** ([Gargron](https://github.com/mastodon/mastodon/pull/13546), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14896), [Gargron](https://github.com/mastodon/mastodon/pull/14822)) - If you don't want to miss a toot, click the bell button! -- Add client-side validation in password change forms ([ThibG](https://github.com/tootsuite/mastodon/pull/14564)) -- Add client-side validation in the registration form ([ThibG](https://github.com/tootsuite/mastodon/pull/14560), [ThibG](https://github.com/tootsuite/mastodon/pull/14599)) -- Add support for Gemini URLs ([joshleeb](https://github.com/tootsuite/mastodon/pull/15013)) -- Add app shortcuts to web app manifest ([mkljczk](https://github.com/tootsuite/mastodon/pull/15234)) -- Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/tootsuite/mastodon/pull/14466), [jiikko](https://github.com/tootsuite/mastodon/pull/14806)) -- Add honeypot fields and minimum fill-out time for sign-up form ([ThibG](https://github.com/tootsuite/mastodon/pull/15276)) -- Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15149)) -- Add follow selected followers button in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15148)) -- **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/tootsuite/mastodon/pull/15096)) +- Add client-side validation in password change forms ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14564)) +- Add client-side validation in the registration form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14560), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14599)) +- Add support for Gemini URLs ([joshleeb](https://github.com/mastodon/mastodon/pull/15013)) +- Add app shortcuts to web app manifest ([mkljczk](https://github.com/mastodon/mastodon/pull/15234)) +- Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/mastodon/mastodon/pull/14466), [jiikko](https://github.com/mastodon/mastodon/pull/14806)) +- Add honeypot fields and minimum fill-out time for sign-up form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15276)) +- Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/mastodon/mastodon/pull/15149)) +- Add follow selected followers button in relationship manager ([noellabo](https://github.com/mastodon/mastodon/pull/15148)) +- **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/mastodon/mastodon/pull/15096)) - If you use a CDN for static assets (JavaScript, CSS, and so on), you have to trust that the CDN does not modify the assets maliciously - Subresource integrity compares server-generated asset digests with what's actually served from the CDN and prevents such attacks -- Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/tootsuite/mastodon/pull/15138)) -- Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/tootsuite/mastodon/pull/14361)) -- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963), [ThibG](https://github.com/tootsuite/mastodon/pull/15263)) +- Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/mastodon/mastodon/pull/15138)) +- Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/mastodon/mastodon/pull/14361)) +- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/mastodon/mastodon/pull/14963), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15263)) - Add rules for IPs or CIDR ranges that automatically expire after a configurable amount of time - Choose the severity of the rule, either blocking all access or merely limiting sign-ups -- **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/tootsuite/mastodon/pull/14989)) +- **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/mastodon/mastodon/pull/14989)) - Servers can signal that one of their accounts has been suspended - During suspension, the account can only delete its own content - A reversal of the suspension can be signalled the same way - A local suspension always overrides a remote one -- Add indication to admin UI of whether a report has been forwarded ([ThibG](https://github.com/tootsuite/mastodon/pull/13237)) -- Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15265)) -- Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/15355)) -- Add option to make reasons for joining required on sign-up ([ThibG](https://github.com/tootsuite/mastodon/pull/15326), [ThibG](https://github.com/tootsuite/mastodon/pull/15358), [ThibG](https://github.com/tootsuite/mastodon/pull/15385), [ThibG](https://github.com/tootsuite/mastodon/pull/15405)) -- Add ActivityPub follower synchronization mechanism ([ThibG](https://github.com/tootsuite/mastodon/pull/14510), [ThibG](https://github.com/tootsuite/mastodon/pull/15026)) -- Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721)) -- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595), [noellabo](https://github.com/tootsuite/mastodon/pull/15277)) -- Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/tootsuite/mastodon/pull/14683), [noellabo](https://github.com/tootsuite/mastodon/pull/14981)) -- Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/14952)) -- Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ThibG](https://github.com/tootsuite/mastodon/pull/14722)) -- Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/14383), [uist1idrju3i](https://github.com/tootsuite/mastodon/pull/14715)) -- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201), [ThibG](https://github.com/tootsuite/mastodon/pull/15264), [ThibG](https://github.com/tootsuite/mastodon/pull/15256)) +- Add indication to admin UI of whether a report has been forwarded ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13237)) +- Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/mastodon/mastodon/pull/15265)) +- Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/15355)) +- Add option to make reasons for joining required on sign-up ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15326), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15358), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15385), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15405)) +- Add ActivityPub follower synchronization mechanism ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14510), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15026)) +- Add outbox attribute to instance actor ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14721)) +- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/mastodon/mastodon/pull/11595), [noellabo](https://github.com/mastodon/mastodon/pull/15277)) +- Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/mastodon/mastodon/pull/14683), [noellabo](https://github.com/mastodon/mastodon/pull/14981)) +- Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/mastodon/mastodon/pull/14952)) +- Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14722)) +- Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/mastodon/mastodon/pull/14383), [uist1idrju3i](https://github.com/mastodon/mastodon/pull/14715)) +- Add `tootctl accounts merge` ([Gargron](https://github.com/mastodon/mastodon/pull/15201), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15264), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15256)) - Has someone changed their domain or subdomain thereby creating two accounts where there should be one? - This command will fix it on your end -- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223), [ThibG](https://github.com/tootsuite/mastodon/pull/15373)) +- Add `tootctl maintenance fix-duplicates` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14860), [Gargron](https://github.com/mastodon/mastodon/pull/15223), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15373)) - Index corruption in the database? - This command is for you -- **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/tootsuite/mastodon/pull/14524), [Gargron](https://github.com/tootsuite/mastodon/pull/14566), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14859), [zunda](https://github.com/tootsuite/mastodon/pull/14608)) +- **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/mastodon/mastodon/pull/14524), [Gargron](https://github.com/mastodon/mastodon/pull/14566), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14859), [zunda](https://github.com/mastodon/mastodon/pull/14608)) - Previously, getting live updates for multiple timelines required opening a HTTP or WebSocket connection for each - More connections means more resource consumption on both ends, not to mention the (ever so slight) delay when establishing a new connection - Now, with just a single WebSocket connection you can subscribe and unsubscribe to and from multiple streams -- Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/tootsuite/mastodon/pull/14776)) -- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817), [noellabo](https://github.com/tootsuite/mastodon/pull/15270)) -- Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13043)) -- Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14396)) -- Add clean error message when `RAILS_ENV` is unset ([ThibG](https://github.com/tootsuite/mastodon/pull/15381)) +- Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/mastodon/mastodon/pull/14776)) +- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/mastodon/mastodon/pull/11817), [noellabo](https://github.com/mastodon/mastodon/pull/15270)) +- Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/13043)) +- Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/mastodon/mastodon/pull/14396)) +- Add clean error message when `RAILS_ENV` is unset ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15381)) ### Changed -- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221), [Gargron](https://github.com/tootsuite/mastodon/pull/15284), [Gargron](https://github.com/tootsuite/mastodon/pull/15283), [Kjwon15](https://github.com/tootsuite/mastodon/pull/15308), [noellabo](https://github.com/tootsuite/mastodon/pull/15305), [ThibG](https://github.com/tootsuite/mastodon/pull/15417)) +- **Change media modals look in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/15217), [Gargron](https://github.com/mastodon/mastodon/pull/15221), [Gargron](https://github.com/mastodon/mastodon/pull/15284), [Gargron](https://github.com/mastodon/mastodon/pull/15283), [Kjwon15](https://github.com/mastodon/mastodon/pull/15308), [noellabo](https://github.com/mastodon/mastodon/pull/15305), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15417)) - Background of the overlay matches the color of the image - Action bar to interact with or open the toot from the modal -- Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091)) -- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855), [ThibG](https://github.com/tootsuite/mastodon/pull/15380), [Gargron](https://github.com/tootsuite/mastodon/pull/15420), [Gargron](https://github.com/tootsuite/mastodon/pull/15414)) +- Change order of announcements in admin UI to be newest-first ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15091)) +- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/mastodon/mastodon/pull/14726), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15152), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15106), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15100), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15099), [noellabo](https://github.com/mastodon/mastodon/pull/14855), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15380), [Gargron](https://github.com/mastodon/mastodon/pull/15420), [Gargron](https://github.com/mastodon/mastodon/pull/15414)) - Suspensions no longer equal deletions - A suspended account can be unsuspended with minimal consequences for 30 days - Immediate deletion of data is still available as an explicit option - Suspended accounts can request an archive of their data through the UI - Change REST API to return empty data for suspended accounts (14765) -- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766), [Gargron](https://github.com/tootsuite/mastodon/pull/15345)) -- Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/tootsuite/mastodon/pull/14760)) -- Change direct toots to appear in the home feed again ([Gargron](https://github.com/tootsuite/mastodon/pull/14711), [ThibG](https://github.com/tootsuite/mastodon/pull/15182), [noellabo](https://github.com/tootsuite/mastodon/pull/14727)) +- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/mastodon/mastodon/pull/14766), [Gargron](https://github.com/mastodon/mastodon/pull/15345)) +- Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/mastodon/mastodon/pull/14760)) +- Change direct toots to appear in the home feed again ([Gargron](https://github.com/mastodon/mastodon/pull/14711), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15182), [noellabo](https://github.com/mastodon/mastodon/pull/14727)) - Return to treating all toots the same instead of trying to retrofit direct visibility into an instant messaging model -- Change email address validation to return more specific errors ([ThibG](https://github.com/tootsuite/mastodon/pull/14565)) -- Change HTTP signature requirements to include `Digest` header on `POST` requests ([ThibG](https://github.com/tootsuite/mastodon/pull/15069)) -- Change click area of video/audio player buttons to be bigger in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15049)) -- Change order of filters by alphabetic by "keyword or phrase" ([ariasuni](https://github.com/tootsuite/mastodon/pull/15050)) -- Change suspension of remote accounts to also undo outgoing follows ([ThibG](https://github.com/tootsuite/mastodon/pull/15188)) -- Change string "Home" to "Home and lists" in the filter creation screen ([ariasuni](https://github.com/tootsuite/mastodon/pull/15139)) -- Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/tootsuite/mastodon/pull/14598)) -- Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/tootsuite/mastodon/pull/15052)) -- Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/tootsuite/mastodon/pull/15065), [dariusk](https://github.com/tootsuite/mastodon/pull/15070)) -- Change RTL detection to rely on unicode-bidi paragraph by paragraph in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14573)) -- Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15053), [mayaeh](https://github.com/tootsuite/mastodon/pull/15055)) -- Change public thread view to hide "Show thread" link ([ThibG](https://github.com/tootsuite/mastodon/pull/15266)) -- Change number format on about page from full to shortened ([Gargron](https://github.com/tootsuite/mastodon/pull/15327)) -- Change how scheduled tasks run in multi-process environments ([noellabo](https://github.com/tootsuite/mastodon/pull/15314)) +- Change email address validation to return more specific errors ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14565)) +- Change HTTP signature requirements to include `Digest` header on `POST` requests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15069)) +- Change click area of video/audio player buttons to be bigger in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15049)) +- Change order of filters by alphabetic by "keyword or phrase" ([ariasuni](https://github.com/mastodon/mastodon/pull/15050)) +- Change suspension of remote accounts to also undo outgoing follows ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15188)) +- Change string "Home" to "Home and lists" in the filter creation screen ([ariasuni](https://github.com/mastodon/mastodon/pull/15139)) +- Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/mastodon/mastodon/pull/14598)) +- Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/mastodon/mastodon/pull/15052)) +- Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/mastodon/mastodon/pull/15065), [dariusk](https://github.com/mastodon/mastodon/pull/15070)) +- Change RTL detection to rely on unicode-bidi paragraph by paragraph in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14573)) +- Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15053), [mayaeh](https://github.com/mastodon/mastodon/pull/15055)) +- Change public thread view to hide "Show thread" link ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15266)) +- Change number format on about page from full to shortened ([Gargron](https://github.com/mastodon/mastodon/pull/15327)) +- Change how scheduled tasks run in multi-process environments ([noellabo](https://github.com/mastodon/mastodon/pull/15314)) - New dedicated queue `scheduler` - Runs by default when Sidekiq is executed with no options - Has to be added manually in a multi-process environment ### Removed -- Remove fade-in animation from modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15199)) -- Remove auto-redirect to direct messages in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15142)) -- Remove obsolete IndexedDB operations from web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14730)) -- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) +- Remove fade-in animation from modals in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/15199)) +- Remove auto-redirect to direct messages in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/15142)) +- Remove obsolete IndexedDB operations from web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14730)) +- Remove dependency on unused and unmaintained http_parser.rb gem ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14574)) ### Fixed -- Fix layout on about page when contact account has a long username ([ThibG](https://github.com/tootsuite/mastodon/pull/15357)) -- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/tootsuite/mastodon/pull/14207), [ThibG](https://github.com/tootsuite/mastodon/pull/15384)) -- **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/tootsuite/mastodon/pull/15200)) +- Fix layout on about page when contact account has a long username ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15357)) +- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/mastodon/mastodon/pull/14207), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15384)) +- **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/mastodon/mastodon/pull/15200)) - Previously, delete of a toot would be primarily sent to the followers of its author, people mentioned in the toot, and people who reblogged the toot - Now, additionally, it is ensured that it is sent to people who replied to it, favourited it, and to the person it replies to even if that person is not mentioned -- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187)) -- Fix sending redundant ActivityPub events when processing remote account deletion ([ThibG](https://github.com/tootsuite/mastodon/pull/15104)) -- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) -- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) -- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) -- Fix not being able to unfavorite toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/15192)) -- Fix not being able to unbookmark toots one has lost access to ([ThibG](https://github.com/tootsuite/mastodon/pull/14604)) -- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) -- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) -- Fix cookies not having a SameSite attribute ([Gargron](https://github.com/tootsuite/mastodon/pull/15098)) -- Fix poll ending notifications being created for each vote ([ThibG](https://github.com/tootsuite/mastodon/pull/15071)) -- Fix multiple boosts of a same toot erroneously appearing in TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14759)) -- Fix asset builds not picking up `CDN_HOST` change ([ThibG](https://github.com/tootsuite/mastodon/pull/14381)) -- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543), [ThibG](https://github.com/tootsuite/mastodon/pull/15176)) +- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15187)) +- Fix sending redundant ActivityPub events when processing remote account deletion ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15104)) +- Fix Move handler not being triggered when failing to fetch target account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15107)) +- Fix downloading remote media files when server returns empty filename ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14867)) +- Fix account processing failing because of large collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15027)) +- Fix not being able to unfavorite toots one has lost access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15192)) +- Fix not being able to unbookmark toots one has lost access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14604)) +- Fix possible casing inconsistencies in hashtag search ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14906)) +- Fix updating account counters when association is not yet created ([Gargron](https://github.com/mastodon/mastodon/pull/15108)) +- Fix cookies not having a SameSite attribute ([Gargron](https://github.com/mastodon/mastodon/pull/15098)) +- Fix poll ending notifications being created for each vote ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15071)) +- Fix multiple boosts of a same toot erroneously appearing in TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14759)) +- Fix asset builds not picking up `CDN_HOST` change ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14381)) +- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14985), [Gargron](https://github.com/mastodon/mastodon/pull/15141), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13543), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15176)) - Some time ago, browsers added a requirement that desktop notification prompts could only be displayed in response to a user-generated event (such as a click) - This means that for some time, users who haven't already given the permission before were not getting a prompt and as such were not receiving desktop notifications -- Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15051)) -- Fix glitched image uploads when canvas read access is blocked in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15180)) -- Fix some account gallery items having empty labels in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15073)) -- Fix alt-key hotkeys activating while typing in a text field in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14942)) -- Fix wrong seek bar width on media player in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/15060)) -- Fix logging out on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14901)) -- Fix wrong click area for GIFVs in media modal in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14615)) -- Fix unreadable placeholder text color in high contrast theme in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14803)) -- Fix scrolling issues when closing some dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14606)) -- Fix notification filter bar incorrectly filtering gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14808)) -- Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14456)) -- Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/14484), [ThibG](https://github.com/tootsuite/mastodon/pull/14513)) -- Fix home last read marker mishandling gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14809)) -- Fix unnecessary re-rendering of various components when typing in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15286)) -- Fix notifications being unnecessarily re-rendered in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15312)) -- Fix column swiping animation logic in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15301)) -- Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/14861), [akihikodaki](https://github.com/tootsuite/mastodon/pull/14662)) -- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674)) -- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673)) -- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675)) -- Fix inefficieny when deleting accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/15387), [ThibG](https://github.com/tootsuite/mastodon/pull/15409), [ThibG](https://github.com/tootsuite/mastodon/pull/15407), [ThibG](https://github.com/tootsuite/mastodon/pull/15408), [ThibG](https://github.com/tootsuite/mastodon/pull/15402), [ThibG](https://github.com/tootsuite/mastodon/pull/15416), [Gargron](https://github.com/tootsuite/mastodon/pull/15421)) -- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534)) -- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) -- Fix performance on instances list in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15282)) -- Fix server actor appearing in list of accounts in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14567)) -- Fix "bootstrap timeline accounts" toggle in site settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15325)) -- Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/tootsuite/mastodon/pull/15072)) -- Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/tootsuite/mastodon/pull/12685)) -- Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/tootsuite/mastodon/pull/14686)) +- Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/15051)) +- Fix glitched image uploads when canvas read access is blocked in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15180)) +- Fix some account gallery items having empty labels in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15073)) +- Fix alt-key hotkeys activating while typing in a text field in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14942)) +- Fix wrong seek bar width on media player in web UI ([mfmfuyu](https://github.com/mastodon/mastodon/pull/15060)) +- Fix logging out on mobile in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14901)) +- Fix wrong click area for GIFVs in media modal in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14615)) +- Fix unreadable placeholder text color in high contrast theme in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14803)) +- Fix scrolling issues when closing some dropdown menus in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14606)) +- Fix notification filter bar incorrectly filtering gaps in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14808)) +- Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14456)) +- Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/mastodon/mastodon/pull/14484), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14513)) +- Fix home last read marker mishandling gaps in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14809)) +- Fix unnecessary re-rendering of various components when typing in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/15286)) +- Fix notifications being unnecessarily re-rendered in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15312)) +- Fix column swiping animation logic in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15301)) +- Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/mastodon/mastodon/pull/14861), [akihikodaki](https://github.com/mastodon/mastodon/pull/14662)) +- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/mastodon/mastodon/pull/14674)) +- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/mastodon/mastodon/pull/14673)) +- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/mastodon/mastodon/pull/14675)) +- Fix inefficieny when deleting accounts ([Gargron](https://github.com/mastodon/mastodon/pull/15387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15407), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15402), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15416), [Gargron](https://github.com/mastodon/mastodon/pull/15421)) +- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/mastodon/mastodon/pull/14534)) +- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287)) +- Fix performance on instances list in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/15282)) +- Fix server actor appearing in list of accounts in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14567)) +- Fix "bootstrap timeline accounts" toggle in site settings in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15325)) +- Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/mastodon/mastodon/pull/15072)) +- Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/mastodon/mastodon/pull/12685)) +- Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/mastodon/mastodon/pull/14686)) ### Security -- Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/tootsuite/mastodon/pull/15111)) -- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) -- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) +- Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/mastodon/mastodon/pull/15111)) +- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/mastodon/mastodon/pull/14802)) +- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15364)) ## [3.2.2] - 2020-12-19 ### Added -- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223)) +- Add `tootctl maintenance fix-duplicates` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14860), [Gargron](https://github.com/mastodon/mastodon/pull/15223)) - Index corruption in the database? - This command is for you ### Removed -- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574)) +- Remove dependency on unused and unmaintained http_parser.rb gem ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14574)) ### Fixed -- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107)) -- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867)) -- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906)) -- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108)) -- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027)) -- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187)) -- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287)) +- Fix Move handler not being triggered when failing to fetch target account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15107)) +- Fix downloading remote media files when server returns empty filename ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14867)) +- Fix possible casing inconsistencies in hashtag search ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14906)) +- Fix updating account counters when association is not yet created ([Gargron](https://github.com/mastodon/mastodon/pull/15108)) +- Fix account processing failing because of large collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15027)) +- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15187)) +- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287)) ### Security -- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802)) -- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364)) +- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/mastodon/mastodon/pull/14802)) +- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15364)) ## [3.2.1] - 2020-10-19 ### Added -- Add support for latest HTTP Signatures spec draft ([ThibG](https://github.com/tootsuite/mastodon/pull/14556)) -- Add support for inlined objects in ActivityPub `to`/`cc` ([ThibG](https://github.com/tootsuite/mastodon/pull/14514)) +- Add support for latest HTTP Signatures spec draft ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14556)) +- Add support for inlined objects in ActivityPub `to`/`cc` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14514)) ### Changed -- Change actors to not be served at all without authentication in limited federation mode ([ThibG](https://github.com/tootsuite/mastodon/pull/14800)) +- Change actors to not be served at all without authentication in limited federation mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14800)) - Previously, a bare version of an actor was served when not authenticated, i.e. username and public key - Because all actor fetch requests are signed using a separate system actor, that is no longer required ### Fixed -- Fix `tootctl media` commands not recognizing very large IDs ([ThibG](https://github.com/tootsuite/mastodon/pull/14536)) -- Fix crash when failing to load emoji picker in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14525)) -- Fix contrast requirements in thumbnail color extraction ([ThibG](https://github.com/tootsuite/mastodon/pull/14464)) -- Fix audio/video player not using `CDN_HOST` on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14486)) -- Fix private boost icon not being used on public pages ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14471)) -- Fix audio player on Safari in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14485), [ThibG](https://github.com/tootsuite/mastodon/pull/14465)) -- Fix dereferencing remote statuses not using the correct account for signature when receiving a targeted inbox delivery ([ThibG](https://github.com/tootsuite/mastodon/pull/14656)) -- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/tootsuite/mastodon/pull/14657)) -- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/tootsuite/mastodon/pull/14684)) -- Fix reported statuses not being included in warning e-mail ([Gargron](https://github.com/tootsuite/mastodon/pull/14778)) -- Fix `Reject` activities of `Follow` objects not correctly destroying a follow relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/14479)) -- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/tootsuite/mastodon/pull/14682), [noellabo](https://github.com/tootsuite/mastodon/pull/14709)) -- Fix timeout errors when trying to webfinger some IPv6 configurations ([Gargron](https://github.com/tootsuite/mastodon/pull/14919)) -- Fix files served as `application/octet-stream` being rejected without attempting mime type detection ([ThibG](https://github.com/tootsuite/mastodon/pull/14452)) +- Fix `tootctl media` commands not recognizing very large IDs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14536)) +- Fix crash when failing to load emoji picker in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14525)) +- Fix contrast requirements in thumbnail color extraction ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14464)) +- Fix audio/video player not using `CDN_HOST` on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14486)) +- Fix private boost icon not being used on public pages ([OmmyZhang](https://github.com/mastodon/mastodon/pull/14471)) +- Fix audio player on Safari in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14465)) +- Fix dereferencing remote statuses not using the correct account for signature when receiving a targeted inbox delivery ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14656)) +- Fix nil error in `tootctl media remove` ([noellabo](https://github.com/mastodon/mastodon/pull/14657)) +- Fix videos with near-60 fps being rejected ([Gargron](https://github.com/mastodon/mastodon/pull/14684)) +- Fix reported statuses not being included in warning e-mail ([Gargron](https://github.com/mastodon/mastodon/pull/14778)) +- Fix `Reject` activities of `Follow` objects not correctly destroying a follow relationship ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14479)) +- Fix inefficiencies in fan-out-on-write service ([Gargron](https://github.com/mastodon/mastodon/pull/14682), [noellabo](https://github.com/mastodon/mastodon/pull/14709)) +- Fix timeout errors when trying to webfinger some IPv6 configurations ([Gargron](https://github.com/mastodon/mastodon/pull/14919)) +- Fix files served as `application/octet-stream` being rejected without attempting mime type detection ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14452)) ## [3.2.0] - 2020-07-27 ### Added -- Add `SMTP_SSL` environment variable ([OmmyZhang](https://github.com/tootsuite/mastodon/pull/14309)) -- Add hotkey for toggling content warning input in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13987)) -- **Add e-mail-based sign in challenge for users with disabled 2FA** ([Gargron](https://github.com/tootsuite/mastodon/pull/14013)) +- Add `SMTP_SSL` environment variable ([OmmyZhang](https://github.com/mastodon/mastodon/pull/14309)) +- Add hotkey for toggling content warning input in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13987)) +- **Add e-mail-based sign in challenge for users with disabled 2FA** ([Gargron](https://github.com/mastodon/mastodon/pull/14013)) - If user tries signing in after: - Being inactive for a while - With a previously unknown IP - Without 2FA being enabled - Require to enter a token sent via e-mail before sigining in -- Add `limit` param to RSS feeds ([noellabo](https://github.com/tootsuite/mastodon/pull/13743)) -- Add `visibility` param to share page ([noellabo](https://github.com/tootsuite/mastodon/pull/13023)) -- Add blurhash to link previews ([ThibG](https://github.com/tootsuite/mastodon/pull/13984), [ThibG](https://github.com/tootsuite/mastodon/pull/14143), [ThibG](https://github.com/tootsuite/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14278), [ThibG](https://github.com/tootsuite/mastodon/pull/14126), [ThibG](https://github.com/tootsuite/mastodon/pull/14261), [ThibG](https://github.com/tootsuite/mastodon/pull/14260)) +- Add `limit` param to RSS feeds ([noellabo](https://github.com/mastodon/mastodon/pull/13743)) +- Add `visibility` param to share page ([noellabo](https://github.com/mastodon/mastodon/pull/13023)) +- Add blurhash to link previews ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13984), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14143), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14278), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14126), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14260)) - In web UI, toots cannot be marked as sensitive unless there is media attached - However, it's possible to do via API or ActivityPub - Thumnails of link previews of such posts now use blurhash in web UI - The Card entity in REST API has a new `blurhash` attribute -- Add support for `summary` field for media description in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/13763)) -- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14031), [noellabo](https://github.com/tootsuite/mastodon/pull/14195)) -- **Add personal notes for accounts** ([ThibG](https://github.com/tootsuite/mastodon/pull/14148), [Gargron](https://github.com/tootsuite/mastodon/pull/14208), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14251)) +- Add support for `summary` field for media description in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13763)) +- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14031), [noellabo](https://github.com/mastodon/mastodon/pull/14195)) +- **Add personal notes for accounts** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14148), [Gargron](https://github.com/mastodon/mastodon/pull/14208), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14251)) - To clarify, these are notes only you can see, to help you remember details - Notes can be viewed and edited from profiles in web UI - New REST API: `POST /api/v1/accounts/:id/note` with `comment` param - The Relationship entity in REST API has a new `note` attribute -- Add Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14090), [dunn](https://github.com/tootsuite/mastodon/pull/14256), [dunn](https://github.com/tootsuite/mastodon/pull/14245)) -- **Add customizable thumbnails for audio and video attachments** ([Gargron](https://github.com/tootsuite/mastodon/pull/14145), [Gargron](https://github.com/tootsuite/mastodon/pull/14244), [Gargron](https://github.com/tootsuite/mastodon/pull/14273), [Gargron](https://github.com/tootsuite/mastodon/pull/14203), [ThibG](https://github.com/tootsuite/mastodon/pull/14255), [ThibG](https://github.com/tootsuite/mastodon/pull/14306), [noellabo](https://github.com/tootsuite/mastodon/pull/14358), [noellabo](https://github.com/tootsuite/mastodon/pull/14357)) +- Add Helm chart ([dunn](https://github.com/mastodon/mastodon/pull/14090), [dunn](https://github.com/mastodon/mastodon/pull/14256), [dunn](https://github.com/mastodon/mastodon/pull/14245)) +- **Add customizable thumbnails for audio and video attachments** ([Gargron](https://github.com/mastodon/mastodon/pull/14145), [Gargron](https://github.com/mastodon/mastodon/pull/14244), [Gargron](https://github.com/mastodon/mastodon/pull/14273), [Gargron](https://github.com/mastodon/mastodon/pull/14203), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14255), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14306), [noellabo](https://github.com/mastodon/mastodon/pull/14358), [noellabo](https://github.com/mastodon/mastodon/pull/14357)) - Metadata (album, artist, etc) is no longer stripped from audio files - Album art is automatically extracted from audio files - Thumbnail can be manually uploaded for both audio and video attachments @@ -414,120 +522,120 @@ All notable changes to this project will be documented in this file. - And on `PUT /api/v1/media/:id` - ActivityPub representation of media attachments represents custom thumbnails with an `icon` attribute - The Media Attachment entity in REST API now has a `preview_remote_url` to its `preview_url`, equivalent to `remote_url` to its `url` -- **Add color extraction for thumbnails** ([Gargron](https://github.com/tootsuite/mastodon/pull/14209), [ThibG](https://github.com/tootsuite/mastodon/pull/14264)) +- **Add color extraction for thumbnails** ([Gargron](https://github.com/mastodon/mastodon/pull/14209), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14264)) - The `meta` attribute on the Media Attachment entity in REST API can now have a `colors` attribute which in turn contains three hex colors: `background`, `foreground`, and `accent` - The background color is chosen from the most dominant color around the edges of the thumbnail - The foreground and accent colors are chosen from the colors that are the most different from the background color using the CIEDE2000 algorithm - The most satured color of the two is designated as the accent color - The one with the highest W3C contrast is designated as the foreground color - If there are not enough colors in the thumbnail, new ones are generated using a monochrome pattern -- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14123), [highemerly](https://github.com/tootsuite/mastodon/pull/14292)) -- Add `tootctl email_domain_blocks` ([tateisu](https://github.com/tootsuite/mastodon/pull/13589), [Gargron](https://github.com/tootsuite/mastodon/pull/14147)) -- Add "Add new domain block" to header of federation page in admin UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13934)) -- Add ability to keep emoji picker open with ctrl+click in web UI ([bclindner](https://github.com/tootsuite/mastodon/pull/13896), [noellabo](https://github.com/tootsuite/mastodon/pull/14096)) -- Add custom icon for private boosts in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14380)) -- Add support for Create and Update activities that don't inline objects in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/14359)) -- Add support for Undo activities that don't inline activities in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/14346)) +- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14123), [highemerly](https://github.com/mastodon/mastodon/pull/14292)) +- Add `tootctl email_domain_blocks` ([tateisu](https://github.com/mastodon/mastodon/pull/13589), [Gargron](https://github.com/mastodon/mastodon/pull/14147)) +- Add "Add new domain block" to header of federation page in admin UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13934)) +- Add ability to keep emoji picker open with ctrl+click in web UI ([bclindner](https://github.com/mastodon/mastodon/pull/13896), [noellabo](https://github.com/mastodon/mastodon/pull/14096)) +- Add custom icon for private boosts in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14380)) +- Add support for Create and Update activities that don't inline objects in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14359)) +- Add support for Undo activities that don't inline activities in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14346)) ### Changed -- Change `.env.production.sample` to be leaner and cleaner ([Gargron](https://github.com/tootsuite/mastodon/pull/14206)) +- Change `.env.production.sample` to be leaner and cleaner ([Gargron](https://github.com/mastodon/mastodon/pull/14206)) - It was overloaded as de-facto documentation and getting quite crowded - Defer to the actual documentation while still giving a minimal example -- Change `tootctl search deploy` to work faster and display progress ([Gargron](https://github.com/tootsuite/mastodon/pull/14300)) -- Change User-Agent of link preview fetching service to include "Bot" ([Gargron](https://github.com/tootsuite/mastodon/pull/14248)) +- Change `tootctl search deploy` to work faster and display progress ([Gargron](https://github.com/mastodon/mastodon/pull/14300)) +- Change User-Agent of link preview fetching service to include "Bot" ([Gargron](https://github.com/mastodon/mastodon/pull/14248)) - Some websites may not render OpenGraph tags into HTML if that's not the case -- Change behaviour to carry blocks over when someone migrates their followers ([ThibG](https://github.com/tootsuite/mastodon/pull/14144)) -- Change volume control and download buttons in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14122)) -- **Change design of audio players in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14095), [ThibG](https://github.com/tootsuite/mastodon/pull/14281), [Gargron](https://github.com/tootsuite/mastodon/pull/14282), [ThibG](https://github.com/tootsuite/mastodon/pull/14118), [Gargron](https://github.com/tootsuite/mastodon/pull/14199), [ThibG](https://github.com/tootsuite/mastodon/pull/14338)) -- Change reply filter to never filter own toots in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14128)) -- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/14132), [ThibG](https://github.com/tootsuite/mastodon/pull/14373)) -- Change contrast of flash messages ([cchoi12](https://github.com/tootsuite/mastodon/pull/13892)) -- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13834)) -- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/tootsuite/mastodon/pull/13938)) -- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13954)) -- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/tootsuite/mastodon/pull/13773), [ThibG](https://github.com/tootsuite/mastodon/pull/13772), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14020), [ThibG](https://github.com/tootsuite/mastodon/pull/14015)) -- Change structure of unavailable content section on about page ([ariasuni](https://github.com/tootsuite/mastodon/pull/13930)) -- Change behaviour to accept ActivityPub activities relayed through group actor ([noellabo](https://github.com/tootsuite/mastodon/pull/14279)) -- Change amount of processing retries for ActivityPub activities ([noellabo](https://github.com/tootsuite/mastodon/pull/14355)) +- Change behaviour to carry blocks over when someone migrates their followers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14144)) +- Change volume control and download buttons in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14122)) +- **Change design of audio players in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/14095), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14281), [Gargron](https://github.com/mastodon/mastodon/pull/14282), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14118), [Gargron](https://github.com/mastodon/mastodon/pull/14199), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14338)) +- Change reply filter to never filter own toots in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14128)) +- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14132), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14373)) +- Change contrast of flash messages ([cchoi12](https://github.com/mastodon/mastodon/pull/13892)) +- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13834)) +- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/mastodon/mastodon/pull/13938)) +- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13954)) +- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/mastodon/mastodon/pull/13773), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13772), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14020), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14015)) +- Change structure of unavailable content section on about page ([ariasuni](https://github.com/mastodon/mastodon/pull/13930)) +- Change behaviour to accept ActivityPub activities relayed through group actor ([noellabo](https://github.com/mastodon/mastodon/pull/14279)) +- Change amount of processing retries for ActivityPub activities ([noellabo](https://github.com/mastodon/mastodon/pull/14355)) ### Removed -- Remove the terms "blacklist" and "whitelist" from UX ([Gargron](https://github.com/tootsuite/mastodon/pull/14149), [mayaeh](https://github.com/tootsuite/mastodon/pull/14192)) +- Remove the terms "blacklist" and "whitelist" from UX ([Gargron](https://github.com/mastodon/mastodon/pull/14149), [mayaeh](https://github.com/mastodon/mastodon/pull/14192)) - Environment variables changed (old versions continue to work): - `WHITELIST_MODE` → `LIMITED_FEDERATION_MODE` - `EMAIL_DOMAIN_BLACKLIST` → `EMAIL_DOMAIN_DENYLIST` - `EMAIL_DOMAIN_WHITELIST` → `EMAIL_DOMAIN_ALLOWLIST` - CLI option changed: - `tootctl domains purge --whitelist-mode` → `tootctl domains purge --limited-federation-mode` -- Remove some unnecessary database indices ([lfuelling](https://github.com/tootsuite/mastodon/pull/13695), [noellabo](https://github.com/tootsuite/mastodon/pull/14259)) -- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/tootsuite/mastodon/pull/14139)) +- Remove some unnecessary database indices ([lfuelling](https://github.com/mastodon/mastodon/pull/13695), [noellabo](https://github.com/mastodon/mastodon/pull/14259)) +- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/mastodon/mastodon/pull/14139)) ### Fixed -- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/tootsuite/mastodon/pull/14394)) -- Fix sometimes occuring duplicate mention notifications ([noellabo](https://github.com/tootsuite/mastodon/pull/14378)) -- Fix RSS feeds not being cachable ([ThibG](https://github.com/tootsuite/mastodon/pull/14368)) -- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/tootsuite/mastodon/pull/14365)) -- Fix boosted toots from blocked account not being retroactively removed from TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14339)) -- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/14061)) -- Fix streaming server trying to use empty password to connect to Redis when `REDIS_PASSWORD` is given but blank ([ThibG](https://github.com/tootsuite/mastodon/pull/14135)) -- Fix being unable to unboost posts when blocked by their author ([ThibG](https://github.com/tootsuite/mastodon/pull/14308)) -- Fix account domain block not properly unfollowing accounts from domain ([Gargron](https://github.com/tootsuite/mastodon/pull/14304)) -- Fix removing a domain allow wiping known accounts in open federation mode ([ThibG](https://github.com/tootsuite/mastodon/pull/14298)) -- Fix blocks and mutes pagination in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14275)) -- Fix new posts pushing down origin of opened dropdown in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14271), [ThibG](https://github.com/tootsuite/mastodon/pull/14348)) -- Fix timeline markers not being saved sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/13887), [ThibG](https://github.com/tootsuite/mastodon/pull/13889), [ThibG](https://github.com/tootsuite/mastodon/pull/14155)) -- Fix CSV uploads being rejected ([noellabo](https://github.com/tootsuite/mastodon/pull/13835)) -- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/tootsuite/mastodon/pull/13828)) -- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/tootsuite/mastodon/pull/13829)) -- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/13827)) -- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/tootsuite/mastodon/pull/13765)) -- Fix `tootctl upgrade storage-schema` misbehaving ([Gargron](https://github.com/tootsuite/mastodon/pull/13761), [angristan](https://github.com/tootsuite/mastodon/pull/13768)) +- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/mastodon/mastodon/pull/14394)) +- Fix sometimes occuring duplicate mention notifications ([noellabo](https://github.com/mastodon/mastodon/pull/14378)) +- Fix RSS feeds not being cachable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14368)) +- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/mastodon/mastodon/pull/14365)) +- Fix boosted toots from blocked account not being retroactively removed from TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14339)) +- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14061)) +- Fix streaming server trying to use empty password to connect to Redis when `REDIS_PASSWORD` is given but blank ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14135)) +- Fix being unable to unboost posts when blocked by their author ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14308)) +- Fix account domain block not properly unfollowing accounts from domain ([Gargron](https://github.com/mastodon/mastodon/pull/14304)) +- Fix removing a domain allow wiping known accounts in open federation mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14298)) +- Fix blocks and mutes pagination in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14275)) +- Fix new posts pushing down origin of opened dropdown in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14348)) +- Fix timeline markers not being saved sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13887), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13889), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14155)) +- Fix CSV uploads being rejected ([noellabo](https://github.com/mastodon/mastodon/pull/13835)) +- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/mastodon/mastodon/pull/13828)) +- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/mastodon/mastodon/pull/13829)) +- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13827)) +- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/mastodon/mastodon/pull/13765)) +- Fix `tootctl upgrade storage-schema` misbehaving ([Gargron](https://github.com/mastodon/mastodon/pull/13761), [angristan](https://github.com/mastodon/mastodon/pull/13768)) - Fix it marking records as upgraded even though no files were moved - Fix it not working with S3 storage - Fix it not working with custom emojis -- Fix GIF reader raising incorrect exceptions ([ThibG](https://github.com/tootsuite/mastodon/pull/13760)) -- Fix hashtag search performing account search as well ([ThibG](https://github.com/tootsuite/mastodon/pull/13758)) -- Fix Webfinger returning wrong status code on malformed or missing param ([ThibG](https://github.com/tootsuite/mastodon/pull/13759)) -- Fix `rake mastodon:setup` error when some environment variables are set ([ThibG](https://github.com/tootsuite/mastodon/pull/13928)) -- Fix admin page crashing when trying to block an invalid domain name in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13884)) -- Fix unsent toot confirmation dialog not popping up in single column mode in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13888)) -- Fix performance of follow import ([noellabo](https://github.com/tootsuite/mastodon/pull/13836)) +- Fix GIF reader raising incorrect exceptions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13760)) +- Fix hashtag search performing account search as well ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13758)) +- Fix Webfinger returning wrong status code on malformed or missing param ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13759)) +- Fix `rake mastodon:setup` error when some environment variables are set ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13928)) +- Fix admin page crashing when trying to block an invalid domain name in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13884)) +- Fix unsent toot confirmation dialog not popping up in single column mode in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13888)) +- Fix performance of follow import ([noellabo](https://github.com/mastodon/mastodon/pull/13836)) - Reduce timeout of Webfinger requests to that of other requests - Use circuit breakers to stop hitting unresponsive servers - Avoid hitting servers that are already known to be generally unavailable -- Fix filters ignoring media descriptions ([BenLubar](https://github.com/tootsuite/mastodon/pull/13837)) -- Fix some actions on custom emojis leading to cryptic errors in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13951)) -- Fix ActivityPub serialization of replies when some of them are URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/13957)) -- Fix `rake mastodon:setup` choking on environment variables containing `%` ([ThibG](https://github.com/tootsuite/mastodon/pull/13940)) -- Fix account redirect confirmation message talking about moved followers ([ThibG](https://github.com/tootsuite/mastodon/pull/13950)) -- Fix avatars having the wrong size on public detailed status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/14140)) -- Fix various issues around OpenGraph representation of media ([Gargron](https://github.com/tootsuite/mastodon/pull/14133)) +- Fix filters ignoring media descriptions ([BenLubar](https://github.com/mastodon/mastodon/pull/13837)) +- Fix some actions on custom emojis leading to cryptic errors in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13951)) +- Fix ActivityPub serialization of replies when some of them are URIs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13957)) +- Fix `rake mastodon:setup` choking on environment variables containing `%` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13940)) +- Fix account redirect confirmation message talking about moved followers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13950)) +- Fix avatars having the wrong size on public detailed status pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14140)) +- Fix various issues around OpenGraph representation of media ([Gargron](https://github.com/mastodon/mastodon/pull/14133)) - Pages containing audio no longer say "Attached: 1 image" in description - Audio attachments now represented as OpenGraph `og:audio` - The `twitter:player` page now uses Mastodon's proper audio/video player - Audio/video buffered bars now display correctly in audio/video player - Volume and progress bars now respond to movement/move smoother -- Fix audio/video/images/cards not reacting to window resizes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14130)) -- Fix very wide media attachments resulting in too thin a thumbnail in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14127)) -- Fix crash when merging posts into home feed after following someone ([ThibG](https://github.com/tootsuite/mastodon/pull/14129)) -- Fix unique username constraint for local users not being enforced in database ([ThibG](https://github.com/tootsuite/mastodon/pull/14099)) -- Fix unnecessary gap under video modal in web UI ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/14098)) -- Fix 2FA and sign in token pages not respecting user locale ([mfmfuyu](https://github.com/tootsuite/mastodon/pull/14087)) -- Fix unapproved users being able to view profiles when in limited-federation mode *and* requiring approval for sign-ups ([ThibG](https://github.com/tootsuite/mastodon/pull/14093)) -- Fix initial audio volume not corresponding to what's displayed in audio player in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14057)) -- Fix timelines sometimes jumping when closing modals in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14019)) -- Fix memory usage of downloading remote files ([Gargron](https://github.com/tootsuite/mastodon/pull/14184), [Gargron](https://github.com/tootsuite/mastodon/pull/14181), [noellabo](https://github.com/tootsuite/mastodon/pull/14356)) +- Fix audio/video/images/cards not reacting to window resizes in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14130)) +- Fix very wide media attachments resulting in too thin a thumbnail in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14127)) +- Fix crash when merging posts into home feed after following someone ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14129)) +- Fix unique username constraint for local users not being enforced in database ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14099)) +- Fix unnecessary gap under video modal in web UI ([mfmfuyu](https://github.com/mastodon/mastodon/pull/14098)) +- Fix 2FA and sign in token pages not respecting user locale ([mfmfuyu](https://github.com/mastodon/mastodon/pull/14087)) +- Fix unapproved users being able to view profiles when in limited-federation mode *and* requiring approval for sign-ups ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14093)) +- Fix initial audio volume not corresponding to what's displayed in audio player in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14057)) +- Fix timelines sometimes jumping when closing modals in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14019)) +- Fix memory usage of downloading remote files ([Gargron](https://github.com/mastodon/mastodon/pull/14184), [Gargron](https://github.com/mastodon/mastodon/pull/14181), [noellabo](https://github.com/mastodon/mastodon/pull/14356)) - Don't read entire file (up to 40 MB) into memory - Read and write it to temp file in small chunks -- Fix inconsistent account header padding in web UI ([trwnh](https://github.com/tootsuite/mastodon/pull/14179)) -- Fix Thai being skipped from language detection ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13989)) +- Fix inconsistent account header padding in web UI ([trwnh](https://github.com/mastodon/mastodon/pull/14179)) +- Fix Thai being skipped from language detection ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/13989)) - Since Thai has its own alphabet, it can be detected more reliably -- Fix broken hashtag column options styling in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14247)) -- Fix pointer cursor being shown on toots that are not clickable in web UI ([arielrodrigues](https://github.com/tootsuite/mastodon/pull/14185)) -- Fix lock icon not being shown when locking account in profile settings ([ThibG](https://github.com/tootsuite/mastodon/pull/14190)) -- Fix domain blocks doing work the wrong way around ([ThibG](https://github.com/tootsuite/mastodon/pull/13424)) +- Fix broken hashtag column options styling in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14247)) +- Fix pointer cursor being shown on toots that are not clickable in web UI ([arielrodrigues](https://github.com/mastodon/mastodon/pull/14185)) +- Fix lock icon not being shown when locking account in profile settings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14190)) +- Fix domain blocks doing work the wrong way around ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13424)) - Instead of suspending accounts one by one, mark all as suspended first (quick) - Only then proceed to start removing their data (slow) - Clear out media attachments in a separate worker (slow) @@ -535,1301 +643,1301 @@ All notable changes to this project will be documented in this file. ## [3.1.5] - 2020-07-07 ### Security -- Fix media attachment enumeration ([ThibG](https://github.com/tootsuite/mastodon/pull/14254)) -- Change rate limits for various paths ([Gargron](https://github.com/tootsuite/mastodon/pull/14253)) -- Fix other sessions not being logged out on password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14252)) +- Fix media attachment enumeration ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14254)) +- Change rate limits for various paths ([Gargron](https://github.com/mastodon/mastodon/pull/14253)) +- Fix other sessions not being logged out on password change ([Gargron](https://github.com/mastodon/mastodon/pull/14252)) ## [3.1.4] - 2020-05-14 ### Added -- Add `vi` to available locales ([taicv](https://github.com/tootsuite/mastodon/pull/13542)) -- Add ability to remove identity proofs from account ([Gargron](https://github.com/tootsuite/mastodon/pull/13682)) -- Add ability to exclude local content from federated timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/13504), [noellabo](https://github.com/tootsuite/mastodon/pull/13745)) +- Add `vi` to available locales ([taicv](https://github.com/mastodon/mastodon/pull/13542)) +- Add ability to remove identity proofs from account ([Gargron](https://github.com/mastodon/mastodon/pull/13682)) +- Add ability to exclude local content from federated timeline ([noellabo](https://github.com/mastodon/mastodon/pull/13504), [noellabo](https://github.com/mastodon/mastodon/pull/13745)) - Add `remote` param to `GET /api/v1/timelines/public` REST API - Add `public/remote` / `public:remote` variants to streaming API - "Remote only" option in federated timeline column settings in web UI -- Add ability to exclude remote content from hashtag timelines in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/13502)) +- Add ability to exclude remote content from hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13502)) - No changes to REST API - "Local only" option in hashtag column settings in web UI -- Add Capistrano tasks that reload the services after deploying ([berkes](https://github.com/tootsuite/mastodon/pull/12642)) -- Add `invites_enabled` attribute to `GET /api/v1/instance` in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/13501)) -- Add `tootctl emoji export` command ([lfuelling](https://github.com/tootsuite/mastodon/pull/13534)) -- Add separate cache directory for non-local uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/12821), [Hanage999](https://github.com/tootsuite/mastodon/pull/13593), [mayaeh](https://github.com/tootsuite/mastodon/pull/13551)) +- Add Capistrano tasks that reload the services after deploying ([berkes](https://github.com/mastodon/mastodon/pull/12642)) +- Add `invites_enabled` attribute to `GET /api/v1/instance` in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13501)) +- Add `tootctl emoji export` command ([lfuelling](https://github.com/mastodon/mastodon/pull/13534)) +- Add separate cache directory for non-local uploads ([Gargron](https://github.com/mastodon/mastodon/pull/12821), [Hanage999](https://github.com/mastodon/mastodon/pull/13593), [mayaeh](https://github.com/mastodon/mastodon/pull/13551)) - Add `tootctl upgrade storage-schema` command to move old non-local uploads to the cache directory -- Add buttons to delete header and avatar from profile settings ([sternenseemann](https://github.com/tootsuite/mastodon/pull/13234)) -- Add emoji graphics and shortcodes from Twemoji 12.1.5 ([DeeUnderscore](https://github.com/tootsuite/mastodon/pull/13021)) +- Add buttons to delete header and avatar from profile settings ([sternenseemann](https://github.com/mastodon/mastodon/pull/13234)) +- Add emoji graphics and shortcodes from Twemoji 12.1.5 ([DeeUnderscore](https://github.com/mastodon/mastodon/pull/13021)) ### Changed -- Change error message when trying to migrate to an account that does not have current account set as an alias to be more clear ([TheEvilSkeleton](https://github.com/tootsuite/mastodon/pull/13746)) -- Change delivery failure tracking to work with hostnames instead of URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/13437), [noellabo](https://github.com/tootsuite/mastodon/pull/13481), [noellabo](https://github.com/tootsuite/mastodon/pull/13482), [noellabo](https://github.com/tootsuite/mastodon/pull/13535)) -- Change Content-Security-Policy to not need unsafe-inline style-src ([ThibG](https://github.com/tootsuite/mastodon/pull/13679), [ThibG](https://github.com/tootsuite/mastodon/pull/13692), [ThibG](https://github.com/tootsuite/mastodon/pull/13576), [ThibG](https://github.com/tootsuite/mastodon/pull/13575), [ThibG](https://github.com/tootsuite/mastodon/pull/13438)) -- Change how RSS items are titled and formatted ([ThibG](https://github.com/tootsuite/mastodon/pull/13592), [ykzts](https://github.com/tootsuite/mastodon/pull/13591)) +- Change error message when trying to migrate to an account that does not have current account set as an alias to be more clear ([TheEvilSkeleton](https://github.com/mastodon/mastodon/pull/13746)) +- Change delivery failure tracking to work with hostnames instead of URLs ([Gargron](https://github.com/mastodon/mastodon/pull/13437), [noellabo](https://github.com/mastodon/mastodon/pull/13481), [noellabo](https://github.com/mastodon/mastodon/pull/13482), [noellabo](https://github.com/mastodon/mastodon/pull/13535)) +- Change Content-Security-Policy to not need unsafe-inline style-src ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13679), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13692), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13576), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13575), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13438)) +- Change how RSS items are titled and formatted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13592), [ykzts](https://github.com/mastodon/mastodon/pull/13591)) ### Fixed -- Fix dropdown of muted and followed accounts offering option to hide boosts in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13748)) -- Fix "You are already signed in" alert being shown at wrong times ([ThibG](https://github.com/tootsuite/mastodon/pull/13547)) -- Fix retrying of failed-to-download media files not actually working ([noellabo](https://github.com/tootsuite/mastodon/pull/13741)) -- Fix first poll option not being focused when adding a poll in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13740)) -- Fix `sr` locale being selected over `sr-Latn` ([ThibG](https://github.com/tootsuite/mastodon/pull/13693)) -- Fix error within error when limiting backtrace to 3 lines ([Gargron](https://github.com/tootsuite/mastodon/pull/13120)) -- Fix `tootctl media remove-orphans` crashing on "Import" files ([ThibG](https://github.com/tootsuite/mastodon/pull/13685)) -- Fix regression in `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/13405)) -- Fix old unique jobs digests not having been cleaned up ([Gargron](https://github.com/tootsuite/mastodon/pull/13683)) -- Fix own following/followers not showing muted users ([ThibG](https://github.com/tootsuite/mastodon/pull/13614)) -- Fix list of followed people ignoring sorting on Follows & Followers page ([taras2358](https://github.com/tootsuite/mastodon/pull/13676)) -- Fix wrong pgHero Content-Security-Policy when `CDN_HOST` is set ([ThibG](https://github.com/tootsuite/mastodon/pull/13595)) -- Fix needlessly deduplicating usernames on collisions with remote accounts when signing-up through SAML/CAS ([kaiyou](https://github.com/tootsuite/mastodon/pull/13581)) -- Fix page incorrectly scrolling when bringing up dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13574)) -- Fix messed up z-index when NoScript blocks media/previews in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13449)) -- Fix "See what's happening" page showing public instead of local timeline for logged-in users ([ThibG](https://github.com/tootsuite/mastodon/pull/13499)) -- Fix not being able to resolve public resources in development environment ([Gargron](https://github.com/tootsuite/mastodon/pull/13505)) -- Fix uninformative error message when uploading unsupported image files ([ThibG](https://github.com/tootsuite/mastodon/pull/13540)) -- Fix expanded video player issues in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13541), [eai04191](https://github.com/tootsuite/mastodon/pull/13533)) -- Fix and refactor keyboard navigation in dropdown menus in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13528)) -- Fix uploaded image orientation being messed up in some browsers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13493)) -- Fix actions log crash when displaying updates of deleted announcements in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13489)) -- Fix search not working due to proxy settings when using hidden services ([Gargron](https://github.com/tootsuite/mastodon/pull/13488)) -- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/tootsuite/mastodon/pull/13485), [ThibG](https://github.com/tootsuite/mastodon/pull/13490)) -- Fix confusing error when failing to add an alias to an unknown account ([ThibG](https://github.com/tootsuite/mastodon/pull/13480)) -- Fix "Email changed" notification sometimes having wrong e-mail ([ThibG](https://github.com/tootsuite/mastodon/pull/13475)) -- Fix varioues issues on the account aliases page ([ThibG](https://github.com/tootsuite/mastodon/pull/13452)) -- Fix API footer link in web UI ([bubblineyuri](https://github.com/tootsuite/mastodon/pull/13441)) -- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13445)) -- Fix styling of polls in JS-less fallback on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/13436)) -- Fix trying to delete already deleted file when post-processing ([Gargron](https://github.com/tootsuite/mastodon/pull/13406)) +- Fix dropdown of muted and followed accounts offering option to hide boosts in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13748)) +- Fix "You are already signed in" alert being shown at wrong times ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13547)) +- Fix retrying of failed-to-download media files not actually working ([noellabo](https://github.com/mastodon/mastodon/pull/13741)) +- Fix first poll option not being focused when adding a poll in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13740)) +- Fix `sr` locale being selected over `sr-Latn` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13693)) +- Fix error within error when limiting backtrace to 3 lines ([Gargron](https://github.com/mastodon/mastodon/pull/13120)) +- Fix `tootctl media remove-orphans` crashing on "Import" files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13685)) +- Fix regression in `tootctl media remove-orphans` ([Gargron](https://github.com/mastodon/mastodon/pull/13405)) +- Fix old unique jobs digests not having been cleaned up ([Gargron](https://github.com/mastodon/mastodon/pull/13683)) +- Fix own following/followers not showing muted users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13614)) +- Fix list of followed people ignoring sorting on Follows & Followers page ([taras2358](https://github.com/mastodon/mastodon/pull/13676)) +- Fix wrong pgHero Content-Security-Policy when `CDN_HOST` is set ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13595)) +- Fix needlessly deduplicating usernames on collisions with remote accounts when signing-up through SAML/CAS ([kaiyou](https://github.com/mastodon/mastodon/pull/13581)) +- Fix page incorrectly scrolling when bringing up dropdown menus in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13574)) +- Fix messed up z-index when NoScript blocks media/previews in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13449)) +- Fix "See what's happening" page showing public instead of local timeline for logged-in users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13499)) +- Fix not being able to resolve public resources in development environment ([Gargron](https://github.com/mastodon/mastodon/pull/13505)) +- Fix uninformative error message when uploading unsupported image files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13540)) +- Fix expanded video player issues in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13541), [eai04191](https://github.com/mastodon/mastodon/pull/13533)) +- Fix and refactor keyboard navigation in dropdown menus in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13528)) +- Fix uploaded image orientation being messed up in some browsers in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13493)) +- Fix actions log crash when displaying updates of deleted announcements in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13489)) +- Fix search not working due to proxy settings when using hidden services ([Gargron](https://github.com/mastodon/mastodon/pull/13488)) +- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/mastodon/mastodon/pull/13485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13490)) +- Fix confusing error when failing to add an alias to an unknown account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13480)) +- Fix "Email changed" notification sometimes having wrong e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13475)) +- Fix varioues issues on the account aliases page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13452)) +- Fix API footer link in web UI ([bubblineyuri](https://github.com/mastodon/mastodon/pull/13441)) +- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13445)) +- Fix styling of polls in JS-less fallback on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13436)) +- Fix trying to delete already deleted file when post-processing ([Gargron](https://github.com/mastodon/mastodon/pull/13406)) ### Security -- Fix Doorkeeper vulnerability that exposed app secret to users who authorized the app and reset secret of the web UI that could have been exposed ([dependabot-preview[bot]](https://github.com/tootsuite/mastodon/pull/13613), [Gargron](https://github.com/tootsuite/mastodon/pull/13688)) +- Fix Doorkeeper vulnerability that exposed app secret to users who authorized the app and reset secret of the web UI that could have been exposed ([dependabot-preview[bot]](https://github.com/mastodon/mastodon/pull/13613), [Gargron](https://github.com/mastodon/mastodon/pull/13688)) - For apps that self-register on behalf of every individual user (such as most mobile apps), this is a non-issue - The issue only affects developers of apps who are shared between multiple users, such as server-side apps like cross-posters ## [3.1.3] - 2020-04-05 ### Added -- Add ability to filter audit log in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13381)) -- Add titles to warning presets in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13252)) -- Add option to include resolved DNS records when blacklisting e-mail domains in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13254)) -- Add ability to delete files uploaded for settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13192)) -- Add sorting by username, creation and last activity in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13076)) -- Add explanation as to why unlocked accounts may have follow requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13385)) -- Add link to bookmarks to dropdown in web UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/13273)) -- Add support for links to statuses in announcements to be opened in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13212), [ThibG](https://github.com/tootsuite/mastodon/pull/13250)) -- Add tooltips to audio/video player buttons in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13203)) -- Add submit button to the top of preferences pages ([guigeekz](https://github.com/tootsuite/mastodon/pull/13068)) -- Add specific rate limits for posting, following and reporting ([Gargron](https://github.com/tootsuite/mastodon/pull/13172), [Gargron](https://github.com/tootsuite/mastodon/pull/13390)) +- Add ability to filter audit log in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/13381)) +- Add titles to warning presets in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/13252)) +- Add option to include resolved DNS records when blacklisting e-mail domains in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/13254)) +- Add ability to delete files uploaded for settings in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13192)) +- Add sorting by username, creation and last activity in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13076)) +- Add explanation as to why unlocked accounts may have follow requests in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13385)) +- Add link to bookmarks to dropdown in web UI ([mayaeh](https://github.com/mastodon/mastodon/pull/13273)) +- Add support for links to statuses in announcements to be opened in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13212), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13250)) +- Add tooltips to audio/video player buttons in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13203)) +- Add submit button to the top of preferences pages ([guigeekz](https://github.com/mastodon/mastodon/pull/13068)) +- Add specific rate limits for posting, following and reporting ([Gargron](https://github.com/mastodon/mastodon/pull/13172), [Gargron](https://github.com/mastodon/mastodon/pull/13390)) - 300 posts every 3 hours - 400 follows or follow requests every 24 hours - 400 reports every 24 hours -- Add federation support for the "hide network" preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11673)) -- Add `--skip-media-remove` option to `tootctl statuses remove` ([tateisu](https://github.com/tootsuite/mastodon/pull/13080)) +- Add federation support for the "hide network" preference ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11673)) +- Add `--skip-media-remove` option to `tootctl statuses remove` ([tateisu](https://github.com/mastodon/mastodon/pull/13080)) ### Changed -- **Change design of polls in web UI** ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13257), [ThibG](https://github.com/tootsuite/mastodon/pull/13313)) -- Change status click areas in web UI to be bigger ([ariasuni](https://github.com/tootsuite/mastodon/pull/13327)) -- **Change `tootctl media remove-orphans` to work for all classes** ([Gargron](https://github.com/tootsuite/mastodon/pull/13316)) -- **Change local media attachments to perform heavy processing asynchronously** ([Gargron](https://github.com/tootsuite/mastodon/pull/13210)) -- Change video uploads to always be converted to H264/MP4 ([Gargron](https://github.com/tootsuite/mastodon/pull/13220), [ThibG](https://github.com/tootsuite/mastodon/pull/13239), [ThibG](https://github.com/tootsuite/mastodon/pull/13242)) -- Change video uploads to enforce certain limits ([Gargron](https://github.com/tootsuite/mastodon/pull/13218)) +- **Change design of polls in web UI** ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/13257), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13313)) +- Change status click areas in web UI to be bigger ([ariasuni](https://github.com/mastodon/mastodon/pull/13327)) +- **Change `tootctl media remove-orphans` to work for all classes** ([Gargron](https://github.com/mastodon/mastodon/pull/13316)) +- **Change local media attachments to perform heavy processing asynchronously** ([Gargron](https://github.com/mastodon/mastodon/pull/13210)) +- Change video uploads to always be converted to H264/MP4 ([Gargron](https://github.com/mastodon/mastodon/pull/13220), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13239), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13242)) +- Change video uploads to enforce certain limits ([Gargron](https://github.com/mastodon/mastodon/pull/13218)) - Dimensions smaller than 1920x1200px - Frame rate at most 60fps -- Change the tooltip "Toggle visibility" to "Hide media" in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13199)) -- Change description of privacy levels to be more intuitive in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13197)) -- Change GIF label to be displayed even when autoplay is enabled in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/13209)) -- Change the string "Hide everything from …" to "Block domain …" in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13178), [mayaeh](https://github.com/tootsuite/mastodon/pull/13221)) -- Change wording of media display preferences to be more intuitive ([ariasuni](https://github.com/tootsuite/mastodon/pull/13198)) +- Change the tooltip "Toggle visibility" to "Hide media" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13199)) +- Change description of privacy levels to be more intuitive in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13197)) +- Change GIF label to be displayed even when autoplay is enabled in web UI ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/13209)) +- Change the string "Hide everything from …" to "Block domain …" in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13178), [mayaeh](https://github.com/mastodon/mastodon/pull/13221)) +- Change wording of media display preferences to be more intuitive ([ariasuni](https://github.com/mastodon/mastodon/pull/13198)) ### Deprecated -- `POST /api/v1/media` → `POST /api/v2/media` ([Gargron](https://github.com/tootsuite/mastodon/pull/13210)) +- `POST /api/v1/media` → `POST /api/v2/media` ([Gargron](https://github.com/mastodon/mastodon/pull/13210)) ### Fixed -- Fix `tootctl media remove-orphans` ignoring `PAPERCLIP_ROOT_PATH` ([Gargron](https://github.com/tootsuite/mastodon/pull/13375)) -- Fix returning results when searching for URL with non-zero offset ([Gargron](https://github.com/tootsuite/mastodon/pull/13377)) -- Fix pinning a column in web UI sometimes redirecting out of web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13376)) -- Fix background jobs not using locks like they are supposed to ([Gargron](https://github.com/tootsuite/mastodon/pull/13361)) -- Fix content warning being unnecessarily cleared when hiding content warning input in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13348)) -- Fix "Show more" not switching to "Show less" on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/13174)) -- Fix import overwrite option not being selectable ([noellabo](https://github.com/tootsuite/mastodon/pull/13347)) -- Fix wrong color for ellipsis in boost confirmation dialog in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13355)) -- Fix unnecessary unfollowing when importing follows with overwrite option ([noellabo](https://github.com/tootsuite/mastodon/pull/13350)) -- Fix 404 and 410 API errors being silently discarded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13279)) -- Fix OCR not working on Safari because of unsupported worker-src CSP ([ThibG](https://github.com/tootsuite/mastodon/pull/13323)) -- Fix media not being marked sensitive when a content warning is set with no text ([ThibG](https://github.com/tootsuite/mastodon/pull/13277)) -- Fix crash after deleting announcements in web UI ([codesections](https://github.com/tootsuite/mastodon/pull/13283), [ThibG](https://github.com/tootsuite/mastodon/pull/13312)) -- Fix bookmarks not being searchable ([Kjwon15](https://github.com/tootsuite/mastodon/pull/13271), [noellabo](https://github.com/tootsuite/mastodon/pull/13293)) -- Fix reported accounts not being whitelisted from further spam checks when resolving a spam check report ([ThibG](https://github.com/tootsuite/mastodon/pull/13289)) -- Fix web UI crash in single-column mode on prehistoric browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/13267)) -- Fix some timeouts when searching for URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/13253)) -- Fix detailed view of direct messages displaying a 0 boost count in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13244)) -- Fix regression in “Edit media” modal in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13243)) -- Fix public posts from silenced accounts not being changed to unlisted visibility ([ThibG](https://github.com/tootsuite/mastodon/pull/13096)) -- Fix error when searching for URLs that contain the mention syntax ([ThibG](https://github.com/tootsuite/mastodon/pull/13151)) -- Fix text area above/right of emoji picker being accidentally clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/13148)) -- Fix too large announcements not being scrollable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13211)) -- Fix `tootctl media remove-orphans` crashing when encountering invalid media ([ThibG](https://github.com/tootsuite/mastodon/pull/13170)) -- Fix installation failing when Redis password contains special characters ([ThibG](https://github.com/tootsuite/mastodon/pull/13156)) -- Fix announcements with fully-qualified mentions to local users crashing web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13164)) +- Fix `tootctl media remove-orphans` ignoring `PAPERCLIP_ROOT_PATH` ([Gargron](https://github.com/mastodon/mastodon/pull/13375)) +- Fix returning results when searching for URL with non-zero offset ([Gargron](https://github.com/mastodon/mastodon/pull/13377)) +- Fix pinning a column in web UI sometimes redirecting out of web UI ([Gargron](https://github.com/mastodon/mastodon/pull/13376)) +- Fix background jobs not using locks like they are supposed to ([Gargron](https://github.com/mastodon/mastodon/pull/13361)) +- Fix content warning being unnecessarily cleared when hiding content warning input in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13348)) +- Fix "Show more" not switching to "Show less" on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13174)) +- Fix import overwrite option not being selectable ([noellabo](https://github.com/mastodon/mastodon/pull/13347)) +- Fix wrong color for ellipsis in boost confirmation dialog in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13355)) +- Fix unnecessary unfollowing when importing follows with overwrite option ([noellabo](https://github.com/mastodon/mastodon/pull/13350)) +- Fix 404 and 410 API errors being silently discarded in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13279)) +- Fix OCR not working on Safari because of unsupported worker-src CSP ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13323)) +- Fix media not being marked sensitive when a content warning is set with no text ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13277)) +- Fix crash after deleting announcements in web UI ([codesections](https://github.com/mastodon/mastodon/pull/13283), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13312)) +- Fix bookmarks not being searchable ([Kjwon15](https://github.com/mastodon/mastodon/pull/13271), [noellabo](https://github.com/mastodon/mastodon/pull/13293)) +- Fix reported accounts not being whitelisted from further spam checks when resolving a spam check report ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13289)) +- Fix web UI crash in single-column mode on prehistoric browsers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13267)) +- Fix some timeouts when searching for URLs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13253)) +- Fix detailed view of direct messages displaying a 0 boost count in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13244)) +- Fix regression in “Edit media” modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13243)) +- Fix public posts from silenced accounts not being changed to unlisted visibility ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13096)) +- Fix error when searching for URLs that contain the mention syntax ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13151)) +- Fix text area above/right of emoji picker being accidentally clickable in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13148)) +- Fix too large announcements not being scrollable in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13211)) +- Fix `tootctl media remove-orphans` crashing when encountering invalid media ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13170)) +- Fix installation failing when Redis password contains special characters ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13156)) +- Fix announcements with fully-qualified mentions to local users crashing web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13164)) ### Security -- Fix re-sending of e-mail confirmation not being rate limited ([Gargron](https://github.com/tootsuite/mastodon/pull/13360)) +- Fix re-sending of e-mail confirmation not being rate limited ([Gargron](https://github.com/mastodon/mastodon/pull/13360)) ## [v3.1.2] - 2020-02-27 ### Added -- Add `--reset-password` option to `tootctl accounts modify` ([ThibG](https://github.com/tootsuite/mastodon/pull/13126)) -- Add source-mapped stacktrace to error message in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13082)) +- Add `--reset-password` option to `tootctl accounts modify` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13126)) +- Add source-mapped stacktrace to error message in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13082)) ### Fixed -- Fix dismissing an announcement twice raising an obscure error ([ThibG](https://github.com/tootsuite/mastodon/pull/13124)) -- Fix misleading error when attempting to re-send a pending follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/13133)) -- Fix backups failing when files are missing from media attachments ([ThibG](https://github.com/tootsuite/mastodon/pull/13146)) -- Fix duplicate accounts being created when fetching an account for its key only ([ThibG](https://github.com/tootsuite/mastodon/pull/13147)) -- Fix `/web` redirecting to `/web/web` in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13128)) -- Fix previously OStatus-based accounts not being detected as ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/13129)) -- Fix account JSON/RSS not being cacheable due to wrong mime type comparison ([ThibG](https://github.com/tootsuite/mastodon/pull/13116)) -- Fix old browsers crashing because of missing `finally` polyfill in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13115)) -- Fix account's bio not being shown if there are no proofs/fields in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13075)) -- Fix sign-ups without checked user agreement being accepted through the web form ([ThibG](https://github.com/tootsuite/mastodon/pull/13088)) -- Fix non-x64 architectures not being able to build Docker image because of hardcoded Node.js architecture ([SaraSmiseth](https://github.com/tootsuite/mastodon/pull/13081)) -- Fix invite request input not being shown on sign-up error if left empty ([ThibG](https://github.com/tootsuite/mastodon/pull/13089)) -- Fix some migration hints mentioning GitLab instead of Mastodon ([saper](https://github.com/tootsuite/mastodon/pull/13084)) +- Fix dismissing an announcement twice raising an obscure error ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13124)) +- Fix misleading error when attempting to re-send a pending follow request ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13133)) +- Fix backups failing when files are missing from media attachments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13146)) +- Fix duplicate accounts being created when fetching an account for its key only ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13147)) +- Fix `/web` redirecting to `/web/web` in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13128)) +- Fix previously OStatus-based accounts not being detected as ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13129)) +- Fix account JSON/RSS not being cacheable due to wrong mime type comparison ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13116)) +- Fix old browsers crashing because of missing `finally` polyfill in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13115)) +- Fix account's bio not being shown if there are no proofs/fields in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13075)) +- Fix sign-ups without checked user agreement being accepted through the web form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13088)) +- Fix non-x64 architectures not being able to build Docker image because of hardcoded Node.js architecture ([SaraSmiseth](https://github.com/mastodon/mastodon/pull/13081)) +- Fix invite request input not being shown on sign-up error if left empty ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13089)) +- Fix some migration hints mentioning GitLab instead of Mastodon ([saper](https://github.com/mastodon/mastodon/pull/13084)) ### Security -- Fix leak of arbitrary statuses through unfavourite action in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13161)) +- Fix leak of arbitrary statuses through unfavourite action in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/13161)) ## [3.1.1] - 2020-02-10 ### Fixed -- Fix yanked dependency preventing installation ([mayaeh](https://github.com/tootsuite/mastodon/pull/13059)) +- Fix yanked dependency preventing installation ([mayaeh](https://github.com/mastodon/mastodon/pull/13059)) ## [3.1.0] - 2020-02-09 ### Added -- Add bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/7107), [Gargron](https://github.com/tootsuite/mastodon/pull/12494), [Gomasy](https://github.com/tootsuite/mastodon/pull/12381)) -- Add announcements ([Gargron](https://github.com/tootsuite/mastodon/pull/12662), [Gargron](https://github.com/tootsuite/mastodon/pull/12967), [Gargron](https://github.com/tootsuite/mastodon/pull/12970), [Gargron](https://github.com/tootsuite/mastodon/pull/12963), [Gargron](https://github.com/tootsuite/mastodon/pull/12950), [Gargron](https://github.com/tootsuite/mastodon/pull/12990), [Gargron](https://github.com/tootsuite/mastodon/pull/12949), [Gargron](https://github.com/tootsuite/mastodon/pull/12989), [Gargron](https://github.com/tootsuite/mastodon/pull/12964), [Gargron](https://github.com/tootsuite/mastodon/pull/12965), [ThibG](https://github.com/tootsuite/mastodon/pull/12958), [ThibG](https://github.com/tootsuite/mastodon/pull/12957), [Gargron](https://github.com/tootsuite/mastodon/pull/12955), [ThibG](https://github.com/tootsuite/mastodon/pull/12946), [ThibG](https://github.com/tootsuite/mastodon/pull/12954)) -- Add number animations in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12948), [Gargron](https://github.com/tootsuite/mastodon/pull/12971)) -- Add `kab`, `is`, `kn`, `mr`, `ur` to available locales ([Gargron](https://github.com/tootsuite/mastodon/pull/12882), [BoFFire](https://github.com/tootsuite/mastodon/pull/12962), [Gargron](https://github.com/tootsuite/mastodon/pull/12379)) -- Add profile filter category ([ThibG](https://github.com/tootsuite/mastodon/pull/12918)) -- Add ability to add oneself to lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12271)) -- Add hint how to contribute translations to preferences page ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12736)) -- Add signatures to statuses in archive takeout ([noellabo](https://github.com/tootsuite/mastodon/pull/12649)) -- Add support for `magnet:` and `xmpp` links ([ThibG](https://github.com/tootsuite/mastodon/pull/12905), [ThibG](https://github.com/tootsuite/mastodon/pull/12709)) -- Add `follow_request` notification type ([ThibG](https://github.com/tootsuite/mastodon/pull/12198)) -- Add ability to filter reports by account domain in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12154)) -- Add link to search for users connected from the same IP address to admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12157)) -- Add link to reports targeting a specific domain in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/12513)) -- Add support for EventSource streaming in web UI ([BenLubar](https://github.com/tootsuite/mastodon/pull/12887)) -- Add hotkey for opening media attachments in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12498), [Kjwon15](https://github.com/tootsuite/mastodon/pull/12546)) -- Add relationship-based options to status dropdowns in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12377), [ThibG](https://github.com/tootsuite/mastodon/pull/12535), [Gargron](https://github.com/tootsuite/mastodon/pull/12430)) -- Add support for submitting media description with `ctrl`+`enter` in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12272)) -- Add download button to audio and video players in web UI ([NimaBoscarino](https://github.com/tootsuite/mastodon/pull/12179)) -- Add setting for whether to crop images in timelines in web UI ([duxovni](https://github.com/tootsuite/mastodon/pull/12126)) -- Add support for `Event` activities ([tcitworld](https://github.com/tootsuite/mastodon/pull/12637)) -- Add basic support for `Group` actors ([noellabo](https://github.com/tootsuite/mastodon/pull/12071)) -- Add `S3_OVERRIDE_PATH_STYLE` environment variable ([Gargron](https://github.com/tootsuite/mastodon/pull/12594)) -- Add `S3_OPEN_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/12459)) -- Add `LDAP_MAIL` environment variable ([madmath03](https://github.com/tootsuite/mastodon/pull/12053)) -- Add `LDAP_UID_CONVERSION_ENABLED` environment variable ([madmath03](https://github.com/tootsuite/mastodon/pull/12461)) -- Add `--remote-only` option to `tootctl emoji purge` ([ThibG](https://github.com/tootsuite/mastodon/pull/12810)) -- Add `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/12568), [Gargron](https://github.com/tootsuite/mastodon/pull/12571)) -- Add `tootctl media lookup` command ([irlcatgirl](https://github.com/tootsuite/mastodon/pull/12283)) -- Add cache for OEmbed endpoints to avoid extra HTTP requests ([Gargron](https://github.com/tootsuite/mastodon/pull/12403)) -- Add support for KaiOS arrow navigation to public pages ([nolanlawson](https://github.com/tootsuite/mastodon/pull/12251)) -- Add `discoverable` to accounts in REST API ([trwnh](https://github.com/tootsuite/mastodon/pull/12508)) -- Add admin setting to disable default follows ([ArisuOngaku](https://github.com/tootsuite/mastodon/pull/12566)) -- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/tootsuite/mastodon/pull/12390), [Gargron](https://github.com/tootsuite/mastodon/pull/12743)) -- Allow support for `Accept`/`Reject` activities with a non-embedded object ([puckipedia](https://github.com/tootsuite/mastodon/pull/12199)) -- Add "Show thread" button to public profiles ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13000)) +- Add bookmarks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/7107), [Gargron](https://github.com/mastodon/mastodon/pull/12494), [Gomasy](https://github.com/mastodon/mastodon/pull/12381)) +- Add announcements ([Gargron](https://github.com/mastodon/mastodon/pull/12662), [Gargron](https://github.com/mastodon/mastodon/pull/12967), [Gargron](https://github.com/mastodon/mastodon/pull/12970), [Gargron](https://github.com/mastodon/mastodon/pull/12963), [Gargron](https://github.com/mastodon/mastodon/pull/12950), [Gargron](https://github.com/mastodon/mastodon/pull/12990), [Gargron](https://github.com/mastodon/mastodon/pull/12949), [Gargron](https://github.com/mastodon/mastodon/pull/12989), [Gargron](https://github.com/mastodon/mastodon/pull/12964), [Gargron](https://github.com/mastodon/mastodon/pull/12965), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12958), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12957), [Gargron](https://github.com/mastodon/mastodon/pull/12955), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12946), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12954)) +- Add number animations in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12948), [Gargron](https://github.com/mastodon/mastodon/pull/12971)) +- Add `kab`, `is`, `kn`, `mr`, `ur` to available locales ([Gargron](https://github.com/mastodon/mastodon/pull/12882), [BoFFire](https://github.com/mastodon/mastodon/pull/12962), [Gargron](https://github.com/mastodon/mastodon/pull/12379)) +- Add profile filter category ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12918)) +- Add ability to add oneself to lists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12271)) +- Add hint how to contribute translations to preferences page ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12736)) +- Add signatures to statuses in archive takeout ([noellabo](https://github.com/mastodon/mastodon/pull/12649)) +- Add support for `magnet:` and `xmpp` links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12905), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12709)) +- Add `follow_request` notification type ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12198)) +- Add ability to filter reports by account domain in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12154)) +- Add link to search for users connected from the same IP address to admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12157)) +- Add link to reports targeting a specific domain in admin view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12513)) +- Add support for EventSource streaming in web UI ([BenLubar](https://github.com/mastodon/mastodon/pull/12887)) +- Add hotkey for opening media attachments in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12498), [Kjwon15](https://github.com/mastodon/mastodon/pull/12546)) +- Add relationship-based options to status dropdowns in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12377), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12535), [Gargron](https://github.com/mastodon/mastodon/pull/12430)) +- Add support for submitting media description with `ctrl`+`enter` in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12272)) +- Add download button to audio and video players in web UI ([NimaBoscarino](https://github.com/mastodon/mastodon/pull/12179)) +- Add setting for whether to crop images in timelines in web UI ([duxovni](https://github.com/mastodon/mastodon/pull/12126)) +- Add support for `Event` activities ([tcitworld](https://github.com/mastodon/mastodon/pull/12637)) +- Add basic support for `Group` actors ([noellabo](https://github.com/mastodon/mastodon/pull/12071)) +- Add `S3_OVERRIDE_PATH_STYLE` environment variable ([Gargron](https://github.com/mastodon/mastodon/pull/12594)) +- Add `S3_OPEN_TIMEOUT` environment variable ([tateisu](https://github.com/mastodon/mastodon/pull/12459)) +- Add `LDAP_MAIL` environment variable ([madmath03](https://github.com/mastodon/mastodon/pull/12053)) +- Add `LDAP_UID_CONVERSION_ENABLED` environment variable ([madmath03](https://github.com/mastodon/mastodon/pull/12461)) +- Add `--remote-only` option to `tootctl emoji purge` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12810)) +- Add `tootctl media remove-orphans` ([Gargron](https://github.com/mastodon/mastodon/pull/12568), [Gargron](https://github.com/mastodon/mastodon/pull/12571)) +- Add `tootctl media lookup` command ([irlcatgirl](https://github.com/mastodon/mastodon/pull/12283)) +- Add cache for OEmbed endpoints to avoid extra HTTP requests ([Gargron](https://github.com/mastodon/mastodon/pull/12403)) +- Add support for KaiOS arrow navigation to public pages ([nolanlawson](https://github.com/mastodon/mastodon/pull/12251)) +- Add `discoverable` to accounts in REST API ([trwnh](https://github.com/mastodon/mastodon/pull/12508)) +- Add admin setting to disable default follows ([ArisuOngaku](https://github.com/mastodon/mastodon/pull/12566)) +- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/mastodon/mastodon/pull/12390), [Gargron](https://github.com/mastodon/mastodon/pull/12743)) +- Allow support for `Accept`/`Reject` activities with a non-embedded object ([puckipedia](https://github.com/mastodon/mastodon/pull/12199)) +- Add "Show thread" button to public profiles ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/13000)) ### Changed -- Change `last_status_at` to be a date, not datetime in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/12966)) -- Change followers page to relationships page in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12927), [Gargron](https://github.com/tootsuite/mastodon/pull/12934)) -- Change reported media attachments to always be hidden in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12879), [ThibG](https://github.com/tootsuite/mastodon/pull/12907)) -- Change string from "Disable" to "Disable login" in admin UI ([nileshkumar](https://github.com/tootsuite/mastodon/pull/12201)) -- Change report page structure in admin UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12615)) -- Change swipe sensitivity to be lower on small screens in web UI ([umonaca](https://github.com/tootsuite/mastodon/pull/12168)) -- Change audio/video playback to stop playback when out of view in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12486)) -- Change media description label based on upload type in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12270)) -- Change large numbers to render without decimal units in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/12706)) -- Change "Add a choice" button to be disabled rather than hidden when poll limit reached in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12319), [hinaloe](https://github.com/tootsuite/mastodon/pull/12544)) -- Change `tootctl statuses remove` to keep statuses favourited or bookmarked by local users ([ThibG](https://github.com/tootsuite/mastodon/pull/11267), [Gomasy](https://github.com/tootsuite/mastodon/pull/12818)) -- Change domain block behavior to update user records (fast) before deleting data (slower) ([ThibG](https://github.com/tootsuite/mastodon/pull/12247)) -- Change behaviour to strip audio metadata on uploads ([hugogameiro](https://github.com/tootsuite/mastodon/pull/12171)) -- Change accepted length of remote media descriptions from 420 to 1,500 characters ([ThibG](https://github.com/tootsuite/mastodon/pull/12262)) -- Change preferences pages structure ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12497), [mayaeh](https://github.com/tootsuite/mastodon/pull/12517), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12801), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12797), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12799), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12793)) -- Change format of titles in RSS ([devkral](https://github.com/tootsuite/mastodon/pull/8596)) -- Change favourite icon animation from spring-based motion to CSS animation in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12175)) -- Change minimum required Node.js version to 10, and default to 12 ([Shleeble](https://github.com/tootsuite/mastodon/pull/12791), [mkody](https://github.com/tootsuite/mastodon/pull/12906), [Shleeble](https://github.com/tootsuite/mastodon/pull/12703)) -- Change spam check to exempt server staff ([ThibG](https://github.com/tootsuite/mastodon/pull/12874)) -- Change to fallback to to `Create` audience when `object` has no defined audience ([ThibG](https://github.com/tootsuite/mastodon/pull/12249)) -- Change Twemoji library to 12.1.3 in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/12342)) -- Change blocked users to be hidden from following/followers lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12733)) -- Change signature verification to ignore signatures with invalid host ([Gargron](https://github.com/tootsuite/mastodon/pull/13033)) +- Change `last_status_at` to be a date, not datetime in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12966)) +- Change followers page to relationships page in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12927), [Gargron](https://github.com/mastodon/mastodon/pull/12934)) +- Change reported media attachments to always be hidden in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12879), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12907)) +- Change string from "Disable" to "Disable login" in admin UI ([nileshkumar](https://github.com/mastodon/mastodon/pull/12201)) +- Change report page structure in admin UI ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12615)) +- Change swipe sensitivity to be lower on small screens in web UI ([umonaca](https://github.com/mastodon/mastodon/pull/12168)) +- Change audio/video playback to stop playback when out of view in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12486)) +- Change media description label based on upload type in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12270)) +- Change large numbers to render without decimal units in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/12706)) +- Change "Add a choice" button to be disabled rather than hidden when poll limit reached in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12319), [hinaloe](https://github.com/mastodon/mastodon/pull/12544)) +- Change `tootctl statuses remove` to keep statuses favourited or bookmarked by local users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11267), [Gomasy](https://github.com/mastodon/mastodon/pull/12818)) +- Change domain block behavior to update user records (fast) before deleting data (slower) ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12247)) +- Change behaviour to strip audio metadata on uploads ([hugogameiro](https://github.com/mastodon/mastodon/pull/12171)) +- Change accepted length of remote media descriptions from 420 to 1,500 characters ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12262)) +- Change preferences pages structure ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12497), [mayaeh](https://github.com/mastodon/mastodon/pull/12517), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12801), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12797), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12799), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12793)) +- Change format of titles in RSS ([devkral](https://github.com/mastodon/mastodon/pull/8596)) +- Change favourite icon animation from spring-based motion to CSS animation in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12175)) +- Change minimum required Node.js version to 10, and default to 12 ([Shleeble](https://github.com/mastodon/mastodon/pull/12791), [mkody](https://github.com/mastodon/mastodon/pull/12906), [Shleeble](https://github.com/mastodon/mastodon/pull/12703)) +- Change spam check to exempt server staff ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12874)) +- Change to fallback to to `Create` audience when `object` has no defined audience ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12249)) +- Change Twemoji library to 12.1.3 in web UI ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/12342)) +- Change blocked users to be hidden from following/followers lists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12733)) +- Change signature verification to ignore signatures with invalid host ([Gargron](https://github.com/mastodon/mastodon/pull/13033)) ### Removed -- Remove unused dependencies ([ykzts](https://github.com/tootsuite/mastodon/pull/12861), [mayaeh](https://github.com/tootsuite/mastodon/pull/12826), [ThibG](https://github.com/tootsuite/mastodon/pull/12822), [ykzts](https://github.com/tootsuite/mastodon/pull/12533)) +- Remove unused dependencies ([ykzts](https://github.com/mastodon/mastodon/pull/12861), [mayaeh](https://github.com/mastodon/mastodon/pull/12826), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12822), [ykzts](https://github.com/mastodon/mastodon/pull/12533)) ### Fixed -- Fix some translatable strings being used wrongly ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12569), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12589), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12502), [mayaeh](https://github.com/tootsuite/mastodon/pull/12231)) -- Fix headline of public timeline page when set to local-only ([ykzts](https://github.com/tootsuite/mastodon/pull/12224)) -- Fix space between tabs not being spread evenly in web UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12944), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12961), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12446)) -- Fix interactive delays in database migrations with no TTY ([Gargron](https://github.com/tootsuite/mastodon/pull/12969)) -- Fix status overflowing in report dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12959)) -- Fix unlocalized dropdown button title in web UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12947)) -- Fix media attachments without file being uploadable ([Gargron](https://github.com/tootsuite/mastodon/pull/12562)) -- Fix unfollow confirmations in profile directory in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12922)) -- Fix duplicate `description` meta tag on accounts public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/12923)) -- Fix slow query of federated timeline ([notozeki](https://github.com/tootsuite/mastodon/pull/12886)) -- Fix not all of account's active IPs showing up in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12909), [Gargron](https://github.com/tootsuite/mastodon/pull/12943)) -- Fix search by IP not using alternative browser sessions in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12904)) -- Fix “X new items” not showing up for slow mode on empty timelines in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12875)) -- Fix OEmbed endpoint being inaccessible in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12864)) -- Fix proofs API being inaccessible in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12495)) -- Fix Ruby 2.7 incompatibilities ([ThibG](https://github.com/tootsuite/mastodon/pull/12831), [ThibG](https://github.com/tootsuite/mastodon/pull/12824), [Shleeble](https://github.com/tootsuite/mastodon/pull/12759), [zunda](https://github.com/tootsuite/mastodon/pull/12769)) -- Fix invalid poll votes being accepted in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/12601)) -- Fix old migrations failing because of strong migrations update ([ThibG](https://github.com/tootsuite/mastodon/pull/12787), [ThibG](https://github.com/tootsuite/mastodon/pull/12692)) -- Fix reuse of detailed status components in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12792)) -- Fix base64-encoded file uploads not being possible in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/12748), [Gargron](https://github.com/tootsuite/mastodon/pull/12857)) -- Fix error due to missing authentication call in filters controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12746)) -- Fix uncaught unknown format error in host meta controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12747)) -- Fix URL search not returning private toots user has access to ([ThibG](https://github.com/tootsuite/mastodon/pull/12742), [ThibG](https://github.com/tootsuite/mastodon/pull/12336)) -- Fix cache digesting log noise on status embeds ([Gargron](https://github.com/tootsuite/mastodon/pull/12750)) -- Fix slowness due to layout thrashing when reloading a large set of statuses in web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12661), [panarom](https://github.com/tootsuite/mastodon/pull/12744), [Gargron](https://github.com/tootsuite/mastodon/pull/12712)) -- Fix error when fetching followers/following from REST API when user has network hidden ([Gargron](https://github.com/tootsuite/mastodon/pull/12716)) -- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/tootsuite/mastodon/pull/12715), [Gargron](https://github.com/tootsuite/mastodon/pull/13035), [Gargron](https://github.com/tootsuite/mastodon/pull/13030)) -- Fix error when searching for empty phrase ([Gargron](https://github.com/tootsuite/mastodon/pull/12711)) -- Fix backups stopping due to read timeouts ([chr-1x](https://github.com/tootsuite/mastodon/pull/12281)) -- Fix batch actions on non-pending tags in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12537)) -- Fix sample `SAML_ACS_URL`, `SAML_ISSUER` ([orlea](https://github.com/tootsuite/mastodon/pull/12669)) -- Fix manual scrolling issue on Firefox/Windows in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12648)) -- Fix archive takeout failing if total dump size exceeds 2GB ([scd31](https://github.com/tootsuite/mastodon/pull/12602), [Gargron](https://github.com/tootsuite/mastodon/pull/12653)) -- Fix custom emoji category creation silently erroring out on duplicate category ([ThibG](https://github.com/tootsuite/mastodon/pull/12647)) -- Fix link crawler not specifying preferred content type ([ThibG](https://github.com/tootsuite/mastodon/pull/12646)) -- Fix featured hashtag setting page erroring out instead of rejecting invalid tags ([ThibG](https://github.com/tootsuite/mastodon/pull/12436)) -- Fix tooltip messages of single/multiple-choice polls switcher being reversed in web UI ([acid-chicken](https://github.com/tootsuite/mastodon/pull/12616)) -- Fix typo in help text of `tootctl statuses remove` ([trwnh](https://github.com/tootsuite/mastodon/pull/12603)) -- Fix generic HTTP 500 error on duplicate records ([Gargron](https://github.com/tootsuite/mastodon/pull/12563)) -- Fix old migration failing with new status default scope ([ThibG](https://github.com/tootsuite/mastodon/pull/12493)) -- Fix errors when using search API with no query ([Gargron](https://github.com/tootsuite/mastodon/pull/12541), [trwnh](https://github.com/tootsuite/mastodon/pull/12549)) -- Fix poll options not being selectable via keyboard in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12538)) -- Fix conversations not having an unread indicator in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12506)) -- Fix lost focus when modals open/close in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12437)) -- Fix pending upload count not being decremented on error in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12499)) -- Fix empty poll options not being removed on remote poll update ([ThibG](https://github.com/tootsuite/mastodon/pull/12484)) -- Fix OCR with delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12465)) -- Fix blur behind closed registration message ([ThibG](https://github.com/tootsuite/mastodon/pull/12442)) -- Fix OEmbed discovery not handling different URL variants in query ([Gargron](https://github.com/tootsuite/mastodon/pull/12439)) -- Fix link crawler crashing on `` tags without `href` ([ThibG](https://github.com/tootsuite/mastodon/pull/12159)) -- Fix whitelisted subdomains being ignored in whitelist mode ([noiob](https://github.com/tootsuite/mastodon/pull/12435)) -- Fix broken audit log in whitelist mode in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12303)) -- Fix unread indicator not honoring "Only media" option in local and federated timelines in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12330)) -- Fix error when rebuilding home feeds ([dariusk](https://github.com/tootsuite/mastodon/pull/12324)) -- Fix relationship caches being broken as result of a follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/12299)) -- Fix more items than the limit being uploadable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12300)) -- Fix various issues with account migration ([ThibG](https://github.com/tootsuite/mastodon/pull/12301)) -- Fix filtered out items being counted as pending items in slow mode in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12266)) -- Fix notification filters not applying to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/12269)) -- Fix notification message for user's own poll saying it's a poll they voted on in web UI ([ykzts](https://github.com/tootsuite/mastodon/pull/12219)) -- Fix polls with an expiration not showing up as expired in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/12222)) -- Fix volume slider having an offset between cursor and slider in Chromium in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12158)) -- Fix Vagrant image not accepting connections ([shrft](https://github.com/tootsuite/mastodon/pull/12180)) -- Fix batch actions being hidden on small screens in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12183)) -- Fix incoming federation not working in whitelist mode ([ThibG](https://github.com/tootsuite/mastodon/pull/12185)) -- Fix error when passing empty `source` param to `PUT /api/v1/accounts/update_credentials` ([jglauche](https://github.com/tootsuite/mastodon/pull/12259)) -- Fix HTTP-based streaming API being cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/12945)) -- Fix users being able to register while `tootctl self-destruct` is in progress ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12877)) -- Fix microformats detection in link crawler not ignoring `h-card` links ([nightpool](https://github.com/tootsuite/mastodon/pull/12189)) -- Fix outline on full-screen video in web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/12176)) -- Fix TLD domain blocks not being editable ([ThibG](https://github.com/tootsuite/mastodon/pull/12805)) -- Fix Nanobox deploy hooks ([danhunsaker](https://github.com/tootsuite/mastodon/pull/12663)) -- Fix needlessly complicated SQL query when performing account search amongst followings ([ThibG](https://github.com/tootsuite/mastodon/pull/12302)) -- Fix favourites count not updating when unfavouriting in web UI ([NimaBoscarino](https://github.com/tootsuite/mastodon/pull/12140)) -- Fix occasional crash on scroll in Chromium in web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/12274)) -- Fix intersection observer not working in single-column mode web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12735)) -- Fix voting issue with remote polls that contain trailing spaces ([ThibG](https://github.com/tootsuite/mastodon/pull/12515)) -- Fix dynamic elements not working in pgHero due to CSP rules ([ykzts](https://github.com/tootsuite/mastodon/pull/12489)) -- Fix overly verbose backtraces when delivering ActivityPub payloads ([zunda](https://github.com/tootsuite/mastodon/pull/12798)) -- Fix rendering `` without `href` when scheme unsupported ([Gargron](https://github.com/tootsuite/mastodon/pull/13040)) -- Fix unfiltered params error when generating ActivityPub tag pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/13049)) -- Fix malformed HTML causing uncaught error ([Gargron](https://github.com/tootsuite/mastodon/pull/13042)) -- Fix native share button not being displayed for unlisted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/13045)) -- Fix remote convertible media attachments (e.g. GIFs) not being saved ([Gargron](https://github.com/tootsuite/mastodon/pull/13032)) -- Fix account query not using faster index ([abcang](https://github.com/tootsuite/mastodon/pull/13016)) -- Fix error when sending moderation notification ([renatolond](https://github.com/tootsuite/mastodon/pull/13014)) +- Fix some translatable strings being used wrongly ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12569), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12589), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12502), [mayaeh](https://github.com/mastodon/mastodon/pull/12231)) +- Fix headline of public timeline page when set to local-only ([ykzts](https://github.com/mastodon/mastodon/pull/12224)) +- Fix space between tabs not being spread evenly in web UI ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12944), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12961), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12446)) +- Fix interactive delays in database migrations with no TTY ([Gargron](https://github.com/mastodon/mastodon/pull/12969)) +- Fix status overflowing in report dialog in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12959)) +- Fix unlocalized dropdown button title in web UI ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/12947)) +- Fix media attachments without file being uploadable ([Gargron](https://github.com/mastodon/mastodon/pull/12562)) +- Fix unfollow confirmations in profile directory in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12922)) +- Fix duplicate `description` meta tag on accounts public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12923)) +- Fix slow query of federated timeline ([notozeki](https://github.com/mastodon/mastodon/pull/12886)) +- Fix not all of account's active IPs showing up in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12909), [Gargron](https://github.com/mastodon/mastodon/pull/12943)) +- Fix search by IP not using alternative browser sessions in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12904)) +- Fix “X new items” not showing up for slow mode on empty timelines in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12875)) +- Fix OEmbed endpoint being inaccessible in secure mode ([Gargron](https://github.com/mastodon/mastodon/pull/12864)) +- Fix proofs API being inaccessible in secure mode ([Gargron](https://github.com/mastodon/mastodon/pull/12495)) +- Fix Ruby 2.7 incompatibilities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12831), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12824), [Shleeble](https://github.com/mastodon/mastodon/pull/12759), [zunda](https://github.com/mastodon/mastodon/pull/12769)) +- Fix invalid poll votes being accepted in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12601)) +- Fix old migrations failing because of strong migrations update ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12787), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12692)) +- Fix reuse of detailed status components in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12792)) +- Fix base64-encoded file uploads not being possible in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/12748), [Gargron](https://github.com/mastodon/mastodon/pull/12857)) +- Fix error due to missing authentication call in filters controller ([Gargron](https://github.com/mastodon/mastodon/pull/12746)) +- Fix uncaught unknown format error in host meta controller ([Gargron](https://github.com/mastodon/mastodon/pull/12747)) +- Fix URL search not returning private toots user has access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12742), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/12336)) +- Fix cache digesting log noise on status embeds ([Gargron](https://github.com/mastodon/mastodon/pull/12750)) +- Fix slowness due to layout thrashing when reloading a large set of statuses in web UI ([panarom](https://github.com/mastodon/mastodon/pull/12661), [panarom](https://github.com/mastodon/mastodon/pull/12744), [Gargron](https://github.com/mastodon/mastodon/pull/12712)) +- Fix error when fetching followers/following from REST API when user has network hidden ([Gargron](https://github.com/mastodon/mastodon/pull/12716)) +- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/mastodon/mastodon/pull/12715), [Gargron](https://github.com/mastodon/mastodon/pull/13035), [Gargron](https://github.com/mastodon/mastodon/pull/13030)) +- Fix error when searching for empty phrase ([Gargron](https://github.com/mastodon/mastodon/pull/12711)) +- Fix backups stopping due to read timeouts ([chr-1x](https://github.com/mastodon/mastodon/pull/12281)) +- Fix batch actions on non-pending tags in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12537)) +- Fix sample `SAML_ACS_URL`, `SAML_ISSUER` ([orlea](https://github.com/mastodon/mastodon/pull/12669)) +- Fix manual scrolling issue on Firefox/Windows in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12648)) +- Fix archive takeout failing if total dump size exceeds 2GB ([scd31](https://github.com/mastodon/mastodon/pull/12602), [Gargron](https://github.com/mastodon/mastodon/pull/12653)) +- Fix custom emoji category creation silently erroring out on duplicate category ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12647)) +- Fix link crawler not specifying preferred content type ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12646)) +- Fix featured hashtag setting page erroring out instead of rejecting invalid tags ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12436)) +- Fix tooltip messages of single/multiple-choice polls switcher being reversed in web UI ([acid-chicken](https://github.com/mastodon/mastodon/pull/12616)) +- Fix typo in help text of `tootctl statuses remove` ([trwnh](https://github.com/mastodon/mastodon/pull/12603)) +- Fix generic HTTP 500 error on duplicate records ([Gargron](https://github.com/mastodon/mastodon/pull/12563)) +- Fix old migration failing with new status default scope ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12493)) +- Fix errors when using search API with no query ([Gargron](https://github.com/mastodon/mastodon/pull/12541), [trwnh](https://github.com/mastodon/mastodon/pull/12549)) +- Fix poll options not being selectable via keyboard in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12538)) +- Fix conversations not having an unread indicator in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12506)) +- Fix lost focus when modals open/close in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12437)) +- Fix pending upload count not being decremented on error in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12499)) +- Fix empty poll options not being removed on remote poll update ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12484)) +- Fix OCR with delete & redraft in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12465)) +- Fix blur behind closed registration message ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12442)) +- Fix OEmbed discovery not handling different URL variants in query ([Gargron](https://github.com/mastodon/mastodon/pull/12439)) +- Fix link crawler crashing on `` tags without `href` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12159)) +- Fix whitelisted subdomains being ignored in whitelist mode ([noiob](https://github.com/mastodon/mastodon/pull/12435)) +- Fix broken audit log in whitelist mode in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12303)) +- Fix unread indicator not honoring "Only media" option in local and federated timelines in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12330)) +- Fix error when rebuilding home feeds ([dariusk](https://github.com/mastodon/mastodon/pull/12324)) +- Fix relationship caches being broken as result of a follow request ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12299)) +- Fix more items than the limit being uploadable in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12300)) +- Fix various issues with account migration ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12301)) +- Fix filtered out items being counted as pending items in slow mode in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12266)) +- Fix notification filters not applying to poll options ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12269)) +- Fix notification message for user's own poll saying it's a poll they voted on in web UI ([ykzts](https://github.com/mastodon/mastodon/pull/12219)) +- Fix polls with an expiration not showing up as expired in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/12222)) +- Fix volume slider having an offset between cursor and slider in Chromium in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12158)) +- Fix Vagrant image not accepting connections ([shrft](https://github.com/mastodon/mastodon/pull/12180)) +- Fix batch actions being hidden on small screens in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12183)) +- Fix incoming federation not working in whitelist mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12185)) +- Fix error when passing empty `source` param to `PUT /api/v1/accounts/update_credentials` ([jglauche](https://github.com/mastodon/mastodon/pull/12259)) +- Fix HTTP-based streaming API being cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/12945)) +- Fix users being able to register while `tootctl self-destruct` is in progress ([Kjwon15](https://github.com/mastodon/mastodon/pull/12877)) +- Fix microformats detection in link crawler not ignoring `h-card` links ([nightpool](https://github.com/mastodon/mastodon/pull/12189)) +- Fix outline on full-screen video in web UI ([hinaloe](https://github.com/mastodon/mastodon/pull/12176)) +- Fix TLD domain blocks not being editable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12805)) +- Fix Nanobox deploy hooks ([danhunsaker](https://github.com/mastodon/mastodon/pull/12663)) +- Fix needlessly complicated SQL query when performing account search amongst followings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12302)) +- Fix favourites count not updating when unfavouriting in web UI ([NimaBoscarino](https://github.com/mastodon/mastodon/pull/12140)) +- Fix occasional crash on scroll in Chromium in web UI ([hinaloe](https://github.com/mastodon/mastodon/pull/12274)) +- Fix intersection observer not working in single-column mode web UI ([panarom](https://github.com/mastodon/mastodon/pull/12735)) +- Fix voting issue with remote polls that contain trailing spaces ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12515)) +- Fix dynamic elements not working in pgHero due to CSP rules ([ykzts](https://github.com/mastodon/mastodon/pull/12489)) +- Fix overly verbose backtraces when delivering ActivityPub payloads ([zunda](https://github.com/mastodon/mastodon/pull/12798)) +- Fix rendering `` without `href` when scheme unsupported ([Gargron](https://github.com/mastodon/mastodon/pull/13040)) +- Fix unfiltered params error when generating ActivityPub tag pagination ([Gargron](https://github.com/mastodon/mastodon/pull/13049)) +- Fix malformed HTML causing uncaught error ([Gargron](https://github.com/mastodon/mastodon/pull/13042)) +- Fix native share button not being displayed for unlisted toots ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13045)) +- Fix remote convertible media attachments (e.g. GIFs) not being saved ([Gargron](https://github.com/mastodon/mastodon/pull/13032)) +- Fix account query not using faster index ([abcang](https://github.com/mastodon/mastodon/pull/13016)) +- Fix error when sending moderation notification ([renatolond](https://github.com/mastodon/mastodon/pull/13014)) ### Security -- Fix OEmbed leaking information about existence of non-public statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/12930)) -- Fix password change/reset not immediately invalidating other sessions ([Gargron](https://github.com/tootsuite/mastodon/pull/12928)) -- Fix settings pages being cacheable by the browser ([Gargron](https://github.com/tootsuite/mastodon/pull/12714)) +- Fix OEmbed leaking information about existence of non-public statuses ([Gargron](https://github.com/mastodon/mastodon/pull/12930)) +- Fix password change/reset not immediately invalidating other sessions ([Gargron](https://github.com/mastodon/mastodon/pull/12928)) +- Fix settings pages being cacheable by the browser ([Gargron](https://github.com/mastodon/mastodon/pull/12714)) ## [3.0.1] - 2019-10-10 ### Added -- Add `tootctl media usage` command ([Gargron](https://github.com/tootsuite/mastodon/pull/12115)) -- Add admin setting to auto-approve trending hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/12122), [Gargron](https://github.com/tootsuite/mastodon/pull/12130)) +- Add `tootctl media usage` command ([Gargron](https://github.com/mastodon/mastodon/pull/12115)) +- Add admin setting to auto-approve trending hashtags ([Gargron](https://github.com/mastodon/mastodon/pull/12122), [Gargron](https://github.com/mastodon/mastodon/pull/12130)) ### Changed -- Change `tootctl media refresh` to skip already downloaded attachments ([Gargron](https://github.com/tootsuite/mastodon/pull/12118)) +- Change `tootctl media refresh` to skip already downloaded attachments ([Gargron](https://github.com/mastodon/mastodon/pull/12118)) ### Removed -- Remove auto-silence behaviour from spam check ([Gargron](https://github.com/tootsuite/mastodon/pull/12117)) -- Remove HTML `lang` attribute from individual statuses in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12124)) -- Remove fallback to long description on sidebar and meta description ([Gargron](https://github.com/tootsuite/mastodon/pull/12119)) +- Remove auto-silence behaviour from spam check ([Gargron](https://github.com/mastodon/mastodon/pull/12117)) +- Remove HTML `lang` attribute from individual statuses in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12124)) +- Remove fallback to long description on sidebar and meta description ([Gargron](https://github.com/mastodon/mastodon/pull/12119)) ### Fixed -- Fix preloaded JSON-LD context for identity not being used ([Gargron](https://github.com/tootsuite/mastodon/pull/12138)) -- Fix media editing modal changing dimensions once the image loads ([Gargron](https://github.com/tootsuite/mastodon/pull/12131)) -- Fix not showing whether a custom emoji has a local counterpart in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12135)) -- Fix attachment not being re-downloaded even if file is not stored ([Gargron](https://github.com/tootsuite/mastodon/pull/12125)) -- Fix old migration trying to use new column due to default status scope ([Gargron](https://github.com/tootsuite/mastodon/pull/12095)) -- Fix column back button missing for not found accounts ([trwnh](https://github.com/tootsuite/mastodon/pull/12094)) -- Fix issues with tootctl's parallelization and progress reporting ([Gargron](https://github.com/tootsuite/mastodon/pull/12093), [Gargron](https://github.com/tootsuite/mastodon/pull/12097)) -- Fix existing user records with now-renamed `pt` locale ([Gargron](https://github.com/tootsuite/mastodon/pull/12092)) -- Fix hashtag timeline REST API accepting too many hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/12091)) -- Fix `GET /api/v1/instance` REST APIs being unavailable in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12089)) -- Fix performance of home feed regeneration and merging ([Gargron](https://github.com/tootsuite/mastodon/pull/12084)) -- Fix ffmpeg performance issues due to stdout buffer overflow ([hugogameiro](https://github.com/tootsuite/mastodon/pull/12088)) -- Fix S3 adapter retrying failing uploads with exponential backoff ([Gargron](https://github.com/tootsuite/mastodon/pull/12085)) -- Fix `tootctl accounts cull` advertising unused option flag ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12074)) +- Fix preloaded JSON-LD context for identity not being used ([Gargron](https://github.com/mastodon/mastodon/pull/12138)) +- Fix media editing modal changing dimensions once the image loads ([Gargron](https://github.com/mastodon/mastodon/pull/12131)) +- Fix not showing whether a custom emoji has a local counterpart in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/12135)) +- Fix attachment not being re-downloaded even if file is not stored ([Gargron](https://github.com/mastodon/mastodon/pull/12125)) +- Fix old migration trying to use new column due to default status scope ([Gargron](https://github.com/mastodon/mastodon/pull/12095)) +- Fix column back button missing for not found accounts ([trwnh](https://github.com/mastodon/mastodon/pull/12094)) +- Fix issues with tootctl's parallelization and progress reporting ([Gargron](https://github.com/mastodon/mastodon/pull/12093), [Gargron](https://github.com/mastodon/mastodon/pull/12097)) +- Fix existing user records with now-renamed `pt` locale ([Gargron](https://github.com/mastodon/mastodon/pull/12092)) +- Fix hashtag timeline REST API accepting too many hashtags ([Gargron](https://github.com/mastodon/mastodon/pull/12091)) +- Fix `GET /api/v1/instance` REST APIs being unavailable in secure mode ([Gargron](https://github.com/mastodon/mastodon/pull/12089)) +- Fix performance of home feed regeneration and merging ([Gargron](https://github.com/mastodon/mastodon/pull/12084)) +- Fix ffmpeg performance issues due to stdout buffer overflow ([hugogameiro](https://github.com/mastodon/mastodon/pull/12088)) +- Fix S3 adapter retrying failing uploads with exponential backoff ([Gargron](https://github.com/mastodon/mastodon/pull/12085)) +- Fix `tootctl accounts cull` advertising unused option flag ([Kjwon15](https://github.com/mastodon/mastodon/pull/12074)) ## [3.0.0] - 2019-10-03 ### Added -- Add "not available" label to unloaded media attachments in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11715), [Gargron](https://github.com/tootsuite/mastodon/pull/11745)) -- **Add profile directory to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11688), [mayaeh](https://github.com/tootsuite/mastodon/pull/11872)) +- Add "not available" label to unloaded media attachments in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11715), [Gargron](https://github.com/mastodon/mastodon/pull/11745)) +- **Add profile directory to web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11688), [mayaeh](https://github.com/mastodon/mastodon/pull/11872)) - Add profile directory opt-in federation - Add profile directory REST API -- Add special alert for throttled requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11677)) -- Add confirmation modal when logging out from the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11671)) -- **Add audio player in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11644), [Gargron](https://github.com/tootsuite/mastodon/pull/11652), [Gargron](https://github.com/tootsuite/mastodon/pull/11654), [ThibG](https://github.com/tootsuite/mastodon/pull/11629), [Gargron](https://github.com/tootsuite/mastodon/pull/12056)) -- **Add autosuggestions for hashtags in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11422), [ThibG](https://github.com/tootsuite/mastodon/pull/11632), [Gargron](https://github.com/tootsuite/mastodon/pull/11764), [Gargron](https://github.com/tootsuite/mastodon/pull/11588), [Gargron](https://github.com/tootsuite/mastodon/pull/11442)) -- **Add media editing modal with OCR tool in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11563), [Gargron](https://github.com/tootsuite/mastodon/pull/11566), [ThibG](https://github.com/tootsuite/mastodon/pull/11575), [ThibG](https://github.com/tootsuite/mastodon/pull/11576), [Gargron](https://github.com/tootsuite/mastodon/pull/11577), [Gargron](https://github.com/tootsuite/mastodon/pull/11573), [Gargron](https://github.com/tootsuite/mastodon/pull/11571)) -- Add indicator of unread notifications to window title when web UI is out of focus ([Gargron](https://github.com/tootsuite/mastodon/pull/11560), [Gargron](https://github.com/tootsuite/mastodon/pull/11572)) -- Add indicator for which options you voted for in a poll in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11195)) -- **Add search results pagination to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11409), [ThibG](https://github.com/tootsuite/mastodon/pull/11447)) -- **Add option to disable real-time updates in web UI ("slow mode")** ([Gargron](https://github.com/tootsuite/mastodon/pull/9984), [ykzts](https://github.com/tootsuite/mastodon/pull/11880), [ThibG](https://github.com/tootsuite/mastodon/pull/11883), [Gargron](https://github.com/tootsuite/mastodon/pull/11898), [ThibG](https://github.com/tootsuite/mastodon/pull/11859)) -- Add option to disable blurhash previews in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11188)) -- Add native smooth scrolling when supported in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11207)) -- Add scrolling to the search bar on focus in web UI ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12032)) -- Add refresh button to list of rebloggers/favouriters in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12031)) -- Add error description and button to copy stack trace to web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12033)) -- Add search and sort functions to hashtag admin UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/11829), [Gargron](https://github.com/tootsuite/mastodon/pull/11897), [mayaeh](https://github.com/tootsuite/mastodon/pull/11875)) -- Add setting for default search engine indexing in admin UI ([brortao](https://github.com/tootsuite/mastodon/pull/11804)) -- Add account bio to account view in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11473)) -- **Add option to include reported statuses in warning e-mail from admin UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11639), [Gargron](https://github.com/tootsuite/mastodon/pull/11812), [Gargron](https://github.com/tootsuite/mastodon/pull/11741), [Gargron](https://github.com/tootsuite/mastodon/pull/11698), [mayaeh](https://github.com/tootsuite/mastodon/pull/11765)) -- Add number of pending accounts and pending hashtags to dashboard in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11514)) -- **Add account migration UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11846), [noellabo](https://github.com/tootsuite/mastodon/pull/11905), [noellabo](https://github.com/tootsuite/mastodon/pull/11907), [noellabo](https://github.com/tootsuite/mastodon/pull/11906), [noellabo](https://github.com/tootsuite/mastodon/pull/11902)) -- **Add table of contents to about page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11885), [ykzts](https://github.com/tootsuite/mastodon/pull/11941), [ykzts](https://github.com/tootsuite/mastodon/pull/11895), [Kjwon15](https://github.com/tootsuite/mastodon/pull/11916)) -- **Add password challenge to 2FA settings, e-mail notifications** ([Gargron](https://github.com/tootsuite/mastodon/pull/11878)) -- **Add optional public list of domain blocks with comments** ([ThibG](https://github.com/tootsuite/mastodon/pull/11298), [ThibG](https://github.com/tootsuite/mastodon/pull/11515), [Gargron](https://github.com/tootsuite/mastodon/pull/11908)) -- Add an RSS feed for featured hashtags ([noellabo](https://github.com/tootsuite/mastodon/pull/10502)) -- Add explanations to featured hashtags UI and profile ([Gargron](https://github.com/tootsuite/mastodon/pull/11586)) -- **Add hashtag trends with admin and user settings** ([Gargron](https://github.com/tootsuite/mastodon/pull/11490), [Gargron](https://github.com/tootsuite/mastodon/pull/11502), [Gargron](https://github.com/tootsuite/mastodon/pull/11641), [Gargron](https://github.com/tootsuite/mastodon/pull/11594), [Gargron](https://github.com/tootsuite/mastodon/pull/11517), [mayaeh](https://github.com/tootsuite/mastodon/pull/11845), [Gargron](https://github.com/tootsuite/mastodon/pull/11774), [Gargron](https://github.com/tootsuite/mastodon/pull/11712), [Gargron](https://github.com/tootsuite/mastodon/pull/11791), [Gargron](https://github.com/tootsuite/mastodon/pull/11743), [Gargron](https://github.com/tootsuite/mastodon/pull/11740), [Gargron](https://github.com/tootsuite/mastodon/pull/11714), [ThibG](https://github.com/tootsuite/mastodon/pull/11631), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/11569), [Gargron](https://github.com/tootsuite/mastodon/pull/11524), [Gargron](https://github.com/tootsuite/mastodon/pull/11513)) +- Add special alert for throttled requests in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11677)) +- Add confirmation modal when logging out from the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11671)) +- **Add audio player in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11644), [Gargron](https://github.com/mastodon/mastodon/pull/11652), [Gargron](https://github.com/mastodon/mastodon/pull/11654), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11629), [Gargron](https://github.com/mastodon/mastodon/pull/12056)) +- **Add autosuggestions for hashtags in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11422), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11632), [Gargron](https://github.com/mastodon/mastodon/pull/11764), [Gargron](https://github.com/mastodon/mastodon/pull/11588), [Gargron](https://github.com/mastodon/mastodon/pull/11442)) +- **Add media editing modal with OCR tool in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11563), [Gargron](https://github.com/mastodon/mastodon/pull/11566), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11575), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11576), [Gargron](https://github.com/mastodon/mastodon/pull/11577), [Gargron](https://github.com/mastodon/mastodon/pull/11573), [Gargron](https://github.com/mastodon/mastodon/pull/11571)) +- Add indicator of unread notifications to window title when web UI is out of focus ([Gargron](https://github.com/mastodon/mastodon/pull/11560), [Gargron](https://github.com/mastodon/mastodon/pull/11572)) +- Add indicator for which options you voted for in a poll in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11195)) +- **Add search results pagination to web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11447)) +- **Add option to disable real-time updates in web UI ("slow mode")** ([Gargron](https://github.com/mastodon/mastodon/pull/9984), [ykzts](https://github.com/mastodon/mastodon/pull/11880), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11883), [Gargron](https://github.com/mastodon/mastodon/pull/11898), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11859)) +- Add option to disable blurhash previews in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11188)) +- Add native smooth scrolling when supported in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11207)) +- Add scrolling to the search bar on focus in web UI ([Kjwon15](https://github.com/mastodon/mastodon/pull/12032)) +- Add refresh button to list of rebloggers/favouriters in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12031)) +- Add error description and button to copy stack trace to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/12033)) +- Add search and sort functions to hashtag admin UI ([mayaeh](https://github.com/mastodon/mastodon/pull/11829), [Gargron](https://github.com/mastodon/mastodon/pull/11897), [mayaeh](https://github.com/mastodon/mastodon/pull/11875)) +- Add setting for default search engine indexing in admin UI ([brortao](https://github.com/mastodon/mastodon/pull/11804)) +- Add account bio to account view in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11473)) +- **Add option to include reported statuses in warning e-mail from admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11639), [Gargron](https://github.com/mastodon/mastodon/pull/11812), [Gargron](https://github.com/mastodon/mastodon/pull/11741), [Gargron](https://github.com/mastodon/mastodon/pull/11698), [mayaeh](https://github.com/mastodon/mastodon/pull/11765)) +- Add number of pending accounts and pending hashtags to dashboard in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/11514)) +- **Add account migration UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11846), [noellabo](https://github.com/mastodon/mastodon/pull/11905), [noellabo](https://github.com/mastodon/mastodon/pull/11907), [noellabo](https://github.com/mastodon/mastodon/pull/11906), [noellabo](https://github.com/mastodon/mastodon/pull/11902)) +- **Add table of contents to about page** ([Gargron](https://github.com/mastodon/mastodon/pull/11885), [ykzts](https://github.com/mastodon/mastodon/pull/11941), [ykzts](https://github.com/mastodon/mastodon/pull/11895), [Kjwon15](https://github.com/mastodon/mastodon/pull/11916)) +- **Add password challenge to 2FA settings, e-mail notifications** ([Gargron](https://github.com/mastodon/mastodon/pull/11878)) +- **Add optional public list of domain blocks with comments** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11298), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11515), [Gargron](https://github.com/mastodon/mastodon/pull/11908)) +- Add an RSS feed for featured hashtags ([noellabo](https://github.com/mastodon/mastodon/pull/10502)) +- Add explanations to featured hashtags UI and profile ([Gargron](https://github.com/mastodon/mastodon/pull/11586)) +- **Add hashtag trends with admin and user settings** ([Gargron](https://github.com/mastodon/mastodon/pull/11490), [Gargron](https://github.com/mastodon/mastodon/pull/11502), [Gargron](https://github.com/mastodon/mastodon/pull/11641), [Gargron](https://github.com/mastodon/mastodon/pull/11594), [Gargron](https://github.com/mastodon/mastodon/pull/11517), [mayaeh](https://github.com/mastodon/mastodon/pull/11845), [Gargron](https://github.com/mastodon/mastodon/pull/11774), [Gargron](https://github.com/mastodon/mastodon/pull/11712), [Gargron](https://github.com/mastodon/mastodon/pull/11791), [Gargron](https://github.com/mastodon/mastodon/pull/11743), [Gargron](https://github.com/mastodon/mastodon/pull/11740), [Gargron](https://github.com/mastodon/mastodon/pull/11714), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11631), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/11569), [Gargron](https://github.com/mastodon/mastodon/pull/11524), [Gargron](https://github.com/mastodon/mastodon/pull/11513)) - Add hashtag usage breakdown to admin UI - Add batch actions for hashtags to admin UI - Add trends to web UI - Add trends to public pages - Add user preference to hide trends - Add admin setting to disable trends -- **Add categories for custom emojis** ([Gargron](https://github.com/tootsuite/mastodon/pull/11196), [Gargron](https://github.com/tootsuite/mastodon/pull/11793), [Gargron](https://github.com/tootsuite/mastodon/pull/11920), [highemerly](https://github.com/tootsuite/mastodon/pull/11876)) +- **Add categories for custom emojis** ([Gargron](https://github.com/mastodon/mastodon/pull/11196), [Gargron](https://github.com/mastodon/mastodon/pull/11793), [Gargron](https://github.com/mastodon/mastodon/pull/11920), [highemerly](https://github.com/mastodon/mastodon/pull/11876)) - Add custom emoji categories to emoji picker in web UI - Add `category` to custom emojis in REST API - Add batch actions for custom emojis in admin UI -- Add max image dimensions to error message ([raboof](https://github.com/tootsuite/mastodon/pull/11552)) -- Add aac, m4a, 3gp, amr, wma to allowed audio formats ([Gargron](https://github.com/tootsuite/mastodon/pull/11342), [umonaca](https://github.com/tootsuite/mastodon/pull/11687)) -- **Add search syntax for operators and phrases** ([Gargron](https://github.com/tootsuite/mastodon/pull/11411)) -- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/tootsuite/mastodon/pull/11778)) -- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/tootsuite/mastodon/pull/11762)) -- Add `exclude_unreviewed` param to `GET /api/v2/search` REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11977)) -- Add `reason` param to `POST /api/v1/accounts` REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/12064)) -- **Add ActivityPub secure mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11269), [ThibG](https://github.com/tootsuite/mastodon/pull/11332), [ThibG](https://github.com/tootsuite/mastodon/pull/11295)) -- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11284), [ThibG](https://github.com/tootsuite/mastodon/pull/11300)) -- Add support for ActivityPub Audio activities ([ThibG](https://github.com/tootsuite/mastodon/pull/11189)) -- Add ActivityPub actor representing the entire server ([ThibG](https://github.com/tootsuite/mastodon/pull/11321), [rtucker](https://github.com/tootsuite/mastodon/pull/11400), [ThibG](https://github.com/tootsuite/mastodon/pull/11561), [Gargron](https://github.com/tootsuite/mastodon/pull/11798)) -- **Add whitelist mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11291), [mayaeh](https://github.com/tootsuite/mastodon/pull/11634)) -- Add config of multipart threshold for S3 ([ykzts](https://github.com/tootsuite/mastodon/pull/11924), [ykzts](https://github.com/tootsuite/mastodon/pull/11944)) -- Add health check endpoint for web ([ykzts](https://github.com/tootsuite/mastodon/pull/11770), [ykzts](https://github.com/tootsuite/mastodon/pull/11947)) -- Add HTTP signature keyId to request log ([Gargron](https://github.com/tootsuite/mastodon/pull/11591)) -- Add `SMTP_REPLY_TO` environment variable ([hugogameiro](https://github.com/tootsuite/mastodon/pull/11718)) -- Add `tootctl preview_cards remove` command ([mayaeh](https://github.com/tootsuite/mastodon/pull/11320)) -- Add `tootctl media refresh` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11775)) -- Add `tootctl cache recount` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11597)) -- Add option to exclude suspended domains from `tootctl domains crawl` ([dariusk](https://github.com/tootsuite/mastodon/pull/11454)) -- Add parallelization to `tootctl search deploy` ([noellabo](https://github.com/tootsuite/mastodon/pull/12051)) -- Add soft delete for statuses for instant deletes through API ([Gargron](https://github.com/tootsuite/mastodon/pull/11623), [Gargron](https://github.com/tootsuite/mastodon/pull/11648)) -- Add rails-level JSON caching ([Gargron](https://github.com/tootsuite/mastodon/pull/11333), [Gargron](https://github.com/tootsuite/mastodon/pull/11271)) -- **Add request pool to improve delivery performance** ([Gargron](https://github.com/tootsuite/mastodon/pull/10353), [ykzts](https://github.com/tootsuite/mastodon/pull/11756)) -- Add concurrent connection attempts to resolved IP addresses ([ThibG](https://github.com/tootsuite/mastodon/pull/11757)) -- Add index for remember_token to improve login performance ([abcang](https://github.com/tootsuite/mastodon/pull/11881)) -- **Add more accurate hashtag search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11579), [Gargron](https://github.com/tootsuite/mastodon/pull/11427), [Gargron](https://github.com/tootsuite/mastodon/pull/11448)) -- **Add more accurate account search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11537), [Gargron](https://github.com/tootsuite/mastodon/pull/11580)) -- **Add a spam check** ([Gargron](https://github.com/tootsuite/mastodon/pull/11217), [Gargron](https://github.com/tootsuite/mastodon/pull/11806), [ThibG](https://github.com/tootsuite/mastodon/pull/11296)) -- Add new languages ([Gargron](https://github.com/tootsuite/mastodon/pull/12062)) +- Add max image dimensions to error message ([raboof](https://github.com/mastodon/mastodon/pull/11552)) +- Add aac, m4a, 3gp, amr, wma to allowed audio formats ([Gargron](https://github.com/mastodon/mastodon/pull/11342), [umonaca](https://github.com/mastodon/mastodon/pull/11687)) +- **Add search syntax for operators and phrases** ([Gargron](https://github.com/mastodon/mastodon/pull/11411)) +- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/mastodon/mastodon/pull/11778)) +- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/mastodon/mastodon/pull/11762)) +- Add `exclude_unreviewed` param to `GET /api/v2/search` REST API ([Gargron](https://github.com/mastodon/mastodon/pull/11977)) +- Add `reason` param to `POST /api/v1/accounts` REST API ([Gargron](https://github.com/mastodon/mastodon/pull/12064)) +- **Add ActivityPub secure mode** ([Gargron](https://github.com/mastodon/mastodon/pull/11269), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11332), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11295)) +- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/mastodon/mastodon/pull/11284), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11300)) +- Add support for ActivityPub Audio activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11189)) +- Add ActivityPub actor representing the entire server ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11321), [rtucker](https://github.com/mastodon/mastodon/pull/11400), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11561), [Gargron](https://github.com/mastodon/mastodon/pull/11798)) +- **Add whitelist mode** ([Gargron](https://github.com/mastodon/mastodon/pull/11291), [mayaeh](https://github.com/mastodon/mastodon/pull/11634)) +- Add config of multipart threshold for S3 ([ykzts](https://github.com/mastodon/mastodon/pull/11924), [ykzts](https://github.com/mastodon/mastodon/pull/11944)) +- Add health check endpoint for web ([ykzts](https://github.com/mastodon/mastodon/pull/11770), [ykzts](https://github.com/mastodon/mastodon/pull/11947)) +- Add HTTP signature keyId to request log ([Gargron](https://github.com/mastodon/mastodon/pull/11591)) +- Add `SMTP_REPLY_TO` environment variable ([hugogameiro](https://github.com/mastodon/mastodon/pull/11718)) +- Add `tootctl preview_cards remove` command ([mayaeh](https://github.com/mastodon/mastodon/pull/11320)) +- Add `tootctl media refresh` command ([Gargron](https://github.com/mastodon/mastodon/pull/11775)) +- Add `tootctl cache recount` command ([Gargron](https://github.com/mastodon/mastodon/pull/11597)) +- Add option to exclude suspended domains from `tootctl domains crawl` ([dariusk](https://github.com/mastodon/mastodon/pull/11454)) +- Add parallelization to `tootctl search deploy` ([noellabo](https://github.com/mastodon/mastodon/pull/12051)) +- Add soft delete for statuses for instant deletes through API ([Gargron](https://github.com/mastodon/mastodon/pull/11623), [Gargron](https://github.com/mastodon/mastodon/pull/11648)) +- Add rails-level JSON caching ([Gargron](https://github.com/mastodon/mastodon/pull/11333), [Gargron](https://github.com/mastodon/mastodon/pull/11271)) +- **Add request pool to improve delivery performance** ([Gargron](https://github.com/mastodon/mastodon/pull/10353), [ykzts](https://github.com/mastodon/mastodon/pull/11756)) +- Add concurrent connection attempts to resolved IP addresses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11757)) +- Add index for remember_token to improve login performance ([abcang](https://github.com/mastodon/mastodon/pull/11881)) +- **Add more accurate hashtag search** ([Gargron](https://github.com/mastodon/mastodon/pull/11579), [Gargron](https://github.com/mastodon/mastodon/pull/11427), [Gargron](https://github.com/mastodon/mastodon/pull/11448)) +- **Add more accurate account search** ([Gargron](https://github.com/mastodon/mastodon/pull/11537), [Gargron](https://github.com/mastodon/mastodon/pull/11580)) +- **Add a spam check** ([Gargron](https://github.com/mastodon/mastodon/pull/11217), [Gargron](https://github.com/mastodon/mastodon/pull/11806), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11296)) +- Add new languages ([Gargron](https://github.com/mastodon/mastodon/pull/12062)) - Breton - Spanish (Argentina) - Estonian - Macedonian - New Norwegian -- Add NodeInfo endpoint ([Gargron](https://github.com/tootsuite/mastodon/pull/12002), [Gargron](https://github.com/tootsuite/mastodon/pull/12058)) +- Add NodeInfo endpoint ([Gargron](https://github.com/mastodon/mastodon/pull/12002), [Gargron](https://github.com/mastodon/mastodon/pull/12058)) ### Changed -- **Change conversations UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11896)) -- Change dashboard to short number notation ([noellabo](https://github.com/tootsuite/mastodon/pull/11847), [noellabo](https://github.com/tootsuite/mastodon/pull/11911)) -- Change REST API `GET /api/v1/timelines/public` to require authentication when public preview is off ([ThibG](https://github.com/tootsuite/mastodon/pull/11802)) -- Change REST API `POST /api/v1/follow_requests/:id/(approve|reject)` to return relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/11800)) -- Change rate limit for media proxy ([ykzts](https://github.com/tootsuite/mastodon/pull/11814)) -- Change unlisted custom emoji to not appear in autosuggestions ([Gargron](https://github.com/tootsuite/mastodon/pull/11818)) -- Change max length of media descriptions from 420 to 1500 characters ([Gargron](https://github.com/tootsuite/mastodon/pull/11819), [ThibG](https://github.com/tootsuite/mastodon/pull/11836)) -- **Change deletes to preserve soft-deleted statuses in unresolved reports** ([Gargron](https://github.com/tootsuite/mastodon/pull/11805)) -- **Change tootctl to use inline parallelization instead of Sidekiq** ([Gargron](https://github.com/tootsuite/mastodon/pull/11776)) -- **Change account deletion page to have better explanations** ([Gargron](https://github.com/tootsuite/mastodon/pull/11753), [Gargron](https://github.com/tootsuite/mastodon/pull/11763)) -- Change hashtag component in web UI to show numbers for 2 last days ([Gargron](https://github.com/tootsuite/mastodon/pull/11742), [Gargron](https://github.com/tootsuite/mastodon/pull/11755), [Gargron](https://github.com/tootsuite/mastodon/pull/11754)) -- Change OpenGraph description on sign-up page to reflect invite ([Gargron](https://github.com/tootsuite/mastodon/pull/11744)) -- Change layout of public profile directory to be the same as in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11705)) -- Change detailed status child ordering to sort self-replies on top ([ThibG](https://github.com/tootsuite/mastodon/pull/11686)) -- Change window resize handler to switch to/from mobile layout as soon as needed ([ThibG](https://github.com/tootsuite/mastodon/pull/11656)) -- Change icon button styles to make hover/focus states more obvious ([ThibG](https://github.com/tootsuite/mastodon/pull/11474)) -- Change contrast of status links that are not mentions or hashtags ([ThibG](https://github.com/tootsuite/mastodon/pull/11406)) -- **Change hashtags to preserve first-used casing** ([Gargron](https://github.com/tootsuite/mastodon/pull/11416), [Gargron](https://github.com/tootsuite/mastodon/pull/11508), [Gargron](https://github.com/tootsuite/mastodon/pull/11504), [Gargron](https://github.com/tootsuite/mastodon/pull/11507), [Gargron](https://github.com/tootsuite/mastodon/pull/11441)) -- **Change unconfirmed user login behaviour** ([Gargron](https://github.com/tootsuite/mastodon/pull/11375), [ThibG](https://github.com/tootsuite/mastodon/pull/11394), [Gargron](https://github.com/tootsuite/mastodon/pull/11860)) -- **Change single-column mode to scroll the whole page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11359), [Gargron](https://github.com/tootsuite/mastodon/pull/11894), [Gargron](https://github.com/tootsuite/mastodon/pull/11891), [ThibG](https://github.com/tootsuite/mastodon/pull/11655), [Gargron](https://github.com/tootsuite/mastodon/pull/11463), [Gargron](https://github.com/tootsuite/mastodon/pull/11458), [ThibG](https://github.com/tootsuite/mastodon/pull/11395), [Gargron](https://github.com/tootsuite/mastodon/pull/11418)) -- Change `tootctl accounts follow` to only work with local accounts ([angristan](https://github.com/tootsuite/mastodon/pull/11592)) -- Change Dockerfile ([Shleeble](https://github.com/tootsuite/mastodon/pull/11710), [ykzts](https://github.com/tootsuite/mastodon/pull/11768), [Shleeble](https://github.com/tootsuite/mastodon/pull/11707)) -- Change supported Node versions to include v12 ([abcang](https://github.com/tootsuite/mastodon/pull/11706)) -- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/tootsuite/mastodon/pull/11820)) -- Change domain block silence to always require approval on follow ([ThibG](https://github.com/tootsuite/mastodon/pull/11975)) -- Change link preview fetcher to not perform a HEAD request first ([Gargron](https://github.com/tootsuite/mastodon/pull/12028)) -- Change `tootctl domains purge` to accept multiple domains at once ([Gargron](https://github.com/tootsuite/mastodon/pull/12046)) +- **Change conversations UI** ([Gargron](https://github.com/mastodon/mastodon/pull/11896)) +- Change dashboard to short number notation ([noellabo](https://github.com/mastodon/mastodon/pull/11847), [noellabo](https://github.com/mastodon/mastodon/pull/11911)) +- Change REST API `GET /api/v1/timelines/public` to require authentication when public preview is off ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11802)) +- Change REST API `POST /api/v1/follow_requests/:id/(approve|reject)` to return relationship ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11800)) +- Change rate limit for media proxy ([ykzts](https://github.com/mastodon/mastodon/pull/11814)) +- Change unlisted custom emoji to not appear in autosuggestions ([Gargron](https://github.com/mastodon/mastodon/pull/11818)) +- Change max length of media descriptions from 420 to 1500 characters ([Gargron](https://github.com/mastodon/mastodon/pull/11819), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11836)) +- **Change deletes to preserve soft-deleted statuses in unresolved reports** ([Gargron](https://github.com/mastodon/mastodon/pull/11805)) +- **Change tootctl to use inline parallelization instead of Sidekiq** ([Gargron](https://github.com/mastodon/mastodon/pull/11776)) +- **Change account deletion page to have better explanations** ([Gargron](https://github.com/mastodon/mastodon/pull/11753), [Gargron](https://github.com/mastodon/mastodon/pull/11763)) +- Change hashtag component in web UI to show numbers for 2 last days ([Gargron](https://github.com/mastodon/mastodon/pull/11742), [Gargron](https://github.com/mastodon/mastodon/pull/11755), [Gargron](https://github.com/mastodon/mastodon/pull/11754)) +- Change OpenGraph description on sign-up page to reflect invite ([Gargron](https://github.com/mastodon/mastodon/pull/11744)) +- Change layout of public profile directory to be the same as in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11705)) +- Change detailed status child ordering to sort self-replies on top ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11686)) +- Change window resize handler to switch to/from mobile layout as soon as needed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11656)) +- Change icon button styles to make hover/focus states more obvious ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11474)) +- Change contrast of status links that are not mentions or hashtags ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11406)) +- **Change hashtags to preserve first-used casing** ([Gargron](https://github.com/mastodon/mastodon/pull/11416), [Gargron](https://github.com/mastodon/mastodon/pull/11508), [Gargron](https://github.com/mastodon/mastodon/pull/11504), [Gargron](https://github.com/mastodon/mastodon/pull/11507), [Gargron](https://github.com/mastodon/mastodon/pull/11441)) +- **Change unconfirmed user login behaviour** ([Gargron](https://github.com/mastodon/mastodon/pull/11375), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11394), [Gargron](https://github.com/mastodon/mastodon/pull/11860)) +- **Change single-column mode to scroll the whole page** ([Gargron](https://github.com/mastodon/mastodon/pull/11359), [Gargron](https://github.com/mastodon/mastodon/pull/11894), [Gargron](https://github.com/mastodon/mastodon/pull/11891), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11655), [Gargron](https://github.com/mastodon/mastodon/pull/11463), [Gargron](https://github.com/mastodon/mastodon/pull/11458), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11395), [Gargron](https://github.com/mastodon/mastodon/pull/11418)) +- Change `tootctl accounts follow` to only work with local accounts ([angristan](https://github.com/mastodon/mastodon/pull/11592)) +- Change Dockerfile ([Shleeble](https://github.com/mastodon/mastodon/pull/11710), [ykzts](https://github.com/mastodon/mastodon/pull/11768), [Shleeble](https://github.com/mastodon/mastodon/pull/11707)) +- Change supported Node versions to include v12 ([abcang](https://github.com/mastodon/mastodon/pull/11706)) +- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/mastodon/mastodon/pull/11820)) +- Change domain block silence to always require approval on follow ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11975)) +- Change link preview fetcher to not perform a HEAD request first ([Gargron](https://github.com/mastodon/mastodon/pull/12028)) +- Change `tootctl domains purge` to accept multiple domains at once ([Gargron](https://github.com/mastodon/mastodon/pull/12046)) ### Removed -- **Remove OStatus support** ([Gargron](https://github.com/tootsuite/mastodon/pull/11205), [Gargron](https://github.com/tootsuite/mastodon/pull/11303), [Gargron](https://github.com/tootsuite/mastodon/pull/11460), [ThibG](https://github.com/tootsuite/mastodon/pull/11280), [ThibG](https://github.com/tootsuite/mastodon/pull/11278)) -- Remove Atom feeds and old URLs in the form of `GET /:username/updates/:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11247)) -- Remove WebP support ([angristan](https://github.com/tootsuite/mastodon/pull/11589)) -- Remove deprecated config options from Heroku and Scalingo ([ykzts](https://github.com/tootsuite/mastodon/pull/11925)) -- Remove deprecated REST API `GET /api/v1/search` API ([Gargron](https://github.com/tootsuite/mastodon/pull/11823)) -- Remove deprecated REST API `GET /api/v1/statuses/:id/card` ([Gargron](https://github.com/tootsuite/mastodon/pull/11213)) -- Remove deprecated REST API `POST /api/v1/notifications/dismiss?id=:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11214)) -- Remove deprecated REST API `GET /api/v1/timelines/direct` ([Gargron](https://github.com/tootsuite/mastodon/pull/11212)) +- **Remove OStatus support** ([Gargron](https://github.com/mastodon/mastodon/pull/11205), [Gargron](https://github.com/mastodon/mastodon/pull/11303), [Gargron](https://github.com/mastodon/mastodon/pull/11460), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11280), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11278)) +- Remove Atom feeds and old URLs in the form of `GET /:username/updates/:id` ([Gargron](https://github.com/mastodon/mastodon/pull/11247)) +- Remove WebP support ([angristan](https://github.com/mastodon/mastodon/pull/11589)) +- Remove deprecated config options from Heroku and Scalingo ([ykzts](https://github.com/mastodon/mastodon/pull/11925)) +- Remove deprecated REST API `GET /api/v1/search` API ([Gargron](https://github.com/mastodon/mastodon/pull/11823)) +- Remove deprecated REST API `GET /api/v1/statuses/:id/card` ([Gargron](https://github.com/mastodon/mastodon/pull/11213)) +- Remove deprecated REST API `POST /api/v1/notifications/dismiss?id=:id` ([Gargron](https://github.com/mastodon/mastodon/pull/11214)) +- Remove deprecated REST API `GET /api/v1/timelines/direct` ([Gargron](https://github.com/mastodon/mastodon/pull/11212)) ### Fixed -- Fix manifest warning ([ykzts](https://github.com/tootsuite/mastodon/pull/11767)) -- Fix admin UI for custom emoji not respecting GIF autoplay preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11801)) -- Fix page body not being scrollable in admin/settings layout ([Gargron](https://github.com/tootsuite/mastodon/pull/11893)) -- Fix placeholder colors for inputs not being explicitly defined ([Gargron](https://github.com/tootsuite/mastodon/pull/11890)) -- Fix incorrect enclosure length in RSS ([tsia](https://github.com/tootsuite/mastodon/pull/11889)) -- Fix TOTP codes not being filtered from logs during enabling/disabling ([Gargron](https://github.com/tootsuite/mastodon/pull/11877)) -- Fix webfinger response not returning 410 when account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11869)) -- Fix ActivityPub Move handler queuing jobs that will fail if account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11864)) -- Fix SSO login not using existing account when e-mail is verified ([Gargron](https://github.com/tootsuite/mastodon/pull/11862)) -- Fix web UI allowing uploads past status limit via drag & drop ([Gargron](https://github.com/tootsuite/mastodon/pull/11863)) -- Fix expiring polls not being displayed as such in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11835)) -- Fix 2FA challenge and password challenge for non-database users ([Gargron](https://github.com/tootsuite/mastodon/pull/11831), [Gargron](https://github.com/tootsuite/mastodon/pull/11943)) -- Fix profile fields overflowing page width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11828)) -- Fix web push subscriptions being deleted on rate limit or timeout ([Gargron](https://github.com/tootsuite/mastodon/pull/11826)) -- Fix display of long poll options in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11717), [ThibG](https://github.com/tootsuite/mastodon/pull/11833)) -- Fix search API not resolving URL when `type` is given ([Gargron](https://github.com/tootsuite/mastodon/pull/11822)) -- Fix hashtags being split by ZWNJ character ([Gargron](https://github.com/tootsuite/mastodon/pull/11821)) -- Fix scroll position resetting when opening media modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11815)) -- Fix duplicate HTML IDs on about page ([ThibG](https://github.com/tootsuite/mastodon/pull/11803)) -- Fix admin UI showing superfluous reject media/reports on suspended domain blocks ([ThibG](https://github.com/tootsuite/mastodon/pull/11749)) -- Fix ActivityPub context not being dynamically computed ([ThibG](https://github.com/tootsuite/mastodon/pull/11746)) -- Fix Mastodon logo style on hover on public pages' footer ([ThibG](https://github.com/tootsuite/mastodon/pull/11735)) -- Fix height of dashboard counters ([ThibG](https://github.com/tootsuite/mastodon/pull/11736)) -- Fix custom emoji animation on hover in web UI directory bios ([ThibG](https://github.com/tootsuite/mastodon/pull/11716)) -- Fix non-numbers being passed to Redis and causing an error ([Gargron](https://github.com/tootsuite/mastodon/pull/11697)) -- Fix error in REST API for an account's statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/11700)) -- Fix uncaught error when resource param is missing in Webfinger request ([Gargron](https://github.com/tootsuite/mastodon/pull/11701)) -- Fix uncaught domain normalization error in remote follow ([Gargron](https://github.com/tootsuite/mastodon/pull/11703)) -- Fix uncaught 422 and 500 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11590), [Gargron](https://github.com/tootsuite/mastodon/pull/11811)) -- Fix uncaught parameter missing exceptions and missing error templates ([Gargron](https://github.com/tootsuite/mastodon/pull/11702)) -- Fix encoding error when checking e-mail MX records ([Gargron](https://github.com/tootsuite/mastodon/pull/11696)) -- Fix items in StatusContent render list not all having a key ([ThibG](https://github.com/tootsuite/mastodon/pull/11645)) -- Fix remote and staff-removed statuses leaving media behind for a day ([Gargron](https://github.com/tootsuite/mastodon/pull/11638)) -- Fix CSP needlessly allowing blob URLs in script-src ([ThibG](https://github.com/tootsuite/mastodon/pull/11620)) -- Fix ignoring whole status because of one invalid hashtag ([Gargron](https://github.com/tootsuite/mastodon/pull/11621)) -- Fix hidden statuses losing focus ([ThibG](https://github.com/tootsuite/mastodon/pull/11208)) -- Fix loading bar being obscured by other elements in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11598)) -- Fix multiple issues with replies collection for pages further than self-replies ([ThibG](https://github.com/tootsuite/mastodon/pull/11582)) -- Fix blurhash and autoplay not working on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11585)) -- Fix 422 being returned instead of 404 when POSTing to unmatched routes ([Gargron](https://github.com/tootsuite/mastodon/pull/11574), [Gargron](https://github.com/tootsuite/mastodon/pull/11704)) -- Fix client-side resizing of image uploads ([ThibG](https://github.com/tootsuite/mastodon/pull/11570)) -- Fix short number formatting for numbers above million in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11559)) -- Fix ActivityPub and REST API queries setting cookies and preventing caching ([ThibG](https://github.com/tootsuite/mastodon/pull/11539), [ThibG](https://github.com/tootsuite/mastodon/pull/11557), [ThibG](https://github.com/tootsuite/mastodon/pull/11336), [ThibG](https://github.com/tootsuite/mastodon/pull/11331)) -- Fix some emojis in profile metadata labels are not emojified. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/11534)) -- Fix account search always returning exact match on paginated results ([Gargron](https://github.com/tootsuite/mastodon/pull/11525)) -- Fix acct URIs with IDN domains not being resolved ([Gargron](https://github.com/tootsuite/mastodon/pull/11520)) -- Fix admin dashboard missing latest features ([Gargron](https://github.com/tootsuite/mastodon/pull/11505)) -- Fix jumping of toot date when clicking spoiler button ([ariasuni](https://github.com/tootsuite/mastodon/pull/11449)) -- Fix boost to original audience not working on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11371)) -- Fix handling of webfinger redirects in ResolveAccountService ([ThibG](https://github.com/tootsuite/mastodon/pull/11279)) -- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/tootsuite/mastodon/pull/11231)) -- Fix support for HTTP proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/11245)) -- Fix HTTP requests to IPv6 hosts ([ThibG](https://github.com/tootsuite/mastodon/pull/11240)) -- Fix error in ElasticSearch index import ([mayaeh](https://github.com/tootsuite/mastodon/pull/11192)) -- Fix duplicate account error when seeding development database ([ysksn](https://github.com/tootsuite/mastodon/pull/11366)) -- Fix performance of session clean-up scheduler ([abcang](https://github.com/tootsuite/mastodon/pull/11871)) -- Fix older migrations not running ([zunda](https://github.com/tootsuite/mastodon/pull/11377)) -- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/tootsuite/mastodon/pull/11759)) -- Fix unnecessary status re-rendering in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11211)) -- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/tootsuite/mastodon/pull/11444)) -- Fix muted text color not applying to all text ([trwnh](https://github.com/tootsuite/mastodon/pull/11996)) -- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11986)) -- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/tootsuite/mastodon/pull/12004)) -- Fix records not being indexed into ElasticSearch sometimes ([Gargron](https://github.com/tootsuite/mastodon/pull/12024)) -- Fix needlessly indexing unsearchable statuses into ElasticSearch ([Gargron](https://github.com/tootsuite/mastodon/pull/12041)) -- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ThibG](https://github.com/tootsuite/mastodon/pull/12037)) -- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/tootsuite/mastodon/pull/12048)) -- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/tootsuite/mastodon/pull/12045)) +- Fix manifest warning ([ykzts](https://github.com/mastodon/mastodon/pull/11767)) +- Fix admin UI for custom emoji not respecting GIF autoplay preference ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11801)) +- Fix page body not being scrollable in admin/settings layout ([Gargron](https://github.com/mastodon/mastodon/pull/11893)) +- Fix placeholder colors for inputs not being explicitly defined ([Gargron](https://github.com/mastodon/mastodon/pull/11890)) +- Fix incorrect enclosure length in RSS ([tsia](https://github.com/mastodon/mastodon/pull/11889)) +- Fix TOTP codes not being filtered from logs during enabling/disabling ([Gargron](https://github.com/mastodon/mastodon/pull/11877)) +- Fix webfinger response not returning 410 when account is suspended ([Gargron](https://github.com/mastodon/mastodon/pull/11869)) +- Fix ActivityPub Move handler queuing jobs that will fail if account is suspended ([Gargron](https://github.com/mastodon/mastodon/pull/11864)) +- Fix SSO login not using existing account when e-mail is verified ([Gargron](https://github.com/mastodon/mastodon/pull/11862)) +- Fix web UI allowing uploads past status limit via drag & drop ([Gargron](https://github.com/mastodon/mastodon/pull/11863)) +- Fix expiring polls not being displayed as such in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11835)) +- Fix 2FA challenge and password challenge for non-database users ([Gargron](https://github.com/mastodon/mastodon/pull/11831), [Gargron](https://github.com/mastodon/mastodon/pull/11943)) +- Fix profile fields overflowing page width in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11828)) +- Fix web push subscriptions being deleted on rate limit or timeout ([Gargron](https://github.com/mastodon/mastodon/pull/11826)) +- Fix display of long poll options in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11717), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11833)) +- Fix search API not resolving URL when `type` is given ([Gargron](https://github.com/mastodon/mastodon/pull/11822)) +- Fix hashtags being split by ZWNJ character ([Gargron](https://github.com/mastodon/mastodon/pull/11821)) +- Fix scroll position resetting when opening media modals in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11815)) +- Fix duplicate HTML IDs on about page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11803)) +- Fix admin UI showing superfluous reject media/reports on suspended domain blocks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11749)) +- Fix ActivityPub context not being dynamically computed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11746)) +- Fix Mastodon logo style on hover on public pages' footer ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11735)) +- Fix height of dashboard counters ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11736)) +- Fix custom emoji animation on hover in web UI directory bios ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11716)) +- Fix non-numbers being passed to Redis and causing an error ([Gargron](https://github.com/mastodon/mastodon/pull/11697)) +- Fix error in REST API for an account's statuses ([Gargron](https://github.com/mastodon/mastodon/pull/11700)) +- Fix uncaught error when resource param is missing in Webfinger request ([Gargron](https://github.com/mastodon/mastodon/pull/11701)) +- Fix uncaught domain normalization error in remote follow ([Gargron](https://github.com/mastodon/mastodon/pull/11703)) +- Fix uncaught 422 and 500 errors ([Gargron](https://github.com/mastodon/mastodon/pull/11590), [Gargron](https://github.com/mastodon/mastodon/pull/11811)) +- Fix uncaught parameter missing exceptions and missing error templates ([Gargron](https://github.com/mastodon/mastodon/pull/11702)) +- Fix encoding error when checking e-mail MX records ([Gargron](https://github.com/mastodon/mastodon/pull/11696)) +- Fix items in StatusContent render list not all having a key ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11645)) +- Fix remote and staff-removed statuses leaving media behind for a day ([Gargron](https://github.com/mastodon/mastodon/pull/11638)) +- Fix CSP needlessly allowing blob URLs in script-src ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11620)) +- Fix ignoring whole status because of one invalid hashtag ([Gargron](https://github.com/mastodon/mastodon/pull/11621)) +- Fix hidden statuses losing focus ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11208)) +- Fix loading bar being obscured by other elements in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11598)) +- Fix multiple issues with replies collection for pages further than self-replies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11582)) +- Fix blurhash and autoplay not working on public pages ([Gargron](https://github.com/mastodon/mastodon/pull/11585)) +- Fix 422 being returned instead of 404 when POSTing to unmatched routes ([Gargron](https://github.com/mastodon/mastodon/pull/11574), [Gargron](https://github.com/mastodon/mastodon/pull/11704)) +- Fix client-side resizing of image uploads ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11570)) +- Fix short number formatting for numbers above million in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11559)) +- Fix ActivityPub and REST API queries setting cookies and preventing caching ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11539), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11557), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11336), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11331)) +- Fix some emojis in profile metadata labels are not emojified. ([kedamaDQ](https://github.com/mastodon/mastodon/pull/11534)) +- Fix account search always returning exact match on paginated results ([Gargron](https://github.com/mastodon/mastodon/pull/11525)) +- Fix acct URIs with IDN domains not being resolved ([Gargron](https://github.com/mastodon/mastodon/pull/11520)) +- Fix admin dashboard missing latest features ([Gargron](https://github.com/mastodon/mastodon/pull/11505)) +- Fix jumping of toot date when clicking spoiler button ([ariasuni](https://github.com/mastodon/mastodon/pull/11449)) +- Fix boost to original audience not working on mobile in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11371)) +- Fix handling of webfinger redirects in ResolveAccountService ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11279)) +- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/mastodon/mastodon/pull/11231)) +- Fix support for HTTP proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11245)) +- Fix HTTP requests to IPv6 hosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11240)) +- Fix error in ElasticSearch index import ([mayaeh](https://github.com/mastodon/mastodon/pull/11192)) +- Fix duplicate account error when seeding development database ([ysksn](https://github.com/mastodon/mastodon/pull/11366)) +- Fix performance of session clean-up scheduler ([abcang](https://github.com/mastodon/mastodon/pull/11871)) +- Fix older migrations not running ([zunda](https://github.com/mastodon/mastodon/pull/11377)) +- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/mastodon/mastodon/pull/11759)) +- Fix unnecessary status re-rendering in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11211)) +- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/mastodon/mastodon/pull/11444)) +- Fix muted text color not applying to all text ([trwnh](https://github.com/mastodon/mastodon/pull/11996)) +- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11986)) +- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/mastodon/mastodon/pull/12004)) +- Fix records not being indexed into ElasticSearch sometimes ([Gargron](https://github.com/mastodon/mastodon/pull/12024)) +- Fix needlessly indexing unsearchable statuses into ElasticSearch ([Gargron](https://github.com/mastodon/mastodon/pull/12041)) +- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12037)) +- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/mastodon/mastodon/pull/12048)) +- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/mastodon/mastodon/pull/12045)) ### Security -- Fix performance of GIF re-encoding and always strip EXIF data from videos ([Gargron](https://github.com/tootsuite/mastodon/pull/12057)) +- Fix performance of GIF re-encoding and always strip EXIF data from videos ([Gargron](https://github.com/mastodon/mastodon/pull/12057)) ## [2.9.3] - 2019-08-10 ### Added -- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/tootsuite/mastodon/pull/11519)) -- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11353)) -- Add indication that text search is unavailable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11112), [ThibG](https://github.com/tootsuite/mastodon/pull/11202)) -- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/tootsuite/mastodon/pull/11407)) -- Add on-hover animation to animated custom emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11348), [ThibG](https://github.com/tootsuite/mastodon/pull/11404), [ThibG](https://github.com/tootsuite/mastodon/pull/11522)) -- Add custom emoji support in profile metadata labels ([ThibG](https://github.com/tootsuite/mastodon/pull/11350)) +- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/mastodon/mastodon/pull/11519)) +- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/11353)) +- Add indication that text search is unavailable in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11112), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11202)) +- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/mastodon/mastodon/pull/11407)) +- Add on-hover animation to animated custom emoji in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11348), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11404), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11522)) +- Add custom emoji support in profile metadata labels ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11350)) ### Changed -- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/tootsuite/mastodon/pull/11302), [zunda](https://github.com/tootsuite/mastodon/pull/11378), [Gargron](https://github.com/tootsuite/mastodon/pull/11351), [zunda](https://github.com/tootsuite/mastodon/pull/11326)) -- Change the retry limit of web push notifications ([highemerly](https://github.com/tootsuite/mastodon/pull/11292)) -- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11233)) -- Change language detection to include hashtags as words ([Gargron](https://github.com/tootsuite/mastodon/pull/11341)) -- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/tootsuite/mastodon/pull/11334)) -- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11421)) +- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/mastodon/mastodon/pull/11302), [zunda](https://github.com/mastodon/mastodon/pull/11378), [Gargron](https://github.com/mastodon/mastodon/pull/11351), [zunda](https://github.com/mastodon/mastodon/pull/11326)) +- Change the retry limit of web push notifications ([highemerly](https://github.com/mastodon/mastodon/pull/11292)) +- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/mastodon/mastodon/pull/11233)) +- Change language detection to include hashtags as words ([Gargron](https://github.com/mastodon/mastodon/pull/11341)) +- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/mastodon/mastodon/pull/11334)) +- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/mastodon/mastodon/pull/11421)) ### Fixed -- Fix account domain block not clearing out notifications ([Gargron](https://github.com/tootsuite/mastodon/pull/11393)) -- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/tootsuite/mastodon/pull/8657)) -- Fix crash when saving invalid domain name ([Gargron](https://github.com/tootsuite/mastodon/pull/11528)) -- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/tootsuite/mastodon/pull/11526)) -- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11521)) -- Fix image uploads being blank when canvas read access is blocked ([ThibG](https://github.com/tootsuite/mastodon/pull/11499)) -- Fix avatars not being animated on hover when not logged in ([ThibG](https://github.com/tootsuite/mastodon/pull/11349)) -- Fix overzealous sanitization of HTML lists ([ThibG](https://github.com/tootsuite/mastodon/pull/11354)) -- Fix block crashing when a follow request exists ([ThibG](https://github.com/tootsuite/mastodon/pull/11288)) -- Fix backup service crashing when an attachment is missing ([ThibG](https://github.com/tootsuite/mastodon/pull/11241)) -- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/tootsuite/mastodon/pull/11242)) -- Fix swiping columns on mobile sometimes failing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11200)) -- Fix wrong actor URI being serialized into poll updates ([ThibG](https://github.com/tootsuite/mastodon/pull/11194)) -- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/tootsuite/mastodon/pull/11230)) -- Fix expiration date of filters being set to "never" when editing them ([ThibG](https://github.com/tootsuite/mastodon/pull/11204)) -- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/tootsuite/mastodon/pull/11210)) -- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11343)) -- Fix some notices staying on unrelated pages ([ThibG](https://github.com/tootsuite/mastodon/pull/11364)) -- Fix unboosting sometimes preventing a boost from reappearing on feed ([ThibG](https://github.com/tootsuite/mastodon/pull/11405), [Gargron](https://github.com/tootsuite/mastodon/pull/11450)) -- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/11345), [ThibG](https://github.com/tootsuite/mastodon/pull/11363)) -- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11179)) -- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11477)) -- Fix privacy dropdown active state when dropdown is placed on top of it ([ThibG](https://github.com/tootsuite/mastodon/pull/11495)) -- Fix filters not being applied to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/11174)) -- Fix keyboard navigation on various dropdowns ([ThibG](https://github.com/tootsuite/mastodon/pull/11511), [ThibG](https://github.com/tootsuite/mastodon/pull/11492), [ThibG](https://github.com/tootsuite/mastodon/pull/11491)) -- Fix keyboard navigation in modals ([ThibG](https://github.com/tootsuite/mastodon/pull/11493)) -- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/tootsuite/mastodon/pull/11408)) -- Fix web UI performance ([ThibG](https://github.com/tootsuite/mastodon/pull/11211), [ThibG](https://github.com/tootsuite/mastodon/pull/11234)) -- Fix scrolling to compose form when not necessary in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11246), [ThibG](https://github.com/tootsuite/mastodon/pull/11182)) -- Fix save button being enabled when list title is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11475)) -- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11203)) -- Fix content warning sometimes being set when not requested in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11206)) +- Fix account domain block not clearing out notifications ([Gargron](https://github.com/mastodon/mastodon/pull/11393)) +- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/mastodon/mastodon/pull/8657)) +- Fix crash when saving invalid domain name ([Gargron](https://github.com/mastodon/mastodon/pull/11528)) +- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/mastodon/mastodon/pull/11526)) +- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11521)) +- Fix image uploads being blank when canvas read access is blocked ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11499)) +- Fix avatars not being animated on hover when not logged in ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11349)) +- Fix overzealous sanitization of HTML lists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11354)) +- Fix block crashing when a follow request exists ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11288)) +- Fix backup service crashing when an attachment is missing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11241)) +- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/mastodon/mastodon/pull/11242)) +- Fix swiping columns on mobile sometimes failing in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11200)) +- Fix wrong actor URI being serialized into poll updates ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11194)) +- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/mastodon/mastodon/pull/11230)) +- Fix expiration date of filters being set to "never" when editing them ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11204)) +- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/mastodon/mastodon/pull/11210)) +- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/11343)) +- Fix some notices staying on unrelated pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11364)) +- Fix unboosting sometimes preventing a boost from reappearing on feed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11405), [Gargron](https://github.com/mastodon/mastodon/pull/11450)) +- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/mastodon/mastodon/pull/11345), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11363)) +- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/mastodon/mastodon/pull/11179)) +- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/mastodon/mastodon/pull/11477)) +- Fix privacy dropdown active state when dropdown is placed on top of it ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11495)) +- Fix filters not being applied to poll options ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11174)) +- Fix keyboard navigation on various dropdowns ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11511), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11492), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11491)) +- Fix keyboard navigation in modals ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11493)) +- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/mastodon/mastodon/pull/11408)) +- Fix web UI performance ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11211), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11234)) +- Fix scrolling to compose form when not necessary in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11246), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/11182)) +- Fix save button being enabled when list title is empty in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11475)) +- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11203)) +- Fix content warning sometimes being set when not requested in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11206)) ### Security -- Fix invites not being disabled upon account suspension ([ThibG](https://github.com/tootsuite/mastodon/pull/11412)) -- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/tootsuite/mastodon/pull/11219)) +- Fix invites not being disabled upon account suspension ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11412)) +- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/mastodon/mastodon/pull/11219)) ## [2.9.2] - 2019-06-22 ### Added -- Add `short_description` and `approval_required` to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/11146)) +- Add `short_description` and `approval_required` to `GET /api/v1/instance` ([Gargron](https://github.com/mastodon/mastodon/pull/11146)) ### Changed -- Change camera icon to paperclip icon in upload form ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11149)) +- Change camera icon to paperclip icon in upload form ([koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/11149)) ### Fixed -- Fix audio-only OGG and WebM files not being processed as such ([Gargron](https://github.com/tootsuite/mastodon/pull/11151)) -- Fix audio not being downloaded from remote servers ([Gargron](https://github.com/tootsuite/mastodon/pull/11145)) +- Fix audio-only OGG and WebM files not being processed as such ([Gargron](https://github.com/mastodon/mastodon/pull/11151)) +- Fix audio not being downloaded from remote servers ([Gargron](https://github.com/mastodon/mastodon/pull/11145)) ## [2.9.1] - 2019-06-22 ### Added -- Add moderation API ([Gargron](https://github.com/tootsuite/mastodon/pull/9387)) -- Add audio uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/11123), [Gargron](https://github.com/tootsuite/mastodon/pull/11141)) +- Add moderation API ([Gargron](https://github.com/mastodon/mastodon/pull/9387)) +- Add audio uploads ([Gargron](https://github.com/mastodon/mastodon/pull/11123), [Gargron](https://github.com/mastodon/mastodon/pull/11141)) ### Changed -- Change domain blocks to automatically support subdomains ([Gargron](https://github.com/tootsuite/mastodon/pull/11138)) -- Change Nanobox configuration to bring it up to date ([danhunsaker](https://github.com/tootsuite/mastodon/pull/11083)) +- Change domain blocks to automatically support subdomains ([Gargron](https://github.com/mastodon/mastodon/pull/11138)) +- Change Nanobox configuration to bring it up to date ([danhunsaker](https://github.com/mastodon/mastodon/pull/11083)) ### Removed -- Remove expensive counters from federation page in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11139)) +- Remove expensive counters from federation page in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/11139)) ### Fixed -- Fix converted media being saved with original extension and mime type ([Gargron](https://github.com/tootsuite/mastodon/pull/11130)) -- Fix layout of identity proofs settings ([acid-chicken](https://github.com/tootsuite/mastodon/pull/11126)) -- Fix active scope only returning suspended users ([ThibG](https://github.com/tootsuite/mastodon/pull/11111)) -- Fix sanitizer making block level elements unreadable ([Gargron](https://github.com/tootsuite/mastodon/pull/10836)) -- Fix label for site theme not being translated in admin UI ([palindromordnilap](https://github.com/tootsuite/mastodon/pull/11121)) -- Fix statuses not being filtered irreversibly in web UI under some circumstances ([ThibG](https://github.com/tootsuite/mastodon/pull/11113)) -- Fix scrolling behaviour in compose form ([ThibG](https://github.com/tootsuite/mastodon/pull/11093)) +- Fix converted media being saved with original extension and mime type ([Gargron](https://github.com/mastodon/mastodon/pull/11130)) +- Fix layout of identity proofs settings ([acid-chicken](https://github.com/mastodon/mastodon/pull/11126)) +- Fix active scope only returning suspended users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11111)) +- Fix sanitizer making block level elements unreadable ([Gargron](https://github.com/mastodon/mastodon/pull/10836)) +- Fix label for site theme not being translated in admin UI ([palindromordnilap](https://github.com/mastodon/mastodon/pull/11121)) +- Fix statuses not being filtered irreversibly in web UI under some circumstances ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11113)) +- Fix scrolling behaviour in compose form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11093)) ## [2.9.0] - 2019-06-13 ### Added -- **Add single-column mode in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/10807), [Gargron](https://github.com/tootsuite/mastodon/pull/10848), [Gargron](https://github.com/tootsuite/mastodon/pull/11003), [Gargron](https://github.com/tootsuite/mastodon/pull/10961), [Hanage999](https://github.com/tootsuite/mastodon/pull/10915), [noellabo](https://github.com/tootsuite/mastodon/pull/10917), [abcang](https://github.com/tootsuite/mastodon/pull/10859), [Gargron](https://github.com/tootsuite/mastodon/pull/10820), [Gargron](https://github.com/tootsuite/mastodon/pull/10835), [Gargron](https://github.com/tootsuite/mastodon/pull/10809), [Gargron](https://github.com/tootsuite/mastodon/pull/10963), [noellabo](https://github.com/tootsuite/mastodon/pull/10883), [Hanage999](https://github.com/tootsuite/mastodon/pull/10839)) -- Add waiting time to the list of pending accounts in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10985)) -- Add a keyboard shortcut to hide/show media in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10647), [Gargron](https://github.com/tootsuite/mastodon/pull/10838), [ThibG](https://github.com/tootsuite/mastodon/pull/10872)) -- Add `account_id` param to `GET /api/v1/notifications` ([pwoolcoc](https://github.com/tootsuite/mastodon/pull/10796)) -- Add confirmation modal for unboosting toots in web UI ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10287)) -- Add emoji suggestions to content warning and poll option fields in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10555)) -- Add `source` attribute to response of `DELETE /api/v1/statuses/:id` ([ThibG](https://github.com/tootsuite/mastodon/pull/10669)) -- Add some caching for HTML versions of public status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/10701)) -- Add button to conveniently copy OAuth code ([ThibG](https://github.com/tootsuite/mastodon/pull/11065)) +- **Add single-column mode in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/10807), [Gargron](https://github.com/mastodon/mastodon/pull/10848), [Gargron](https://github.com/mastodon/mastodon/pull/11003), [Gargron](https://github.com/mastodon/mastodon/pull/10961), [Hanage999](https://github.com/mastodon/mastodon/pull/10915), [noellabo](https://github.com/mastodon/mastodon/pull/10917), [abcang](https://github.com/mastodon/mastodon/pull/10859), [Gargron](https://github.com/mastodon/mastodon/pull/10820), [Gargron](https://github.com/mastodon/mastodon/pull/10835), [Gargron](https://github.com/mastodon/mastodon/pull/10809), [Gargron](https://github.com/mastodon/mastodon/pull/10963), [noellabo](https://github.com/mastodon/mastodon/pull/10883), [Hanage999](https://github.com/mastodon/mastodon/pull/10839)) +- Add waiting time to the list of pending accounts in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/10985)) +- Add a keyboard shortcut to hide/show media in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10647), [Gargron](https://github.com/mastodon/mastodon/pull/10838), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10872)) +- Add `account_id` param to `GET /api/v1/notifications` ([pwoolcoc](https://github.com/mastodon/mastodon/pull/10796)) +- Add confirmation modal for unboosting toots in web UI ([aurelien-reeves](https://github.com/mastodon/mastodon/pull/10287)) +- Add emoji suggestions to content warning and poll option fields in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10555)) +- Add `source` attribute to response of `DELETE /api/v1/statuses/:id` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10669)) +- Add some caching for HTML versions of public status pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10701)) +- Add button to conveniently copy OAuth code ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11065)) ### Changed -- **Change default layout to single column in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/10847)) -- **Change light theme** ([Gargron](https://github.com/tootsuite/mastodon/pull/10992), [Gargron](https://github.com/tootsuite/mastodon/pull/10996), [yuzulabo](https://github.com/tootsuite/mastodon/pull/10754), [Gargron](https://github.com/tootsuite/mastodon/pull/10845)) -- **Change preferences page into appearance, notifications, and other** ([Gargron](https://github.com/tootsuite/mastodon/pull/10977), [Gargron](https://github.com/tootsuite/mastodon/pull/10988)) -- Change priority of delete activity forwards for replies and reblogs ([Gargron](https://github.com/tootsuite/mastodon/pull/11002)) -- Change Mastodon logo to use primary text color of the given theme ([Gargron](https://github.com/tootsuite/mastodon/pull/10994)) -- Change reblogs counter to be updated when boosted privately ([Gargron](https://github.com/tootsuite/mastodon/pull/10964)) -- Change bio limit from 160 to 500 characters ([trwnh](https://github.com/tootsuite/mastodon/pull/10790)) -- Change API rate limiting to reduce allowed unauthenticated requests ([ThibG](https://github.com/tootsuite/mastodon/pull/10860), [hinaloe](https://github.com/tootsuite/mastodon/pull/10868), [mayaeh](https://github.com/tootsuite/mastodon/pull/10867)) -- Change help text of `tootctl emoji import` command to specify a gzipped TAR archive is required ([dariusk](https://github.com/tootsuite/mastodon/pull/11000)) -- Change web UI to hide poll options behind content warnings ([ThibG](https://github.com/tootsuite/mastodon/pull/10983)) -- Change silencing to ensure local effects and remote effects are the same for silenced local users ([ThibG](https://github.com/tootsuite/mastodon/pull/10575)) -- Change `tootctl domains purge` to remove custom emoji as well ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10721)) -- Change Docker image to keep `apt` working ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10830)) +- **Change default layout to single column in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/10847)) +- **Change light theme** ([Gargron](https://github.com/mastodon/mastodon/pull/10992), [Gargron](https://github.com/mastodon/mastodon/pull/10996), [yuzulabo](https://github.com/mastodon/mastodon/pull/10754), [Gargron](https://github.com/mastodon/mastodon/pull/10845)) +- **Change preferences page into appearance, notifications, and other** ([Gargron](https://github.com/mastodon/mastodon/pull/10977), [Gargron](https://github.com/mastodon/mastodon/pull/10988)) +- Change priority of delete activity forwards for replies and reblogs ([Gargron](https://github.com/mastodon/mastodon/pull/11002)) +- Change Mastodon logo to use primary text color of the given theme ([Gargron](https://github.com/mastodon/mastodon/pull/10994)) +- Change reblogs counter to be updated when boosted privately ([Gargron](https://github.com/mastodon/mastodon/pull/10964)) +- Change bio limit from 160 to 500 characters ([trwnh](https://github.com/mastodon/mastodon/pull/10790)) +- Change API rate limiting to reduce allowed unauthenticated requests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10860), [hinaloe](https://github.com/mastodon/mastodon/pull/10868), [mayaeh](https://github.com/mastodon/mastodon/pull/10867)) +- Change help text of `tootctl emoji import` command to specify a gzipped TAR archive is required ([dariusk](https://github.com/mastodon/mastodon/pull/11000)) +- Change web UI to hide poll options behind content warnings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10983)) +- Change silencing to ensure local effects and remote effects are the same for silenced local users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10575)) +- Change `tootctl domains purge` to remove custom emoji as well ([Kjwon15](https://github.com/mastodon/mastodon/pull/10721)) +- Change Docker image to keep `apt` working ([SuperSandro2000](https://github.com/mastodon/mastodon/pull/10830)) ### Removed -- Remove `dist-upgrade` from Docker image ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10822)) +- Remove `dist-upgrade` from Docker image ([SuperSandro2000](https://github.com/mastodon/mastodon/pull/10822)) ### Fixed -- Fix RTL layout not being RTL within the columns area in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10990)) -- Fix display of alternative text when a media attachment is not available in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10981)) -- Fix not being able to directly switch between list timelines in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10973)) -- Fix media sensitivity not being maintained in delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10980)) -- Fix emoji picker being always displayed in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/10979), [yuzulabo](https://github.com/tootsuite/mastodon/pull/10801), [wcpaez](https://github.com/tootsuite/mastodon/pull/10978)) -- Fix potential private status leak through caching ([ThibG](https://github.com/tootsuite/mastodon/pull/10969)) -- Fix refreshing featured toots when the new collection is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10971)) -- Fix undoing domain block also undoing individual moderation on users from before the domain block ([ThibG](https://github.com/tootsuite/mastodon/pull/10660)) -- Fix time not being local in the audit log ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10751)) -- Fix statuses removed by moderation re-appearing on subsequent fetches ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10732)) -- Fix misattribution of inlined announces if `attributedTo` isn't present in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/10967)) -- Fix `GET /api/v1/polls/:id` not requiring authentication for non-public polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10960)) -- Fix handling of blank poll options in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/10946)) -- Fix avatar preview aspect ratio on edit profile page ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10931)) -- Fix web push notifications not being sent for polls ([ThibG](https://github.com/tootsuite/mastodon/pull/10864)) -- Fix cut off letters in last paragraph of statuses in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/10821)) -- Fix list not being automatically unpinned when it returns 404 in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11045)) -- Fix login sometimes redirecting to paths that are not pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11019)) +- Fix RTL layout not being RTL within the columns area in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10990)) +- Fix display of alternative text when a media attachment is not available in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10981)) +- Fix not being able to directly switch between list timelines in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10973)) +- Fix media sensitivity not being maintained in delete & redraft in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10980)) +- Fix emoji picker being always displayed in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/10979), [yuzulabo](https://github.com/mastodon/mastodon/pull/10801), [wcpaez](https://github.com/mastodon/mastodon/pull/10978)) +- Fix potential private status leak through caching ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10969)) +- Fix refreshing featured toots when the new collection is empty in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10971)) +- Fix undoing domain block also undoing individual moderation on users from before the domain block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10660)) +- Fix time not being local in the audit log ([yuzulabo](https://github.com/mastodon/mastodon/pull/10751)) +- Fix statuses removed by moderation re-appearing on subsequent fetches ([Kjwon15](https://github.com/mastodon/mastodon/pull/10732)) +- Fix misattribution of inlined announces if `attributedTo` isn't present in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10967)) +- Fix `GET /api/v1/polls/:id` not requiring authentication for non-public polls ([Gargron](https://github.com/mastodon/mastodon/pull/10960)) +- Fix handling of blank poll options in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10946)) +- Fix avatar preview aspect ratio on edit profile page ([Kjwon15](https://github.com/mastodon/mastodon/pull/10931)) +- Fix web push notifications not being sent for polls ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10864)) +- Fix cut off letters in last paragraph of statuses in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/10821)) +- Fix list not being automatically unpinned when it returns 404 in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11045)) +- Fix login sometimes redirecting to paths that are not pages ([Gargron](https://github.com/mastodon/mastodon/pull/11019)) ## [2.8.4] - 2019-05-24 ### Fixed -- Fix delivery not retrying on some inbox errors that should be retriable ([ThibG](https://github.com/tootsuite/mastodon/pull/10812)) -- Fix unnecessary 5 minute cooldowns on signature verifications in some cases ([ThibG](https://github.com/tootsuite/mastodon/pull/10813)) -- Fix possible race condition when processing statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10815)) +- Fix delivery not retrying on some inbox errors that should be retriable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10812)) +- Fix unnecessary 5 minute cooldowns on signature verifications in some cases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10813)) +- Fix possible race condition when processing statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10815)) ### Security -- Require specific OAuth scopes for specific endpoints of the streaming API, instead of merely requiring a token for all endpoints, and allow using WebSockets protocol negotiation to specify the access token instead of using a query string ([ThibG](https://github.com/tootsuite/mastodon/pull/10818)) +- Require specific OAuth scopes for specific endpoints of the streaming API, instead of merely requiring a token for all endpoints, and allow using WebSockets protocol negotiation to specify the access token instead of using a query string ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10818)) ## [2.8.3] - 2019-05-19 ### Added -- Add `og:image:alt` OpenGraph tag ([BenLubar](https://github.com/tootsuite/mastodon/pull/10779)) -- Add clickable area below avatar in statuses in web UI ([Dar13](https://github.com/tootsuite/mastodon/pull/10766)) -- Add crossed-out eye icon on account gallery in web UI ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10715)) -- Add media description tooltip to thumbnails in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10713)) +- Add `og:image:alt` OpenGraph tag ([BenLubar](https://github.com/mastodon/mastodon/pull/10779)) +- Add clickable area below avatar in statuses in web UI ([Dar13](https://github.com/mastodon/mastodon/pull/10766)) +- Add crossed-out eye icon on account gallery in web UI ([Kjwon15](https://github.com/mastodon/mastodon/pull/10715)) +- Add media description tooltip to thumbnails in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10713)) ### Changed -- Change "mark as sensitive" button into a checkbox for clarity ([ThibG](https://github.com/tootsuite/mastodon/pull/10748)) +- Change "mark as sensitive" button into a checkbox for clarity ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10748)) ### Fixed -- Fix bug allowing users to publicly boost their private statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10775), [ThibG](https://github.com/tootsuite/mastodon/pull/10783)) -- Fix performance in formatter by a little ([ThibG](https://github.com/tootsuite/mastodon/pull/10765)) -- Fix some colors in the light theme ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10754)) -- Fix some colors of the high contrast theme ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10711)) -- Fix ambivalent active state of poll refresh button in web UI ([MaciekBaron](https://github.com/tootsuite/mastodon/pull/10720)) -- Fix duplicate posting being possible from web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/10785)) -- Fix "invited by" not showing up in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10791)) +- Fix bug allowing users to publicly boost their private statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10775), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10783)) +- Fix performance in formatter by a little ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10765)) +- Fix some colors in the light theme ([yuzulabo](https://github.com/mastodon/mastodon/pull/10754)) +- Fix some colors of the high contrast theme ([yuzulabo](https://github.com/mastodon/mastodon/pull/10711)) +- Fix ambivalent active state of poll refresh button in web UI ([MaciekBaron](https://github.com/mastodon/mastodon/pull/10720)) +- Fix duplicate posting being possible from web UI ([hinaloe](https://github.com/mastodon/mastodon/pull/10785)) +- Fix "invited by" not showing up in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10791)) ## [2.8.2] - 2019-05-05 ### Added -- Add `SOURCE_TAG` environment variable ([ushitora-anqou](https://github.com/tootsuite/mastodon/pull/10698)) +- Add `SOURCE_TAG` environment variable ([ushitora-anqou](https://github.com/mastodon/mastodon/pull/10698)) ### Fixed -- Fix cropped hero image on frontpage ([BaptisteGelez](https://github.com/tootsuite/mastodon/pull/10702)) -- Fix blurhash gem not compiling on some operating systems ([Gargron](https://github.com/tootsuite/mastodon/pull/10700)) -- Fix unexpected CSS animations in some browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/10699)) -- Fix closing video modal scrolling timelines to top ([ThibG](https://github.com/tootsuite/mastodon/pull/10695)) +- Fix cropped hero image on frontpage ([BaptisteGelez](https://github.com/mastodon/mastodon/pull/10702)) +- Fix blurhash gem not compiling on some operating systems ([Gargron](https://github.com/mastodon/mastodon/pull/10700)) +- Fix unexpected CSS animations in some browsers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10699)) +- Fix closing video modal scrolling timelines to top ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10695)) ## [2.8.1] - 2019-05-04 ### Added -- Add link to existing domain block when trying to block an already-blocked domain ([ThibG](https://github.com/tootsuite/mastodon/pull/10663)) -- Add button to view context to media modal when opened from account gallery in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10676)) -- Add ability to create multiple-choice polls in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10603)) -- Add `GITHUB_REPOSITORY` and `SOURCE_BASE_URL` environment variables ([rosylilly](https://github.com/tootsuite/mastodon/pull/10600)) -- Add `/interact/` paths to `robots.txt` ([ThibG](https://github.com/tootsuite/mastodon/pull/10666)) -- Add `blurhash` to the Attachment entity in the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10630)) +- Add link to existing domain block when trying to block an already-blocked domain ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10663)) +- Add button to view context to media modal when opened from account gallery in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10676)) +- Add ability to create multiple-choice polls in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10603)) +- Add `GITHUB_REPOSITORY` and `SOURCE_BASE_URL` environment variables ([rosylilly](https://github.com/mastodon/mastodon/pull/10600)) +- Add `/interact/` paths to `robots.txt` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10666)) +- Add `blurhash` to the Attachment entity in the REST API ([Gargron](https://github.com/mastodon/mastodon/pull/10630)) ### Changed -- Change hidden media to be shown as a blurhash-based colorful gradient instead of a black box in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10630)) -- Change rejected media to be shown as a blurhash-based gradient instead of a list of filenames in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10630)) -- Change e-mail whitelist/blacklist to not be checked when invited ([Gargron](https://github.com/tootsuite/mastodon/pull/10683)) -- Change cache header of REST API results to no-cache ([ThibG](https://github.com/tootsuite/mastodon/pull/10655)) -- Change the "mark media as sensitive" button to be more obvious in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10673), [Gargron](https://github.com/tootsuite/mastodon/pull/10682)) -- Change account gallery in web UI to display 3 columns, open media modal ([Gargron](https://github.com/tootsuite/mastodon/pull/10667), [Gargron](https://github.com/tootsuite/mastodon/pull/10674)) +- Change hidden media to be shown as a blurhash-based colorful gradient instead of a black box in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10630)) +- Change rejected media to be shown as a blurhash-based gradient instead of a list of filenames in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10630)) +- Change e-mail whitelist/blacklist to not be checked when invited ([Gargron](https://github.com/mastodon/mastodon/pull/10683)) +- Change cache header of REST API results to no-cache ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10655)) +- Change the "mark media as sensitive" button to be more obvious in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10673), [Gargron](https://github.com/mastodon/mastodon/pull/10682)) +- Change account gallery in web UI to display 3 columns, open media modal ([Gargron](https://github.com/mastodon/mastodon/pull/10667), [Gargron](https://github.com/mastodon/mastodon/pull/10674)) ### Fixed -- Fix LDAP/PAM/SAML/CAS users not being pre-approved ([Gargron](https://github.com/tootsuite/mastodon/pull/10621)) -- Fix accounts created through tootctl not being always pre-approved ([Gargron](https://github.com/tootsuite/mastodon/pull/10684)) -- Fix Sidekiq retrying ActivityPub processing jobs that fail validation ([ThibG](https://github.com/tootsuite/mastodon/pull/10614)) -- Fix toots not being scrolled into view sometimes through keyboard selection ([ThibG](https://github.com/tootsuite/mastodon/pull/10593)) -- Fix expired invite links being usable to bypass approval mode ([ThibG](https://github.com/tootsuite/mastodon/pull/10657)) -- Fix not being able to save e-mail preference for new pending accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/10622)) -- Fix upload progressbar when image resizing is involved ([ThibG](https://github.com/tootsuite/mastodon/pull/10632)) -- Fix block action not automatically cancelling pending follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/10633)) -- Fix stoplight logging to stderr separate from Rails logger ([Gargron](https://github.com/tootsuite/mastodon/pull/10624)) -- Fix sign up button not saying sign up when invite is used ([Gargron](https://github.com/tootsuite/mastodon/pull/10623)) -- Fix health checks in Docker Compose configuration ([fabianonline](https://github.com/tootsuite/mastodon/pull/10553)) -- Fix modal items not being scrollable on touch devices ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/10605)) -- Fix Keybase configuration using wrong domain when a web domain is used ([BenLubar](https://github.com/tootsuite/mastodon/pull/10565)) -- Fix avatar GIFs not being animated on-hover on public profiles ([hyenagirl64](https://github.com/tootsuite/mastodon/pull/10549)) -- Fix OpenGraph parser not understanding some valid property meta tags ([da2x](https://github.com/tootsuite/mastodon/pull/10604)) -- Fix wrong fonts being displayed when Roboto is installed on user's machine ([ThibG](https://github.com/tootsuite/mastodon/pull/10594)) -- Fix confirmation modals being too narrow for a secondary action button ([ThibG](https://github.com/tootsuite/mastodon/pull/10586)) +- Fix LDAP/PAM/SAML/CAS users not being pre-approved ([Gargron](https://github.com/mastodon/mastodon/pull/10621)) +- Fix accounts created through tootctl not being always pre-approved ([Gargron](https://github.com/mastodon/mastodon/pull/10684)) +- Fix Sidekiq retrying ActivityPub processing jobs that fail validation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10614)) +- Fix toots not being scrolled into view sometimes through keyboard selection ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10593)) +- Fix expired invite links being usable to bypass approval mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10657)) +- Fix not being able to save e-mail preference for new pending accounts ([Gargron](https://github.com/mastodon/mastodon/pull/10622)) +- Fix upload progressbar when image resizing is involved ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10632)) +- Fix block action not automatically cancelling pending follow request ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10633)) +- Fix stoplight logging to stderr separate from Rails logger ([Gargron](https://github.com/mastodon/mastodon/pull/10624)) +- Fix sign up button not saying sign up when invite is used ([Gargron](https://github.com/mastodon/mastodon/pull/10623)) +- Fix health checks in Docker Compose configuration ([fabianonline](https://github.com/mastodon/mastodon/pull/10553)) +- Fix modal items not being scrollable on touch devices ([kedamaDQ](https://github.com/mastodon/mastodon/pull/10605)) +- Fix Keybase configuration using wrong domain when a web domain is used ([BenLubar](https://github.com/mastodon/mastodon/pull/10565)) +- Fix avatar GIFs not being animated on-hover on public profiles ([hyenagirl64](https://github.com/mastodon/mastodon/pull/10549)) +- Fix OpenGraph parser not understanding some valid property meta tags ([da2x](https://github.com/mastodon/mastodon/pull/10604)) +- Fix wrong fonts being displayed when Roboto is installed on user's machine ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10594)) +- Fix confirmation modals being too narrow for a secondary action button ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10586)) ## [2.8.0] - 2019-04-10 ### Added -- Add polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10111), [ThibG](https://github.com/tootsuite/mastodon/pull/10155), [Gargron](https://github.com/tootsuite/mastodon/pull/10184), [ThibG](https://github.com/tootsuite/mastodon/pull/10196), [Gargron](https://github.com/tootsuite/mastodon/pull/10248), [ThibG](https://github.com/tootsuite/mastodon/pull/10255), [ThibG](https://github.com/tootsuite/mastodon/pull/10322), [Gargron](https://github.com/tootsuite/mastodon/pull/10138), [Gargron](https://github.com/tootsuite/mastodon/pull/10139), [Gargron](https://github.com/tootsuite/mastodon/pull/10144), [Gargron](https://github.com/tootsuite/mastodon/pull/10145),[Gargron](https://github.com/tootsuite/mastodon/pull/10146), [Gargron](https://github.com/tootsuite/mastodon/pull/10148), [Gargron](https://github.com/tootsuite/mastodon/pull/10151), [ThibG](https://github.com/tootsuite/mastodon/pull/10150), [Gargron](https://github.com/tootsuite/mastodon/pull/10168), [Gargron](https://github.com/tootsuite/mastodon/pull/10165), [Gargron](https://github.com/tootsuite/mastodon/pull/10172), [Gargron](https://github.com/tootsuite/mastodon/pull/10170), [Gargron](https://github.com/tootsuite/mastodon/pull/10171), [Gargron](https://github.com/tootsuite/mastodon/pull/10186), [Gargron](https://github.com/tootsuite/mastodon/pull/10189), [ThibG](https://github.com/tootsuite/mastodon/pull/10200), [rinsuki](https://github.com/tootsuite/mastodon/pull/10203), [Gargron](https://github.com/tootsuite/mastodon/pull/10213), [Gargron](https://github.com/tootsuite/mastodon/pull/10246), [Gargron](https://github.com/tootsuite/mastodon/pull/10265), [Gargron](https://github.com/tootsuite/mastodon/pull/10261), [ThibG](https://github.com/tootsuite/mastodon/pull/10333), [Gargron](https://github.com/tootsuite/mastodon/pull/10352), [ThibG](https://github.com/tootsuite/mastodon/pull/10140), [ThibG](https://github.com/tootsuite/mastodon/pull/10142), [ThibG](https://github.com/tootsuite/mastodon/pull/10141), [ThibG](https://github.com/tootsuite/mastodon/pull/10162), [ThibG](https://github.com/tootsuite/mastodon/pull/10161), [ThibG](https://github.com/tootsuite/mastodon/pull/10158), [ThibG](https://github.com/tootsuite/mastodon/pull/10156), [ThibG](https://github.com/tootsuite/mastodon/pull/10160), [Gargron](https://github.com/tootsuite/mastodon/pull/10185), [Gargron](https://github.com/tootsuite/mastodon/pull/10188), [ThibG](https://github.com/tootsuite/mastodon/pull/10195), [ThibG](https://github.com/tootsuite/mastodon/pull/10208), [Gargron](https://github.com/tootsuite/mastodon/pull/10187), [ThibG](https://github.com/tootsuite/mastodon/pull/10214), [ThibG](https://github.com/tootsuite/mastodon/pull/10209)) -- Add follows & followers managing UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10268), [Gargron](https://github.com/tootsuite/mastodon/pull/10308), [Gargron](https://github.com/tootsuite/mastodon/pull/10404), [Gargron](https://github.com/tootsuite/mastodon/pull/10293)) -- Add identity proof integration with Keybase ([Gargron](https://github.com/tootsuite/mastodon/pull/10297), [xgess](https://github.com/tootsuite/mastodon/pull/10375), [Gargron](https://github.com/tootsuite/mastodon/pull/10338), [Gargron](https://github.com/tootsuite/mastodon/pull/10350), [Gargron](https://github.com/tootsuite/mastodon/pull/10414)) -- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/tootsuite/mastodon/pull/9962)) -- Add featured hashtags to profiles ([Gargron](https://github.com/tootsuite/mastodon/pull/9755), [Gargron](https://github.com/tootsuite/mastodon/pull/10167), [Gargron](https://github.com/tootsuite/mastodon/pull/10249), [ThibG](https://github.com/tootsuite/mastodon/pull/10034)) -- Add admission-based registrations mode ([Gargron](https://github.com/tootsuite/mastodon/pull/10250), [ThibG](https://github.com/tootsuite/mastodon/pull/10269), [Gargron](https://github.com/tootsuite/mastodon/pull/10264), [ThibG](https://github.com/tootsuite/mastodon/pull/10321), [Gargron](https://github.com/tootsuite/mastodon/pull/10349), [Gargron](https://github.com/tootsuite/mastodon/pull/10469)) -- Add support for WebP uploads ([acid-chicken](https://github.com/tootsuite/mastodon/pull/9879)) -- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9983)) -- Add list title editing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9748)) -- Add a "Block & Report" button to the block confirmation dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10360)) -- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10275)) -- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/tootsuite/mastodon/pull/9856)) -- Add indication when you are not allowed to follow an account in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10420), [Gargron](https://github.com/tootsuite/mastodon/pull/10491)) -- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/tootsuite/mastodon/pull/10348), [ThibG](https://github.com/tootsuite/mastodon/pull/10354)) -- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/tootsuite/mastodon/pull/10091)) -- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/tootsuite/mastodon/pull/10109)) -- Add `visibility` param to reblog REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9851), [ThibG](https://github.com/tootsuite/mastodon/pull/10302)) -- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/tootsuite/mastodon/pull/10370)) -- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10373)) -- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/10063)) -- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/tootsuite/mastodon/pull/10403)) -- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/tootsuite/mastodon/pull/10367)) -- Add option to hide application used to toot ([ThibG](https://github.com/tootsuite/mastodon/pull/9897), [rinsuki](https://github.com/tootsuite/mastodon/pull/9994), [hinaloe](https://github.com/tootsuite/mastodon/pull/10086)) -- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/tootsuite/mastodon/pull/10210)) -- Add click-to-copy UI to invites page ([Gargron](https://github.com/tootsuite/mastodon/pull/10259)) -- Add self-replies fetching ([ThibG](https://github.com/tootsuite/mastodon/pull/10106), [ThibG](https://github.com/tootsuite/mastodon/pull/10128), [ThibG](https://github.com/tootsuite/mastodon/pull/10175), [ThibG](https://github.com/tootsuite/mastodon/pull/10201)) -- Add rate limit for media proxy requests ([Gargron](https://github.com/tootsuite/mastodon/pull/10490)) -- Add `tootctl emoji purge` ([Gargron](https://github.com/tootsuite/mastodon/pull/10481)) -- Add `tootctl accounts approve` ([Gargron](https://github.com/tootsuite/mastodon/pull/10480)) -- Add `tootctl accounts reset-relationships` ([noellabo](https://github.com/tootsuite/mastodon/pull/10483)) +- Add polls ([Gargron](https://github.com/mastodon/mastodon/pull/10111), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10155), [Gargron](https://github.com/mastodon/mastodon/pull/10184), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10196), [Gargron](https://github.com/mastodon/mastodon/pull/10248), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10255), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10322), [Gargron](https://github.com/mastodon/mastodon/pull/10138), [Gargron](https://github.com/mastodon/mastodon/pull/10139), [Gargron](https://github.com/mastodon/mastodon/pull/10144), [Gargron](https://github.com/mastodon/mastodon/pull/10145),[Gargron](https://github.com/mastodon/mastodon/pull/10146), [Gargron](https://github.com/mastodon/mastodon/pull/10148), [Gargron](https://github.com/mastodon/mastodon/pull/10151), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10150), [Gargron](https://github.com/mastodon/mastodon/pull/10168), [Gargron](https://github.com/mastodon/mastodon/pull/10165), [Gargron](https://github.com/mastodon/mastodon/pull/10172), [Gargron](https://github.com/mastodon/mastodon/pull/10170), [Gargron](https://github.com/mastodon/mastodon/pull/10171), [Gargron](https://github.com/mastodon/mastodon/pull/10186), [Gargron](https://github.com/mastodon/mastodon/pull/10189), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10200), [rinsuki](https://github.com/mastodon/mastodon/pull/10203), [Gargron](https://github.com/mastodon/mastodon/pull/10213), [Gargron](https://github.com/mastodon/mastodon/pull/10246), [Gargron](https://github.com/mastodon/mastodon/pull/10265), [Gargron](https://github.com/mastodon/mastodon/pull/10261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10333), [Gargron](https://github.com/mastodon/mastodon/pull/10352), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10140), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10142), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10141), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10162), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10161), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10158), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10156), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10160), [Gargron](https://github.com/mastodon/mastodon/pull/10185), [Gargron](https://github.com/mastodon/mastodon/pull/10188), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10195), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10208), [Gargron](https://github.com/mastodon/mastodon/pull/10187), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10214), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10209)) +- Add follows & followers managing UI ([Gargron](https://github.com/mastodon/mastodon/pull/10268), [Gargron](https://github.com/mastodon/mastodon/pull/10308), [Gargron](https://github.com/mastodon/mastodon/pull/10404), [Gargron](https://github.com/mastodon/mastodon/pull/10293)) +- Add identity proof integration with Keybase ([Gargron](https://github.com/mastodon/mastodon/pull/10297), [xgess](https://github.com/mastodon/mastodon/pull/10375), [Gargron](https://github.com/mastodon/mastodon/pull/10338), [Gargron](https://github.com/mastodon/mastodon/pull/10350), [Gargron](https://github.com/mastodon/mastodon/pull/10414)) +- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/mastodon/mastodon/pull/9962)) +- Add featured hashtags to profiles ([Gargron](https://github.com/mastodon/mastodon/pull/9755), [Gargron](https://github.com/mastodon/mastodon/pull/10167), [Gargron](https://github.com/mastodon/mastodon/pull/10249), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10034)) +- Add admission-based registrations mode ([Gargron](https://github.com/mastodon/mastodon/pull/10250), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10269), [Gargron](https://github.com/mastodon/mastodon/pull/10264), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10321), [Gargron](https://github.com/mastodon/mastodon/pull/10349), [Gargron](https://github.com/mastodon/mastodon/pull/10469)) +- Add support for WebP uploads ([acid-chicken](https://github.com/mastodon/mastodon/pull/9879)) +- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9983)) +- Add list title editing in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9748)) +- Add a "Block & Report" button to the block confirmation dialog in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10360)) +- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10275)) +- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/mastodon/mastodon/pull/9856)) +- Add indication when you are not allowed to follow an account in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10420), [Gargron](https://github.com/mastodon/mastodon/pull/10491)) +- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/mastodon/mastodon/pull/10348), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10354)) +- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/mastodon/mastodon/pull/10091)) +- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/mastodon/mastodon/pull/10109)) +- Add `visibility` param to reblog REST API ([Gargron](https://github.com/mastodon/mastodon/pull/9851), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10302)) +- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/mastodon/mastodon/pull/10370)) +- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/mastodon/mastodon/pull/10373)) +- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/mastodon/mastodon/pull/10063)) +- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/mastodon/mastodon/pull/10403)) +- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/mastodon/mastodon/pull/10367)) +- Add option to hide application used to toot ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9897), [rinsuki](https://github.com/mastodon/mastodon/pull/9994), [hinaloe](https://github.com/mastodon/mastodon/pull/10086)) +- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/mastodon/mastodon/pull/10210)) +- Add click-to-copy UI to invites page ([Gargron](https://github.com/mastodon/mastodon/pull/10259)) +- Add self-replies fetching ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10106), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10128), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10175), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10201)) +- Add rate limit for media proxy requests ([Gargron](https://github.com/mastodon/mastodon/pull/10490)) +- Add `tootctl emoji purge` ([Gargron](https://github.com/mastodon/mastodon/pull/10481)) +- Add `tootctl accounts approve` ([Gargron](https://github.com/mastodon/mastodon/pull/10480)) +- Add `tootctl accounts reset-relationships` ([noellabo](https://github.com/mastodon/mastodon/pull/10483)) ### Changed -- Change design of landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10232), [Gargron](https://github.com/tootsuite/mastodon/pull/10260), [ThibG](https://github.com/tootsuite/mastodon/pull/10284), [ThibG](https://github.com/tootsuite/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/10356), [Gargron](https://github.com/tootsuite/mastodon/pull/10245)) -- Change design of profile column in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10337), [Aditoo17](https://github.com/tootsuite/mastodon/pull/10387), [ThibG](https://github.com/tootsuite/mastodon/pull/10390), [mayaeh](https://github.com/tootsuite/mastodon/pull/10379), [ThibG](https://github.com/tootsuite/mastodon/pull/10411)) -- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/tootsuite/mastodon/pull/10376)) -- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/tootsuite/mastodon/pull/10276)) -- Change icons of features on admin dashboard ([Gargron](https://github.com/tootsuite/mastodon/pull/10366)) -- Change DNS timeouts from 1s to 5s ([ThibG](https://github.com/tootsuite/mastodon/pull/10238)) -- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/10100), [BenLubar](https://github.com/tootsuite/mastodon/pull/10212)) -- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/9059)) -- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10339)) -- Change web UI to not not empty timeline of blocked users on block ([ThibG](https://github.com/tootsuite/mastodon/pull/10359)) -- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/tootsuite/mastodon/pull/10378)) -- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/tootsuite/mastodon/pull/9924)) -- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/tootsuite/mastodon/pull/10289)) -- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/tootsuite/mastodon/pull/9963)) -- Change ActivityPub reports to have persistent URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/10303)) -- Change `tootctl accounts cull --dry-run` to list accounts that would be deleted ([BenLubar](https://github.com/tootsuite/mastodon/pull/10460)) -- Change format of CSV exports of follows and mutes to include extra settings ([ThibG](https://github.com/tootsuite/mastodon/pull/10495), [ThibG](https://github.com/tootsuite/mastodon/pull/10335)) -- Change ActivityPub collections to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10467)) -- Change REST API and public profiles to not return follows/followers for users that have blocked you ([Gargron](https://github.com/tootsuite/mastodon/pull/10491)) -- Change the groupings of menu items in settings navigation ([Gargron](https://github.com/tootsuite/mastodon/pull/10533)) +- Change design of landing page ([Gargron](https://github.com/mastodon/mastodon/pull/10232), [Gargron](https://github.com/mastodon/mastodon/pull/10260), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10284), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/mastodon/mastodon/pull/10356), [Gargron](https://github.com/mastodon/mastodon/pull/10245)) +- Change design of profile column in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10337), [Aditoo17](https://github.com/mastodon/mastodon/pull/10387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10390), [mayaeh](https://github.com/mastodon/mastodon/pull/10379), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10411)) +- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/mastodon/mastodon/pull/10376)) +- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/mastodon/mastodon/pull/10276)) +- Change icons of features on admin dashboard ([Gargron](https://github.com/mastodon/mastodon/pull/10366)) +- Change DNS timeouts from 1s to 5s ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10238)) +- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/mastodon/mastodon/pull/10100), [BenLubar](https://github.com/mastodon/mastodon/pull/10212)) +- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/9059)) +- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10339)) +- Change web UI to not not empty timeline of blocked users on block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10359)) +- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/mastodon/mastodon/pull/10378)) +- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/mastodon/mastodon/pull/9924)) +- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/mastodon/mastodon/pull/10289)) +- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/mastodon/mastodon/pull/9963)) +- Change ActivityPub reports to have persistent URIs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10303)) +- Change `tootctl accounts cull --dry-run` to list accounts that would be deleted ([BenLubar](https://github.com/mastodon/mastodon/pull/10460)) +- Change format of CSV exports of follows and mutes to include extra settings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10495), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10335)) +- Change ActivityPub collections to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10467)) +- Change REST API and public profiles to not return follows/followers for users that have blocked you ([Gargron](https://github.com/mastodon/mastodon/pull/10491)) +- Change the groupings of menu items in settings navigation ([Gargron](https://github.com/mastodon/mastodon/pull/10533)) ### Removed -- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10288)) -- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10290)) +- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/mastodon/mastodon/pull/10288)) +- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/mastodon/mastodon/pull/10290)) ### Fixed -- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10131)) -- Fix quick filter settings not being saved when selecting a different filter in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10296)) -- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/tootsuite/mastodon/pull/10240)) -- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10274)) -- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/tootsuite/mastodon/pull/10292)) -- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/tootsuite/mastodon/pull/10355)) -- Fix alternative relay support regression ([Gargron](https://github.com/tootsuite/mastodon/pull/10398)) -- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ThibG](https://github.com/tootsuite/mastodon/pull/10326)) -- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/tootsuite/mastodon/pull/10328)) -- Fix race conditions when creating backups ([ThibG](https://github.com/tootsuite/mastodon/pull/10234)) -- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10239)) -- Fix n+1 query when deleting status ([Gargron](https://github.com/tootsuite/mastodon/pull/10247)) -- Fix exiting follows not being rejected when suspending a remote account ([ThibG](https://github.com/tootsuite/mastodon/pull/10230)) -- Fix the underlying button element in a disabled icon button not being disabled ([ThibG](https://github.com/tootsuite/mastodon/pull/10194)) -- Fix race condition when streaming out deleted statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10280)) -- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/tootsuite/mastodon/pull/10374)) -- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/tootsuite/mastodon/pull/10383)) -- Fix `tootctl accounts cull` sometimes removing accounts that are temporarily unreachable ([BenLubar](https://github.com/tootsuite/mastodon/pull/10460)) +- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10131)) +- Fix quick filter settings not being saved when selecting a different filter in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10296)) +- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/mastodon/mastodon/pull/10240)) +- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/mastodon/mastodon/pull/10274)) +- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/mastodon/mastodon/pull/10292)) +- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/mastodon/mastodon/pull/10355)) +- Fix alternative relay support regression ([Gargron](https://github.com/mastodon/mastodon/pull/10398)) +- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10326)) +- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/mastodon/mastodon/pull/10328)) +- Fix race conditions when creating backups ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10234)) +- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/mastodon/mastodon/pull/10239)) +- Fix n+1 query when deleting status ([Gargron](https://github.com/mastodon/mastodon/pull/10247)) +- Fix exiting follows not being rejected when suspending a remote account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10230)) +- Fix the underlying button element in a disabled icon button not being disabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10194)) +- Fix race condition when streaming out deleted statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10280)) +- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/mastodon/mastodon/pull/10374)) +- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/mastodon/mastodon/pull/10383)) +- Fix `tootctl accounts cull` sometimes removing accounts that are temporarily unreachable ([BenLubar](https://github.com/mastodon/mastodon/pull/10460)) ## [2.7.4] - 2019-03-05 ### Fixed -- Fix web UI not cleaning up notifications after block ([Gargron](https://github.com/tootsuite/mastodon/pull/10108)) -- Fix redundant HTTP requests when resolving private statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10115)) -- Fix performance of account media query ([abcang](https://github.com/tootsuite/mastodon/pull/10121)) -- Fix mention processing for unknown accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/10125)) -- Fix getting started column not scrolling on short screens ([trwnh](https://github.com/tootsuite/mastodon/pull/10075)) -- Fix direct messages pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10126)) -- Fix serialization of Announce activities ([ThibG](https://github.com/tootsuite/mastodon/pull/10129)) -- Fix home timeline perpetually reloading when empty in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10130)) -- Fix lists export ([ThibG](https://github.com/tootsuite/mastodon/pull/10136)) -- Fix edit profile page crash for suspended-then-unsuspended users ([ThibG](https://github.com/tootsuite/mastodon/pull/10178)) +- Fix web UI not cleaning up notifications after block ([Gargron](https://github.com/mastodon/mastodon/pull/10108)) +- Fix redundant HTTP requests when resolving private statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10115)) +- Fix performance of account media query ([abcang](https://github.com/mastodon/mastodon/pull/10121)) +- Fix mention processing for unknown accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10125)) +- Fix getting started column not scrolling on short screens ([trwnh](https://github.com/mastodon/mastodon/pull/10075)) +- Fix direct messages pagination in the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10126)) +- Fix serialization of Announce activities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10129)) +- Fix home timeline perpetually reloading when empty in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/10130)) +- Fix lists export ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10136)) +- Fix edit profile page crash for suspended-then-unsuspended users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10178)) ## [2.7.3] - 2019-02-23 ### Added -- Add domain filter to the admin federation page ([ThibG](https://github.com/tootsuite/mastodon/pull/10071)) -- Add quick link from admin account view to block/unblock instance ([ThibG](https://github.com/tootsuite/mastodon/pull/10073)) +- Add domain filter to the admin federation page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10071)) +- Add quick link from admin account view to block/unblock instance ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10073)) ### Fixed -- Fix video player width not being updated to fit container width ([ThibG](https://github.com/tootsuite/mastodon/pull/10069)) -- Fix domain filter being shown in admin page when local filter is active ([ThibG](https://github.com/tootsuite/mastodon/pull/10074)) -- Fix crash when conversations have no valid participants ([ThibG](https://github.com/tootsuite/mastodon/pull/10078)) -- Fix error when performing admin actions on no statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10094)) +- Fix video player width not being updated to fit container width ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10069)) +- Fix domain filter being shown in admin page when local filter is active ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10074)) +- Fix crash when conversations have no valid participants ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10078)) +- Fix error when performing admin actions on no statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10094)) ### Changed -- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/tootsuite/mastodon/pull/10090)) +- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/mastodon/mastodon/pull/10090)) ## [2.7.2] - 2019-02-17 ### Added -- Add support for IPv6 in e-mail validation ([zoc](https://github.com/tootsuite/mastodon/pull/10009)) -- Add record of IP address used for signing up ([ThibG](https://github.com/tootsuite/mastodon/pull/10026)) -- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/tootsuite/mastodon/pull/10042)) -- Add support for embedded `Announce` objects attributed to the same actor ([ThibG](https://github.com/tootsuite/mastodon/pull/9998), [Gargron](https://github.com/tootsuite/mastodon/pull/10065)) -- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/tootsuite/mastodon/pull/10005), [Gargron](https://github.com/tootsuite/mastodon/pull/10041), [Gargron](https://github.com/tootsuite/mastodon/pull/10062)) -- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/10060)) -- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/tootsuite/mastodon/pull/10058)) +- Add support for IPv6 in e-mail validation ([zoc](https://github.com/mastodon/mastodon/pull/10009)) +- Add record of IP address used for signing up ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10026)) +- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/mastodon/mastodon/pull/10042)) +- Add support for embedded `Announce` objects attributed to the same actor ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9998), [Gargron](https://github.com/mastodon/mastodon/pull/10065)) +- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/mastodon/mastodon/pull/10005), [Gargron](https://github.com/mastodon/mastodon/pull/10041), [Gargron](https://github.com/mastodon/mastodon/pull/10062)) +- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/mastodon/mastodon/pull/10060)) +- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/mastodon/mastodon/pull/10058)) ### Fixed -- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/tootsuite/mastodon/pull/9949), [Gargron](https://github.com/tootsuite/mastodon/pull/10028)) -- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/tootsuite/mastodon/pull/8447), [hinaloe](https://github.com/tootsuite/mastodon/pull/9991)) -- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/tootsuite/mastodon/pull/9997)) -- Fix authorized applications page design ([rinsuki](https://github.com/tootsuite/mastodon/pull/9969)) -- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/tootsuite/mastodon/pull/9970)) -- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/tootsuite/mastodon/pull/9968)) -- Fix misleading e-mail hint being displayed in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/9973)) -- Fix tombstones not being cleared out ([abcang](https://github.com/tootsuite/mastodon/pull/9978)) -- Fix some timeline jumps ([ThibG](https://github.com/tootsuite/mastodon/pull/9982), [ThibG](https://github.com/tootsuite/mastodon/pull/10001), [rinsuki](https://github.com/tootsuite/mastodon/pull/10046)) -- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/tootsuite/mastodon/pull/10017)) -- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/tootsuite/mastodon/pull/10029)) -- Fix style regressions on landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10030)) -- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/tootsuite/mastodon/pull/10040)) -- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/tootsuite/mastodon/pull/10048)) -- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/tootsuite/mastodon/pull/10057)) -- Fix crash on public hashtag pages when streaming fails ([ThibG](https://github.com/tootsuite/mastodon/pull/10061)) +- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/mastodon/mastodon/pull/9949), [Gargron](https://github.com/mastodon/mastodon/pull/10028)) +- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/mastodon/mastodon/pull/8447), [hinaloe](https://github.com/mastodon/mastodon/pull/9991)) +- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/mastodon/mastodon/pull/9997)) +- Fix authorized applications page design ([rinsuki](https://github.com/mastodon/mastodon/pull/9969)) +- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/mastodon/mastodon/pull/9970)) +- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/mastodon/mastodon/pull/9968)) +- Fix misleading e-mail hint being displayed in admin view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9973)) +- Fix tombstones not being cleared out ([abcang](https://github.com/mastodon/mastodon/pull/9978)) +- Fix some timeline jumps ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9982), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/10001), [rinsuki](https://github.com/mastodon/mastodon/pull/10046)) +- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/mastodon/mastodon/pull/10017)) +- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/mastodon/mastodon/pull/10029)) +- Fix style regressions on landing page ([Gargron](https://github.com/mastodon/mastodon/pull/10030)) +- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/mastodon/mastodon/pull/10040)) +- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/mastodon/mastodon/pull/10048)) +- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/mastodon/mastodon/pull/10057)) +- Fix crash on public hashtag pages when streaming fails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10061)) ### Changed -- Change icon for unlisted visibility level ([clarcharr](https://github.com/tootsuite/mastodon/pull/9952)) -- Change queue of actor deletes from push to pull for non-follower recipients ([ThibG](https://github.com/tootsuite/mastodon/pull/10016)) -- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/tootsuite/mastodon/pull/10038)) -- Change upload description input to allow line breaks ([BenLubar](https://github.com/tootsuite/mastodon/pull/10036)) -- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10032)) -- Change conversations to always show names of other participants ([Gargron](https://github.com/tootsuite/mastodon/pull/10047)) -- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/tootsuite/mastodon/pull/10054)) -- Change error graphic to hover-to-play ([Gargron](https://github.com/tootsuite/mastodon/pull/10055)) +- Change icon for unlisted visibility level ([clarcharr](https://github.com/mastodon/mastodon/pull/9952)) +- Change queue of actor deletes from push to pull for non-follower recipients ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10016)) +- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/mastodon/mastodon/pull/10038)) +- Change upload description input to allow line breaks ([BenLubar](https://github.com/mastodon/mastodon/pull/10036)) +- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/mastodon/mastodon/pull/10032)) +- Change conversations to always show names of other participants ([Gargron](https://github.com/mastodon/mastodon/pull/10047)) +- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/mastodon/mastodon/pull/10054)) +- Change error graphic to hover-to-play ([Gargron](https://github.com/mastodon/mastodon/pull/10055)) ## [2.7.1] - 2019-01-28 ### Fixed -- Fix SSO authentication not working due to missing agreement boolean ([Gargron](https://github.com/tootsuite/mastodon/pull/9915)) -- Fix slow fallback of CopyAccountStats migration setting stats to 0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9930)) -- Fix wrong command in migration error message ([angristan](https://github.com/tootsuite/mastodon/pull/9877)) -- Fix initial value of volume slider in video player and handle volume changes ([ThibG](https://github.com/tootsuite/mastodon/pull/9929)) -- Fix missing hotkeys for notifications ([ThibG](https://github.com/tootsuite/mastodon/pull/9927)) -- Fix being able to attach unattached media created by other users ([ThibG](https://github.com/tootsuite/mastodon/pull/9921)) -- Fix unrescued SSL error during link verification ([renatolond](https://github.com/tootsuite/mastodon/pull/9914)) -- Fix Firefox scrollbar color regression ([trwnh](https://github.com/tootsuite/mastodon/pull/9908)) -- Fix scheduled status with media immediately creating a status ([ThibG](https://github.com/tootsuite/mastodon/pull/9894)) -- Fix missing strong style for landing page description ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9892)) +- Fix SSO authentication not working due to missing agreement boolean ([Gargron](https://github.com/mastodon/mastodon/pull/9915)) +- Fix slow fallback of CopyAccountStats migration setting stats to 0 ([Gargron](https://github.com/mastodon/mastodon/pull/9930)) +- Fix wrong command in migration error message ([angristan](https://github.com/mastodon/mastodon/pull/9877)) +- Fix initial value of volume slider in video player and handle volume changes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9929)) +- Fix missing hotkeys for notifications ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9927)) +- Fix being able to attach unattached media created by other users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9921)) +- Fix unrescued SSL error during link verification ([renatolond](https://github.com/mastodon/mastodon/pull/9914)) +- Fix Firefox scrollbar color regression ([trwnh](https://github.com/mastodon/mastodon/pull/9908)) +- Fix scheduled status with media immediately creating a status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9894)) +- Fix missing strong style for landing page description ([Kjwon15](https://github.com/mastodon/mastodon/pull/9892)) ## [2.7.0] - 2019-01-20 ### Added -- Add link for adding a user to a list from their profile ([namelessGonbai](https://github.com/tootsuite/mastodon/pull/9062)) -- Add joining several hashtags in a single column ([gdpelican](https://github.com/tootsuite/mastodon/pull/8904)) -- Add volume sliders for videos ([sumdog](https://github.com/tootsuite/mastodon/pull/9366)) -- Add a tooltip explaining what a locked account is ([pawelngei](https://github.com/tootsuite/mastodon/pull/9403)) -- Add preloaded cache for common JSON-LD contexts ([ThibG](https://github.com/tootsuite/mastodon/pull/9412)) -- Add profile directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9427)) -- Add setting to not group reblogs in home feed ([ThibG](https://github.com/tootsuite/mastodon/pull/9248)) -- Add admin ability to remove a user's header image ([ThibG](https://github.com/tootsuite/mastodon/pull/9495)) -- Add account hashtags to ActivityPub actor JSON ([Gargron](https://github.com/tootsuite/mastodon/pull/9450)) -- Add error message for avatar image that's too large ([sumdog](https://github.com/tootsuite/mastodon/pull/9518)) -- Add notification quick-filter bar ([pawelngei](https://github.com/tootsuite/mastodon/pull/9399)) -- Add new first-time tutorial ([Gargron](https://github.com/tootsuite/mastodon/pull/9531)) -- Add moderation warnings ([Gargron](https://github.com/tootsuite/mastodon/pull/9519)) -- Add emoji codepoint mappings for v11.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9618)) -- Add REST API for creating an account ([Gargron](https://github.com/tootsuite/mastodon/pull/9572)) -- Add support for Malayalam in language filter ([tachyons](https://github.com/tootsuite/mastodon/pull/9624)) -- Add exclude_reblogs option to account statuses API ([Gargron](https://github.com/tootsuite/mastodon/pull/9640)) -- Add local followers page to admin account UI ([chr-1x](https://github.com/tootsuite/mastodon/pull/9610)) -- Add healthcheck commands to docker-compose.yml ([BenLubar](https://github.com/tootsuite/mastodon/pull/9143)) -- Add handler for Move activity to migrate followers ([Gargron](https://github.com/tootsuite/mastodon/pull/9629)) -- Add CSV export for lists and domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9677)) -- Add `tootctl accounts follow ACCT` ([Gargron](https://github.com/tootsuite/mastodon/pull/9414)) -- Add scheduled statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9706)) -- Add immutable caching for S3 objects ([nolanlawson](https://github.com/tootsuite/mastodon/pull/9722)) -- Add cache to custom emojis API ([Gargron](https://github.com/tootsuite/mastodon/pull/9732)) -- Add preview cards to non-detailed statuses on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/9714)) -- Add `mod` and `moderator` to list of default reserved usernames ([Gargron](https://github.com/tootsuite/mastodon/pull/9713)) -- Add quick links to the admin interface in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/8545)) -- Add `tootctl domains crawl` ([Gargron](https://github.com/tootsuite/mastodon/pull/9809)) -- Add attachment list fallback to public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9780)) -- Add `tootctl --version` ([Gargron](https://github.com/tootsuite/mastodon/pull/9835)) -- Add information about how to opt-in to the directory on the directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9834)) -- Add timeouts for S3 ([Gargron](https://github.com/tootsuite/mastodon/pull/9842)) -- Add support for non-public reblogs from ActivityPub ([Gargron](https://github.com/tootsuite/mastodon/pull/9841)) -- Add sending of `Reject` activity when sending a `Block` activity ([ThibG](https://github.com/tootsuite/mastodon/pull/9811)) +- Add link for adding a user to a list from their profile ([namelessGonbai](https://github.com/mastodon/mastodon/pull/9062)) +- Add joining several hashtags in a single column ([gdpelican](https://github.com/mastodon/mastodon/pull/8904)) +- Add volume sliders for videos ([sumdog](https://github.com/mastodon/mastodon/pull/9366)) +- Add a tooltip explaining what a locked account is ([pawelngei](https://github.com/mastodon/mastodon/pull/9403)) +- Add preloaded cache for common JSON-LD contexts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9412)) +- Add profile directory ([Gargron](https://github.com/mastodon/mastodon/pull/9427)) +- Add setting to not group reblogs in home feed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9248)) +- Add admin ability to remove a user's header image ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9495)) +- Add account hashtags to ActivityPub actor JSON ([Gargron](https://github.com/mastodon/mastodon/pull/9450)) +- Add error message for avatar image that's too large ([sumdog](https://github.com/mastodon/mastodon/pull/9518)) +- Add notification quick-filter bar ([pawelngei](https://github.com/mastodon/mastodon/pull/9399)) +- Add new first-time tutorial ([Gargron](https://github.com/mastodon/mastodon/pull/9531)) +- Add moderation warnings ([Gargron](https://github.com/mastodon/mastodon/pull/9519)) +- Add emoji codepoint mappings for v11.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9618)) +- Add REST API for creating an account ([Gargron](https://github.com/mastodon/mastodon/pull/9572)) +- Add support for Malayalam in language filter ([tachyons](https://github.com/mastodon/mastodon/pull/9624)) +- Add exclude_reblogs option to account statuses API ([Gargron](https://github.com/mastodon/mastodon/pull/9640)) +- Add local followers page to admin account UI ([chr-1x](https://github.com/mastodon/mastodon/pull/9610)) +- Add healthcheck commands to docker-compose.yml ([BenLubar](https://github.com/mastodon/mastodon/pull/9143)) +- Add handler for Move activity to migrate followers ([Gargron](https://github.com/mastodon/mastodon/pull/9629)) +- Add CSV export for lists and domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/9677)) +- Add `tootctl accounts follow ACCT` ([Gargron](https://github.com/mastodon/mastodon/pull/9414)) +- Add scheduled statuses ([Gargron](https://github.com/mastodon/mastodon/pull/9706)) +- Add immutable caching for S3 objects ([nolanlawson](https://github.com/mastodon/mastodon/pull/9722)) +- Add cache to custom emojis API ([Gargron](https://github.com/mastodon/mastodon/pull/9732)) +- Add preview cards to non-detailed statuses on public pages ([Gargron](https://github.com/mastodon/mastodon/pull/9714)) +- Add `mod` and `moderator` to list of default reserved usernames ([Gargron](https://github.com/mastodon/mastodon/pull/9713)) +- Add quick links to the admin interface in the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8545)) +- Add `tootctl domains crawl` ([Gargron](https://github.com/mastodon/mastodon/pull/9809)) +- Add attachment list fallback to public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9780)) +- Add `tootctl --version` ([Gargron](https://github.com/mastodon/mastodon/pull/9835)) +- Add information about how to opt-in to the directory on the directory ([Gargron](https://github.com/mastodon/mastodon/pull/9834)) +- Add timeouts for S3 ([Gargron](https://github.com/mastodon/mastodon/pull/9842)) +- Add support for non-public reblogs from ActivityPub ([Gargron](https://github.com/mastodon/mastodon/pull/9841)) +- Add sending of `Reject` activity when sending a `Block` activity ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9811)) ### Changed -- Temporarily pause timeline if mouse moved recently ([lmorchard](https://github.com/tootsuite/mastodon/pull/9200)) -- Change the password form order ([mayaeh](https://github.com/tootsuite/mastodon/pull/9267)) -- Redesign admin UI for accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9340), [Gargron](https://github.com/tootsuite/mastodon/pull/9643)) -- Redesign admin UI for instances/domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9645)) -- Swap avatar and header input fields in profile page ([ThibG](https://github.com/tootsuite/mastodon/pull/9271)) -- When posting in mobile mode, go back to previous history location ([ThibG](https://github.com/tootsuite/mastodon/pull/9502)) -- Split out is_changing_upload from is_submitting ([ThibG](https://github.com/tootsuite/mastodon/pull/9536)) -- Back to the getting-started when pins the timeline. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9561)) -- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9573)) -- Limit maximum visibility of local silenced users to unlisted ([ThibG](https://github.com/tootsuite/mastodon/pull/9583)) -- Change API error message for unconfirmed accounts ([noellabo](https://github.com/tootsuite/mastodon/pull/9625)) -- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/tootsuite/mastodon/pull/9378)) -- Do not ignore federated reports targetting already-reported accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/9534)) -- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9688)) -- Change e-mail digest frequency ([Gargron](https://github.com/tootsuite/mastodon/pull/9689)) -- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/9438)) -- Display fallback link card thumbnail when none is given ([Gargron](https://github.com/tootsuite/mastodon/pull/9715)) -- Change account bio length validation to ignore mention domains and URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9717)) -- Use configured contact user for "anonymous" federation activities ([yukimochi](https://github.com/tootsuite/mastodon/pull/9661)) -- Change remote interaction dialog to use specific actions instead of generic "interact" ([Gargron](https://github.com/tootsuite/mastodon/pull/9743)) -- Always re-fetch public key when signature verification fails to support blind key rotation ([ThibG](https://github.com/tootsuite/mastodon/pull/9667)) -- Make replies to boosts impossible, connect reply to original status instead ([valerauko](https://github.com/tootsuite/mastodon/pull/9129)) -- Change e-mail MX validation to check both A and MX records against blacklist ([Gargron](https://github.com/tootsuite/mastodon/pull/9489)) -- Hide floating action button on search and getting started pages ([tmm576](https://github.com/tootsuite/mastodon/pull/9826)) -- Redesign public hashtag page to use a masonry layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9822)) -- Use `summary` as summary instead of content warning for converted ActivityPub objects ([Gargron](https://github.com/tootsuite/mastodon/pull/9823)) -- Display a double reply arrow on public pages for toots that are replies ([ThibG](https://github.com/tootsuite/mastodon/pull/9808)) -- Change admin UI right panel size to be wider ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9768)) +- Temporarily pause timeline if mouse moved recently ([lmorchard](https://github.com/mastodon/mastodon/pull/9200)) +- Change the password form order ([mayaeh](https://github.com/mastodon/mastodon/pull/9267)) +- Redesign admin UI for accounts ([Gargron](https://github.com/mastodon/mastodon/pull/9340), [Gargron](https://github.com/mastodon/mastodon/pull/9643)) +- Redesign admin UI for instances/domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/9645)) +- Swap avatar and header input fields in profile page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9271)) +- When posting in mobile mode, go back to previous history location ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9502)) +- Split out is_changing_upload from is_submitting ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9536)) +- Back to the getting-started when pins the timeline. ([kedamaDQ](https://github.com/mastodon/mastodon/pull/9561)) +- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses ([Gargron](https://github.com/mastodon/mastodon/pull/9573)) +- Limit maximum visibility of local silenced users to unlisted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9583)) +- Change API error message for unconfirmed accounts ([noellabo](https://github.com/mastodon/mastodon/pull/9625)) +- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/mastodon/mastodon/pull/9378)) +- Do not ignore federated reports targetting already-reported accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9534)) +- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9688)) +- Change e-mail digest frequency ([Gargron](https://github.com/mastodon/mastodon/pull/9689)) +- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/mastodon/mastodon/pull/9438)) +- Display fallback link card thumbnail when none is given ([Gargron](https://github.com/mastodon/mastodon/pull/9715)) +- Change account bio length validation to ignore mention domains and URLs ([Gargron](https://github.com/mastodon/mastodon/pull/9717)) +- Use configured contact user for "anonymous" federation activities ([yukimochi](https://github.com/mastodon/mastodon/pull/9661)) +- Change remote interaction dialog to use specific actions instead of generic "interact" ([Gargron](https://github.com/mastodon/mastodon/pull/9743)) +- Always re-fetch public key when signature verification fails to support blind key rotation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9667)) +- Make replies to boosts impossible, connect reply to original status instead ([valerauko](https://github.com/mastodon/mastodon/pull/9129)) +- Change e-mail MX validation to check both A and MX records against blacklist ([Gargron](https://github.com/mastodon/mastodon/pull/9489)) +- Hide floating action button on search and getting started pages ([tmm576](https://github.com/mastodon/mastodon/pull/9826)) +- Redesign public hashtag page to use a masonry layout ([Gargron](https://github.com/mastodon/mastodon/pull/9822)) +- Use `summary` as summary instead of content warning for converted ActivityPub objects ([Gargron](https://github.com/mastodon/mastodon/pull/9823)) +- Display a double reply arrow on public pages for toots that are replies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9808)) +- Change admin UI right panel size to be wider ([Kjwon15](https://github.com/mastodon/mastodon/pull/9768)) ### Removed -- Remove links to bridge.joinmastodon.org (non-functional) ([Gargron](https://github.com/tootsuite/mastodon/pull/9608)) -- Remove LD-Signatures from activities that do not need them ([ThibG](https://github.com/tootsuite/mastodon/pull/9659)) +- Remove links to bridge.joinmastodon.org (non-functional) ([Gargron](https://github.com/mastodon/mastodon/pull/9608)) +- Remove LD-Signatures from activities that do not need them ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9659)) ### Fixed -- Remove unused computation of reblog references from updateTimeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9244)) -- Fix loaded embeds resetting if a status arrives from API again ([ThibG](https://github.com/tootsuite/mastodon/pull/9270)) -- Fix race condition causing shallow status with only a "favourited" attribute ([ThibG](https://github.com/tootsuite/mastodon/pull/9272)) -- Remove intermediary arrays when creating hash maps from results ([Gargron](https://github.com/tootsuite/mastodon/pull/9291)) -- Extract counters from accounts table to account_stats table to improve performance ([Gargron](https://github.com/tootsuite/mastodon/pull/9295)) -- Change identities id column to a bigint ([Gargron](https://github.com/tootsuite/mastodon/pull/9371)) -- Fix conversations API pagination ([ThibG](https://github.com/tootsuite/mastodon/pull/9407)) -- Improve account suspension speed and completeness ([Gargron](https://github.com/tootsuite/mastodon/pull/9290)) -- Fix thread depth computation in statuses_controller ([ThibG](https://github.com/tootsuite/mastodon/pull/9426)) -- Fix database deadlocks by moving account stats update outside transaction ([ThibG](https://github.com/tootsuite/mastodon/pull/9437)) -- Escape HTML in profile name preview in profile settings ([pawelngei](https://github.com/tootsuite/mastodon/pull/9446)) -- Use same CORS policy for /@:username and /users/:username ([ThibG](https://github.com/tootsuite/mastodon/pull/9485)) -- Make custom emoji domains case insensitive ([Esteth](https://github.com/tootsuite/mastodon/pull/9474)) -- Various fixes to scrollable lists and media gallery ([ThibG](https://github.com/tootsuite/mastodon/pull/9501)) -- Fix bootsnap cache directory being declared relatively ([Gargron](https://github.com/tootsuite/mastodon/pull/9511)) -- Fix timeline pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9516)) -- Fix padding on dropdown elements in preferences ([ThibG](https://github.com/tootsuite/mastodon/pull/9517)) -- Make avatar and headers respect GIF autoplay settings ([ThibG](https://github.com/tootsuite/mastodon/pull/9515)) -- Do no retry Web Push workers if the server returns a 4xx response ([Gargron](https://github.com/tootsuite/mastodon/pull/9434)) -- Minor scrollable list fixes ([ThibG](https://github.com/tootsuite/mastodon/pull/9551)) -- Ignore low-confidence CharlockHolmes guesses when parsing link cards ([ThibG](https://github.com/tootsuite/mastodon/pull/9510)) -- Fix `tootctl accounts rotate` not updating public keys ([Gargron](https://github.com/tootsuite/mastodon/pull/9556)) -- Fix CSP / X-Frame-Options for media players ([jomo](https://github.com/tootsuite/mastodon/pull/9558)) -- Fix unnecessary loadMore calls when the end of a timeline has been reached ([ThibG](https://github.com/tootsuite/mastodon/pull/9581)) -- Skip mailer job retries when a record no longer exists ([Gargron](https://github.com/tootsuite/mastodon/pull/9590)) -- Fix composer not getting focus after reply confirmation dialog ([ThibG](https://github.com/tootsuite/mastodon/pull/9602)) -- Fix signature verification stoplight triggering on non-timeout errors ([Gargron](https://github.com/tootsuite/mastodon/pull/9617)) -- Fix ThreadResolveWorker getting queued with invalid URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9628)) -- Fix crash when clearing uninitialized timeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9662)) -- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ([ThibG](https://github.com/tootsuite/mastodon/pull/9660)) -- Skip full text search if it fails, instead of erroring out completely ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9654)) -- Fix profile metadata links not verifying correctly sometimes ([shrft](https://github.com/tootsuite/mastodon/pull/9673)) -- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order ([ThibG](https://github.com/tootsuite/mastodon/pull/9687)) -- Fix unreadable text color in report modal for some statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9716)) -- Stop GIFV timeline preview explicitly when it's opened in modal ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9749)) -- Fix scrollbar width compensation ([ThibG](https://github.com/tootsuite/mastodon/pull/9824)) -- Fix race conditions when processing deleted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/9815)) -- Fix SSO issues on WebKit browsers by disabling Same-Site cookie again ([moritzheiber](https://github.com/tootsuite/mastodon/pull/9819)) -- Fix empty OEmbed error ([renatolond](https://github.com/tootsuite/mastodon/pull/9807)) -- Fix drag & drop modal not disappearing sometimes ([hinaloe](https://github.com/tootsuite/mastodon/pull/9797)) -- Fix statuses with content warnings being displayed in web push notifications sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/9778)) -- Fix scroll-to-detailed status not working on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9773)) -- Fix media modal loading indicator ([ThibG](https://github.com/tootsuite/mastodon/pull/9771)) -- Fix hashtag search results not having a permalink fallback in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9810)) -- Fix slightly cropped font on settings page dropdowns when using system font ([ariasuni](https://github.com/tootsuite/mastodon/pull/9839)) -- Fix not being able to drag & drop text into forms ([tmm576](https://github.com/tootsuite/mastodon/pull/9840)) +- Remove unused computation of reblog references from updateTimeline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9244)) +- Fix loaded embeds resetting if a status arrives from API again ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9270)) +- Fix race condition causing shallow status with only a "favourited" attribute ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9272)) +- Remove intermediary arrays when creating hash maps from results ([Gargron](https://github.com/mastodon/mastodon/pull/9291)) +- Extract counters from accounts table to account_stats table to improve performance ([Gargron](https://github.com/mastodon/mastodon/pull/9295)) +- Change identities id column to a bigint ([Gargron](https://github.com/mastodon/mastodon/pull/9371)) +- Fix conversations API pagination ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9407)) +- Improve account suspension speed and completeness ([Gargron](https://github.com/mastodon/mastodon/pull/9290)) +- Fix thread depth computation in statuses_controller ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9426)) +- Fix database deadlocks by moving account stats update outside transaction ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9437)) +- Escape HTML in profile name preview in profile settings ([pawelngei](https://github.com/mastodon/mastodon/pull/9446)) +- Use same CORS policy for /@:username and /users/:username ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9485)) +- Make custom emoji domains case insensitive ([Esteth](https://github.com/mastodon/mastodon/pull/9474)) +- Various fixes to scrollable lists and media gallery ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9501)) +- Fix bootsnap cache directory being declared relatively ([Gargron](https://github.com/mastodon/mastodon/pull/9511)) +- Fix timeline pagination in the web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9516)) +- Fix padding on dropdown elements in preferences ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9517)) +- Make avatar and headers respect GIF autoplay settings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9515)) +- Do no retry Web Push workers if the server returns a 4xx response ([Gargron](https://github.com/mastodon/mastodon/pull/9434)) +- Minor scrollable list fixes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9551)) +- Ignore low-confidence CharlockHolmes guesses when parsing link cards ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9510)) +- Fix `tootctl accounts rotate` not updating public keys ([Gargron](https://github.com/mastodon/mastodon/pull/9556)) +- Fix CSP / X-Frame-Options for media players ([jomo](https://github.com/mastodon/mastodon/pull/9558)) +- Fix unnecessary loadMore calls when the end of a timeline has been reached ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9581)) +- Skip mailer job retries when a record no longer exists ([Gargron](https://github.com/mastodon/mastodon/pull/9590)) +- Fix composer not getting focus after reply confirmation dialog ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9602)) +- Fix signature verification stoplight triggering on non-timeout errors ([Gargron](https://github.com/mastodon/mastodon/pull/9617)) +- Fix ThreadResolveWorker getting queued with invalid URLs ([Gargron](https://github.com/mastodon/mastodon/pull/9628)) +- Fix crash when clearing uninitialized timeline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9662)) +- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9660)) +- Skip full text search if it fails, instead of erroring out completely ([Kjwon15](https://github.com/mastodon/mastodon/pull/9654)) +- Fix profile metadata links not verifying correctly sometimes ([shrft](https://github.com/mastodon/mastodon/pull/9673)) +- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9687)) +- Fix unreadable text color in report modal for some statuses ([Gargron](https://github.com/mastodon/mastodon/pull/9716)) +- Stop GIFV timeline preview explicitly when it's opened in modal ([kedamaDQ](https://github.com/mastodon/mastodon/pull/9749)) +- Fix scrollbar width compensation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9824)) +- Fix race conditions when processing deleted toots ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9815)) +- Fix SSO issues on WebKit browsers by disabling Same-Site cookie again ([moritzheiber](https://github.com/mastodon/mastodon/pull/9819)) +- Fix empty OEmbed error ([renatolond](https://github.com/mastodon/mastodon/pull/9807)) +- Fix drag & drop modal not disappearing sometimes ([hinaloe](https://github.com/mastodon/mastodon/pull/9797)) +- Fix statuses with content warnings being displayed in web push notifications sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9778)) +- Fix scroll-to-detailed status not working on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9773)) +- Fix media modal loading indicator ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9771)) +- Fix hashtag search results not having a permalink fallback in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9810)) +- Fix slightly cropped font on settings page dropdowns when using system font ([ariasuni](https://github.com/mastodon/mastodon/pull/9839)) +- Fix not being able to drag & drop text into forms ([tmm576](https://github.com/mastodon/mastodon/pull/9840)) ### Security -- Sanitize and sandbox toot embeds in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9552)) -- Add tombstones for remote statuses to prevent replay attacks ([ThibG](https://github.com/tootsuite/mastodon/pull/9830)) +- Sanitize and sandbox toot embeds in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9552)) +- Add tombstones for remote statuses to prevent replay attacks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9830)) ## [2.6.5] - 2018-12-01 ### Changed -- Change lists to display replies to others on the list and list owner ([ThibG](https://github.com/tootsuite/mastodon/pull/9324)) +- Change lists to display replies to others on the list and list owner ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9324)) ### Fixed -- Fix failures caused by commonly-used JSON-LD contexts being unavailable ([ThibG](https://github.com/tootsuite/mastodon/pull/9412)) +- Fix failures caused by commonly-used JSON-LD contexts being unavailable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9412)) ## [2.6.4] - 2018-11-30 ### Fixed -- Fix yarn dependencies not installing due to yanked event-stream package ([Gargron](https://github.com/tootsuite/mastodon/pull/9401)) +- Fix yarn dependencies not installing due to yanked event-stream package ([Gargron](https://github.com/mastodon/mastodon/pull/9401)) ## [2.6.3] - 2018-11-30 ### Added -- Add hyphen to characters allowed in remote usernames ([ThibG](https://github.com/tootsuite/mastodon/pull/9345)) +- Add hyphen to characters allowed in remote usernames ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9345)) ### Changed -- Change server user count to exclude suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9380)) +- Change server user count to exclude suspended accounts ([Gargron](https://github.com/mastodon/mastodon/pull/9380)) ### Fixed -- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer ([hugogameiro](https://github.com/tootsuite/mastodon/pull/9368)) -- Fix missing DNS records raising the wrong kind of exception ([Gargron](https://github.com/tootsuite/mastodon/pull/9379)) -- Fix already queued deliveries still trying to reach inboxes marked as unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9358)) +- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer ([hugogameiro](https://github.com/mastodon/mastodon/pull/9368)) +- Fix missing DNS records raising the wrong kind of exception ([Gargron](https://github.com/mastodon/mastodon/pull/9379)) +- Fix already queued deliveries still trying to reach inboxes marked as unavailable ([Gargron](https://github.com/mastodon/mastodon/pull/9358)) ### Security -- Fix TLS handshake timeout not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9381)) +- Fix TLS handshake timeout not being enforced ([Gargron](https://github.com/mastodon/mastodon/pull/9381)) ## [2.6.2] - 2018-11-23 ### Added -- Add Page to whitelisted ActivityPub types ([mbajur](https://github.com/tootsuite/mastodon/pull/9188)) -- Add 20px to column width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9227)) -- Add amount of freed disk space in `tootctl media remove` ([Gargron](https://github.com/tootsuite/mastodon/pull/9229), [Gargron](https://github.com/tootsuite/mastodon/pull/9239), [mayaeh](https://github.com/tootsuite/mastodon/pull/9288)) -- Add "Show thread" link to self-replies ([Gargron](https://github.com/tootsuite/mastodon/pull/9228)) +- Add Page to whitelisted ActivityPub types ([mbajur](https://github.com/mastodon/mastodon/pull/9188)) +- Add 20px to column width in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9227)) +- Add amount of freed disk space in `tootctl media remove` ([Gargron](https://github.com/mastodon/mastodon/pull/9229), [Gargron](https://github.com/mastodon/mastodon/pull/9239), [mayaeh](https://github.com/mastodon/mastodon/pull/9288)) +- Add "Show thread" link to self-replies ([Gargron](https://github.com/mastodon/mastodon/pull/9228)) ### Changed -- Change order of Atom and RSS links so Atom is first ([Alkarex](https://github.com/tootsuite/mastodon/pull/9302)) -- Change Nginx configuration for Nanobox apps ([danhunsaker](https://github.com/tootsuite/mastodon/pull/9310)) -- Change the follow action to appear instant in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9220)) -- Change how the ActiveRecord connection is instantiated in on_worker_boot ([Gargron](https://github.com/tootsuite/mastodon/pull/9238)) -- Change `tootctl accounts cull` to always touch accounts so they can be skipped ([renatolond](https://github.com/tootsuite/mastodon/pull/9293)) -- Change mime type comparison to ignore JSON-LD profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9179)) +- Change order of Atom and RSS links so Atom is first ([Alkarex](https://github.com/mastodon/mastodon/pull/9302)) +- Change Nginx configuration for Nanobox apps ([danhunsaker](https://github.com/mastodon/mastodon/pull/9310)) +- Change the follow action to appear instant in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9220)) +- Change how the ActiveRecord connection is instantiated in on_worker_boot ([Gargron](https://github.com/mastodon/mastodon/pull/9238)) +- Change `tootctl accounts cull` to always touch accounts so they can be skipped ([renatolond](https://github.com/mastodon/mastodon/pull/9293)) +- Change mime type comparison to ignore JSON-LD profile ([valerauko](https://github.com/mastodon/mastodon/pull/9179)) ### Fixed -- Fix web UI crash when conversation has no last status ([sammy8806](https://github.com/tootsuite/mastodon/pull/9207)) -- Fix follow limit validator reporting lower number past threshold ([Gargron](https://github.com/tootsuite/mastodon/pull/9230)) -- Fix form validation flash message color and input borders ([Gargron](https://github.com/tootsuite/mastodon/pull/9235)) -- Fix invalid twitter:player cards being displayed ([ThibG](https://github.com/tootsuite/mastodon/pull/9254)) -- Fix emoji update date being processed incorrectly ([ThibG](https://github.com/tootsuite/mastodon/pull/9255)) -- Fix playing embed resetting if status is reloaded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9270), [Gargron](https://github.com/tootsuite/mastodon/pull/9275)) -- Fix web UI crash when favouriting a deleted status ([ThibG](https://github.com/tootsuite/mastodon/pull/9272)) -- Fix intermediary arrays being created for hash maps ([Gargron](https://github.com/tootsuite/mastodon/pull/9291)) -- Fix filter ID not being a string in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9303)) +- Fix web UI crash when conversation has no last status ([sammy8806](https://github.com/mastodon/mastodon/pull/9207)) +- Fix follow limit validator reporting lower number past threshold ([Gargron](https://github.com/mastodon/mastodon/pull/9230)) +- Fix form validation flash message color and input borders ([Gargron](https://github.com/mastodon/mastodon/pull/9235)) +- Fix invalid twitter:player cards being displayed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9254)) +- Fix emoji update date being processed incorrectly ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9255)) +- Fix playing embed resetting if status is reloaded in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9270), [Gargron](https://github.com/mastodon/mastodon/pull/9275)) +- Fix web UI crash when favouriting a deleted status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9272)) +- Fix intermediary arrays being created for hash maps ([Gargron](https://github.com/mastodon/mastodon/pull/9291)) +- Fix filter ID not being a string in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/9303)) ### Security -- Fix multiple remote account deletions being able to deadlock the database ([Gargron](https://github.com/tootsuite/mastodon/pull/9292)) -- Fix HTTP connection timeout of 10s not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9329)) +- Fix multiple remote account deletions being able to deadlock the database ([Gargron](https://github.com/mastodon/mastodon/pull/9292)) +- Fix HTTP connection timeout of 10s not being enforced ([Gargron](https://github.com/mastodon/mastodon/pull/9329)) ## [2.6.1] - 2018-10-30 ### Fixed -- Fix resolving resources by URL not working due to a regression in [valerauko](https://github.com/tootsuite/mastodon/pull/9132) ([Gargron](https://github.com/tootsuite/mastodon/pull/9171)) -- Fix reducer error in web UI when a conversation has no last status ([Gargron](https://github.com/tootsuite/mastodon/pull/9173)) +- Fix resolving resources by URL not working due to a regression in [valerauko](https://github.com/mastodon/mastodon/pull/9132) ([Gargron](https://github.com/mastodon/mastodon/pull/9171)) +- Fix reducer error in web UI when a conversation has no last status ([Gargron](https://github.com/mastodon/mastodon/pull/9173)) ## [2.6.0] - 2018-10-30 ### Added -- Add link ownership verification ([Gargron](https://github.com/tootsuite/mastodon/pull/8703)) -- Add conversations API ([Gargron](https://github.com/tootsuite/mastodon/pull/8832)) -- Add limit for the number of people that can be followed from one account ([Gargron](https://github.com/tootsuite/mastodon/pull/8807)) -- Add admin setting to customize mascot ([ashleyhull-versent](https://github.com/tootsuite/mastodon/pull/8766)) -- Add support for more granular ActivityPub audiences from other software, i.e. circles ([Gargron](https://github.com/tootsuite/mastodon/pull/8950), [Gargron](https://github.com/tootsuite/mastodon/pull/9093), [Gargron](https://github.com/tootsuite/mastodon/pull/9150)) -- Add option to block all reports from a domain ([Gargron](https://github.com/tootsuite/mastodon/pull/8830)) -- Add user preference to always expand toots marked with content warnings ([webroo](https://github.com/tootsuite/mastodon/pull/8762)) -- Add user preference to always hide all media ([fvh-P](https://github.com/tootsuite/mastodon/pull/8569)) -- Add `force_login` param to OAuth authorize page ([Gargron](https://github.com/tootsuite/mastodon/pull/8655)) -- Add `tootctl accounts backup` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts create` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts cull` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts delete` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts modify` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl accounts refresh` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl feeds build` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl feeds clear` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl settings registrations open` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `tootctl settings registrations close` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811)) -- Add `min_id` param to REST API to support backwards pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/8736)) -- Add a confirmation dialog when hitting reply and the compose box isn't empty ([ThibG](https://github.com/tootsuite/mastodon/pull/8893)) -- Add PostgreSQL disk space growth tracking in PGHero ([Gargron](https://github.com/tootsuite/mastodon/pull/8906)) -- Add button for disabling local account to report quick actions bar ([Gargron](https://github.com/tootsuite/mastodon/pull/9024)) -- Add Czech language ([Aditoo17](https://github.com/tootsuite/mastodon/pull/8594)) -- Add `same-site` (`lax`) attribute to cookies ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8626)) -- Add support for styled scrollbars in Firefox Nightly ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8653)) -- Add highlight to the active tab in web UI profiles ([rhoio](https://github.com/tootsuite/mastodon/pull/8673)) -- Add auto-focus for comment textarea in report modal ([ThibG](https://github.com/tootsuite/mastodon/pull/8689)) -- Add auto-focus for emoji picker's search field ([ThibG](https://github.com/tootsuite/mastodon/pull/8688)) -- Add nginx and systemd templates to `dist/` directory ([Gargron](https://github.com/tootsuite/mastodon/pull/8770)) -- Add support for `/.well-known/change-password` ([Gargron](https://github.com/tootsuite/mastodon/pull/8828)) -- Add option to override FFMPEG binary path ([sascha-sl](https://github.com/tootsuite/mastodon/pull/8855)) -- Add `dns-prefetch` tag when using different host for assets or uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/8942)) -- Add `description` meta tag ([Gargron](https://github.com/tootsuite/mastodon/pull/8941)) -- Add `Content-Security-Policy` header ([ThibG](https://github.com/tootsuite/mastodon/pull/8957)) -- Add cache for the instance info API ([ykzts](https://github.com/tootsuite/mastodon/pull/8765)) -- Add suggested follows to search screen in mobile layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9010)) -- Add CORS header to `/.well-known/*` routes ([BenLubar](https://github.com/tootsuite/mastodon/pull/9083)) -- Add `card` attribute to statuses returned from REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) -- Add in-stream link preview ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) -- Add support for ActivityPub `Page` objects ([mbajur](https://github.com/tootsuite/mastodon/pull/9121)) +- Add link ownership verification ([Gargron](https://github.com/mastodon/mastodon/pull/8703)) +- Add conversations API ([Gargron](https://github.com/mastodon/mastodon/pull/8832)) +- Add limit for the number of people that can be followed from one account ([Gargron](https://github.com/mastodon/mastodon/pull/8807)) +- Add admin setting to customize mascot ([ashleyhull-versent](https://github.com/mastodon/mastodon/pull/8766)) +- Add support for more granular ActivityPub audiences from other software, i.e. circles ([Gargron](https://github.com/mastodon/mastodon/pull/8950), [Gargron](https://github.com/mastodon/mastodon/pull/9093), [Gargron](https://github.com/mastodon/mastodon/pull/9150)) +- Add option to block all reports from a domain ([Gargron](https://github.com/mastodon/mastodon/pull/8830)) +- Add user preference to always expand toots marked with content warnings ([webroo](https://github.com/mastodon/mastodon/pull/8762)) +- Add user preference to always hide all media ([fvh-P](https://github.com/mastodon/mastodon/pull/8569)) +- Add `force_login` param to OAuth authorize page ([Gargron](https://github.com/mastodon/mastodon/pull/8655)) +- Add `tootctl accounts backup` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts create` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts cull` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts delete` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts modify` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl accounts refresh` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl feeds build` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl feeds clear` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl settings registrations open` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `tootctl settings registrations close` ([Gargron](https://github.com/mastodon/mastodon/pull/8642), [Gargron](https://github.com/mastodon/mastodon/pull/8811)) +- Add `min_id` param to REST API to support backwards pagination ([Gargron](https://github.com/mastodon/mastodon/pull/8736)) +- Add a confirmation dialog when hitting reply and the compose box isn't empty ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8893)) +- Add PostgreSQL disk space growth tracking in PGHero ([Gargron](https://github.com/mastodon/mastodon/pull/8906)) +- Add button for disabling local account to report quick actions bar ([Gargron](https://github.com/mastodon/mastodon/pull/9024)) +- Add Czech language ([Aditoo17](https://github.com/mastodon/mastodon/pull/8594)) +- Add `same-site` (`lax`) attribute to cookies ([sorin-davidoi](https://github.com/mastodon/mastodon/pull/8626)) +- Add support for styled scrollbars in Firefox Nightly ([sorin-davidoi](https://github.com/mastodon/mastodon/pull/8653)) +- Add highlight to the active tab in web UI profiles ([rhoio](https://github.com/mastodon/mastodon/pull/8673)) +- Add auto-focus for comment textarea in report modal ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8689)) +- Add auto-focus for emoji picker's search field ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8688)) +- Add nginx and systemd templates to `dist/` directory ([Gargron](https://github.com/mastodon/mastodon/pull/8770)) +- Add support for `/.well-known/change-password` ([Gargron](https://github.com/mastodon/mastodon/pull/8828)) +- Add option to override FFMPEG binary path ([sascha-sl](https://github.com/mastodon/mastodon/pull/8855)) +- Add `dns-prefetch` tag when using different host for assets or uploads ([Gargron](https://github.com/mastodon/mastodon/pull/8942)) +- Add `description` meta tag ([Gargron](https://github.com/mastodon/mastodon/pull/8941)) +- Add `Content-Security-Policy` header ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8957)) +- Add cache for the instance info API ([ykzts](https://github.com/mastodon/mastodon/pull/8765)) +- Add suggested follows to search screen in mobile layout ([Gargron](https://github.com/mastodon/mastodon/pull/9010)) +- Add CORS header to `/.well-known/*` routes ([BenLubar](https://github.com/mastodon/mastodon/pull/9083)) +- Add `card` attribute to statuses returned from REST API ([Gargron](https://github.com/mastodon/mastodon/pull/9120)) +- Add in-stream link preview ([Gargron](https://github.com/mastodon/mastodon/pull/9120)) +- Add support for ActivityPub `Page` objects ([mbajur](https://github.com/mastodon/mastodon/pull/9121)) ### Changed -- Change forms design ([Gargron](https://github.com/tootsuite/mastodon/pull/8703)) -- Change reports overview to group by target account ([Gargron](https://github.com/tootsuite/mastodon/pull/8674)) -- Change web UI to show "read more" link on overly long in-stream statuses ([lanodan](https://github.com/tootsuite/mastodon/pull/8205)) -- Change design of direct messages column ([Gargron](https://github.com/tootsuite/mastodon/pull/8832), [Gargron](https://github.com/tootsuite/mastodon/pull/9022)) -- Change home timelines to exclude DMs ([Gargron](https://github.com/tootsuite/mastodon/pull/8940)) -- Change list timelines to exclude all replies ([cbayerlein](https://github.com/tootsuite/mastodon/pull/8683)) -- Change admin accounts UI default sort to most recent ([Gargron](https://github.com/tootsuite/mastodon/pull/8813)) -- Change documentation URL in the UI ([Gargron](https://github.com/tootsuite/mastodon/pull/8898)) -- Change style of success and failure messages ([Gargron](https://github.com/tootsuite/mastodon/pull/8973)) -- Change DM filtering to always allow DMs from staff ([qguv](https://github.com/tootsuite/mastodon/pull/8993)) -- Change recommended Ruby version to 2.5.3 ([zunda](https://github.com/tootsuite/mastodon/pull/9003)) -- Change docker-compose default to persist volumes in current directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9055)) -- Change character counters on edit profile page to input length limit ([Gargron](https://github.com/tootsuite/mastodon/pull/9100)) -- Change notification filtering to always let through messages from staff ([Gargron](https://github.com/tootsuite/mastodon/pull/9152)) -- Change "hide boosts from user" function also hiding notifications about boosts ([ThibG](https://github.com/tootsuite/mastodon/pull/9147)) -- Change CSS `detailed-status__wrapper` class actually wrap the detailed status ([trwnh](https://github.com/tootsuite/mastodon/pull/8547)) +- Change forms design ([Gargron](https://github.com/mastodon/mastodon/pull/8703)) +- Change reports overview to group by target account ([Gargron](https://github.com/mastodon/mastodon/pull/8674)) +- Change web UI to show "read more" link on overly long in-stream statuses ([lanodan](https://github.com/mastodon/mastodon/pull/8205)) +- Change design of direct messages column ([Gargron](https://github.com/mastodon/mastodon/pull/8832), [Gargron](https://github.com/mastodon/mastodon/pull/9022)) +- Change home timelines to exclude DMs ([Gargron](https://github.com/mastodon/mastodon/pull/8940)) +- Change list timelines to exclude all replies ([cbayerlein](https://github.com/mastodon/mastodon/pull/8683)) +- Change admin accounts UI default sort to most recent ([Gargron](https://github.com/mastodon/mastodon/pull/8813)) +- Change documentation URL in the UI ([Gargron](https://github.com/mastodon/mastodon/pull/8898)) +- Change style of success and failure messages ([Gargron](https://github.com/mastodon/mastodon/pull/8973)) +- Change DM filtering to always allow DMs from staff ([qguv](https://github.com/mastodon/mastodon/pull/8993)) +- Change recommended Ruby version to 2.5.3 ([zunda](https://github.com/mastodon/mastodon/pull/9003)) +- Change docker-compose default to persist volumes in current directory ([Gargron](https://github.com/mastodon/mastodon/pull/9055)) +- Change character counters on edit profile page to input length limit ([Gargron](https://github.com/mastodon/mastodon/pull/9100)) +- Change notification filtering to always let through messages from staff ([Gargron](https://github.com/mastodon/mastodon/pull/9152)) +- Change "hide boosts from user" function also hiding notifications about boosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9147)) +- Change CSS `detailed-status__wrapper` class actually wrap the detailed status ([trwnh](https://github.com/mastodon/mastodon/pull/8547)) ### Deprecated -- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` ([Gargron](https://github.com/tootsuite/mastodon/pull/8832)) -- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` ([Gargron](https://github.com/tootsuite/mastodon/pull/8905)) -- `GET /api/v1/statuses/:id/card` → `card` attributed included in status ([Gargron](https://github.com/tootsuite/mastodon/pull/9120)) +- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` ([Gargron](https://github.com/mastodon/mastodon/pull/8832)) +- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` ([Gargron](https://github.com/mastodon/mastodon/pull/8905)) +- `GET /api/v1/statuses/:id/card` → `card` attributed included in status ([Gargron](https://github.com/mastodon/mastodon/pull/9120)) ### Removed -- Remove "on this device" label in column push settings ([rhoio](https://github.com/tootsuite/mastodon/pull/8704)) -- Remove rake tasks in favour of tootctl commands ([Gargron](https://github.com/tootsuite/mastodon/pull/8675)) +- Remove "on this device" label in column push settings ([rhoio](https://github.com/mastodon/mastodon/pull/8704)) +- Remove rake tasks in favour of tootctl commands ([Gargron](https://github.com/mastodon/mastodon/pull/8675)) ### Fixed -- Fix remote statuses using instance's default locale if no language given ([Kjwon15](https://github.com/tootsuite/mastodon/pull/8861)) -- Fix streaming API not exiting when port or socket is unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9023)) -- Fix network calls being performed in database transaction in ActivityPub handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8951)) -- Fix dropdown arrow position ([ThibG](https://github.com/tootsuite/mastodon/pull/8637)) -- Fix first element of dropdowns being focused even if not using keyboard ([ThibG](https://github.com/tootsuite/mastodon/pull/8679)) -- Fix tootctl requiring `bundle exec` invocation ([abcang](https://github.com/tootsuite/mastodon/pull/8619)) -- Fix public pages not using animation preference for avatars ([renatolond](https://github.com/tootsuite/mastodon/pull/8614)) -- Fix OEmbed/OpenGraph cards not understanding relative URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/8669)) -- Fix some dark emojis not having a white outline ([ThibG](https://github.com/tootsuite/mastodon/pull/8597)) -- Fix media description not being displayed in various media modals ([ThibG](https://github.com/tootsuite/mastodon/pull/8678)) -- Fix generated URLs of desktop notifications missing base URL ([GenbuHase](https://github.com/tootsuite/mastodon/pull/8758)) -- Fix RTL styles ([mabkenar](https://github.com/tootsuite/mastodon/pull/8764), [mabkenar](https://github.com/tootsuite/mastodon/pull/8767), [mabkenar](https://github.com/tootsuite/mastodon/pull/8823), [mabkenar](https://github.com/tootsuite/mastodon/pull/8897), [mabkenar](https://github.com/tootsuite/mastodon/pull/9005), [mabkenar](https://github.com/tootsuite/mastodon/pull/9007), [mabkenar](https://github.com/tootsuite/mastodon/pull/9018), [mabkenar](https://github.com/tootsuite/mastodon/pull/9021), [mabkenar](https://github.com/tootsuite/mastodon/pull/9145), [mabkenar](https://github.com/tootsuite/mastodon/pull/9146)) -- Fix crash in streaming API when tag param missing ([Gargron](https://github.com/tootsuite/mastodon/pull/8955)) -- Fix hotkeys not working when no element is focused ([ThibG](https://github.com/tootsuite/mastodon/pull/8998)) -- Fix some hotkeys not working on detailed status view ([ThibG](https://github.com/tootsuite/mastodon/pull/9006)) -- Fix og:url on status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9047)) -- Fix upload option buttons only being visible on hover ([Gargron](https://github.com/tootsuite/mastodon/pull/9074)) -- Fix tootctl not returning exit code 1 on wrong arguments ([sascha-sl](https://github.com/tootsuite/mastodon/pull/9094)) -- Fix preview cards for appearing for profiles mentioned in toot ([ThibG](https://github.com/tootsuite/mastodon/pull/6934), [ThibG](https://github.com/tootsuite/mastodon/pull/9158)) -- Fix local accounts sometimes being duplicated as faux-remote ([Gargron](https://github.com/tootsuite/mastodon/pull/9109)) -- Fix emoji search when the shortcode has multiple separators ([ThibG](https://github.com/tootsuite/mastodon/pull/9124)) -- Fix dropdowns sometimes being partially obscured by other elements ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9126)) -- Fix cache not updating when reply/boost/favourite counters or media sensitivity update ([Gargron](https://github.com/tootsuite/mastodon/pull/9119)) -- Fix empty display name precedence over username in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9163)) -- Fix td instead of th in sessions table header ([Gargron](https://github.com/tootsuite/mastodon/pull/9162)) -- Fix handling of content types with profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9132)) +- Fix remote statuses using instance's default locale if no language given ([Kjwon15](https://github.com/mastodon/mastodon/pull/8861)) +- Fix streaming API not exiting when port or socket is unavailable ([Gargron](https://github.com/mastodon/mastodon/pull/9023)) +- Fix network calls being performed in database transaction in ActivityPub handler ([Gargron](https://github.com/mastodon/mastodon/pull/8951)) +- Fix dropdown arrow position ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8637)) +- Fix first element of dropdowns being focused even if not using keyboard ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8679)) +- Fix tootctl requiring `bundle exec` invocation ([abcang](https://github.com/mastodon/mastodon/pull/8619)) +- Fix public pages not using animation preference for avatars ([renatolond](https://github.com/mastodon/mastodon/pull/8614)) +- Fix OEmbed/OpenGraph cards not understanding relative URLs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8669)) +- Fix some dark emojis not having a white outline ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8597)) +- Fix media description not being displayed in various media modals ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8678)) +- Fix generated URLs of desktop notifications missing base URL ([GenbuHase](https://github.com/mastodon/mastodon/pull/8758)) +- Fix RTL styles ([mabkenar](https://github.com/mastodon/mastodon/pull/8764), [mabkenar](https://github.com/mastodon/mastodon/pull/8767), [mabkenar](https://github.com/mastodon/mastodon/pull/8823), [mabkenar](https://github.com/mastodon/mastodon/pull/8897), [mabkenar](https://github.com/mastodon/mastodon/pull/9005), [mabkenar](https://github.com/mastodon/mastodon/pull/9007), [mabkenar](https://github.com/mastodon/mastodon/pull/9018), [mabkenar](https://github.com/mastodon/mastodon/pull/9021), [mabkenar](https://github.com/mastodon/mastodon/pull/9145), [mabkenar](https://github.com/mastodon/mastodon/pull/9146)) +- Fix crash in streaming API when tag param missing ([Gargron](https://github.com/mastodon/mastodon/pull/8955)) +- Fix hotkeys not working when no element is focused ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8998)) +- Fix some hotkeys not working on detailed status view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9006)) +- Fix og:url on status pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9047)) +- Fix upload option buttons only being visible on hover ([Gargron](https://github.com/mastodon/mastodon/pull/9074)) +- Fix tootctl not returning exit code 1 on wrong arguments ([sascha-sl](https://github.com/mastodon/mastodon/pull/9094)) +- Fix preview cards for appearing for profiles mentioned in toot ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/6934), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/9158)) +- Fix local accounts sometimes being duplicated as faux-remote ([Gargron](https://github.com/mastodon/mastodon/pull/9109)) +- Fix emoji search when the shortcode has multiple separators ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9124)) +- Fix dropdowns sometimes being partially obscured by other elements ([kedamaDQ](https://github.com/mastodon/mastodon/pull/9126)) +- Fix cache not updating when reply/boost/favourite counters or media sensitivity update ([Gargron](https://github.com/mastodon/mastodon/pull/9119)) +- Fix empty display name precedence over username in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/9163)) +- Fix td instead of th in sessions table header ([Gargron](https://github.com/mastodon/mastodon/pull/9162)) +- Fix handling of content types with profile ([valerauko](https://github.com/mastodon/mastodon/pull/9132)) ## [2.5.2] - 2018-10-12 ### Security -- Fix XSS vulnerability ([Gargron](https://github.com/tootsuite/mastodon/pull/8959)) +- Fix XSS vulnerability ([Gargron](https://github.com/mastodon/mastodon/pull/8959)) ## [2.5.1] - 2018-10-07 ### Fixed -- Fix database migrations for PostgreSQL below 9.5 ([Gargron](https://github.com/tootsuite/mastodon/pull/8903)) -- Fix class autoloading issue in ActivityPub Create handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8820)) -- Fix cache statistics not being sent via statsd when statsd enabled ([ykzts](https://github.com/tootsuite/mastodon/pull/8831)) -- Bump puma from 3.11.4 to 3.12.0 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8883)) +- Fix database migrations for PostgreSQL below 9.5 ([Gargron](https://github.com/mastodon/mastodon/pull/8903)) +- Fix class autoloading issue in ActivityPub Create handler ([Gargron](https://github.com/mastodon/mastodon/pull/8820)) +- Fix cache statistics not being sent via statsd when statsd enabled ([ykzts](https://github.com/mastodon/mastodon/pull/8831)) +- Bump puma from 3.11.4 to 3.12.0 ([dependabot[bot]](https://github.com/mastodon/mastodon/pull/8883)) ### Security -- Fix some local images not having their EXIF metadata stripped on upload ([ThibG](https://github.com/tootsuite/mastodon/pull/8714)) -- Fix being able to enable a disabled relay via ActivityPub Accept handler ([ThibG](https://github.com/tootsuite/mastodon/pull/8864)) -- Bump nokogiri from 1.8.4 to 1.8.5 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8881)) -- Fix being able to report statuses not belonging to the reported account ([ThibG](https://github.com/tootsuite/mastodon/pull/8916)) +- Fix some local images not having their EXIF metadata stripped on upload ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8714)) +- Fix being able to enable a disabled relay via ActivityPub Accept handler ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8864)) +- Bump nokogiri from 1.8.4 to 1.8.5 ([dependabot[bot]](https://github.com/mastodon/mastodon/pull/8881)) +- Fix being able to report statuses not belonging to the reported account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/8916)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d563559b..3f51c4bd0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ If your contributions are accepted into Mastodon, you can request to be paid thr ## Bug reports -Bug reports and feature suggestions must use descriptive and concise titles and be submitted to [GitHub Issues](https://github.com/tootsuite/mastodon/issues). Please use the search function to make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected. +Bug reports and feature suggestions must use descriptive and concise titles and be submitted to [GitHub Issues](https://github.com/mastodon/mastodon/issues). Please use the search function to make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected. ## Translations @@ -44,4 +44,4 @@ It is not always possible to phrase every change in such a manner, but it is des ## Documentation -The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to tootsuite/documentation](https://github.com/tootsuite/documentation). +The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation). diff --git a/Dockerfile b/Dockerfile index 962e5a8c9..cbcdb2034 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,8 +54,8 @@ RUN npm install -g yarn && \ COPY Gemfile* package.json yarn.lock /opt/mastodon/ RUN cd /opt/mastodon && \ - bundle config set deployment 'true' && \ - bundle config set without 'development test' && \ + bundle config set --local deployment 'true' && \ + bundle config set --local without 'development test' && \ bundle install -j"$(nproc)" && \ yarn install --pure-lockfile diff --git a/Gemfile b/Gemfile index 3a4799347..a7187d691 100644 --- a/Gemfile +++ b/Gemfile @@ -17,7 +17,7 @@ gem 'makara', '~> 0.5' gem 'pghero', '~> 2.8' gem 'dotenv-rails', '~> 2.7' -gem 'aws-sdk-s3', '~> 1.94', require: false +gem 'aws-sdk-s3', '~> 1.95', require: false gem 'fog-core', '<= 2.1.0' gem 'fog-openstack', '~> 0.3', require: false gem 'paperclip', '~> 6.0' @@ -55,7 +55,7 @@ gem 'redis-namespace', '~> 1.8' gem 'htmlentities', '~> 4.3' gem 'http', '~> 4.4' gem 'http_accept_language', '~> 2.1' -gem 'httplog', '~> 1.4.3' +gem 'httplog', '~> 1.5.0' gem 'idn-ruby', require: 'idn' gem 'kaminari', '~> 1.2' gem 'link_header', '~> 0.0' @@ -83,7 +83,7 @@ gem 'sidekiq', '~> 6.2' gem 'sidekiq-scheduler', '~> 3.0' gem 'sidekiq-unique-jobs', '~> 7.0' gem 'sidekiq-bulk', '~>0.2.0' -gem 'simple-navigation', '~> 4.1' +gem 'simple-navigation', '~> 4.3' gem 'simple_form', '~> 5.1' gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie' gem 'stoplight', '~> 2.2.1' @@ -91,7 +91,7 @@ gem 'strong_migrations', '~> 0.7' gem 'tty-prompt', '~> 0.23', require: false gem 'twitter-text', '~> 3.1.0' gem 'tzinfo-data', '~> 1.2021' -gem 'webpacker', '~> 5.3' +gem 'webpacker', '~> 5.4' gem 'webpush', '~> 0.3' gem 'webauthn', '~> 3.0.0.alpha1' @@ -115,12 +115,12 @@ end group :test do gem 'capybara', '~> 3.35' gem 'climate_control', '~> 0.2' - gem 'faker', '~> 2.17' + gem 'faker', '~> 2.18' gem 'microformats', '~> 4.2' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.1' gem 'simplecov', '~> 0.21', require: false - gem 'webmock', '~> 3.12' + gem 'webmock', '~> 3.13' gem 'parallel_tests', '~> 3.7' gem 'rspec_junit_formatter', '~> 0.4' end @@ -134,7 +134,7 @@ group :development do gem 'letter_opener', '~> 1.7' gem 'letter_opener_web', '~> 1.4' gem 'memory_profiler' - gem 'rubocop', '~> 1.14', require: false + gem 'rubocop', '~> 1.15', require: false gem 'rubocop-rails', '~> 2.10', require: false gem 'brakeman', '~> 5.0', require: false gem 'bundler-audit', '~> 0.8', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 7fb2f9c84..8098f5d28 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -79,7 +79,7 @@ GEM encryptor (~> 3.0.0) awrence (1.1.1) aws-eventstream (1.1.1) - aws-partitions (1.452.0) + aws-partitions (1.465.0) aws-sdk-core (3.114.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) @@ -88,7 +88,7 @@ GEM aws-sdk-kms (1.43.0) aws-sdk-core (~> 3, >= 3.112.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.94.1) + aws-sdk-s3 (1.95.1) aws-sdk-core (~> 3, >= 3.112.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) @@ -211,7 +211,7 @@ GEM tzinfo excon (0.76.0) fabrication (2.22.0) - faker (2.17.0) + faker (2.18.0) i18n (>= 1.6, < 2) faraday (1.3.0) faraday-net_http (~> 1.0) @@ -273,7 +273,7 @@ GEM http-parser (1.2.1) ffi-compiler (>= 1.0, < 2.0) http_accept_language (2.1.1) - httplog (1.4.3) + httplog (1.5.0) rack (>= 1.0) rainbow (>= 2.0.0) i18n (1.8.10) @@ -354,17 +354,22 @@ GEM nokogiri (~> 1) rake mini_mime (1.0.3) - mini_portile2 (2.5.1) + mini_portile2 (2.5.2) + net-ftp (~> 0.1) minitest (5.14.4) msgpack (1.4.2) multi_json (1.15.0) multipart-post (2.1.1) + net-ftp (0.1.2) + net-protocol + time net-ldap (0.17.0) + net-protocol (0.1.0) net-scp (3.0.0) net-ssh (>= 2.6.5, < 7.0.0) net-ssh (6.1.0) nio4r (2.5.7) - nokogiri (1.11.3) + nokogiri (1.11.6) mini_portile2 (~> 2.5.0) racc (~> 1.4) nokogumbo (2.0.4) @@ -428,7 +433,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.6) - puma (5.3.0) + puma (5.3.2) nio4r (~> 2.0) pundit (2.1.0) activesupport (>= 3.0.0) @@ -524,7 +529,7 @@ GEM rspec-support (3.10.2) rspec_junit_formatter (0.4.1) rspec-core (>= 2, < 4, != 2.12.0) - rubocop (1.14.0) + rubocop (1.15.0) parallel (~> 1.10) parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) @@ -540,8 +545,9 @@ GEM rack (>= 1.1) rubocop (>= 1.7.0, < 2.0) ruby-progressbar (1.11.0) - ruby-saml (1.11.0) - nokogiri (>= 1.5.10) + ruby-saml (1.13.0) + nokogiri (>= 1.10.5) + rexml ruby2_keywords (0.0.4) rufus-scheduler (3.6.0) fugit (~> 1.1, >= 1.1.6) @@ -569,12 +575,12 @@ GEM sidekiq (>= 3) thwait tilt (>= 1.4.0) - sidekiq-unique-jobs (7.0.9) + sidekiq-unique-jobs (7.0.11) brpoplpush-redis_script (> 0.1.1, <= 2.0.0) concurrent-ruby (~> 1.0, >= 1.0.5) sidekiq (>= 5.0, < 7.0) thor (>= 0.20, < 2.0) - simple-navigation (4.1.0) + simple-navigation (4.3.0) activesupport (>= 2.3.2) simple_form (5.1.0) actionpack (>= 5.2) @@ -609,6 +615,7 @@ GEM thwait (0.2.0) e2mmap tilt (2.0.10) + time (0.1.0) tpm-key_attestation (0.9.0) bindata (~> 2.4) openssl-signature_algorithm (~> 0.4.0) @@ -646,11 +653,11 @@ GEM safety_net_attestation (~> 0.4.0) securecompare (~> 1.0) tpm-key_attestation (~> 0.9.0) - webmock (3.12.2) + webmock (3.13.0) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webpacker (5.3.0) + webpacker (5.4.0) activesupport (>= 5.2) rack-proxy (>= 0.6.1) railties (>= 5.2) @@ -675,7 +682,7 @@ DEPENDENCIES active_record_query_trace (~> 1.8) addressable (~> 2.7) annotate (~> 3.1) - aws-sdk-s3 (~> 1.94) + aws-sdk-s3 (~> 1.95) better_errors (~> 2.9) binding_of_caller (~> 1.0) blurhash (~> 0.1) @@ -704,7 +711,7 @@ DEPENDENCIES dotenv-rails (~> 2.7) ed25519 (~> 1.2) fabrication (~> 2.22) - faker (~> 2.17) + faker (~> 2.18) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) @@ -715,7 +722,7 @@ DEPENDENCIES htmlentities (~> 4.3) http (~> 4.4) http_accept_language (~> 2.1) - httplog (~> 1.4.3) + httplog (~> 1.5.0) i18n-tasks (~> 0.9) idn-ruby iso-639 @@ -769,7 +776,7 @@ DEPENDENCIES rspec-rails (~> 5.0) rspec-sidekiq (~> 3.1) rspec_junit_formatter (~> 0.4) - rubocop (~> 1.14) + rubocop (~> 1.15) rubocop-rails (~> 2.10) ruby-progressbar (~> 1.11) sanitize (~> 5.2) @@ -778,7 +785,7 @@ DEPENDENCIES sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 3.0) sidekiq-unique-jobs (~> 7.0) - simple-navigation (~> 4.1) + simple-navigation (~> 4.3) simple_form (~> 5.1) simplecov (~> 0.21) sprockets (~> 3.7.2) @@ -791,8 +798,8 @@ DEPENDENCIES twitter-text (~> 3.1.0) tzinfo-data (~> 1.2021) webauthn (~> 3.0.0.alpha1) - webmock (~> 3.12) - webpacker (~> 5.3) + webmock (~> 3.13) + webpacker (~> 5.4) webpush (~> 0.3) xorcist (~> 1.1) diff --git a/app.json b/app.json index e4f7cf403..6b4365383 100644 --- a/app.json +++ b/app.json @@ -1,8 +1,8 @@ { "name": "Mastodon", "description": "A GNU Social-compatible microblogging server", - "repository": "https://github.com/tootsuite/mastodon", - "logo": "https://github.com/tootsuite.png", + "repository": "https://github.com/mastodon/mastodon", + "logo": "https://github.com/mastodon.png", "env": { "HEROKU": { "description": "Leave this as true", diff --git a/app/controllers/activitypub/followers_synchronizations_controller.rb b/app/controllers/activitypub/followers_synchronizations_controller.rb index 525031105..940b77cf0 100644 --- a/app/controllers/activitypub/followers_synchronizations_controller.rb +++ b/app/controllers/activitypub/followers_synchronizations_controller.rb @@ -19,11 +19,11 @@ class ActivityPub::FollowersSynchronizationsController < ActivityPub::BaseContro private def uri_prefix - signed_request_account.uri[/http(s?):\/\/[^\/]+\//] + signed_request_account.uri[Account::URL_PREFIX_RE] end def set_items - @items = @account.followers.where(Account.arel_table[:uri].matches(uri_prefix + '%', false, true)).pluck(:uri) + @items = @account.followers.where(Account.arel_table[:uri].matches("#{Account.sanitize_sql_like(uri_prefix)}/%", false, true)).or(@account.followers.where(uri: uri_prefix)).pluck(:uri) end def collection_presenter diff --git a/app/controllers/activitypub/outboxes_controller.rb b/app/controllers/activitypub/outboxes_controller.rb index 111285036..b2aab56a5 100644 --- a/app/controllers/activitypub/outboxes_controller.rb +++ b/app/controllers/activitypub/outboxes_controller.rb @@ -11,7 +11,11 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController before_action :set_cache_headers def show - expires_in(page_requested? ? 0 : 3.minutes, public: public_fetch_mode? && !(signed_request_account.present? && page_requested?)) + if page_requested? + expires_in(1.minute, public: public_fetch_mode? && signed_request_account.nil?) + else + expires_in(3.minutes, public: public_fetch_mode?) + end render json: outbox_presenter, serializer: ActivityPub::OutboxSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' end @@ -29,7 +33,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController ) else ActivityPub::CollectionPresenter.new( - id: account_outbox_url(@account), + id: outbox_url, type: :ordered, size: @account.statuses_count, first: outbox_url(page: true), @@ -47,11 +51,11 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController end def next_page - account_outbox_url(@account, page: true, max_id: @statuses.last.id) if @statuses.size == LIMIT + outbox_url(page: true, max_id: @statuses.last.id) if @statuses.size == LIMIT end def prev_page - account_outbox_url(@account, page: true, min_id: @statuses.first.id) unless @statuses.empty? + outbox_url(page: true, min_id: @statuses.first.id) unless @statuses.empty? end def set_statuses @@ -76,4 +80,8 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController def set_account @account = params[:account_username].present? ? Account.find_local!(username_param) : Account.representative end + + def set_cache_headers + response.headers['Vary'] = 'Signature' if authorized_fetch_mode? || page_requested? + end end diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index ef279509d..58a0eb84c 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -14,7 +14,7 @@ module Admin @statuses = @account.statuses.where(visibility: [:public, :unlisted]) if params[:media] - @statuses.merge!(Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)) + @statuses.merge!(Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)).reorder('statuses.id desc') end @statuses = @statuses.preload(:media_attachments, :mentions).page(params[:page]).per(PER_PAGE) diff --git a/app/controllers/api/v1/emails/confirmations_controller.rb b/app/controllers/api/v1/emails/confirmations_controller.rb index 4a7aa9c32..f1d9954d0 100644 --- a/app/controllers/api/v1/emails/confirmations_controller.rb +++ b/app/controllers/api/v1/emails/confirmations_controller.rb @@ -3,12 +3,11 @@ class Api::V1::Emails::ConfirmationsController < Api::BaseController before_action :doorkeeper_authorize! before_action :require_user_owned_by_application! + before_action :require_user_not_confirmed! def create - if !current_user.confirmed? && current_user.unconfirmed_email.present? - current_user.update!(email: params[:email]) if params.key?(:email) - current_user.resend_confirmation_instructions - end + current_user.update!(email: params[:email]) if params.key?(:email) + current_user.resend_confirmation_instructions render_empty end @@ -18,4 +17,8 @@ class Api::V1::Emails::ConfirmationsController < Api::BaseController def require_user_owned_by_application! render json: { error: 'This method is only available to the application the user originally signed-up with' }, status: :forbidden unless current_user && current_user.created_by_application_id == doorkeeper_token.application_id end + + def require_user_not_confirmed! + render json: { error: 'This method is only available while the e-mail is awaiting confirmation' }, status: :forbidden if current_user.confirmed? || current_user.unconfirmed_email.blank? + end end diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index 5db2668f7..2996c0431 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -10,7 +10,6 @@ class Auth::PasswordsController < Devise::PasswordsController super do |resource| if resource.errors.empty? resource.session_activations.destroy_all - resource.forget_me! end end end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index a3114ab25..3c1730f25 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class Auth::RegistrationsController < Devise::RegistrationsController - include Devise::Controllers::Rememberable include RegistrationSpamConcern layout :determine_layout @@ -30,8 +29,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController super do |resource| if resource.saved_change_to_encrypted_password? resource.clear_other_sessions(current_session.session_id) - resource.forget_me! - remember_me(resource) end end end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 13d158c67..630b0dee5 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Auth::SessionsController < Devise::SessionsController - include Devise::Controllers::Rememberable - layout 'auth' skip_before_action :require_no_authentication, only: [:create] @@ -26,7 +24,6 @@ class Auth::SessionsController < Devise::SessionsController def create super do |resource| resource.update_sign_in!(request, new_sign_in: true) - remember_me(resource) flash.delete(:notice) end end @@ -40,7 +37,7 @@ class Auth::SessionsController < Devise::SessionsController end def webauthn_options - user = find_user + user = User.find_by(id: session[:attempt_user_id]) if user.webauthn_enabled? options_for_get = WebAuthn::Credential.options_for_get( @@ -58,16 +55,20 @@ class Auth::SessionsController < Devise::SessionsController protected def find_user - if session[:attempt_user_id] + if user_params[:email].present? + find_user_from_params + elsif session[:attempt_user_id] User.find_by(id: session[:attempt_user_id]) - else - user = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication - user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication - user ||= User.find_for_authentication(email: user_params[:email]) - user end end + def find_user_from_params + user = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication + user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication + user ||= User.find_for_authentication(email: user_params[:email]) + user + end + def user_params params.require(:user).permit(:email, :password, :otp_attempt, :sign_in_token_attempt, credential: {}) end diff --git a/app/controllers/concerns/sign_in_token_authentication_concern.rb b/app/controllers/concerns/sign_in_token_authentication_concern.rb index 3c95a4afd..2b5e79115 100644 --- a/app/controllers/concerns/sign_in_token_authentication_concern.rb +++ b/app/controllers/concerns/sign_in_token_authentication_concern.rb @@ -16,21 +16,24 @@ module SignInTokenAuthenticationConcern end def authenticate_with_sign_in_token - user = self.resource = find_user - - if user.present? && session[:attempt_user_id].present? && session[:attempt_user_updated_at] != user.updated_at.to_s - restart_session - elsif user_params.key?(:sign_in_token_attempt) && session[:attempt_user_id] - authenticate_with_sign_in_token_attempt(user) - elsif user.present? && user.external_or_valid_password?(user_params[:password]) - prompt_for_sign_in_token(user) + if user_params[:email].present? + user = self.resource = find_user_from_params + prompt_for_sign_in_token(user) if user&.external_or_valid_password?(user_params[:password]) + elsif session[:attempt_user_id] + user = self.resource = User.find_by(id: session[:attempt_user_id]) + return if user.nil? + + if session[:attempt_user_updated_at] != user.updated_at.to_s + restart_session + elsif user_params.key?(:sign_in_token_attempt) + authenticate_with_sign_in_token_attempt(user) + end end end def authenticate_with_sign_in_token_attempt(user) if valid_sign_in_token_attempt?(user) clear_attempt_from_session - remember_me(user) sign_in(user) else flash.now[:alert] = I18n.t('users.invalid_sign_in_token') diff --git a/app/controllers/concerns/two_factor_authentication_concern.rb b/app/controllers/concerns/two_factor_authentication_concern.rb index 4d4ccf49c..d65f072ff 100644 --- a/app/controllers/concerns/two_factor_authentication_concern.rb +++ b/app/controllers/concerns/two_factor_authentication_concern.rb @@ -35,16 +35,20 @@ module TwoFactorAuthenticationConcern end def authenticate_with_two_factor - user = self.resource = find_user + if user_params[:email].present? + user = self.resource = find_user_from_params + prompt_for_two_factor(user) if user&.external_or_valid_password?(user_params[:password]) + elsif session[:attempt_user_id] + user = self.resource = User.find_by(id: session[:attempt_user_id]) + return if user.nil? - if user.present? && session[:attempt_user_id].present? && session[:attempt_user_updated_at] != user.updated_at.to_s - restart_session - elsif user.webauthn_enabled? && user_params.key?(:credential) && session[:attempt_user_id] - authenticate_with_two_factor_via_webauthn(user) - elsif user_params.key?(:otp_attempt) && session[:attempt_user_id] - authenticate_with_two_factor_via_otp(user) - elsif user.present? && user.external_or_valid_password?(user_params[:password]) - prompt_for_two_factor(user) + if session[:attempt_user_updated_at] != user.updated_at.to_s + restart_session + elsif user.webauthn_enabled? && user_params.key?(:credential) + authenticate_with_two_factor_via_webauthn(user) + elsif user_params.key?(:otp_attempt) + authenticate_with_two_factor_via_otp(user) + end end end @@ -53,7 +57,6 @@ module TwoFactorAuthenticationConcern if valid_webauthn_credential?(user, webauthn_credential) clear_attempt_from_session - remember_me(user) sign_in(user) render json: { redirect_path: root_path }, status: :ok else @@ -64,7 +67,6 @@ module TwoFactorAuthenticationConcern def authenticate_with_two_factor_via_otp(user) if valid_otp_attempt?(user) clear_attempt_from_session - remember_me(user) sign_in(user) else flash.now[:alert] = I18n.t('users.invalid_otp_token') diff --git a/app/controllers/custom_css_controller.rb b/app/controllers/custom_css_controller.rb index 0a667a6a6..e1dc5eaf6 100644 --- a/app/controllers/custom_css_controller.rb +++ b/app/controllers/custom_css_controller.rb @@ -3,11 +3,16 @@ class CustomCssController < ApplicationController skip_before_action :store_current_location skip_before_action :require_functional! + skip_before_action :update_user_sign_in + skip_before_action :set_session_activity + + skip_around_action :set_locale before_action :set_cache_headers def show expires_in 3.minutes, public: true + request.session_options[:skip] = true render plain: Setting.custom_css || '', content_type: 'text/css' end end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index ff4df2adf..b3589a39f 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -85,7 +85,7 @@ class FollowerAccountsController < ApplicationController if page_requested? || !@account.user_hides_network? # Return all fields else - %i(id type totalItems) + %i(id type total_items) end end end diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb index 6bb95c454..8a72dc475 100644 --- a/app/controllers/following_accounts_controller.rb +++ b/app/controllers/following_accounts_controller.rb @@ -85,7 +85,7 @@ class FollowingAccountsController < ApplicationController if page_requested? || !@account.user_hides_network? # Return all fields else - %i(id type totalItems) + %i(id type total_items) end end end diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index 1b610318d..5596e92d1 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -45,7 +45,7 @@ class MediaProxyController < ApplicationController end def lock_options - { redis: Redis.current, key: "media_download:#{params[:id]}" } + { redis: Redis.current, key: "media_download:#{params[:id]}", autorelease: 15.minutes.seconds } end def reject_media? diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index 7b8f8d207..e0dd5edcb 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -42,7 +42,7 @@ class Settings::DeletesController < Settings::BaseController end def destroy_account! - current_account.suspend!(origin: :local) + current_account.suspend!(origin: :local, block_email: false) AccountDeletionWorker.perform_async(current_user.account_id) sign_out end diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb index 0227f722a..2b296ea3b 100644 --- a/app/controllers/well_known/webfinger_controller.rb +++ b/app/controllers/well_known/webfinger_controller.rb @@ -4,7 +4,6 @@ module WellKnown class WebfingerController < ActionController::Base include RoutingHelper - before_action { response.headers['Vary'] = 'Accept' } before_action :set_account before_action :check_account_suspension @@ -39,10 +38,12 @@ module WellKnown end def bad_request + expires_in(3.minutes, public: true) head 400 end def not_found + expires_in(3.minutes, public: true) head 404 end diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index 37b75a5b1..c22918d2f 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -80,17 +80,17 @@ module AccountsHelper def account_description(account) prepend_str = [ [ - number_to_human(account.statuses_count, strip_insignificant_zeros: true), + number_to_human(account.statuses_count, precision: 3, strip_insignificant_zeros: true), I18n.t('accounts.posts', count: account.statuses_count), ].join(' '), [ - number_to_human(account.following_count, strip_insignificant_zeros: true), + number_to_human(account.following_count, precision: 3, strip_insignificant_zeros: true), I18n.t('accounts.following', count: account.following_count), ].join(' '), [ - number_to_human(account.followers_count, strip_insignificant_zeros: true), + number_to_human(account.followers_count, precision: 3, strip_insignificant_zeros: true), I18n.t('accounts.followers', count: account.followers_count), ].join(' '), ].join(', ') diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index bf5742d34..a39e8e5bf 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -14,6 +14,17 @@ module ApplicationHelper ku ).freeze + def friendly_number_to_human(number, **options) + # By default, the number of precision digits used by number_to_human + # is looked up from the locales definition, and rails-i18n comes with + # values that don't seem to make much sense for many languages, so + # override these values with a default of 3 digits of precision. + options[:precision] = 3 + options[:strip_insignificant_zeros] = true + + number_to_human(number, **options) + end + def active_nav_class(*paths) paths.any? { |path| current_page?(path) } ? 'active' : '' end diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb new file mode 100644 index 000000000..2c7541ad4 --- /dev/null +++ b/app/helpers/context_helper.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module ContextHelper + NAMED_CONTEXT_MAP = { + activitystreams: 'https://www.w3.org/ns/activitystreams', + security: 'https://w3id.org/security/v1', + }.freeze + + CONTEXT_EXTENSION_MAP = { + manually_approves_followers: { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers' }, + sensitive: { 'sensitive' => 'as:sensitive' }, + hashtag: { 'Hashtag' => 'as:Hashtag' }, + moved_to: { 'movedTo' => { '@id' => 'as:movedTo', '@type' => '@id' } }, + also_known_as: { 'alsoKnownAs' => { '@id' => 'as:alsoKnownAs', '@type' => '@id' } }, + emoji: { 'toot' => 'http://joinmastodon.org/ns#', 'Emoji' => 'toot:Emoji' }, + featured: { 'toot' => 'http://joinmastodon.org/ns#', 'featured' => { '@id' => 'toot:featured', '@type' => '@id' }, 'featuredTags' => { '@id' => 'toot:featuredTags', '@type' => '@id' } }, + property_value: { 'schema' => 'http://schema.org#', 'PropertyValue' => 'schema:PropertyValue', 'value' => 'schema:value' }, + atom_uri: { 'ostatus' => 'http://ostatus.org#', 'atomUri' => 'ostatus:atomUri' }, + conversation: { 'ostatus' => 'http://ostatus.org#', 'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri', 'conversation' => 'ostatus:conversation' }, + focal_point: { 'toot' => 'http://joinmastodon.org/ns#', 'focalPoint' => { '@container' => '@list', '@id' => 'toot:focalPoint' } }, + identity_proof: { 'toot' => 'http://joinmastodon.org/ns#', 'IdentityProof' => 'toot:IdentityProof' }, + blurhash: { 'toot' => 'http://joinmastodon.org/ns#', 'blurhash' => 'toot:blurhash' }, + discoverable: { 'toot' => 'http://joinmastodon.org/ns#', 'discoverable' => 'toot:discoverable' }, + voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, + olm: { 'toot' => 'http://joinmastodon.org/ns#', 'Device' => 'toot:Device', 'Ed25519Signature' => 'toot:Ed25519Signature', 'Ed25519Key' => 'toot:Ed25519Key', 'Curve25519Key' => 'toot:Curve25519Key', 'EncryptedMessage' => 'toot:EncryptedMessage', 'publicKeyBase64' => 'toot:publicKeyBase64', 'deviceId' => 'toot:deviceId', 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, 'messageFranking' => 'toot:messageFranking', 'messageType' => 'toot:messageType', 'cipherText' => 'toot:cipherText' }, + suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, + }.freeze + + def full_context + serialized_context(NAMED_CONTEXT_MAP, CONTEXT_EXTENSION_MAP) + end + + def serialized_context(named_contexts_map, context_extensions_map) + context_array = [] + + named_contexts = named_contexts_map.keys + context_extensions = context_extensions_map.keys + + named_contexts.each do |key| + context_array << NAMED_CONTEXT_MAP[key] + end + + extensions = context_extensions.each_with_object({}) do |key, h| + h.merge!(CONTEXT_EXTENSION_MAP[key]) + end + + context_array << extensions unless extensions.empty? + + if context_array.size == 1 + context_array.first + else + context_array + end + end +end diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index 62eb50f78..d9924be3b 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module JsonLdHelper + include ContextHelper + def equals_or_includes?(haystack, needle) haystack.is_a?(Array) ? haystack.include?(needle) : haystack == needle end @@ -63,6 +65,84 @@ module JsonLdHelper graph.dump(:normalize) end + def compact(json) + compacted = JSON::LD::API.compact(json.without('signature'), full_context, documentLoader: method(:load_jsonld_context)) + compacted['signature'] = json['signature'] + compacted + end + + # Patches a JSON-LD document to avoid compatibility issues on redistribution + # + # Since compacting a JSON-LD document against Mastodon's built-in vocabulary + # means other extension namespaces will be expanded, malformed JSON-LD + # attributes lost, and some values “unexpectedly” compacted this method + # patches the following likely sources of incompatibility: + # - 'https://www.w3.org/ns/activitystreams#Public' being compacted to + # 'as:Public' (for instance, pre-3.4.0 Mastodon does not understand + # 'as:Public') + # - single-item arrays being compacted to the item itself (`[foo]` being + # compacted to `foo`) + # + # It is not always possible for `patch_for_forwarding!` to produce a document + # deemed safe for forwarding. Use `safe_for_forwarding?` to check the status + # of the output document. + # + # @param original [Hash] The original JSON-LD document used as reference + # @param compacted [Hash] The compacted JSON-LD document to be patched + # @return [void] + def patch_for_forwarding!(original, compacted) + original.without('@context', 'signature').each do |key, value| + next if value.nil? || !compacted.key?(key) + + compacted_value = compacted[key] + if value.is_a?(Hash) && compacted_value.is_a?(Hash) + patch_for_forwarding!(value, compacted_value) + elsif value.is_a?(Array) + compacted_value = [compacted_value] unless compacted_value.is_a?(Array) + return if value.size != compacted_value.size + + compacted[key] = value.zip(compacted_value).map do |v, vc| + if v.is_a?(Hash) && vc.is_a?(Hash) + patch_for_forwarding!(v, vc) + vc + elsif v == 'https://www.w3.org/ns/activitystreams#Public' && vc == 'as:Public' + v + else + vc + end + end + elsif value == 'https://www.w3.org/ns/activitystreams#Public' && compacted_value == 'as:Public' + compacted[key] = value + end + end + end + + # Tests whether a JSON-LD compaction is deemed safe for redistribution, + # that is, if it doesn't change its meaning to consumers that do not actually + # handle JSON-LD, but rely on values being serialized in a certain way. + # + # See `patch_for_forwarding!` for details. + # + # @param original [Hash] The original JSON-LD document used as reference + # @param compacted [Hash] The compacted JSON-LD document to be patched + # @return [Boolean] Whether the patched document is deemed safe + def safe_for_forwarding?(original, compacted) + original.without('@context', 'signature').all? do |key, value| + compacted_value = compacted[key] + return false unless value.class == compacted_value.class + + if value.is_a?(Hash) + safe_for_forwarding?(value, compacted_value) + elsif value.is_a?(Array) + value.zip(compacted_value).all? do |v, vc| + v.is_a?(Hash) ? (vc.is_a?(Hash) && safe_for_forwarding?(v, vc)) : v == vc + end + else + value == compacted_value + end + end + end + def fetch_resource(uri, id, on_behalf_of = nil) unless id json = fetch_resource_without_id_validation(uri, on_behalf_of) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index b60901040..0ebfab75d 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -18,6 +18,7 @@ module SettingsHelper en: 'English', eo: 'Esperanto', 'es-AR': 'Español (Argentina)', + 'es-MX': 'Español (México)', es: 'Español', et: 'Eesti', eu: 'Euskara', diff --git a/app/javascript/mastodon/actions/picture_in_picture.js b/app/javascript/mastodon/actions/picture_in_picture.js index 4085cb59e..33d8d57d4 100644 --- a/app/javascript/mastodon/actions/picture_in_picture.js +++ b/app/javascript/mastodon/actions/picture_in_picture.js @@ -22,13 +22,20 @@ export const PICTURE_IN_PICTURE_REMOVE = 'PICTURE_IN_PICTURE_REMOVE'; * @param {MediaProps} props * @return {object} */ -export const deployPictureInPicture = (statusId, accountId, playerType, props) => ({ - type: PICTURE_IN_PICTURE_DEPLOY, - statusId, - accountId, - playerType, - props, -}); +export const deployPictureInPicture = (statusId, accountId, playerType, props) => { + return (dispatch, getState) => { + // Do not open a player for a toot that does not exist + if (getState().hasIn(['statuses', statusId])) { + dispatch({ + type: PICTURE_IN_PICTURE_DEPLOY, + statusId, + accountId, + playerType, + props, + }); + } + }; +}; /* * @return {object} diff --git a/app/javascript/mastodon/components/intersection_observer_article.js b/app/javascript/mastodon/components/intersection_observer_article.js index 2d87f19b5..26f85fa40 100644 --- a/app/javascript/mastodon/components/intersection_observer_article.js +++ b/app/javascript/mastodon/components/intersection_observer_article.js @@ -93,7 +93,7 @@ export default class IntersectionObserverArticle extends React.Component { // When the browser gets a chance, test if we're still not intersecting, // and if so, set our isHidden to true to trigger an unrender. The point of // this is to save DOM nodes and avoid using up too much memory. - // See: https://github.com/tootsuite/mastodon/issues/2900 + // See: https://github.com/mastodon/mastodon/issues/2900 this.setState((prevState) => ({ isHidden: !prevState.isIntersecting })); } diff --git a/app/javascript/mastodon/components/modal_root.js b/app/javascript/mastodon/components/modal_root.js index 26344528e..755c46fd6 100644 --- a/app/javascript/mastodon/components/modal_root.js +++ b/app/javascript/mastodon/components/modal_root.js @@ -1,10 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import 'wicg-inert'; +import { createBrowserHistory } from 'history'; import { multiply } from 'color-blend'; export default class ModalRoot extends React.PureComponent { + static contextTypes = { + router: PropTypes.object, + }; + static propTypes = { children: PropTypes.node, onClose: PropTypes.func.isRequired, @@ -48,6 +53,7 @@ export default class ModalRoot extends React.PureComponent { componentDidMount () { window.addEventListener('keyup', this.handleKeyUp, false); window.addEventListener('keydown', this.handleKeyDown, false); + this.history = this.context.router ? this.context.router.history : createBrowserHistory(); } componentWillReceiveProps (nextProps) { @@ -69,6 +75,14 @@ export default class ModalRoot extends React.PureComponent { this.activeElement.focus({ preventScroll: true }); this.activeElement = null; }).catch(console.error); + + this._handleModalClose(); + } + if (this.props.children && !prevProps.children) { + this._handleModalOpen(); + } + if (this.props.children) { + this._ensureHistoryBuffer(); } } @@ -77,6 +91,32 @@ export default class ModalRoot extends React.PureComponent { window.removeEventListener('keydown', this.handleKeyDown); } + _handleModalOpen () { + this._modalHistoryKey = Date.now(); + this.unlistenHistory = this.history.listen((_, action) => { + if (action === 'POP') { + this.props.onClose(); + } + }); + } + + _handleModalClose () { + if (this.unlistenHistory) { + this.unlistenHistory(); + } + const { state } = this.history.location; + if (state && state.mastodonModalKey === this._modalHistoryKey) { + this.history.goBack(); + } + } + + _ensureHistoryBuffer () { + const { pathname, state } = this.history.location; + if (!state || state.mastodonModalKey !== this._modalHistoryKey) { + this.history.push(pathname, { ...state, mastodonModalKey: this._modalHistoryKey }); + } + } + getSiblings = () => { return Array(...this.node.parentElement.childNodes).filter(node => node !== this.node); } diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index 2689b18ef..68a178512 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { ScrollContainer } from 'react-router-scroll-4'; +import ScrollContainer from 'mastodon/containers/scroll_container'; import PropTypes from 'prop-types'; import IntersectionObserverArticleContainer from '../containers/intersection_observer_article_container'; import LoadMore from './load_more'; @@ -34,7 +34,6 @@ class ScrollableList extends PureComponent { onScrollToTop: PropTypes.func, onScroll: PropTypes.func, trackScroll: PropTypes.bool, - shouldUpdateScroll: PropTypes.func, isLoading: PropTypes.bool, showLoading: PropTypes.bool, hasMore: PropTypes.bool, @@ -290,7 +289,7 @@ class ScrollableList extends PureComponent { } render () { - const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; + const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; const { fullscreen } = this.state; const childrenCount = React.Children.count(children); @@ -356,7 +355,7 @@ class ScrollableList extends PureComponent { if (trackScroll) { return ( - + {scrollableArea} ); diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index e08b9b9c2..7d5c57808 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -309,8 +309,8 @@ class Status extends ImmutablePureComponent { return (
- {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} - {status.get('content')} + {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} + {status.get('content')}
); diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js index 25411c127..eaaffcc3a 100644 --- a/app/javascript/mastodon/components/status_list.js +++ b/app/javascript/mastodon/components/status_list.js @@ -18,7 +18,6 @@ export default class StatusList extends ImmutablePureComponent { onScrollToTop: PropTypes.func, onScroll: PropTypes.func, trackScroll: PropTypes.bool, - shouldUpdateScroll: PropTypes.func, isLoading: PropTypes.bool, isPartial: PropTypes.bool, hasMore: PropTypes.bool, @@ -77,7 +76,7 @@ export default class StatusList extends ImmutablePureComponent { } render () { - const { statusIds, featuredStatusIds, shouldUpdateScroll, onLoadMore, timelineId, ...other } = this.props; + const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other } = this.props; const { isLoading, isPartial } = other; if (isPartial) { @@ -120,7 +119,7 @@ export default class StatusList extends ImmutablePureComponent { } return ( - + {scrollableContent} ); diff --git a/app/javascript/mastodon/containers/mastodon.js b/app/javascript/mastodon/containers/mastodon.js index 513b59908..892ff1ca9 100644 --- a/app/javascript/mastodon/containers/mastodon.js +++ b/app/javascript/mastodon/containers/mastodon.js @@ -10,8 +10,6 @@ import { hydrateStore } from '../actions/store'; import { connectUserStream } from '../actions/streaming'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from '../locales'; -import { previewState as previewMediaState } from 'mastodon/features/ui/components/media_modal'; -import { previewState as previewVideoState } from 'mastodon/features/ui/components/video_modal'; import initialState from '../initial_state'; import ErrorBoundary from '../components/error_boundary'; @@ -41,8 +39,8 @@ export default class Mastodon extends React.PureComponent { } } - shouldUpdateScroll (_, { location }) { - return location.state !== previewMediaState && location.state !== previewVideoState; + shouldUpdateScroll (prevRouterProps, { location }) { + return !(location.state?.mastodonModalKey && location.state?.mastodonModalKey !== prevRouterProps?.location?.state?.mastodonModalKey); } render () { diff --git a/app/javascript/mastodon/containers/scroll_container.js b/app/javascript/mastodon/containers/scroll_container.js new file mode 100644 index 000000000..d21ff6368 --- /dev/null +++ b/app/javascript/mastodon/containers/scroll_container.js @@ -0,0 +1,18 @@ +import { ScrollContainer as OriginalScrollContainer } from 'react-router-scroll-4'; + +// ScrollContainer is used to automatically scroll to the top when pushing a +// new history state and remembering the scroll position when going back. +// There are a few things we need to do differently, though. +const defaultShouldUpdateScroll = (prevRouterProps, { location }) => { + // If the change is caused by opening a modal, do not scroll to top + return !(location.state?.mastodonModalKey && location.state?.mastodonModalKey !== prevRouterProps?.location?.state?.mastodonModalKey); +}; + +export default +class ScrollContainer extends OriginalScrollContainer { + + static defaultProps = { + shouldUpdateScroll: defaultShouldUpdateScroll, + }; + +} diff --git a/app/javascript/mastodon/features/account_gallery/index.js b/app/javascript/mastodon/features/account_gallery/index.js index 015a6a6d7..e199c929e 100644 --- a/app/javascript/mastodon/features/account_gallery/index.js +++ b/app/javascript/mastodon/features/account_gallery/index.js @@ -11,7 +11,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { getAccountGallery } from 'mastodon/selectors'; import MediaItem from './components/media_item'; import HeaderContainer from '../account_timeline/containers/header_container'; -import { ScrollContainer } from 'react-router-scroll-4'; +import ScrollContainer from 'mastodon/containers/scroll_container'; import LoadMore from 'mastodon/components/load_more'; import MissingIndicator from 'mastodon/components/missing_indicator'; import { openModal } from 'mastodon/actions/modal'; @@ -29,7 +29,6 @@ const mapStateToProps = (state, props) => ({ class LoadMoreMedia extends ImmutablePureComponent { static propTypes = { - shouldUpdateScroll: PropTypes.func, maxId: PropTypes.string, onLoadMore: PropTypes.func.isRequired, }; @@ -127,7 +126,7 @@ class AccountGallery extends ImmutablePureComponent { } render () { - const { attachments, shouldUpdateScroll, isLoading, hasMore, isAccount, multiColumn, blockedBy, suspended } = this.props; + const { attachments, isLoading, hasMore, isAccount, multiColumn, blockedBy, suspended } = this.props; const { width } = this.state; if (!isAccount) { @@ -164,7 +163,7 @@ class AccountGallery extends ImmutablePureComponent { - +
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js index 7cbf50463..416202e03 100644 --- a/app/javascript/mastodon/features/account_timeline/index.js +++ b/app/javascript/mastodon/features/account_timeline/index.js @@ -50,7 +50,6 @@ class AccountTimeline extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, statusIds: ImmutablePropTypes.list, featuredStatusIds: ImmutablePropTypes.list, isLoading: PropTypes.bool, @@ -115,7 +114,7 @@ class AccountTimeline extends ImmutablePureComponent { } render () { - const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, multiColumn, remote, remoteUrl } = this.props; + const { statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, multiColumn, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -162,7 +161,6 @@ class AccountTimeline extends ImmutablePureComponent { isLoading={isLoading} hasMore={hasMore} onLoadMore={this.handleLoadMore} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} timelineId='account' diff --git a/app/javascript/mastodon/features/blocks/index.js b/app/javascript/mastodon/features/blocks/index.js index 107deb841..7ec177434 100644 --- a/app/javascript/mastodon/features/blocks/index.js +++ b/app/javascript/mastodon/features/blocks/index.js @@ -29,7 +29,6 @@ class Blocks extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, accountIds: ImmutablePropTypes.list, hasMore: PropTypes.bool, isLoading: PropTypes.bool, @@ -46,7 +45,7 @@ class Blocks extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, accountIds, shouldUpdateScroll, hasMore, multiColumn, isLoading } = this.props; + const { intl, accountIds, hasMore, multiColumn, isLoading } = this.props; if (!accountIds) { return ( @@ -66,7 +65,6 @@ class Blocks extends ImmutablePureComponent { onLoadMore={this.handleLoadMore} hasMore={hasMore} isLoading={isLoading} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} > diff --git a/app/javascript/mastodon/features/bookmarked_statuses/index.js b/app/javascript/mastodon/features/bookmarked_statuses/index.js index c37cb9176..cf067d954 100644 --- a/app/javascript/mastodon/features/bookmarked_statuses/index.js +++ b/app/javascript/mastodon/features/bookmarked_statuses/index.js @@ -27,7 +27,6 @@ class Bookmarks extends ImmutablePureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, statusIds: ImmutablePropTypes.list.isRequired, intl: PropTypes.object.isRequired, columnId: PropTypes.string, @@ -68,7 +67,7 @@ class Bookmarks extends ImmutablePureComponent { }, 300, { leading: true }) render () { - const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; + const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; const pinned = !!columnId; const emptyMessage = ; @@ -93,7 +92,6 @@ class Bookmarks extends ImmutablePureComponent { hasMore={hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/community_timeline/index.js b/app/javascript/mastodon/features/community_timeline/index.js index b3cd39685..30f776048 100644 --- a/app/javascript/mastodon/features/community_timeline/index.js +++ b/app/javascript/mastodon/features/community_timeline/index.js @@ -41,7 +41,6 @@ class CommunityTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, columnId: PropTypes.string, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, @@ -103,7 +102,7 @@ class CommunityTimeline extends React.PureComponent { } render () { - const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, onlyMedia } = this.props; + const { intl, hasUnread, columnId, multiColumn, onlyMedia } = this.props; const pinned = !!columnId; return ( @@ -127,7 +126,6 @@ class CommunityTimeline extends React.PureComponent { timelineId={`community${onlyMedia ? ':media' : ''}`} onLoadMore={this.handleLoadMore} emptyMessage={} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index c2781095e..65655a57f 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components'; import Overlay from 'react-overlays/lib/Overlay'; import classNames from 'classnames'; @@ -12,7 +12,6 @@ import { assetHost } from 'mastodon/utils/config'; const messages = defineMessages({ emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' }, emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' }, - emoji_not_found: { id: 'emoji_button.not_found', defaultMessage: 'No emojos!! (╯°□°)╯︵ ┻━┻' }, custom: { id: 'emoji_button.custom', defaultMessage: 'Custom' }, recent: { id: 'emoji_button.recent', defaultMessage: 'Frequently used' }, search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' }, @@ -28,9 +27,26 @@ const messages = defineMessages({ let EmojiPicker, Emoji; // load asynchronously -const backgroundImageFn = () => `${assetHost}/emoji/sheet_10.png`; const listenerOptions = supportsPassiveEvents ? { passive: true } : false; +const backgroundImageFn = () => `${assetHost}/emoji/sheet_13.png`; + +const notFoundFn = () => ( +
+ + +
+ +
+
+); + class ModifierPickerMenu extends React.PureComponent { static propTypes = { @@ -182,7 +198,6 @@ class EmojiPickerMenu extends React.PureComponent { return { search: intl.formatMessage(messages.emoji_search), - notfound: intl.formatMessage(messages.emoji_not_found), categories: { search: intl.formatMessage(messages.search_results), recent: intl.formatMessage(messages.recent), @@ -263,7 +278,9 @@ class EmojiPickerMenu extends React.PureComponent { recent={frequentlyUsedEmojis} skin={skinTone} showPreview={false} + showSkinTones={false} backgroundImageFn={backgroundImageFn} + notFound={notFoundFn} autoFocus emojiTooltip /> diff --git a/app/javascript/mastodon/features/compose/containers/navigation_container.js b/app/javascript/mastodon/features/compose/containers/navigation_container.js index 8606a642e..654c14df9 100644 --- a/app/javascript/mastodon/features/compose/containers/navigation_container.js +++ b/app/javascript/mastodon/features/compose/containers/navigation_container.js @@ -21,6 +21,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ dispatch(openModal('CONFIRM', { message: intl.formatMessage(messages.logoutMessage), confirm: intl.formatMessage(messages.logoutConfirm), + closeWhenConfirm: false, onConfirm: () => logOut(), })); }, diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index deb6748e4..f6b88738b 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -93,6 +93,7 @@ class Compose extends React.PureComponent { dispatch(openModal('CONFIRM', { message: intl.formatMessage(messages.logoutMessage), confirm: intl.formatMessage(messages.logoutConfirm), + closeWhenConfirm: false, onConfirm: () => logOut(), })); diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js b/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js index 4ee8e5212..fd1df7256 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js +++ b/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js @@ -14,7 +14,6 @@ export default class ConversationsList extends ImmutablePureComponent { hasMore: PropTypes.bool, isLoading: PropTypes.bool, onLoadMore: PropTypes.func, - shouldUpdateScroll: PropTypes.func, }; getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id) diff --git a/app/javascript/mastodon/features/direct_timeline/index.js b/app/javascript/mastodon/features/direct_timeline/index.js index 5ce795760..68523666c 100644 --- a/app/javascript/mastodon/features/direct_timeline/index.js +++ b/app/javascript/mastodon/features/direct_timeline/index.js @@ -19,7 +19,6 @@ class DirectTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, columnId: PropTypes.string, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, @@ -71,7 +70,7 @@ class DirectTimeline extends React.PureComponent { } render () { - const { intl, hasUnread, columnId, multiColumn, shouldUpdateScroll } = this.props; + const { intl, hasUnread, columnId, multiColumn } = this.props; const pinned = !!columnId; return ( @@ -93,7 +92,6 @@ class DirectTimeline extends React.PureComponent { timelineId='direct' onLoadMore={this.handleLoadMore} emptyMessage={} - shouldUpdateScroll={shouldUpdateScroll} /> ); diff --git a/app/javascript/mastodon/features/directory/index.js b/app/javascript/mastodon/features/directory/index.js index 2f91e759b..88f20d330 100644 --- a/app/javascript/mastodon/features/directory/index.js +++ b/app/javascript/mastodon/features/directory/index.js @@ -12,7 +12,7 @@ import AccountCard from './components/account_card'; import RadioButton from 'mastodon/components/radio_button'; import classNames from 'classnames'; import LoadMore from 'mastodon/components/load_more'; -import { ScrollContainer } from 'react-router-scroll-4'; +import ScrollContainer from 'mastodon/containers/scroll_container'; const messages = defineMessages({ title: { id: 'column.directory', defaultMessage: 'Browse profiles' }, @@ -40,7 +40,6 @@ class Directory extends React.PureComponent { isLoading: PropTypes.bool, accountIds: ImmutablePropTypes.list.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, columnId: PropTypes.string, intl: PropTypes.object.isRequired, multiColumn: PropTypes.bool, @@ -125,7 +124,7 @@ class Directory extends React.PureComponent { } render () { - const { isLoading, accountIds, intl, columnId, multiColumn, domain, shouldUpdateScroll } = this.props; + const { isLoading, accountIds, intl, columnId, multiColumn, domain } = this.props; const { order, local } = this.getParams(this.props, this.state); const pinned = !!columnId; @@ -163,7 +162,7 @@ class Directory extends React.PureComponent { multiColumn={multiColumn} /> - {multiColumn && !pinned ? {scrollableArea} : scrollableArea} + {multiColumn && !pinned ? {scrollableArea} : scrollableArea} ); } diff --git a/app/javascript/mastodon/features/domain_blocks/index.js b/app/javascript/mastodon/features/domain_blocks/index.js index a6d988912..edb80aef4 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.js +++ b/app/javascript/mastodon/features/domain_blocks/index.js @@ -29,7 +29,6 @@ class Blocks extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, hasMore: PropTypes.bool, domains: ImmutablePropTypes.orderedSet, intl: PropTypes.object.isRequired, @@ -45,7 +44,7 @@ class Blocks extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, domains, shouldUpdateScroll, hasMore, multiColumn } = this.props; + const { intl, domains, hasMore, multiColumn } = this.props; if (!domains) { return ( @@ -64,7 +63,6 @@ class Blocks extends ImmutablePureComponent { scrollKey='domain_blocks' onLoadMore={this.handleLoadMore} hasMore={hasMore} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} > diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.js b/app/javascript/mastodon/features/emoji/emoji_compressed.js index a8a5cff94..74b53ce5c 100644 --- a/app/javascript/mastodon/features/emoji/emoji_compressed.js +++ b/app/javascript/mastodon/features/emoji/emoji_compressed.js @@ -7,29 +7,38 @@ const { unicodeToFilename } = require('./unicode_to_filename'); const { unicodeToUnifiedName } = require('./unicode_to_unified_name'); -const emojiMap = require('./emoji_map.json'); +const emojiMap = require('./emoji_map.json'); const { emojiIndex } = require('emoji-mart'); const { uncompress: emojiMartUncompress } = require('emoji-mart/dist/utils/data'); + let data = require('emoji-mart/data/all.json'); if(data.compressed) { data = emojiMartUncompress(data); } + const emojiMartData = data; const excluded = ['®', '©', '™']; -const skins = ['🏻', '🏼', '🏽', '🏾', '🏿']; +const skinTones = ['🏻', '🏼', '🏽', '🏾', '🏿']; const shortcodeMap = {}; const shortCodesToEmojiData = {}; const emojisWithoutShortCodes = []; Object.keys(emojiIndex.emojis).forEach(key => { - shortcodeMap[emojiIndex.emojis[key].native] = emojiIndex.emojis[key].id; + let emoji = emojiIndex.emojis[key]; + + // Emojis with skin tone modifiers are stored like this + if (Object.prototype.hasOwnProperty.call(emoji, '1')) { + emoji = emoji['1']; + } + + shortcodeMap[emoji.native] = emoji.id; }); const stripModifiers = unicode => { - skins.forEach(tone => { + skinTones.forEach(tone => { unicode = unicode.replace(tone, ''); }); @@ -64,13 +73,22 @@ Object.keys(emojiMap).forEach(key => { if (!Array.isArray(shortCodesToEmojiData[shortcode])) { shortCodesToEmojiData[shortcode] = [[]]; } + shortCodesToEmojiData[shortcode][0].push(filenameData); } }); Object.keys(emojiIndex.emojis).forEach(key => { - const { native } = emojiIndex.emojis[key]; + let emoji = emojiIndex.emojis[key]; + + // Emojis with skin tone modifiers are stored like this + if (Object.prototype.hasOwnProperty.call(emoji, '1')) { + emoji = emoji['1']; + } + + const { native } = emoji; let { short_names, search, unified } = emojiMartData.emojis[key]; + if (short_names[0] !== key) { throw new Error('The compresser expects the first short_code to be the ' + 'key. It may need to be rewritten if the emoji change such that this ' + @@ -80,11 +98,16 @@ Object.keys(emojiIndex.emojis).forEach(key => { short_names = short_names.slice(1); // first short name can be inferred from the key const searchData = [native, short_names, search]; + if (unicodeToUnifiedName(native) !== unified) { // unified name can't be derived from unicodeToUnifiedName searchData.push(unified); } + if (!Array.isArray(shortCodesToEmojiData[key])) { + shortCodesToEmojiData[key] = [[]]; + } + shortCodesToEmojiData[key].push(searchData); }); diff --git a/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js b/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js index 808ac197e..d29550f12 100644 --- a/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js +++ b/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js @@ -2,16 +2,20 @@ function padLeft(str, num) { while (str.length < num) { str = '0' + str; } + return str; } exports.unicodeToUnifiedName = (str) => { let output = ''; + for (let i = 0; i < str.length; i += 2) { if (i > 0) { output += '-'; } + output += padLeft(str.codePointAt(i).toString(16).toUpperCase(), 4); } + return output; }; diff --git a/app/javascript/mastodon/features/favourited_statuses/index.js b/app/javascript/mastodon/features/favourited_statuses/index.js index 23fce4e11..73631946a 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.js +++ b/app/javascript/mastodon/features/favourited_statuses/index.js @@ -27,7 +27,6 @@ class Favourites extends ImmutablePureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, statusIds: ImmutablePropTypes.list.isRequired, intl: PropTypes.object.isRequired, columnId: PropTypes.string, @@ -68,7 +67,7 @@ class Favourites extends ImmutablePureComponent { }, 300, { leading: true }) render () { - const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; + const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; const pinned = !!columnId; const emptyMessage = ; @@ -93,7 +92,6 @@ class Favourites extends ImmutablePureComponent { hasMore={hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/favourites/index.js b/app/javascript/mastodon/features/favourites/index.js index 3636045f0..f060068a4 100644 --- a/app/javascript/mastodon/features/favourites/index.js +++ b/app/javascript/mastodon/features/favourites/index.js @@ -27,7 +27,6 @@ class Favourites extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, accountIds: ImmutablePropTypes.list, multiColumn: PropTypes.bool, intl: PropTypes.object.isRequired, @@ -50,7 +49,7 @@ class Favourites extends ImmutablePureComponent { } render () { - const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props; + const { intl, accountIds, multiColumn } = this.props; if (!accountIds) { return ( @@ -74,7 +73,6 @@ class Favourites extends ImmutablePureComponent { diff --git a/app/javascript/mastodon/features/follow_requests/index.js b/app/javascript/mastodon/features/follow_requests/index.js index 18df9d25c..1f9b635bb 100644 --- a/app/javascript/mastodon/features/follow_requests/index.js +++ b/app/javascript/mastodon/features/follow_requests/index.js @@ -32,7 +32,6 @@ class FollowRequests extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, hasMore: PropTypes.bool, isLoading: PropTypes.bool, accountIds: ImmutablePropTypes.list, @@ -51,7 +50,7 @@ class FollowRequests extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, shouldUpdateScroll, accountIds, hasMore, multiColumn, locked, domain, isLoading } = this.props; + const { intl, accountIds, hasMore, multiColumn, locked, domain, isLoading } = this.props; if (!accountIds) { return ( @@ -80,7 +79,6 @@ class FollowRequests extends ImmutablePureComponent { onLoadMore={this.handleLoadMore} hasMore={hasMore} isLoading={isLoading} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} prepend={unlockedPrependMessage} diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js index ae00d13d3..ee747f0da 100644 --- a/app/javascript/mastodon/features/followers/index.js +++ b/app/javascript/mastodon/features/followers/index.js @@ -43,7 +43,6 @@ class Followers extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, accountIds: ImmutablePropTypes.list, hasMore: PropTypes.bool, isLoading: PropTypes.bool, @@ -73,7 +72,7 @@ class Followers extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; + const { accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -112,7 +111,6 @@ class Followers extends ImmutablePureComponent { hasMore={hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} - shouldUpdateScroll={shouldUpdateScroll} prepend={} alwaysPrepend append={remoteMessage} diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js index 666ec7a7f..804df803e 100644 --- a/app/javascript/mastodon/features/following/index.js +++ b/app/javascript/mastodon/features/following/index.js @@ -43,7 +43,6 @@ class Following extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, accountIds: ImmutablePropTypes.list, hasMore: PropTypes.bool, isLoading: PropTypes.bool, @@ -73,7 +72,7 @@ class Following extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; + const { accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -112,7 +111,6 @@ class Following extends ImmutablePureComponent { hasMore={hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} - shouldUpdateScroll={shouldUpdateScroll} prepend={} alwaysPrepend append={remoteMessage} diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.js b/app/javascript/mastodon/features/hashtag_timeline/index.js index 5ccd9f8ea..6a808eb30 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/hashtag_timeline/index.js @@ -24,7 +24,6 @@ class HashtagTimeline extends React.PureComponent { params: PropTypes.object.isRequired, columnId: PropTypes.string, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, hasUnread: PropTypes.bool, multiColumn: PropTypes.bool, }; @@ -130,7 +129,7 @@ class HashtagTimeline extends React.PureComponent { } render () { - const { shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props; + const { hasUnread, columnId, multiColumn } = this.props; const { id, local } = this.props.params; const pinned = !!columnId; @@ -156,7 +155,6 @@ class HashtagTimeline extends React.PureComponent { timelineId={`hashtag:${id}${local ? ':local' : ''}`} onLoadMore={this.handleLoadMore} emptyMessage={} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/home_timeline/index.js b/app/javascript/mastodon/features/home_timeline/index.js index b85c69af7..dc440f2fe 100644 --- a/app/javascript/mastodon/features/home_timeline/index.js +++ b/app/javascript/mastodon/features/home_timeline/index.js @@ -34,7 +34,6 @@ class HomeTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, isPartial: PropTypes.bool, @@ -112,7 +111,7 @@ class HomeTimeline extends React.PureComponent { } render () { - const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; + const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; const pinned = !!columnId; let announcementsButton = null; @@ -154,7 +153,6 @@ class HomeTimeline extends React.PureComponent { onLoadMore={this.handleLoadMore} timelineId='home' emptyMessage={ }} />} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js index 2ae5e181b..9b42f18ff 100644 --- a/app/javascript/mastodon/features/list_timeline/index.js +++ b/app/javascript/mastodon/features/list_timeline/index.js @@ -41,7 +41,6 @@ class ListTimeline extends React.PureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, columnId: PropTypes.string, hasUnread: PropTypes.bool, multiColumn: PropTypes.bool, @@ -142,7 +141,7 @@ class ListTimeline extends React.PureComponent { } render () { - const { shouldUpdateScroll, hasUnread, columnId, multiColumn, list, intl } = this.props; + const { hasUnread, columnId, multiColumn, list, intl } = this.props; const { id } = this.props.params; const pinned = !!columnId; const title = list ? list.get('title') : id; @@ -207,7 +206,6 @@ class ListTimeline extends React.PureComponent { timelineId={`list:${id}`} onLoadMore={this.handleLoadMore} emptyMessage={} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/lists/index.js b/app/javascript/mastodon/features/lists/index.js index ca1fa1f5e..29c311809 100644 --- a/app/javascript/mastodon/features/lists/index.js +++ b/app/javascript/mastodon/features/lists/index.js @@ -48,7 +48,7 @@ class Lists extends ImmutablePureComponent { } render () { - const { intl, shouldUpdateScroll, lists, multiColumn } = this.props; + const { intl, lists, multiColumn } = this.props; if (!lists) { return ( @@ -68,7 +68,6 @@ class Lists extends ImmutablePureComponent { } bindToDocument={!multiColumn} diff --git a/app/javascript/mastodon/features/mutes/index.js b/app/javascript/mastodon/features/mutes/index.js index 17ff5c762..c1d50d194 100644 --- a/app/javascript/mastodon/features/mutes/index.js +++ b/app/javascript/mastodon/features/mutes/index.js @@ -29,7 +29,6 @@ class Mutes extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, hasMore: PropTypes.bool, isLoading: PropTypes.bool, accountIds: ImmutablePropTypes.list, @@ -46,7 +45,7 @@ class Mutes extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, shouldUpdateScroll, hasMore, accountIds, multiColumn, isLoading } = this.props; + const { intl, hasMore, accountIds, multiColumn, isLoading } = this.props; if (!accountIds) { return ( @@ -66,7 +65,6 @@ class Mutes extends ImmutablePureComponent { onLoadMore={this.handleLoadMore} hasMore={hasMore} isLoading={isLoading} - shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} bindToDocument={!multiColumn} > diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index 1a621eca9..a6a277d7e 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -74,7 +74,6 @@ class Notifications extends React.PureComponent { notifications: ImmutablePropTypes.list.isRequired, showFilterBar: PropTypes.bool.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, intl: PropTypes.object.isRequired, isLoading: PropTypes.bool, isUnread: PropTypes.bool, @@ -176,7 +175,7 @@ class Notifications extends React.PureComponent { }; render () { - const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar, lastReadId, canMarkAsRead, needsNotificationPermission } = this.props; + const { intl, notifications, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar, lastReadId, canMarkAsRead, needsNotificationPermission } = this.props; const pinned = !!columnId; const emptyMessage = ; @@ -227,7 +226,6 @@ class Notifications extends React.PureComponent { onLoadPending={this.handleLoadPending} onScrollToTop={this.handleScrollToTop} onScroll={this.handleScroll} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} > {scrollableContent} diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.js b/app/javascript/mastodon/features/picture_in_picture/components/footer.js index 1ecb18bf8..f5ce50ac8 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.js +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.js @@ -114,7 +114,11 @@ class Footer extends ImmutablePureComponent { return; } - const { status } = this.props; + const { status, onClose } = this.props; + + if (onClose) { + onClose(); + } router.history.push(`/statuses/${status.get('id')}`); } diff --git a/app/javascript/mastodon/features/pinned_statuses/index.js b/app/javascript/mastodon/features/pinned_statuses/index.js index 6c0ef7638..67b13f10a 100644 --- a/app/javascript/mastodon/features/pinned_statuses/index.js +++ b/app/javascript/mastodon/features/pinned_statuses/index.js @@ -24,7 +24,6 @@ class PinnedStatuses extends ImmutablePureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, statusIds: ImmutablePropTypes.list.isRequired, intl: PropTypes.object.isRequired, hasMore: PropTypes.bool.isRequired, @@ -44,7 +43,7 @@ class PinnedStatuses extends ImmutablePureComponent { } render () { - const { intl, shouldUpdateScroll, statusIds, hasMore, multiColumn } = this.props; + const { intl, statusIds, hasMore, multiColumn } = this.props; return ( @@ -53,7 +52,6 @@ class PinnedStatuses extends ImmutablePureComponent { statusIds={statusIds} scrollKey='pinned_statuses' hasMore={hasMore} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/public_timeline/index.js b/app/javascript/mastodon/features/public_timeline/index.js index 988b1b070..b1d5518af 100644 --- a/app/javascript/mastodon/features/public_timeline/index.js +++ b/app/javascript/mastodon/features/public_timeline/index.js @@ -43,7 +43,6 @@ class PublicTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, intl: PropTypes.object.isRequired, columnId: PropTypes.string, multiColumn: PropTypes.bool, @@ -106,7 +105,7 @@ class PublicTimeline extends React.PureComponent { } render () { - const { intl, shouldUpdateScroll, columnId, hasUnread, multiColumn, onlyMedia, onlyRemote } = this.props; + const { intl, columnId, hasUnread, multiColumn, onlyMedia, onlyRemote } = this.props; const pinned = !!columnId; return ( @@ -130,7 +129,6 @@ class PublicTimeline extends React.PureComponent { trackScroll={!pinned} scrollKey={`public_timeline-${columnId}`} emptyMessage={} - shouldUpdateScroll={shouldUpdateScroll} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/reblogs/index.js b/app/javascript/mastodon/features/reblogs/index.js index df9079b8e..7704a049f 100644 --- a/app/javascript/mastodon/features/reblogs/index.js +++ b/app/javascript/mastodon/features/reblogs/index.js @@ -27,7 +27,6 @@ class Reblogs extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - shouldUpdateScroll: PropTypes.func, accountIds: ImmutablePropTypes.list, multiColumn: PropTypes.bool, intl: PropTypes.object.isRequired, @@ -50,7 +49,7 @@ class Reblogs extends ImmutablePureComponent { } render () { - const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props; + const { intl, accountIds, multiColumn } = this.props; if (!accountIds) { return ( @@ -74,7 +73,6 @@ class Reblogs extends ImmutablePureComponent { diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index df8362a1b..907236bb8 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -45,7 +45,7 @@ import { initBlockModal } from '../../actions/blocks'; import { initBoostModal } from '../../actions/boosts'; import { initReport } from '../../actions/reports'; import { makeGetStatus, makeGetPictureInPicture } from '../../selectors'; -import { ScrollContainer } from 'react-router-scroll-4'; +import ScrollContainer from 'mastodon/containers/scroll_container'; import ColumnBackButton from '../../components/column_back_button'; import ColumnHeader from '../../components/column_header'; import StatusContainer from '../../containers/status_container'; @@ -83,7 +83,7 @@ const makeMapStateToProps = () => { ancestorsIds = ancestorsIds.withMutations(mutable => { let id = statusId; - while (id) { + while (id && !mutable.includes(id)) { mutable.unshift(id); id = inReplyTos.get(id); } @@ -101,7 +101,7 @@ const makeMapStateToProps = () => { const ids = [statusId]; while (ids.length > 0) { - let id = ids.shift(); + let id = ids.pop(); const replies = contextReplies.get(id); if (statusId !== id) { @@ -110,7 +110,7 @@ const makeMapStateToProps = () => { if (replies) { replies.reverse().forEach(reply => { - ids.unshift(reply); + if (!ids.includes(reply) && !descendantsIds.includes(reply) && statusId !== reply) ids.push(reply); }); } } @@ -498,7 +498,7 @@ class Status extends ImmutablePureComponent { render () { let ancestors, descendants; - const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props; + const { status, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props; const { fullscreen } = this.state; if (status === null) { @@ -541,7 +541,7 @@ class Status extends ImmutablePureComponent { )} /> - +
{ancestors} diff --git a/app/javascript/mastodon/features/ui/components/audio_modal.js b/app/javascript/mastodon/features/ui/components/audio_modal.js index 0676bd9cf..c46fefce8 100644 --- a/app/javascript/mastodon/features/ui/components/audio_modal.js +++ b/app/javascript/mastodon/features/ui/components/audio_modal.js @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import Audio from 'mastodon/features/audio'; import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { previewState } from './video_modal'; import Footer from 'mastodon/features/picture_in_picture/components/footer'; const mapStateToProps = (state, { statusId }) => ({ @@ -25,32 +24,6 @@ class AudioModal extends ImmutablePureComponent { onChangeBackgroundColor: PropTypes.func.isRequired, }; - static contextTypes = { - router: PropTypes.object, - }; - - componentDidMount () { - if (this.context.router) { - const history = this.context.router.history; - - history.push(history.location.pathname, previewState); - - this.unlistenHistory = history.listen(() => { - this.props.onClose(); - }); - } - } - - componentWillUnmount () { - if (this.context.router) { - this.unlistenHistory(); - - if (this.context.router.history.location.state === previewState) { - this.context.router.history.goBack(); - } - } - } - render () { const { media, accountStaticAvatar, statusId, onClose } = this.props; const options = this.props.options || {}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modal.js b/app/javascript/mastodon/features/ui/components/confirmation_modal.js index 1227fa453..65d97ca16 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modal.js +++ b/app/javascript/mastodon/features/ui/components/confirmation_modal.js @@ -13,15 +13,22 @@ class ConfirmationModal extends React.PureComponent { onConfirm: PropTypes.func.isRequired, secondary: PropTypes.string, onSecondary: PropTypes.func, + closeWhenConfirm: PropTypes.bool, intl: PropTypes.object.isRequired, }; + static defaultProps = { + closeWhenConfirm: true, + }; + componentDidMount() { this.button.focus(); } handleClick = () => { - this.props.onClose(); + if (this.props.closeWhenConfirm) { + this.props.onClose(); + } this.props.onConfirm(); } diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js index 55f7c936a..b4b70f1fd 100644 --- a/app/javascript/mastodon/features/ui/components/link_footer.js +++ b/app/javascript/mastodon/features/ui/components/link_footer.js @@ -17,6 +17,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ dispatch(openModal('CONFIRM', { message: intl.formatMessage(messages.logoutMessage), confirm: intl.formatMessage(messages.logoutConfirm), + closeWhenConfirm: false, onConfirm: () => logOut(), })); }, diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js index 08da10330..061776e24 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.js +++ b/app/javascript/mastodon/features/ui/components/media_modal.js @@ -20,8 +20,6 @@ const messages = defineMessages({ next: { id: 'lightbox.next', defaultMessage: 'Next' }, }); -export const previewState = 'previewMediaModal'; - export default @injectIntl class MediaModal extends ImmutablePureComponent { @@ -37,10 +35,6 @@ class MediaModal extends ImmutablePureComponent { volume: PropTypes.number, }; - static contextTypes = { - router: PropTypes.object, - }; - state = { index: null, navigationHidden: false, @@ -98,16 +92,6 @@ class MediaModal extends ImmutablePureComponent { componentDidMount () { window.addEventListener('keydown', this.handleKeyDown, false); - if (this.context.router) { - const history = this.context.router.history; - - history.push(history.location.pathname, previewState); - - this.unlistenHistory = history.listen(() => { - this.props.onClose(); - }); - } - this._sendBackgroundColor(); } @@ -131,14 +115,6 @@ class MediaModal extends ImmutablePureComponent { componentWillUnmount () { window.removeEventListener('keydown', this.handleKeyDown); - if (this.context.router) { - this.unlistenHistory(); - - if (this.context.router.history.location.state === previewState) { - this.context.router.history.goBack(); - } - } - this.props.onChangeBackgroundColor(null); } diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js index 2f13a175a..7e8e1329d 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.js +++ b/app/javascript/mastodon/features/ui/components/video_modal.js @@ -6,8 +6,6 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import Footer from 'mastodon/features/picture_in_picture/components/footer'; import { getAverageFromBlurhash } from 'mastodon/blurhash'; -export const previewState = 'previewVideoModal'; - export default class VideoModal extends ImmutablePureComponent { static propTypes = { @@ -22,19 +20,9 @@ export default class VideoModal extends ImmutablePureComponent { onChangeBackgroundColor: PropTypes.func.isRequired, }; - static contextTypes = { - router: PropTypes.object, - }; - componentDidMount () { - const { router } = this.context; const { media, onChangeBackgroundColor, onClose } = this.props; - if (router) { - router.history.push(router.history.location.pathname, previewState); - this.unlistenHistory = router.history.listen(() => onClose()); - } - const backgroundColor = getAverageFromBlurhash(media.get('blurhash')); if (backgroundColor) { @@ -42,18 +30,6 @@ export default class VideoModal extends ImmutablePureComponent { } } - componentWillUnmount () { - const { router } = this.context; - - if (router) { - this.unlistenHistory(); - - if (router.history.location.state === previewState) { - router.history.goBack(); - } - } - } - render () { const { media, statusId, onClose } = this.props; const options = this.props.options || {}; diff --git a/app/javascript/mastodon/features/ui/containers/modal_container.js b/app/javascript/mastodon/features/ui/containers/modal_container.js index 2d27180f7..ad1e8a2ee 100644 --- a/app/javascript/mastodon/features/ui/containers/modal_container.js +++ b/app/javascript/mastodon/features/ui/containers/modal_container.js @@ -3,8 +3,8 @@ import { closeModal } from '../../../actions/modal'; import ModalRoot from '../components/modal_root'; const mapStateToProps = state => ({ - type: state.get('modal').modalType, - props: state.get('modal').modalProps, + type: state.getIn(['modal', 0, 'modalType'], null), + props: state.getIn(['modal', 0, 'modalProps'], {}), }); const mapDispatchToProps = dispatch => ({ diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index c8c82db46..8df436b70 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -54,8 +54,6 @@ import { FollowRecommendations, } from './util/async-components'; import { me } from '../../initial_state'; -import { previewState as previewMediaState } from './components/media_modal'; -import { previewState as previewVideoState } from './components/video_modal'; import { closeOnboarding, INTRODUCTION_VERSION } from 'mastodon/actions/onboarding'; // Dummy import, to make sure that ends up in the application bundle. @@ -138,10 +136,6 @@ class SwitchingColumnsArea extends React.PureComponent { } } - shouldUpdateScroll (_, { location }) { - return location.state !== previewMediaState && location.state !== previewVideoState; - } - setRef = c => { if (c) { this.node = c.getWrappedInstance(); @@ -158,38 +152,38 @@ class SwitchingColumnsArea extends React.PureComponent { {redirect} - - - - - - - - - + + + + + + + + + - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -361,9 +355,9 @@ class UI extends React.PureComponent { this.props.dispatch(closeOnboarding()); } + this.props.dispatch(fetchMarkers()); this.props.dispatch(expandHomeTimeline()); this.props.dispatch(expandNotifications()); - setTimeout(() => this.props.dispatch(fetchMarkers()), 500); setTimeout(() => this.props.dispatch(fetchFilters()), 500); this.hotkeys.__mousetrap__.stopCallback = (e, element) => { diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index 1b311b04d..c1eadb5a3 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 92b11ae3f..4abe83cda 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -31,7 +31,7 @@ "account.moved_to": "Uživatel {name} se přesunul na:", "account.mute": "Skrýt @{name}", "account.mute_notifications": "Skrýt oznámení od @{name}", - "account.muted": "Účet skryt", + "account.muted": "Skryt", "account.never_active": "Nikdy", "account.posts": "Příspěvky", "account.posts_with_replies": "Příspěvky a odpovědi", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 6f0ed524e..764442bfa 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1078,10 +1078,6 @@ "defaultMessage": "Search...", "id": "emoji_button.search" }, - { - "defaultMessage": "No emojos!! (╯°□°)╯︵ ┻━┻", - "id": "emoji_button.not_found" - }, { "defaultMessage": "Custom", "id": "emoji_button.custom" @@ -1125,6 +1121,10 @@ { "defaultMessage": "Flags", "id": "emoji_button.flags" + }, + { + "defaultMessage": "No matching emojis found", + "id": "emoji_button.not_found" } ], "path": "app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.json" diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e848530c4..fb9e70f84 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index f8453e856..71ada86ac 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -142,7 +142,7 @@ "emoji_button.food": "Comida y bebida", "emoji_button.label": "Insertar emoji", "emoji_button.nature": "Naturaleza", - "emoji_button.not_found": "¡¡No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No se encontraron emojis coincidentes", "emoji_button.objects": "Objetos", "emoji_button.people": "Gente", "emoji_button.recent": "Usados frecuentemente", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 2551cdaee..f0fbee142 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -22,7 +22,7 @@ "account.follows.empty": "Este usuario todavía no sigue a nadie.", "account.follows_you": "Te sigue", "account.hide_reblogs": "Ocultar retoots de @{name}", - "account.joined": "Joined {date}", + "account.joined": "Se unió el {date}", "account.last_status": "Última actividad", "account.link_verified_on": "El proprietario de este link fue comprobado el {date}", "account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.", @@ -98,7 +98,7 @@ "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones", "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción", "compose_form.publish": "Tootear", - "compose_form.publish_loud": "{publish}!", + "compose_form.publish_loud": "¡{publish}!", "compose_form.sensitive.hide": "Marcar multimedia como sensible", "compose_form.sensitive.marked": "Material marcado como sensible", "compose_form.sensitive.unmarked": "Material no marcado como sensible", @@ -160,11 +160,11 @@ "empty_column.domain_blocks": "Todavía no hay dominios ocultos.", "empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.", "empty_column.favourites": "Nadie ha marcado este toot como preferido. Cuando alguien lo haga, aparecerá aquí.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", + "empty_column.follow_recommendations": "Parece que no se ha podido generar ninguna sugerencia para ti. Puedes probar a buscar a gente que quizá conozcas o explorar los hashtags que están en tendencia.", "empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.", "empty_column.hashtag": "No hay nada en este hashtag aún.", "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.", - "empty_column.home.suggestions": "See some suggestions", + "empty_column.home.suggestions": "Ver algunas sugerencias", "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.", "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.", "empty_column.mutes": "Aún no has silenciado a ningún usuario.", @@ -177,8 +177,8 @@ "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles", "errors.unexpected_crash.report_issue": "Informar de un problema/error", "follow_recommendations.done": "Hecho", - "follow_recommendations.heading": "¡Sigue a la gente cuyas publicaciones te gustaría ver! Aquí tienes algunas sugerencias.", - "follow_recommendations.lead": "Los mensajes de las personas que sigues aparecerán en orden cronológico en el Inicio. No tengas miedo de cometer errores, ¡puedes dejar de seguir a la gente fácilmente en cualquier momento!", + "follow_recommendations.heading": "¡Sigue a gente que publique cosas que te gusten! Aquí tienes algunas sugerencias.", + "follow_recommendations.lead": "Las publicaciones de la gente a la que sigas aparecerán ordenadas cronológicamente en Inicio. No tengas miedo de cometer errores, ¡puedes dejarles de seguir en cualquier momento con la misma facilidad!", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.", @@ -335,7 +335,7 @@ "picture_in_picture.restore": "Restaurar", "poll.closed": "Cerrada", "poll.refresh": "Actualizar", - "poll.total_people": "{count, plural, one {# person} other {# people}}", + "poll.total_people": "{count, plural, one {# persona} other {# personas}}", "poll.total_votes": "{count, plural, one {# voto} other {# votos}}", "poll.vote": "Votar", "poll.voted": "Has votado a favor de esta respuesta", @@ -353,11 +353,11 @@ "refresh": "Actualizar", "regeneration_indicator.label": "Cargando…", "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!", - "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", + "relative_time.days": "{number} d", + "relative_time.hours": "{number} h", "relative_time.just_now": "ahora", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", + "relative_time.minutes": "{number} m", + "relative_time.seconds": "{number} s", "relative_time.today": "hoy", "reply_indicator.cancel": "Cancelar", "report.forward": "Reenviar a {target}", @@ -439,9 +439,9 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} hablando", "trends.trending_now": "Tendencia ahora", "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", - "units.short.billion": "{count}B", - "units.short.million": "{count}M", - "units.short.thousand": "{count}K", + "units.short.billion": "{count} MM", + "units.short.million": "{count} M", + "units.short.thousand": "{count} K", "upload_area.title": "Arrastra y suelta para subir", "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Límite de subida de archivos excedido.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 926a57abf..161dc5f30 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -98,7 +98,7 @@ "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones", "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción", "compose_form.publish": "Tootear", - "compose_form.publish_loud": "{publish}!", + "compose_form.publish_loud": "¡{publish}!", "compose_form.sensitive.hide": "Marcar multimedia como sensible", "compose_form.sensitive.marked": "Material marcado como sensible", "compose_form.sensitive.unmarked": "Material no marcado como sensible", @@ -340,7 +340,7 @@ "picture_in_picture.restore": "Restaurar", "poll.closed": "Cerrada", "poll.refresh": "Actualizar", - "poll.total_people": "{count, plural, one {# person} other {# people}}", + "poll.total_people": "{count, plural, one {# persona} other {# personas}}", "poll.total_votes": "{count, plural, one {# voto} other {# votos}}", "poll.vote": "Votar", "poll.voted": "Has votado a favor de esta respuesta", @@ -358,11 +358,11 @@ "refresh": "Actualizar", "regeneration_indicator.label": "Cargando…", "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!", - "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", + "relative_time.days": "{number} d", + "relative_time.hours": "{number} h", "relative_time.just_now": "ahora", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", + "relative_time.minutes": "{number} m", + "relative_time.seconds": "{number} s", "relative_time.today": "hoy", "reply_indicator.cancel": "Cancelar", "report.forward": "Reenviar a {target}", @@ -445,9 +445,9 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} hablando", "trends.trending_now": "Tendencia ahora", "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", - "units.short.billion": "{count}B", - "units.short.million": "{count}M", - "units.short.thousand": "{count}K", + "units.short.billion": "{count} MM", + "units.short.million": "{count} M", + "units.short.thousand": "{count} K", "upload_area.title": "Arrastra y suelta para subir", "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Límite de subida de archivos excedido.", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 7daa9386a..5a0f378c1 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -102,8 +102,8 @@ "compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}", "compose_form.sensitive.marked": "{count, plural, one {Tha comharra ris a’ mheadhan gu bheil e frionasach} two {Tha comharra ris na meadhanan gu bheil iad frionasach} few {Tha comharra ris na meadhanan gu bheil iad frionasach} other {Tha comharra ris na meadhanan gu bheil iad frionasach}}", "compose_form.sensitive.unmarked": "{count, plural, one {Chan eil comharra ris a’ mheadhan gun robh e frionasach} two {Chan eil comharra ris na meadhanan gun robh iad frionasach} few {Chan eil comharra ris na meadhanan gun robh iad frionasach} other {Chan eil comharra ris na meadhanan gun robh iad frionasach}}", - "compose_form.spoiler.marked": "Tha an teacsa falaichte air cùlaibh rabhaidh", - "compose_form.spoiler.unmarked": "Chan eil an teacsa flaichte", + "compose_form.spoiler.marked": "Thoir air falbh an rabhadh susbainte", + "compose_form.spoiler.unmarked": "Cuir rabhadh susbainte ris", "compose_form.spoiler_placeholder": "Sgrìobh an rabhadh agad an-seo", "confirmation_modal.cancel": "Sguir dheth", "confirmations.block.block_and_report": "Bac ⁊ dèan gearan", @@ -142,7 +142,7 @@ "emoji_button.food": "Biadh ⁊ deoch", "emoji_button.label": "Cuir a-steach Emoji", "emoji_button.nature": "An nàdar", - "emoji_button.not_found": "Chan eil Emoji gnàthaichte ann!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Cha deach Emoji iomchaidh a lorg", "emoji_button.objects": "Nithean", "emoji_button.people": "Daoine", "emoji_button.recent": "Air a chleachdadh o chionn ghoirid", @@ -163,12 +163,12 @@ "empty_column.follow_recommendations": "Chan urrainn dhuinn dad a mholadh dhut. Cleachd gleus an luirg feuch an lorg thu daoine air a bheil thu eòlach no rùraich na tagaichean-hais a tha a’ treandadh.", "empty_column.follow_requests": "Chan eil iarrtas air leantainn agad fhathast. Nuair gheibh thu fear, nochdaidh e an-seo.", "empty_column.hashtag": "Chan eil dad san taga hais seo fhathast.", - "empty_column.home": "Tha an loidhne-ama dachaigh agad falamh! Tadhail air {public} no dèan lorg airson toiseach-tòiseachaidh a dhèanamh is tachairt ri càch.", + "empty_column.home": "Tha an loidhne-ama dachaigh agad falamh! Lean air barrachd dhaoine gus a lìonadh. {suggestions}", "empty_column.home.suggestions": "Faic moladh no dhà", "empty_column.list": "Chan eil dad air an liosta seo fhathast. Nuair a phostaicheas buill a tha air an liosta seo postaichean ùra, nochdaidh iad an-seo.", "empty_column.lists": "Chan eil liosta agad fhathast. Nuair chruthaicheas tu tè, nochdaidh i an-seo.", "empty_column.mutes": "Cha do mhùch thu cleachdaiche sam bith fhathast.", - "empty_column.notifications": "Cha d’ fhuair thu brath sam bith fhathast. Dèan eadar-ghnìomh le càch airson tòiseachadh air còmhradh.", + "empty_column.notifications": "Cha d’ fhuair thu brath sam bith fhathast. Nuair a ghabhas càch eadar-ghnìomh leat, chì thu an-seo e.", "empty_column.public": "Chan eil dad an-seo! Sgrìobh rudeigin gu poblach no lean air càch o fhrithealaichean eile a làimh airson seo a lìonadh", "error.unexpected_crash.explanation": "Air sàilleibh buga sa chòd againn no duilgheadas co-chòrdalachd leis a’ bhrabhsair, chan urrainn dhuinn an duilleag seo a shealltainn mar bu chòir.", "error.unexpected_crash.explanation_addons": "Cha b’ urrainn dhuinn an duilleag seo a shealltainn mar bu chòir. Tha sinn an dùil gu do dh’adhbharaich tuilleadan a’ bhrabhsair no inneal eadar-theangachaidh fèin-obrachail a’ mhearachd.", @@ -208,40 +208,40 @@ "intervals.full.days": "{number, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}", "intervals.full.hours": "{number, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}}", "intervals.full.minutes": "{number, plural, one {# mhionaid} two {# mhionaid} few {# mionaidean} other {# mionaid}}", - "keyboard_shortcuts.back": "a sheòladh air ais", - "keyboard_shortcuts.blocked": "a dh’fhosgladh liosta nan cleachdaichean bacte", - "keyboard_shortcuts.boost": "’ga bhrosnachadh", - "keyboard_shortcuts.column": "a chur am fòcas air post air fear dhe na colbhan", - "keyboard_shortcuts.compose": "a chur am fòcas air raon teacsa an sgrìobhaidh", + "keyboard_shortcuts.back": "Seòl air ais", + "keyboard_shortcuts.blocked": "Fosgail liosta nan cleachdaichean bacte", + "keyboard_shortcuts.boost": "Brosnaich post", + "keyboard_shortcuts.column": "Cuir am fòcas air colbh", + "keyboard_shortcuts.compose": "Cuir am fòcas air raon teacsa an sgrìobhaidh", "keyboard_shortcuts.description": "Tuairisgeul", - "keyboard_shortcuts.direct": "a dh’fhosgladh colbh nan teachdaireachdan dìreach", - "keyboard_shortcuts.down": "a ghluasad sìos air an liosta", - "keyboard_shortcuts.enter": "a dh’fhosgladh a’ phuist", - "keyboard_shortcuts.favourite": "’ga chur ris na h-annsachdan", - "keyboard_shortcuts.favourites": "a dh’fhosgladh liosta nan annsachdan", - "keyboard_shortcuts.federated": "a dh’fhosgladh na loidhne-ama co-naisgte", + "keyboard_shortcuts.direct": "Fosgail colbh nan teachdaireachdan dìreach", + "keyboard_shortcuts.down": "Gluais sìos air an liosta", + "keyboard_shortcuts.enter": "Fosgail post", + "keyboard_shortcuts.favourite": "Cuir post ris na h-annsachdan", + "keyboard_shortcuts.favourites": "Fosgail liosta nan annsachdan", + "keyboard_shortcuts.federated": "Fosgail an loidhne-ama cho-naisgte", "keyboard_shortcuts.heading": "Ath-ghoiridean a’ mheur-chlàir", - "keyboard_shortcuts.home": "a dh’fhosgladh loidhne-ama na dachaigh", + "keyboard_shortcuts.home": "Fosgail loidhne-ama na dachaigh", "keyboard_shortcuts.hotkey": "Grad-iuchair", - "keyboard_shortcuts.legend": "a shealltainn a’ chlàir-mhìneachaidh seo", - "keyboard_shortcuts.local": "a dh’fhosgladh na loidhne-ama ionadail", - "keyboard_shortcuts.mention": "a thoirt iomradh dhan ùghdar", - "keyboard_shortcuts.muted": "a dh’fhosgladh liosta nan cleachdaichean mùchte", - "keyboard_shortcuts.my_profile": "a dh’fhosgladh na pròifil agad", - "keyboard_shortcuts.notifications": "a dh’fhosgladh colbh nam brathan", - "keyboard_shortcuts.open_media": "a dh’fhosgladh nam meadhanan", - "keyboard_shortcuts.pinned": "a dh’fhosgladh liosta na postaichean prìnichte", - "keyboard_shortcuts.profile": "a dh’fhosgladh pròifil an ùghdair", - "keyboard_shortcuts.reply": "a fhreagairt", - "keyboard_shortcuts.requests": "a dh’fhosgladh liosta nan iarrtasan leantainn", - "keyboard_shortcuts.search": "a chur am fòcas air a lorg", - "keyboard_shortcuts.spoilers": "a shealltainn/fhalach raon an rabhaidh susbainte", - "keyboard_shortcuts.start": "a dh’fhosgladh colbh “dèan toiseach-tòiseachaidh”", - "keyboard_shortcuts.toggle_hidden": "a shealltainn/fhalach teacsa fo rabhadh susbainte", - "keyboard_shortcuts.toggle_sensitivity": "a shealltainn/fhalach meadhanan", - "keyboard_shortcuts.toot": "a thòiseachadh air post ùr", - "keyboard_shortcuts.unfocus": "a thoirt am fòcas far raon teacsa an sgrìobhaidh/an luirg", - "keyboard_shortcuts.up": "a ghluasad suas air an liosta", + "keyboard_shortcuts.legend": "Seall an clàr-mìneachaidh seo", + "keyboard_shortcuts.local": "Fosgail an loidhne-ama ionadail", + "keyboard_shortcuts.mention": "Thoir iomradh dhan ùghdar", + "keyboard_shortcuts.muted": "Fosgail liosta nan cleachdaichean mùchte", + "keyboard_shortcuts.my_profile": "Fosgail a’ phròifil agad", + "keyboard_shortcuts.notifications": "Fosgail colbh nam brathan", + "keyboard_shortcuts.open_media": "Fosgail meadhan", + "keyboard_shortcuts.pinned": "Fosgail liosta nam postaichean prìnichte", + "keyboard_shortcuts.profile": "Fosgail pròifil an ùghdair", + "keyboard_shortcuts.reply": "Freagair do phost", + "keyboard_shortcuts.requests": "Fosgail liosta nan iarrtasan leantainn", + "keyboard_shortcuts.search": "Cuir am fòcas air a’ bhàr-luirg", + "keyboard_shortcuts.spoilers": "Seall/Falaich raon an rabhaidh susbainte", + "keyboard_shortcuts.start": "Fosgail an colbh “dèan toiseach-tòiseachaidh”", + "keyboard_shortcuts.toggle_hidden": "Seall/Falaich an teacsa fo rabhadh susbainte", + "keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan", + "keyboard_shortcuts.toot": "Tòisich air post ùr", + "keyboard_shortcuts.unfocus": "Thoir am fòcas far raon teacsa an sgrìobhaidh/an luirg", + "keyboard_shortcuts.up": "Gluais suas air an liosta", "lightbox.close": "Dùin", "lightbox.compress": "Co-theannaich bogsa sealladh an deilbh", "lightbox.expand": "Leudaich bogsa sealladh an deilbh", @@ -262,7 +262,7 @@ "lists.subheading": "Na liostaichean agad", "load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}", "loading_indicator.label": "’Ga luchdadh…", - "media_gallery.toggle_visible": "Falaich {number, plural, 1 {an dealbh} one {na dealbhan} two {na dealbhan} few {na dealbhan} other {na dealbhan}}", + "media_gallery.toggle_visible": "{number, plural, 1 {Falaich an dealbh} one {Falaich na dealbhan} two {Falaich na dealbhan} few {Falaich na dealbhan} other {Falaich na dealbhan}}", "missing_indicator.label": "Cha deach càil a lorg", "missing_indicator.sublabel": "Cha deach an goireas a lorg", "mute_modal.duration": "Faide", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index dafc4bb4b..2a87d5b7a 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -51,7 +51,7 @@ "alert.rate_limited.title": "Forgalomkorlátozás", "alert.unexpected.message": "Váratlan hiba történt.", "alert.unexpected.title": "Hoppá!", - "announcement.announcement": "Bejelentés", + "announcement.announcement": "Közlemény", "autosuggest_hashtag.per_week": "{count} hetente", "boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}", "bundle_column_error.body": "Valami hiba történt a komponens betöltése közben.", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 9529ff78b..49f182a2c 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insertar emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index a380954fb..a4c512809 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -5,7 +5,7 @@ "account.badges.group": "Gruppo", "account.block": "Blocca @{name}", "account.block_domain": "Blocca dominio {domain}", - "account.blocked": "Bloccat*", + "account.blocked": "Bloccato", "account.browse_more_on_origin_server": "Sfoglia ulteriormente sul profilo originale", "account.cancel_follow_request": "Annulla richiesta di seguire", "account.direct": "Messaggio diretto a @{name}", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 46f4d3b34..2f0dd9fd0 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 9b9e7e66b..cf2d0c406 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -85,9 +85,9 @@ "community.column_settings.local_only": "로컬만", "community.column_settings.media_only": "미디어만", "community.column_settings.remote_only": "원격만", - "compose_form.direct_message_warning": "이 툿은 멘션 된 유저들에게만 보여집니다.", + "compose_form.direct_message_warning": "이 게시물은 멘션 된 유저들에게만 보여집니다.", "compose_form.direct_message_warning_learn_more": "더 알아보기", - "compose_form.hashtag_warning": "이 툿은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 툿만이 해시태그로 검색 될 수 있습니다.", + "compose_form.hashtag_warning": "이 게시물은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 게시물만이 해시태그로 검색 될 수 있습니다.", "compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.", "compose_form.lock_disclaimer.lock": "비공개", "compose_form.placeholder": "지금 무엇을 하고 있나요?", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index e57398adb..53456b488 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -1,8 +1,8 @@ { - "account.account_note_header": "Note", + "account.account_note_header": "Pastaba", "account.add_or_remove_from_list": "Add or Remove from lists", "account.badges.bot": "Bot", - "account.badges.group": "Group", + "account.badges.group": "Grupė", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", @@ -14,7 +14,7 @@ "account.edit_profile": "Edit profile", "account.enable_notifications": "Notify me when @{name} posts", "account.endorse": "Feature on profile", - "account.follow": "Follow", + "account.follow": "Sekti", "account.followers": "Followers", "account.followers.empty": "No one follows this user yet.", "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", @@ -31,8 +31,8 @@ "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.never_active": "Never", + "account.muted": "Užtildytas", + "account.never_active": "Niekada", "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", @@ -43,20 +43,20 @@ "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unhide {domain}", "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", + "account.unfollow": "Nebesekti", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", "account_note.placeholder": "Click to add a note", "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", + "alert.unexpected.title": "Oi!", "announcement.announcement": "Announcement", "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", + "bundle_column_error.title": "Tinklo klaida", "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", "bundle_modal_error.retry": "Try again", @@ -66,22 +66,22 @@ "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", - "column.favourites": "Favourites", + "column.favourites": "Mėgstamiausi", "column.follow_requests": "Follow requests", "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", + "column.lists": "Sąrašai", + "column.mutes": "Užtildyti vartotojai", "column.notifications": "Notifications", "column.pins": "Pinned toot", "column.public": "Federated timeline", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", + "column_back_button.label": "Atgal", + "column_header.hide_settings": "Slėpti nustatymus", "column_header.moveLeft_settings": "Move column to the left", "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", + "column_header.pin": "Prisegti", + "column_header.show_settings": "Rodyti nustatymus", + "column_header.unpin": "Atsegti", + "column_subheading.settings": "Nustatymai", "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index 964571a58..2e1497f6a 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -142,7 +142,7 @@ "emoji_button.food": "Храна & Пијалаци", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Природа", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Објекти", "emoji_button.people": "Луѓе", "emoji_button.recent": "Најчесто користени", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 0303176b4..488484290 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -22,7 +22,7 @@ "account.follows.empty": "ഈ ഉപയോക്താവ് ആരേയും ഇതുവരെ പിന്തുടരുന്നില്ല.", "account.follows_you": "നിങ്ങളെ പിന്തുടരുന്നു", "account.hide_reblogs": "@{name} ബൂസ്റ്റ് ചെയ്തവ മറയ്കുക", - "account.joined": "Joined {date}", + "account.joined": "{date} ൽ ചേർന്നു", "account.last_status": "അവസാനം കണ്ടത്", "account.link_verified_on": "ഈ ലിങ്കിന്റെ ഉടമസ്തത {date} ഇൽ ഉറപ്പാക്കിയതാണ്", "account.locked_info": "ഈ അംഗത്വത്തിന്റെ സ്വകാര്യതാ നിലപാട് അനുസരിച്ച് പിന്തുടരുന്നവരെ തിരഞ്ഞെടുക്കാനുള്ള വിവേചനാധികാരം ഉടമസ്ഥനിൽ നിഷിപ്തമായിരിക്കുന്നു.", @@ -33,8 +33,8 @@ "account.mute_notifications": "@{name} യിൽ നിന്നുള്ള അറിയിപ്പുകൾ നിശബ്ദമാക്കുക", "account.muted": "നിശ്ശബ്ദമാക്കിയിരിക്കുന്നു", "account.never_active": "ഒരിക്കലും ഇല്ല", - "account.posts": "ടൂട്ടുകൾ", - "account.posts_with_replies": "ടൂട്ടുകളും മറുപടികളും", + "account.posts": "പോസ്റ്റുകൾ", + "account.posts_with_replies": "പോസ്റ്റുകളും മറുപടികളും", "account.report": "റിപ്പോർട്ട് ചെയ്യുക @{name}", "account.requested": "അനുവാദത്തിനായി കാത്തിരിക്കുന്നു. പിന്തുടരാനുള്ള അപേക്ഷ റദ്ദാക്കുവാൻ ഞെക്കുക", "account.share": "@{name} ന്റെ പ്രൊഫൈൽ പങ്കിടുക", @@ -75,7 +75,7 @@ "column.pins": "ഉറപ്പിച്ചു നിറുത്തിയിരിക്കുന്ന ടൂട്ടുകൾ", "column.public": "സംയുക്തമായ സമയരേഖ", "column_back_button.label": "പുറകിലേക്ക്", - "column_header.hide_settings": "സജ്ജീകരണങ്ങള്‍ മറയ്ക്കുക", + "column_header.hide_settings": "ക്രമീകരണങ്ങൾ മറയ്ക്കുക", "column_header.moveLeft_settings": "എഴുത്തുപംക്തി ഇടത്തോട്ട് മാറ്റുക", "column_header.moveRight_settings": "എഴുത്തുപംക്തി വലത്തോട്ട് മാറ്റുക", "column_header.pin": "ഉറപ്പിച്ചു നിറുത്തുക", @@ -398,7 +398,7 @@ "status.mute": "@{name}-നെ നിശ്ശബ്ദമാക്കുക", "status.mute_conversation": "Mute conversation", "status.open": "Expand this status", - "status.pin": "Pin on profile", + "status.pin": "പ്രൊഫൈലിൽ പിൻ ചെയ്യൂ", "status.pinned": "Pinned toot", "status.read_more": "കൂടുതൽ വായിക്കുക", "status.reblog": "ബൂസ്റ്റ്", @@ -422,7 +422,7 @@ "status.unpin": "Unpin from profile", "suggestions.dismiss": "നിർദ്ദേശം ഒഴിവാക്കൂ", "suggestions.header": "നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടാകാം…", - "tabs_bar.federated_timeline": "സംയുക്തമാക്കിയ", + "tabs_bar.federated_timeline": "സംയുക്തമായ", "tabs_bar.home": "ഹോം", "tabs_bar.local_timeline": "പ്രാദേശികം", "tabs_bar.notifications": "അറിയിപ്പുകൾ", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 371e42765..7fc59119d 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 490dab0d5..125f1c5d6 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -22,7 +22,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Boosts van @{name} verbergen", - "account.joined": "Joined {date}", + "account.joined": "Geregistreerd in {date}", "account.last_status": "Laatst actief", "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.", @@ -160,7 +160,7 @@ "empty_column.domain_blocks": "Er zijn nog geen geblokkeerde domeinen.", "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.", "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", + "empty_column.follow_recommendations": "Het lijkt er op dat er geen aanbevelingen voor jou aangemaakt kunnen worden. Je kunt proberen te zoeken naar mensen die je wellicht kent, zoeken op hashtags, de lokale en globale tijdlijnen bekijken of de gebruikersgids doorbladeren.", "empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.", "empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.", "empty_column.home": "Deze tijdlijn is leeg! Volg meer mensen om het te vullen. {suggestions}", @@ -267,7 +267,7 @@ "lists.subheading": "Jouw lijsten", "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}", "loading_indicator.label": "Laden…", - "media_gallery.toggle_visible": "Media verbergen", + "media_gallery.toggle_visible": "{number, plural, one {afbeelding verbergen} other {afbeeldingen verbergen}}", "missing_indicator.label": "Niet gevonden", "missing_indicator.sublabel": "Deze hulpbron kan niet gevonden worden", "mute_modal.duration": "Duur", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 1b311b04d..c1eadb5a3 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index bbf90af5d..25c913299 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -1,5 +1,5 @@ { - "account.account_note_header": "A tua nota para @{name}", + "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Adicionar ou remover das listas", "account.badges.bot": "Robô", "account.badges.group": "Grupo", @@ -46,7 +46,7 @@ "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", "account.unmute_notifications": "Deixar de silenciar @{name}", - "account_note.placeholder": "Nenhum comentário fornecido", + "account_note.placeholder": "Clique para adicionar nota", "alert.rate_limited.message": "Volte a tentar depois das {retry_time, time, medium}.", "alert.rate_limited.title": "Limite de tentativas", "alert.unexpected.message": "Ocorreu um erro inesperado.", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index bb5070529..d36ae4b2d 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -142,7 +142,7 @@ "emoji_button.food": "ආහාර සහ පාන", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "මිනිසුන්", "emoji_button.recent": "නිතර භාවිතා වූ", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index ab473fc18..5b6d65fab 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -27,7 +27,7 @@ "account.link_verified_on": "Ägarskap för detta konto kontrollerades den {date}", "account.locked_info": "Detta konto har låst integritetsstatus. Ägaren väljer manuellt vem som kan följa.", "account.media": "Media", - "account.mention": "Nämna @{name}", + "account.mention": "Nämn @{name}", "account.moved_to": "{name} har flyttat till:", "account.mute": "Tysta @{name}", "account.mute_notifications": "Stäng av notifieringar från @{name}", @@ -90,7 +90,7 @@ "compose_form.hashtag_warning": "Denna toot kommer inte att visas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.", "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.", "compose_form.lock_disclaimer.lock": "låst", - "compose_form.placeholder": "Vad funderar du på?", + "compose_form.placeholder": "Vad tänker du på?", "compose_form.poll.add_option": "Lägg till ett val", "compose_form.poll.duration": "Varaktighet för omröstning", "compose_form.poll.option_placeholder": "Val {number}", @@ -105,7 +105,7 @@ "compose_form.spoiler.marked": "Texten är dold bakom en varning", "compose_form.spoiler.unmarked": "Texten är inte dold", "compose_form.spoiler_placeholder": "Skriv din varning här", - "confirmation_modal.cancel": "Ångra", + "confirmation_modal.cancel": "Avbryt", "confirmations.block.block_and_report": "Blockera & rapportera", "confirmations.block.confirm": "Blockera", "confirmations.block.message": "Är du säker på att du vill blockera {name}?", @@ -128,7 +128,7 @@ "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?", "conversation.delete": "Radera konversation", "conversation.mark_as_read": "Markera som läst", - "conversation.open": "Se konversation", + "conversation.open": "Visa konversation", "conversation.with": "Med {names}", "directory.federated": "Från känt servernätverk", "directory.local": "Endast från {domain}", @@ -349,7 +349,7 @@ "privacy.change": "Justera sekretess", "privacy.direct.long": "Skicka endast till nämnda användare", "privacy.direct.short": "Direkt", - "privacy.private.long": "Skicka endast till följare", + "privacy.private.long": "Endast synligt för följare", "privacy.private.short": "Endast följare", "privacy.public.long": "Skicka till publik tidslinje", "privacy.public.short": "Publik", @@ -463,7 +463,7 @@ "upload_modal.choose_image": "Välj bild", "upload_modal.description_placeholder": "En snabb brun räv hoppar över den lata hunden", "upload_modal.detect_text": "Upptäck bildens text", - "upload_modal.edit_media": "Redigera meida", + "upload_modal.edit_media": "Redigera media", "upload_modal.hint": "Klicka eller dra cirkeln på förhandstitten för att välja den fokusering som alltid kommer synas på alla miniatyrer.", "upload_modal.preparing_ocr": "Förbereder OCR…", "upload_modal.preview_label": "Förhandstitt ({ratio})", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 1b311b04d..c1eadb5a3 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index c2ce475b8..1119c3800 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index f9f682143..17eaad7a0 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -121,7 +121,7 @@ "confirmations.mute.explanation": "นี่จะซ่อนโพสต์จากเขาและโพสต์ที่กล่าวถึงเขา แต่จะยังอนุญาตให้เขาเห็นโพสต์ของคุณและติดตามคุณ", "confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการซ่อน {name}?", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", - "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", + "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", "confirmations.reply.confirm": "ตอบกลับ", "confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "confirmations.unfollow.confirm": "เลิกติดตาม", @@ -142,7 +142,7 @@ "emoji_button.food": "อาหารและเครื่องดื่ม", "emoji_button.label": "แทรกอีโมจิ", "emoji_button.nature": "ธรรมชาติ", - "emoji_button.not_found": "ไม่มีอีโมโจ!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "ไม่พบอีโมจิที่ตรงกัน", "emoji_button.objects": "วัตถุ", "emoji_button.people": "ผู้คน", "emoji_button.recent": "ที่ใช้บ่อย", @@ -163,12 +163,12 @@ "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", "empty_column.follow_requests": "คุณยังไม่มีคำขอติดตามใด ๆ เมื่อคุณได้รับคำขอ คำขอจะปรากฏที่นี่", "empty_column.hashtag": "ยังไม่มีสิ่งใดในแฮชแท็กนี้", - "empty_column.home": "เส้นเวลาหน้าแรกของคุณว่างเปล่า! เยี่ยมชม {public} หรือใช้การค้นหาเพื่อเริ่มต้นใช้งานและพบปะผู้ใช้อื่น ๆ", + "empty_column.home": "เส้นเวลาหน้าแรกของคุณว่างเปล่า! ติดตามผู้คนเพิ่มเติมเพื่อเติมเส้นเวลาให้เต็ม {suggestions}", "empty_column.home.suggestions": "ดูข้อเสนอแนะบางอย่าง", "empty_column.list": "ยังไม่มีสิ่งใดในรายการนี้ เมื่อสมาชิกของรายการนี้โพสต์โพสต์ใหม่ โพสต์จะปรากฏที่นี่", "empty_column.lists": "คุณยังไม่มีรายการใด ๆ เมื่อคุณสร้างรายการ รายการจะปรากฏที่นี่", "empty_column.mutes": "คุณยังไม่ได้ซ่อนผู้ใช้ใด ๆ", - "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ โต้ตอบกับผู้อื่นเพื่อเริ่มการสนทนา", + "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ เมื่อผู้คนอื่น ๆ โต้ตอบกับคุณ คุณจะเห็นการแจ้งเตือนที่นี่", "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมให้เต็ม", "error.unexpected_crash.explanation": "เนื่องจากข้อบกพร่องในโค้ดของเราหรือปัญหาความเข้ากันได้ของเบราว์เซอร์ จึงไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง", "error.unexpected_crash.explanation_addons": "ไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง ข้อผิดพลาดนี้เป็นไปได้ว่าเกิดจากส่วนเสริมของเบราว์เซอร์หรือเครื่องมือการแปลอัตโนมัติ", @@ -213,40 +213,40 @@ "intervals.full.days": "{number, plural, other {# วัน}}", "intervals.full.hours": "{number, plural, other {# ชั่วโมง}}", "intervals.full.minutes": "{number, plural, other {# นาที}}", - "keyboard_shortcuts.back": "เพื่อนำทางย้อนกลับ", - "keyboard_shortcuts.blocked": "เพื่อเปิดรายการผู้ใช้ที่ปิดกั้นอยู่", - "keyboard_shortcuts.boost": "เพื่อดัน", - "keyboard_shortcuts.column": "เพื่อโฟกัสโพสต์ในหนึ่งในคอลัมน์", - "keyboard_shortcuts.compose": "เพื่อโฟกัสพื้นที่เขียนข้อความ", + "keyboard_shortcuts.back": "นำทางย้อนกลับ", + "keyboard_shortcuts.blocked": "เปิดรายการผู้ใช้ที่ปิดกั้นอยู่", + "keyboard_shortcuts.boost": "ดันโพสต์", + "keyboard_shortcuts.column": "โฟกัสคอลัมน์", + "keyboard_shortcuts.compose": "โฟกัสพื้นที่เขียนข้อความ", "keyboard_shortcuts.description": "คำอธิบาย", - "keyboard_shortcuts.direct": "เพื่อเปิดคอลัมน์ข้อความโดยตรง", - "keyboard_shortcuts.down": "เพื่อย้ายลงในรายการ", - "keyboard_shortcuts.enter": "เพื่อเปิดโพสต์", - "keyboard_shortcuts.favourite": "เพื่อชื่นชอบ", - "keyboard_shortcuts.favourites": "เพื่อเปิดรายการโปรด", - "keyboard_shortcuts.federated": "เพื่อเปิดเส้นเวลาที่ติดต่อกับภายนอก", + "keyboard_shortcuts.direct": "เปิดคอลัมน์ข้อความโดยตรง", + "keyboard_shortcuts.down": "ย้ายลงในรายการ", + "keyboard_shortcuts.enter": "เปิดโพสต์", + "keyboard_shortcuts.favourite": "ชื่นชอบโพสต์", + "keyboard_shortcuts.favourites": "เปิดรายการโปรด", + "keyboard_shortcuts.federated": "เปิดเส้นเวลาที่ติดต่อกับภายนอก", "keyboard_shortcuts.heading": "แป้นพิมพ์ลัด", - "keyboard_shortcuts.home": "เพื่อเปิดเส้นเวลาหน้าแรก", + "keyboard_shortcuts.home": "เปิดเส้นเวลาหน้าแรก", "keyboard_shortcuts.hotkey": "ปุ่มลัด", - "keyboard_shortcuts.legend": "เพื่อแสดงคำอธิบายนี้", - "keyboard_shortcuts.local": "เพื่อเปิดเส้นเวลาในเซิร์ฟเวอร์", - "keyboard_shortcuts.mention": "เพื่อกล่าวถึงผู้สร้าง", - "keyboard_shortcuts.muted": "เพื่อเปิดรายการผู้ใช้ที่ซ่อนอยู่", - "keyboard_shortcuts.my_profile": "เพื่อเปิดโปรไฟล์ของคุณ", - "keyboard_shortcuts.notifications": "เพื่อเปิดคอลัมน์การแจ้งเตือน", - "keyboard_shortcuts.open_media": "เพื่อเปิดสื่อ", - "keyboard_shortcuts.pinned": "เพื่อเปิดรายการโพสต์ที่ปักหมุด", - "keyboard_shortcuts.profile": "เพื่อเปิดโปรไฟล์ของผู้สร้าง", - "keyboard_shortcuts.reply": "เพื่อตอบกลับ", - "keyboard_shortcuts.requests": "เพื่อเปิดรายการคำขอติดตาม", - "keyboard_shortcuts.search": "เพื่อโฟกัสการค้นหา", - "keyboard_shortcuts.spoilers": "เพื่อแสดง/ซ่อนช่องกรอกคำเตือนเนื้อหา", - "keyboard_shortcuts.start": "เพื่อเปิดคอลัมน์ \"เริ่มต้นใช้งาน\"", - "keyboard_shortcuts.toggle_hidden": "เพื่อแสดง/ซ่อนข้อความที่อยู่หลังคำเตือนเนื้อหา", - "keyboard_shortcuts.toggle_sensitivity": "เพื่อแสดง/ซ่อนสื่อ", - "keyboard_shortcuts.toot": "เพื่อเริ่มโพสต์ใหม่", - "keyboard_shortcuts.unfocus": "เพื่อเลิกโฟกัสพื้นที่เขียนข้อความ/การค้นหา", - "keyboard_shortcuts.up": "เพื่อย้ายขึ้นในรายการ", + "keyboard_shortcuts.legend": "แสดงคำอธิบายนี้", + "keyboard_shortcuts.local": "เปิดเส้นเวลาในเซิร์ฟเวอร์", + "keyboard_shortcuts.mention": "กล่าวถึงผู้สร้าง", + "keyboard_shortcuts.muted": "เปิดรายการผู้ใช้ที่ซ่อนอยู่", + "keyboard_shortcuts.my_profile": "เปิดโปรไฟล์ของคุณ", + "keyboard_shortcuts.notifications": "เปิดคอลัมน์การแจ้งเตือน", + "keyboard_shortcuts.open_media": "เปิดสื่อ", + "keyboard_shortcuts.pinned": "เปิดรายการโพสต์ที่ปักหมุด", + "keyboard_shortcuts.profile": "เปิดโปรไฟล์ของผู้สร้าง", + "keyboard_shortcuts.reply": "ตอบกลับโพสต์", + "keyboard_shortcuts.requests": "เปิดรายการคำขอติดตาม", + "keyboard_shortcuts.search": "โฟกัสแถบค้นหา", + "keyboard_shortcuts.spoilers": "แสดง/ซ่อนช่องกรอกคำเตือนเนื้อหา", + "keyboard_shortcuts.start": "เปิดคอลัมน์ “เริ่มต้นใช้งาน”", + "keyboard_shortcuts.toggle_hidden": "แสดง/ซ่อนข้อความที่อยู่หลังคำเตือนเนื้อหา", + "keyboard_shortcuts.toggle_sensitivity": "แสดง/ซ่อนสื่อ", + "keyboard_shortcuts.toot": "เริ่มโพสต์ใหม่", + "keyboard_shortcuts.unfocus": "เลิกโฟกัสพื้นที่เขียนข้อความ/การค้นหา", + "keyboard_shortcuts.up": "ย้ายขึ้นในรายการ", "lightbox.close": "ปิด", "lightbox.compress": "บีบอัดกล่องดูภาพ", "lightbox.expand": "ขยายกล่องดูภาพ", @@ -267,7 +267,7 @@ "lists.subheading": "รายการของคุณ", "load_pending": "{count, plural, other {# รายการใหม่}}", "loading_indicator.label": "กำลังโหลด...", - "media_gallery.toggle_visible": "ซ่อน {number, plural, other {ภาพ}}", + "media_gallery.toggle_visible": "{number, plural, other {ซ่อนภาพ}}", "missing_indicator.label": "ไม่พบ", "missing_indicator.sublabel": "ไม่พบทรัพยากรนี้", "mute_modal.duration": "ระยะเวลา", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index fe6ca5f3e..fa53a59db 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "Кешеләр", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 1b311b04d..c1eadb5a3 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 4c5132149..4885056b7 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -142,7 +142,7 @@ "emoji_button.food": "Food & Drink", "emoji_button.label": "Insert emoji", "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No matching emojis found", "emoji_button.objects": "Objects", "emoji_button.people": "People", "emoji_button.recent": "Frequently used", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 3a02cc080..26ee75cf0 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -354,7 +354,7 @@ "regeneration_indicator.label": "Đang tải…", "regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!", "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", + "relative_time.hours": "{number} giờ", "relative_time.just_now": "vừa xong", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", @@ -431,7 +431,7 @@ "time_remaining.hours": "{number, plural, other {# giờ}}", "time_remaining.minutes": "{number, plural, other {# phút}}", "time_remaining.moments": "Còn lại", - "time_remaining.seconds": "còn {number, plural, other {# giây}}", + "time_remaining.seconds": "{number, plural, other {# giây}}", "timeline_hint.remote_resource_not_displayed": "{resource} từ máy chủ khác sẽ không hiển thị.", "timeline_hint.resources.followers": "Người theo dõi", "timeline_hint.resources.follows": "Đang theo dõi", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 6c02f94d1..27d114888 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -29,13 +29,13 @@ "account.media": "媒体", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已经迁移到:", - "account.mute": "静音 @{name}", - "account.mute_notifications": "静音来自 @{name} 的通知", - "account.muted": "已静音", + "account.mute": "隐藏 @{name}", + "account.mute_notifications": "隐藏来自 @{name} 的通知", + "account.muted": "已隐藏", "account.never_active": "从未活跃", "account.posts": "嘟文", "account.posts_with_replies": "嘟文和回复", - "account.report": "报告 @{name}", + "account.report": "举报 @{name}", "account.requested": "正在等待对方同意。点击以取消发送关注请求", "account.share": "分享 @{name} 的个人资料", "account.show_reblogs": "显示来自 @{name} 的转嘟", @@ -44,8 +44,8 @@ "account.unblock_domain": "不再隐藏来自 {domain} 的内容", "account.unendorse": "不在个人资料中推荐此用户", "account.unfollow": "取消关注", - "account.unmute": "不再静音 @{name}", - "account.unmute_notifications": "不再静音来自 @{name} 的通知", + "account.unmute": "不再隐藏 @{name}", + "account.unmute_notifications": "不再隐藏来自 @{name} 的通知", "account_note.placeholder": "点击添加备注", "alert.rate_limited.message": "请在{retry_time, time, medium}后重试。", "alert.rate_limited.title": "频率受限", @@ -70,7 +70,7 @@ "column.follow_requests": "关注请求", "column.home": "主页", "column.lists": "列表", - "column.mutes": "已静音的用户", + "column.mutes": "已隐藏的用户", "column.notifications": "通知", "column.pins": "置顶嘟文", "column.public": "跨站公共时间轴", @@ -106,7 +106,7 @@ "compose_form.spoiler.unmarked": "正文未被折叠", "compose_form.spoiler_placeholder": "折叠部分的警告消息", "confirmation_modal.cancel": "取消", - "confirmations.block.block_and_report": "屏蔽与报告", + "confirmations.block.block_and_report": "屏蔽与举报", "confirmations.block.confirm": "屏蔽", "confirmations.block.message": "你确定要屏蔽 {name} 吗?", "confirmations.delete.confirm": "删除", @@ -114,12 +114,12 @@ "confirmations.delete_list.confirm": "删除", "confirmations.delete_list.message": "你确定要永久删除这个列表吗?", "confirmations.domain_block.confirm": "隐藏整个网站的内容", - "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或静音几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。", + "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "你确定要登出吗?", - "confirmations.mute.confirm": "静音", + "confirmations.mute.confirm": "隐藏", "confirmations.mute.explanation": "这将隐藏他们的嘟文以及提到他们的嘟文,但他们仍可以看到你的嘟文并关注你。", - "confirmations.mute.message": "你确定要静音 {name} 吗?", + "confirmations.mute.message": "你确定要隐藏 {name} 吗?", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。", "confirmations.reply.confirm": "回复", @@ -163,11 +163,11 @@ "empty_column.follow_recommendations": "似乎无法为你生成任何建议。你可以尝试使用搜索寻找你可能知道的人或探索热门标签。", "empty_column.follow_requests": "你没有收到新的关注请求。收到了之后就会显示在这里。", "empty_column.hashtag": "这个话题标签下暂时没有内容。", - "empty_column.home": "你还没有关注任何用户。快看看{public},向其他人问个好吧。", + "empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}", "empty_column.home.suggestions": "查看一些建议", "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的的新嘟文将会在这里显示。", "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。", - "empty_column.mutes": "你没有静音任何用户。", + "empty_column.mutes": "你没有隐藏任何用户。", "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。", "empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了", "error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。", @@ -183,7 +183,7 @@ "federation.local_only.short": "Local-only", "follow_recommendations.done": "完成", "follow_recommendations.heading": "关注你感兴趣的用户!这里有一些推荐。", - "follow_recommendations.lead": "你关注的人的嘟文将按时间顺序在你的主页上显示。 别担心,你也可以随时取消关注!", + "follow_recommendations.lead": "你关注的人的嘟文将按时间顺序在你的主页上显示。 别担心,你可以随时取消关注!", "follow_request.authorize": "同意", "follow_request.reject": "拒绝", "follow_requests.unlocked_explanation": "虽说你没有锁嘟,但是 {domain} 的工作人员觉得你可能想手工审核关注请求。", @@ -231,7 +231,7 @@ "keyboard_shortcuts.legend": "显示此列表", "keyboard_shortcuts.local": "打开本站时间轴", "keyboard_shortcuts.mention": "提及嘟文作者", - "keyboard_shortcuts.muted": "打开已静音的用户列表", + "keyboard_shortcuts.muted": "打开已隐藏用户列表", "keyboard_shortcuts.my_profile": "打开你的个人资料", "keyboard_shortcuts.notifications": "打开通知栏", "keyboard_shortcuts.open_media": "打开媒体", @@ -283,14 +283,14 @@ "navigation_bar.domain_blocks": "已屏蔽的网站", "navigation_bar.edit_profile": "修改个人资料", "navigation_bar.favourites": "喜欢", - "navigation_bar.filters": "静音关键词", + "navigation_bar.filters": "隐藏关键词", "navigation_bar.follow_requests": "关注请求", "navigation_bar.follows_and_followers": "关注管理", "navigation_bar.info": "关于本站", "navigation_bar.keyboard_shortcuts": "快捷键列表", "navigation_bar.lists": "列表", "navigation_bar.logout": "登出", - "navigation_bar.mutes": "已静音的用户", + "navigation_bar.mutes": "已隐藏的用户", "navigation_bar.personal": "个人", "navigation_bar.pins": "置顶嘟文", "navigation_bar.preferences": "首选项", @@ -365,12 +365,12 @@ "relative_time.seconds": "{number}秒", "relative_time.today": "今天", "reply_indicator.cancel": "取消", - "report.forward": "转发报告至 {target}", - "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的报告?", - "report.hint": "报告将会发送给你所在服务器的监察员。你可以在下面填写报告该用户的理由:", + "report.forward": "转发举报至 {target}", + "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?", + "report.hint": "举报将会发送给你所在服务器的监察员。你可以在下面填写举报该用户的理由:", "report.placeholder": "备注", "report.submit": "提交", - "report.target": "报告 {target}", + "report.target": "举报 {target}", "search.placeholder": "搜索", "search_popout.search_format": "高级搜索格式", "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的嘟文,以及其他用户公开的用户名、昵称和话题标签。", @@ -400,7 +400,7 @@ "status.media_hidden": "已隐藏的媒体内容", "status.mention": "提及 @{name}", "status.more": "更多", - "status.mute": "静音 @{name}", + "status.mute": "隐藏 @{name}", "status.mute_conversation": "将此对话静音", "status.open": "展开嘟文", "status.pin": "在个人资料页面置顶", @@ -414,7 +414,7 @@ "status.remove_bookmark": "移除书签", "status.reply": "回复", "status.replyAll": "回复所有人", - "status.report": "报告 @{name}", + "status.report": "举报 @{name}", "status.sensitive_warning": "敏感内容", "status.share": "分享", "status.show_less": "隐藏内容", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 15069fc9a..81b2ae502 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -25,7 +25,7 @@ "account.joined": "加入於 {date}", "account.last_status": "上次活躍時間", "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限", - "account.locked_info": "此帳號的隱私狀態被設為鎖定。該擁有者會手動審核能關注此帳號的人。", + "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能關注此帳戶的人。", "account.media": "媒體", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已遷移至:", @@ -114,7 +114,7 @@ "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "確定永久刪除此名單?", "confirmations.domain_block.confirm": "隱藏整個域名", - "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳號就能滿足需求了。您將不能在任何公開的時間軸及通知中看到此網域的內容。您來自該網域的關注者也將被移除。", + "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳帳戶能滿足需求了。您將不能在任何公開的時間軸及通知中看到此網域的內容。您來自該網域的關注者也將被移除。", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", "confirmations.mute.confirm": "靜音", @@ -150,7 +150,7 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", - "empty_column.account_suspended": "帳號被暫停", + "empty_column.account_suspended": "帳戶被暫停", "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人資料", "empty_column.blocks": "您還沒有封鎖任何使用者。", @@ -186,7 +186,7 @@ "follow_recommendations.lead": "來自您追蹤的人的貼文將會按時間順序顯示在您的家 feed 上。不要害怕犯錯,您隨時都可以取消追蹤其他人!", "follow_request.authorize": "授權", "follow_request.reject": "拒絕", - "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為您可能想要自己審核這些帳號的追蹤請求。", + "follow_requests.unlocked_explanation": "即便您的帳戶未被鎖定,{domain} 的員工認為您可能想要自己審核這些帳戶的追蹤請求。", "generic.saved": "已儲存", "getting_started.developers": "開發者", "getting_started.directory": "個人資料目錄", @@ -194,7 +194,7 @@ "getting_started.heading": "開始使用", "getting_started.invite": "邀請使用者", "getting_started.open_source_notice": "Mastodon 是開源軟體。您可以在 GitHub {github} 上貢獻或是回報問題。", - "getting_started.security": "帳號安全性設定", + "getting_started.security": "帳戶安全性設定", "getting_started.terms": "服務條款", "hashtag.column_header.tag_mode.all": "以及 {additional}", "hashtag.column_header.tag_mode.any": "或是 {additional}", @@ -438,7 +438,7 @@ "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}", "time_remaining.moments": "剩餘時間", "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}", - "timeline_hint.remote_resource_not_displayed": "不會顯示來自其他服務器的 {resource}", + "timeline_hint.remote_resource_not_displayed": "不會顯示來自其他伺服器的 {resource}", "timeline_hint.resources.followers": "關注者", "timeline_hint.resources.follows": "正在關注", "timeline_hint.resources.statuses": "更早的嘟文", diff --git a/app/javascript/mastodon/reducers/modal.js b/app/javascript/mastodon/reducers/modal.js index cb53887c7..ea81b4332 100644 --- a/app/javascript/mastodon/reducers/modal.js +++ b/app/javascript/mastodon/reducers/modal.js @@ -1,19 +1,15 @@ import { MODAL_OPEN, MODAL_CLOSE } from '../actions/modal'; import { TIMELINE_DELETE } from '../actions/timelines'; +import { Stack as ImmutableStack, Map as ImmutableMap } from 'immutable'; -const initialState = { - modalType: null, - modalProps: {}, -}; - -export default function modal(state = initialState, action) { +export default function modal(state = ImmutableStack(), action) { switch(action.type) { case MODAL_OPEN: - return { modalType: action.modalType, modalProps: action.modalProps }; + return state.unshift(ImmutableMap({ modalType: action.modalType, modalProps: action.modalProps })); case MODAL_CLOSE: - return (action.modalType === undefined || action.modalType === state.modalType) ? initialState : state; + return (action.modalType === undefined || action.modalType === state.getIn([0, 'modalType'])) ? state.shift() : state; case TIMELINE_DELETE: - return (state.modalProps.statusId === action.id) ? initialState : state; + return state.filterNot((modal) => modal.get('modalProps').statusId === action.id); default: return state; } diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 1d4874717..b587b6d0f 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -106,7 +106,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece } if (shouldCountUnreadNotifications(state)) { - mutable.update('unread', unread => unread + items.count(item => compareId(item.get('id'), lastReadId) > 0)); + mutable.set('unread', mutable.get('pendingItems').count(item => item !== null) + mutable.get('items').count(item => item && compareId(item.get('id'), lastReadId) > 0)); } else { const mostRecent = items.find(item => item !== null); if (mostRecent && compareId(lastReadId, mostRecent.get('id')) < 0) { diff --git a/app/javascript/mastodon/reducers/picture_in_picture.js b/app/javascript/mastodon/reducers/picture_in_picture.js index 06cd8c5e8..48772ae7f 100644 --- a/app/javascript/mastodon/reducers/picture_in_picture.js +++ b/app/javascript/mastodon/reducers/picture_in_picture.js @@ -1,4 +1,5 @@ import { PICTURE_IN_PICTURE_DEPLOY, PICTURE_IN_PICTURE_REMOVE } from 'mastodon/actions/picture_in_picture'; +import { TIMELINE_DELETE } from '../actions/timelines'; const initialState = { statusId: null, @@ -16,6 +17,8 @@ export default function pictureInPicture(state = initialState, action) { return { statusId: action.statusId, accountId: action.accountId, type: action.playerType, ...action.props }; case PICTURE_IN_PICTURE_REMOVE: return { ...initialState }; + case TIMELINE_DELETE: + return (state.statusId === action.id) ? { ...initialState } : state; default: return state; } diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index 14152718d..4e54ecf25 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -263,7 +263,6 @@ h5 { padding: 16px; line-height: 20px; mso-line-height-rule: exactly; - border-radius: 4px; text-align: center; font-weight: 500; font-size: 17px; diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index cd49214e1..819de98d2 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -322,7 +322,6 @@ $small-breakpoint: 960px; font-family: $font-sans-serif, sans-serif; font-size: 16px; font-weight: 400; - font-size: 16px; line-height: 30px; margin-bottom: 12px; color: $darker-text-color; diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 30035c10e..ec8ef673f 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -852,6 +852,7 @@ a.name-tag, padding: 0 5px; margin-bottom: 10px; flex: 1 0 50%; + max-width: 100%; } .account__header__fields, diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index bfa7c928e..892f87075 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3699,7 +3699,6 @@ a.status-card.compact:hover { span { display: block; float: left; - margin-left: 50%; transform: translateX(-50%); margin: 82px 0 0 50%; white-space: nowrap; @@ -7373,6 +7372,7 @@ noscript { &__account { display: flex; text-decoration: none; + overflow: hidden; } .account__avatar { diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss index 4bfd66504..adddd4533 100644 --- a/app/javascript/styles/mastodon/emoji_picker.scss +++ b/app/javascript/styles/mastodon/emoji_picker.scss @@ -48,6 +48,8 @@ overflow: hidden; transition: color .1s ease-out; cursor: pointer; + background: transparent; + border: 0; &:hover { color: darken($lighter-text-color, 4%); @@ -106,11 +108,13 @@ padding: 10px; padding-right: 45px; background: $simple-background-color; + position: relative; input { font-size: 14px; font-weight: 400; padding: 7px 9px; + padding-right: 25px; font-family: inherit; display: block; width: 100%; @@ -131,6 +135,30 @@ } } +.emoji-mart-search-icon { + position: absolute; + top: 18px; + right: 45px + 5px; + z-index: 2; + padding: 2px 5px 1px; + border: 0; + background: none; + transition: all 100ms linear; + transition-property: opacity; + pointer-events: auto; + opacity: 0.7; + + &:disabled { + cursor: default; + pointer-events: none; + opacity: 0.3; + } + + svg { + fill: $action-button-color; + } +} + .emoji-mart-category .emoji-mart-emoji { cursor: pointer; @@ -169,9 +197,36 @@ } } +/* For screenreaders only, via https://stackoverflow.com/a/19758620 */ +.emoji-mart-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.emoji-mart-category-list { + margin: 0; + padding: 0; +} + +.emoji-mart-category-list li { + list-style: none; + margin: 0; + padding: 0; + display: inline-block; +} + .emoji-mart-emoji { position: relative; display: inline-block; + background: transparent; + border: 0; + padding: 0; font-size: 0; span { @@ -182,19 +237,17 @@ .emoji-mart-no-results { font-size: 14px; + color: $light-text-color; text-align: center; + padding: 5px 6px; padding-top: 70px; - color: $light-text-color; - - .emoji-mart-category-label { - display: none; - } - .emoji-mart-no-results-label { + .emoji-mart-no-results-label { margin-top: .2em; } .emoji-mart-emoji:hover::before { + cursor: default; content: none; } } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 5ee4d104b..4e03868a6 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .hero-widget { margin-bottom: 10px; box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); @@ -498,10 +500,10 @@ $fluid-breakpoint: $maximum-width + 20px; } &__item { - width: (960px - 20px) / 3; + width: math.div(960px - 20px, 3); @media screen and (max-width: $fluid-breakpoint) { - width: (940px - 20px) / 3; + width: math.div(940px - 20px, 3); } @media screen and (max-width: 640px) { @@ -593,7 +595,6 @@ $fluid-breakpoint: $maximum-width + 20px; display: block; font-weight: 500; padding: 15px; - overflow: hidden; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index a476f7228..3268e7c87 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -216,8 +216,8 @@ class ActivityPub::Activity redis.del(key) end - def lock_or_fail(key) - RedisLock.acquire({ redis: Redis.current, key: key }) do |lock| + def lock_or_fail(key, expire_after = 15.minutes.seconds) + RedisLock.acquire({ redis: Redis.current, key: key, autorelease: expire_after }) do |lock| if lock.acquired? yield else diff --git a/app/lib/activitypub/activity/add.rb b/app/lib/activitypub/activity/add.rb index 688ab00b3..fdd2f90f2 100644 --- a/app/lib/activitypub/activity/add.rb +++ b/app/lib/activitypub/activity/add.rb @@ -7,7 +7,7 @@ class ActivityPub::Activity::Add < ActivityPub::Activity status = status_from_uri(object_uri) status ||= fetch_remote_original_status - return unless !status.nil? && status.account_id == @account.id && !@account.pinned?(status) + return unless !status.nil? && status.account_id == @account.id && !@account.pinned?(status) && status.distributable? StatusPin.create!(account: @account, status: status) end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 558fb6552..f223b6cab 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -500,10 +500,14 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end def supported_blurhash?(blurhash) - components = blurhash.blank? ? nil : Blurhash.components(blurhash) + components = blurhash.blank? || !blurhash_valid_chars?(blurhash) ? nil : Blurhash.components(blurhash) components.present? && components.none? { |comp| comp > 5 } end + def blurhash_valid_chars?(blurhash) + /^[\w#$%*+-.:;=?@\[\]^{|}~]+$/.match?(blurhash) + end + def skip_download? return @skip_download if defined?(@skip_download) diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb index 2d6b87659..098b6296f 100644 --- a/app/lib/activitypub/adapter.rb +++ b/app/lib/activitypub/adapter.rb @@ -1,30 +1,7 @@ # frozen_string_literal: true class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base - NAMED_CONTEXT_MAP = { - activitystreams: 'https://www.w3.org/ns/activitystreams', - security: 'https://w3id.org/security/v1', - }.freeze - - CONTEXT_EXTENSION_MAP = { - manually_approves_followers: { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers' }, - sensitive: { 'sensitive' => 'as:sensitive' }, - hashtag: { 'Hashtag' => 'as:Hashtag' }, - moved_to: { 'movedTo' => { '@id' => 'as:movedTo', '@type' => '@id' } }, - also_known_as: { 'alsoKnownAs' => { '@id' => 'as:alsoKnownAs', '@type' => '@id' } }, - emoji: { 'toot' => 'http://joinmastodon.org/ns#', 'Emoji' => 'toot:Emoji' }, - featured: { 'toot' => 'http://joinmastodon.org/ns#', 'featured' => { '@id' => 'toot:featured', '@type' => '@id' }, 'featuredTags' => { '@id' => 'toot:featuredTags', '@type' => '@id' } }, - property_value: { 'schema' => 'http://schema.org#', 'PropertyValue' => 'schema:PropertyValue', 'value' => 'schema:value' }, - atom_uri: { 'ostatus' => 'http://ostatus.org#', 'atomUri' => 'ostatus:atomUri' }, - conversation: { 'ostatus' => 'http://ostatus.org#', 'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri', 'conversation' => 'ostatus:conversation' }, - focal_point: { 'toot' => 'http://joinmastodon.org/ns#', 'focalPoint' => { '@container' => '@list', '@id' => 'toot:focalPoint' } }, - identity_proof: { 'toot' => 'http://joinmastodon.org/ns#', 'IdentityProof' => 'toot:IdentityProof' }, - blurhash: { 'toot' => 'http://joinmastodon.org/ns#', 'blurhash' => 'toot:blurhash' }, - discoverable: { 'toot' => 'http://joinmastodon.org/ns#', 'discoverable' => 'toot:discoverable' }, - voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, - olm: { 'toot' => 'http://joinmastodon.org/ns#', 'Device' => 'toot:Device', 'Ed25519Signature' => 'toot:Ed25519Signature', 'Ed25519Key' => 'toot:Ed25519Key', 'Curve25519Key' => 'toot:Curve25519Key', 'EncryptedMessage' => 'toot:EncryptedMessage', 'publicKeyBase64' => 'toot:publicKeyBase64', 'deviceId' => 'toot:deviceId', 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, 'messageFranking' => 'toot:messageFranking', 'messageType' => 'toot:messageType', 'cipherText' => 'toot:cipherText' }, - suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, - }.freeze + include ContextHelper def self.default_key_transform :camel_lower @@ -35,7 +12,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base end def serializable_hash(options = nil) - named_contexts = {} + named_contexts = { activitystreams: NAMED_CONTEXT_MAP['activitystreams'] } context_extensions = {} options = serialization_options(options) @@ -45,29 +22,4 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base { '@context' => serialized_context(named_contexts, context_extensions) }.merge(serialized_hash) end - - private - - def serialized_context(named_contexts_map, context_extensions_map) - context_array = [] - - named_contexts = [:activitystreams] + named_contexts_map.keys - context_extensions = context_extensions_map.keys - - named_contexts.each do |key| - context_array << NAMED_CONTEXT_MAP[key] - end - - extensions = context_extensions.each_with_object({}) do |key, h| - h.merge!(CONTEXT_EXTENSION_MAP[key]) - end - - context_array << extensions unless extensions.empty? - - if context_array.size == 1 - context_array.first - else - context_array - end - end end diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index f6b5e10d3..f6b9741fa 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -64,6 +64,10 @@ class ActivityPub::TagManager account_status_replies_url(target.account, target, page_params) end + def followers_uri_for(target) + target.local? ? account_followers_url(target) : target.followers_url.presence + end + # Primary audience of a status # Public statuses go out to primarily the public collection # Unlisted and private statuses go out primarily to the followers collection @@ -80,17 +84,17 @@ class ActivityPub::TagManager account_ids = status.active_mentions.pluck(:account_id) to = status.account.followers.where(id: account_ids).each_with_object([]) do |account, result| result << uri_for(account) - result << account_followers_url(account) if account.group? + result << followers_uri_for(account) if account.group? end to.concat(FollowRequest.where(target_account_id: status.account_id, account_id: account_ids).each_with_object([]) do |request, result| result << uri_for(request.account) - result << account_followers_url(request.account) if request.account.group? - end) + result << followers_uri_for(request.account) if request.account.group? + end).compact else status.active_mentions.each_with_object([]) do |mention, result| result << uri_for(mention.account) - result << account_followers_url(mention.account) if mention.account.group? - end + result << followers_uri_for(mention.account) if mention.account.group? + end.compact end end end @@ -118,17 +122,17 @@ class ActivityPub::TagManager account_ids = status.active_mentions.pluck(:account_id) cc.concat(status.account.followers.where(id: account_ids).each_with_object([]) do |account, result| result << uri_for(account) - result << account_followers_url(account) if account.group? - end) + result << followers_uri_for(account) if account.group? + end.compact) cc.concat(FollowRequest.where(target_account_id: status.account_id, account_id: account_ids).each_with_object([]) do |request, result| result << uri_for(request.account) - result << account_followers_url(request.account) if request.account.group? - end) + result << followers_uri_for(request.account) if request.account.group? + end.compact) else cc.concat(status.active_mentions.each_with_object([]) do |mention, result| result << uri_for(mention.account) - result << account_followers_url(mention.account) if mention.account.group? - end) + result << followers_uri_for(mention.account) if mention.account.group? + end.compact) end end diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 3aa292eea..c03195f6e 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -220,39 +220,10 @@ class Formatter result.flatten.join end - UNICODE_ESCAPE_BLACKLIST_RE = /\p{Z}|\p{P}/ - def utf8_friendly_extractor(text, options = {}) - old_to_new_index = [0] - - escaped = text.chars.map do |c| - output = begin - if c.ord.to_s(16).length > 2 && !UNICODE_ESCAPE_BLACKLIST_RE.match?(c) - CGI.escape(c) - else - c - end - end - - old_to_new_index << old_to_new_index.last + output.length - - output - end.join - # Note: I couldn't obtain list_slug with @user/list-name format # for mention so this requires additional check - special = Extractor.extract_urls_with_indices(escaped, options).map do |extract| - new_indices = [ - old_to_new_index.find_index(extract[:indices].first), - old_to_new_index.find_index(extract[:indices].last), - ] - - next extract.merge( - indices: new_indices, - url: text[new_indices.first..new_indices.last - 1] - ) - end - + special = Extractor.extract_urls_with_indices(text, options) standard = Extractor.extract_entities_with_indices(text, options) extra = Extractor.extract_extra_uris_with_indices(text, options) diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb index e0e022cea..1ffb5b4bf 100644 --- a/app/lib/webfinger.rb +++ b/app/lib/webfinger.rb @@ -46,7 +46,9 @@ class Webfinger def body_from_webfinger(url = standard_url, use_fallback = true) webfinger_request(url).perform do |res| if res.code == 200 - res.body_with_limit + body = res.body_with_limit + raise Webfinger::Error, "Request for #{@uri} returned empty response" if body.empty? + body elsif res.code == 404 && use_fallback body_from_host_meta elsif res.code == 410 diff --git a/app/models/account.rb b/app/models/account.rb index 2c5455d8e..11345a15c 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -58,8 +58,9 @@ class Account < ApplicationRecord hub_url ) - USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i - MENTION_RE = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[a-z0-9]+)?)/i + USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i + MENTION_RE = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[[:word:]]+)?)/i + URL_PREFIX_RE = /\Ahttp(s?):\/\/[^\/]+/ include AccountAssociations include AccountAvatar @@ -232,11 +233,11 @@ class Account < ApplicationRecord suspended? && deletion_request.present? end - def suspend!(date: Time.now.utc, origin: :local) + def suspend!(date: Time.now.utc, origin: :local, block_email: true) transaction do create_deletion_request! update!(suspended_at: date, suspension_origin: origin) - create_canonical_email_block! + create_canonical_email_block! if block_email end end @@ -295,7 +296,11 @@ class Account < ApplicationRecord end def fields - (self[:fields] || []).map { |f| Field.new(self, f) } + (self[:fields] || []).map do |f| + Field.new(self, f) + rescue + nil + end.compact end def fields_attributes=(attributes) @@ -375,7 +380,7 @@ class Account < ApplicationRecord def synchronization_uri_prefix return 'local' if local? - @synchronization_uri_prefix ||= uri[/http(s?):\/\/[^\/]+\//] + @synchronization_uri_prefix ||= "#{uri[URL_PREFIX_RE]}/" end class Field < ActiveModelSerializers::Model @@ -421,6 +426,9 @@ class Account < ApplicationRecord end class << self + DISALLOWED_TSQUERY_CHARACTERS = /['?\\:‘’]/.freeze + TEXTSEARCH = "(setweight(to_tsvector('simple', accounts.display_name), 'A') || setweight(to_tsvector('simple', accounts.username), 'B') || setweight(to_tsvector('simple', coalesce(accounts.domain, '')), 'C'))" + def readonly_attributes super - %w(statuses_count following_count followers_count) end @@ -431,97 +439,99 @@ class Account < ApplicationRecord end def search_for(terms, limit = 10, offset = 0) - textsearch, query = generate_query_for_search(terms) + tsquery = generate_query_for_search(terms) sql = <<-SQL.squish SELECT accounts.*, - ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank FROM accounts - WHERE #{query} @@ #{textsearch} + WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH} AND accounts.suspended_at IS NULL AND accounts.moved_to_account_id IS NULL ORDER BY rank DESC - LIMIT ? OFFSET ? + LIMIT :limit OFFSET :offset SQL - records = find_by_sql([sql, limit, offset]) + records = find_by_sql([sql, limit: limit, offset: offset, tsquery: tsquery]) ActiveRecord::Associations::Preloader.new.preload(records, :account_stat) records end def advanced_search_for(terms, account, limit = 10, following = false, offset = 0) - textsearch, query = generate_query_for_search(terms) + tsquery = generate_query_for_search(terms) + sql = advanced_search_for_sql_template(following) + records = find_by_sql([sql, id: account.id, limit: limit, offset: offset, tsquery: tsquery]) + ActiveRecord::Associations::Preloader.new.preload(records, :account_stat) + records + end + + def from_text(text) + return [] if text.blank? + text.scan(MENTION_RE).map { |match| match.first.split('@', 2) }.uniq.filter_map do |(username, domain)| + domain = begin + if TagManager.instance.local_domain?(domain) + nil + else + TagManager.instance.normalize_domain(domain) + end + end + EntityCache.instance.mention(username, domain) + end + end + + private + + def generate_query_for_search(unsanitized_terms) + terms = unsanitized_terms.gsub(DISALLOWED_TSQUERY_CHARACTERS, ' ') + + # The final ":*" is for prefix search. + # The trailing space does not seem to fit any purpose, but `to_tsquery` + # behaves differently with and without a leading space if the terms start + # with `./`, `../`, or `.. `. I don't understand why, so, in doubt, keep + # the same query. + "' #{terms} ':*" + end + + def advanced_search_for_sql_template(following) if following - sql = <<-SQL.squish + <<-SQL.squish WITH first_degree AS ( SELECT target_account_id FROM follows - WHERE account_id = ? + WHERE account_id = :id UNION ALL - SELECT ? + SELECT :id ) SELECT accounts.*, - (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank FROM accounts - LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) + LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) WHERE accounts.id IN (SELECT * FROM first_degree) - AND #{query} @@ #{textsearch} + AND to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH} AND accounts.suspended_at IS NULL AND accounts.moved_to_account_id IS NULL GROUP BY accounts.id ORDER BY rank DESC - LIMIT ? OFFSET ? + LIMIT :limit OFFSET :offset SQL - - records = find_by_sql([sql, account.id, account.id, account.id, limit, offset]) else - sql = <<-SQL.squish + <<-SQL.squish SELECT accounts.*, - (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank FROM accounts - LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) - WHERE #{query} @@ #{textsearch} + LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) OR (accounts.id = f.target_account_id AND f.account_id = :id) + WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH} AND accounts.suspended_at IS NULL AND accounts.moved_to_account_id IS NULL GROUP BY accounts.id ORDER BY rank DESC - LIMIT ? OFFSET ? + LIMIT :limit OFFSET :offset SQL - - records = find_by_sql([sql, account.id, account.id, limit, offset]) end - - ActiveRecord::Associations::Preloader.new.preload(records, :account_stat) - records - end - - def from_text(text) - return [] if text.blank? - - text.scan(MENTION_RE).map { |match| match.first.split('@', 2) }.uniq.filter_map do |(username, domain)| - domain = begin - if TagManager.instance.local_domain?(domain) - nil - else - TagManager.instance.normalize_domain(domain) - end - end - EntityCache.instance.mention(username, domain) - end - end - - private - - def generate_query_for_search(terms) - terms = Arel.sql(connection.quote(terms.gsub(/['?\\:]/, ' '))) - textsearch = "(setweight(to_tsvector('simple', accounts.display_name), 'A') || setweight(to_tsvector('simple', accounts.username), 'B') || setweight(to_tsvector('simple', coalesce(accounts.domain, '')), 'C'))" - query = "to_tsquery('simple', ''' ' || #{terms} || ' ''' || ':*')" - - [textsearch, query] end end @@ -570,7 +580,11 @@ class Account < ApplicationRecord def create_canonical_email_block! return unless local? && user_email.present? - CanonicalEmailBlock.create(reference_account: self, email: user_email) + begin + CanonicalEmailBlock.create(reference_account: self, email: user_email) + rescue ActiveRecord::RecordNotUnique + # A canonical e-mail block may already exist for the same e-mail + end end def destroy_canonical_email_block! diff --git a/app/models/account_note.rb b/app/models/account_note.rb index bf61df923..b338bc92f 100644 --- a/app/models/account_note.rb +++ b/app/models/account_note.rb @@ -17,4 +17,5 @@ class AccountNote < ApplicationRecord belongs_to :target_account, class_name: 'Account' validates :account_id, uniqueness: { scope: :target_account_id } + validates :comment, length: { maximum: 2_000 } end diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb index a826a9af3..44da4f0d0 100644 --- a/app/models/account_stat.rb +++ b/app/models/account_stat.rb @@ -11,10 +11,11 @@ # created_at :datetime not null # updated_at :datetime not null # last_status_at :datetime -# lock_version :integer default(0), not null # class AccountStat < ApplicationRecord + self.locking_column = nil + belongs_to :account, inverse_of: :account_stat update_index('accounts#account', :account) diff --git a/app/models/canonical_email_block.rb b/app/models/canonical_email_block.rb index a8546d65a..be8c45bfe 100644 --- a/app/models/canonical_email_block.rb +++ b/app/models/canonical_email_block.rb @@ -15,7 +15,7 @@ class CanonicalEmailBlock < ApplicationRecord belongs_to :reference_account, class_name: 'Account' - validates :canonical_email_hash, presence: true + validates :canonical_email_hash, presence: true, uniqueness: true def email=(email) self.canonical_email_hash = email_to_canonical_email_hash(email) diff --git a/app/models/concerns/account_counters.rb b/app/models/concerns/account_counters.rb index fd3f161ad..3fabb5205 100644 --- a/app/models/concerns/account_counters.rb +++ b/app/models/concerns/account_counters.rb @@ -49,7 +49,6 @@ module AccountCounters ON CONFLICT (account_id) DO UPDATE SET #{key} = account_stats.#{key} + :value, last_status_at = now(), - lock_version = account_stats.lock_version + 1, updated_at = now() RETURNING id; SQL @@ -59,7 +58,6 @@ module AccountCounters VALUES (:account_id, :default_value, now(), now()) ON CONFLICT (account_id) DO UPDATE SET #{key} = account_stats.#{key} + :value, - lock_version = account_stats.lock_version + 1, updated_at = now() RETURNING id; SQL diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index 958f6c78e..763567f42 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -251,10 +251,13 @@ module AccountInteractions .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago) end - def remote_followers_hash(url_prefix) - Rails.cache.fetch("followers_hash:#{id}:#{url_prefix}") do + def remote_followers_hash(url) + url_prefix = url[Account::URL_PREFIX_RE] + return if url_prefix.blank? + + Rails.cache.fetch("followers_hash:#{id}:#{url_prefix}/") do digest = "\x00" * 32 - followers.where(Account.arel_table[:uri].matches(url_prefix + '%', false, true)).pluck_each(:uri) do |uri| + followers.where(Account.arel_table[:uri].matches("#{Account.sanitize_sql_like(url_prefix)}/%", false, true)).or(followers.where(uri: url_prefix)).pluck_each(:uri) do |uri| Xorcist.xor!(digest, Digest::SHA256.digest(uri)) end digest.unpack('H*')[0] diff --git a/app/models/status.rb b/app/models/status.rb index 91e354e80..e95e785c7 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -99,15 +99,12 @@ class Status < ApplicationRecord scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) } scope :not_domain_blocked_by_account, ->(account) { account.excluded_from_timeline_domains.blank? ? left_outer_joins(:account) : left_outer_joins(:account).where('accounts.domain IS NULL OR accounts.domain NOT IN (?)', account.excluded_from_timeline_domains) } scope :tagged_with_all, ->(tag_ids) { - Array(tag_ids).reduce(self) do |result, id| + Array(tag_ids).map(&:to_i).reduce(self) do |result, id| result.joins("INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}") end } scope :tagged_with_none, ->(tag_ids) { - Array(tag_ids).reduce(self) do |result, id| - result.joins("LEFT OUTER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}") - .where("t#{id}.tag_id IS NULL") - end + where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids) } cache_associated :application, @@ -347,7 +344,7 @@ class Status < ApplicationRecord def from_text(text) return [] if text.blank? - text.scan(FetchLinkCardService::URL_PATTERN).map(&:first).uniq.filter_map do |url| + text.scan(FetchLinkCardService::URL_PATTERN).map(&:second).uniq.filter_map do |url| status = begin if TagManager.instance.local_url?(url) ActivityPub::TagManager.instance.uri_to_resource(url, Status) @@ -439,7 +436,7 @@ class Status < ApplicationRecord end def decrement_counter_caches - return if direct_visibility? + return if direct_visibility? || new_record? account&.decrement_count!(:statuses_count) reblog&.decrement_count!(:reblogs_count) if reblog? diff --git a/app/models/user.rb b/app/models/user.rb index e9f48ca2b..4cb40de8d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -63,7 +63,7 @@ class User < ApplicationRecord devise :two_factor_backupable, otp_number_of_backup_codes: 10 - devise :registerable, :recoverable, :rememberable, :validatable, + devise :registerable, :recoverable, :validatable, :confirmable include Omniauthable diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index dafe8f55b..4786aa760 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -48,7 +48,7 @@ class ManifestSerializer < ActiveModel::Serializer end def scope - root_url + '/' end def share_target diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index e4a263ce0..e11959fd5 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -5,7 +5,8 @@ class REST::InstanceSerializer < ActiveModel::Serializer attributes :uri, :title, :short_description, :description, :email, :version, :urls, :stats, :thumbnail, :max_toot_chars, - :languages, :registrations, :approval_required, :invites_enabled + :languages, :registrations, :approval_required, :invites_enabled, + :configuration has_one :contact_account, serializer: REST::AccountSerializer @@ -57,6 +58,32 @@ class REST::InstanceSerializer < ActiveModel::Serializer { streaming_api: Rails.configuration.x.streaming_api_base_url } end + def configuration + { + statuses: { + max_characters: StatusLengthValidator::MAX_CHARS, + max_media_attachments: 4, + characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS, + }, + + media_attachments: { + supported_mime_types: MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES + MediaAttachment::AUDIO_MIME_TYPES, + image_size_limit: MediaAttachment::IMAGE_LIMIT, + image_matrix_limit: Attachmentable::MAX_MATRIX_LIMIT, + video_size_limit: MediaAttachment::VIDEO_LIMIT, + video_frame_rate_limit: MediaAttachment::MAX_VIDEO_FRAME_RATE, + video_matrix_limit: MediaAttachment::MAX_VIDEO_MATRIX_LIMIT, + }, + + polls: { + max_options: PollValidator::MAX_OPTIONS, + max_characters_per_option: PollValidator::MAX_OPTION_CHARS, + min_expiration: PollValidator::MIN_EXPIRATION, + max_expiration: PollValidator::MAX_EXPIRATION, + }, + } + end + def languages [I18n.default_locale] end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 7e268f4d4..4ab6912e5 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -290,7 +290,7 @@ class ActivityPub::ProcessAccountService < BaseService end def lock_options - { redis: Redis.current, key: "process_account:#{@uri}" } + { redis: Redis.current, key: "process_account:#{@uri}", autorelease: 15.minutes.seconds } end def process_tags diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb index 170e6709c..eb008c40a 100644 --- a/app/services/activitypub/process_collection_service.rb +++ b/app/services/activitypub/process_collection_service.rb @@ -5,11 +5,27 @@ class ActivityPub::ProcessCollectionService < BaseService def call(body, account, **options) @account = account - @json = Oj.load(body, mode: :strict) + @json = original_json = Oj.load(body, mode: :strict) @options = options + begin + @json = compact(@json) if @json['signature'].is_a?(Hash) + rescue JSON::LD::JsonLdError => e + Rails.logger.debug "Error when compacting JSON-LD document for #{value_or_id(@json['actor'])}: #{e.message}" + @json = original_json.without('signature') + end + return if !supported_context? || (different_actor? && verify_account!.nil?) || suspended_actor? || @account.local? + if @json['signature'].present? + # We have verified the signature, but in the compaction step above, might + # have introduced incompatibilities with other servers that do not + # normalize the JSON-LD documents (for instance, previous Mastodon + # versions), so skip redistribution if we can't get a safe document. + patch_for_forwarding!(original_json, @json) + @json.delete('signature') unless safe_for_forwarding?(original_json, @json) + end + case @json['type'] when 'Collection', 'CollectionPage' process_items @json['items'] diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index fa1636e41..5732ce8ac 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -175,6 +175,6 @@ class FetchLinkCardService < BaseService end def lock_options - { redis: Redis.current, key: "fetch:#{@url}" } + { redis: Redis.current, key: "fetch:#{@url}", autorelease: 15.minutes.seconds } end end diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb index 60be9b9dc..4cbaa04c6 100644 --- a/app/services/fetch_oembed_service.rb +++ b/app/services/fetch_oembed_service.rb @@ -2,6 +2,7 @@ class FetchOEmbedService ENDPOINT_CACHE_EXPIRES_IN = 24.hours.freeze + URL_REGEX = /(=(http[s]?(%3A|:)(\/\/|%2F%2F)))([^&]*)/i.freeze attr_reader :url, :options, :format, :endpoint_url @@ -65,10 +66,12 @@ class FetchOEmbedService end def cache_endpoint! + return unless URL_REGEX.match?(@endpoint_url) + url_domain = Addressable::URI.parse(@url).normalized_host endpoint_hash = { - endpoint: @endpoint_url.gsub(/(=(http[s]?(%3A|:)(\/\/|%2F%2F)))([^&]*)/i, '={url}'), + endpoint: @endpoint_url.gsub(URL_REGEX, '={url}'), format: @format, } diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index fc187db40..b9ec0f2b8 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -67,8 +67,53 @@ class NotifyService < BaseService message? && @notification.target_status.direct_visibility? end + # Returns true if the sender has been mentionned by the recipient up the thread def response_to_recipient? - @notification.target_status.in_reply_to_account_id == @recipient.id && @notification.target_status.thread&.direct_visibility? + return false if @notification.target_status.in_reply_to_id.nil? + + # Using an SQL CTE to avoid unneeded back-and-forth with SQL server in case of long threads + !Status.count_by_sql([<<-SQL.squish, id: @notification.target_status.in_reply_to_id, recipient_id: @recipient.id, sender_id: @notification.from_account.id]).zero? + WITH RECURSIVE ancestors(id, in_reply_to_id, replying_to_sender, path) AS ( + SELECT + s.id, + s.in_reply_to_id, + (CASE + WHEN s.account_id = :recipient_id THEN + EXISTS ( + SELECT * + FROM mentions m + WHERE m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id + ) + ELSE + FALSE + END), + ARRAY[s.id] + FROM statuses s + WHERE s.id = :id + UNION ALL + SELECT + s.id, + s.in_reply_to_id, + (CASE + WHEN s.account_id = :recipient_id THEN + EXISTS ( + SELECT * + FROM mentions m + WHERE m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id + ) + ELSE + FALSE + END), + st.path || s.id + FROM ancestors st + JOIN statuses s ON s.id = st.in_reply_to_id + WHERE st.replying_to_sender IS FALSE AND NOT s.id = ANY(path) + ) + SELECT COUNT(*) + FROM ancestors st + JOIN statuses s ON s.id = st.id + WHERE st.replying_to_sender IS TRUE AND s.visibility = 3 + SQL end def from_staff? diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 76cc9241b..010a76e7c 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -74,6 +74,9 @@ class PostStatusService < BaseService status_for_validation = @account.statuses.build(status_attributes) if status_for_validation.valid? + # Marking the status as destroyed is necessary to prevent the status from being + # persisted when the associated media attachments get updated when creating the + # scheduled status. status_for_validation.destroy # The following transaction block is needed to wrap the UPDATEs to diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 6e4d6e72a..b680c8e96 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -141,6 +141,6 @@ class RemoveStatusService < BaseService end def lock_options - { redis: Redis.current, key: "distribute:#{@status.id}" } + { redis: Redis.current, key: "distribute:#{@status.id}", autorelease: 5.minutes.seconds } end end diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb index 493995447..b266c019e 100644 --- a/app/services/resolve_account_service.rb +++ b/app/services/resolve_account_service.rb @@ -142,10 +142,11 @@ class ResolveAccountService < BaseService end def queue_deletion! + @account.suspend!(origin: :remote) AccountDeletionWorker.perform_async(@account.id, reserve_username: false, skip_activitypub: true) end def lock_options - { redis: Redis.current, key: "resolve:#{@username}@#{@domain}" } + { redis: Redis.current, key: "resolve:#{@username}@#{@domain}", autorelease: 15.minutes.seconds } end end diff --git a/app/services/unsuspend_account_service.rb b/app/services/unsuspend_account_service.rb index 949c670aa..7e52a7594 100644 --- a/app/services/unsuspend_account_service.rb +++ b/app/services/unsuspend_account_service.rb @@ -7,7 +7,7 @@ class UnsuspendAccountService < BaseService unsuspend! refresh_remote_account! - return if @account.nil? + return if @account.nil? || @account.suspended? merge_into_home_timelines! merge_into_list_timelines! diff --git a/app/validators/status_length_validator.rb b/app/validators/status_length_validator.rb index 11997024f..2a3ac8862 100644 --- a/app/validators/status_length_validator.rb +++ b/app/validators/status_length_validator.rb @@ -2,7 +2,8 @@ class StatusLengthValidator < ActiveModel::Validator MAX_CHARS = (ENV['MAX_TOOT_CHARS'] || 500).to_i - URL_PLACEHOLDER = "\1#{'x' * 23}" + URL_PLACEHOLDER_CHARS = 23 + URL_PLACEHOLDER = "\1#{'x' * URL_PLACEHOLDER_CHARS}" def validate(status) return unless status.local? && !status.reblog? diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 1dd0ee5aa..0abee545a 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -24,11 +24,11 @@ .row__information-board .information-board__section %span= t 'about.user_count_before' - %strong= number_to_human @instance_presenter.user_count, strip_insignificant_zeros: true + %strong= friendly_number_to_human @instance_presenter.user_count %span= t 'about.user_count_after', count: @instance_presenter.user_count .information-board__section %span= t 'about.status_count_before' - %strong= number_to_human @instance_presenter.status_count, strip_insignificant_zeros: true + %strong= friendly_number_to_human @instance_presenter.status_count %span= t 'about.status_count_after', count: @instance_presenter.status_count .row__mascot - if @instance_presenter.mascot&.file&.url diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index 1f9931c60..6396758b0 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -77,10 +77,10 @@ .hero-widget__counters__wrapper .hero-widget__counter - %strong= number_to_human @instance_presenter.user_count, strip_insignificant_zeros: true + %strong= friendly_number_to_human @instance_presenter.user_count %span= t 'about.user_count_after', count: @instance_presenter.user_count .hero-widget__counter - %strong= number_to_human @instance_presenter.active_user_count, strip_insignificant_zeros: true + %strong= friendly_number_to_human @instance_presenter.active_user_count %span = t 'about.active_count_after' %abbr{ title: t('about.active_footnote') } * diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml index cae5a5ac9..d9966723a 100644 --- a/app/views/accounts/_header.html.haml +++ b/app/views/accounts/_header.html.haml @@ -15,17 +15,17 @@ .details-counters .counter{ class: active_nav_class(short_account_url(account), short_account_with_replies_url(account), short_account_media_url(account)) } = link_to short_account_url(account), class: 'u-url u-uid', title: number_with_delimiter(account.statuses_count) do - %span.counter-number= number_to_human account.statuses_count, strip_insignificant_zeros: true + %span.counter-number= friendly_number_to_human account.statuses_count %span.counter-label= t('accounts.posts', count: account.statuses_count) .counter{ class: active_nav_class(account_following_index_url(account)) } = link_to account_following_index_url(account), title: number_with_delimiter(account.following_count) do - %span.counter-number= number_to_human account.following_count, strip_insignificant_zeros: true + %span.counter-number= friendly_number_to_human account.following_count %span.counter-label= t('accounts.following', count: account.following_count) .counter{ class: active_nav_class(account_followers_url(account)) } = link_to account_followers_url(account), title: number_with_delimiter(account.followers_count) do - %span.counter-number= number_to_human account.followers_count, strip_insignificant_zeros: true + %span.counter-number= friendly_number_to_human account.followers_count %span.counter-label= t('accounts.followers', count: account.followers_count) .spacer .public-account-header__tabs__tabs__buttons @@ -36,8 +36,8 @@ .public-account-header__extra__links = link_to account_following_index_url(account) do - %strong= number_to_human account.following_count, strip_insignificant_zeros: true + %strong= friendly_number_to_human account.following_count = t('accounts.following', count: account.following_count) = link_to account_followers_url(account) do - %strong= number_to_human account.followers_count, strip_insignificant_zeros: true + %strong= friendly_number_to_human account.followers_count = t('accounts.followers', count: account.followers_count) diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index 1a81b96f6..72e9c6611 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -81,6 +81,6 @@ = t('accounts.nothing_here') - else %time.formatted{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at - .trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true + .trends__item__current= friendly_number_to_human featured_tag.statuses_count = render 'application/sidebar' diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index aa1e126f1..d09409156 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -13,42 +13,42 @@ %div = link_to admin_accounts_url(local: 1, recent: 1) do .dashboard__counters__num{ title: number_with_delimiter(@users_count, strip_insignificant_zeros: true) } - = number_to_human @users_count, strip_insignificant_zeros: true + = friendly_number_to_human @users_count .dashboard__counters__label= t 'admin.dashboard.total_users' %div %div .dashboard__counters__num{ title: number_with_delimiter(@registrations_week, strip_insignificant_zeros: true) } - = number_to_human @registrations_week, strip_insignificant_zeros: true + = friendly_number_to_human @registrations_week .dashboard__counters__label= t 'admin.dashboard.week_users_new' %div %div .dashboard__counters__num{ title: number_with_delimiter(@logins_week, strip_insignificant_zeros: true) } - = number_to_human @logins_week, strip_insignificant_zeros: true + = friendly_number_to_human @logins_week .dashboard__counters__label= t 'admin.dashboard.week_users_active' %div = link_to admin_pending_accounts_path do .dashboard__counters__num{ title: number_with_delimiter(@pending_users_count, strip_insignificant_zeros: true) } - = number_to_human @pending_users_count, strip_insignificant_zeros: true + = friendly_number_to_human @pending_users_count .dashboard__counters__label= t 'admin.dashboard.pending_users' %div = link_to admin_reports_url do .dashboard__counters__num{ title: number_with_delimiter(@reports_count, strip_insignificant_zeros: true) } - = number_to_human @reports_count, strip_insignificant_zeros: true + = friendly_number_to_human @reports_count .dashboard__counters__label= t 'admin.dashboard.open_reports' %div = link_to admin_tags_path(pending_review: '1') do .dashboard__counters__num{ title: number_with_delimiter(@pending_tags_count, strip_insignificant_zeros: true) } - = number_to_human @pending_tags_count, strip_insignificant_zeros: true + = friendly_number_to_human @pending_tags_count .dashboard__counters__label= t 'admin.dashboard.pending_tags' %div %div .dashboard__counters__num{ title: number_with_delimiter(@interactions_week, strip_insignificant_zeros: true) } - = number_to_human @interactions_week, strip_insignificant_zeros: true + = friendly_number_to_human @interactions_week .dashboard__counters__label= t 'admin.dashboard.week_interactions' %div = link_to sidekiq_url do .dashboard__counters__num{ title: number_with_delimiter(@queue_backlog, strip_insignificant_zeros: true) } - = number_to_human @queue_backlog, strip_insignificant_zeros: true + = friendly_number_to_human @queue_backlog .dashboard__counters__label= t 'admin.dashboard.backlog' .dashboard__widgets diff --git a/app/views/admin/follow_recommendations/_account.html.haml b/app/views/admin/follow_recommendations/_account.html.haml index af5a4aaf7..00196dd01 100644 --- a/app/views/admin/follow_recommendations/_account.html.haml +++ b/app/views/admin/follow_recommendations/_account.html.haml @@ -7,10 +7,10 @@ %tr %td= account_link_to account %td.accounts-table__count.optional - = number_to_human account.statuses_count, strip_insignificant_zeros: true + = friendly_number_to_human account.statuses_count %small= t('accounts.posts', count: account.statuses_count).downcase %td.accounts-table__count.optional - = number_to_human account.followers_count, strip_insignificant_zeros: true + = friendly_number_to_human account.followers_count %small= t('accounts.followers', count: account.followers_count).downcase %td.accounts-table__count - if account.last_status_at.present? diff --git a/app/views/admin/instances/_instance.html.haml b/app/views/admin/instances/_instance.html.haml index 990cf9ec8..dc81007ac 100644 --- a/app/views/admin/instances/_instance.html.haml +++ b/app/views/admin/instances/_instance.html.haml @@ -30,4 +30,4 @@ = ' / ' %span.negative-hint = t('admin.instances.delivery.unavailable_message') - .trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= number_to_human instance.accounts_count, strip_insignificant_zeros: true + .trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= friendly_number_to_human instance.accounts_count diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index b060c553f..e8294d812 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -92,7 +92,7 @@ %hr.spacer .speech-bubble - .speech-bubble__bubble= simple_format(@report.comment.presence || t('admin.reports.comment.none')) + .speech-bubble__bubble= simple_format(h(@report.comment.presence || t('admin.reports.comment.none'))) .speech-bubble__owner - if @report.account.local? = admin_account_link_to @report.account diff --git a/app/views/admin/tags/_tag.html.haml b/app/views/admin/tags/_tag.html.haml index adf4ca7b2..ac0c72816 100644 --- a/app/views/admin/tags/_tag.html.haml +++ b/app/views/admin/tags/_tag.html.haml @@ -16,4 +16,4 @@ = fa_icon 'fire fw' = t('admin.tags.trending_right_now') - .trends__item__current= number_to_human tag.history.first[:uses], strip_insignificant_zeros: true + .trends__item__current= friendly_number_to_human tag.history.first[:uses] diff --git a/app/views/directories/index.html.haml b/app/views/directories/index.html.haml index 7975ee999..04639e32c 100644 --- a/app/views/directories/index.html.haml +++ b/app/views/directories/index.html.haml @@ -39,10 +39,10 @@ .directory__card__extra .accounts-table__count - = number_to_human account.statuses_count, strip_insignificant_zeros: true + = friendly_number_to_human account.statuses_count %small= t('accounts.posts', count: account.statuses_count).downcase .accounts-table__count - = number_to_human account.followers_count, strip_insignificant_zeros: true + = friendly_number_to_human account.followers_count %small= t('accounts.followers', count: account.followers_count).downcase .accounts-table__count - if account.last_status_at.present? diff --git a/app/views/relationships/_account.html.haml b/app/views/relationships/_account.html.haml index f521aff22..0fa3cffb5 100644 --- a/app/views/relationships/_account.html.haml +++ b/app/views/relationships/_account.html.haml @@ -9,10 +9,10 @@ = interrelationships_icon(@relationships, account.id) %td= account_link_to account %td.accounts-table__count.optional - = number_to_human account.statuses_count, strip_insignificant_zeros: true + = friendly_number_to_human account.statuses_count %small= t('accounts.posts', count: account.statuses_count).downcase %td.accounts-table__count.optional - = number_to_human account.followers_count, strip_insignificant_zeros: true + = friendly_number_to_human account.followers_count %small= t('accounts.followers', count: account.followers_count).downcase %td.accounts-table__count - if account.last_status_at.present? diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml index 297379893..65de7f8f3 100644 --- a/app/views/settings/featured_tags/index.html.haml +++ b/app/views/settings/featured_tags/index.html.haml @@ -28,4 +28,4 @@ - else %time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at = table_link_to 'trash', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } - .trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true + .trends__item__current= friendly_number_to_human featured_tag.statuses_count diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml index 754acfa0c..5f2971b2e 100644 --- a/app/views/statuses/_detailed_status.html.haml +++ b/app/views/statuses/_detailed_status.html.haml @@ -55,18 +55,18 @@ = fa_icon('reply') - else = fa_icon('reply-all') - %span.detailed-status__reblogs>= number_to_human status.replies_count, strip_insignificant_zeros: true + %span.detailed-status__reblogs>= friendly_number_to_human status.replies_count = " " · - if status.public_visibility? || status.unlisted_visibility? = link_to remote_interaction_path(status, type: :reblog), class: 'modal-button detailed-status__link' do = fa_icon('retweet') - %span.detailed-status__reblogs>= number_to_human status.reblogs_count, strip_insignificant_zeros: true + %span.detailed-status__reblogs>= friendly_number_to_human status.reblogs_count = " " · = link_to remote_interaction_path(status, type: :favourite), class: 'modal-button detailed-status__link' do = fa_icon('star') - %span.detailed-status__favorites>= number_to_human status.favourites_count, strip_insignificant_zeros: true + %span.detailed-status__favorites>= friendly_number_to_human status.favourites_count = " " - if status.local_only diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb index 6c5a576a7..788f2cf80 100644 --- a/app/workers/activitypub/delivery_worker.rb +++ b/app/workers/activitypub/delivery_worker.rb @@ -44,11 +44,7 @@ class ActivityPub::DeliveryWorker end def synchronization_header - "collectionId=\"#{account_followers_url(@source_account)}\", digest=\"#{@source_account.remote_followers_hash(inbox_url_prefix)}\", url=\"#{account_followers_synchronization_url(@source_account)}\"" - end - - def inbox_url_prefix - @inbox_url[/http(s?):\/\/[^\/]+\//] + "collectionId=\"#{account_followers_url(@source_account)}\", digest=\"#{@source_account.remote_followers_hash(@inbox_url)}\", url=\"#{account_followers_synchronization_url(@source_account)}\"" end def perform_request diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb index 4e20ef31b..e85cd7e95 100644 --- a/app/workers/distribution_worker.rb +++ b/app/workers/distribution_worker.rb @@ -4,7 +4,7 @@ class DistributionWorker include Sidekiq::Worker def perform(status_id) - RedisLock.acquire(redis: Redis.current, key: "distribute:#{status_id}") do |lock| + RedisLock.acquire(redis: Redis.current, key: "distribute:#{status_id}", autorelease: 5.minutes.seconds) do |lock| if lock.acquired? FanOutOnWriteService.new.call(Status.find(status_id)) else diff --git a/app/workers/move_worker.rb b/app/workers/move_worker.rb index 39e321316..4a900e3b8 100644 --- a/app/workers/move_worker.rb +++ b/app/workers/move_worker.rb @@ -13,9 +13,13 @@ class MoveWorker queue_follow_unfollows! end + @deferred_error = nil + copy_account_notes! carry_blocks_over! carry_mutes_over! + + raise @deferred_error unless @deferred_error.nil? rescue ActiveRecord::RecordNotFound true end @@ -36,21 +40,31 @@ class MoveWorker @source_account.followers.local.select(:id).find_in_batches do |accounts| UnfollowFollowWorker.push_bulk(accounts.map(&:id)) { |follower_id| [follower_id, @source_account.id, @target_account.id, bypass_locked] } + rescue => e + @deferred_error = e end end def copy_account_notes! AccountNote.where(target_account: @source_account).find_each do |note| - text = I18n.with_locale(note.account.user.locale || I18n.default_locale) do + text = I18n.with_locale(note.account.user&.locale || I18n.default_locale) do I18n.t('move_handler.copy_account_note_text', acct: @source_account.acct) end new_note = AccountNote.find_by(account: note.account, target_account: @target_account) if new_note.nil? - AccountNote.create!(account: note.account, target_account: @target_account, comment: [text, note.comment].join('\n')) + begin + AccountNote.create!(account: note.account, target_account: @target_account, comment: [text, note.comment].join("\n")) + rescue ActiveRecord::RecordInvalid + AccountNote.create!(account: note.account, target_account: @target_account, comment: note.comment) + end else - new_note.update!(comment: [text, note.comment, '\n', new_note.comment].join('\n')) + new_note.update!(comment: [text, note.comment, "\n", new_note.comment].join("\n")) end + rescue ActiveRecord::RecordInvalid + nil + rescue => e + @deferred_error = e end end @@ -60,6 +74,8 @@ class MoveWorker BlockService.new.call(block.account, @target_account) add_account_note_if_needed!(block.account, 'move_handler.carry_blocks_over_text') end + rescue => e + @deferred_error = e end end @@ -67,12 +83,14 @@ class MoveWorker @source_account.muted_by_relationships.where(account: Account.local).find_each do |mute| MuteService.new.call(mute.account, @target_account, notifications: mute.hide_notifications) unless mute.account.muting?(@target_account) || mute.account.following?(@target_account) add_account_note_if_needed!(mute.account, 'move_handler.carry_mutes_over_text') + rescue => e + @deferred_error = e end end def add_account_note_if_needed!(account, id) unless AccountNote.where(account: account, target_account: @target_account).exists? - text = I18n.with_locale(account.user.locale || I18n.default_locale) do + text = I18n.with_locale(account.user&.locale || I18n.default_locale) do I18n.t(id, acct: @source_account.acct) end AccountNote.create!(account: account, target_account: @target_account, comment: text) diff --git a/chart/values.yaml b/chart/values.yaml index a638f4a7d..d3036bb4a 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -8,7 +8,7 @@ image: # built from the most recent commit # # tag: latest - tag: v3.3.0 + tag: v3.4.6 # use `Always` when using `latest` tag pullPolicy: IfNotPresent diff --git a/config/application.rb b/config/application.rb index 8200a2fcf..1761bdc2e 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,6 +1,21 @@ require_relative 'boot' -require 'rails/all' +require 'rails' + +require 'active_record/railtie' +#require 'active_storage/engine' +require 'action_controller/railtie' +require 'action_view/railtie' +require 'action_mailer/railtie' +require 'active_job/railtie' +#require 'action_cable/engine' +#require 'action_mailbox/engine' +#require 'action_text/engine' +#require 'rails/test_unit/railtie' +require 'sprockets/railtie' + +# Used to be implicitly required in action_mailbox/engine +require 'mail' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. @@ -73,6 +88,7 @@ module Mastodon :eo, :es, :'es-AR', + :'es-MX', :et, :eu, :fa, diff --git a/config/brakeman.ignore b/config/brakeman.ignore index 35f2c3178..07a2c377f 100644 --- a/config/brakeman.ignore +++ b/config/brakeman.ignore @@ -60,46 +60,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "6e4051854bb62e2ddbc671f82d6c2328892e1134b8b28105ecba9b0122540714", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/account.rb", - "line": 479, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "find_by_sql([\" WITH first_degree AS (\\n SELECT target_account_id\\n FROM follows\\n WHERE account_id = ?\\n UNION ALL\\n SELECT ?\\n )\\n SELECT\\n accounts.*,\\n (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?)\\n WHERE accounts.id IN (SELECT * FROM first_degree)\\n AND #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n GROUP BY accounts.id\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, account.id, limit, offset])", - "render_path": null, - "location": { - "type": "method", - "class": "Account", - "method": "advanced_search_for" - }, - "user_input": "textsearch", - "confidence": "Medium", - "note": "" - }, - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "6f075c1484908e3ec9bed21ab7cf3c7866be8da3881485d1c82e13093aefcbd7", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/status.rb", - "line": 105, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "result.joins(\"LEFT OUTER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")", - "render_path": null, - "location": { - "type": "method", - "class": "Status", - "method": null - }, - "user_input": "id", - "confidence": "Weak", - "note": "" - }, { "warning_type": "Mass Assignment", "warning_code": 105, @@ -140,26 +100,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "9251d682c4e2840e1b2fea91e7d758efe2097ecb7f6255c065e3750d25eb178c", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/account.rb", - "line": 448, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "find_by_sql([\" SELECT\\n accounts.*,\\n ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n WHERE #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, limit, offset])", - "render_path": null, - "location": { - "type": "method", - "class": "Account", - "method": "search_for" - }, - "user_input": "textsearch", - "confidence": "Medium", - "note": "" - }, { "warning_type": "SQL Injection", "warning_code": 0, @@ -220,26 +160,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "SQL Injection", - "warning_code": 0, - "fingerprint": "e21d8fee7a5805761679877ca35ed1029c64c45ef3b4012a30262623e1ba8bb9", - "check_name": "SQL", - "message": "Possible SQL injection", - "file": "app/models/account.rb", - "line": 495, - "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", - "code": "find_by_sql([\" SELECT\\n accounts.*,\\n (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?)\\n WHERE #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n GROUP BY accounts.id\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, limit, offset])", - "render_path": null, - "location": { - "type": "method", - "class": "Account", - "method": "advanced_search_for" - }, - "user_input": "textsearch", - "confidence": "Medium", - "note": "" - }, { "warning_type": "Mass Assignment", "warning_code": 105, diff --git a/config/deploy.rb b/config/deploy.rb index f844cc871..f642e6e59 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -2,7 +2,7 @@ lock '3.16.0' -set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git') +set :repo_url, ENV.fetch('REPO', 'https://github.com/mastodon/mastodon.git') set :branch, ENV.fetch('BRANCH', 'master') set :application, 'mastodon' diff --git a/config/environments/production.rb b/config/environments/production.rb index df6b07d77..81580a268 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -118,7 +118,7 @@ Rails.application.configure do 'Server' => 'Mastodon', 'X-Frame-Options' => 'DENY', 'X-Content-Type-Options' => 'nosniff', - 'X-XSS-Protection' => '1; mode=block', + 'X-XSS-Protection' => '0', 'Permissions-Policy' => 'interest-cohort=()', } diff --git a/config/initializers/1_hosts.rb b/config/initializers/1_hosts.rb index f470fddb3..6ff0845c4 100644 --- a/config/initializers/1_hosts.rb +++ b/config/initializers/1_hosts.rb @@ -31,6 +31,6 @@ Rails.application.configure do config.hosts << host if host.present? config.hosts << web_host if web_host.present? config.hosts.concat(alternate_domains) if alternate_domains.present? - config.hosts_authorization = { exclude: ->(request) { request.path == '/health' } } + config.host_authorization = { exclude: ->(request) { request.path == '/health' } } end end diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index ef612e177..5232e6cfd 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -1,3 +1,5 @@ +require 'devise/strategies/authenticatable' + Warden::Manager.after_set_user except: :fetch do |user, warden| if user.session_active?(warden.cookies.signed['_session_id'] || warden.raw_session['auth_id']) session_id = warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'] @@ -72,17 +74,48 @@ module Devise mattr_accessor :ldap_uid_conversion_replace @@ldap_uid_conversion_replace = nil - class Strategies::PamAuthenticatable - def valid? - super && ::Devise.pam_authentication + module Strategies + class PamAuthenticatable + def valid? + super && ::Devise.pam_authentication + end + end + + class SessionActivationRememberable < Authenticatable + def valid? + @session_cookie = nil + session_cookie.present? + end + + def authenticate! + resource = SessionActivation.find_by(session_id: session_cookie)&.user + + unless resource + cookies.delete('_session_id') + return pass + end + + if validate(resource) + success!(resource) + end + end + + private + + def session_cookie + @session_cookie ||= cookies.signed['_session_id'] + end end end end +Warden::Strategies.add(:session_activation_rememberable, Devise::Strategies::SessionActivationRememberable) + Devise.setup do |config| config.warden do |manager| manager.default_strategies(scope: :user).unshift :two_factor_ldap_authenticatable if Devise.ldap_authentication manager.default_strategies(scope: :user).unshift :two_factor_pam_authenticatable if Devise.pam_authentication + manager.default_strategies(scope: :user).unshift :session_activation_rememberable manager.default_strategies(scope: :user).unshift :two_factor_authenticatable manager.default_strategies(scope: :user).unshift :two_factor_backupable end diff --git a/config/initializers/delivery_job.rb b/config/initializers/mail_delivery_job.rb similarity index 52% rename from config/initializers/delivery_job.rb rename to config/initializers/mail_delivery_job.rb index cc2927272..327817396 100644 --- a/config/initializers/delivery_job.rb +++ b/config/initializers/mail_delivery_job.rb @@ -1,3 +1,3 @@ -ActionMailer::DeliveryJob.class_eval do +ActionMailer::MailDeliveryJob.class_eval do discard_on ActiveJob::DeserializationError end diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb index 3ff2aa9e5..84c09ff35 100644 --- a/config/initializers/twitter_regex.rb +++ b/config/initializers/twitter_regex.rb @@ -24,6 +24,10 @@ module Twitter::TwitterText ) \) /iox + REGEXEN[:valid_iri_ucschar] = /[\u{A0}-\u{D7FF}\u{F900}-\u{FDCF}\u{FDF0}-\u{FFEF}\u{10000}-\u{1FFFD}\u{20000}-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}\u{50000}-\u{5FFFD}\u{60000}-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}\u{90000}-\u{9FFFD}\u{A0000}-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}\u{D0000}-\u{DFFFD}\u{E1000}-\u{EFFFD}]/iou + REGEXEN[:valid_iri_iprivate] = /[\u{E000}-\u{F8FF}\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/iou + REGEXEN[:valid_url_query_chars] = /(?:#{REGEXEN[:valid_iri_ucschar]})|(?:#{REGEXEN[:valid_iri_iprivate]})|[a-z0-9!?\*'\(\);:&=\+\$\/%#\[\]\-_\.,~|@]/iou + REGEXEN[:valid_url_query_ending_chars] = /(?:#{REGEXEN[:valid_iri_ucschar]})|(?:#{REGEXEN[:valid_iri_iprivate]})|[a-z0-9_&=#\/\-]/iou REGEXEN[:valid_url_path] = /(?: (?: #{REGEXEN[:valid_general_url_path_chars]}* diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index ec8dad1b1..d5f19ca64 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -24,7 +24,7 @@ en: status: attributes: reblog: - taken: of status already exists + taken: of post already exists user: attributes: email: diff --git a/config/locales/activerecord.es-AR.yml b/config/locales/activerecord.es-AR.yml index 4cef76e4a..9d6a479a7 100644 --- a/config/locales/activerecord.es-AR.yml +++ b/config/locales/activerecord.es-AR.yml @@ -24,7 +24,7 @@ es-AR: status: attributes: reblog: - taken: del estado ya existe + taken: del mensaje ya existe user: attributes: email: diff --git a/config/locales/activerecord.es-MX.yml b/config/locales/activerecord.es-MX.yml index 9326e89d1..da658a338 100644 --- a/config/locales/activerecord.es-MX.yml +++ b/config/locales/activerecord.es-MX.yml @@ -2,6 +2,9 @@ es-MX: activerecord: attributes: + poll: + expires_at: Vencimiento + options: Opciones user: agreement: Acuerdo de Servicio email: Dirección de correo electrónico @@ -16,7 +19,12 @@ es-MX: account: attributes: username: + invalid: solo puede contener letras, números y guiones bajos reserved: está reservado + status: + attributes: + reblog: + taken: del estado ya existe user: attributes: email: diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml index e05c9c1e2..0c4d6e5cf 100644 --- a/config/locales/activerecord.es.yml +++ b/config/locales/activerecord.es.yml @@ -2,6 +2,9 @@ es: activerecord: attributes: + poll: + expires_at: Vencimiento + options: Opciones user: agreement: Acuerdo de Servicio email: Dirección de correo electrónico @@ -16,7 +19,12 @@ es: account: attributes: username: + invalid: solo puede contener letras, números y guiones bajos reserved: está reservado + status: + attributes: + reblog: + taken: del estado ya existe user: attributes: email: diff --git a/config/locales/activerecord.gd.yml b/config/locales/activerecord.gd.yml index eb09e8866..2920b561e 100644 --- a/config/locales/activerecord.gd.yml +++ b/config/locales/activerecord.gd.yml @@ -24,7 +24,7 @@ gd: status: attributes: reblog: - taken: "– tha seo aig an staid mu thràth" + taken: "– tha seo aig a’ phost mu thràth" user: attributes: email: diff --git a/config/locales/activerecord.th.yml b/config/locales/activerecord.th.yml index 5b693e2af..ef93d4ce9 100644 --- a/config/locales/activerecord.th.yml +++ b/config/locales/activerecord.th.yml @@ -22,7 +22,7 @@ th: status: attributes: reblog: - taken: ของสถานะมีอยู่แล้ว + taken: ของโพสต์มีอยู่แล้ว user: attributes: email: diff --git a/config/locales/activerecord.zh-TW.yml b/config/locales/activerecord.zh-TW.yml index 2e685868d..c6856c386 100644 --- a/config/locales/activerecord.zh-TW.yml +++ b/config/locales/activerecord.zh-TW.yml @@ -7,7 +7,7 @@ zh-TW: options: 選擇 user: agreement: 服務同意書 - email: 電子信箱位址 + email: 電子信箱地址 locale: 地區 password: 密碼 user/account: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 204bb76e4..c1d44a8be 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -916,7 +916,7 @@ cs: csv: CSV domain_blocks: Blokování domén lists: Seznamy - mutes: Skryli jste + mutes: Skrýváte storage: Paměť médií featured_tags: add_new: Přidat nový @@ -1468,7 +1468,7 @@ cs: edit_profile_step: Svůj profil si můžete přizpůsobit nahráním avataru a obrázku záhlaví, změnou zobrazovaného jména a další. Chcete-li posoudit nové sledující předtím, než vás mohou sledovat, můžete svůj účet uzamknout. explanation: Zde je pár tipů do začátku final_action: Začít psát - final_step: 'Začněte psát! I když nemáte sledující, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a v hashtazích. Můžete se ostatním představit pomocí hashtagu #introductions.' + final_step: 'Začněte psát! I když nemáte sledující, mohou vaše veřejné příspěvky vidět jiní lidé, například na místní časové ose a v hashtazích. Můžete se ostatním představit pomocí hashtagu #introductions.' full_handle: Vaše celá adresa profilu full_handle_hint: Tohle je, co byste řekli svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru. review_preferences_action: Změnit předvolby diff --git a/config/locales/da.yml b/config/locales/da.yml index 79e8d8cca..90e9e008e 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -6,7 +6,7 @@ da: about_this: Om active_count_after: aktive active_footnote: Månedlige aktive brugere (MAU) - administered_by: 'Administreret af:' + administered_by: 'Administreres af:' api: API apps: Mobil-apps apps_platforms: Benyt Mastodon på Android, iOS og andre platforme @@ -289,6 +289,7 @@ da: enable_custom_emoji_html: "%{name} aktiverede humørikonet %{target}" enable_user_html: "%{name} aktiverede indlogning for brugeren %{target}" memorialize_account_html: "%{name} gjorde %{target}s konto til en mindeside" + promote_user_html: "%{name} forfremmede brugeren %{target}" remove_avatar_user_html: "%{name} fjernede %{target}s profilbillede" reopen_report_html: "%{name} genåbnede anmeldelsen %{target}" reset_password_user_html: "%{name} nulstillede adgangskoden for brugeren %{target}" @@ -854,6 +855,7 @@ da: caches: Indhold, cachelagret af andre servere, kan fortsat eksistere data_removal: Dine indlæg og andre data fjernes permanent email_change_html: Du kan skifte e-mailadresse uden at slette din konto + email_contact_html: Hvis det stadig ikke ankommer, kan du sende en e-mail til %{email} for hjælp email_reconfirmation_html: Modtager du ikke bekræftelsese-mailen, kan du anmode om en ny irreversible: Du vil ikke kunne gendanne/genaktivere din konto more_details_html: For yderligere oplysningerer, tjek fortrolighedspolitikken. diff --git a/config/locales/de.yml b/config/locales/de.yml index 2ccdf3a0d..cded342f6 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -27,7 +27,7 @@ de: learn_more: Mehr erfahren privacy_policy: Datenschutzerklärung rules: Server-Regeln - rules_html: 'Unten ist eine Zusammenfassung der Regeln, denen du folgen folgen musst, wenn du ein Konto auf diesem Mastodon-Server haben möchtest:' + rules_html: 'Unten ist eine Zusammenfassung der Regeln, denen du folgen musst, wenn du ein Konto auf diesem Mastodon-Server haben möchtest:' see_whats_happening: Finde heraus, was gerade in der Welt los ist server_stats: 'Serverstatistiken:' source_code: Quellcode diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml index 29489aeb0..7cfae2da6 100644 --- a/config/locales/devise.es.yml +++ b/config/locales/devise.es.yml @@ -65,3 +65,51 @@ es: explanation: La siguiente clave de seguridad ha sido añadida a su cuenta subject: 'Mastodon: Nueva clave de seguridad' title: Se ha añadido una nueva clave de seguridad + deleted: + explanation: La siguiente clave de seguridad ha sido eliminada de tu cuenta + subject: 'Mastodon: Clave de seguridad eliminada' + title: Una de tus claves de seguridad ha sido eliminada + webauthn_disabled: + explanation: La autenticación con claves de seguridad ha sido deshabilitada para tu cuenta. Ahora el inicio de sesión solo es posible utilizando el token generado por la aplicación TOTP emparejada. + subject: 'Mastodon: Autenticación con claves de seguridad deshabilitada' + title: Claves de seguridad deshabilitadas + webauthn_enabled: + explanation: La autenticación con clave de seguridad ha sido habilitada para tu cuenta. Ahora tu clave de seguridad puede ser utilizada para iniciar sesión. + subject: 'Mastodon: Autenticación de clave de seguridad habilitada' + title: Claves de seguridad habilitadas + omniauth_callbacks: + failure: No se te pudo autenticar desde %{kind} porque “%{reason}”. + success: Autenticado correctamente desde la cuenta de %{kind}. + passwords: + no_token: No puedes acceder a esta página si no vienes desde un correo electrónico de restablecimiento de contraseña. Si vienes desde un correo electrónico de restablecimiento de contraseña, por favor asegúrate de utilizar la URL completa proporcionada. + send_instructions: Si tu dirección de correo electrónico existe en nuestra base de datos, recibirás un enlace de recuperación de contraseña en tu dirección de correo electrónico en pocos minutos. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico. + send_paranoid_instructions: Si tu dirección de correo electrónico existe en nuestra base de datos, recibirás un enlace de recuperación de contraseña en tu dirección de correo electrónico en pocos minutos. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico. + updated: Tu contraseña ha sido cambiada con éxito. Has iniciado sesión. + updated_not_active: Tu contraseña se ha cambiado con éxito. + registrations: + destroyed: "¡Hasta otra! Tu cuenta ha sido cancelada con éxito. Esperamos verte de nuevo pronto." + signed_up: "¡Bienvenido! Te has registrado correctamente." + signed_up_but_inactive: Te has registrado con éxito. Sin embargo, no se ha podido iniciar sesión porque tu cuenta aún no está activada. + signed_up_but_locked: Te has registrado con éxito. Sin embargo, no se ha podido iniciar sesión porque tu cuenta está bloqueada. + signed_up_but_pending: Un mensaje con un enlace de confirmación ha sido enviado a tu dirección de correo electrónico. Después de hacer clic en el enlace, revisaremos tu solicitud. Serás notificado si se aprueba. + signed_up_but_unconfirmed: Un mensaje con un enlace de confirmación ha sido enviado a tu dirección de correo electrónico. Por favor, sigue el enlace para activar tu cuenta. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico. + update_needs_confirmation: Has actualizado tu cuenta con éxito, pero necesitamos verificar tu nueva dirección de correo electrónico. Por favor, comprueba tu correo electrónico y sigue el enlace de confirmación para confirmar tu nueva dirección de correo electrónico. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico. + updated: Tu cuenta se ha actualizado con éxito. + sessions: + already_signed_out: Sesión cerrada con éxito. + signed_in: Sesión iniciada con éxito. + signed_out: Sesión cerrada con éxito. + unlocks: + send_instructions: En unos minutos recibirás un correo electrónico con instrucciones para desbloquear tu cuenta. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico. + send_paranoid_instructions: Si tu cuenta existe, en unos minutos recibirás un correo electrónico con instrucciones para desbloquearla. Por favor, revisa tu carpeta de correo no deseado si no recibes dicho correo electrónico. + unlocked: Tu cuenta ha sido desbloqueada con éxito. Por favor, inicia sesión para continuar. + errors: + messages: + already_confirmed: ya estaba confirmada, por favor intenta iniciar sesión + confirmation_period_expired: necesita confirmarse dentro de %{period}, por favor, solicita una nueva + expired: ha caducado, por favor solicita una nueva + not_found: no encontrado + not_locked: no estaba bloqueada + not_saved: + one: '1 error impidió que este %{resource} se guardase:' + other: "%{count} errores impidieron que este %{resource} se guardase:" diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml index 1a3506737..d05985f4d 100644 --- a/config/locales/devise.hu.yml +++ b/config/locales/devise.hu.yml @@ -6,7 +6,7 @@ hu: send_instructions: Néhány percen belül kapni fogsz egy levelet az e-mail cím megerősítésére vonatkozó utasításokkal. Kérjük, ellenőrizd a spam mappádat, ha nem látod az e-mailt a beérkezett e-mailek közt. send_paranoid_instructions: Ha az e-mail címed már szerepel az adatbázisunkban, néhány percen belül kapsz egy levelet az e-mail cím megerősítésére vonatkozó utasításokkal. Kérjük, ellenőrizd a spam mappád, ha nem látod az e-mailt. failure: - already_authenticated: Már be van jelentkezve. + already_authenticated: Már bejelentkeztél. inactive: A fiókod még nincs aktiválva. invalid: Helytelen %{authentication_keys} vagy jelszó. last_attempt: Már csak egy próbálkozásod maradt, mielőtt a fiókodat zároljuk. @@ -47,7 +47,7 @@ hu: subject: 'Mastodon: Jelszó visszaállítási lépések' title: Jelszó visszaállítása two_factor_disabled: - explanation: A fiókod kétfaktoros hitelesítését kikapcsoltuk. A bejelentkezés mostantól csak az e-mail cím és a jelszó használatával lesz lehetséges. + explanation: A fiókod kétlépcsős hitelesítését kikapcsoltuk. A bejelentkezés mostantól csak az e-mail cím és a jelszó használatával lesz lehetséges. subject: Kétlépcsős azonosítás kikapcsolva title: Kétlépcsős hitelesítés kikapcsolva two_factor_enabled: diff --git a/config/locales/devise.it.yml b/config/locales/devise.it.yml index 31e3c7f94..53e8169e4 100644 --- a/config/locales/devise.it.yml +++ b/config/locales/devise.it.yml @@ -20,7 +20,7 @@ it: confirmation_instructions: action: Verifica indirizzo email action_with_app: Conferma e torna a %{app} - explanation: Hai creato un account su %{host} con questo indirizzo email. Sei lonatno solo un clic dall'attivarlo. Se non sei stato tu, per favore ignora questa email. + explanation: Hai creato un account su %{host} con questo indirizzo email. Sei lontano solo un clic dall'attivarlo. Se non sei stato tu, per favore ignora questa email. explanation_when_pending: Hai richiesto un invito a %{host} con questo indirizzo email. Una volta confermato il tuo indirizzo e-mail, analizzeremo la tua richiesta. Non potrai eseguire l'accesso fino a quel momento. Se la tua richiesta sarà rifiutata, i tuoi dati saranno rimossi, quindi nessun'altra azione ti sarà richiesta. Se non fossi stato tu, per favore ignora questa email. extra_html: Per favore controllale regole del server e i nostri termini di servizio. subject: 'Mastodon: Istruzioni di conferma per %{instance}' diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml index 5e982ba05..b16532606 100644 --- a/config/locales/devise.sv.yml +++ b/config/locales/devise.sv.yml @@ -68,7 +68,7 @@ sv: deleted: explanation: Följande säkerhetsnyckel har tagits bort från ditt konto subject: 'Mastodon: Säkerhetsnyckeln borttagen' - title: En av dina säkerhetsnycklar har tagits bort + title: En av dina säkerhetsnycklar har raderats webauthn_disabled: explanation: Autentisering med säkerhetsnycklar till ditt konto har inaktiverats. Inloggning är nu endast möjligt med den token som genereras av den sammankopplade TOTP-appen. subject: 'Mastodon: Autentisering med säkerhetsnycklar är inaktiverat' diff --git a/config/locales/devise.th.yml b/config/locales/devise.th.yml index 62ab8f93e..0b5524a74 100644 --- a/config/locales/devise.th.yml +++ b/config/locales/devise.th.yml @@ -14,7 +14,7 @@ th: not_found_in_database: "%{authentication_keys} หรือรหัสผ่านไม่ถูกต้อง" pending: บัญชีของคุณยังอยู่ระหว่างการตรวจทาน timeout: เซสชันของคุณหมดอายุแล้ว โปรดลงชื่อเข้าอีกครั้งเพื่อดำเนินการต่อ - unauthenticated: คุณต้องลงชื่อเข้าหรือลงทะเบียนก่อนดำเนินการต่อ + unauthenticated: คุณจำเป็นต้องลงชื่อเข้าหรือลงทะเบียนก่อนดำเนินการต่อ unconfirmed: คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนดำเนินการต่อ mailer: confirmation_instructions: @@ -76,7 +76,7 @@ th: subject: 'Mastodon: เปิดใช้งานการรับรองความถูกต้องด้วยกุญแจความปลอดภัยแล้ว' title: เปิดใช้งานกุญแจความปลอดภัยแล้ว omniauth_callbacks: - failure: ไม่สามารถรับรองความถูกต้องของคุณจาก %{kind} เนื่องจาก "%{reason}" + failure: ไม่สามารถรับรองความถูกต้องคุณจาก %{kind} เนื่องจาก “%{reason}” success: รับรองความถูกต้องจากบัญชี %{kind} สำเร็จ passwords: no_token: คุณไม่สามารถเข้าถึงหน้านี้โดยไม่ได้มาจากอีเมลการตั้งรหัสผ่านใหม่ หากคุณมาจากอีเมลการตั้งรหัสผ่านใหม่ โปรดตรวจสอบให้แน่ใจว่าคุณได้ใช้ URL แบบเต็มที่ให้มา @@ -104,7 +104,7 @@ th: errors: messages: already_confirmed: ได้รับการยืนยันไปแล้ว โปรดลองลงชื่อเข้า - confirmation_period_expired: ต้องได้รับการยืนยันภายใน %{period} โปรดขออีเมลใหม่ + confirmation_period_expired: จำเป็นต้องได้รับการยืนยันภายใน %{period} โปรดขออีเมลใหม่ expired: หมดอายุแล้ว โปรดขออีเมลใหม่ not_found: ไม่พบ not_locked: ไม่ได้ล็อคอยู่ diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index f7b087824..910c77e8a 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -2,14 +2,14 @@ zh-TW: devise: confirmations: - confirmed: 您的電子信箱位址已確認成功。 + confirmed: 您的電子信箱地址已確認成功。 send_instructions: 幾分鐘後您將收到確認信件。若未收到此信件,請檢查垃圾郵件資料夾。 send_paranoid_instructions: 如果您的電子信箱存在於我們的資料庫,您將會在幾分鐘內收到確認信。若未收到請檢查垃圾郵件資料夾。 failure: already_authenticated: 您已登入。 inactive: 您的帳戶尚未啟用。 invalid: 無效的 %{authentication_keys} 或密碼。 - last_attempt: 在帳號鎖定前,您還有最後一次嘗試機會。 + last_attempt: 在帳戶鎖定前,您還有最後一次嘗試機會。 locked: 已鎖定您的帳戶。 not_found_in_database: 無效的 %{authentication_keys} 或密碼。 pending: 您的帳戶仍在審核中。 @@ -18,28 +18,28 @@ zh-TW: unconfirmed: 您必須先確認電子信箱才能繼續使用。 mailer: confirmation_instructions: - action: 驗證電子信箱位址 + action: 驗證電子信箱地址 action_with_app: 確認並返回 %{app} - explanation: 您已經在 %{host} 上以此電子信箱位址建立了一支帳戶。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。 - explanation_when_pending: 您使用此電子信箱位址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請。您可以登入以改變您的細節或刪除您的帳號,但直到您的帳號被核准之前,您無法操作大部分的功能。若您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。 + explanation: 您已經在 %{host} 上以此電子信箱地址建立了一支帳戶。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。 + explanation_when_pending: 您使用此電子信箱地址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請。您可以登入以改變您的細節或刪除您的帳戶,但直到您的帳戶被核准之前,您無法操作大部分的功能。若您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。 extra_html: 同時也請看看伺服器規則服務條款。 subject: Mastodon:%{instance} 確認說明 - title: 驗證電子信箱位址 + title: 驗證電子信箱地址 email_changed: - explanation: 您帳戶的電子信箱位址將變更為: + explanation: 您帳戶的電子信箱地址將變更為: extra: 若您未變更電子信箱,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。 subject: Mastodon:已變更電子信箱 - title: 新電子信箱位址 + title: 新電子信箱地址 password_change: explanation: 您帳戶的密碼已變更。 extra: 若您未變更密碼,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。 subject: Mastodon:已變更密碼 title: 密碼已變更 reconfirmation_instructions: - explanation: 請確認新的電子信箱位址以變更。 - extra: 若此次變更不是由您開啟的,請忽略此信件。Mastodon 帳戶的電子信箱位址在您存取上面的連結前不會變更。 - subject: Mastodon:確認 %{instance} 的電子信箱位址 - title: 驗證電子信箱位址 + explanation: 請確認新的電子信箱地址以變更。 + extra: 若此次變更不是由您開啟的,請忽略此信件。Mastodon 帳戶的電子信箱地址在您存取上面的連結前不會變更。 + subject: Mastodon:確認 %{instance} 的電子信箱地址 + title: 驗證電子信箱地址 reset_password_instructions: action: 變更密碼 explanation: 您已請求帳戶的新密碼。 @@ -82,8 +82,8 @@ zh-TW: success: 成功透過 %{kind} 帳戶登入。 passwords: no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。 - send_instructions: 若電子信箱位址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 - send_paranoid_instructions: 若電子信箱位址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 + send_instructions: 若電子信箱地址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 + send_paranoid_instructions: 若電子信箱地址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。 updated: 您的密碼已成功變更,現在已經登入。 updated_not_active: 您的密碼已成功變更。 registrations: @@ -92,16 +92,16 @@ zh-TW: signed_up_but_inactive: 您已註冊成功,但由於您的帳戶尚未啟用,我們暫時無法讓您登入。 signed_up_but_locked: 您已註冊成功,但由於您的帳戶已被鎖定,我們無法讓您登入。 signed_up_but_pending: 包含確認連結的訊息已寄到您的電子信箱。按下此連結後我們將審核您的申請。核准後將通知您。 - signed_up_but_unconfirmed: 包含確認連結的訊息已寄到您的電子信箱。請前往連結以啟用帳號。若未收到請檢查垃圾郵件資料夾。 - update_needs_confirmation: 已成功更新您的帳號,但仍需驗證您的新信箱。請檢查電子信箱並前往確認連結來確認新信箱位址。若未收到請檢查垃圾郵件資料夾。 + signed_up_but_unconfirmed: 包含確認連結的訊息已寄到您的電子信箱。請前往連結以啟用帳戶。若未收到請檢查垃圾郵件資料夾。 + update_needs_confirmation: 已成功更新您的帳戶,但仍需驗證您的新信箱。請檢查電子信箱並前往確認連結來確認新信箱地址。若未收到請檢查垃圾郵件資料夾。 updated: 您的帳戶已成功更新。 sessions: already_signed_out: 已成功登出。 signed_in: 已成功登入。 signed_out: 已成功登出。 unlocks: - send_instructions: 幾分鐘後您將收到解鎖帳號的指引信件。若未收到請檢查垃圾郵件資料夾。 - send_paranoid_instructions: 若此帳號存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。 + send_instructions: 幾分鐘後您將收到解鎖帳戶的指引信件。若未收到請檢查垃圾郵件資料夾。 + send_paranoid_instructions: 若此帳戶存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。 unlocked: 已解鎖您的帳戶,請登入繼續。 errors: messages: diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml index dc1f491a4..05fac0036 100644 --- a/config/locales/doorkeeper.da.yml +++ b/config/locales/doorkeeper.da.yml @@ -33,7 +33,7 @@ da: help: native_redirect_uri: Brug %{native_redirect_uri} til lokale tests redirect_uri: Brug én linje pr. URI - scopes: Adskil omfang med mellemrum. Lad være blankt for at bruge standard omfang. + scopes: Adskil omfang med mellemrum. Lad være tomt for standardomfang. index: application: Applikation callback_url: Callback-URL diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index ec322f071..8aa099284 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -138,12 +138,12 @@ en: read:notifications: see your notifications read:reports: see your reports read:search: search on your behalf - read:statuses: see all statuses + read:statuses: see all posts write: modify all your account's data write:accounts: modify your profile write:blocks: block accounts and domains - write:bookmarks: bookmark statuses - write:favourites: favourite statuses + write:bookmarks: bookmark posts + write:favourites: favourite posts write:filters: create filters write:follows: follow people write:lists: create lists @@ -151,4 +151,4 @@ en: write:mutes: mute people and conversations write:notifications: clear your notifications write:reports: report other people - write:statuses: publish statuses + write:statuses: publish posts diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml index 7af66e81b..f914a62ff 100644 --- a/config/locales/doorkeeper.es-AR.yml +++ b/config/locales/doorkeeper.es-AR.yml @@ -138,12 +138,12 @@ es-AR: read:notifications: ver tus notificaciones read:reports: ver tus denuncias read:search: buscar en tu nombre - read:statuses: ver todos los toots + read:statuses: ver todos los mensajes write: modificar todos los datos de tu cuenta write:accounts: modificar tu perfil write:blocks: bloquear cuentas y dominios - write:bookmarks: marcar toots - write:favourites: marcar toots como favoritos + write:bookmarks: marcar mensajes + write:favourites: marcar mensajes como favoritos write:filters: crear filtros write:follows: seguir cuentas write:lists: crear listas @@ -151,4 +151,4 @@ es-AR: write:mutes: silenciar cuentas y conversaciones write:notifications: limpiar tus notificaciones write:reports: denunciar otras cuentas - write:statuses: publicar toots + write:statuses: publicar mensajes diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml index a55b83e8f..e3bb4d91f 100644 --- a/config/locales/doorkeeper.es.yml +++ b/config/locales/doorkeeper.es.yml @@ -83,6 +83,10 @@ es: invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado. invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente. invalid_redirect_uri: La URI de redirección incluida no es válida. + invalid_request: + missing_param: 'Falta este parámetro requerido: %{value}.' + request_not_authorized: La solicitud debe ser autorizada. Hay un parámetro requerido para autorizar la solicitud que falta o no es válido. + unknown: Falta un parámetro requerido en la solicitud, o esta incluye un valor no admitido de parámetro, o bien está mal formulada. invalid_resource_owner: Las credenciales proporcionadas del propietario del recurso no son válidas, o el propietario del recurso no puede ser encontrado invalid_scope: El ámbito pedido es inválido, desconocido o erróneo. invalid_token: diff --git a/config/locales/doorkeeper.gd.yml b/config/locales/doorkeeper.gd.yml index 0d06b9264..4b3bccf67 100644 --- a/config/locales/doorkeeper.gd.yml +++ b/config/locales/doorkeeper.gd.yml @@ -138,12 +138,12 @@ gd: read:notifications: na brathan agad faicinn read:reports: na gearanan agad fhaicinn read:search: lorg a dhèanamh às do leth - read:statuses: na staidean uile fhaicinn + read:statuses: na postaichean uile fhaicinn write: dàta sam bith a’ cunntais agad atharrachadh write:accounts: a’ phròifil agad atharrachadh write:blocks: cunntasan is àrainnean a bhacadh - write:bookmarks: comharran-lìn a dhèanamh de staidean - write:favourites: staidean a chur ris na h-annsachdan + write:bookmarks: comharran-lìn a dhèanamh de phostaichean + write:favourites: postaichean a chur ris na h-annsachdan write:filters: criathragan a chruthachadh write:follows: leantainn air daoine write:lists: liostaichean a chruthachadh @@ -151,4 +151,4 @@ gd: write:mutes: daoine is còmhraidhean a mhùchadh write:notifications: na brathan agad fhalamhachadh write:reports: gearan a dhèanamh mu chàch - write:statuses: staidean fhoillseachadh + write:statuses: postaichean fhoillseachadh diff --git a/config/locales/doorkeeper.sc.yml b/config/locales/doorkeeper.sc.yml index 667268f41..db857affd 100644 --- a/config/locales/doorkeeper.sc.yml +++ b/config/locales/doorkeeper.sc.yml @@ -143,7 +143,7 @@ sc: write:accounts: modificare su profilu tuo write:blocks: blocare contos e domìnios write:bookmarks: agiùnghere is istados a is sinnalibros - write:favourites: pònnere istados in is preferidos + write:favourites: pone istados in is preferidos write:filters: creare filtros write:follows: sighire persones write:lists: creare listas diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml index e87ddc1dc..d7d28bae0 100644 --- a/config/locales/doorkeeper.sv.yml +++ b/config/locales/doorkeeper.sv.yml @@ -37,7 +37,7 @@ sv: index: application: Applikation callback_url: Återkalls URL - delete: Ta bort + delete: Radera empty: Du har inga program. name: Namn new: Ny applikation diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml index 7703646c5..54ca4dc14 100644 --- a/config/locales/doorkeeper.th.yml +++ b/config/locales/doorkeeper.th.yml @@ -125,12 +125,12 @@ th: read:notifications: ดูการแจ้งเตือนของคุณ read:reports: ดูรายงานของคุณ read:search: ค้นหาในนามของคุณ - read:statuses: ดูสถานะทั้งหมด + read:statuses: ดูโพสต์ทั้งหมด write: ปรับเปลี่ยนข้อมูลบัญชีทั้งหมดของคุณ write:accounts: ปรับเปลี่ยนโปรไฟล์ของคุณ write:blocks: ปิดกั้นบัญชีและโดเมน - write:bookmarks: เพิ่มที่คั่นหน้าสถานะ - write:favourites: ชื่นชอบสถานะ + write:bookmarks: เพิ่มที่คั่นหน้าโพสต์ + write:favourites: ชื่นชอบโพสต์ write:filters: สร้างตัวกรอง write:follows: ติดตามผู้คน write:lists: สร้างรายการ @@ -138,4 +138,4 @@ th: write:mutes: ซ่อนผู้คนและการสนทนา write:notifications: ล้างการแจ้งเตือนของคุณ write:reports: รายงานผู้คนอื่น ๆ - write:statuses: เผยแพร่สถานะ + write:statuses: เผยแพร่โพสต์ diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml index 23d424f12..7fefaf951 100644 --- a/config/locales/doorkeeper.zh-CN.yml +++ b/config/locales/doorkeeper.zh-CN.yml @@ -120,10 +120,10 @@ zh-CN: scopes: admin:read: 读取服务器上的所有数据 admin:read:accounts: 读取所有帐号的敏感信息 - admin:read:reports: 读取所有报告和被报告帐号的敏感信息 + admin:read:reports: 读取所有举报和被举报帐号的敏感信息 admin:write: 修改服务器上的所有数据 admin:write:accounts: 对帐号执行管理操作 - admin:write:reports: 对报告执行管理操作 + admin:write:reports: 对举报执行管理操作 follow: 关注或屏蔽用户 push: 接收你的帐户的推送通知 read: 读取你的帐户数据 @@ -134,9 +134,9 @@ zh-CN: read:filters: 查看你的过滤器 read:follows: 查看你的关注 read:lists: 查看你的列表 - read:mutes: 查看你的静音列表 + read:mutes: 查看你的隐藏列表 read:notifications: 查看你的通知 - read:reports: 查看你的报告 + read:reports: 查看你的举报 read:search: 以你的身份搜索 read:statuses: 查看所有嘟文 write: 修改你的账号数据 @@ -148,7 +148,7 @@ zh-CN: write:follows: 关注其他人 write:lists: 创建列表 write:media: 上传媒体文件 - write:mutes: 静音用户和对话 + write:mutes: 隐藏用户和对话 write:notifications: 清除你的通知 - write:reports: 报告他人 + write:reports: 举报他人 write:statuses: 发表嘟文 diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index 101abb7f7..912924787 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -61,7 +61,7 @@ zh-TW: title: 發生錯誤 new: able_to: 這將允許其作: - prompt: 應用程式 %{client_name} 要求取得您帳號的存取權限 + prompt: 應用程式 %{client_name} 要求取得您帳戶的存取權限 title: 需要授權 show: title: 複製此授權碼並貼上到應用程式中。 @@ -125,8 +125,8 @@ zh-TW: admin:write:accounts: 對帳戶進行仲裁管理動作 admin:write:reports: 對報告進行仲裁管理動作 follow: 修改帳戶關係 - push: 接收帳號的推送通知 - read: 讀取您所有的帳號資料 + push: 接收帳戶的推播通知 + read: 讀取您所有的帳戶資料 read:accounts: 檢視帳戶資訊 read:blocks: 檢視您的封鎖名單 read:bookmarks: 檢視您的書籤 @@ -139,7 +139,7 @@ zh-TW: read:reports: 檢視您的檢舉 read:search: 以你的身份搜尋 read:statuses: 檢視所有嘟文 - write: 修改您帳號的所有資料 + write: 修改您帳戶的所有資料 write:accounts: 修改您的個人檔案 write:blocks: 封鎖帳戶及站台 write:bookmarks: 書籤狀態 diff --git a/config/locales/en.yml b/config/locales/en.yml index 844bc03c7..34c337e16 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -730,7 +730,7 @@ en: aliases: add_new: Create alias created_msg: Successfully created a new alias. You can now initiate the move from the old account. - deleted_msg: Successfully remove the alias. Moving from that account to this one will no longer be possible. + deleted_msg: Successfully removed the alias. Moving from that account to this one will no longer be possible. empty: You have no aliases. hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is harmless and reversible. The account migration is initiated from the old account. remove: Unlink alias @@ -971,7 +971,7 @@ en: overwrite: Overwrite overwrite_long: Replace current records with the new ones preface: You can import data that you have exported from another server, such as a list of the people you are following or blocking. - success: Your data was successfully uploaded and will now be processed in due time + success: Your data was successfully uploaded and will be processed in due time types: blocking: Blocking list bookmarks: Bookmarks @@ -1035,7 +1035,7 @@ en: warning: backreference_required: The new account must first be configured to back-reference this one before: 'Before proceeding, please read these notes carefully:' - cooldown: After moving there is a cooldown period during which you will not be able to move again + cooldown: After moving there is a waiting period during which you will not be able to move again disabled_account: Your current account will not be fully usable afterwards. However, you will have access to data export as well as re-activation. followers: This action will move all followers from the current account to the new account only_redirect_html: Alternatively, you can only put up a redirect on your profile. @@ -1104,7 +1104,7 @@ en: code_hint: Enter the code generated by your authenticator app to confirm description_html: If you enable two-factor authentication using an authenticator app, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. enable: Enable - instructions_html: "Scan this QR code into Google Authenticator or a similiar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in." + instructions_html: "Scan this QR code into Google Authenticator or a similar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in." manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:' setup: Set up wrong_code: The entered code was invalid! Are server time and device time correct? @@ -1168,7 +1168,7 @@ en: proceed: Proceed to reply prompt: 'You want to reply to this post:' scheduled_statuses: - over_daily_limit: You have exceeded the limit of %{limit} scheduled posts for that day + over_daily_limit: You have exceeded the limit of %{limit} scheduled posts for today over_total_limit: You have exceeded the limit of %{limit} scheduled posts too_soon: The scheduled date must be in the future sessions: @@ -1200,7 +1200,7 @@ en: adobe_air: Adobe Air android: Android blackberry: Blackberry - chrome_os: ChromeOS + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux @@ -1435,7 +1435,7 @@ en: edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. explanation: Here are some tips to get you started final_action: Start posting - final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.' + final_step: 'Start posting! Even without followers your public posts may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.' full_handle: Your full handle full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. review_preferences_action: Change preferences @@ -1455,7 +1455,7 @@ en: otp_lost_help_html: If you lost access to both, you may get in touch with %{email} seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' - suspicious_sign_in_confirmation: You appear to not have logged in from this device before, and you haven't logged in for a while, so we're sending a security code to your e-mail address to confirm that it's you. + suspicious_sign_in_confirmation: You appear to not have logged in from this device before, so we're sending a security code to your e-mail address to confirm that it's you. verification: explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your %{instance} profile. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' verification: Verification diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index d4ac238d0..019887bb8 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -730,7 +730,7 @@ es-AR: aliases: add_new: Crear alias created_msg: El nuevo alias se creó exitosamente. Ahora podés empezar la mudanza desde la cuenta vieja. - deleted_msg: Eliminaste el alias exitosamente. La mudanza de esa cuenta a esta ya no será posible. + deleted_msg: Eliminaste el alias exitosamente. La mudanza de esa cuenta a ésta ya no será posible. empty: No tenés alias. hint_html: Si querés mudarte desde otra cuenta a esta, acá podés crear un alias, el cual es necesario antes de empezar a mudar seguidores de la cuenta vieja a ésta. Esta acción por sí misma es inofensiva y reversible. La migración de la cuenta se inicia desde la cuenta anterior. remove: Desvincular alias diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 0890512e8..a7dc45892 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -7,6 +7,7 @@ es-MX: active_count_after: activo active_footnote: Usuarios Activos Mensuales (UAM) administered_by: 'Administrado por:' + api: API apps: Aplicaciones móviles apps_platforms: Utiliza Mastodon desde iOS, Android y otras plataformas browse_directory: Navega por el directorio de perfiles y filtra por intereses @@ -14,6 +15,7 @@ es-MX: browse_public_posts: Navega por un transmisión en vivo de publicaciones públicas en Mastodon contact: Contacto contact_missing: No especificado + contact_unavailable: No disponible discover_users: Descubrir usuarios documentation: Documentación federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá. @@ -80,6 +82,7 @@ es-MX: posts_with_replies: Toots con respuestas roles: admin: Administrador + bot: Bot group: Grupo moderator: Moderador unavailable: Perfil no disponible @@ -99,6 +102,7 @@ es-MX: approve_all: Aprobar todos approved_msg: La solicitud de registro de %{username} ha sido aprobada correctamente are_you_sure: "¿Estás seguro?" + avatar: Avatar by_domain: Dominio change_email: changed_msg: "¡El correo electrónico se ha actualizado correctamente!" @@ -131,9 +135,11 @@ es-MX: inbox_url: URL de la bandeja de entrada invite_request_text: Razones para unirse invited_by: Invitado por + ip: IP joined: Unido location: all: Todos + local: Local remote: Remoto title: Localización login_status: Estado del login @@ -210,6 +216,7 @@ es-MX: username: Nombre de usuario view_domain: Ver resumen del dominio warn: Adevertir + web: Web whitelisted: Añadido a la lista blanca action_logs: action_types: @@ -223,6 +230,7 @@ es-MX: create_domain_block: Crear Bloqueo de Dominio create_email_domain_block: Crear Bloqueo de Dominio de Correo Electrónico create_ip_block: Crear regla IP + create_unavailable_domain: Crear Dominio No Disponible demote_user: Degradar Usuario destroy_announcement: Eliminar Anuncio destroy_custom_emoji: Eliminar Emoji Personalizado @@ -231,6 +239,7 @@ es-MX: destroy_email_domain_block: Eliminar Bloqueo de Dominio de Correo Electrónico destroy_ip_block: Eliminar regla IP destroy_status: Eliminar Estado + destroy_unavailable_domain: Eliminar Dominio No Disponible disable_2fa_user: Deshabilitar 2FA disable_custom_emoji: Deshabilitar Emoji Personalizado disable_user: Deshabilitar Usuario @@ -264,6 +273,7 @@ es-MX: create_domain_block_html: "%{name} bloqueó el dominio %{target}" create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}" create_ip_block_html: "%{name} creó una regla para la IP %{target}" + create_unavailable_domain_html: "%{name} detuvo las entregas al dominio %{target}" demote_user_html: "%{name} degradó al usuario %{target}" destroy_announcement_html: "%{name} eliminó el anuncio %{target}" destroy_custom_emoji_html: "%{name} destruyó emoji %{target}" @@ -272,6 +282,7 @@ es-MX: destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}" destroy_ip_block_html: "%{name} eliminó una regla para la IP %{target}" destroy_status_html: "%{name} eliminó el estado por %{target}" + destroy_unavailable_domain_html: "%{name} reanudó las entregas al dominio %{target}" disable_2fa_user_html: "%{name} desactivó el requisito de dos factores para el usuario %{target}" disable_custom_emoji_html: "%{name} desactivó el emoji %{target}" disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}" @@ -313,7 +324,7 @@ es-MX: scheduled_for: Programado para %{time} scheduled_msg: "¡Anuncio programado para su publicación!" title: Anuncios - unpublish: Eliminar publicación + unpublish: Retirar publicación unpublished_msg: "¡Anuncio despublicado con éxito!" updated_msg: "¡Anuncio actualizado con éxito!" custom_emojis: @@ -329,6 +340,7 @@ es-MX: disable: Deshabilitar disabled: Desactivado disabled_msg: Se deshabilitó con éxito ese emoji + emoji: Emoji enable: Habilitar enabled: Activado enabled_msg: Se habilitó con éxito ese emoji @@ -366,6 +378,7 @@ es-MX: recent_users: Usuarios recientes search: Búsqueda por texto completo single_user_mode: Modo único usuario + software: Software space: Uso de almacenamiento title: Tablero total_users: usuarios en total @@ -434,16 +447,33 @@ es-MX: title: Nueva entrada en la lista negra de correo title: Lista negra de correo follow_recommendations: - description_html: "Las recomendaciones de cuentas a las que seguir ayudan a los nuevos usuarios a encontrar rápidamente contenido interesante. Cuando un usuario no ha interactuado con otros lo suficiente como para formar recomendaciones personalizadas de seguimiento, estas cuentas se recomiendan en su lugar. Se recalculan diariamente a partir de una mezcla de cuentas con las interacciones más recientes y el mayor número de seguidores para un idioma determinado." + description_html: "Las recomendaciones de cuentas ayudan a los nuevos usuarios a encontrar rápidamente contenido interesante. Cuando un usuario no ha interactuado con otros lo suficiente como para suscitar recomendaciones personalizadas de cuentas a las que seguir, en su lugar se le recomiendan estas cuentas. Se recalculan diariamente a partir de una mezcla de cuentas con el mayor número de interacciones recientes y con el mayor número de seguidores locales con un idioma determinado." language: Para el idioma status: Estado - suppress: Eliminar recomendación de cuentas a las que seguir - suppressed: Eliminado - title: Recomendaciones de cuentas a las que seguir - unsuppress: Restaurar recomendaciones de cuentas a las que seguir + suppress: Suprimir recomendación de cuentas + suppressed: Suprimida + title: Recomendaciones de cuentas + unsuppress: Restaurar recomendaciones de cuentas instances: + back_to_all: Todos + back_to_limited: Limitados + back_to_warning: Advertencia by_domain: Dominio + delivery: + all: Todos + clear: Limpiar errores de entrega + restart: Reiniciar entrega + stop: Detener entrega + title: Entrega + unavailable: No disponible + unavailable_message: Entrega no disponible + warning: Advertencia + warning_message: + one: Fallo de entrega %{count} día + other: Fallo de entrega %{count} días delivery_available: Entrega disponible + delivery_error_days: Días de error de entrega + delivery_error_hint: Si la entrega no es posible a lo largo de %{count} días, se marcará automáticamente como no entregable. empty: No se encontraron dominios. known_accounts: one: "%{count} cuenta conocida" @@ -546,9 +576,9 @@ es-MX: rules: add_new: Añadir norma delete: Eliminar - description_html: Aunque la mayoría de las afirmaciones de haber leído y aceptado los términos de servicio, normalmente la gente no los lee hasta después de que surja un problema. Haz que sea más fácil ver las reglas de tu servidor de un vistazo, proporcionándolas en una lista de puntos. Intenta mantener reglas individuales cortas y sencillas, pero intenta no dividirlas en muchos objetos separados. + description_html: Aunque la mayoría afirma haber leído y estar de acuerdo con los términos de servicio, la gente normalmente no los lee hasta después de que surja algún problema. Haz que sea más fácil ver las normas de tu servidor de un vistazo estipulándolas en una lista de puntos. Intenta que cada norma sea corta y sencilla, pero sin estar divididas en muchos puntos. edit: Editar norma - empty: Aún no se han definido reglas del servidor. + empty: Aún no se han definido las normas del servidor. title: Normas del servidor settings: activity_api_enabled: @@ -671,6 +701,7 @@ es-MX: last_active: Última actividad most_popular: Más popular most_recent: Más reciente + name: Hashtag review: Estado de revisión reviewed: Revisado title: Etiquetas @@ -683,7 +714,7 @@ es-MX: add_new: Añadir nuevo delete: Borrar edit_preset: Editar aviso predeterminado - empty: Aún no ha definido ninguna advertencia predefinida. + empty: Aún no has definido ningún preajuste de advertencia. title: Editar configuración predeterminada de avisos admin_mailer: new_pending_account: @@ -717,6 +748,7 @@ es-MX: toot_layout: Diseño de los toots application_mailer: notification_preferences: Cambiar preferencias de correo electrónico + salutation: "%{name}:" settings: 'Cambiar preferencias de correo: %{link}' view: 'Vista:' view_profile: Ver perfil @@ -751,6 +783,9 @@ es-MX: migrate_account: Mudarse a otra cuenta migrate_account_html: Si deseas redireccionar esta cuenta a otra distinta, puedes configurarlo aquí. or_log_in_with: O inicia sesión con + providers: + cas: CAS + saml: SAML register: Registrarse registration_closed: "%{instance} no está aceptando nuevos miembros" resend_confirmation: Volver a enviar el correo de confirmación @@ -791,15 +826,24 @@ es-MX: errors: invalid_key: no es una clave Ed25519 o Curve25519 válida invalid_signature: no es una firma Ed25519 válida + date: + formats: + default: "%d %b %Y" + with_month_name: "%d %B %Y" datetime: distance_in_words: + about_x_hours: "%{count} h" about_x_months: "%{count}m" about_x_years: "%{count}a" almost_x_years: "%{count}a" half_a_minute: Justo ahora + less_than_x_minutes: "%{count} m" less_than_x_seconds: Justo ahora over_x_years: "%{count}a" + x_days: "%{count} d" + x_minutes: "%{count} m" x_months: "%{count}m" + x_seconds: "%{count} s" deletes: challenge_not_passed: Los datos introducidos son incorrectos confirm_password: Ingresa tu contraseña actual para demostrar tu identidad @@ -851,6 +895,7 @@ es-MX: size: Tamaño blocks: Personas que has bloqueado bookmarks: Marcadores + csv: CSV domain_blocks: Bloqueos de dominios lists: Listas mutes: Tienes en silencio @@ -1046,8 +1091,13 @@ es-MX: number: human: decimal_units: + format: "%n %u" units: + billion: MM + million: M + quadrillion: MB thousand: m + trillion: B otp_authentication: code_hint: Introduce el código generado por tu aplicación de autentificación para confirmar description_html: Si habilitas autenticación de dos factores a través de una aplicación de autenticación, el ingreso requerirá que estés en posesión de tu teléfono, que generará códigos para que ingreses. @@ -1061,6 +1111,7 @@ es-MX: next: Próximo older: Más antiguo prev: Anterior + truncate: "…" polls: errors: already_voted: Ya has votado en esta encuesta @@ -1122,15 +1173,40 @@ es-MX: activity: Última actividad browser: Navegador browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox generic: Desconocido + ie: Internet Explorer + micro_messenger: MicroMessenger nokia: Navegador de Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS qq: Navegador QQ + safari: Safari + uc_browser: UCBrowser + weibo: Weibo current_session: Sesión actual description: "%{browser} en %{platform}" explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon. + ip: IP platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: GNU Linux mac: Mac other: Desconocido + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Revocar revoke_success: Sesión revocada exitosamente title: Sesiones @@ -1158,6 +1234,9 @@ es-MX: webauthn_authentication: Claves de seguridad statuses: attached: + audio: + one: "%{count} audio" + other: "%{count} audios" description: 'Adjunto: %{attached}' image: one: "%{count} imagen" @@ -1193,8 +1272,9 @@ es-MX: show_older: Mostrar más antiguos show_thread: Mostrar discusión sign_in_to_participate: Regístrate para participar en la conversación + title: "%{name}: «%{quote}»" visibilities: - direct: Directo + direct: Directa private: Sólo mostrar a seguidores private_long: Solo mostrar a tus seguidores public: Público @@ -1297,6 +1377,7 @@ es-MX: time: formats: default: "%d de %b del %Y, %H:%M" + month: "%b %Y" two_factor_authentication: add: Añadir disable: Deshabilitar diff --git a/config/locales/es.yml b/config/locales/es.yml index 0f8984863..9f2f593ce 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -7,6 +7,7 @@ es: active_count_after: activo active_footnote: Usuarios Activos Mensuales (UAM) administered_by: 'Administrado por:' + api: API apps: Aplicaciones móviles apps_platforms: Utiliza Mastodon desde iOS, Android y otras plataformas browse_directory: Navega por el directorio de perfiles y filtra por intereses @@ -14,6 +15,7 @@ es: browse_public_posts: Navega por un transmisión en vivo de publicaciones públicas en Mastodon contact: Contacto contact_missing: No especificado + contact_unavailable: No disponible discover_users: Descubrir usuarios documentation: Documentación federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá. @@ -80,6 +82,7 @@ es: posts_with_replies: Publicaciones y respuestas roles: admin: Administrador + bot: Bot group: Grupo moderator: Moderador unavailable: Perfil no disponible @@ -99,6 +102,7 @@ es: approve_all: Aprobar todos approved_msg: La solicitud de registro de %{username} ha sido aprobada correctamente are_you_sure: "¿Estás seguro?" + avatar: Avatar by_domain: Dominio change_email: changed_msg: "¡El correo electrónico se ha actualizado correctamente!" @@ -131,9 +135,11 @@ es: inbox_url: URL de la bandeja de entrada invite_request_text: Razones para unirse invited_by: Invitado por + ip: IP joined: Unido location: all: Todos + local: Local remote: Remoto title: Localización login_status: Estado del login @@ -210,6 +216,7 @@ es: username: Nombre de usuario view_domain: Ver resumen del dominio warn: Adevertir + web: Web whitelisted: Añadido a la lista blanca action_logs: action_types: @@ -333,6 +340,7 @@ es: disable: Deshabilitar disabled: Desactivado disabled_msg: Se deshabilitó con éxito ese emoji + emoji: Emoji enable: Habilitar enabled: Activado enabled_msg: Se habilitó con éxito ese emoji @@ -370,6 +378,7 @@ es: recent_users: Usuarios recientes search: Búsqueda por texto completo single_user_mode: Modo único usuario + software: Software space: Uso de almacenamiento title: Tablero total_users: usuarios en total @@ -692,6 +701,7 @@ es: last_active: Última actividad most_popular: Más popular most_recent: Más reciente + name: Hashtag review: Estado de revisión reviewed: Revisado title: Etiquetas @@ -738,6 +748,7 @@ es: toot_layout: Diseño de las publicaciones application_mailer: notification_preferences: Cambiar preferencias de correo electrónico + salutation: "%{name}:" settings: 'Cambiar preferencias de correo: %{link}' view: 'Vista:' view_profile: Ver perfil @@ -772,6 +783,9 @@ es: migrate_account: Mudarse a otra cuenta migrate_account_html: Si deseas redireccionar esta cuenta a otra distinta, puedes configurarlo aquí. or_log_in_with: O inicia sesión con + providers: + cas: CAS + saml: SAML register: Registrarse registration_closed: "%{instance} no está aceptando nuevos miembros" resend_confirmation: Volver a enviar el correo de confirmación @@ -812,15 +826,24 @@ es: errors: invalid_key: no es una clave Ed25519 o Curve25519 válida invalid_signature: no es una firma Ed25519 válida + date: + formats: + default: "%d %b %Y" + with_month_name: "%d %B %Y" datetime: distance_in_words: + about_x_hours: "%{count} h" about_x_months: "%{count}m" about_x_years: "%{count}a" almost_x_years: "%{count}a" half_a_minute: Justo ahora + less_than_x_minutes: "%{count} m" less_than_x_seconds: Justo ahora over_x_years: "%{count}a" + x_days: "%{count} d" + x_minutes: "%{count} m" x_months: "%{count}m" + x_seconds: "%{count} s" deletes: challenge_not_passed: Los datos introducidos son incorrectos confirm_password: Ingresa tu contraseña actual para demostrar tu identidad @@ -872,6 +895,7 @@ es: size: Tamaño blocks: Personas que has bloqueado bookmarks: Marcadores + csv: CSV domain_blocks: Bloqueos de dominios lists: Listas mutes: Tienes en silencio @@ -1067,8 +1091,13 @@ es: number: human: decimal_units: + format: "%n %u" units: + billion: MM + million: M + quadrillion: MB thousand: m + trillion: B otp_authentication: code_hint: Introduce el código generado por tu aplicación de autentificación para confirmar description_html: Si habilitas autenticación de dos factores a través de una aplicación de autenticación, el ingreso requerirá que estés en posesión de tu teléfono, que generará códigos para que ingreses. @@ -1082,6 +1111,7 @@ es: next: Próximo older: Más antiguo prev: Anterior + truncate: "…" polls: errors: already_voted: Ya has votado en esta encuesta @@ -1143,15 +1173,40 @@ es: activity: Última actividad browser: Navegador browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox generic: Desconocido + ie: Internet Explorer + micro_messenger: MicroMessenger nokia: Navegador de Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS qq: Navegador QQ + safari: Safari + uc_browser: UCBrowser + weibo: Weibo current_session: Sesión actual description: "%{browser} en %{platform}" explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon. + ip: IP platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: GNU Linux mac: Mac other: Desconocido + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Revocar revoke_success: Sesión revocada exitosamente title: Sesiones @@ -1179,6 +1234,9 @@ es: webauthn_authentication: Claves de seguridad statuses: attached: + audio: + one: "%{count} audio" + other: "%{count} audios" description: 'Adjunto: %{attached}' image: one: "%{count} imagen" @@ -1214,6 +1272,7 @@ es: show_older: Mostrar más antiguos show_thread: Mostrar discusión sign_in_to_participate: Regístrate para participar en la conversación + title: "%{name}: «%{quote}»" visibilities: direct: Directa private: Sólo mostrar a seguidores @@ -1318,6 +1377,7 @@ es: time: formats: default: "%d de %b del %Y, %H:%M" + month: "%b %Y" two_factor_authentication: add: Añadir disable: Deshabilitar diff --git a/config/locales/fa.yml b/config/locales/fa.yml index e37219251..30230a97c 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -64,7 +64,7 @@ fa: other: پیگیر following: پی می‌گیرد instance_actor_flash: این حساب یک عامل مجازی است که به نمایندگی از خود کارساز استفاده می‌شود و نه هیچ یکی از کاربران. این حساب به منظور اتصال به فدراسیون استفاده می‌شود و نباید معلق شود. - joined: کاربر از %{date} + joined: پیوسته از %{date} last_active: آخرین فعالیت link_verified_on: مالکیت این پیوند در %{date} بررسی شد media: عکس و ویدیو @@ -428,7 +428,13 @@ fa: unsuppress: بازگردانی پیشنهادهای پی‌گیری instances: back_to_all: همه + back_to_limited: محدود + back_to_warning: هشدار by_domain: دامین + delivery: + all: همه + unavailable: ناموجود + warning: هشدار delivery_available: پیام آماده است empty: هیج دامنه‌ای پیدا نشد. known_accounts: @@ -1327,7 +1333,6 @@ fa: time: formats: default: "%d %b %Y, %H:%M" - month: "%Ob %Y" two_factor_authentication: add: افزودن disable: غیرفعال‌کردن diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 92f373d00..5db62a01a 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -273,6 +273,7 @@ fr: create_domain_block_html: "%{name} a bloqué le domaine %{target}" create_email_domain_block_html: "%{name} a bloqué de domaine de courriel %{target}" create_ip_block_html: "%{name} a créé une règle pour l'IP %{target}" + create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_custom_emoji_html: "%{name} a détruit l'émoji %{target}" @@ -281,6 +282,7 @@ fr: destroy_email_domain_block_html: "%{name} a débloqué le domaine de courriel %{target}" destroy_ip_block_html: "%{name} a supprimé la règle pour l'IP %{target}" destroy_status_html: "%{name} a supprimé le statut de %{target}" + destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}" disable_2fa_user_html: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur·rice %{target}" disable_custom_emoji_html: "%{name} a désactivé l'émoji %{target}" disable_user_html: "%{name} a désactivé la connexion de l'utilisateur·rice %{target}" @@ -453,10 +455,25 @@ fr: title: Recommandations d'abonnement unsuppress: Rétablir les recommandations d'abonnement instances: + back_to_all: Tout + back_to_limited: Limité + back_to_warning: Avertissement by_domain: Domaine delivery: + all: Tout + clear: Effacer les erreurs de livraison + restart: Redémarrer la livraison + stop: Arrêter la livraison + title: Livraison unavailable: Indisponible + unavailable_message: Livraison indisponible + warning: Avertissement + warning_message: + one: Échec de livraison %{count} jour + other: Échec de livraison %{count} jours delivery_available: Livraison disponible + delivery_error_days: Jours d'erreur de livraison + delivery_error_hint: Si la livraison n'est pas possible pendant %{count} jours, elle sera automatiquement marquée comme non livrable. empty: Aucun domaine trouvé. known_accounts: one: "%{count} compte connu" @@ -636,7 +653,7 @@ fr: desc_html: Affichée dans la barre latérale et dans les méta-tags. Décrivez ce qui rend spécifique ce serveur Mastodon en un seul paragraphe. Si laissée vide, la description du serveur sera affiché par défaut. title: Description courte du serveur site_terms: - desc_html: Affichée sur la page des conditions d’utilisation du site. Vous pouvez utiliser des balises HTML + desc_html: Vous pouvez écrire votre propre politique de confidentialité, conditions d’utilisation ou autre jargon juridique. Vous pouvez utiliser des balises HTML title: Politique de confidentialité site_title: Nom du serveur thumbnail: @@ -1352,7 +1369,7 @@ fr:

Ce document est publié sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 7 mars 2018.

Originellement adapté de la politique de confidentialité de Discourse.

- title: "%{instance} Conditions d’utilisation et politique de confidentialité" + title: Conditions d’utilisation et politique de confidentialité de %{instance} themes: contrast: Mastodon (Contraste élevé) default: Mastodon (Sombre) diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 6be1d480f..6ec1cf25a 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -36,7 +36,7 @@ gd: one: phost other: post two: phost - status_count_before: A sgrìobh + status_count_before: A dh’fhoillsich tagline: Lean air caraidean ’s lorg feadhainn ùra terms: Teirmichean na seirbheise unavailable_content: Frithealaichean fo mhaorsainneachd @@ -534,7 +534,7 @@ gd: relays: add_new: Cuir ath-sheachadan ùr ris delete: Sguab às - description_html: "’S e frithealaiche eadar-mheadhanach a th’ ann an ath-sheachadan co-nasgaidh a nì iomlaid air grunnan mòra de dhùdan poblach eadar na frithealaichean a dh’fho-sgrìobhas ’s a dh’fhoillsicheas dha. ’S urrainn dha cuideachadh a thoirt do dh’fhrithealaichean beaga is meadhanach mòr ach an lorg iad susbaint sa cho-shaoghal agus às an aonais, bhiodh aig cleachdaichean ionadail leantainn air daoine eile air frithealaichean cèine a làimh." + description_html: "’S e frithealaiche eadar-mheadhanach a th’ ann an ath-sheachadan co-nasgaidh a nì iomlaid air grunnan mòra de phostaichean poblach eadar na frithealaichean a dh’fho-sgrìobhas ’s a dh’fhoillsicheas dha. ’S urrainn dha cuideachadh a thoirt do dh’fhrithealaichean beaga is meadhanach mòr ach an lorg iad susbaint sa cho-shaoghal agus às an aonais, bhiodh aig cleachdaichean ionadail leantainn air daoine eile air frithealaichean cèine a làimh." disable: Cuir à comas disabled: Chaidh a chur à comas enable: Cuir an comas @@ -601,10 +601,10 @@ gd: settings: activity_api_enabled: desc_html: Cunntasan nam postaichean a chaidh fhoillseachadh gu h-ionadail, nan cleachdaichean gnìomhach ’s nan clàraidhean ùra an am bucaidean seachdaineil - title: Foillsich agragaid dhen stadastaireachd mu ghnìomhachd nan cleachdaichean + title: Foillsich agragaid dhen stadastaireachd mu ghnìomhachd nan cleachdaichean san API bootstrap_timeline_accounts: - desc_html: Sgar iomadh ainm cleachdaiche le cromag. Chan obraich ach cunntasan ionadail ’s gun ghlas orra. ’S e na rianairean ionadail uile a tha sa bhun-roghainn nuair a bhios seo falamh. - title: Leantainn tùsail nan cleachdaichean ùra + desc_html: Sgar iomadh ainm cleachdaiche le cromag. Cuiridh sinn geall gun nochd na cunntasan seo am measg nam molaidhean leantainn + title: Mol na cunntasan seo do chleachdaichean ùra contact_information: email: Post-d gnìomhachais username: Ainm cleachdaiche a’ chonaltraidh @@ -629,7 +629,7 @@ gd: title: Dealbh suaichnein peers_api_enabled: desc_html: Ainmean àrainne air an do thachair am frithealaiche seo sa cho-shaoghal - title: Foillsich liosta nam frithealaichean a chaidh a lorg + title: Foillsich liosta nam frithealaichean a chaidh a lorg san API preview_sensitive_media: desc_html: Ro-sheallaidh ceanglaichean dealbhag fhiù ’s ma chaidh comharradh gu bheil am meadhan frionasach title: Seall meadhanan frionasach ann an ro-sheallaidhean OpenGraph @@ -716,9 +716,9 @@ gd: accounts_today: Cleachdaidhean fa leth an-diugh accounts_week: Cleachdaidhean fa leth an t-seachdain seo breakdown: Seall an cleachdadh an-diugh a-rèir tùis - last_active: Gnìomhach an turas mu dheireadh + last_active: Air a chleachdadh o chionn ghoirid most_popular: Na tha fèill mhòr air - most_recent: As ùire + most_recent: Air a chruthachadh o chionn ghoirid name: Taga hais review: Dèan lèirmheas air an staid reviewed: Chaidh lèirmheas a dhèanamh air @@ -750,18 +750,18 @@ gd: created_msg: Chaidh an t-alias ùr a chruthachadh. ’S urrainn dhut tòiseachadh air imrich on seann-chunntas a-nis. deleted_msg: Chaidh an t-alias a thoirt air falbh. Chan urrainn dhut imrich on chunntas ud chan fhear seo tuilleadh. empty: Chan eil alias agad. - hint_html: Nam bu mhiann leat imrich o chunntas eile dhan fhear seo, ’s urrainn dhut alias a chruthachadh an-seo agus feumaidh tu sin a dhèanamh mus urrainn dhut tòiseachadh air an luchd-leantainn agad imrich on seann-chunntas dhan fhear seo. Tha an gnìomh seo fhèin neo-chronail is can eil e buan. Tòisichidh tu air imrich a’ chunntais on t-seann-chunntas. + hint_html: Nam bu mhiann leat imrich o chunntas eile dhan fhear seo, ’s urrainn dhut alias a chruthachadh an-seo agus feumaidh tu sin a dhèanamh mus urrainn dhut tòiseachadh air an luchd-leantainn agad imrich on seann-chunntas dhan fhear seo. Tha an gnìomh seo fhèin neo-chronail is chan eil e buan. Tòisichidh tu air imrich a’ chunntais on t-seann-chunntas. remove: Dì-cheangail an t-alias appearance: advanced_web_interface: Eadar-aghaidh-lìn adhartach - advanced_web_interface_hint: 'Ma tha thu airson leud gu lèir na sgrìn agad a chleachdadh, leigidh an eadar-aghaidh-lìn adhartach leat gun rèitich thu mòran cholbhan eadar-dhealaichte ach a faic thu na thogras tu de dh’fhiosrachadh aig an aon àm: Dachaigh, brathan, loidhne-ama cho-naisgte, na thogras tu de liostaichean is tagaichean hais.' + advanced_web_interface_hint: 'Ma tha thu airson leud gu lèir na sgrìn agad a chleachdadh, leigidh an eadar-aghaidh-lìn adhartach leat gun rèitich thu mòran cholbhan eadar-dhealaichte ach am faic thu na thogras tu de dh’fhiosrachadh aig an aon àm: Dachaigh, brathan, loidhne-ama cho-naisgte, na thogras tu de liostaichean is tagaichean hais.' animations_and_accessibility: Beòthachaidhean agus so-ruigsinneachd confirmation_dialogs: Còmhraidhean dearbhaidh discovery: Lorg localization: body: Tha Mastodon ’ga eadar-theangachadh le saor-thoilich. guide_link: https://crowdin.com/project/mastodon - guide_link_text: "’S urrainn do dhuine sam bith cuideachadh." + guide_link_text: "’S urrainn do neach sam bith cuideachadh." sensitive_content: Susbaint fhrionasach toot_layout: Co-dhealbhachd nam postaichean application_mailer: @@ -785,7 +785,7 @@ gd: checkbox_agreement_html: Gabhaidh mi ri riaghailtean an fhrithealaiche ’s teirmichean a’ chleachdaidh checkbox_agreement_without_rules_html: Gabhaidh mi ri teirmichean a’ chleachdaidh delete_account: Sguab às an cunntas - delete_account_html: Nam bu mhiann leat an cunntas agad a sguabadh às, Nì thu an-seo e. Thèid dearbhadh iarraidh ort. + delete_account_html: Nam bu mhiann leat an cunntas agad a sguabadh às, nì thu an-seo e. Thèid dearbhadh iarraidh ort. description: prefix_invited_by_user: Thug @%{name} cuireadh dhut ach am faigh thu ballrachd air an fhrithealaiche seo de Mhastodon! prefix_sign_up: Clàraich le Mastodon an-diugh! @@ -1043,7 +1043,7 @@ gd: not_found: "– cha deach seo a lorg" on_cooldown: Tha àm socrachaidh ort followers_count: Luchd-leantainn aig àm na h-imrich - incoming_migrations: Ag imrich o chunntas eile + incoming_migrations: Imrich o chunntas eile incoming_migrations_html: Airson imrich o chunntas eile dhan fhear seo, feumaidh tu alias cunntais a chruthachadh an toiseach. moved_msg: Tha an cunntas agad ’ga ath-stiùireadh gu %{acct} a-nis ’s an luchd-leantainn agad ’gan imrich. not_redirecting: Chan eil an cunntas agad ’ga ath-stiùireadh gu cunntas sam bith eile aig an àm seo. @@ -1056,7 +1056,7 @@ gd: warning: backreference_required: Feumaidh tu an cunntas ùr a rèiteachadh an toiseach ach an tomh e air ais dhan fhear seo before: 'Mus lean thu air adhart, leugh na nòtaichean seo gu cùramach:' - cooldown: Às dèidh imrich, tha àm socrachaidh ann rè nach urrainn dhut imrich eile a dhèanamh + cooldown: Às dèidh imrich, tha greis feitheimh ann rè nach urrainn dhut imrich eile a dhèanamh disabled_account: Cha ghabh an cunntas làithreach agad a chleachdadh gu slàn às a dhèidh. Gidheadh, bidh an dà chuid às-phortadh an dàta is ath-ghnìomhachadh ri fhaighinn dhut. followers: Imrichidh an gnìomh seo a h-uile neach-leantainn on chunntas làithreach dhan chunntas ùr only_redirect_html: Mar roghainn eile, ’s urrainn dhut ath-stiùireadh a-mhàin a chur air a’ phròifil agad. @@ -1192,7 +1192,7 @@ gd: proceed: Lean air adhart gus freagairt prompt: 'Tha thu airson freagairt dhan phost seo:' scheduled_statuses: - over_daily_limit: Chaidh thu thar na crìoch de %{limit} post(aichean) sgeidealaichte dhan latha ud + over_daily_limit: Chaidh thu thar na crìoch de %{limit} post(aichean) sgeidealaichte an-diugh over_total_limit: Chaidh thu thar na crìoch de %{limit} post(aichean) sgeidealaichte too_soon: Feumaidh ceann-latha an sgeideil a bhith san àm ri teachd sessions: @@ -1249,8 +1249,8 @@ gd: export: Às-phortadh dàta featured_tags: Tagaichean hais brosnaichte identity_proofs: Dearbhaidhean na dearbh-aithne - import: Ion-phortaich - import_and_export: Ion-phortaich is às-phortaich + import: Ion-phortadh + import_and_export: Ion-phortadh ⁊ às-phortadh migrate: Imrich cunntais notifications: Brathan preferences: Roghainnean @@ -1289,7 +1289,7 @@ gd: open_in_web: Fosgail air an lìon over_character_limit: chaidh thu thar crìoch charactaran de %{max} pin_errors: - limit: Tha an àireamh as motha de dhùdan prìnichte agad a tha ceadaichte + limit: Tha an àireamh as motha de phostaichean prìnichte agad a tha ceadaichte ownership: Chan urrainn dhut post càich a phrìneachadh private: Chan urrainn dhut post neo-phoblach a phrìneachadh reblog: Chan urrainn dhut brosnachadh a phrìneachadh @@ -1328,7 +1328,7 @@ gd: terms: body_html: '

Poileasaidh prìobhaideachd

Dè am fiosrachadh a chruinnicheas sinn?


Dè na h-adhbharan air an cleachd sinn am fiosrachadh agad?

Seo na dòighean air an cleachd sinn fiosrachadh sam bith a chruinnich sinn uat ma dh’fhaoidte:


Ciamar a dhìonas sinn am fiosrachadh agad?

Cuiridh sinn iomadh gleus tèarainteachd an sàs ach an glèidheadh sinn sàbhailteachd an fhiosrachaidh phearsanta agad nuair a chuireas tu gin a-steach, nuair a chuireas tu a-null e no nuair a nì thu inntrigeadh air. Am measg gleusan eile, thèid seisean a’ bhrabhsair agad cuide ris an trafaig eadar na h-aplacaidean agad ’s an API a dhìon le SSL agus thèid hais a dhèanamh dhen fhacal-fhaire agad le algairim aon-shligheach làidir. Faodaidh tu dearbhadh dà-cheumnach a chur an comas airson barrachd tèarainteachd a chur ris an inntrigeadh dhan chunntas agad.


Dè am poileasaidh cumail dàta againn?

Nì sinn ar dìcheall:

’S urrainn dhut tasg-lann iarraidh dhen t-susbaint agad ’s a luchdadh a-nuas is gabhaidh seo a-staigh na postaichean, na ceanglachain meadhain, dealbh na pròifil agus dealbh a’ bhanna-chinn agad.

’S urrainn dhut an cunntas agad a sguabadh às gu buan uair sam bith.


An cleachd sinn briosgaidhean?

Cleachdaidh. ’S e faidhlichean beaga a tha sna briosgaidean a thar-chuireas làrach no solaraiche seirbheise gu clàr-cruaidh a’ choimpiutair agad leis a’ bhrabhsair-lìn agad (ma cheadaicheas tu sin). Bheir na briosgaidean sin comas dhan làrach gun aithnich i am brabhsair agad agus ma tha cunntas clàraichte agad, gun co-cheangail i ris a’ chunntas chlàraichte agad e.

Cleachdaidh sinn briosgaidean airson na roghainnean agad a thuigsinn ’s a ghlèidheadh gus an tadhail thu oirnn san àm ri teachd.


Am foillsich sinn fiosrachadh sam bith gu pàrtaidhean air an taobh a-muigh?

Cha reic, malairt no tar-chuir sinn fiosrachadh air a dh’aithnichear thu fhèin gu pàrtaidh sam bith air an taobh a-muigh. Cha ghabh seo a-staigh treas-phàrtaidhean earbsach a chuidicheas leinn le ruith na làraich againn, le obrachadh a’ ghnìomhachais againn no gus an t-seirbheis a thoirt leat cho fada ’s a dh’aontaicheas na treas-phàrtaidhean sin gun cùm iad am fiosrachadh dìomhair. Faodaidh sinn am fiosrachadh agad fhoillseachadh cuideachd nuair a bhios sinn dhen bheachd gu bheil am foillseachadh sin iomchaidh airson gèilleadh dhan lagh, poileasaidhean na làraich againn èigneachadh no na còraichean, an sealbh no an t-sàbhailteachd againn fhèin no aig càch a dhìon.

Dh’fhaoidte gun dèid an t-susbaint phoblach agad a luchdadh a-nuas le frithealaichean eile san lìonra. Thèid na postaichean poblach agad ’s an fheadhainn dhan luchd-leantainn a-mhàin a lìbhrigeadh dha na frithealaichean far a bheil an luchd-leantainn agad a’ còmhnaidh agus thèid na teachdaireachdan dìreach a lìbhrigeadh gu frithealaichean nam faightearan nuair a bhios iad a’ còmhnaidh air frithealaiche eile.

Nuair a dh’ùghdarraicheas tu aplacaid gun cleachd i an cunntas agad, a-rèir sgòp nan ceadan a dh’aontaicheas tu riutha, faodaidh i fiosrachadh poblach na pròifil agad, liosta na feadhna air a bhios tu a’ leantainn, an luchd-leantainn agad, na liostaichean agad, na postaichean agad uile ’s na h-annsachdan agad inntrigeadh. Chan urrainn do dh’aplacaidean an seòladh puist-d no am facal-faire agad inntrigeadh idir.


Cleachdadh na làraich leis a’ chloinn

Ma tha am frithealaiche seo san Aonadh Eòrpach (AE) no san Roinn Eaconomach na h-Eòrpa (EEA): Tha an làrach, na batharan agus na seirbheisean againn uile ag amas air an fheadhainn a tha co-dhiù 16 bliadhnaichean a dh’aois. Ma tha thu nas òige na 16 bliadhnaichean a dh’aois, tha e riatanach fon GDPR (General Data Protection Regulation) nach cleachd thu an làrach seo.

Ma tha am frithealaiche seo sna Stàitean Aonaichte (SAA): Tha an làrach, na batharan agus na seirbheisean againn uile ag amas air an fheadhainn a tha co-dhiù 13 bliadhnaichean a dh’aois. Ma tha thu nas òige na 16 bliadhnaichean a dh’aois, tha e riatanach fon COPPA (Children''s Online Privacy Protection Act)ha an làrach, na batharan agus na seirbheisean againn uile ag amas air an fheadhainn a tha co-dhiù 16 bliadhnaichean a dh’aois. Ma tha thu nas òige na 16 bliadhnaichean a dh’aois, tha e riatanach fon GDPR (General Data Protection Regulation) nach cleachd thu an làrach seo.

Ma tha am frithealaiche seo sna Stàitean Aonaichte (SAA): Tha an làrach, na batharan agus na seirbheisean againn uile ag amas air an fheadhainn a tha co-dhiù 13 bliadhnaichean a dh’aois. Ma tha thu nas òige na 16 bliadhnaichean a dh’aois, tha e riatanach fon COPPA (Children''s Online Privacy Protection Act) nach cleachd thu an làrach seo.

Dh’fhaoidte gu bheil am frithealaiche seo fo riatanasan lagha eile ma tha e ann an uachdranas laghail eile.


Atharraichean air a’ phoileasaidh phrìobhaideachd againn

Ma chuireas sinn romhainn am poileasaidh prìobhaideachd againn atharrachadh, postaichidh sinn na h-atharraichean dhan duilleag seo.

Tha an sgrìobhainn seo fo cheadachas CC-BY-SA. Chaidh ùrachadh an turas mu dheireadh an t-7mh dhen Mhart 2018.

Chaidh a fhreagarrachadh o thùs o phoileasaidh prìobhaideachd Discourse.

nach cleachd thu an làrach seo.

Dh’fhaoidte gu bheil am frithealaiche seo fo riatanasan lagha eile ma tha e ann an uachdranas laghail eile.


Atharraichean air a’ phoileasaidh phrìobhaideachd againn

Ma chuireas sinn romhainn am poileasaidh prìobhaideachd againn atharrachadh, postaichidh sinn na h-atharraichean dhan duilleag seo.

Tha an sgrìobhainn seo fo cheadachas CC-BY-SA. Chaidh ùrachadh an turas mu dheireadh an t-7mh dhen Mhart 2018.

Chaidh a fhreagarrachadh o thùs o phoileasaidh prìobhaideachd Discourse.

-' + ' title: Teirmichean na seirbheise ⁊ poileasaidh prìobhaideachd %{instance} themes: contrast: Mastodon (iomsgaradh àrd) @@ -1390,7 +1390,7 @@ gd: edit_profile_step: "’S urrainn dhut a’ phròifil agad a ghnàthachadh is tu a’ luchdadh suas avatar no bann-cinn, ag atharrachadh d’ ainm-taisbeanaidh is a bharrachd. Nam bu mhiann leat lèirmheas a dhèanamh air daoine mus fhaod iad leantainn ort, ’s urrainn dhut an cunntas agad a ghlasadh." explanation: Seo gliocas no dhà gus tòiseachadh final_action: Tòisich air postadh - final_step: 'Tòisich air postadh! Fiù ’s mur eil duine sam bith a’ leantainn ort, chì cuid mhath na teachdaireachdan poblach agad, can air an loidhne-ama ionadail agus le tagaichean hais. Saoil an innis thu beagan mu d’ dhèidhinn air an taga hais #introductions?' + final_step: 'Tòisich air postadh! Fiù ’s mur eil duine sam bith a’ leantainn ort, chì cuid mhath na postaichean poblach agad, can air an loidhne-ama ionadail agus le tagaichean hais. Saoil an innis thu beagan mu d’ dhèidhinn air an taga hais #introductions?' full_handle: D’ ainm-cleachdaiche slàn full_handle_hint: Seo na bheir thu dha na caraidean agad ach an urrainn dhaibh teachdaireachd a chur thugad no leantainn ort o fhrithealaiche eile. review_preferences_action: Atharraich na roghainnean diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 09d758902..ce7dd20ce 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -23,7 +23,7 @@ gl: hosted_on: Mastodon aloxado en %{domain} instance_actor_flash: 'Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queiras bloquear a toda a instancia, en tal caso deberías utilizar o bloqueo do dominio. -' + ' learn_more: Saber máis privacy_policy: Política de privacidade rules: Regras do servidor @@ -43,7 +43,7 @@ gl: reason: Razón rejecting_media: 'Os ficheiros multimedia deste servidor non serán procesados e non se amosarán miniaturas, o que require un clic manual no ficheiro orixinal:' rejecting_media_title: Multimedia filtrado - silenced: 'As publicacións deste servidor non se amosarán en conversas e liñas temporais, nin terás notificacións das súas usuarias agás que as sigas:' + silenced: 'As publicacións destes servidores non se amosarán en conversas e cronoloxías públicas, nin terás notificacións xeradas polas interaccións das usuarias, a menos que as estés a seguir:' silenced_title: Servidores acalados suspended: 'Non se procesarán, almacenarán nin intercambiarán datos destes servidores, o que fai imposíbel calquera interacción ou comunicación coas usuarias dende estes servidores:' suspended_title: Servidores suspendidos @@ -639,7 +639,7 @@ gl: title: Estado do rexistro show_known_fediverse_at_about_page: desc_html: Si activado, mostraralle os toots de todo o fediverso coñecido nunha vista previa. Si non só mostrará os toots locais. - title: Mostrar vista previa do fediverso na liña temporal + title: Incluír contido federado na páxina da cronoloxía pública sen autenticación show_staff_badge: desc_html: Mostrar unha insignia de membresía nunha páxina de usuaria title: Mostrar insigna de membresía @@ -660,8 +660,8 @@ gl: desc_html: Utilizado para vistas previsas vía OpenGraph e API. Recoméndase 1200x630px title: Icona do servidor timeline_preview: - desc_html: Mostrar liña de tempo pública na páxina de inicio - title: vista previa da liña temporal + desc_html: Mostrar ligazón á cronoloxía pública na páxina de benvida e permitir o acceso API á cronoloxía pública sen ter autenticación + title: Permitir acceso á cronoloxía pública sen autenticación title: Axustes do sitio trendable_by_default: desc_html: Afecta ós cancelos que non foron rexeitados de xeito previo @@ -908,9 +908,9 @@ gl: filters: contexts: account: Perfís - home: Liña temporal inicial + home: Inicio e listaxes notifications: Avisos - public: Liñas temporais públicas + public: Cronoloxías públicas thread: Conversas edit: title: Editar filtro @@ -1126,7 +1126,7 @@ gl: preferences: other: Outro posting_defaults: Valores por omisión - public_timelines: Liñas temporais públicas + public_timelines: Cronoloxías públicas reactions: errors: limit_reached: Acadouse o límite das diferentes reaccións @@ -1280,7 +1280,7 @@ gl: public: Público public_long: Visible para calquera unlisted: Non listado - unlisted_long: Visible para calquera, pero non listado en liñas de tempo públicas + unlisted_long: Visible para calquera, pero non en cronoloxías públicas stream_entries: pinned: Publicación fixada reblogged: promovido @@ -1386,12 +1386,12 @@ gl: enabled: A autenticación de dobre-factor está activada enabled_success: Activouse con éxito a autenticación de dobre-factor generate_recovery_codes: Xerar códigos de recuperación - lost_recovery_codes: Os códigos de recuperación permítenlle recuperar o acceso a súa conta si perde o teléfono. Si perde os códigos de recuperación, pode restauralos aquí. Os seus códigos de recuperación anteriores serán invalidados. + lost_recovery_codes: Os códigos de recuperación permítenche recuperar o acceso a túa conta se perdes o teléfono. Se perdes os códigos de recuperación, podes restauralos aquí. Os teus códigos de recuperación anteriores serán invalidados. methods: Métodos para o segundo factor otp: App autenticadora recovery_codes: Códigos de recuperación do respaldo recovery_codes_regenerated: Códigos de recuperación xerados correctamente - recovery_instructions_html: Si perdese o acceso ao seu teléfono, pode utilizar un dos códigos inferiores de recuperación para recuperar o acceso a súa conta. Garde os códigos en lugar seguro. Por exemplo, pode imprimilos e gardalos xunto con outros documentos importantes. + recovery_instructions_html: Se perdeses o acceso ao teu teléfono, podes utilizar un dos códigos de recuperación inferiores para recuperar o acceso á conta. Garda os códigos nun lugar seguro. Por exemplo, podes imprimilos e gardalos xunto con outros documentos importantes. webauthn: Chaves de seguridade user_mailer: backup_ready: @@ -1430,15 +1430,15 @@ gl: edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a túa conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots. explanation: Aquí ten alunhas endereitas para ir aprendendo final_action: Comece a publicar - final_step: 'Publica! Incluso sen seguidoras as túas mensaxes serán vistas por outras, por exemplo na liña temporal local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.' + final_step: 'Publica! Incluso sen seguidoras as túas mensaxes públicas serán vistas por outras, por exemplo na cronoloxía local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.' full_handle: O seu alcume completo full_handle_hint: Esto é o que lle dirá aos seus amigos para que poidan seguila ou enviarlle mensaxes desde outro servidor. review_preferences_action: Cambiar preferencias review_preferences_step: Lembre establecer as preferencias, tales como qué correos-e lle querería recibir, ou o nivel de intimidade por omisión para as súas mensaxes. Se non lle molestan as imaxes con movemento, pode escoller que os GIF se reproduzan automáticamente. subject: Benvida a Mastodon - tip_federated_timeline: A liña temporal federada é unha visión reducida da rede Mastodon. Inclúe xente a que segue xente que ti segues, así que non é completa. - tip_following: Por omisión segues a Admin(s) no teu servidor. Para atopar máis xente interesante, mira nas liñas temporais local e federada. - tip_local_timeline: A liña temporal local é unha ollada xeral sobre a xente en %{instance}. Son as súas veciñas máis próximas! + tip_federated_timeline: A cronoloxía federada é unha visión reducida da rede Mastodon. Inclúe xente a que segue xente que ti segues, así que non é completa. + tip_following: Por defecto segues a Admin(s) no teu servidor. Para atopar máis xente interesante, mira nas cronoloxías local e federada. + tip_local_timeline: A cronoloxía local é unha ollada xeral sobre a xente en %{instance}. Son as súas veciñas máis próximas! tip_mobile_webapp: Si o navegador móbil lle ofrece engadir Mastodon a pantalla de inicio, pode recibir notificacións push. En moitos aspectos comportarase como un aplicativo nativo! tips: Consellos title: Benvida, %{name}! @@ -1447,7 +1447,7 @@ gl: generic_access_help_html: Problemas para acceder a conta? Podes contactar con %{email} para obter axuda invalid_otp_token: O código do segundo factor non é válido invalid_sign_in_token: Código de seguridade non válido - otp_lost_help_html: Si perde o acceso a ambos, pode contactar con %{email} + otp_lost_help_html: Se perdes o acceso a ambos, podes contactar con %{email} seamless_external_login: Está conectado a través de un servizo externo, polo que os axustes de contrasinal e correo-e non están dispoñibles. signed_in_as: 'Rexistrada como:' suspicious_sign_in_confirmation: Semella que non te conectaches antes desde este dispositivo, e hai tempo que non te conectas, así que ímosche enviar un código de seguridade ao teu enderezo de email para confirmar que es ti. diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 5106372aa..ebc1ec822 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -846,7 +846,7 @@ ja: email_change_html: アカウントを削除しなくてもメールアドレスを変更できます email_contact_html: それでも届かない場合、%{email} までメールで問い合わせてください email_reconfirmation_html: 確認のメールが届かない場合、もう一度申請できます。 - irreversible: アカウントを元に戻したり復活させることはできません + irreversible: 削除操作の撤回やアカウントの復活はできません more_details_html: 詳しくはプライバシーポリシーをご覧ください。 username_available: あなたのユーザー名は再利用できるようになります username_unavailable: あなたのユーザー名は引き続き利用できません diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 9844ac083..c215ee1ca 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -478,6 +478,11 @@ pl: unavailable: Niedostępne unavailable_message: Doręczaniei niedostępne warning: Ostrzeżenie + warning_message: + few: "%{count} dni niepowodzenia doręczenia" + many: "%{count} dni niepowodzenia doręczenia" + one: "%{count} dzień niepowodzenia doręczenia" + other: "%{count} dni niepowodzenia doręczenia" delivery_available: Doręczanie jest dostępne delivery_error_days: Dni błędów doręczenia delivery_error_hint: Jeżeli doręczanie nie będzie możliwe przez %{count} dni, zostanie automatycznie oznaczona jako nie do doręczania. diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 4811bc0b7..18142cb49 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -23,7 +23,7 @@ sc: hosted_on: Mastodon allogiadu in %{domain} instance_actor_flash: 'Custu contu est un''atore virtuale impreadu pro rapresentare su pròpiu serbidore, no est un''utente individuale. Benit impreadu pro punnas de federatzione e no ddu dias dèpere blocare si non boles blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu. -' + ' learn_more: Àteras informatziones privacy_policy: Polìtica de riservadesa rules: Règulas de su serbidore diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 92e9af416..8403f2c16 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -167,7 +167,7 @@ cs: setting_system_font_ui: Použít výchozí písmo systému setting_theme: Vzhled stránky setting_trends: Zobrazit dnes populární hashtagy - setting_unfollow_modal: Ppřed zrušením sledování zobrazovat potvrzovací okno + setting_unfollow_modal: Před zrušením sledování zobrazovat potvrzovací okno setting_use_blurhash: Zobrazit pro skrytá média barevné gradienty setting_use_pending_items: Pomalý režim severity: Vážnost diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 3f84121a7..93c57ee85 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -163,6 +163,7 @@ da: setting_hide_network: Skjul din sociale graf setting_noindex: Fravælg søgemaskineindeksering setting_reduce_motion: Reducér animationsbevægelse + setting_show_application: Viser applikation, der bruges til at sende indlæg setting_system_font_ui: Brug systemets standardskrifttype setting_theme: Webstedstema setting_trends: Vis dagens tendenser diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 3d0d1f1a7..bffcd8256 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -53,7 +53,7 @@ en: setting_display_media_hide_all: Always hide media setting_display_media_show_all: Always show media setting_hide_network: Who you follow and who follows you will be hidden on your profile - setting_noindex: Affects your public profile and status pages + setting_noindex: Affects your public profile and post pages setting_show_application: The application you use to post will be displayed in the detailed view of your posts setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed @@ -199,12 +199,12 @@ en: severity: Rule notification_emails: digest: Send digest e-mails - favourite: Someone favourited your status + favourite: Someone favourited your post follow: Someone followed you follow_request: Someone requested to follow you mention: Someone mentioned you pending_account: New account needs review - reblog: Someone boosted your status + reblog: Someone boosted your post report: New report is submitted trending_tag: An unreviewed hashtag is trending rule: diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 95c98dff1..ea918648e 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -52,7 +52,7 @@ es-AR: setting_display_media_hide_all: Siempre ocultar todos los medios setting_display_media_show_all: Siempre mostrar todos los medios setting_hide_network: Las cuentas que seguís y tus seguidores serán ocultados en tu perfil - setting_noindex: Afecta a tu perfil público y páginas de estado + setting_noindex: Afecta a tu perfil público y páginas de mensajes setting_show_application: La aplicación que usás para enviar mensajes se mostrará en la vista detallada de tus mensajes setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles setting_use_pending_items: Ocultar actualizaciones de la línea temporal detrás de un clic en lugar de desplazar automáticamente el flujo diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 3ced0e244..0bf72bac2 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -18,7 +18,7 @@ es-MX: disable: Evitar que el usuario utilice su cuenta, pero no eliminar ni ocultar sus contenidos. none: Utilizar esto para enviar una advertencia al usuario, sin poner en marcha ninguna otra acción. sensitive: Forzar que todos los archivos multimedia de este usuario sean marcados como sensibles. - silence: Evitar que el usuario pueda tootear con visibilidad pública, ocultar sus publicaciones y notificaciones a personas que no lo siguen. + silence: Evitar que el usuario pueda publicar con visibilidad pública, oculta sus mensajes y notificaciones a personas que no lo siguen. suspend: Evitar cualquier interacción desde o hacia esta cuenta y eliminar su contenido. Reversible en un plazo de 30 días. warning_preset_id: Opcional. Aún puede añadir texto personalizado al final de la configuración predefinida announcement: @@ -120,6 +120,7 @@ es-MX: text: Anuncio defaults: autofollow: Invitar a seguir tu cuenta + avatar: Avatar bot: Esta es una cuenta bot chosen_languages: Filtrar idiomas confirm_new_password: Confirmar nueva contraseña @@ -189,6 +190,7 @@ es-MX: text: "¿Por qué quiere unirse usted?" ip_block: comment: Comentario + ip: IP severities: no_access: Bloquear acceso sign_up_requires_approval: Limitar registros @@ -210,8 +212,10 @@ es-MX: name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias usable: Permitir a los toots usar esta etiqueta + 'no': 'No' recommended: Recomendado required: + mark: "*" text: necesario title: sessions: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index c6291abdf..cc01cd179 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -35,7 +35,7 @@ es: current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia - discoverable: El directorio del perfil es otra forma en la que su cuenta puede llegar a un público más amplio + discoverable: Permite que tu cuenta sea encontrada por desconocidos por medio de recomendaciones y otras herramientas email: Se le enviará un correo de confirmación fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px @@ -120,6 +120,7 @@ es: text: Anuncio defaults: autofollow: Invitar a seguir tu cuenta + avatar: Avatar bot: Esta es una cuenta bot chosen_languages: Filtrar idiomas confirm_new_password: Confirmar nueva contraseña @@ -127,7 +128,7 @@ es: context: Filtrar contextos current_password: Contraseña actual data: Información - discoverable: Listar esta cuenta en el directorio + discoverable: Sugerir la cuenta a otros display_name: Nombre para mostrar email: Dirección de correo electrónico expires_in: Expirar tras @@ -189,6 +190,7 @@ es: text: "¿Por qué quiere unirse usted?" ip_block: comment: Comentario + ip: IP severities: no_access: Bloquear acceso sign_up_requires_approval: Limitar registros @@ -210,8 +212,10 @@ es: name: Etiqueta trendable: Permitir que esta etiqueta aparezca bajo tendencias usable: Permitir a las publicaciones usar esta etiqueta + 'no': 'No' recommended: Recomendado required: + mark: "*" text: necesario title: sessions: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index d768da037..4bc0a1a8f 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -149,7 +149,7 @@ fr: setting_aggregate_reblogs: Grouper les partages dans les fils d’actualités setting_auto_play_gif: Lire automatiquement les GIFs animés setting_boost_modal: Demander confirmation avant de partager un message - setting_crop_images: Recadrer en 16x9 les images des messages qui ne sont pas ouvert en vue détaillée + setting_crop_images: Recadrer en 16x9 les images des messages qui ne sont pas ouverts en vue détaillée setting_default_language: Langue de publication setting_default_privacy: Confidentialité des messages setting_default_sensitive: Toujours marquer les médias comme sensibles diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index b7502a192..64833d527 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -30,29 +30,29 @@ gd: defaults: autofollow: Leanaidh na daoine a chlàraicheas leis a cuireadh ort gu fèin-obrachail avatar: PNG, GIF or JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px - bot: Tha an cunntas seo ri gnìomhan fèin-obrachail gu h-àraidh is dh’fhaoidte nach doir duine sam bith sùil air idir + bot: Comharraich do chàch gu bheil an cunntas seo ri gnìomhan fèin-obrachail gu h-àraidh is dh’fhaoidte nach doir duine sam bith sùil air idir context: Na co-theacsaichean air am bi a’ chriathrag an sàs current_password: A chùm tèarainteachd, cuir a-steach facal-faire a’ chunntais làithrich current_username: Airson seo a dhearbhadh, cuir a-steach ainm-cleachdaiche a’ chunntais làithrich digest: Cha dèid seo a chur ach nuair a bhios tu air ùine mhòr gun ghnìomh a ghabhail agus ma fhuair thu teachdaireachd phearsanta fhad ’s a bha thu air falbh - discoverable: "’S e dòigh eile a th’ ann an eòlaire nam pròifil leis an ruig an cunntas agad èisteachd nas fharsainge" + discoverable: Ceadaich gun lorg coigrich an cunntas agad le taic o mholaidhean is gleusan eile email: Thèid post-d dearbhaidh a chur thugad fields: Faodaidh tu suas ri 4 nithean a shealltainn mar chlàr air a’ phròifil agad header: PNG, GIF or JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px inbox_url: Dèan lethbhreac dhen URL o phrìomh-dhuilleag an ath-sheachadain a bu mhiann leat cleachdadh irreversible: Thèid postaichean criathraichte a-mach à sealladh gu buan fiù ’s ma bheir thu a’ chriathrag air falbh uaireigin eile locale: Cànan eadar-aghaidh a’ chleachdaiche, nam post-d ’s nam brathan putaidh - locked: Feumaidh tu gabhail ri luchd-leantainn ùr a làimh + locked: Stiùirich cò dh’fhaodas leantainn ort le gabhail ri iarrtasan leantainn a làimh password: Cleachd co-dhiù 8 caractaran phrase: Thèid a mhaidseadh gun aire air litrichean mòra ’s beaga no air rabhadh susbainte puist scopes: Na APIan a dh’fhaodas an aplacaid inntrigeadh. Ma thaghas tu sgòp air ìre as àirde, cha leig thu leas sgòpaichean fa leth a thaghadh. - setting_aggregate_reblogs: Na seall brosnachaidhean ùra do dhùdan a chaidh a bhrosnachadh o chionn ghoirid (cha doir seo buaidh ach air brosnachaidhean ùra o seo a-mach) + setting_aggregate_reblogs: Na seall brosnachaidhean ùra do phostaichean a chaidh a bhrosnachadh o chionn ghoirid (cha doir seo buaidh ach air brosnachaidhean ùra o seo a-mach) setting_default_sensitive: Thèid meadhanan frionasach fhalach o thùs is gabhaidh an nochdadh le briogadh orra setting_display_media_default: Falaich meadhanan ris a bheil comharra gu bheil iad frionasach setting_display_media_hide_all: Falaich na meadhanan an-còmhnaidh setting_display_media_show_all: Seall na meadhanan an-còmhnaidh - setting_hide_network: Cha nochd cò a tha thu a’ leantainn orra no an luchd-leantainn agad fhèin air a’ phròifil agad - setting_noindex: Bheir seo buaidh air a’ phròifil phoblach ’s air duilleagan nan staidean agad + setting_hide_network: Thèid cò a tha thu a’ leantainn orra ’s an luchd-leantainn agad fhèin a chur am falach air a’ phròifil agad + setting_noindex: Bheir seo buaidh air a’ phròifil phoblach ’s air duilleagan nam postaichean agad setting_show_application: Chithear cò an aplacaid a chleachd thu airson post a sgrìobhadh ann an seallaidhean mionaideach nam postaichean agad setting_use_blurhash: Tha caiseadan stèidhichte air dathan nan nithean lèirsinneach a chaidh fhalach ach chan fhaicear am mion-fhiosrachadh setting_use_pending_items: Falaich ùrachaidhean na loidhne-ama air cùlaibh briogaidh seach a bhith a’ sgroladh an inbhir gu fèin-obrachail @@ -68,7 +68,7 @@ gd: form_challenge: current_password: Tha thu a’ tighinn a-steach gu raon tèarainte imports: - data: Chaidh am faidhle CSV às-phortadh o fhrithealaiche Mastodon eile + data: Faidhle CSV a chaidh às-phortadh o fhrithealaiche Mastodon eile invite_request: text: Bidh e nas fhasa dhuinn lèirmheas a dhèanamh air d’ iarrtas ip_block: @@ -128,7 +128,7 @@ gd: context: Co-theacsaichean na criathraige current_password: Am facal-faire làithreach data: Dàta - discoverable: Seall an cunntas seo san eòlaire + discoverable: Mol an cunntas do chàch display_name: Ainm-taisbeanaidh email: Seòladh puist-d expires_in: Falbhaidh an ùine air às dèidh @@ -138,7 +138,7 @@ gd: inbox_url: URL bogsa a-steach an ath-sheachadain irreversible: Leig seachad seach falach locale: Cànan na h-eadar-aghaidh - locked: Glais an cunntas + locked: Iarr iarrtasan leantainn max_uses: An àireamh as motha de chleachdaidhean new_password: Facal-faire ùr note: Mu mo dhèidhinn @@ -160,7 +160,7 @@ gd: setting_display_media_hide_all: Falaich na h-uile setting_display_media_show_all: Seall na h-uile setting_expand_spoilers: Leudaich postaichean ris a bheil rabhadh susbainte an-còmhnaidh - setting_hide_network: Falaich an lìonra agad + setting_hide_network: Falaich an graf sòisealta agad setting_noindex: Thoir air falbh an ro-aonta air inneacsadh le einnseanan-luirg setting_reduce_motion: Ìslich an gluasad sna beòthachaidhean setting_show_application: Foillsich dè an aplacaid a chleachdas tu airson postaichean a chur @@ -208,7 +208,7 @@ gd: rule: text: Riaghailt tag: - listable: Leig leis an taga hais seo gun nochd e ann an toraidhean luirg ’s air eòlaire nam pròifil + listable: Leig leis an taga hais seo gun nochd e ann an toraidhean luirg ’s am measg nam molaidhean name: Taga hais trendable: Leig leis an taga hais seo gun nochd e am measg nan treandaichean usable: Leig le postaichean an taga hais seo a chleachdadh diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 650a2578d..77380bbe0 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -55,7 +55,7 @@ gl: setting_noindex: Afecta ao teu perfil público e páxinas de estado setting_show_application: A aplicación que estás a utilizar para enviar publicacións mostrarase na vista detallada da publicación setting_use_blurhash: Os gradientes toman as cores da imaxe oculta pero esborranchando todos os detalles - setting_use_pending_items: Ocultar as actualizacións da liña temporal tras un click no lugar de desprazar automáticamente os comentarios + setting_use_pending_items: Agochar actualizacións da cronoloxía tras un click no lugar de desprazar automáticamente os comentarios username: O teu nome de usuaria será único en %{domain} whole_word: Se a chave ou frase de paso é só alfanumérica, só se aplicará se concorda a palabra completa domain_allow: @@ -146,7 +146,7 @@ gl: password: Contrasinal phrase: Palabra chave ou frase setting_advanced_layout: Activar interface web avanzada - setting_aggregate_reblogs: Agrupar promocións nas liñas temporais + setting_aggregate_reblogs: Agrupar promocións nas cronoloxías setting_auto_play_gif: Reprodución automática de GIFs animados setting_boost_modal: Pedir confirmación antes de promocionar setting_crop_images: Recortar imaxes a 16x9 en publicacións non despregadas diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 3e2e930a7..35045e9c3 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -46,7 +46,7 @@ th: setting_display_media_hide_all: ซ่อนสื่อเสมอ setting_display_media_show_all: แสดงสื่อเสมอ setting_hide_network: จะซ่อนผู้ที่คุณติดตามและผู้ที่ติดตามคุณในโปรไฟล์ของคุณ - setting_noindex: มีผลต่อโปรไฟล์สาธารณะและหน้าสถานะของคุณ + setting_noindex: มีผลต่อโปรไฟล์สาธารณะและหน้าโพสต์ของคุณ setting_show_application: จะแสดงแอปพลิเคชันที่คุณใช้ในการโพสต์ในมุมมองโดยละเอียดของโพสต์ของคุณ setting_use_blurhash: การไล่ระดับสีอิงตามสีของภาพที่ซ่อนอยู่แต่ทำให้รายละเอียดใด ๆ คลุมเครือ setting_use_pending_items: ซ่อนการอัปเดตเส้นเวลาไว้หลังการคลิกแทนที่จะเลื่อนฟีดโดยอัตโนมัติ @@ -184,18 +184,18 @@ th: severity: กฎ notification_emails: digest: ส่งอีเมลสรุป - favourite: ใครสักคนได้ชื่นชอบสถานะของคุณ + favourite: ใครสักคนได้ชื่นชอบโพสต์ของคุณ follow: ใครสักคนได้ติดตามคุณ follow_request: ใครสักคนได้ขอติดตามคุณ mention: ใครสักคนได้กล่าวถึงคุณ pending_account: บัญชีใหม่ต้องมีการตรวจทาน - reblog: ใครสักคนได้ดันสถานะของคุณ + reblog: ใครสักคนได้ดันโพสต์ของคุณ report: มีการส่งรายงานใหม่ trending_tag: แฮชแท็กที่ยังไม่ได้ตรวจทานกำลังนิยม rule: text: กฎ tag: - listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและในไดเรกทอรีโปรไฟล์ + listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและข้อเสนอแนะ name: แฮชแท็ก trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 30bd0ac6e..d9c990de2 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -3,7 +3,7 @@ zh-CN: simple_form: hints: account_alias: - acct: 指定您想要迁移过来的原帐号:用户名@站点域名 + acct: 指定你想要迁移过来的原帐号:用户名@站点域名 account_migration: acct: 指定你想迁移过去的目标帐号:用户名@站点域名 account_warning_preset: @@ -74,7 +74,7 @@ zh-CN: ip_block: comment: 可选。请记住为什么你添加了此规则。 expires_in: IP 地址是一种有限的资源,它们有时是共享的,并且常常变化。因此,不推荐无限期的 IP 封禁。 - ip: 输入 IPv4 或 IPv6 地址。你可以使用 CIDR 语法屏蔽整个范围。小心不要屏蔽自己! + ip: 输入 IPv4 或 IPv6 地址。你可以使用CIDR语法屏蔽IP段。小心不要屏蔽自己! severities: no_access: 阻止访问所有资源 sign_up_requires_approval: 新注册需要你的批准 @@ -101,7 +101,7 @@ zh-CN: text: 预置文本 title: 标题 admin_account_action: - include_statuses: 在电子邮件中包括已报告的嘟文 + include_statuses: 在电子邮件中包括已举报的嘟文 send_email_notification: 通过邮件提醒此用户 text: 内容警告 type: 动作 @@ -145,7 +145,7 @@ zh-CN: otp_attempt: 双重认证代码 password: 密码 phrase: 关键词 - setting_advanced_layout: 启用高级 Web 界面 + setting_advanced_layout: 启用高级web界面 setting_aggregate_reblogs: 在时间轴中合并转嘟 setting_auto_play_gif: 自动播放 GIF 动画 setting_boost_modal: 在转嘟前询问我 @@ -203,7 +203,7 @@ zh-CN: mention: 当有用户在嘟文中提及我时,发送电子邮件提醒我 pending_account: 在有帐号需要审核时,发送电子邮件提醒我 reblog: 当有用户转嘟了我的嘟文时,发送电子邮件提醒我 - report: 在提交新报告时,发送电子邮件提醒我 + report: 在提交新举报时,发送电子邮件提醒我 trending_tag: 当未经审核的话题成为当前热门时发邮件提醒 rule: text: 规则 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index ec2d62e24..b815f42c7 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -8,16 +8,18 @@ zh-TW: acct: 指定欲移動至之帳戶的 使用者名稱@站台 account_warning_preset: text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能 + title: 可選。不會向收件者顯示 admin_account_action: + include_statuses: 使用者可看到導致檢舉或警告的嘟文 send_email_notification: 使用者將收到帳戶發生之事情的解釋 text_html: 選用。您能使用嘟文語法。您可 新增警告預設 來節省時間 type_html: 設定要使用 %{acct} 做的事 types: - disable: 禁止該使用者使用他們的帳號,但是不刪除或隱藏他們的內容。 + disable: 禁止該使用者使用他們的帳戶,但是不刪除或隱藏他們的內容。 none: 使用這個寄送警告給該使用者,而不進行其他動作。 sensitive: 強制標記此使用者所有媒體為敏感內容。 - silence: 禁止該使用者發公開嘟文,從無跟隨他們的帳號中隱藏嘟文和通知。 - suspend: 禁止所有對該帳號任何互動,並且刪除其內容。三十日內可以撤回。 + silence: 禁止該使用者發公開嘟文,從無跟隨他們的帳戶中隱藏嘟文和通知。 + suspend: 禁止所有對該帳戶任何互動,並且刪除其內容。三十日內可以撤回。 warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字 announcement: all_day: 核取後,只會顯示出時間範圍中的日期部分 @@ -96,7 +98,7 @@ zh-TW: defaults: autofollow: 邀請別人關注你的帳戶 avatar: 大頭貼 - bot: 此帳號是台機器人 + bot: 此帳戶是台機器人 chosen_languages: 過濾語言 confirm_new_password: 確認新密碼 confirm_password: 確認密碼 @@ -105,14 +107,14 @@ zh-TW: data: 資料 discoverable: 在目錄列出此帳戶 display_name: 顯示名稱 - email: 電子信箱位址 + email: 電子信箱地址 expires_in: 失效時間 fields: 個人資料中繼資料 header: 頁面頂端 inbox_url: 中繼收件匣的 URL irreversible: 放棄而非隱藏 locale: 介面語言 - locked: 鎖定帳號 + locked: 鎖定帳戶 max_uses: 最大使用次數 new_password: 新密碼 note: 簡介 @@ -127,6 +129,7 @@ zh-TW: setting_default_privacy: 嘟文可見範圍 setting_default_sensitive: 總是將媒體標記為敏感內容 setting_delete_modal: 刪除嘟文前先詢問我 + setting_disable_swiping: 停用滑動手勢 setting_display_media: 媒體顯示 setting_display_media_default: 預設 setting_display_media_hide_all: 全部隱藏 @@ -140,12 +143,16 @@ zh-TW: setting_theme: 站點主題 setting_trends: 顯示本日趨勢 setting_unfollow_modal: 取消關注某人前先詢問我 + setting_use_blurhash: 將隱藏媒體以彩色漸變圖樣表示 setting_use_pending_items: 限速模式 severity: 優先級 + sign_in_token_attempt: 安全代碼 type: 匯入類型 username: 使用者名稱 - username_or_email: 使用者名稱或電子信箱位址 + username_or_email: 使用者名稱或電子信箱地址 whole_word: 整個詞彙 + email_domain_block: + with_dns_records: 包括網域的 MX 記錄和 IP 位址 featured_tag: name: "「#」標籤" interactions: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 27e2ecfe1..c00d1915c 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -158,7 +158,7 @@ sv: protocol: Protokoll public: Offentlig push_subscription_expires: PuSH-prenumerationen löper ut - redownload: Uppdatera avatar + redownload: Uppdatera profil reject: Förkasta reject_all: Förkasta allt / Avvisa alla remove_avatar: Ta bort avatar @@ -173,6 +173,7 @@ sv: role: Behörigheter roles: admin: Administratör + moderator: Moderator staff: Personal user: Användare search: Sök @@ -215,7 +216,7 @@ sv: destroy_custom_emoji: Radera egen emoji destroy_domain_allow: Ta bort tillåten domän destroy_domain_block: Ta bort blockerad domän - destroy_ip_block: Ta bort IP-regel + destroy_ip_block: Radera IP-regel destroy_status: Ta bort status disable_2fa_user: Inaktivera 2FA disable_custom_emoji: Inaktivera egna emojis @@ -238,12 +239,15 @@ sv: update_status: Uppdatera status deleted_status: "(raderad status)" empty: Inga loggar hittades. + filter_by_action: Filtrera efter åtgärd + filter_by_user: Filtrera efter användare title: Revisionslogg announcements: live: Direkt + publish: Publicera scheduled_for: Schemalagd för %{time} custom_emojis: - assign_category: Ange kategori + assign_category: Tilldela kategori by_domain: Domän copied_msg: Skapade en lokal kopia av emoji utan problem copy: Kopia @@ -255,6 +259,7 @@ sv: disable: Inaktivera disabled: Inaktiverad disabled_msg: Inaktiverade emoji utan problem + emoji: Emoji enable: Aktivera enabled: Aktiverad enabled_msg: Aktiverade den emoji utan problem @@ -384,7 +389,8 @@ sv: title: Filtrera title: Inbjudningar ip_blocks: - delete: Ta bort + add_new: Skapa regel + delete: Radera expires_in: '1209600': 2 veckor '15778476': 6 månader @@ -410,6 +416,10 @@ sv: created_msg: Anmälningsanteckning har skapats! destroyed_msg: Anmälningsanteckning har raderats! reports: + account: + reports: + one: "%{count} rapport" + other: "%{count} rapporter" action_taken_by: Åtgärder vidtagna av are_you_sure: Är du säker? assign_to_self: Tilldela till mig @@ -440,7 +450,7 @@ sv: updated_at: Uppdaterad rules: add_new: Lägg till regel - delete: Ta bort + delete: Radera edit: Ändra regel title: Serverns regler settings: @@ -479,7 +489,7 @@ sv: desc_html: Visas på framsidan när registreringen är stängd. Du kan använda HTML-taggar title: Stängt registreringsmeddelande deletion: - desc_html: Tillåt alla att ta bort sitt konto + desc_html: Tillåt vem som helst att radera sitt konto title: Öppen kontoradering min_invite_role: disabled: Ingen @@ -531,6 +541,7 @@ sv: last_active: Senast aktiv name: Hashtag title: Hashtaggar + trending_right_now: Trenderar just nu unreviewed: Ej granskad title: Administration warning_presets: @@ -550,6 +561,7 @@ sv: discovery: Upptäck localization: body: Mastodon översätts av volontärer. + guide_link: https://crowdin.com/project/mastodon guide_link_text: Alla kan bidra. sensitive_content: Känsligt innehåll application_mailer: @@ -570,10 +582,11 @@ sv: auth: apply_for_account: Be om en inbjudan change_password: Lösenord - delete_account: Ta bort konto + delete_account: Radera konto delete_account_html: Om du vill radera ditt konto kan du fortsätta här. Du kommer att bli ombedd att bekräfta. description: prefix_invited_by_user: "@%{name} bjuder in dig att gå med i en Mastodon-server!" + prefix_sign_up: Registrera dig på Mastodon idag! didnt_get_confirmation: Fick du inte instruktioner om bekräftelse? forgot_password: Glömt ditt lösenord? invalid_reset_password_token: Lösenordsåterställningstoken är ogiltig eller utgått. Vänligen be om en ny. @@ -631,10 +644,13 @@ sv: x_seconds: "%{count}sek" deletes: confirm_password: Ange ditt lösenord för att verifiera din identitet - proceed: Ta bort konto + proceed: Radera konto success_msg: Ditt konto har raderats warning: + email_change_html: Du kan ändra din e-postadress utan att radera ditt konto irreversible: Du kan inte återställa eller återaktivera ditt konto + directories: + explore_mastodon: Utforska %{title} domain_validator: invalid_domain: är inte ett giltigt domännamn errors: @@ -684,11 +700,13 @@ sv: footer: developers: Utvecklare more: Mer… + resources: Resurser + trending_now: Trendar nu generic: all: Alla changes_saved_msg: Ändringar sparades framgångsrikt! copy: Kopiera - delete: Ta bort + delete: Radera order_by: Sortera efter save_changes: Spara ändringar validation_errors: @@ -744,6 +762,7 @@ sv: acct: användarnamn@domän av det nya kontot cancel_explanation: Avstängning av omdirigeringen kommer att återaktivera ditt nuvarande konto, men kommer inte att återskapa följare som har flyttats till det kontot. incoming_migrations: Flyttar från ett annat konto + proceed_with_move: Flytta följare redirected_msg: Ditt konto dirigeras om till %{acct}. moderation: title: Moderera @@ -785,11 +804,14 @@ sv: subject: "%{name} publicerade nyss" notifications: other_settings: Andra aviseringsinställningar + otp_authentication: + enable: Aktivera pagination: newer: Nyare next: Nästa older: Äldre prev: Tidigare + truncate: "…" polls: errors: invalid_choice: Det valda röstalternativet finns inte @@ -806,6 +828,7 @@ sv: remote_follow: acct: Ange ditt användarnamn@domän du vill följa från missing_resource: Det gick inte att hitta den begärda omdirigeringsadressen för ditt konto + no_account_html: Har du inget konto? Du kan registrera dig här proceed: Fortsätt för att följa prompt: 'Du kommer att följa:' reason_html: "Varför är det här steget nödvändigt? %{instance} är kanske inte den server du är registrerad vid, så vi behöver dirigera dig till din hemserver först." @@ -813,13 +836,29 @@ sv: activity: Senaste aktivitet browser: Webbläsare browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox generic: Okänd browser + ie: Internet Explorer + opera: Opera + safari: Safari current_session: Nuvarande session description: "%{browser} på %{platform}" explanation: Detta är inloggade webbläsare på Mastodon just nu. platforms: + android: Android + blackberry: Blackberry + chrome_os: Chrome OS + firefox_os: Firefox OS + ios: iOS + linux: Linux mac: Mac other: okänd plattform + windows: Windows revoke: Återkalla revoke_success: Sessionen återkallas framgångsrikt title: Sessioner @@ -841,6 +880,7 @@ sv: profile: Profil relationships: Följer och följare two_factor_authentication: Tvåfaktorsautentisering + webauthn_authentication: Säkerhetsnycklar statuses: attached: description: 'Bifogad: %{attached}' @@ -862,8 +902,18 @@ sv: ownership: Någon annans toot kan inte fästas private: Icke-offentliga toot kan inte fästas reblog: Knuffar kan inte fästas + poll: + total_people: + one: "%{count} person" + other: "%{count} personer" + total_votes: + one: "%{count} röst" + other: "%{count} röster" + vote: Rösta show_more: Visa mer show_thread: Visa tråd + sign_in_to_participate: Logga in för att delta i konversationen + title: '%{name}: "%{quote}"' visibilities: private: Endast följare private_long: Visa endast till följare @@ -963,7 +1013,9 @@ sv: default: Mastodon mastodon-light: Mastodon (ljust) two_factor_authentication: + add: Lägg till disable: Inaktivera + edit: Redigera enabled: Tvåfaktorsautentisering är aktiverad enabled_success: Tvåfaktorsautentisering aktiverad generate_recovery_codes: Generera återställningskoder @@ -971,11 +1023,15 @@ sv: recovery_codes: Backup återställningskod recovery_codes_regenerated: Återställningskoder genererades på nytt recovery_instructions_html: Om du någonsin tappar åtkomst till din telefon kan du använda någon av återställningskoderna nedan för att återställa åtkomst till ditt konto. Håll återställningskoderna säkra . Du kan till exempel skriva ut dem och lagra dem med andra viktiga dokument. + webauthn: Säkerhetsnycklar user_mailer: backup_ready: explanation: Du begärde en fullständig säkerhetskopiering av ditt Mastodon-konto. Det är nu klart för nedladdning! subject: Ditt arkiv är klart för nedladdning title: Arkivuttagning + warning: + title: + none: Varning welcome: edit_profile_action: Profilinställning edit_profile_step: Du kan anpassa din profil genom att ladda upp en avatar, bakgrundsbild, ändra ditt visningsnamn och mer. Om du vill granska nya följare innan de får följa dig kan du låsa ditt konto. @@ -993,12 +1049,15 @@ sv: tip_mobile_webapp: Om din mobila webbläsare erbjuder dig att lägga till Mastodon på din hemskärm kan du få push-aviseringar. Det fungerar som en inbyggd app på många sätt! title: Välkommen ombord, %{name}! users: + follow_limit_reached: Du kan inte följa fler än %{limit} personer invalid_otp_token: Ogiltig tvåfaktorskod otp_lost_help_html: Om du förlorat åtkomst till båda kan du komma i kontakt med %{email} seamless_external_login: Du är inloggad via en extern tjänst, så lösenord och e-postinställningar är inte tillgängliga. signed_in_as: 'Inloggad som:' webauthn_credentials: - delete: Ta bort + add: Lägg till ny säkerhetsnyckel + delete: Radera delete_confirmation: Är du säker på att du vill ta bort denna säkerhetsnyckel? destroy: - success: Din säkerhetsnyckel har tagits bort. + success: Din säkerhetsnyckel har raderats. + not_enabled: Du har inte aktiverat WebAuthn än diff --git a/config/locales/th.yml b/config/locales/th.yml index 5a3ae4988..89a553c46 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -2,7 +2,7 @@ th: about: about_hashtag_html: มีการแท็กโพสต์สาธารณะเหล่านี้ด้วย #%{hashtag} คุณสามารถโต้ตอบกับโพสต์หากคุณมีบัญชีที่ใดก็ตามในเฟดิเวิร์ส - about_mastodon_html: 'เครือข่ายสังคมแห่งอนาคต: ไม่มีโฆษณา, ไม่มีการสอดแนมโดยองค์กร, การออกแบบตามหลักจริยธรรม และการกระจายศูนย์! เป็นเจ้าของข้อมูลของคุณด้วย Mastodon!' + about_mastodon_html: 'เครือข่ายสังคมแห่งอนาคต: ไม่มีโฆษณา ไม่มีการสอดแนมโดยองค์กร การออกแบบตามหลักจริยธรรม และการกระจายศูนย์! เป็นเจ้าของข้อมูลของคุณด้วย Mastodon!' about_this: เกี่ยวกับ active_count_after: ใช้งานอยู่ active_footnote: ผู้ใช้งานรายเดือน (MAU) @@ -620,7 +620,7 @@ th: accounts_week: การใช้งานที่ไม่ซ้ำกันในสัปดาห์นี้ last_active: ใช้งานล่าสุด most_popular: ยอดนิยม - most_recent: ล่าสุด + most_recent: สร้างล่าสุด name: แฮชแท็ก review: สถานะการตรวจทาน reviewed: ตรวจทานแล้ว @@ -1023,6 +1023,7 @@ th: platforms: adobe_air: Adobe Air android: Android + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 0bfbf5a6c..34cc2988d 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -25,7 +25,7 @@ vi: learn_more: Tìm hiểu privacy_policy: Chính sách bảo mật rules: Quy tắc máy chủ - rules_html: 'Bên dưới là mô tả những quy tắc trên máy chủ Mastodon này, bạn phải đọc kỹ trước khi đăng ký:' + rules_html: 'Bên dưới là những quy tắc của máy chủ Mastodon này, bạn phải đọc kỹ trước khi đăng ký:' see_whats_happening: Dòng thời gian server_stats: 'Thống kê:' source_code: Mã nguồn diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index d9730d9f1..b9c07bd29 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -18,14 +18,14 @@ zh-CN: contact_unavailable: 未公开 discover_users: 发现用户 documentation: 文档 - federation_hint_html: 在 %{instance} 上拥有账号后,你可以关注任何兼容 Mastodon 服务器上的人。 + federation_hint_html: 在 %{instance} 上拥有账号后,你可以关注任何兼容Mastodon的服务器上的人。 get_apps: 尝试移动应用 hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例 instance_actor_flash: "这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。 \n" learn_more: 了解详情 privacy_policy: 隐私政策 rules: 服务器规则 - rules_html: 如果你想要在此 Mastodon 服务器上拥有一个账户,你必须遵守相应的规则,摘要如下: + rules_html: 如果你想要在此Mastodon服务器上拥有一个账户,你必须遵守相应的规则,摘要如下: see_whats_happening: 看一看现在在发生什么 server_stats: 服务器统计数据: source_code: 源代码 @@ -51,7 +51,7 @@ zh-CN: what_is_mastodon: Mastodon 是什么? accounts: choices_html: "%{name} 的推荐:" - endorsements_hint: 你可以在 Web 界面上推荐你关注的人,他们会显示在这里。 + endorsements_hint: 你可以在web界面上推荐你关注的人,他们会显示在这里。 featured_tags_hint: 你可以精选一些话题标签展示在这里。 follow: 关注 followers: @@ -189,8 +189,8 @@ zh-CN: sensitized: 已标记为敏感内容 shared_inbox_url: 公用收件箱(Shared Inbox)URL show: - created_reports: 这个帐户提交的报告 - targeted_reports: 针对这个帐户的报告 + created_reports: 这个帐户提交的举报 + targeted_reports: 针对这个帐户的举报 silence: 隐藏 silenced: 已隐藏 statuses: 嘟文 @@ -214,7 +214,7 @@ zh-CN: whitelisted: 允许跨站交互 action_logs: action_types: - assigned_to_self_report: 指派报告 + assigned_to_self_report: 指派举报 change_email_user: 为用户修改邮箱地址 confirm_user: 确认用户 create_account_warning: 创建警告 @@ -242,13 +242,13 @@ zh-CN: memorialize_account: 将账户设为追悼模式 promote_user: 给用户升任 remove_avatar_user: 移除头像 - reopen_report: 重开报告 + reopen_report: 重开举报 reset_password_user: 重置密码 - resolve_report: 处理报告 + resolve_report: 处理举报 sensitive_account: 将你帐号中的媒体标记为敏感内容 silence_account: 隐藏用户 suspend_account: 封禁用户 - unassigned_report: 取消报告的指派 + unassigned_report: 取消举报的指派 unsensitive_account: 去除你帐号中媒体的敏感内容标记 unsilence_account: 解除账号隐藏 unsuspend_account: 解除账号封禁 @@ -257,7 +257,7 @@ zh-CN: update_domain_block: 更新域名屏蔽 update_status: 更新嘟文 actions: - assigned_to_self_report_html: "%{name} 接管了报告 %{target}" + assigned_to_self_report_html: "%{name} 接管了举报 %{target}" change_email_user_html: "%{name} 更改了用户 %{target} 的电子邮件地址" confirm_user_html: "%{name} 确认了用户 %{target} 的电子邮件地址" create_account_warning_html: "%{name} 向 %{target} 发送了警告" @@ -285,13 +285,13 @@ zh-CN: memorialize_account_html: "%{name} 将 %{target} 设置为追悼帐户" promote_user_html: "%{name} 对用户 %{target} 进行了升任操作" remove_avatar_user_html: "%{name} 删除了 %{target} 的头像" - reopen_report_html: "%{name} 重开了报告 %{target}" + reopen_report_html: "%{name} 重开了举报 %{target}" reset_password_user_html: "%{name} 重置了用户 %{target} 的密码" - resolve_report_html: "%{name} 处理了报告 %{target}" + resolve_report_html: "%{name} 处理了举报 %{target}" sensitive_account_html: "%{name} 将 %{target} 的媒体标记为敏感内容" silence_account_html: "%{name} 隐藏了用户 %{target}" suspend_account_html: "%{name} 封禁了用户 %{target}" - unassigned_report_html: "%{name} 放弃接管报告 %{target}" + unassigned_report_html: "%{name} 放弃接管举报 %{target}" unsensitive_account_html: "%{name} 去除了 %{target} 的媒体的敏感内容标记" unsilence_account_html: "%{name} 解除了用户 %{target} 的隐藏状态" unsuspend_account_html: "%{name} 解除了用户 %{target} 的封禁状态" @@ -366,7 +366,7 @@ zh-CN: feature_timeline_preview: 时间轴预览 features: 功能 hidden_service: 匿名服务连通性 - open_reports: 待处理报告数 + open_reports: 待处理举报数 pending_tags: 等待审核的标签 pending_users: 等待审核的用户 recent_users: 新用户 @@ -410,10 +410,10 @@ zh-CN: public_comment_hint: 给这一域名限制添加公开的评论,如果你推广你的域名限制列表的话,这些评论就会显示出来。 reject_media: 拒绝接收媒体文件 reject_media_hint: 删除本站已缓存的媒体文件,并且不再接收来自该域名的任何媒体文件。此选项不影响封禁 - reject_reports: 拒绝接收报告 - reject_reports_hint: 忽略来自此域名的所有报告。这和封禁无关。 + reject_reports: 拒绝接收举报 + reject_reports_hint: 忽略来自此域名的所有举报。这和封禁无关。 rejecting_media: 拒绝接收媒体文件 - rejecting_reports: 拒绝接收报告 + rejecting_reports: 拒绝接收举报 severity: silence: 已隐藏 suspend: 已封禁 @@ -440,7 +440,7 @@ zh-CN: title: 添加电子邮件域名屏蔽 title: 电子邮件域名屏蔽 follow_recommendations: - description_html: "“关注推荐”帮助新用户快速找到有趣的内容。 当用户与他人的互动不足以形成个性化的建议时,就会推荐关注这些账户。每日都会更新推荐,基于选定语言的近期最高互动数和最多本站关注者数综合评估得出。" + description_html: "“关注推荐”可帮助新用户快速找到有趣的内容。 当用户与他人的互动不足以形成个性化的建议时,就会推荐关注这些账户。推荐会每日更新,基于选定语言的近期最高互动数和最多本站关注者数综合评估得出。" language: 选择语言 status: 嘟文 suppress: 禁用推荐关注 @@ -449,12 +449,12 @@ zh-CN: unsuppress: 恢复推荐关注 instances: back_to_all: 全部 - back_to_limited: 隐藏 + back_to_limited: 受限 back_to_warning: 警告 by_domain: 域名 delivery: all: 全部 - clear: 清除投递错误 + clear: 清理投递错误 restart: 重新投递 stop: 停止投递 title: 投递 @@ -479,7 +479,7 @@ zh-CN: total_blocked_by_us: 被我站屏蔽的 total_followed_by_them: 被对方关注的 total_followed_by_us: 被我站关注的 - total_reported: 关于对方的报告 + total_reported: 关于对方的举报 total_storage: 媒体文件 invites: deactivate_all: 撤销所有邀请链接 @@ -525,8 +525,8 @@ zh-CN: status: 状态 title: 中继站 report_notes: - created_msg: 报告记录建立成功! - destroyed_msg: 报告记录删除成功! + created_msg: 举报记录建立成功! + destroyed_msg: 举报记录删除成功! reports: account: notes: @@ -537,10 +537,10 @@ zh-CN: are_you_sure: 你确定吗? assign_to_self: 接管 assigned: 已接管的监察员 - by_target_domain: 被报告账户的域名 + by_target_domain: 被举报账户的域名 comment: none: 没有 - created_at: 报告时间 + created_at: 举报时间 forwarded: 已转发 forwarded_to: 转发举报至 %{domain} mark_as_resolved: 标记为“已处理” @@ -551,14 +551,14 @@ zh-CN: create_and_unresolve: 添加记录并重开 delete: 删除 placeholder: 描述已经执行的操作,或其他任何相关的跟进情况… - reopen: 重开报告 - report: '报告 #%{id}' - reported_account: 报告用户 - reported_by: 报告人 + reopen: 重开举报 + report: '举报 #%{id}' + reported_account: 举报用户 + reported_by: 举报人 resolved: 已处理 - resolved_msg: 报告处理成功! + resolved_msg: 举报处理成功! status: 状态 - title: 报告 + title: 举报 unassign: 取消接管 unresolved: 未处理 updated_at: 更新时间 @@ -710,9 +710,9 @@ zh-CN: body: 新帐户的详细信息如下。你可以批准或拒绝此申请。 subject: 在 %{instance} 上有新帐号 ( %{username}) 需要审核 new_report: - body: "%{reporter} 报告了用户 %{target}" - body_remote: 来自 %{domain} 的用户报告了用户 %{target} - subject: 来自 %{instance} 的用户报告(#%{id}) + body: "%{reporter} 举报了用户 %{target}" + body_remote: 来自 %{domain} 的用户举报了用户 %{target} + subject: 来自 %{instance} 的用户举报(#%{id}) new_trending_tag: body: '今日的热门话题 #%{name} 之前未经审核。直到你允许之前这个话题将不会公开显示,或者就保持原样让它石沉大海。' subject: 在 %{instance} 有新话题 (#%{name}) 待审核 @@ -724,8 +724,8 @@ zh-CN: hint_html: 如果你想把另一个帐号迁移到这里,你可以先在这里创建一个别名。如果你想把关注者迁移过来,这一步是必须的。设置别名的操作时无害而且可以恢复的帐号迁移的操作会从旧帐号开始。 remove: 取消关联别名 appearance: - advanced_web_interface: 高级 Web 界面 - advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 Web 界面允许你配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间轴、任意数量的列表和话题标签。 + advanced_web_interface: 高级web界面 + advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 web 界面允许您配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间轴、任意数量的列表和话题标签。 animations_and_accessibility: 动画和访问选项 confirmation_dialogs: 确认对话框 discovery: 发现 @@ -887,7 +887,7 @@ zh-CN: csv: CSV domain_blocks: 域名屏蔽 lists: 列表 - mutes: 你静音的用户 + mutes: 你隐藏的用户 storage: 媒体文件存储 featured_tags: add_new: 添加新条目 @@ -1031,7 +1031,7 @@ zh-CN: title: 运营 move_handler: carry_blocks_over_text: 这个用户迁移自你屏蔽过的 %{acct} - carry_mutes_over_text: 这个用户迁移自你静音过的 %{acct} + carry_mutes_over_text: 这个用户迁移自你隐藏过的 %{acct} copy_account_note_text: 这个用户迁移自 %{acct},你曾为其添加备注: notification_mailer: digest: @@ -1445,8 +1445,8 @@ zh-CN: error: 删除你的安全密钥时出错。请重试。 success: 你的安全密钥已成功删除。 invalid_credential: 无效的安全密钥 - nickname_hint: 输入你新安全密钥的昵称 - not_enabled: 你尚未启用 WebAuthn + nickname_hint: 输入你的新安全密钥的昵称 + not_enabled: 你尚未启用WebAuthn not_supported: 此浏览器不支持安全密钥 otp_required: 要使用安全密钥,请先启用两步验证。 registered_on: 注册于 %{date} diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index c01d566b7..852c333ca 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -25,7 +25,7 @@ zh-TW: learn_more: 了解詳細 privacy_policy: 隱私權政策 rules: 伺服器規則 - rules_html: 以下是您若想在此 Mastodon 伺服器建立帳號必須遵守的規則總結: + rules_html: 以下是您若想在此 Mastodon 伺服器建立帳戶必須遵守的規則總結: see_whats_happening: 看看發生什麼事 server_stats: 伺服器統計: source_code: 原始碼 @@ -57,7 +57,7 @@ zh-TW: followers: other: 關注者 following: 正在關注 - instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。 + instance_actor_flash: 這個帳戶是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。 joined: 加入於 %{date} last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 @@ -99,12 +99,12 @@ zh-TW: avatar: 頭像 by_domain: 站點 change_email: - changed_msg: 已成功變更帳戶電子信箱位址! - current_email: 目前的電子信箱位址 - label: 變更電子信箱位址 - new_email: 新的電子信箱位址 - submit: 變更電子信箱位址 - title: 為 %{username} 變更電子信箱位址 + changed_msg: 已成功變更帳戶電子信箱地址! + current_email: 目前的電子信箱地址 + label: 變更電子信箱地址 + new_email: 新的電子信箱地址 + submit: 變更電子信箱地址 + title: 為 %{username} 變更電子信箱地址 confirm: 確定 confirmed: 已確定 confirming: 確定 @@ -118,7 +118,7 @@ zh-TW: display_name: 暱稱 domain: 站點 edit: 編輯 - email: 電子信箱位址 + email: 電子信箱地址 email_status: 電子信箱狀態 enable: 啟用 enabled: 已啟用 @@ -140,7 +140,7 @@ zh-TW: media_attachments: 多媒體附件 memorialize: 設定為追悼帳戶 memorialized: 被悼念的 - memorialized_msg: 成功將%{username} 的帳號變為紀念帳號 + memorialized_msg: 成功將%{username} 的帳戶變為紀念帳戶 moderation: active: 活躍 all: 全部 @@ -151,7 +151,7 @@ zh-TW: moderation_notes: 管理備忘 most_recent_activity: 最近活動 most_recent_ip: 最近 IP 位址 - no_account_selected: 未選取任何帳號,因此未變更 + no_account_selected: 未選取任何帳戶,因此未變更 no_limits_imposed: 未受限制 not_subscribed: 未訂閱 pending: 等待審核中 @@ -164,7 +164,7 @@ zh-TW: redownloaded_msg: 成功重新載入%{username} 的個人資料頁面 reject: 拒絕 reject_all: 全部拒絕 - rejected_msg: 成功拒絕了%{username} 的新帳號申請 + rejected_msg: 成功拒絕了%{username} 的新帳戶申請 remove_avatar: 取消頭像 remove_header: 移除開頭 removed_avatar_msg: 成功刪除了 %{username} 的頭像 @@ -200,7 +200,7 @@ zh-TW: suspension_reversible_hint_html: 這個帳戶已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳戶。如果您想即時刪除這個帳戶的數據,您可以在下面進行操作。 time_in_queue: 正在佇列等待 %{time} title: 帳戶 - unconfirmed_email: 未確認的電子信箱位址 + unconfirmed_email: 未確認的電子信箱地址 undo_sensitized: 取消敏感狀態 undo_silenced: 取消靜音 undo_suspension: 取消停權 @@ -215,7 +215,7 @@ zh-TW: action_logs: action_types: assigned_to_self_report: 指派回報 - change_email_user: 變更使用者的電子信箱位址 + change_email_user: 變更使用者的電子信箱地址 confirm_user: 確認使用者 create_account_warning: 建立警告 create_announcement: 建立公告 @@ -237,17 +237,17 @@ zh-TW: disable_user: 停用帳戶 enable_custom_emoji: 啓用自訂顏文字 enable_user: 啓用帳戶 - memorialize_account: 設定成紀念帳號 + memorialize_account: 設定成紀念帳戶 promote_user: 把用戶升級 remove_avatar_user: 刪除大頭貼 reopen_report: 重開舉報 reset_password_user: 重設密碼 resolve_report: 消除舉報 - sensitive_account: 把您的帳號的媒體標記為敏感內容 + sensitive_account: 把您的帳戶的媒體標記為敏感內容 silence_account: 靜音用戶 suspend_account: 暫停用戶 unassigned_report: 取消指派舉報 - unsensitive_account: 取消把您的帳號的媒體設定為敏感內容 + unsensitive_account: 取消把您的帳戶的媒體設定為敏感內容 unsilence_account: 取消用戶的靜音狀態 unsuspend_account: 取消用戶的暫停狀態 update_announcement: 更新公告 @@ -393,7 +393,12 @@ zh-TW: title: 新增電子信箱黑名單項目 title: 電子信箱黑名單 instances: + back_to_all: 所有 + back_to_warning: 警告 by_domain: 站台 + delivery: + all: 所有 + warning: 警告 delivery_available: 可傳送 empty: 找不到網域 known_accounts: @@ -466,7 +471,7 @@ zh-TW: are_you_sure: 你確定嗎? assign_to_self: 指派給自己 assigned: 指派負責人 - by_target_domain: 檢舉帳號之網域 + by_target_domain: 檢舉帳戶之網域 comment: none: 無 created_at: 日期 @@ -493,6 +498,7 @@ zh-TW: updated_at: 更新 rules: add_new: 新增規則 + delete: 刪除 edit: 編輯規則 title: 伺服器規則 settings: @@ -503,7 +509,7 @@ zh-TW: desc_html: 以半形逗號分隔多個使用者名。只能加入來自本站且未開啟保護的帳戶。如果留空,則預設關注本站所有管理員。 title: 新使用者預設關注 contact_information: - email: 用於聯絡的公開電子信箱位址 + email: 用於聯絡的公開電子信箱地址 username: 請輸入使用者名稱 custom_css: desc_html: 透過於每個頁面都載入的 CSS 調整外觀 @@ -632,8 +638,8 @@ zh-TW: title: 管理預設警告 admin_mailer: new_pending_account: - body: 以下是新帳號的詳細資訊。您可以同意或拒絕這項申請。 - subject: "%{instance} 上有新帳號 (%{username}) 待審核" + body: 以下是新帳戶的詳細資訊。您可以同意或拒絕這項申請。 + subject: "%{instance} 上有新帳戶 (%{username}) 待審核" new_report: body: "%{reporter} 檢舉了使用者 %{target}" body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target} @@ -643,10 +649,10 @@ zh-TW: subject: "%{instance} 上有待審核的主題標籤 (#%{name})" aliases: add_new: 建立別名 - created_msg: 成功建立別名。您可以自舊帳號開始轉移。 - deleted_msg: 成功移除別名。您將無法再由舊帳號轉移到當前帳號。 + created_msg: 成功建立別名。您可以自舊帳戶開始轉移。 + deleted_msg: 成功移除別名。您將無法再由舊帳戶轉移到目前的帳戶。 empty: 您目前沒有任何別名。 - hint_html: 如果想由其他帳號轉移到此帳號,您可以在此處創建別名,稍後系統將容許您把關注者由舊帳號轉移至此。此項作業是無害且可復原的帳號的遷移程序需要在舊帳號啟動。 + hint_html: 如果想由其他帳戶轉移到此帳戶,您可以在此處建立別名,稍後系統將容許您把關注者由舊帳戶轉移至此。此項作業是無害且可復原的帳戶的遷移程序需要在舊帳戶啟動。 remove: 取消連結別名 appearance: advanced_web_interface: 進階網頁介面 @@ -684,8 +690,8 @@ zh-TW: delete_account_html: 如果你想刪除你的帳戶,請點擊這裡繼續。你需要確認你的操作。 description: prefix_invited_by_user: "@%{name} 邀請您加入這個 Mastodon 伺服器!" - prefix_sign_up: 現在就註冊 Mastodon 帳號吧! - suffix: 有了帳號,就可以從任何 Mastodon 伺服器關注任何人、發發廢嘟,並且與任何 Mastodon 伺服器的使用者交♂流?! + prefix_sign_up: 現在就註冊 Mastodon 帳戶吧! + suffix: 有了帳戶,就可以從任何 Mastodon 伺服器關注任何人、發發廢嘟,並且與任何 Mastodon 伺服器的使用者交流,以及更多! didnt_get_confirmation: 沒有收到驗證信? dont_have_your_security_key: 找不到您的安全金鑰? forgot_password: 忘記密碼? @@ -708,14 +714,14 @@ zh-TW: set_new_password: 設定新密碼 setup: email_below_hint_html: 如果此電子郵件地址不正確,您可於此修改並接收郵件進行認證。 - email_settings_hint_html: 請確認 e-mail 是否傳送到 %{email} 。如果不對的話,可以從帳號設定修改。 + email_settings_hint_html: 請確認電子信件是否寄至 %{email} 。如果不對的話,可以在帳戶設定裡變更。 title: 設定 status: - account_status: 帳號狀態 + account_status: 帳戶狀態 confirming: 等待電子郵件確認完成。 - functional: 您的帳號可以正常使用了。 + functional: 您的帳戶可以正常使用了。 pending: 管管們正在處理您的申請,這可能需要一點時間處理。我們將在申請通過後以電子郵件方式通知您。 - redirecting_to: 您的帳號因目前重定向至 %{acct} 而被停用。 + redirecting_to: 您的帳戶因目前重新導向至 %{acct} 而被停用。 too_fast: 送出表單的速度太快跟不上,請稍後再試。 trouble_logging_in: 登錄時遇到困難? use_security_key: 使用安全金鑰 @@ -768,10 +774,10 @@ zh-TW: before: 在進行下一步驟之前,請詳細閱讀以下説明: caches: 已被其他節點快取的內容可能會殘留其中 data_removal: 您的嘟文和其他資料將會被永久刪除 - email_change_html: 你可以在不刪除帳號的情況下變更你的電子郵件地址 + email_change_html: 你可以在不刪除帳戶的情況下變更你的電子郵件地址 email_contact_html: 如果你仍然沒有收到郵件,請寄信到 %{email} 以獲得協助 email_reconfirmation_html: 如果你沒有收到確認郵件,你可以請求再次發送 - irreversible: 你將無法復原或重新啟用你的帳號 + irreversible: 你將無法復原或重新啟用你的帳戶 more_details_html: 更多詳細資訊,請參閲隱私政策。 username_available: 你的使用者名稱將會釋出供他人使用 username_unavailable: 你的使用者名稱將會保留並不予他人使用 @@ -870,8 +876,8 @@ zh-TW: inactive: 非活躍 publicize_checkbox: 並發嘟: publicize_toot: 驗證成功!我在是住在 %{service} 的 %{username} : %{url} - remove: 移除帳號證明 - removed: 成功移除帳號證明 + remove: 移除帳戶證明 + removed: 成功移除帳戶證明 status: 驗證狀態 view_proof: 檢視證明 imports: @@ -924,18 +930,19 @@ zh-TW: migrations: acct: 新帳戶的 使用者名稱@站點網域 cancel: 取消重導向 - cancel_explanation: 取消重導向將會重新啓用目前帳號,但不會還原已移至該帳號的關注者。 + cancel_explanation: 取消重新導向將會重新啟用目前帳戶,但不會還原已移至該帳號的關注者。 cancelled_msg: 成功取消重導向。 errors: already_moved: 與已經重導向的帳戶相同 - missing_also_known_as: 不是這個帳號的別名 - move_to_self: 不能是目前帳號 + missing_also_known_as: 不是這個帳戶的別名 + move_to_self: 不能是目前帳戶 not_found: 找不到 on_cooldown: 你正在處於冷卻(CD)狀態 followers_count: 轉移時的追隨者 - incoming_migrations: 自另一個帳號轉移 + incoming_migrations: 自另一個帳戶轉移 proceed_with_move: 移動關注者 - redirected_msg: 您的帳號現在指向 %{acct} + redirected_msg: 您的帳戶現在指向 %{acct} + set_redirect: 設定重新導向 moderation: title: 營運 notification_mailer: @@ -975,6 +982,11 @@ zh-TW: next: 下一頁 older: 較舊 prev: 上一頁 + preferences: + other: 其他 + relationships: + moved: 已轉移 + status: 帳戶狀態 remote_follow: acct: 請輸入您的使用者名稱@站點網域 missing_resource: 無法找到資源 @@ -1006,11 +1018,25 @@ zh-TW: explanation: 這些是現在正登入於你的 Mastodon 帳戶的瀏覽器。 ip: IP 位址 platforms: + adobe_air: Adobe Air + android: Android + blackberry: 黑莓機 (Blackberry) + chrome_os: Chrome OS + firefox_os: Firefox OS + ios: iOS + linux: Linux mac: Mac + other: 不明平台 + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: 取消 revoke_success: Session 取消成功 title: 作業階段 settings: + account: 帳戶 + account_settings: 帳戶設定 + aliases: 帳戶別名 appearance: 外觀設定 authorized_apps: 已授權應用程式 back: 回到 Mastodon @@ -1019,7 +1045,9 @@ zh-TW: edit_profile: 編輯使用者資訊 export: 匯出 featured_tags: 推薦標籤 + identity_proofs: 身分驗證 import: 匯入 + import_and_export: 匯入及匯出 migrate: 帳戶搬遷 notifications: 通知 preferences: 偏好設定 diff --git a/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb b/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb index bd4f4c2a3..40537e9c9 100644 --- a/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb +++ b/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb @@ -1,6 +1,46 @@ class RemoveFauxRemoteAccountDuplicates < ActiveRecord::Migration[5.2] disable_ddl_transaction! + class StreamEntry < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :stream_entries + end + + class Status < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :statuses + has_many :favourites, inverse_of: :status, dependent: :destroy + has_many :mentions, dependent: :destroy, inverse_of: :status + end + + class Favourite < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :favourites + belongs_to :status, inverse_of: :favourites + end + + class Mention < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, inverse_of: :mentions + belongs_to :status + end + + class Notification < ApplicationRecord + # Dummy class, to make migration possible across version changes + belongs_to :account, optional: true + belongs_to :from_account, class_name: 'Account', optional: true + belongs_to :activity, polymorphic: true, optional: true + end + + class Account < ApplicationRecord + # Dummy class, to make migration possible across version changes + has_many :stream_entries, inverse_of: :account, dependent: :destroy + has_many :statuses, inverse_of: :account, dependent: :destroy + has_many :favourites, inverse_of: :account, dependent: :destroy + has_many :mentions, inverse_of: :account, dependent: :destroy + has_many :notifications, inverse_of: :account, dependent: :destroy + end + def up local_domain = Rails.configuration.x.local_domain diff --git a/db/migrate/20190715164535_add_instance_actor.rb b/db/migrate/20190715164535_add_instance_actor.rb index a26d54949..8c0301d69 100644 --- a/db/migrate/20190715164535_add_instance_actor.rb +++ b/db/migrate/20190715164535_add_instance_actor.rb @@ -1,4 +1,9 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] + class Account < ApplicationRecord + # Dummy class, to make migration possible across version changes + validates :username, uniqueness: { scope: :domain, case_sensitive: false } + end + def up Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) end diff --git a/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb b/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb index eb03d7ca7..3a6527f65 100644 --- a/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb +++ b/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb @@ -15,7 +15,13 @@ class AddCaseInsensitiveIndexToTags < ActiveRecord::Migration[5.2] Tag.where(id: redundant_tag_ids).in_batches.delete_all end - safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower ON tags (lower(name))' } + begin + safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower ON tags (lower(name))' } + rescue ActiveRecord::StatementInvalid + remove_index :tags, name: 'index_tags_on_name_lower' + raise + end + remove_index :tags, name: 'index_tags_on_name' remove_index :tags, name: 'hashtag_search_index' end diff --git a/db/migrate/20191007013357_update_pt_locales.rb b/db/migrate/20191007013357_update_pt_locales.rb index b7288d38a..9e8f8b424 100644 --- a/db/migrate/20191007013357_update_pt_locales.rb +++ b/db/migrate/20191007013357_update_pt_locales.rb @@ -1,4 +1,8 @@ class UpdatePtLocales < ActiveRecord::Migration[5.2] + class User < ApplicationRecord + # Dummy class, to make migration possible across version changes + end + disable_ddl_transaction! def up diff --git a/db/migrate/20200508212852_reset_unique_jobs_locks.rb b/db/migrate/20200508212852_reset_unique_jobs_locks.rb index 304e49322..d717ffc54 100644 --- a/db/migrate/20200508212852_reset_unique_jobs_locks.rb +++ b/db/migrate/20200508212852_reset_unique_jobs_locks.rb @@ -3,7 +3,7 @@ class ResetUniqueJobsLocks < ActiveRecord::Migration[5.2] def up # We do this to clean up unique job digests that were not properly - # disposed of prior to https://github.com/tootsuite/mastodon/pull/13361 + # disposed of prior to https://github.com/mastodon/mastodon/pull/13361 until SidekiqUniqueJobs::Digests.new.delete_by_pattern('*').nil?; end end diff --git a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb index c3aa8e33c..366bf9aa7 100644 --- a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb +++ b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb @@ -1,15 +1,9 @@ -class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2] - disable_ddl_transaction! +require Rails.root.join('lib', 'mastodon', 'migration_helpers') - class CorruptionError < StandardError - def cause - nil - end +class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers - def backtrace - [] - end - end + disable_ddl_transaction! def up if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') && index_name_exists?(:accounts, 'index_accounts_on_username_and_domain_lower') @@ -21,7 +15,8 @@ class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2] begin add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true, algorithm: :concurrently rescue ActiveRecord::RecordNotUnique - raise CorruptionError, 'Migration failed because of index corruption, see https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#fixing' + remove_index :accounts, name: 'index_accounts_on_username_and_domain_lower' + raise CorruptionError end remove_index :accounts, name: 'old_index_accounts_on_username_and_domain_lower' if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') diff --git a/db/migrate/20210416200740_create_canonical_email_blocks.rb b/db/migrate/20210416200740_create_canonical_email_blocks.rb index a1f1660bf..32c44646c 100644 --- a/db/migrate/20210416200740_create_canonical_email_blocks.rb +++ b/db/migrate/20210416200740_create_canonical_email_blocks.rb @@ -2,7 +2,7 @@ class CreateCanonicalEmailBlocks < ActiveRecord::Migration[6.1] def change create_table :canonical_email_blocks do |t| t.string :canonical_email_hash, null: false, default: '', index: { unique: true } - t.belongs_to :reference_account, null: false, foreign_key: { on_cascade: :delete, to_table: 'accounts' } + t.belongs_to :reference_account, null: false, foreign_key: { to_table: 'accounts' } t.timestamps end diff --git a/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb b/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb index ed359e8cd..e492c9e86 100644 --- a/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb +++ b/db/migrate/20210421121431_add_case_insensitive_btree_index_to_tags.rb @@ -1,8 +1,19 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + class AddCaseInsensitiveBtreeIndexToTags < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + disable_ddl_transaction! def up - safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower_btree ON tags (lower(name) text_pattern_ops)' } + begin + safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower_btree ON tags (lower(name) text_pattern_ops)' } + rescue ActiveRecord::StatementInvalid => e + remove_index :tags, name: 'index_tags_on_name_lower_btree' + raise CorruptionError if e.is_a?(ActiveRecord::RecordNotUnique) + raise e + end + remove_index :tags, name: 'index_tags_on_name_lower' end diff --git a/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb b/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb new file mode 100644 index 000000000..64cf84448 --- /dev/null +++ b/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb @@ -0,0 +1,13 @@ +class FixCanonicalEmailBlocksForeignKey < ActiveRecord::Migration[6.1] + def up + safety_assured do + execute 'ALTER TABLE canonical_email_blocks DROP CONSTRAINT fk_rails_1ecb262096, ADD CONSTRAINT fk_rails_1ecb262096 FOREIGN KEY (reference_account_id) REFERENCES accounts(id) ON DELETE CASCADE;' + end + end + + def down + safety_assured do + execute 'ALTER TABLE canonical_email_blocks DROP CONSTRAINT fk_rails_1ecb262096, ADD CONSTRAINT fk_rails_1ecb262096 FOREIGN KEY (reference_account_id) REFERENCES accounts(id);' + end + end +end diff --git a/db/post_migrate/20210526193025_remove_lock_version_from_account_stats.rb b/db/post_migrate/20210526193025_remove_lock_version_from_account_stats.rb new file mode 100644 index 000000000..3079bed09 --- /dev/null +++ b/db/post_migrate/20210526193025_remove_lock_version_from_account_stats.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class RemoveLockVersionFromAccountStats < ActiveRecord::Migration[5.2] + def change + safety_assured do + remove_column :account_stats, :lock_version, :integer, null: false, default: 0 + end + end +end diff --git a/db/schema.rb b/db/schema.rb index cdf1aa6e0..df30650ea 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_05_07_001928) do +ActiveRecord::Schema.define(version: 2021_06_30_000137) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -111,7 +111,6 @@ ActiveRecord::Schema.define(version: 2021_05_07_001928) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.datetime "last_status_at" - t.integer "lock_version", default: 0, null: false t.index ["account_id"], name: "index_account_stats_on_account_id", unique: true end @@ -989,7 +988,7 @@ ActiveRecord::Schema.define(version: 2021_05_07_001928) do add_foreign_key "blocks", "accounts", name: "fk_4269e03e65", on_delete: :cascade add_foreign_key "bookmarks", "accounts", on_delete: :cascade add_foreign_key "bookmarks", "statuses", on_delete: :cascade - add_foreign_key "canonical_email_blocks", "accounts", column: "reference_account_id" + add_foreign_key "canonical_email_blocks", "accounts", column: "reference_account_id", on_delete: :cascade add_foreign_key "conversation_mutes", "accounts", name: "fk_225b4212bb", on_delete: :cascade add_foreign_key "conversation_mutes", "conversations", on_delete: :cascade add_foreign_key "custom_filters", "accounts", on_delete: :cascade diff --git a/db/views/follow_recommendations_v01.sql b/db/views/follow_recommendations_v01.sql index 799abeaee..8295bbc0f 100644 --- a/db/views/follow_recommendations_v01.sql +++ b/db/views/follow_recommendations_v01.sql @@ -20,7 +20,7 @@ FROM ( HAVING count(follows.id) >= 5 UNION ALL SELECT accounts.id AS account_id, - sum(reblogs_count + favourites_count) / (1.0 + sum(reblogs_count + favourites_count)) AS rank, + sum(status_stats.reblogs_count + status_stats.favourites_count) / (1.0 + sum(status_stats.reblogs_count + status_stats.favourites_count)) AS rank, 'most_interactions' AS reason FROM status_stats INNER JOIN statuses ON statuses.id = status_stats.status_id @@ -32,7 +32,7 @@ FROM ( AND accounts.locked = 'f' AND accounts.discoverable = 't' GROUP BY accounts.id - HAVING sum(reblogs_count + favourites_count) >= 5 + HAVING sum(status_stats.reblogs_count + status_stats.favourites_count) >= 5 ) t0 GROUP BY account_id ORDER BY rank DESC diff --git a/db/views/follow_recommendations_v02.sql b/db/views/follow_recommendations_v02.sql index 673c5cc85..f67c6eecf 100644 --- a/db/views/follow_recommendations_v02.sql +++ b/db/views/follow_recommendations_v02.sql @@ -18,7 +18,7 @@ FROM ( HAVING count(follows.id) >= 5 UNION ALL SELECT account_summaries.account_id AS account_id, - sum(reblogs_count + favourites_count) / (1.0 + sum(reblogs_count + favourites_count)) AS rank, + sum(status_stats.reblogs_count + status_stats.favourites_count) / (1.0 + sum(status_stats.reblogs_count + status_stats.favourites_count)) AS rank, 'most_interactions' AS reason FROM status_stats INNER JOIN statuses ON statuses.id = status_stats.status_id @@ -28,7 +28,7 @@ FROM ( AND account_summaries.sensitive = 'f' AND follow_recommendation_suppressions.id IS NULL GROUP BY account_summaries.account_id - HAVING sum(reblogs_count + favourites_count) >= 5 + HAVING sum(status_stats.reblogs_count + status_stats.favourites_count) >= 5 ) t0 GROUP BY account_id ORDER BY rank DESC diff --git a/docker-compose.yml b/docker-compose.yml index 52eea7a74..97b6f1655 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,7 +43,7 @@ services: web: build: . - image: tootsuite/mastodon + image: tootsuite/mastodon:v3.4.6 restart: always env_file: .env.production command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000" @@ -63,7 +63,7 @@ services: streaming: build: . - image: tootsuite/mastodon + image: tootsuite/mastodon:v3.4.6 restart: always env_file: .env.production command: node ./streaming @@ -80,7 +80,7 @@ services: sidekiq: build: . - image: tootsuite/mastodon + image: tootsuite/mastodon:v3.4.6 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/cli.rb b/lib/cli.rb index 3f1658566..8815e137a 100644 --- a/lib/cli.rb +++ b/lib/cli.rb @@ -94,17 +94,22 @@ module Mastodon exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain - prompt.warn('This operation WILL NOT be reversible. It can also take a long time.') - prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') - prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.') + unless options[:dry_run] + prompt.warn('This operation WILL NOT be reversible. It can also take a long time.') + prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') + prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.') - exit(1) if prompt.no?('Are you sure you want to proceed?') + exit(1) if prompt.no?('Are you sure you want to proceed?') + end inboxes = Account.inboxes processed = 0 dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + Setting.registrations_mode = 'none' unless options[:dry_run] + if inboxes.empty? + Account.local.without_suspended.in_batches.update_all(suspended_at: Time.now.utc, suspension_origin: :local) unless options[:dry_run] prompt.ok('It seems like your server has not federated with anything') prompt.ok('You can shut it down and delete it any time') return @@ -112,9 +117,7 @@ module Mastodon prompt.warn('Do NOT interrupt this process...') - Setting.registrations_mode = 'none' - - Account.local.without_suspended.find_each do |account| + delete_account = ->(account) do payload = ActiveModelSerializers::SerializableResource.new( account, serializer: ActivityPub::DeleteActorSerializer, @@ -128,12 +131,15 @@ module Mastodon [json, account.id, inbox_url] end - account.suspend! + account.suspend!(block_email: false) end processed += 1 end + Account.local.without_suspended.find_each { |account| delete_account.call(account) } + Account.local.suspended.joins(:deletion_request).find_each { |account| delete_account.call(account) } + prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run}") prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data') rescue TTY::Reader::InputInterrupt diff --git a/lib/mastodon/maintenance_cli.rb b/lib/mastodon/maintenance_cli.rb index 8e2084e33..47e2d78bb 100644 --- a/lib/mastodon/maintenance_cli.rb +++ b/lib/mastodon/maintenance_cli.rb @@ -14,7 +14,7 @@ module Mastodon end MIN_SUPPORTED_VERSION = 2019_10_01_213028 - MAX_SUPPORTED_VERSION = 2021_05_07_001928 + MAX_SUPPORTED_VERSION = 2021_05_26_193025 # Stubs to enjoy ActiveRecord queries while not depending on a particular # version of the code/database diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 59c118500..36ca71844 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -230,6 +230,7 @@ module Mastodon processed, aggregate = parallelize_with_progress(scope) do |media_attachment| next if media_attachment.remote_url.blank? || (!options[:force] && media_attachment.file_file_name.present?) + next if DomainBlock.reject_media?(media_attachment.account.domain) unless options[:dry_run] media_attachment.reset_file! diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb index 521d903bf..5bc903349 100644 --- a/lib/mastodon/migration_helpers.rb +++ b/lib/mastodon/migration_helpers.rb @@ -41,6 +41,20 @@ module Mastodon module MigrationHelpers + class CorruptionError < StandardError + def initialize(message = nil) + super(message.presence || 'Migration failed because of index corruption, see https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#fixing') + end + + def cause + nil + end + + def backtrace + [] + end + end + # Model that can be used for querying permissions of a SQL user. class Grant < ActiveRecord::Base self.table_name = 'information_schema.role_table_grants' @@ -281,7 +295,7 @@ module Mastodon table = Arel::Table.new(table_name) total = estimate_rows_in_table(table_name).to_i - if total == 0 + if total < 1 count_arel = table.project(Arel.star.count.as('count')) count_arel = yield table, count_arel if block_given? diff --git a/lib/mastodon/search_cli.rb b/lib/mastodon/search_cli.rb index c0491744b..0126dfcff 100644 --- a/lib/mastodon/search_cli.rb +++ b/lib/mastodon/search_cli.rb @@ -102,7 +102,7 @@ module Mastodon ActiveRecord::Base.connection_pool.with_connection do grouped_records = type.adapter.send(:grouped_objects, records) - bulk_body = Chewy::Type::Import::BulkBuilder.new(type, grouped_records).bulk_body + bulk_body = Chewy::Type::Import::BulkBuilder.new(type, **grouped_records).bulk_body end index_count = grouped_records[:index].size if grouped_records.key?(:index) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 853c22e70..1d55c29ea 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 0 + 6 end def flags @@ -33,7 +33,7 @@ module Mastodon end def repository - ENV.fetch('GITHUB_REPOSITORY', 'tootsuite/mastodon') + ENV.fetch('GITHUB_REPOSITORY', 'mastodon/mastodon') end def source_base_url diff --git a/lib/paperclip/response_with_limit_adapter.rb b/lib/paperclip/response_with_limit_adapter.rb index 17a2abd25..deb89717a 100644 --- a/lib/paperclip/response_with_limit_adapter.rb +++ b/lib/paperclip/response_with_limit_adapter.rb @@ -17,9 +17,9 @@ module Paperclip def cache_current_values @original_filename = filename_from_content_disposition.presence || filename_from_path.presence || 'data' - @size = @target.response.content_length @tempfile = copy_to_tempfile(@target) @content_type = ContentTypeDetector.new(@tempfile.path).detect + @size = File.size(@tempfile) end def copy_to_tempfile(source) diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 72bacb5eb..a89af6778 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -333,8 +333,12 @@ namespace :mastodon do prompt.say 'This configuration will be written to .env.production' if prompt.yes?('Save configuration?') + incompatible_syntax = false + env_contents = env.each_pair.map do |key, value| if value.is_a?(String) && value =~ /[\s\#\\"]/ + incompatible_syntax = true + if value =~ /[']/ value = value.to_s.gsub(/[\\"\$]/) { |x| "\\#{x}" } "#{key}=\"#{value}\"" @@ -346,12 +350,19 @@ namespace :mastodon do end end.join("\n") - File.write(Rails.root.join('.env.production'), "# Generated with mastodon:setup on #{Time.now.utc}\n\n" + env_contents + "\n") + generated_header = "# Generated with mastodon:setup on #{Time.now.utc}\n\n".dup + + if incompatible_syntax + generated_header << "# Some variables in this file will be interpreted differently whether you are\n" + generated_header << "# using docker-compose or not.\n\n" + end + + File.write(Rails.root.join('.env.production'), "#{generated_header}#{env_contents}\n") if using_docker prompt.ok 'Below is your configuration, save it to an .env.production file outside Docker:' prompt.say "\n" - prompt.say File.read(Rails.root.join('.env.production')) + prompt.say "#{generated_header}#{env.each_pair.map { |key, value| "#{key}=#{value}" }.join("\n")}" prompt.say "\n" prompt.ok 'It is also saved within this container so you can proceed with this wizard.' end @@ -430,7 +441,7 @@ namespace :mastodon do namespace :webpush do desc 'Generate VAPID key' - task generate_vapid_key: :environment do + task :generate_vapid_key do vapid_key = Webpush.generate_key puts "VAPID_PRIVATE_KEY=#{vapid_key.private_key}" puts "VAPID_PUBLIC_KEY=#{vapid_key.public_key}" diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake index 86c358a94..d004c5751 100644 --- a/lib/tasks/repo.rake +++ b/lib/tasks/repo.rake @@ -1,6 +1,6 @@ # frozen_string_literal: true -REPOSITORY_NAME = 'tootsuite/mastodon' +REPOSITORY_NAME = 'mastodon/mastodon' namespace :repo do desc 'Generate the AUTHORS.md file' @@ -34,7 +34,7 @@ namespace :repo do file << <<~FOOTER - This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. + This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/mastodon/mastodon/graphs/contributors) instead. FOOTER end diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake new file mode 100644 index 000000000..0f38b50e3 --- /dev/null +++ b/lib/tasks/tests.rake @@ -0,0 +1,181 @@ +# frozen_string_literal: true + +namespace :tests do + namespace :migrations do + desc 'Populate the database with test data for 2.0.0' + task populate_v2: :environment do + admin_key = OpenSSL::PKey::RSA.new(2048) + user_key = OpenSSL::PKey::RSA.new(2048) + remote_key = OpenSSL::PKey::RSA.new(2048) + remote_key2 = OpenSSL::PKey::RSA.new(2048) + remote_key3 = OpenSSL::PKey::RSA.new(2048) + admin_private_key = ActiveRecord::Base.connection.quote(admin_key.to_pem) + admin_public_key = ActiveRecord::Base.connection.quote(admin_key.public_key.to_pem) + user_private_key = ActiveRecord::Base.connection.quote(user_key.to_pem) + user_public_key = ActiveRecord::Base.connection.quote(user_key.public_key.to_pem) + remote_public_key = ActiveRecord::Base.connection.quote(remote_key.public_key.to_pem) + remote_public_key2 = ActiveRecord::Base.connection.quote(remote_key2.public_key.to_pem) + remote_public_key_ap = ActiveRecord::Base.connection.quote(remote_key3.public_key.to_pem) + local_domain = ActiveRecord::Base.connection.quote(Rails.configuration.x.local_domain) + + ActiveRecord::Base.connection.execute(<<~SQL) + -- accounts + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at) + VALUES + (1, 'admin', NULL, #{admin_private_key}, #{admin_public_key}, now(), now()), + (2, 'user', NULL, #{user_private_key}, #{user_public_key}, now(), now()); + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at, remote_url, salmon_url) + VALUES + (3, 'remote', 'remote.com', NULL, #{remote_public_key}, now(), now(), + 'https://remote.com/@remote', 'https://remote.com/salmon/1'), + (4, 'Remote', 'remote.com', NULL, #{remote_public_key}, now(), now(), + 'https://remote.com/@Remote', 'https://remote.com/salmon/1'), + (5, 'REMOTE', 'Remote.com', NULL, #{remote_public_key2}, now(), now(), + 'https://remote.com/stale/@REMOTE', 'https://remote.com/stale/salmon/1'); + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at, protocol, inbox_url, outbox_url, followers_url) + VALUES + (6, 'bob', 'activitypub.com', NULL, #{remote_public_key_ap}, now(), now(), + 1, 'https://activitypub.com/users/bob/inbox', 'https://activitypub.com/users/bob/outbox', 'https://activitypub.com/users/bob/followers'); + + INSERT INTO "accounts" + (id, username, domain, private_key, public_key, created_at, updated_at) + VALUES + (7, 'user', #{local_domain}, #{user_private_key}, #{user_public_key}, now(), now()), + (8, 'pt_user', NULL, #{user_private_key}, #{user_public_key}, now(), now()); + + -- users + + INSERT INTO "users" + (id, account_id, email, created_at, updated_at, admin) + VALUES + (1, 1, 'admin@localhost', now(), now(), true), + (2, 2, 'user@localhost', now(), now(), false); + + INSERT INTO "users" + (id, account_id, email, created_at, updated_at, admin, locale) + VALUES + (3, 7, 'ptuser@localhost', now(), now(), false, 'pt'); + + -- statuses + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at) + VALUES + (1, 1, 'test', now(), now()), + (2, 1, '@remote@remote.com hello', now(), now()), + (3, 1, '@Remote@remote.com hello', now(), now()), + (4, 1, '@REMOTE@remote.com hello', now(), now()); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at, uri, local) + VALUES + (5, 1, 'activitypub status', now(), now(), 'https://localhost/users/admin/statuses/4', true); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at) + VALUES + (6, 3, 'test', now(), now()); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at, in_reply_to_id, in_reply_to_account_id) + VALUES + (7, 4, '@admin hello', now(), now(), 3, 1); + + INSERT INTO "statuses" + (id, account_id, text, created_at, updated_at) + VALUES + (8, 5, 'test', now(), now()); + + INSERT INTO "statuses" + (id, account_id, reblog_of_id, created_at, updated_at) + VALUES + (9, 1, 2, now(), now()); + + -- mentions (from previous statuses) + + INSERT INTO "mentions" + (status_id, account_id, created_at, updated_at) + VALUES + (2, 3, now(), now()), + (3, 4, now(), now()), + (4, 5, now(), now()); + + -- stream entries + + INSERT INTO "stream_entries" + (activity_id, account_id, activity_type, created_at, updated_at) + VALUES + (1, 1, 'status', now(), now()), + (2, 1, 'status', now(), now()), + (3, 1, 'status', now(), now()), + (4, 1, 'status', now(), now()), + (5, 1, 'status', now(), now()), + (6, 3, 'status', now(), now()), + (7, 4, 'status', now(), now()), + (8, 5, 'status', now(), now()), + (9, 1, 'status', now(), now()); + + + -- custom emoji + + INSERT INTO "custom_emojis" + (shortcode, created_at, updated_at) + VALUES + ('test', now(), now()), + ('Test', now(), now()), + ('blobcat', now(), now()); + + INSERT INTO "custom_emojis" + (shortcode, domain, uri, created_at, updated_at) + VALUES + ('blobcat', 'remote.org', 'https://remote.org/emoji/blobcat', now(), now()), + ('blobcat', 'Remote.org', 'https://remote.org/emoji/blobcat', now(), now()), + ('Blobcat', 'remote.org', 'https://remote.org/emoji/Blobcat', now(), now()); + + -- favourites + + INSERT INTO "favourites" + (account_id, status_id, created_at, updated_at) + VALUES + (1, 1, now(), now()), + (1, 7, now(), now()), + (4, 1, now(), now()), + (3, 1, now(), now()), + (5, 1, now(), now()); + + -- pinned statuses + + INSERT INTO "status_pins" + (account_id, status_id, created_at, updated_at) + VALUES + (1, 1, now(), now()), + (3, 6, now(), now()), + (4, 7, now(), now()); + + -- follows + + INSERT INTO "follows" + (account_id, target_account_id, created_at, updated_at) + VALUES + (1, 5, now(), now()), + (6, 2, now(), now()), + (5, 2, now(), now()), + (6, 1, now(), now()); + + -- follow requests + + INSERT INTO "follow_requests" + (account_id, target_account_id, created_at, updated_at) + VALUES + (2, 5, now(), now()), + (5, 1, now(), now()); + SQL + end + end +end diff --git a/package.json b/package.json index 5bc1f6bf3..bedbf24aa 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@tootsuite/mastodon", + "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", "engines": { "node": ">=12" @@ -18,7 +18,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/tootsuite/mastodon.git" + "url": "https://github.com/mastodon/mastodon.git" }, "browserslist": [ "last 2 versions", @@ -59,11 +59,11 @@ }, "private": true, "dependencies": { - "@babel/core": "^7.14.0", - "@babel/plugin-proposal-decorators": "^7.13.15", + "@babel/core": "^7.14.3", + "@babel/plugin-proposal-decorators": "^7.14.2", "@babel/plugin-transform-react-inline-elements": "^7.12.13", - "@babel/plugin-transform-runtime": "^7.13.15", - "@babel/preset-env": "^7.14.1", + "@babel/plugin-transform-runtime": "^7.14.3", + "@babel/preset-env": "^7.14.4", "@babel/preset-react": "^7.13.13", "@babel/runtime": "^7.14.0", "@gamestdio/websocket": "^0.3.2", @@ -84,11 +84,11 @@ "color-blend": "^3.0.1", "compression-webpack-plugin": "^6.1.1", "cross-env": "^7.0.3", - "css-loader": "^5.2.4", + "css-loader": "^5.2.6", "cssnano": "^4.1.11", "detect-passive-events": "^2.0.3", - "dotenv": "^9.0.1", - "emoji-mart": "Gargron/emoji-mart#build", + "dotenv": "^9.0.2", + "emoji-mart": "^3.0.1", "es6-symbol": "^3.1.3", "escape-html": "^1.0.3", "exif-js": "^2.3.0", @@ -137,9 +137,9 @@ "react-redux-loading-bar": "^4.0.8", "react-router-dom": "^4.1.1", "react-router-scroll-4": "^1.0.0-beta.1", - "react-select": "^4.3.0", + "react-select": "^4.3.1", "react-sparklines": "^1.7.0", - "react-swipeable-views": "^0.13.9", + "react-swipeable-views": "^0.14.0", "react-textarea-autosize": "^8.3.2", "react-toggle": "^4.1.2", "redis": "^3.1.2", @@ -151,8 +151,8 @@ "requestidlecallback": "^0.3.0", "reselect": "^4.0.0", "rimraf": "^3.0.2", - "sass": "^1.32.12", - "sass-loader": "^10.1.1", + "sass": "^1.34.0", + "sass-loader": "^10.2.0", "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", "substring-trie": "^1.0.2", @@ -164,22 +164,22 @@ "uuid": "^8.3.1", "webpack": "^4.46.0", "webpack-assets-manifest": "^4.0.6", - "webpack-bundle-analyzer": "^4.4.1", + "webpack-bundle-analyzer": "^4.4.2", "webpack-cli": "^3.3.12", "webpack-merge": "^5.7.3", "wicg-inert": "^3.1.1", - "ws": "^7.4.5" + "ws": "^7.4.6" }, "devDependencies": { "@testing-library/jest-dom": "^5.12.0", - "@testing-library/react": "^11.2.6", + "@testing-library/react": "^11.2.7", "babel-eslint": "^10.1.0", - "babel-jest": "^26.6.3", - "eslint": "^7.26.0", - "eslint-plugin-import": "~2.22.1", + "babel-jest": "^27.0.2", + "eslint": "^7.27.0", + "eslint-plugin-import": "~2.23.4", "eslint-plugin-jsx-a11y": "~6.4.1", "eslint-plugin-promise": "~5.1.0", - "eslint-plugin-react": "~7.23.2", + "eslint-plugin-react": "~7.24.0", "jest": "^26.6.3", "raf": "^3.4.1", "react-intl-translations-manager": "^5.0.3", diff --git a/public/emoji/1f1f5-1f1f9.svg b/public/emoji/1f1f5-1f1f9.svg index 78b29a89f..c1d4a84ff 100644 --- a/public/emoji/1f1f5-1f1f9.svg +++ b/public/emoji/1f1f5-1f1f9.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f1f9-1f1ed.svg b/public/emoji/1f1f9-1f1ed.svg index ff2a66f93..0bd4165c0 100644 --- a/public/emoji/1f1f9-1f1ed.svg +++ b/public/emoji/1f1f9-1f1ed.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f36a.svg b/public/emoji/1f36a.svg index d1b604bcd..4f5368a41 100644 --- a/public/emoji/1f36a.svg +++ b/public/emoji/1f36a.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f3a2.svg b/public/emoji/1f3a2.svg index b1e64ec0e..256d8afb7 100644 --- a/public/emoji/1f3a2.svg +++ b/public/emoji/1f3a2.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f3af.svg b/public/emoji/1f3af.svg index 9562c6c39..073817f2f 100644 --- a/public/emoji/1f3af.svg +++ b/public/emoji/1f3af.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg b/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg index f9fc064c0..a789852e9 100644 --- a/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg +++ b/public/emoji/1f3f3-fe0f-200d-26a7-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f408-200d-2b1b.svg b/public/emoji/1f408-200d-2b1b.svg new file mode 100644 index 000000000..cf7b1d902 --- /dev/null +++ b/public/emoji/1f408-200d-2b1b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f429.svg b/public/emoji/1f429.svg index 4852dda3d..0ffd08288 100644 --- a/public/emoji/1f429.svg +++ b/public/emoji/1f429.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f43b-200d-2744-fe0f.svg b/public/emoji/1f43b-200d-2744-fe0f.svg new file mode 100644 index 000000000..dc70f185a --- /dev/null +++ b/public/emoji/1f43b-200d-2744-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f441.svg b/public/emoji/1f441.svg index 75e9c48a4..bd1a45e4e 100644 --- a/public/emoji/1f441.svg +++ b/public/emoji/1f441.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-1f37c.svg b/public/emoji/1f468-1f3fb-200d-1f37c.svg new file mode 100644 index 000000000..19c8fff2e --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-1f384.svg b/public/emoji/1f468-1f3fb-200d-1f384.svg new file mode 100644 index 000000000..ef5c61531 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..d5fafaa3b --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..ba0096370 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..9a9e5aa1b --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..84271cae4 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..2c1977955 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..0a1584651 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..3c29712ca --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..6aca82f50 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..c8d0b8bd8 --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..73928de4a --- /dev/null +++ b/public/emoji/1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-1f37c.svg b/public/emoji/1f468-1f3fc-200d-1f37c.svg new file mode 100644 index 000000000..5d702994d --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-1f384.svg b/public/emoji/1f468-1f3fc-200d-1f384.svg new file mode 100644 index 000000000..5adcdf4eb --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..078e78a91 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..aa7784294 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..15e6ad3ac --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..e0cceb672 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..882bfbffb --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..1042a95e8 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..84edcd44b --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..dd31c8a5f --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..56780ef10 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..660d27bf2 --- /dev/null +++ b/public/emoji/1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-1f37c.svg b/public/emoji/1f468-1f3fd-200d-1f37c.svg new file mode 100644 index 000000000..46f2ea1a0 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-1f384.svg b/public/emoji/1f468-1f3fd-200d-1f384.svg new file mode 100644 index 000000000..0a56a8b1c --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..6350ae774 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..7ca4a90ef --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..4b4e1c938 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..f48b7bad1 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..c11dec5fd --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..7e9c5db08 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..4c8801583 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..dd9aa5c10 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..f597a9d34 --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..6c9eab66f --- /dev/null +++ b/public/emoji/1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-1f37c.svg b/public/emoji/1f468-1f3fe-200d-1f37c.svg new file mode 100644 index 000000000..ea5681fe9 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-1f384.svg b/public/emoji/1f468-1f3fe-200d-1f384.svg new file mode 100644 index 000000000..16b3b33ec --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..c5731cc6c --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..491f78791 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..c05f4abf2 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..b770611d9 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..b6985d6d7 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..996f8590c --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..36577f2f8 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..4dd4d4fc0 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..2341ee2fd --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..8285d8e98 --- /dev/null +++ b/public/emoji/1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-1f37c.svg b/public/emoji/1f468-1f3ff-200d-1f37c.svg new file mode 100644 index 000000000..330c92ef7 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-1f384.svg b/public/emoji/1f468-1f3ff-200d-1f384.svg new file mode 100644 index 000000000..4923cbf40 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..a535d6a31 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..3f9d8cfde --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..888ae0c70 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..d1f3b8c20 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..b027d467d --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..c1901ecd1 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..0fb35cc35 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..ecad79993 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..a94946a94 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..fda248288 --- /dev/null +++ b/public/emoji/1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-200d-1f37c.svg b/public/emoji/1f468-200d-1f37c.svg new file mode 100644 index 000000000..971908e44 --- /dev/null +++ b/public/emoji/1f468-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-200d-1f384.svg b/public/emoji/1f468-200d-1f384.svg new file mode 100644 index 000000000..9c61da6c0 --- /dev/null +++ b/public/emoji/1f468-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg b/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg index cace24fc3..27d1b6fc7 100644 --- a/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg +++ b/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg b/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg index 41dbd9681..831f2fb2e 100644 --- a/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg +++ b/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-1f37c.svg b/public/emoji/1f469-1f3fb-200d-1f37c.svg new file mode 100644 index 000000000..311bda9fa --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-1f384.svg b/public/emoji/1f469-1f3fb-200d-1f384.svg new file mode 100644 index 000000000..0227456d0 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..15a822ace --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..7162de94b --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..4bd37fce1 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..3db3581d0 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..994658d22 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..73314e4ab --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..9c6f709ad --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..9bd747f46 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..2aa5a27af --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..e9f571ef4 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..d0b112fe3 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..5d6019e80 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..3580f3a3d --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..e19d11045 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..4bfa08b5d --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..821a996ae --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..e26fe32b9 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..abb321d9b --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..bab53ae51 --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..0659c9b7f --- /dev/null +++ b/public/emoji/1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-1f37c.svg b/public/emoji/1f469-1f3fc-200d-1f37c.svg new file mode 100644 index 000000000..cfae280ec --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-1f384.svg b/public/emoji/1f469-1f3fc-200d-1f384.svg new file mode 100644 index 000000000..5887d75e0 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..5ffb98f01 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..079a8e4c8 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..460e58ae5 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..42a17a816 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..6fa892b19 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..fb36178d2 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..922e2a933 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..4dac2cb8d --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..cc441541b --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..f40bebabe --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..096f2e583 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..ec70a000a --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..f8b70f527 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..7724820b0 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..2464e01e4 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..2ee4ff885 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..286e47cdb --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..364288780 --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..64c21a1de --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..02d27ddfd --- /dev/null +++ b/public/emoji/1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-1f37c.svg b/public/emoji/1f469-1f3fd-200d-1f37c.svg new file mode 100644 index 000000000..8e1e408c5 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-1f384.svg b/public/emoji/1f469-1f3fd-200d-1f384.svg new file mode 100644 index 000000000..3e1853d2b --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..695e539bb --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..65a77e2bd --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..d1d91a30c --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..50d60b779 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..5fd131c45 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..1356db026 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..7438c5b0b --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..38e0b432f --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..b48f1d46f --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..321d1f64a --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..cb04f1019 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..4325ef397 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..6f77cbd32 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..524d10235 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..3cb1b4974 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..04715e3df --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..d0d6dab84 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..2894b6114 --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..4faa37f2d --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..1813ca49b --- /dev/null +++ b/public/emoji/1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-1f37c.svg b/public/emoji/1f469-1f3fe-200d-1f37c.svg new file mode 100644 index 000000000..b910a8776 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-1f384.svg b/public/emoji/1f469-1f3fe-200d-1f384.svg new file mode 100644 index 000000000..6d94d270d --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..a600e7b2f --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..eb47006f6 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..a34e5cefc --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..824bbc488 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..91f217cc7 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..c12c9583c --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..1a55bb200 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..441d235b9 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..17525760e --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..53aefb1d9 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..d65532a72 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..59e515fe7 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..0db014b26 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..cb9ec9c43 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..29b48c05b --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..fa0aed880 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..e12111f65 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..4e264e194 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..d40884564 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..16d2f9292 --- /dev/null +++ b/public/emoji/1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-1f37c.svg b/public/emoji/1f469-1f3ff-200d-1f37c.svg new file mode 100644 index 000000000..698556668 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-1f384.svg b/public/emoji/1f469-1f3ff-200d-1f384.svg new file mode 100644 index 000000000..2178a33ca --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..63a94f31b --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..86a47dc08 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..8bc287f05 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..f456c7cf4 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..4ab740428 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..ab8a2c16c --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..0d784f5e1 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..226ba13dc --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..bd5f6c1d1 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..534795834 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg new file mode 100644 index 000000000..74c86e378 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg new file mode 100644 index 000000000..16731da4b --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg new file mode 100644 index 000000000..b18477a0e --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg new file mode 100644 index 000000000..1e8fee5fe --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg new file mode 100644 index 000000000..42aa5cad5 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg new file mode 100644 index 000000000..63c098a5e --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg new file mode 100644 index 000000000..295504b57 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg new file mode 100644 index 000000000..9150da85b --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg new file mode 100644 index 000000000..f5d3fe5b2 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg new file mode 100644 index 000000000..77da15016 --- /dev/null +++ b/public/emoji/1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-200d-1f37c.svg b/public/emoji/1f469-200d-1f37c.svg new file mode 100644 index 000000000..c13cc5371 --- /dev/null +++ b/public/emoji/1f469-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-200d-1f384.svg b/public/emoji/1f469-200d-1f384.svg new file mode 100644 index 000000000..6cabe5829 --- /dev/null +++ b/public/emoji/1f469-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg index 8248ed607..210f97c99 100644 --- a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg +++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg index e46dfcaeb..e8eee47b9 100644 --- a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg +++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fb-200d-2640-fe0f.svg new file mode 100644 index 000000000..6e0b0fe34 --- /dev/null +++ b/public/emoji/1f470-1f3fb-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fb-200d-2642-fe0f.svg new file mode 100644 index 000000000..84c773ab0 --- /dev/null +++ b/public/emoji/1f470-1f3fb-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fb.svg b/public/emoji/1f470-1f3fb.svg index 7691a70a3..e8c6cd06b 100644 --- a/public/emoji/1f470-1f3fb.svg +++ b/public/emoji/1f470-1f3fb.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fc-200d-2640-fe0f.svg new file mode 100644 index 000000000..ee4102b65 --- /dev/null +++ b/public/emoji/1f470-1f3fc-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fc-200d-2642-fe0f.svg new file mode 100644 index 000000000..f894e261c --- /dev/null +++ b/public/emoji/1f470-1f3fc-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fc.svg b/public/emoji/1f470-1f3fc.svg index 2ce98ebb1..511c7aa82 100644 --- a/public/emoji/1f470-1f3fc.svg +++ b/public/emoji/1f470-1f3fc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fd-200d-2640-fe0f.svg new file mode 100644 index 000000000..3d7605dc3 --- /dev/null +++ b/public/emoji/1f470-1f3fd-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fd-200d-2642-fe0f.svg new file mode 100644 index 000000000..f1b941d1c --- /dev/null +++ b/public/emoji/1f470-1f3fd-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fd.svg b/public/emoji/1f470-1f3fd.svg index 3d4070c42..4fc12eb55 100644 --- a/public/emoji/1f470-1f3fd.svg +++ b/public/emoji/1f470-1f3fd.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f470-1f3fe-200d-2640-fe0f.svg new file mode 100644 index 000000000..1e33374c3 --- /dev/null +++ b/public/emoji/1f470-1f3fe-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f470-1f3fe-200d-2642-fe0f.svg new file mode 100644 index 000000000..1c8135c96 --- /dev/null +++ b/public/emoji/1f470-1f3fe-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3fe.svg b/public/emoji/1f470-1f3fe.svg index ac399c7fe..c30f3c093 100644 --- a/public/emoji/1f470-1f3fe.svg +++ b/public/emoji/1f470-1f3fe.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f470-1f3ff-200d-2640-fe0f.svg new file mode 100644 index 000000000..656a9b71c --- /dev/null +++ b/public/emoji/1f470-1f3ff-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f470-1f3ff-200d-2642-fe0f.svg new file mode 100644 index 000000000..2c090f1a0 --- /dev/null +++ b/public/emoji/1f470-1f3ff-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-1f3ff.svg b/public/emoji/1f470-1f3ff.svg index dc1166ecb..9e0f2a25b 100644 --- a/public/emoji/1f470-1f3ff.svg +++ b/public/emoji/1f470-1f3ff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f470-200d-2640-fe0f.svg b/public/emoji/1f470-200d-2640-fe0f.svg new file mode 100644 index 000000000..2fd75bfe8 --- /dev/null +++ b/public/emoji/1f470-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470-200d-2642-fe0f.svg b/public/emoji/1f470-200d-2642-fe0f.svg new file mode 100644 index 000000000..d12c670e5 --- /dev/null +++ b/public/emoji/1f470-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f470.svg b/public/emoji/1f470.svg index e68b5345b..a41b9b997 100644 --- a/public/emoji/1f470.svg +++ b/public/emoji/1f470.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f489.svg b/public/emoji/1f489.svg index ef9c72c74..6fb5e9e9d 100644 --- a/public/emoji/1f489.svg +++ b/public/emoji/1f489.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fb.svg b/public/emoji/1f48f-1f3fb.svg new file mode 100644 index 000000000..787f82768 --- /dev/null +++ b/public/emoji/1f48f-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fc.svg b/public/emoji/1f48f-1f3fc.svg new file mode 100644 index 000000000..dbfac3f01 --- /dev/null +++ b/public/emoji/1f48f-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fd.svg b/public/emoji/1f48f-1f3fd.svg new file mode 100644 index 000000000..1fe89be5e --- /dev/null +++ b/public/emoji/1f48f-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3fe.svg b/public/emoji/1f48f-1f3fe.svg new file mode 100644 index 000000000..394eafe0a --- /dev/null +++ b/public/emoji/1f48f-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f-1f3ff.svg b/public/emoji/1f48f-1f3ff.svg new file mode 100644 index 000000000..7087f915f --- /dev/null +++ b/public/emoji/1f48f-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f48f.svg b/public/emoji/1f48f.svg index 69cec3c60..ea67314f2 100644 --- a/public/emoji/1f48f.svg +++ b/public/emoji/1f48f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fb.svg b/public/emoji/1f491-1f3fb.svg new file mode 100644 index 000000000..b4795dd07 --- /dev/null +++ b/public/emoji/1f491-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fc.svg b/public/emoji/1f491-1f3fc.svg new file mode 100644 index 000000000..971e87460 --- /dev/null +++ b/public/emoji/1f491-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fd.svg b/public/emoji/1f491-1f3fd.svg new file mode 100644 index 000000000..3f042ca6a --- /dev/null +++ b/public/emoji/1f491-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3fe.svg b/public/emoji/1f491-1f3fe.svg new file mode 100644 index 000000000..8e98402f2 --- /dev/null +++ b/public/emoji/1f491-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491-1f3ff.svg b/public/emoji/1f491-1f3ff.svg new file mode 100644 index 000000000..9257f7c0d --- /dev/null +++ b/public/emoji/1f491-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f491.svg b/public/emoji/1f491.svg index ece280dc0..73a30e93e 100644 --- a/public/emoji/1f491.svg +++ b/public/emoji/1f491.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fb.svg b/public/emoji/1f4aa-1f3fb.svg index 63f868316..2627eea6f 100644 --- a/public/emoji/1f4aa-1f3fb.svg +++ b/public/emoji/1f4aa-1f3fb.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fc.svg b/public/emoji/1f4aa-1f3fc.svg index d9e082108..2cac971ba 100644 --- a/public/emoji/1f4aa-1f3fc.svg +++ b/public/emoji/1f4aa-1f3fc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fd.svg b/public/emoji/1f4aa-1f3fd.svg index 39820dbc7..68f6b7503 100644 --- a/public/emoji/1f4aa-1f3fd.svg +++ b/public/emoji/1f4aa-1f3fd.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3fe.svg b/public/emoji/1f4aa-1f3fe.svg index d93cc7b9f..c773c6728 100644 --- a/public/emoji/1f4aa-1f3fe.svg +++ b/public/emoji/1f4aa-1f3fe.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa-1f3ff.svg b/public/emoji/1f4aa-1f3ff.svg index d9b4481ed..16efbe0f4 100644 --- a/public/emoji/1f4aa-1f3ff.svg +++ b/public/emoji/1f4aa-1f3ff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4aa.svg b/public/emoji/1f4aa.svg index 38a7bb525..7b4c1206c 100644 --- a/public/emoji/1f4aa.svg +++ b/public/emoji/1f4aa.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b4.svg b/public/emoji/1f4b4.svg index 5db237d4e..747870e0e 100644 --- a/public/emoji/1f4b4.svg +++ b/public/emoji/1f4b4.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b5.svg b/public/emoji/1f4b5.svg index 113c6d0bb..1c68944af 100644 --- a/public/emoji/1f4b5.svg +++ b/public/emoji/1f4b5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b6.svg b/public/emoji/1f4b6.svg index 1869987fe..afd8b7154 100644 --- a/public/emoji/1f4b6.svg +++ b/public/emoji/1f4b6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b7.svg b/public/emoji/1f4b7.svg index 93a16ff62..ff5c5a44b 100644 --- a/public/emoji/1f4b7.svg +++ b/public/emoji/1f4b7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4b8.svg b/public/emoji/1f4b8.svg index d2d63ceb9..8b6fa1097 100644 --- a/public/emoji/1f4b8.svg +++ b/public/emoji/1f4b8.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4ba.svg b/public/emoji/1f4ba.svg index bf27bb184..ab311bc7b 100644 --- a/public/emoji/1f4ba.svg +++ b/public/emoji/1f4ba.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4c5.svg b/public/emoji/1f4c5.svg index ca68a82a6..476a9506c 100644 --- a/public/emoji/1f4c5.svg +++ b/public/emoji/1f4c5.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f4c6.svg b/public/emoji/1f4c6.svg index ff073d742..b2de8c5c2 100644 --- a/public/emoji/1f4c6.svg +++ b/public/emoji/1f4c6.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f536.svg b/public/emoji/1f536.svg index 116e72265..9695be3ee 100644 --- a/public/emoji/1f536.svg +++ b/public/emoji/1f536.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f538.svg b/public/emoji/1f538.svg index 435ad6a5d..842ffcc58 100644 --- a/public/emoji/1f538.svg +++ b/public/emoji/1f538.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f5e1.svg b/public/emoji/1f5e1.svg index 2741fb89d..d1d7712c0 100644 --- a/public/emoji/1f5e1.svg +++ b/public/emoji/1f5e1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f606.svg b/public/emoji/1f606.svg index e82c405ae..fed5ff58a 100644 --- a/public/emoji/1f606.svg +++ b/public/emoji/1f606.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f60b.svg b/public/emoji/1f60b.svg index 2c962bb64..27e0d3a4c 100644 --- a/public/emoji/1f60b.svg +++ b/public/emoji/1f60b.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f616.svg b/public/emoji/1f616.svg index 2b8871cee..fb915d6d4 100644 --- a/public/emoji/1f616.svg +++ b/public/emoji/1f616.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f61b.svg b/public/emoji/1f61b.svg index 903422aef..e249672d2 100644 --- a/public/emoji/1f61b.svg +++ b/public/emoji/1f61b.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f61c.svg b/public/emoji/1f61c.svg index 6f7873904..76b205dc7 100644 --- a/public/emoji/1f61c.svg +++ b/public/emoji/1f61c.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f61d.svg b/public/emoji/1f61d.svg index 09dead62a..c49803816 100644 --- a/public/emoji/1f61d.svg +++ b/public/emoji/1f61d.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f62e-200d-1f4a8.svg b/public/emoji/1f62e-200d-1f4a8.svg new file mode 100644 index 000000000..d8a4b6e0c --- /dev/null +++ b/public/emoji/1f62e-200d-1f4a8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f633.svg b/public/emoji/1f633.svg index 2663c8cee..80ee1fefe 100644 --- a/public/emoji/1f633.svg +++ b/public/emoji/1f633.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f635-200d-1f4ab.svg b/public/emoji/1f635-200d-1f4ab.svg new file mode 100644 index 000000000..3238e0b0e --- /dev/null +++ b/public/emoji/1f635-200d-1f4ab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f636-200d-1f32b-fe0f.svg b/public/emoji/1f636-200d-1f32b-fe0f.svg new file mode 100644 index 000000000..dc0a4745f --- /dev/null +++ b/public/emoji/1f636-200d-1f32b-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6d6.svg b/public/emoji/1f6d6.svg new file mode 100644 index 000000000..b2866e07d --- /dev/null +++ b/public/emoji/1f6d6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6d7.svg b/public/emoji/1f6d7.svg new file mode 100644 index 000000000..5369e5793 --- /dev/null +++ b/public/emoji/1f6d7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6fb.svg b/public/emoji/1f6fb.svg new file mode 100644 index 000000000..87643ae93 --- /dev/null +++ b/public/emoji/1f6fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f6fc.svg b/public/emoji/1f6fc.svg new file mode 100644 index 000000000..091d51ef6 --- /dev/null +++ b/public/emoji/1f6fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f7e0.svg b/public/emoji/1f7e0.svg index 2db43d5b2..f5e120075 100644 --- a/public/emoji/1f7e0.svg +++ b/public/emoji/1f7e0.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f7e7.svg b/public/emoji/1f7e7.svg index 3cbdde4d9..1377a4eb9 100644 --- a/public/emoji/1f7e7.svg +++ b/public/emoji/1f7e7.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fb.svg b/public/emoji/1f90c-1f3fb.svg new file mode 100644 index 000000000..8af452131 --- /dev/null +++ b/public/emoji/1f90c-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fc.svg b/public/emoji/1f90c-1f3fc.svg new file mode 100644 index 000000000..7cee5bd5d --- /dev/null +++ b/public/emoji/1f90c-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fd.svg b/public/emoji/1f90c-1f3fd.svg new file mode 100644 index 000000000..2898fe391 --- /dev/null +++ b/public/emoji/1f90c-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3fe.svg b/public/emoji/1f90c-1f3fe.svg new file mode 100644 index 000000000..2e706ba42 --- /dev/null +++ b/public/emoji/1f90c-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c-1f3ff.svg b/public/emoji/1f90c-1f3ff.svg new file mode 100644 index 000000000..e17d4b094 --- /dev/null +++ b/public/emoji/1f90c-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f90c.svg b/public/emoji/1f90c.svg new file mode 100644 index 000000000..56b40f34c --- /dev/null +++ b/public/emoji/1f90c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f923.svg b/public/emoji/1f923.svg index 7ddfcae30..d0e3c759a 100644 --- a/public/emoji/1f923.svg +++ b/public/emoji/1f923.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f927.svg b/public/emoji/1f927.svg index dc86ab356..06fee3f77 100644 --- a/public/emoji/1f927.svg +++ b/public/emoji/1f927.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f92e.svg b/public/emoji/1f92e.svg index d792679fd..42df3bd98 100644 --- a/public/emoji/1f92e.svg +++ b/public/emoji/1f92e.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f92f.svg b/public/emoji/1f92f.svg index 664d96059..3ac19ed41 100644 --- a/public/emoji/1f92f.svg +++ b/public/emoji/1f92f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f933.svg b/public/emoji/1f933.svg index 47fa031f6..88382e13b 100644 --- a/public/emoji/1f933.svg +++ b/public/emoji/1f933.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f94d.svg b/public/emoji/1f94d.svg index 2a4eb10c9..8c6bcb989 100644 --- a/public/emoji/1f94d.svg +++ b/public/emoji/1f94d.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f972.svg b/public/emoji/1f972.svg new file mode 100644 index 000000000..f309c2236 --- /dev/null +++ b/public/emoji/1f972.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fb.svg b/public/emoji/1f977-1f3fb.svg new file mode 100644 index 000000000..5c981c21f --- /dev/null +++ b/public/emoji/1f977-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fc.svg b/public/emoji/1f977-1f3fc.svg new file mode 100644 index 000000000..6c3545e54 --- /dev/null +++ b/public/emoji/1f977-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fd.svg b/public/emoji/1f977-1f3fd.svg new file mode 100644 index 000000000..557267b77 --- /dev/null +++ b/public/emoji/1f977-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3fe.svg b/public/emoji/1f977-1f3fe.svg new file mode 100644 index 000000000..8b65491bf --- /dev/null +++ b/public/emoji/1f977-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977-1f3ff.svg b/public/emoji/1f977-1f3ff.svg new file mode 100644 index 000000000..7d3287279 --- /dev/null +++ b/public/emoji/1f977-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f977.svg b/public/emoji/1f977.svg new file mode 100644 index 000000000..84be7d7af --- /dev/null +++ b/public/emoji/1f977.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f978.svg b/public/emoji/1f978.svg new file mode 100644 index 000000000..6d1e4e113 --- /dev/null +++ b/public/emoji/1f978.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f98a.svg b/public/emoji/1f98a.svg index 13704a415..2cb2f986d 100644 --- a/public/emoji/1f98a.svg +++ b/public/emoji/1f98a.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f996.svg b/public/emoji/1f996.svg index 64b68d75a..73b0291cc 100644 --- a/public/emoji/1f996.svg +++ b/public/emoji/1f996.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f997.svg b/public/emoji/1f997.svg index f26413fdd..6f0476dcc 100644 --- a/public/emoji/1f997.svg +++ b/public/emoji/1f997.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9a3.svg b/public/emoji/1f9a3.svg new file mode 100644 index 000000000..1aa87190b --- /dev/null +++ b/public/emoji/1f9a3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9a4.svg b/public/emoji/1f9a4.svg new file mode 100644 index 000000000..1dbac1e31 --- /dev/null +++ b/public/emoji/1f9a4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ab.svg b/public/emoji/1f9ab.svg new file mode 100644 index 000000000..7967d6780 --- /dev/null +++ b/public/emoji/1f9ab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ac.svg b/public/emoji/1f9ac.svg new file mode 100644 index 000000000..c8156813b --- /dev/null +++ b/public/emoji/1f9ac.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ad.svg b/public/emoji/1f9ad.svg new file mode 100644 index 000000000..6904e81a5 --- /dev/null +++ b/public/emoji/1f9ad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg index 361bab6ac..e52e0d8d5 100644 --- a/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fb-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg index 0b8da862a..ced012a41 100644 --- a/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fb-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg index f035f13c1..61c9be883 100644 --- a/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fc-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg index e9ca2e0fc..67a93de7e 100644 --- a/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fc-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg index 58999ae9a..eeb4f0742 100644 --- a/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fd-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg index e873933f2..091e36b26 100644 --- a/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fd-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg index 04120e37a..463ee894d 100644 --- a/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3fe-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg index f7e3d5611..008a07f12 100644 --- a/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3fe-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg index 5dadcd8b6..a110d6d47 100644 --- a/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-1f3ff-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg index e5d56cb36..ec17e3b57 100644 --- a/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-1f3ff-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-200d-2640-fe0f.svg b/public/emoji/1f9b9-200d-2640-fe0f.svg index 7d6953ea2..97ee77199 100644 --- a/public/emoji/1f9b9-200d-2640-fe0f.svg +++ b/public/emoji/1f9b9-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9b9-200d-2642-fe0f.svg b/public/emoji/1f9b9-200d-2642-fe0f.svg index ed0e66c34..6c2076133 100644 --- a/public/emoji/1f9b9-200d-2642-fe0f.svg +++ b/public/emoji/1f9b9-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9cb.svg b/public/emoji/1f9cb.svg new file mode 100644 index 000000000..8cb61784d --- /dev/null +++ b/public/emoji/1f9cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg index 77c8b9ba1..37507496e 100644 --- a/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fb-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg index 09e6f4d9b..97de596dc 100644 --- a/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fb-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fb.svg b/public/emoji/1f9ce-1f3fb.svg index 9e269bd2a..6f97b1b9d 100644 --- a/public/emoji/1f9ce-1f3fb.svg +++ b/public/emoji/1f9ce-1f3fb.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg index cf2ca0cc9..ee5bf15ae 100644 --- a/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fc-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg index 9bd2fc01d..e51865777 100644 --- a/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fc-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fc.svg b/public/emoji/1f9ce-1f3fc.svg index bdd410e2e..0977ee6d0 100644 --- a/public/emoji/1f9ce-1f3fc.svg +++ b/public/emoji/1f9ce-1f3fc.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg index ed058b9d9..e210695d5 100644 --- a/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fd-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg index 10df60c9b..269c7cec9 100644 --- a/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fd-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fd.svg b/public/emoji/1f9ce-1f3fd.svg index 465db1df1..7fe4f06eb 100644 --- a/public/emoji/1f9ce-1f3fd.svg +++ b/public/emoji/1f9ce-1f3fd.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg index 83206f8d2..e2b093098 100644 --- a/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3fe-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg index fb24b6dfb..54e4ba95e 100644 --- a/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3fe-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3fe.svg b/public/emoji/1f9ce-1f3fe.svg index e84e1235a..2f70944a6 100644 --- a/public/emoji/1f9ce-1f3fe.svg +++ b/public/emoji/1f9ce-1f3fe.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg index 442cb9c49..0f2dc0c41 100644 --- a/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-1f3ff-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg index aba0cb467..b51d7ff89 100644 --- a/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-1f3ff-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-1f3ff.svg b/public/emoji/1f9ce-1f3ff.svg index c07e81fcf..542a60412 100644 --- a/public/emoji/1f9ce-1f3ff.svg +++ b/public/emoji/1f9ce-1f3ff.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-200d-2640-fe0f.svg b/public/emoji/1f9ce-200d-2640-fe0f.svg index 89c9ff428..40b5754e1 100644 --- a/public/emoji/1f9ce-200d-2640-fe0f.svg +++ b/public/emoji/1f9ce-200d-2640-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce-200d-2642-fe0f.svg b/public/emoji/1f9ce-200d-2642-fe0f.svg index 403d73eb3..1c8ddcd8a 100644 --- a/public/emoji/1f9ce-200d-2642-fe0f.svg +++ b/public/emoji/1f9ce-200d-2642-fe0f.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9ce.svg b/public/emoji/1f9ce.svg index 60fe53792..86a60cb15 100644 --- a/public/emoji/1f9ce.svg +++ b/public/emoji/1f9ce.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-1f37c.svg b/public/emoji/1f9d1-1f3fb-200d-1f37c.svg new file mode 100644 index 000000000..624d945f6 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-1f384.svg b/public/emoji/1f9d1-1f3fb-200d-1f384.svg new file mode 100644 index 000000000..e204d68af --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..6542ef089 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..92180dc5a --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..7672a8360 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..3a1f8c8d7 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..6b9ed98f5 --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..7aa9cfbbe --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..adc94eefa --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..e9257bf4e --- /dev/null +++ b/public/emoji/1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-1f37c.svg b/public/emoji/1f9d1-1f3fc-200d-1f37c.svg new file mode 100644 index 000000000..cd1b853e1 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-1f384.svg b/public/emoji/1f9d1-1f3fc-200d-1f384.svg new file mode 100644 index 000000000..c86b6d37b --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..fc339202d --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..e28ecdf2a --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..182f55dee --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..77ad1c25b --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..d2db4a4fd --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..c5fa071ab --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..073ed3291 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..330dd09f8 --- /dev/null +++ b/public/emoji/1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-1f37c.svg b/public/emoji/1f9d1-1f3fd-200d-1f37c.svg new file mode 100644 index 000000000..c1d45aa32 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-1f384.svg b/public/emoji/1f9d1-1f3fd-200d-1f384.svg new file mode 100644 index 000000000..0c6066634 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..338be2186 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..606aa6c7c --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..32425140b --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..c6dc1cab4 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..c7ff54596 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..70f5da4cc --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..3a1913fa2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..7f5f2f028 --- /dev/null +++ b/public/emoji/1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-1f37c.svg b/public/emoji/1f9d1-1f3fe-200d-1f37c.svg new file mode 100644 index 000000000..a4f6e769c --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-1f384.svg b/public/emoji/1f9d1-1f3fe-200d-1f384.svg new file mode 100644 index 000000000..fb94c66c2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..5c4c22eb2 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..a88fe5196 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..f5305f0d7 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..995b238d1 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..5ee06ffc9 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..a4056f613 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..96667d842 --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg new file mode 100644 index 000000000..e7440744f --- /dev/null +++ b/public/emoji/1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-1f37c.svg b/public/emoji/1f9d1-1f3ff-200d-1f37c.svg new file mode 100644 index 000000000..4e75f50f2 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-1f384.svg b/public/emoji/1f9d1-1f3ff-200d-1f384.svg new file mode 100644 index 000000000..52121d13f --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..9c1bd5769 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..2d11a919f --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..39dc1d9e8 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..57616f71c --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg new file mode 100644 index 000000000..a1895b892 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg new file mode 100644 index 000000000..49c9ef267 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg new file mode 100644 index 000000000..be650e401 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg new file mode 100644 index 000000000..0bed3d534 --- /dev/null +++ b/public/emoji/1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-200d-1f37c.svg b/public/emoji/1f9d1-200d-1f37c.svg new file mode 100644 index 000000000..f2bf52948 --- /dev/null +++ b/public/emoji/1f9d1-200d-1f37c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d1-200d-1f384.svg b/public/emoji/1f9d1-200d-1f384.svg new file mode 100644 index 000000000..78bde98ee --- /dev/null +++ b/public/emoji/1f9d1-200d-1f384.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fb-200d-2640-fe0f.svg new file mode 100644 index 000000000..31109bd46 --- /dev/null +++ b/public/emoji/1f9d4-1f3fb-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fb-200d-2642-fe0f.svg new file mode 100644 index 000000000..07e401366 --- /dev/null +++ b/public/emoji/1f9d4-1f3fb-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fc-200d-2640-fe0f.svg new file mode 100644 index 000000000..96acdb542 --- /dev/null +++ b/public/emoji/1f9d4-1f3fc-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fc-200d-2642-fe0f.svg new file mode 100644 index 000000000..168fa82ba --- /dev/null +++ b/public/emoji/1f9d4-1f3fc-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fd-200d-2640-fe0f.svg new file mode 100644 index 000000000..9fb7aeaf8 --- /dev/null +++ b/public/emoji/1f9d4-1f3fd-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fd-200d-2642-fe0f.svg new file mode 100644 index 000000000..01e936599 --- /dev/null +++ b/public/emoji/1f9d4-1f3fd-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3fe-200d-2640-fe0f.svg new file mode 100644 index 000000000..489e27951 --- /dev/null +++ b/public/emoji/1f9d4-1f3fe-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3fe-200d-2642-fe0f.svg new file mode 100644 index 000000000..27a6f756a --- /dev/null +++ b/public/emoji/1f9d4-1f3fe-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9d4-1f3ff-200d-2640-fe0f.svg new file mode 100644 index 000000000..31f829155 --- /dev/null +++ b/public/emoji/1f9d4-1f3ff-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9d4-1f3ff-200d-2642-fe0f.svg new file mode 100644 index 000000000..34a7f5e27 --- /dev/null +++ b/public/emoji/1f9d4-1f3ff-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-200d-2640-fe0f.svg b/public/emoji/1f9d4-200d-2640-fe0f.svg new file mode 100644 index 000000000..08af35c5b --- /dev/null +++ b/public/emoji/1f9d4-200d-2640-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9d4-200d-2642-fe0f.svg b/public/emoji/1f9d4-200d-2642-fe0f.svg new file mode 100644 index 000000000..fcd2cdf08 --- /dev/null +++ b/public/emoji/1f9d4-200d-2642-fe0f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1f9e1.svg b/public/emoji/1f9e1.svg index 26ae9e7da..0e61b1485 100644 --- a/public/emoji/1f9e1.svg +++ b/public/emoji/1f9e1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1f9e9.svg b/public/emoji/1f9e9.svg index 1505f6846..ae4bf5668 100644 --- a/public/emoji/1f9e9.svg +++ b/public/emoji/1f9e9.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/1fa74.svg b/public/emoji/1fa74.svg new file mode 100644 index 000000000..585265a40 --- /dev/null +++ b/public/emoji/1fa74.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa83.svg b/public/emoji/1fa83.svg new file mode 100644 index 000000000..3de58a8f2 --- /dev/null +++ b/public/emoji/1fa83.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa84.svg b/public/emoji/1fa84.svg new file mode 100644 index 000000000..988c79888 --- /dev/null +++ b/public/emoji/1fa84.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa85.svg b/public/emoji/1fa85.svg new file mode 100644 index 000000000..a6b0f6026 --- /dev/null +++ b/public/emoji/1fa85.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa86.svg b/public/emoji/1fa86.svg new file mode 100644 index 000000000..fca9a3c81 --- /dev/null +++ b/public/emoji/1fa86.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa96.svg b/public/emoji/1fa96.svg new file mode 100644 index 000000000..462cbf5ee --- /dev/null +++ b/public/emoji/1fa96.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa97.svg b/public/emoji/1fa97.svg new file mode 100644 index 000000000..c9c21ca2a --- /dev/null +++ b/public/emoji/1fa97.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa98.svg b/public/emoji/1fa98.svg new file mode 100644 index 000000000..fa316b125 --- /dev/null +++ b/public/emoji/1fa98.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa99.svg b/public/emoji/1fa99.svg new file mode 100644 index 000000000..04944697a --- /dev/null +++ b/public/emoji/1fa99.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9a.svg b/public/emoji/1fa9a.svg new file mode 100644 index 000000000..f33a04826 --- /dev/null +++ b/public/emoji/1fa9a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9b.svg b/public/emoji/1fa9b.svg new file mode 100644 index 000000000..d0b988f66 --- /dev/null +++ b/public/emoji/1fa9b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9c.svg b/public/emoji/1fa9c.svg new file mode 100644 index 000000000..cd3b979ed --- /dev/null +++ b/public/emoji/1fa9c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9d.svg b/public/emoji/1fa9d.svg new file mode 100644 index 000000000..923a96de2 --- /dev/null +++ b/public/emoji/1fa9d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9e.svg b/public/emoji/1fa9e.svg new file mode 100644 index 000000000..b263f10bc --- /dev/null +++ b/public/emoji/1fa9e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fa9f.svg b/public/emoji/1fa9f.svg new file mode 100644 index 000000000..8daaad668 --- /dev/null +++ b/public/emoji/1fa9f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa0.svg b/public/emoji/1faa0.svg new file mode 100644 index 000000000..f5422d960 --- /dev/null +++ b/public/emoji/1faa0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa1.svg b/public/emoji/1faa1.svg new file mode 100644 index 000000000..a99cb160d --- /dev/null +++ b/public/emoji/1faa1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa2.svg b/public/emoji/1faa2.svg new file mode 100644 index 000000000..fd6a64c1c --- /dev/null +++ b/public/emoji/1faa2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa3.svg b/public/emoji/1faa3.svg new file mode 100644 index 000000000..7be64da1d --- /dev/null +++ b/public/emoji/1faa3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa4.svg b/public/emoji/1faa4.svg new file mode 100644 index 000000000..a680fb706 --- /dev/null +++ b/public/emoji/1faa4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa5.svg b/public/emoji/1faa5.svg new file mode 100644 index 000000000..9c9e61779 --- /dev/null +++ b/public/emoji/1faa5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa6.svg b/public/emoji/1faa6.svg new file mode 100644 index 000000000..f4f3a89ed --- /dev/null +++ b/public/emoji/1faa6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa7.svg b/public/emoji/1faa7.svg new file mode 100644 index 000000000..ac1646ba4 --- /dev/null +++ b/public/emoji/1faa7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1faa8.svg b/public/emoji/1faa8.svg new file mode 100644 index 000000000..361fc032d --- /dev/null +++ b/public/emoji/1faa8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab0.svg b/public/emoji/1fab0.svg new file mode 100644 index 000000000..4b13d7e77 --- /dev/null +++ b/public/emoji/1fab0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab1.svg b/public/emoji/1fab1.svg new file mode 100644 index 000000000..1bc9b9a90 --- /dev/null +++ b/public/emoji/1fab1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab2.svg b/public/emoji/1fab2.svg new file mode 100644 index 000000000..57fd4bfab --- /dev/null +++ b/public/emoji/1fab2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab3.svg b/public/emoji/1fab3.svg new file mode 100644 index 000000000..f8c8d7879 --- /dev/null +++ b/public/emoji/1fab3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab4.svg b/public/emoji/1fab4.svg new file mode 100644 index 000000000..92f1547ba --- /dev/null +++ b/public/emoji/1fab4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab5.svg b/public/emoji/1fab5.svg new file mode 100644 index 000000000..981dd2d1a --- /dev/null +++ b/public/emoji/1fab5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fab6.svg b/public/emoji/1fab6.svg new file mode 100644 index 000000000..8e70d6cd5 --- /dev/null +++ b/public/emoji/1fab6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fac0.svg b/public/emoji/1fac0.svg new file mode 100644 index 000000000..e6916d275 --- /dev/null +++ b/public/emoji/1fac0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fac1.svg b/public/emoji/1fac1.svg new file mode 100644 index 000000000..cfdf72f1f --- /dev/null +++ b/public/emoji/1fac1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fac2.svg b/public/emoji/1fac2.svg new file mode 100644 index 000000000..5c0413cd5 --- /dev/null +++ b/public/emoji/1fac2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad0.svg b/public/emoji/1fad0.svg new file mode 100644 index 000000000..34e68d6b4 --- /dev/null +++ b/public/emoji/1fad0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad1.svg b/public/emoji/1fad1.svg new file mode 100644 index 000000000..b0d524270 --- /dev/null +++ b/public/emoji/1fad1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad2.svg b/public/emoji/1fad2.svg new file mode 100644 index 000000000..b84ce6a1f --- /dev/null +++ b/public/emoji/1fad2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad3.svg b/public/emoji/1fad3.svg new file mode 100644 index 000000000..25c1842d3 --- /dev/null +++ b/public/emoji/1fad3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad4.svg b/public/emoji/1fad4.svg new file mode 100644 index 000000000..34a6215a8 --- /dev/null +++ b/public/emoji/1fad4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad5.svg b/public/emoji/1fad5.svg new file mode 100644 index 000000000..1133788df --- /dev/null +++ b/public/emoji/1fad5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/1fad6.svg b/public/emoji/1fad6.svg new file mode 100644 index 000000000..9e6894daf --- /dev/null +++ b/public/emoji/1fad6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/2694.svg b/public/emoji/2694.svg index 3cf2fa46c..325b85f12 100644 --- a/public/emoji/2694.svg +++ b/public/emoji/2694.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/emoji/2764-fe0f-200d-1f525.svg b/public/emoji/2764-fe0f-200d-1f525.svg new file mode 100644 index 000000000..298dd0e15 --- /dev/null +++ b/public/emoji/2764-fe0f-200d-1f525.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/2764-fe0f-200d-1fa79.svg b/public/emoji/2764-fe0f-200d-1fa79.svg new file mode 100644 index 000000000..a7a38bd14 --- /dev/null +++ b/public/emoji/2764-fe0f-200d-1fa79.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/emoji/sheet_10.png b/public/emoji/sheet_10.png deleted file mode 100644 index 3ee92a1f1..000000000 Binary files a/public/emoji/sheet_10.png and /dev/null differ diff --git a/public/emoji/sheet_13.png b/public/emoji/sheet_13.png new file mode 100644 index 000000000..1ba12b619 Binary files /dev/null and b/public/emoji/sheet_13.png differ diff --git a/scalingo.json b/scalingo.json index 324356df0..51d9b5b9f 100644 --- a/scalingo.json +++ b/scalingo.json @@ -1,8 +1,8 @@ { "name": "Mastodon", "description": "A GNU Social-compatible microblogging server", - "repository": "https://github.com/tootsuite/mastodon", - "logo": "https://github.com/tootsuite.png", + "repository": "https://github.com/mastodon/mastodon", + "logo": "https://github.com/mastodon.png", "env": { "LOCAL_DOMAIN": { "description": "The domain that your Mastodon instance will run on (this can be appname.scalingo.io or a custom domain)", diff --git a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb index d373f56bd..3a382ff27 100644 --- a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb +++ b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb @@ -5,11 +5,13 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController, type: :controll let!(:follower_1) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/a') } let!(:follower_2) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/b') } let!(:follower_3) { Fabricate(:account, domain: 'foo.com', uri: 'https://foo.com/users/a') } + let!(:follower_4) { Fabricate(:account, username: 'instance-actor', domain: 'example.com', uri: 'https://example.com') } before do follower_1.follow!(account) follower_2.follow!(account) follower_3.follow!(account) + follower_4.follow!(account) end before do @@ -45,7 +47,7 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController, type: :controll it 'returns orderedItems with followers from example.com' do expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems].sort).to eq [follower_1.uri, follower_2.uri] + expect(body[:orderedItems].sort).to eq [follower_4.uri, follower_1.uri, follower_2.uri] end it 'returns private Cache-Control header' do diff --git a/spec/controllers/activitypub/outboxes_controller_spec.rb b/spec/controllers/activitypub/outboxes_controller_spec.rb index d23f2c17c..1722690db 100644 --- a/spec/controllers/activitypub/outboxes_controller_spec.rb +++ b/spec/controllers/activitypub/outboxes_controller_spec.rb @@ -55,6 +55,10 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do it_behaves_like 'cachable response' + it 'does not have a Vary header' do + expect(response.headers['Vary']).to be_nil + end + context 'when account is permanently suspended' do before do account.suspend! @@ -96,6 +100,10 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do it_behaves_like 'cachable response' + it 'returns Vary header with Signature' do + expect(response.headers['Vary']).to include 'Signature' + end + context 'when account is permanently suspended' do before do account.suspend! @@ -144,7 +152,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end @@ -170,7 +178,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end @@ -195,7 +203,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end @@ -220,7 +228,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do end it 'returns private Cache-Control header' do - expect(response.headers['Cache-Control']).to eq 'max-age=0, private' + expect(response.headers['Cache-Control']).to eq 'max-age=60, private' end end end diff --git a/spec/controllers/api/v1/accounts/notes_controller_spec.rb b/spec/controllers/api/v1/accounts/notes_controller_spec.rb new file mode 100644 index 000000000..0a2957fed --- /dev/null +++ b/spec/controllers/api/v1/accounts/notes_controller_spec.rb @@ -0,0 +1,48 @@ +require 'rails_helper' + +describe Api::V1::Accounts::NotesController do + render_views + + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:accounts') } + let(:account) { Fabricate(:account) } + let(:comment) { 'foo' } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'POST #create' do + subject do + post :create, params: { account_id: account.id, comment: comment } + end + + context 'when account note has reasonable length' do + let(:comment) { 'foo' } + + it 'returns http success' do + subject + expect(response).to have_http_status(200) + end + + it 'updates account note' do + subject + expect(AccountNote.find_by(account_id: user.account.id, target_account_id: account.id).comment).to eq comment + end + end + + context 'when account note exceends allowed length' do + let(:comment) { 'a' * 2_001 } + + it 'returns 422' do + subject + expect(response).to have_http_status(422) + end + + it 'does not create account note' do + subject + expect(AccountNote.where(account_id: user.account.id, target_account_id: account.id).exists?).to be_falsey + end + end + end +end diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index d03ae51e8..f718f5dd9 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -206,6 +206,38 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using email and password after an unfinished log-in attempt to a 2FA-protected account' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders two factor authentication page' do + expect(controller).to render_template("two_factor") + expect(controller).to render_template(partial: "_otp_authentication_form") + end + end + + context 'using email and password after an unfinished log-in attempt with a sign-in token challenge' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders two factor authentication page' do + expect(controller).to render_template("two_factor") + expect(controller).to render_template(partial: "_otp_authentication_form") + end + end + context 'using upcase email and password' do before do post :create, params: { user: { email: user.email.upcase, password: user.password } } @@ -231,6 +263,21 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using a valid OTP, attempting to leverage previous half-login to bypass password auth' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, otp_attempt: user.current_otp } }, session: { attempt_user_updated_at: user.updated_at.to_s } + end + + it "doesn't log the user in" do + expect(controller.current_user).to be_nil + end + end + context 'when the server has an decryption error' do before do allow_any_instance_of(User).to receive(:validate_and_consume_otp!).and_raise(OpenSSL::Cipher::CipherError) @@ -380,6 +427,52 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using email and password after an unfinished log-in attempt to a 2FA-protected account' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders sign in token authentication page' do + expect(controller).to render_template("sign_in_token") + end + + it 'generates sign in token' do + expect(user.reload.sign_in_token).to_not be_nil + end + + it 'sends sign in token e-mail' do + expect(UserMailer).to have_received(:sign_in_token) + end + end + + context 'using email and password after an unfinished log-in attempt with a sign-in token challenge' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'renders sign in token authentication page' do + expect(controller).to render_template("sign_in_token") + end + + it 'generates sign in token' do + expect(user.reload.sign_in_token).to_not be_nil + end + + it 'sends sign in token e-mail' do + expect(UserMailer).to have_received(:sign_in_token).with(user, any_args) + end + end + context 'using a valid sign in token' do before do user.generate_sign_in_token && user.save @@ -395,6 +488,22 @@ RSpec.describe Auth::SessionsController, type: :controller do end end + context 'using a valid sign in token, attempting to leverage previous half-login to bypass password auth' do + let!(:other_user) do + Fabricate(:user, email: 'z@y.com', password: 'abcdefgh', otp_required_for_login: false, current_sign_in_at: 1.month.ago) + end + + before do + user.generate_sign_in_token && user.save + post :create, params: { user: { email: other_user.email, password: other_user.password } } + post :create, params: { user: { email: user.email, sign_in_token_attempt: user.sign_in_token } }, session: { attempt_user_updated_at: user.updated_at.to_s } + end + + it "doesn't log the user in" do + expect(controller.current_user).to be_nil + end + end + context 'using an invalid sign in token' do before do post :create, params: { user: { sign_in_token_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } @@ -410,4 +519,33 @@ RSpec.describe Auth::SessionsController, type: :controller do end end end + + describe 'GET #webauthn_options' do + context 'with WebAuthn and OTP enabled as second factor' do + let(:domain) { "#{Rails.configuration.x.use_https ? 'https' : 'http' }://#{Rails.configuration.x.web_domain}" } + + let(:fake_client) { WebAuthn::FakeClient.new(domain) } + + let!(:user) do + Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + end + + before do + user.update(webauthn_id: WebAuthn.generate_user_id) + public_key_credential = WebAuthn::Credential.from_create(fake_client.create) + user.webauthn_credentials.create( + nickname: 'SecurityKeyNickname', + external_id: public_key_credential.id, + public_key: public_key_credential.public_key, + sign_count: '1000' + ) + post :create, params: { user: { email: user.email, password: user.password } } + end + + it 'returns http success' do + get :webauthn_options + expect(response).to have_http_status :ok + end + end + end end diff --git a/spec/controllers/follower_accounts_controller_spec.rb b/spec/controllers/follower_accounts_controller_spec.rb index f6d55f693..006274169 100644 --- a/spec/controllers/follower_accounts_controller_spec.rb +++ b/spec/controllers/follower_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe FollowerAccountsController do render_views - let(:alice) { Fabricate(:account, username: 'alice') } + let(:alice) { Fabricate(:user).account } let(:follower0) { Fabricate(:account) } let(:follower1) { Fabricate(:account) } @@ -101,6 +101,23 @@ describe FollowerAccountsController do expect(body['partOf']).to be_blank end + context 'when account hides their network' do + before do + alice.user.settings.hide_network = true + end + + it 'returns followers count' do + expect(body['totalItems']).to eq 2 + end + + it 'does not return items' do + expect(body['items']).to be_blank + expect(body['orderedItems']).to be_blank + expect(body['first']).to be_blank + expect(body['last']).to be_blank + end + end + context 'when account is permanently suspended' do before do alice.suspend! diff --git a/spec/controllers/following_accounts_controller_spec.rb b/spec/controllers/following_accounts_controller_spec.rb index 0fc0967a6..7ec0e3d06 100644 --- a/spec/controllers/following_accounts_controller_spec.rb +++ b/spec/controllers/following_accounts_controller_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' describe FollowingAccountsController do render_views - let(:alice) { Fabricate(:account, username: 'alice') } + let(:alice) { Fabricate(:user).account } let(:followee0) { Fabricate(:account) } let(:followee1) { Fabricate(:account) } @@ -101,6 +101,23 @@ describe FollowingAccountsController do expect(body['partOf']).to be_blank end + context 'when account hides their network' do + before do + alice.user.settings.hide_network = true + end + + it 'returns followers count' do + expect(body['totalItems']).to eq 2 + end + + it 'does not return items' do + expect(body['items']).to be_blank + expect(body['orderedItems']).to be_blank + expect(body['first']).to be_blank + expect(body['last']).to be_blank + end + end + context 'when account is permanently suspended' do before do alice.suspend! diff --git a/spec/controllers/settings/deletes_controller_spec.rb b/spec/controllers/settings/deletes_controller_spec.rb index 8d5c4774f..92ab401c9 100644 --- a/spec/controllers/settings/deletes_controller_spec.rb +++ b/spec/controllers/settings/deletes_controller_spec.rb @@ -59,6 +59,10 @@ describe Settings::DeletesController do expect(user.account.reload).to be_suspended end + it 'does not create an email block' do + expect(CanonicalEmailBlock.block?(user.email)).to be false + end + context 'when suspended' do let(:user) { Fabricate(:user, account_attributes: { username: 'alice', suspended_at: Time.now.utc }) } diff --git a/spec/controllers/well_known/webfinger_controller_spec.rb b/spec/controllers/well_known/webfinger_controller_spec.rb index 1075456f3..8574d369d 100644 --- a/spec/controllers/well_known/webfinger_controller_spec.rb +++ b/spec/controllers/well_known/webfinger_controller_spec.rb @@ -24,6 +24,10 @@ describe WellKnown::WebfingerController, type: :controller do expect(response).to have_http_status(200) end + it 'does not set a Vary header' do + expect(response.headers['Vary']).to be_nil + end + it 'returns application/jrd+json' do expect(response.media_type).to eq 'application/jrd+json' end diff --git a/spec/fixtures/requests/oembed_youtube.html b/spec/fixtures/requests/oembed_youtube.html new file mode 100644 index 000000000..1508e4dd9 --- /dev/null +++ b/spec/fixtures/requests/oembed_youtube.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/spec/fixtures/xml/mastodon.atom b/spec/fixtures/xml/mastodon.atom deleted file mode 100644 index 92921a938..000000000 --- a/spec/fixtures/xml/mastodon.atom +++ /dev/null @@ -1,261 +0,0 @@ - - - http://kickass.zone/users/localhost.atom - ::1 - 2016-10-10T13:29:56Z - http://kickass.zone/system/accounts/avatars/000/000/001/medium/eris.png - - http://activitystrea.ms/schema/1.0/person - http://kickass.zone/users/localhost - localhost - localhost@kickass.zone - - - - - localhost - ::1 - - - - - - - tag:kickass.zone,2016-10-10:objectId=7:objectType=Follow - 2016-10-10T13:29:56Z - 2016-10-10T13:29:56Z - localhost started following kat@mastodon.social - localhost started following kat@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/kat - kat - kat@mastodon.social - #trans #queer - - - - - kat - Kat - #trans #queer - - - - tag:kickass.zone,2016-10-10:objectId=3:objectType=Favourite - 2016-10-10T13:29:26Z - 2016-10-10T13:29:26Z - localhost favourited a status by kat@mastodon.social - localhost favourited a status by kat@mastodon.social - http://activitystrea.ms/schema/1.0/favorite - - - http://activitystrea.ms/schema/1.0/activity - - - http://activitystrea.ms/schema/1.0/comment - tag:mastodon.social,2016-10-10:objectId=22833:objectType=Status - @localhost oooh more mastodons ❤ - - <p><a href="http://kickass.zone/users/localhost">@localhost</a> oooh more mastodons ❤</p> - http://activitystrea.ms/schema/1.0/post - 2016-10-10T13:23:35Z - 2016-10-10T13:23:35Z - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/kat - kat - kat@mastodon.social - #trans #queer - - - - - kat - Kat - #trans #queer - - - - - - tag:kickass.zone,2016-10-10:objectId=2:objectType=Favourite - 2016-10-10T13:13:15Z - 2016-10-10T13:13:15Z - localhost favourited a status by Gargron@mastodon.social - localhost favourited a status by Gargron@mastodon.social - http://activitystrea.ms/schema/1.0/favorite - - - http://activitystrea.ms/schema/1.0/activity - - - http://activitystrea.ms/schema/1.0/note - tag:mastodon.social,2016-10-10:objectId=22825:objectType=Status - Deployed some fixes - - <p>Deployed some fixes</p> - http://activitystrea.ms/schema/1.0/post - 2016-10-10T13:10:37Z - 2016-10-10T13:10:37Z - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/Gargron - Gargron - Gargron@mastodon.social - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - - Gargron - Eugen - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - - tag:kickass.zone,2016-10-10:objectId=17:objectType=Status - 2016-10-10T00:41:31Z - 2016-10-10T00:41:31Z - Social media needs MOAR cats! http://kickass.zone/media/3 - <p>Social media needs MOAR cats! <a rel="nofollow noopener noreferrer" href="http://kickass.zone/media/3">http://kickass.zone/media/3</a></p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/note - - - - tag:kickass.zone,2016-10-10:objectId=14:objectType=Status - 2016-10-10T00:38:39Z - 2016-10-10T00:38:39Z - http://kickass.zone/media/2 - <p><a rel="nofollow noopener noreferrer" href="http://kickass.zone/media/2">http://kickass.zone/media/2</a></p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/note - - - - tag:kickass.zone,2016-10-10:objectId=12:objectType=Status - 2016-10-10T00:37:49Z - 2016-10-10T00:37:49Z - - <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb> - <link rel="self" type="application/atom+xml" href="http://kickass.zone/users/localhost/updates/7.atom"/> - <link rel="alternate" type="text/html" href="http://kickass.zone/users/localhost/updates/7"/> - <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> - </entry> - <entry> - <id>tag:kickass.zone,2016-10-10:objectId=4:objectType=Follow</id> - <published>2016-10-10T00:23:07Z</published> - <updated>2016-10-10T00:23:07Z</updated> - <title>localhost started following bignimbus@mastodon.social - localhost started following bignimbus@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/bignimbus - bignimbus - bignimbus@mastodon.social - jdauriemma.com - - - - - bignimbus - Jeff Auriemma - jdauriemma.com - - - - tag:kickass.zone,2016-10-10:objectId=2:objectType=Follow - 2016-10-10T00:14:18Z - 2016-10-10T00:14:18Z - localhost started following Gargron@mastodon.social - localhost started following Gargron@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/Gargron - Gargron - Gargron@mastodon.social - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - - Gargron - Eugen - Developer of Mastodon, a GNU social alternative: https://github.com/tootsuite/mastodon - - - - tag:kickass.zone,2016-10-10:objectId=1:objectType=Follow - 2016-10-10T00:09:09Z - 2016-10-10T00:09:09Z - localhost started following abc@mastodon.social - localhost started following abc@mastodon.social - http://activitystrea.ms/schema/1.0/follow - - - http://activitystrea.ms/schema/1.0/activity - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/abc - abc - abc@mastodon.social - - - - - abc - abc - - - - tag:kickass.zone,2016-10-10:objectId=3:objectType=Status - 2016-10-10T00:02:47Z - 2016-10-10T00:02:47Z - - <activity:verb>http://activitystrea.ms/schema/1.0/delete</activity:verb> - <link rel="self" type="application/atom+xml" href="http://kickass.zone/users/localhost/updates/3.atom"/> - <link rel="alternate" type="text/html" href="http://kickass.zone/users/localhost/updates/3"/> - <activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type> - </entry> - <entry> - <id>tag:kickass.zone,2016-10-10:objectId=2:objectType=Status</id> - <published>2016-10-10T00:02:18Z</published> - <updated>2016-10-10T00:02:18Z</updated> - <title>Yes, that was the obligatory first post. :) - <p>Yes, that was the obligatory first post. :)</p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/comment - - - - tag:kickass.zone,2016-10-10:objectId=1:objectType=Status - 2016-10-10T00:01:56Z - 2016-10-10T00:01:56Z - Hello, world! - <p>Hello, world!</p> - http://activitystrea.ms/schema/1.0/post - - - http://activitystrea.ms/schema/1.0/note - - diff --git a/spec/helpers/jsonld_helper_spec.rb b/spec/helpers/jsonld_helper_spec.rb index 883a88b14..744a14f26 100644 --- a/spec/helpers/jsonld_helper_spec.rb +++ b/spec/helpers/jsonld_helper_spec.rb @@ -89,4 +89,86 @@ describe JsonLdHelper do expect(fetch_resource_without_id_validation('https://host.test/')).to eq({}) end end + + context 'compaction and forwarding' do + let(:json) do + { + '@context' => [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + { + 'obsolete' => 'http://ostatus.org#', + 'convo' => 'obsolete:conversation', + 'new' => 'https://obscure-unreleased-test.joinmastodon.org/#', + }, + ], + 'type' => 'Create', + 'to' => ['https://www.w3.org/ns/activitystreams#Public'], + 'object' => { + 'id' => 'https://example.com/status', + 'type' => 'Note', + 'inReplyTo' => nil, + 'convo' => 'https://example.com/conversation', + 'tag' => [ + { + 'type' => 'Mention', + 'href' => ['foo'], + } + ], + }, + 'signature' => { + 'type' => 'RsaSignature2017', + 'created' => '2022-02-02T12:00:00Z', + 'creator' => 'https://example.com/actor#main-key', + 'signatureValue' => 'some-sig', + }, + } + end + + describe '#compact' do + it 'properly compacts JSON-LD with alternative context definitions' do + expect(compact(json).dig('object', 'conversation')).to eq 'https://example.com/conversation' + end + + it 'compacts single-item arrays' do + expect(compact(json).dig('object', 'tag', 'href')).to eq 'foo' + end + + it 'compacts the activistreams Public collection' do + expect(compact(json)['to']).to eq 'as:Public' + end + + it 'properly copies signature' do + expect(compact(json)['signature']).to eq json['signature'] + end + end + + describe 'patch_for_forwarding!' do + it 'properly patches incompatibilities' do + json['object'].delete('convo') + compacted = compact(json) + patch_for_forwarding!(json, compacted) + expect(compacted['to']).to eq ['https://www.w3.org/ns/activitystreams#Public'] + expect(compacted.dig('object', 'tag', 0, 'href')).to eq ['foo'] + expect(safe_for_forwarding?(json, compacted)).to eq true + end + end + + describe 'safe_for_forwarding?' do + it 'deems a safe compacting as such' do + json['object'].delete('convo') + compacted = compact(json) + deemed_compatible = patch_for_forwarding!(json, compacted) + expect(compacted['to']).to eq ['https://www.w3.org/ns/activitystreams#Public'] + expect(safe_for_forwarding?(json, compacted)).to eq true + end + + it 'deems an unsafe compacting as such' do + compacted = compact(json) + deemed_compatible = patch_for_forwarding!(json, compacted) + expect(compacted['to']).to eq ['https://www.w3.org/ns/activitystreams#Public'] + expect(safe_for_forwarding?(json, compacted)).to eq false + end + end + end end diff --git a/spec/lib/activitypub/tag_manager_spec.rb b/spec/lib/activitypub/tag_manager_spec.rb index 1c5c6f0ed..606a1de2e 100644 --- a/spec/lib/activitypub/tag_manager_spec.rb +++ b/spec/lib/activitypub/tag_manager_spec.rb @@ -42,6 +42,14 @@ RSpec.describe ActivityPub::TagManager do expect(subject.to(status)).to eq [subject.uri_for(mentioned)] end + it "returns URIs of mentioned group's followers for direct statuses to groups" do + status = Fabricate(:status, visibility: :direct) + mentioned = Fabricate(:account, domain: 'remote.org', uri: 'https://remote.org/group', followers_url: 'https://remote.org/group/followers', actor_type: 'Group') + status.mentions.create(account: mentioned) + expect(subject.to(status)).to include(subject.uri_for(mentioned)) + expect(subject.to(status)).to include(subject.followers_uri_for(mentioned)) + end + it "returns URIs of mentions for direct silenced author's status only if they are followers or requesting to be" do bob = Fabricate(:account, username: 'bob') alice = Fabricate(:account, username: 'alice') diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 03d6f5fb0..65e6714c0 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -5,6 +5,37 @@ RSpec.describe Account, type: :model do let(:bob) { Fabricate(:account, username: 'bob') } subject { Fabricate(:account) } + describe '#suspend!' do + it 'marks the account as suspended' do + subject.suspend! + expect(subject.suspended?).to be true + end + + it 'creates a deletion request' do + subject.suspend! + expect(AccountDeletionRequest.where(account: subject).exists?).to be true + end + + context 'when the account is of a local user' do + let!(:subject) { Fabricate(:account, user: Fabricate(:user, email: 'foo+bar@domain.org')) } + + it 'creates a canonical domain block' do + subject.suspend! + expect(CanonicalEmailBlock.block?(subject.user_email)).to be true + end + + context 'when a canonical domain block already exists for that email' do + before do + Fabricate(:canonical_email_block, email: subject.user_email) + end + + it 'does not raise an error' do + expect { subject.suspend! }.not_to raise_error + end + end + end + end + describe '#follow!' do it 'creates a follow' do follow = subject.follow!(bob) diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb index 85fbf7e79..ca243ebc5 100644 --- a/spec/models/concerns/account_interactions_spec.rb +++ b/spec/models/concerns/account_interactions_spec.rb @@ -539,46 +539,57 @@ describe AccountInteractions do end end - describe '#followers_hash' do + describe '#remote_followers_hash' do let(:me) { Fabricate(:account, username: 'Me') } let(:remote_1) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } let(:remote_2) { Fabricate(:account, username: 'bob', domain: 'example.org', uri: 'https://example.org/users/bob') } - let(:remote_3) { Fabricate(:account, username: 'eve', domain: 'foo.org', uri: 'https://foo.org/users/eve') } + let(:remote_3) { Fabricate(:account, username: 'instance-actor', domain: 'example.org', uri: 'https://example.org') } + let(:remote_4) { Fabricate(:account, username: 'eve', domain: 'foo.org', uri: 'https://foo.org/users/eve') } before do remote_1.follow!(me) remote_2.follow!(me) remote_3.follow!(me) + remote_4.follow!(me) me.follow!(remote_1) end - context 'on a local user' do - it 'returns correct hash for remote domains' do - expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - expect(me.remote_followers_hash('https://foo.org/')).to eq 'ccb9c18a67134cfff9d62c7f7e7eb88e6b803446c244b84265565f4eba29df0e' - end + it 'returns correct hash for remote domains' do + expect(me.remote_followers_hash('https://example.org/')).to eq '20aecbe774b3d61c25094370baf370012b9271c5b172ecedb05caff8d79ef0c7' + expect(me.remote_followers_hash('https://foo.org/')).to eq 'ccb9c18a67134cfff9d62c7f7e7eb88e6b803446c244b84265565f4eba29df0e' + expect(me.remote_followers_hash('https://foo.org.evil.com/')).to eq '0000000000000000000000000000000000000000000000000000000000000000' + expect(me.remote_followers_hash('https://foo')).to eq '0000000000000000000000000000000000000000000000000000000000000000' + end - it 'invalidates cache as needed when removing or adding followers' do - expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - remote_1.unfollow!(me) - expect(me.remote_followers_hash('https://example.org/')).to eq '241b00794ce9b46aa864f3220afadef128318da2659782985bac5ed5bd436bff' - remote_1.follow!(me) - expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - end + it 'invalidates cache as needed when removing or adding followers' do + expect(me.remote_followers_hash('https://example.org/')).to eq '20aecbe774b3d61c25094370baf370012b9271c5b172ecedb05caff8d79ef0c7' + remote_3.unfollow!(me) + expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' + remote_1.unfollow!(me) + expect(me.remote_followers_hash('https://example.org/')).to eq '241b00794ce9b46aa864f3220afadef128318da2659782985bac5ed5bd436bff' + remote_1.follow!(me) + expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' end + end - context 'on a remote user' do - it 'returns correct hash for remote domains' do - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - end + describe '#local_followers_hash' do + let(:me) { Fabricate(:account, username: 'Me') } + let(:remote_1) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } - it 'invalidates cache as needed when removing or adding followers' do - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - me.unfollow!(remote_1) - expect(remote_1.local_followers_hash).to eq '0000000000000000000000000000000000000000000000000000000000000000' - me.follow!(remote_1) - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - end + before do + me.follow!(remote_1) + end + + it 'returns correct hash for local users' do + expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + end + + it 'invalidates cache as needed when removing or adding followers' do + expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + me.unfollow!(remote_1) + expect(remote_1.local_followers_hash).to eq '0000000000000000000000000000000000000000000000000000000000000000' + me.follow!(remote_1) + expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) end end diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 20fb894e7..653575778 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -267,6 +267,87 @@ RSpec.describe Status, type: :model do end end + describe '.tagged_with' do + let(:tag1) { Fabricate(:tag) } + let(:tag2) { Fabricate(:tag) } + let(:tag3) { Fabricate(:tag) } + let!(:status1) { Fabricate(:status, tags: [tag1]) } + let!(:status2) { Fabricate(:status, tags: [tag2]) } + let!(:status3) { Fabricate(:status, tags: [tag3]) } + let!(:status4) { Fabricate(:status, tags: []) } + let!(:status5) { Fabricate(:status, tags: [tag1, tag2, tag3]) } + + context 'when given one tag' do + it 'returns the expected statuses' do + expect(Status.tagged_with([tag1.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status5.id] + expect(Status.tagged_with([tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status5.id] + expect(Status.tagged_with([tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status3.id, status5.id] + end + end + + context 'when given multiple tags' do + it 'returns the expected statuses' do + expect(Status.tagged_with([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status2.id, status5.id] + expect(Status.tagged_with([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status3.id, status5.id] + expect(Status.tagged_with([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status3.id, status5.id] + end + end + end + + describe '.tagged_with_all' do + let(:tag1) { Fabricate(:tag) } + let(:tag2) { Fabricate(:tag) } + let(:tag3) { Fabricate(:tag) } + let!(:status1) { Fabricate(:status, tags: [tag1]) } + let!(:status2) { Fabricate(:status, tags: [tag2]) } + let!(:status3) { Fabricate(:status, tags: [tag3]) } + let!(:status4) { Fabricate(:status, tags: []) } + let!(:status5) { Fabricate(:status, tags: [tag1, tag2]) } + + context 'when given one tag' do + it 'returns the expected statuses' do + expect(Status.tagged_with_all([tag1.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status5.id] + expect(Status.tagged_with_all([tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status5.id] + expect(Status.tagged_with_all([tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status3.id] + end + end + + context 'when given multiple tags' do + it 'returns the expected statuses' do + expect(Status.tagged_with_all([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status5.id] + expect(Status.tagged_with_all([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [] + expect(Status.tagged_with_all([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [] + end + end + end + + describe '.tagged_with_none' do + let(:tag1) { Fabricate(:tag) } + let(:tag2) { Fabricate(:tag) } + let(:tag3) { Fabricate(:tag) } + let!(:status1) { Fabricate(:status, tags: [tag1]) } + let!(:status2) { Fabricate(:status, tags: [tag2]) } + let!(:status3) { Fabricate(:status, tags: [tag3]) } + let!(:status4) { Fabricate(:status, tags: []) } + let!(:status5) { Fabricate(:status, tags: [tag1, tag2, tag3]) } + + context 'when given one tag' do + it 'returns the expected statuses' do + expect(Status.tagged_with_none([tag1.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status3.id, status4.id] + expect(Status.tagged_with_none([tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status3.id, status4.id] + expect(Status.tagged_with_none([tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status2.id, status4.id] + end + end + + context 'when given multiple tags' do + it 'returns the expected statuses' do + expect(Status.tagged_with_none([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to eq [status3.id, status4.id] + expect(Status.tagged_with_none([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status2.id, status4.id] + expect(Status.tagged_with_none([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [status1.id, status4.id] + end + end + end + describe '.permitted_for' do subject { described_class.permitted_for(target_account, account).pluck(:visibility) } diff --git a/spec/presenters/instance_presenter_spec.rb b/spec/presenters/instance_presenter_spec.rb index 93a4e88e4..973b3e23c 100644 --- a/spec/presenters/instance_presenter_spec.rb +++ b/spec/presenters/instance_presenter_spec.rb @@ -91,8 +91,8 @@ describe InstancePresenter do end describe '#source_url' do - it 'returns "https://github.com/tootsuite/mastodon"' do - expect(instance_presenter.source_url).to eq('https://github.com/tootsuite/mastodon') + it 'returns "https://github.com/mastodon/mastodon"' do + expect(instance_presenter.source_url).to eq('https://github.com/mastodon/mastodon') end end diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 56e7f8321..1b1d878a7 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -12,6 +12,7 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do attachment: [ { type: 'PropertyValue', name: 'Pronouns', value: 'They/them' }, { type: 'PropertyValue', name: 'Occupation', value: 'Unit test' }, + { type: 'PropertyValue', name: 'non-string', value: ['foo', 'bar'] }, ], }.with_indifferent_access end diff --git a/spec/services/fetch_oembed_service_spec.rb b/spec/services/fetch_oembed_service_spec.rb index a4262b040..88f0113ed 100644 --- a/spec/services/fetch_oembed_service_spec.rb +++ b/spec/services/fetch_oembed_service_spec.rb @@ -13,6 +13,32 @@ describe FetchOEmbedService, type: :service do describe 'discover_provider' do context 'when status code is 200 and MIME type is text/html' do + context 'when OEmbed endpoint contains URL as parameter' do + before do + stub_request(:get, 'https://www.youtube.com/watch?v=IPSbNdBmWKE').to_return( + status: 200, + headers: { 'Content-Type': 'text/html' }, + body: request_fixture('oembed_youtube.html'), + ) + stub_request(:get, 'https://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIPSbNdBmWKE').to_return( + status: 200, + headers: { 'Content-Type': 'text/html' }, + body: request_fixture('oembed_json_empty.html') + ) + end + + it 'returns new OEmbed::Provider for JSON provider' do + subject.call('https://www.youtube.com/watch?v=IPSbNdBmWKE') + expect(subject.endpoint_url).to eq 'https://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIPSbNdBmWKE' + expect(subject.format).to eq :json + end + + it 'stores URL template' do + subject.call('https://www.youtube.com/watch?v=IPSbNdBmWKE') + expect(Rails.cache.read('oembed_endpoint:www.youtube.com')[:endpoint]).to eq 'https://www.youtube.com/oembed?format=json&url={url}' + end + end + context 'Both of JSON and XML provider are discoverable' do before do stub_request(:get, 'https://host.test/oembed.html').to_return( @@ -33,6 +59,11 @@ describe FetchOEmbedService, type: :service do expect(subject.endpoint_url).to eq 'https://host.test/provider.xml' expect(subject.format).to eq :xml end + + it 'does not cache OEmbed endpoint' do + subject.call('https://host.test/oembed.html', format: :xml) + expect(Rails.cache.exist?('oembed_endpoint:host.test')).to eq false + end end context 'JSON provider is discoverable while XML provider is not' do @@ -49,6 +80,11 @@ describe FetchOEmbedService, type: :service do expect(subject.endpoint_url).to eq 'https://host.test/provider.json' expect(subject.format).to eq :json end + + it 'does not cache OEmbed endpoint' do + subject.call('https://host.test/oembed.html') + expect(Rails.cache.exist?('oembed_endpoint:host.test')).to eq false + end end context 'XML provider is discoverable while JSON provider is not' do @@ -65,6 +101,11 @@ describe FetchOEmbedService, type: :service do expect(subject.endpoint_url).to eq 'https://host.test/provider.xml' expect(subject.format).to eq :xml end + + it 'does not cache OEmbed endpoint' do + subject.call('https://host.test/oembed.html') + expect(Rails.cache.exist?('oembed_endpoint:host.test')).to eq false + end end context 'Invalid XML provider is discoverable while JSON provider is not' do diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index f2cb22c5e..7433866b7 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -64,8 +64,9 @@ RSpec.describe NotifyService, type: :service do is_expected.to_not change(Notification, :count) end - context 'if the message chain initiated by recipient, but is not direct message' do + context 'if the message chain is initiated by recipient, but is not direct message' do let(:reply_to) { Fabricate(:status, account: recipient) } + let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) } it 'does not notify' do @@ -73,8 +74,20 @@ RSpec.describe NotifyService, type: :service do end end - context 'if the message chain initiated by recipient and is direct message' do + context 'if the message chain is initiated by recipient, but without a mention to the sender, even if the sender sends multiple messages in a row' do + let(:reply_to) { Fabricate(:status, account: recipient) } + let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } + let(:dummy_reply) { Fabricate(:status, account: sender, visibility: :direct, thread: reply_to) } + let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: dummy_reply)) } + + it 'does not notify' do + is_expected.to_not change(Notification, :count) + end + end + + context 'if the message chain is initiated by the recipient with a mention to the sender' do let(:reply_to) { Fabricate(:status, account: recipient, visibility: :direct) } + let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: reply_to)) } it 'does notify' do diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 147a59fc3..d21270c79 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -25,29 +25,33 @@ RSpec.describe PostStatusService, type: :service do expect(status.thread).to eq in_reply_to_status end - it 'schedules a status' do - account = Fabricate(:account) - future = Time.now.utc + 2.hours - - status = subject.call(account, text: 'Hi future!', scheduled_at: future) - - expect(status).to be_a ScheduledStatus - expect(status.scheduled_at).to eq future - expect(status.params['text']).to eq 'Hi future!' - end - - it 'does not immediately create a status when scheduling a status' do - account = Fabricate(:account) - media = Fabricate(:media_attachment) - future = Time.now.utc + 2.hours - - status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) - - expect(status).to be_a ScheduledStatus - expect(status.scheduled_at).to eq future - expect(status.params['text']).to eq 'Hi future!' - expect(media.reload.status).to be_nil - expect(Status.where(text: 'Hi future!').exists?).to be_falsey + context 'when scheduling a status' do + let!(:account) { Fabricate(:account) } + let!(:future) { Time.now.utc + 2.hours } + let!(:previous_status) { Fabricate(:status, account: account) } + + it 'schedules a status' do + status = subject.call(account, text: 'Hi future!', scheduled_at: future) + expect(status).to be_a ScheduledStatus + expect(status.scheduled_at).to eq future + expect(status.params['text']).to eq 'Hi future!' + end + + it 'does not immediately create a status' do + media = Fabricate(:media_attachment, account: account) + status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) + + expect(status).to be_a ScheduledStatus + expect(status.scheduled_at).to eq future + expect(status.params['text']).to eq 'Hi future!' + expect(status.params['media_ids']).to eq [media.id] + expect(media.reload.status).to be_nil + expect(Status.where(text: 'Hi future!').exists?).to be_falsey + end + + it 'does not change statuses count' do + expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }.not_to change { [account.statuses_count, previous_status.replies_count] } + end end it 'creates response to the original status of boost' do diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb index 3b2f9d698..d74e8dc62 100644 --- a/spec/services/process_mentions_service_spec.rb +++ b/spec/services/process_mentions_service_spec.rb @@ -42,6 +42,24 @@ RSpec.describe ProcessMentionsService, type: :service do expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once end end + + context 'with an IDN TLD' do + let(:remote_user) { Fabricate(:account, username: 'foo', protocol: :activitypub, domain: 'xn--y9a3aq.xn--y9a3aq', inbox_url: 'http://example.com/inbox') } + let(:status) { Fabricate(:status, account: account, text: "Hello @foo@հայ.հայ") } + + before do + stub_request(:post, remote_user.inbox_url) + subject.call(status) + end + + it 'creates a mention' do + expect(remote_user.mentions.where(status: status).count).to eq 1 + end + + it 'sends activity to the inbox' do + expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once + end + end end context 'Temporarily-unreachable ActivityPub user' do diff --git a/spec/views/about/show.html.haml_spec.rb b/spec/views/about/show.html.haml_spec.rb index c75c28759..1c2f5eee9 100644 --- a/spec/views/about/show.html.haml_spec.rb +++ b/spec/views/about/show.html.haml_spec.rb @@ -17,7 +17,7 @@ describe 'about/show.html.haml', without_verify_partial_doubles: true do site_short_description: 'something', site_description: 'something', version_number: '1.0', - source_url: 'https://github.com/tootsuite/mastodon', + source_url: 'https://github.com/mastodon/mastodon', open_registrations: false, thumbnail: nil, hero: nil, diff --git a/spec/workers/activitypub/delivery_worker_spec.rb b/spec/workers/activitypub/delivery_worker_spec.rb index f4633731e..d39393d50 100644 --- a/spec/workers/activitypub/delivery_worker_spec.rb +++ b/spec/workers/activitypub/delivery_worker_spec.rb @@ -11,7 +11,7 @@ describe ActivityPub::DeliveryWorker do let(:payload) { 'test' } before do - allow_any_instance_of(Account).to receive(:remote_followers_hash).with('https://example.com/').and_return('somehash') + allow_any_instance_of(Account).to receive(:remote_followers_hash).with('https://example.com/api').and_return('somehash') end describe 'perform' do diff --git a/spec/workers/move_worker_spec.rb b/spec/workers/move_worker_spec.rb index 8ab4f182f..82449b0c7 100644 --- a/spec/workers/move_worker_spec.rb +++ b/spec/workers/move_worker_spec.rb @@ -9,7 +9,8 @@ describe MoveWorker do let(:source_account) { Fabricate(:account, protocol: :activitypub, domain: 'example.com') } let(:target_account) { Fabricate(:account, protocol: :activitypub, domain: 'example.com') } let(:local_user) { Fabricate(:user) } - let!(:account_note) { Fabricate(:account_note, account: local_user.account, target_account: source_account) } + let(:comment) { 'old note prior to move' } + let!(:account_note) { Fabricate(:account_note, account: local_user.account, target_account: source_account, comment: comment) } let(:block_service) { double } @@ -26,19 +27,37 @@ describe MoveWorker do end shared_examples 'user note handling' do - it 'copies user note' do - subject.perform(source_account.id, target_account.id) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + context 'when user notes are short enough' do + it 'copies user note with prelude' do + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + end + + it 'merges user notes when needed' do + new_account_note = AccountNote.create!(account: account_note.account, target_account: target_account, comment: 'new note prior to move') + + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(new_account_note.comment) + end end - it 'merges user notes when needed' do - new_account_note = AccountNote.create!(account: account_note.account, target_account: target_account, comment: 'new note prior to move') + context 'when user notes are too long' do + let(:comment) { 'abc' * 333 } - subject.perform(source_account.id, target_account.id) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(source_account.acct) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) - expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(new_account_note.comment) + it 'copies user note without prelude' do + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(account_note.comment) + end + + it 'keeps user notes unchanged' do + new_account_note = AccountNote.create!(account: account_note.account, target_account: target_account, comment: 'new note prior to move') + + subject.perform(source_account.id, target_account.id) + expect(AccountNote.find_by(account: account_note.account, target_account: target_account).comment).to include(new_account_note.comment) + end end end diff --git a/spec/workers/publish_scheduled_announcement_worker_spec.rb b/spec/workers/publish_scheduled_announcement_worker_spec.rb new file mode 100644 index 000000000..0977bba1e --- /dev/null +++ b/spec/workers/publish_scheduled_announcement_worker_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe PublishScheduledAnnouncementWorker do + subject { described_class.new } + + let!(:remote_account) { Fabricate(:account, domain: 'domain.com', username: 'foo', uri: 'https://domain.com/users/foo') } + let!(:remote_status) { Fabricate(:status, uri: 'https://domain.com/users/foo/12345', account: remote_account) } + let!(:local_status) { Fabricate(:status) } + let(:scheduled_announcement) { Fabricate(:announcement, text: "rebooting very soon, see #{ActivityPub::TagManager.instance.uri_for(remote_status)} and #{ActivityPub::TagManager.instance.uri_for(local_status)}") } + + describe 'perform' do + before do + service = double + allow(FetchRemoteStatusService).to receive(:new).and_return(service) + allow(service).to receive(:call).with('https://domain.com/users/foo/12345') { remote_status.reload } + + subject.perform(scheduled_announcement.id) + end + + it 'updates the linked statuses' do + expect(scheduled_announcement.reload.status_ids).to eq [remote_status.id, local_status.id] + end + end +end diff --git a/yarn.lock b/yarn.lock index 6c8bcf549..b8ea0f369 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,25 +16,25 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" - integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" + integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== -"@babel/core@^7.1.0", "@babel/core@^7.14.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" - integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== +"@babel/core@^7.1.0", "@babel/core@^7.14.3", "@babel/core@^7.7.2", "@babel/core@^7.7.5": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.0" + "@babel/generator" "^7.14.3" "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-module-transforms" "^7.14.2" "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.0" + "@babel/parser" "^7.14.3" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -42,12 +42,12 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.0.tgz#0f35d663506c43e4f10898fbda0d752ec75494be" - integrity sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.14.0" + "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" @@ -81,37 +81,38 @@ "@babel/helper-annotate-as-pure" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" + integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== dependencies: - "@babel/compat-data" "^7.13.15" + "@babel/compat-data" "^7.14.4" "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" - integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz#832111bcf4f57ca57a4c5b1a000fc125abc6554a" + integrity sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.14.3" "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-class-features-plugin@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.0.tgz#38367d3dab125b12f94273de418f4df23a11a15e" - integrity sha512-6pXDPguA5zC40Y8oI5mqr+jEUpjMJonKvknvA+vD8CYDz5uuXEwWBK8sRAsE/t3gfb1k15AQb9RhwpscC4nUJQ== +"@babel/helper-create-class-features-plugin@^7.14.3": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" + integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": @@ -152,6 +153,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.14.2" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -174,13 +184,6 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-member-expression-to-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" - integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== - dependencies: - "@babel/types" "^7.13.0" - "@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" @@ -195,10 +198,10 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" - integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12" @@ -206,8 +209,8 @@ "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -240,16 +243,6 @@ "@babel/traverse" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-replace-supers@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" - integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - "@babel/helper-replace-supers@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" @@ -260,6 +253,26 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" +"@babel/helper-replace-supers@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" + integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" + +"@babel/helper-replace-supers@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" + integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.4" + "@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" @@ -324,10 +337,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.0", "@babel/parser@^7.7.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.0.tgz#2f0ebfed92bcddcc8395b91f1895191ce2760380" - integrity sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.7.0": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" + integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" @@ -338,10 +351,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== +"@babel/plugin-proposal-async-generator-functions@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" + integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" @@ -355,94 +368,95 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-class-static-block@^7.13.11": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz#6fcbba4a962702c17e5371a0c7b39afde186d703" - integrity sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg== +"@babel/plugin-proposal-class-static-block@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" + integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.3" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-class-static-block" "^7.12.13" -"@babel/plugin-proposal-decorators@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" - integrity sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA== +"@babel/plugin-proposal-decorators@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz#e68c3c5e4a6a08834456568256fc3e71b93590cf" + integrity sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.11" + "@babel/helper-create-class-features-plugin" "^7.14.2" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-dynamic-import@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" + integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" + integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" + integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" + integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" + integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" + integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz#0e2b4de419915dc0b409378e829412e2031777c4" + integrity sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" + integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" + integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" @@ -623,23 +637,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz#ac1b3a8e3d8cbb31efc6b9be2f74eb9823b74ab2" - integrity sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA== +"@babel/plugin-transform-block-scoping@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8" + integrity sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-classes@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz#a83c15503fc71a0f99e876fdce7dadbc6575ec3a" + integrity sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" @@ -650,10 +664,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== +"@babel/plugin-transform-destructuring@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz#acbec502e9951f30f4441eaca1d2f29efade59ed" + integrity sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -709,12 +723,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz#589494b5b290ff76cf7f59c798011f6d77026553" - integrity sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ== +"@babel/plugin-transform-modules-amd@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" + integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== dependencies: - "@babel/helper-module-transforms" "^7.14.0" + "@babel/helper-module-transforms" "^7.14.2" "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" @@ -769,10 +783,10 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" + integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -838,10 +852,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-runtime@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" - integrity sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA== +"@babel/plugin-transform-runtime@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz#1fd885a2d0de1d3c223795a4e9be72c2db4515cf" + integrity sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-plugin-utils" "^7.13.0" @@ -901,28 +915,28 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/preset-env@^7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.1.tgz#b55914e2e68885ea03f69600b2d3537e54574a93" - integrity sha512-0M4yL1l7V4l+j/UHvxcdvNfLB9pPtIooHTbEhgD/6UGyh8Hy3Bm1Mj0buzjDXATCSz3JFibVdnoJZCrlUCanrQ== +"@babel/preset-env@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d" + integrity sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA== dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-option" "^7.12.17" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-async-generator-functions" "^7.14.2" "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-class-static-block" "^7.13.11" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-class-static-block" "^7.14.3" + "@babel/plugin-proposal-dynamic-import" "^7.14.2" + "@babel/plugin-proposal-export-namespace-from" "^7.14.2" + "@babel/plugin-proposal-json-strings" "^7.14.2" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" + "@babel/plugin-proposal-numeric-separator" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" + "@babel/plugin-proposal-optional-chaining" "^7.14.2" "@babel/plugin-proposal-private-methods" "^7.13.0" "@babel/plugin-proposal-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" @@ -943,10 +957,10 @@ "@babel/plugin-transform-arrow-functions" "^7.13.0" "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.14.1" - "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-block-scoping" "^7.14.4" + "@babel/plugin-transform-classes" "^7.14.4" "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.17" + "@babel/plugin-transform-destructuring" "^7.14.4" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" @@ -954,14 +968,14 @@ "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.14.0" + "@babel/plugin-transform-modules-amd" "^7.14.2" "@babel/plugin-transform-modules-commonjs" "^7.14.0" "@babel/plugin-transform-modules-systemjs" "^7.13.8" "@babel/plugin-transform-modules-umd" "^7.14.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" "@babel/plugin-transform-property-literals" "^7.12.13" "@babel/plugin-transform-regenerator" "^7.13.15" "@babel/plugin-transform-reserved-words" "^7.12.13" @@ -973,7 +987,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.1" + "@babel/types" "^7.14.4" babel-plugin-polyfill-corejs2 "^0.2.0" babel-plugin-polyfill-corejs3 "^0.2.0" babel-plugin-polyfill-regenerator "^0.2.0" @@ -1018,7 +1032,7 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== @@ -1034,24 +1048,24 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.13", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.7.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" - integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.13", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.7.0": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.0" - "@babel/helper-function-name" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.4", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.1", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" - integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.4", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" + integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== dependencies: "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" @@ -1069,10 +1083,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@emotion/cache@^11.0.0", "@emotion/cache@^11.1.3": - version "11.1.3" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.1.3.tgz#c7683a9484bcd38d5562f2b9947873cf66829afd" - integrity sha512-n4OWinUPJVaP6fXxWZD9OUeQ0lY7DvtmtSuqtRWT0Ofo/sBLCVSgb4/Oa0Q5eFxcwablRKjUXqXtNZVyEwCAuA== +"@emotion/cache@^11.1.3", "@emotion/cache@^11.4.0": + version "11.4.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0" + integrity sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g== dependencies: "@emotion/memoize" "^0.7.4" "@emotion/sheet" "^1.0.0" @@ -1347,6 +1361,27 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.2.tgz#b073b7c589e3f4b842102468875def2bb722d6b5" + integrity sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.0.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.0.2" + jest-regex-util "^27.0.1" + jest-util "^27.0.2" + micromatch "^4.0.4" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/types@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" @@ -1368,6 +1403,17 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.0.2.tgz#e153d6c46bda0f2589f0702b071f9898c7bbd37e" + integrity sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@npmcli/move-file@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" @@ -1427,10 +1473,10 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^11.2.6": - version "11.2.6" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.6.tgz#586a23adc63615985d85be0c903f374dab19200b" - integrity sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ== +"@testing-library/react@^11.2.7": + version "11.2.7" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" + integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^7.28.1" @@ -1440,10 +1486,10 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7": + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1647,6 +1693,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01" + integrity sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ== + dependencies: + "@types/yargs-parser" "*" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1911,6 +1964,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -2085,13 +2148,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" array.prototype.flatmap@^1.2.4: version "1.2.4" @@ -2246,6 +2310,20 @@ babel-jest@^26.6.3: graceful-fs "^4.2.4" slash "^3.0.0" +babel-jest@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.2.tgz#7dc18adb01322acce62c2af76ea2c7cd186ade37" + integrity sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q== + dependencies: + "@jest/transform" "^27.0.2" + "@jest/types" "^27.0.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^27.0.1" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -2284,6 +2362,16 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz#a6d10e484c93abff0f4e95f437dad26e5736ea11" + integrity sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + babel-plugin-lodash@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" @@ -2381,6 +2469,14 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz#7a50c75d16647c23a2cf5158d5bb9eb206b10e20" + integrity sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA== + dependencies: + babel-plugin-jest-hoist "^27.0.1" + babel-preset-current-node-syntax "^1.0.0" + babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -2618,37 +2714,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== - dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" - -browserslist@^4.14.5: - version "4.14.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" - integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.3, browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001157" - colorette "^1.2.1" - electron-to-chromium "^1.3.591" - escalade "^3.1.1" - node-releases "^1.1.66" - -browserslist@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== - dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.71" bser@2.1.1: version "2.1.1" @@ -2816,7 +2891,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== @@ -2831,20 +2906,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: - version "1.0.30001143" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001143.tgz#560f2cfb9f313d1d7e52eb8dac0e4e36c8821c0d" - integrity sha512-p/PO5YbwmCpBJPxjOiKBvAlUPgF8dExhfEpnsH+ys4N/791WHrYrGg0cyHiAURl5hSbx5vIcjKmQAP6sHDYH3w== - -caniuse-lite@^1.0.30001157: - version "1.0.30001159" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz#bebde28f893fa9594dadcaa7d6b8e2aa0299df20" - integrity sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA== - -caniuse-lite@^1.0.30001181: - version "1.0.30001191" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" - integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== capture-exit@^2.0.0: version "2.0.0" @@ -2955,6 +3020,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -3118,12 +3188,7 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== - -colorette@^1.2.2: +colorette@^1.2.1, colorette@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== @@ -3221,11 +3286,6 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -3441,15 +3501,14 @@ css-list-helpers@^1.0.1: dependencies: tcomb "^2.5.0" -css-loader@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.4.tgz#e985dcbce339812cb6104ef3670f08f9893a1536" - integrity sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw== +css-loader@^5.2.6: + version "5.2.6" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.6.tgz#c3c82ab77fea1f360e587d871a6811f4450cc8d1" + integrity sha512-0wyN5vXMQZu6BvjbrPdUJvkCzGEO24HC7IS7nW4llc6BBFC+zwR9CKtYGv63Puzsg10L/o12inMY5/2ByzfD6w== dependencies: - camelcase "^6.2.0" icss-utils "^5.1.0" loader-utils "^2.0.0" - postcss "^8.2.10" + postcss "^8.2.15" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" @@ -3661,7 +3720,7 @@ debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.1.1, debug@^3.2.6: +debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -3852,9 +3911,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -3866,7 +3925,7 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -doctrine@1.5.0, doctrine@^1.2.2: +doctrine@^1.2.2: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= @@ -3953,10 +4012,10 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dotenv@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.1.tgz#a889a28a3a515812dde1e7f8183ef5cdf3186b97" - integrity sha512-W8FNeNnnvJoYfgkFRKzp8kTgz0T2YY4TJ9xy1Ma0hSebPTK8iquRtpG12TUrSTX5zIN9D/wSLEEuI+Ad35tlyw== +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== duplexer@^0.1.2: version "0.1.2" @@ -3991,20 +4050,10 @@ ejs@^2.3.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.571: - version "1.3.574" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.574.tgz#bdd87f62fe70165e5c862a0acf0cee9889e23aa3" - integrity sha512-kF8Bfe1h8X1pPwlw6oRoIXj0DevowviP6fl0wcljm+nZjy/7+Fos4THo1N/7dVGEJlyEqK9C8qNnbheH+Eazfw== - -electron-to-chromium@^1.3.591: - version "1.3.603" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz#1b71bec27fb940eccd79245f6824c63d5f7e8abf" - integrity sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ== - -electron-to-chromium@^1.3.649: - version "1.3.672" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a" - integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw== +electron-to-chromium@^1.3.723: + version "1.3.736" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052" + integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig== elliptic@^6.5.3: version "6.5.4" @@ -4024,9 +4073,13 @@ emittery@^0.7.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== -emoji-mart@Gargron/emoji-mart#build: - version "2.6.3" - resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/934f314fd8322276765066e8a2a6be5bac61b1cf" +emoji-mart@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-3.0.1.tgz#9ce86706e02aea0506345f98464814a662ca54c6" + integrity sha512-sxpmMKxqLvcscu6mFn9ITHeZNkGzIvD0BSNFE/LJESPbCA8s1jM6bCDPjWbV31xHq7JXaxgpHxLB54RCbBZSlg== + dependencies: + "@babel/runtime" "^7.0.0" + prop-types "^15.6.0" emoji-regex@^7.0.1: version "7.0.3" @@ -4093,7 +4146,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -4144,6 +4197,28 @@ es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next string.prototype.trimend "^1.0.3" string.prototype.trimstart "^1.0.3" +es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -4220,7 +4295,7 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.0, escalade@^3.1.1: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== @@ -4240,6 +4315,11 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^1.14.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -4270,31 +4350,33 @@ eslint-import-resolver-node@^0.3.4: debug "^2.6.9" resolve "^1.13.1" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== dependencies: - debug "^2.6.9" + debug "^3.2.7" pkg-dir "^2.0.0" -eslint-plugin-import@~2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== +eslint-plugin-import@~2.23.4: + version "2.23.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" + integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" debug "^2.6.9" - doctrine "1.5.0" + doctrine "^2.1.0" eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" + eslint-module-utils "^2.6.1" + find-up "^2.0.0" has "^1.0.3" + is-core-module "^2.4.0" minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" tsconfig-paths "^3.9.0" eslint-plugin-jsx-a11y@~6.4.1: @@ -4319,10 +4401,10 @@ eslint-plugin-promise@~5.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz#fb2188fb734e4557993733b41aa1a688f46c6f24" integrity sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng== -eslint-plugin-react@~7.23.2: - version "7.23.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz#2d2291b0f95c03728b55869f01102290e792d494" - integrity sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw== +eslint-plugin-react@~7.24.0: + version "7.24.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz#eadedfa351a6f36b490aa17f4fa9b14e842b9eb4" + integrity sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q== dependencies: array-includes "^3.1.3" array.prototype.flatmap "^1.2.4" @@ -4330,12 +4412,12 @@ eslint-plugin-react@~7.23.2: has "^1.0.3" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.0.4" - object.entries "^1.1.3" + object.entries "^1.1.4" object.fromentries "^2.0.4" - object.values "^1.1.3" + object.values "^1.1.4" prop-types "^15.7.2" resolve "^2.0.0-next.3" - string.prototype.matchall "^4.0.4" + string.prototype.matchall "^4.0.5" eslint-scope@^4.0.3: version "4.0.3" @@ -4409,10 +4491,10 @@ eslint@^2.7.0: text-table "~0.2.0" user-home "^2.0.0" -eslint@^7.26.0: - version "7.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6" - integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== +eslint@^7.27.0: + version "7.27.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" + integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.1" @@ -4422,12 +4504,14 @@ eslint@^7.26.0: debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" esquery "^1.4.0" esutils "^2.0.2" + fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" @@ -4439,7 +4523,7 @@ eslint@^7.26.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -4448,7 +4532,7 @@ eslint@^7.26.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -4708,7 +4792,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -5008,7 +5092,7 @@ fsevents@^2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -fsevents@~2.3.1: +fsevents@^2.3.2, fsevents@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5257,6 +5341,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -5277,6 +5366,11 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5819,6 +5913,11 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -5833,11 +5932,23 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -5845,6 +5956,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" + is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -5857,10 +5975,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0, is-core-module@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -5998,6 +6116,11 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6065,6 +6188,14 @@ is-regex@^1.1.1: dependencies: has-symbols "^1.0.1" +is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -6085,6 +6216,11 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -6092,6 +6228,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -6338,6 +6481,26 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" +jest-haste-map@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.2.tgz#3f1819400c671237e48b4d4b76a80a0dbed7577f" + integrity sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA== + dependencies: + "@jest/types" "^27.0.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^27.0.1" + jest-serializer "^27.0.1" + jest-util "^27.0.2" + jest-worker "^27.0.2" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + jest-jasmine2@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" @@ -6413,6 +6576,11 @@ jest-regex-util@^26.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz#69d4b1bf5b690faa3490113c47486ed85dd45b68" + integrity sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ== + jest-resolve-dependencies@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" @@ -6503,6 +6671,14 @@ jest-serializer@^26.6.2: "@types/node" "*" graceful-fs "^4.2.4" +jest-serializer@^27.0.1: + version "27.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.1.tgz#2464d04dcc33fb71dc80b7c82e3c5e8a08cb1020" + integrity sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + jest-snapshot@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" @@ -6537,6 +6713,18 @@ jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" +jest-util@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.2.tgz#fc2c7ace3c75ae561cf1e5fdb643bf685a5be7c7" + integrity sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA== + dependencies: + "@jest/types" "^27.0.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^3.0.0" + picomatch "^2.2.3" + jest-validate@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" @@ -6580,6 +6768,15 @@ jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05" + integrity sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" @@ -6671,6 +6868,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -6832,14 +7034,14 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" + parse-json "^4.0.0" + pify "^3.0.0" strip-bom "^3.0.0" loader-runner@^2.4.0: @@ -6910,6 +7112,11 @@ lodash.capitalize@^4.1.0: resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -6955,11 +7162,21 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -7137,6 +7354,14 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7345,10 +7570,10 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== -nanoid@^3.1.22: - version "3.1.22" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" - integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== +nanoid@^3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== nanomatch@^1.2.9: version "1.2.13" @@ -7458,20 +7683,10 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== - -node-releases@^1.1.66: - version "1.1.67" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" - integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== - -node-releases@^1.1.70: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" @@ -7575,6 +7790,11 @@ object-fit-images@^3.2.3: resolved "https://registry.yarnpkg.com/object-fit-images/-/object-fit-images-3.2.4.tgz#6c299d38fdf207746e5d2d46c2877f6f25d15b52" integrity sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg== +object-inspect@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" @@ -7625,15 +7845,14 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== +object.entries@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.18.2" object.fromentries@^2.0.4: version "2.0.4" @@ -7660,15 +7879,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== +object.values@^1.1.0, object.values@^1.1.3, object.values@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.18.2" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -7908,13 +8126,6 @@ parse-css-font@^2.0.2: tcomb "^2.5.0" unquote "^1.1.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -8015,12 +8226,12 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: - pify "^2.0.0" + pify "^3.0.0" path-type@^4.0.0: version "4.0.0" @@ -8104,11 +8315,21 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -8154,6 +8375,13 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" @@ -8531,14 +8759,14 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.2.10: - version "8.2.10" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.10.tgz#ca7a042aa8aff494b334d0ff3e9e77079f6f702b" - integrity sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw== +postcss@^8.2.15: + version "8.3.0" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f" + integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ== dependencies: colorette "^1.2.2" - nanoid "^3.1.22" - source-map "^0.6.1" + nanoid "^3.1.23" + source-map-js "^0.6.2" postgres-array@~2.0.0: version "2.0.0" @@ -8975,13 +9203,13 @@ react-router@^4.3.1: prop-types "^15.6.1" warning "^4.0.1" -react-select@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-4.3.0.tgz#6bde634ae7a378b49f3833c85c126f533483fa2e" - integrity sha512-SBPD1a3TJqE9zoI/jfOLCAoLr/neluaeokjOixr3zZ1vHezkom8K0A9J4QG9IWDqIDE9K/Mv+0y1GjidC2PDtQ== +react-select@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-4.3.1.tgz#389fc07c9bc7cf7d3c377b7a05ea18cd7399cb81" + integrity sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q== dependencies: "@babel/runtime" "^7.12.0" - "@emotion/cache" "^11.0.0" + "@emotion/cache" "^11.4.0" "@emotion/react" "^11.1.1" memoize-one "^5.0.0" prop-types "^15.6.0" @@ -8995,35 +9223,35 @@ react-sparklines@^1.7.0: dependencies: prop-types "^15.5.10" -react-swipeable-views-core@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz#c082b553f26e83fd20fc17f934200eb717023c8a" - integrity sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w== +react-swipeable-views-core@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.14.0.tgz#6ac443a7cc7bc5ea022fbd549292bb5fff361cce" + integrity sha512-0W/e9uPweNEOSPjmYtuKSC/SvKKg1sfo+WtPdnxeLF3t2L82h7jjszuOHz9C23fzkvLfdgkaOmcbAxE9w2GEjA== dependencies: "@babel/runtime" "7.0.0" warning "^4.0.1" -react-swipeable-views-utils@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz#a66e98f2f4502d8b00182901f80d13b2f903e10f" - integrity sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw== +react-swipeable-views-utils@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.14.0.tgz#6b76e251906747482730c22002fe47ab1014ba32" + integrity sha512-W+fXBOsDqgFK1/g7MzRMVcDurp3LqO3ksC8UgInh2P/tKgb5DusuuB1geKHFc6o1wKl+4oyER4Zh3Lxmr8xbXA== dependencies: "@babel/runtime" "7.0.0" keycode "^2.1.7" prop-types "^15.6.0" react-event-listener "^0.6.0" - react-swipeable-views-core "^0.13.7" + react-swipeable-views-core "^0.14.0" shallow-equal "^1.2.1" -react-swipeable-views@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz#d6a6c508bf5288ad55509f9c65916db5df0f2cec" - integrity sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg== +react-swipeable-views@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.14.0.tgz#149c0df3d92220cc89e3f6d5c04a78dfe46f9b54" + integrity sha512-wrTT6bi2nC3JbmyNAsPXffUXLn0DVT9SbbcFr36gKpbaCgEp7rX/OFxsu5hPc/NBsUhHyoSRGvwqJNNrWTwCww== dependencies: "@babel/runtime" "7.0.0" prop-types "^15.5.4" - react-swipeable-views-core "^0.13.7" - react-swipeable-views-utils "^0.13.9" + react-swipeable-views-core "^0.14.0" + react-swipeable-views-utils "^0.14.0" warning "^4.0.1" react-test-renderer@^16.14.0: @@ -9081,13 +9309,13 @@ react@^16.14.0: object-assign "^4.1.1" prop-types "^15.6.2" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" - read-pkg "^2.0.0" + read-pkg "^3.0.0" read-pkg-up@^7.0.1: version "7.0.1" @@ -9098,14 +9326,14 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: - load-json-file "^2.0.0" + load-json-file "^4.0.0" normalize-package-data "^2.3.2" - path-type "^2.0.0" + path-type "^3.0.0" read-pkg@^5.2.0: version "5.2.0" @@ -9465,7 +9693,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -9619,10 +9847,10 @@ sass-lint@^1.13.1: path-is-absolute "^1.0.0" util "^0.10.3" -sass-loader@^10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" - integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== +sass-loader@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" + integrity sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw== dependencies: klona "^2.0.4" loader-utils "^2.0.0" @@ -9630,10 +9858,10 @@ sass-loader@^10.1.1: schema-utils "^3.0.0" semver "^7.3.2" -sass@^1.32.12: - version "1.32.12" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.12.tgz#a2a47ad0f1c168222db5206444a30c12457abb9f" - integrity sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA== +sass@^1.34.0: + version "1.34.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.34.0.tgz#e46d5932d8b0ecc4feb846d861f26a578f7f7172" + integrity sha512-rHEN0BscqjUYuomUEaqq3BMgsXqQfkcMVR7UhscsAVub0/spUrZGBMxQXFS2kfiDsPLZw5yuU9iJEFNC2x38Qw== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -9979,6 +10207,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -10262,15 +10495,16 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" - integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== +string.prototype.matchall@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has-symbols "^1.0.1" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" internal-slot "^1.0.3" regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" @@ -10283,7 +10517,7 @@ string.prototype.trimend@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" -string.prototype.trimend@^1.0.3: +string.prototype.trimend@^1.0.3, string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== @@ -10299,7 +10533,7 @@ string.prototype.trimstart@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.3: +string.prototype.trimstart@^1.0.3, string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== @@ -10450,6 +10684,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" @@ -10494,15 +10735,17 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -table@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" - integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: - ajv "^6.12.4" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^1.0, tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -10877,6 +11120,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -11220,10 +11473,10 @@ webpack-assets-manifest@^4.0.6: tapable "^1.0" webpack-sources "^1.0" -webpack-bundle-analyzer@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz#c71fb2eaffc10a4754d7303b224adb2342069da1" - integrity sha512-j5m7WgytCkiVBoOGavzNokBOqxe6Mma13X1asfVYtKWM3wxBiRRu1u1iG0Iol5+qp9WgyhkMmBAcvjEfJ2bdDw== +webpack-bundle-analyzer@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz#39898cf6200178240910d629705f0f3493f7d666" + integrity sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ== dependencies: acorn "^8.0.4" acorn-walk "^8.0.0" @@ -11399,6 +11652,17 @@ whatwg-url@^8.0.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -11503,10 +11767,10 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.2.3, ws@^7.3.1, ws@^7.4.5: - version "7.4.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" - integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== +ws@^7.2.3, ws@^7.3.1, ws@^7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xml-name-validator@^3.0.0: version "3.0.0"