From ac588daf37784d5f7260577d404605e85f2df56f Mon Sep 17 00:00:00 2001 From: Dennis Kamau <97116157+devcamke@users.noreply.github.com> Date: Mon, 1 Jan 2024 22:08:01 +0300 Subject: [PATCH 01/27] Update copyright year to 2024 (#28550) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b22d61b5e..267f0ed295 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ You can open issues for bugs you've found or features you think are missing. You ## License -Copyright (C) 2016-2023 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md)) +Copyright (C) 2016-2024 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md)) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. From c652b0e46b6655366d976e8e18b92c63b734b91b Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Tue, 2 Jan 2024 02:47:38 -0600 Subject: [PATCH 02/27] Add wget to base Dockerfile (#28548) --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 4d5bd57f11..96f8b5cd27 100644 --- a/Dockerfile +++ b/Dockerfile @@ -103,6 +103,7 @@ RUN \ procps \ tini \ tzdata \ + wget \ ; \ # Patch Ruby to use jemalloc patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \ From e082a98b4d2b3adc8cd4172a51ee53000af4eaab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:50:08 +0100 Subject: [PATCH 03/27] Update dependency mime-types to v3.5.2 (#28556) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8e25f302bc..08b9fc0de4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -457,9 +457,9 @@ GEM azure-storage-blob (~> 2.0.1) hashie (~> 5.0) memory_profiler (1.0.1) - mime-types (3.5.1) + mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2023.1003) + mime-types-data (3.2023.1205) mini_mime (1.1.5) mini_portile2 (2.8.5) minitest (5.20.0) From 663a7b6ba91b5d10944f8555aca3fb99e009e0ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 08:50:29 +0000 Subject: [PATCH 04/27] Update devDependencies (non-major) (#28543) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 107 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 48 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1baa0da058..298ffd4eea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,10 +12,10 @@ __metadata: languageName: node linkType: hard -"@adobe/css-tools@npm:^4.3.1": - version: 4.3.1 - resolution: "@adobe/css-tools@npm:4.3.1" - checksum: 05672719b544cc0c21ae3ed0eb6349bf458e9d09457578eeeb07cf0f696469ac6417e9c9be1b129e5d6a18098a061c1db55b2275591760ef30a79822436fcbfa +"@adobe/css-tools@npm:^4.3.2": + version: 4.3.2 + resolution: "@adobe/css-tools@npm:4.3.2" + checksum: 296a03dd29f227c60500d2da8c7f64991fecf1d8b456ce2b4adb8cec7363d9c08b5b03f1463673fc8cbfe54b538745588e7a13c736d2dd14a80c01a20f127f39 languageName: node linkType: hard @@ -1539,38 +1539,38 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.3.2": - version: 2.3.2 - resolution: "@csstools/css-parser-algorithms@npm:2.3.2" +"@csstools/css-parser-algorithms@npm:^2.4.0": + version: 2.5.0 + resolution: "@csstools/css-parser-algorithms@npm:2.5.0" peerDependencies: - "@csstools/css-tokenizer": ^2.2.1 - checksum: ccae373a3ab5c10716418b69ce1f6db10a26d3a2d60b65df5fe69099afe4fb1d3192925f3c0f93c3b17c3ab1964b0f39ad2b0e97312ec4a51caa55d6b6a31672 + "@csstools/css-tokenizer": ^2.2.3 + checksum: 31b4a523d956e204af9842183678cca5a88ad76551d54dcb6083f8a6f2dfd8fdec6c09bca5410842af54b90997308bebee7593c17dbc1a4e951453b54bd3f024 languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.1": - version: 2.2.1 - resolution: "@csstools/css-tokenizer@npm:2.2.1" - checksum: 0c6901d291e99c567893846a47068057c2a28b3edc4219b6da589a530f55f51ddd4675f906f707b393bfe7a508ab2604bf3f75708f064db857bb277636bd5a44 +"@csstools/css-tokenizer@npm:^2.2.2": + version: 2.2.3 + resolution: "@csstools/css-tokenizer@npm:2.2.3" + checksum: 557266ec52e8b36c19008a5bbd7151effba085cdd6d68270c01afebf914981caac698eda754b2a530a8a9947a3dd70e3f3a39a5e037c4170bb2a055a92754acb languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.5": - version: 2.1.5 - resolution: "@csstools/media-query-list-parser@npm:2.1.5" +"@csstools/media-query-list-parser@npm:^2.1.6": + version: 2.1.7 + resolution: "@csstools/media-query-list-parser@npm:2.1.7" peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 - checksum: ae0692c6f92cdc82053291c7a50028b692094dfed795f0259571c5eb40f4b3fa580182ac3701e56c2834e40a62a122ea6639299e43ae88b3a835ae4c869a1a12 + "@csstools/css-parser-algorithms": ^2.5.0 + "@csstools/css-tokenizer": ^2.2.3 + checksum: 433aef06b00f1d402fd24074a1919b8e2de94245a3b780da6466c8cc9e0f3cc93d2db930f0fce36c7d6908cd50b626cd61e803d3f62dddad79eeb742858028ef languageName: node linkType: hard -"@csstools/selector-specificity@npm:^3.0.0": - version: 3.0.0 - resolution: "@csstools/selector-specificity@npm:3.0.0" +"@csstools/selector-specificity@npm:^3.0.1": + version: 3.0.1 + resolution: "@csstools/selector-specificity@npm:3.0.1" peerDependencies: postcss-selector-parser: ^6.0.13 - checksum: 6f0e2fa9a3c5dcbc7a446fd827d3eb85ca775cc884f73f0bbb119ab49b4f5f0af8763dd23a37d423f4e7989069c09bb977e7e5f017db296e1417abb1fba75c30 + checksum: 4280f494726d5e38de74e28dee2ff74ec86244560dff4edeec3ddff3ac73c774c19535bd1bb70cad77949bfb359cf87e977d0ec3264591e3b7260342a20dd84f languageName: node linkType: hard @@ -2894,10 +2894,10 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.1.5 - resolution: "@testing-library/jest-dom@npm:6.1.5" + version: 6.1.6 + resolution: "@testing-library/jest-dom@npm:6.1.6" dependencies: - "@adobe/css-tools": "npm:^4.3.1" + "@adobe/css-tools": "npm:^4.3.2" "@babel/runtime": "npm:^7.9.2" aria-query: "npm:^5.0.0" chalk: "npm:^3.0.0" @@ -2919,7 +2919,7 @@ __metadata: optional: true vitest: optional: true - checksum: f3643a56fcd970b5c7e8fd10faf3c4817d8ab0e74fb1198d726643bdc5ac675ceaac3b0068c5b4fbad254470e8f98ed50028741de875a29ceaa2f854570979c9 + checksum: f98f79f3e470517469c86947d0ff1bb83ac2e59fd2a29728ab306eca5fba63c948084ec06b7b531642e6002d1f0211d918c298c628f0d386c0ef63ba881c47ba languageName: node linkType: hard @@ -7940,12 +7940,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^7.0.2": - version: 7.0.2 - resolution: "file-entry-cache@npm:7.0.2" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.2.0" - checksum: 822664e35c3e295e6a8ca7ec490d8d8077017607f41f94b29922f1f49c6dd07025048e3ed528e2909a1439eba66d60f802c0774aa612cf6ee053ee4ecc16c8c5 + flat-cache: "npm:^4.0.0" + checksum: 9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 languageName: node linkType: hard @@ -8079,7 +8079,7 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": +"flat-cache@npm:^3.0.4": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" dependencies: @@ -8090,6 +8090,17 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^4.0.0": + version: 4.0.0 + resolution: "flat-cache@npm:4.0.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + rimraf: "npm:^5.0.5" + checksum: 8f99e27bb3de94e91e7b4ca5120488cdc2b7f8cd952a538f1a566101963057eb42ca318e9fac0d36987dcca34316ff04b61c1dc3dcc8084f6f5e801a52a8e547 + languageName: node + linkType: hard + "flat@npm:^5.0.2": version: 5.0.2 resolution: "flat@npm:5.0.2" @@ -10737,7 +10748,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -11265,10 +11276,10 @@ __metadata: languageName: node linkType: hard -"meow@npm:^12.1.1": - version: 12.1.1 - resolution: "meow@npm:12.1.1" - checksum: a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 +"meow@npm:^13.0.0": + version: 13.0.0 + resolution: "meow@npm:13.0.0" + checksum: fab0f91578154c048e792a81704f3f28099ffff900f364df8a85f6e770a57e1c124859a25e186186e149dad30692c7893af0dfd71517bea343bfe5d749b1fa04 languageName: node linkType: hard @@ -14344,7 +14355,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^5.0.1": +"rimraf@npm:^5.0.1, rimraf@npm:^5.0.5": version: 5.0.5 resolution: "rimraf@npm:5.0.5" dependencies: @@ -15609,13 +15620,13 @@ __metadata: linkType: hard "stylelint@npm:^16.0.2": - version: 16.0.2 - resolution: "stylelint@npm:16.0.2" + version: 16.1.0 + resolution: "stylelint@npm:16.1.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.3.2" - "@csstools/css-tokenizer": "npm:^2.2.1" - "@csstools/media-query-list-parser": "npm:^2.1.5" - "@csstools/selector-specificity": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^2.4.0" + "@csstools/css-tokenizer": "npm:^2.2.2" + "@csstools/media-query-list-parser": "npm:^2.1.6" + "@csstools/selector-specificity": "npm:^3.0.1" balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" cosmiconfig: "npm:^9.0.0" @@ -15624,7 +15635,7 @@ __metadata: debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^7.0.2" + file-entry-cache: "npm:^8.0.0" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" @@ -15634,7 +15645,7 @@ __metadata: is-plain-object: "npm:^5.0.0" known-css-properties: "npm:^0.29.0" mathml-tag-names: "npm:^2.1.3" - meow: "npm:^12.1.1" + meow: "npm:^13.0.0" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.0" @@ -15652,7 +15663,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 5ec755e209beb1877ff40d50f18c1ebb05bf251925da1f98f28fb3911e4031195eb86adaf641ac5cdb01ba973f4c999bc0c6b0270d08c1d5c070adbdd9e734cf + checksum: 765eea0b07319d1e7989502c07b8b5794938e5a8542bec00990b09ec10c3f7006891689930099e948d06c9ef9982066edb98b1ea64a435138a6b0f0905eb2b87 languageName: node linkType: hard From 629152a80d170cd08fa81b850488f2e6295f6fa0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:50:45 +0100 Subject: [PATCH 05/27] Update DefinitelyTyped types (non-major) (#28542) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 24832bb596..7b09178adb 100644 --- a/package.json +++ b/package.json @@ -166,7 +166,7 @@ "@types/react-dom": "^18.2.4", "@types/react-helmet": "^6.1.6", "@types/react-immutable-proptypes": "^2.1.0", - "@types/react-motion": "^0.0.39", + "@types/react-motion": "^0.0.40", "@types/react-overlays": "^3.1.0", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", diff --git a/yarn.lock b/yarn.lock index 298ffd4eea..2e246ae5e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2323,7 +2323,7 @@ __metadata: "@types/react-dom": "npm:^18.2.4" "@types/react-helmet": "npm:^6.1.6" "@types/react-immutable-proptypes": "npm:^2.1.0" - "@types/react-motion": "npm:^0.0.39" + "@types/react-motion": "npm:^0.0.40" "@types/react-overlays": "npm:^3.1.0" "@types/react-router": "npm:^5.1.20" "@types/react-router-dom": "npm:^5.3.3" @@ -3379,12 +3379,12 @@ __metadata: languageName: node linkType: hard -"@types/react-motion@npm:^0.0.39": - version: 0.0.39 - resolution: "@types/react-motion@npm:0.0.39" +"@types/react-motion@npm:^0.0.40": + version: 0.0.40 + resolution: "@types/react-motion@npm:0.0.40" dependencies: "@types/react": "npm:*" - checksum: 0dfcde777576b3c3289b4dbf2a5085decf71aba6d543697f4c1069d02ed3b543792a253692bd98870af04112c92469328a4fdb93988f93af2e099de8f2c9bc2e + checksum: 8a560051be917833fdbe051185b53aeafbe8657968ac8e073ac874b9a55c6f16e3793748b13cfb9bd6d9a3d27aba116d6f8f296ec1950f4175dc94d17c5e8470 languageName: node linkType: hard @@ -3482,13 +3482,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.45 - resolution: "@types/react@npm:18.2.45" + version: 18.2.46 + resolution: "@types/react@npm:18.2.46" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 4cc650c47ffb88baac29fb7a74e842e4af4a55f437086ef70250fdc75f0a5f2fcf8adc272d05ab2e00b1de6e14613296881271caee037dadf9130fdeb498c59e + checksum: 814cc67107e5e69501d65bfc371cc2c716665d2a3608d395a2f81e24c3a2875db28e2cad717dfb17017eabcffd1d68ee2c9e09ecaba3f7108d5b7fbb9888ebab languageName: node linkType: hard From c2340682aa3db3d0c4b181f369074aeac9a2a139 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:51:58 +0100 Subject: [PATCH 06/27] Update babel monorepo to v7.23.7 (#28528) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 130 +++++++++++++++++++++++++++--------------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2e246ae5e9..1f21b80657 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,25 +60,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1": - version: 7.23.6 - resolution: "@babel/core@npm:7.23.6" + version: 7.23.7 + resolution: "@babel/core@npm:7.23.7" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.6" + "@babel/helpers": "npm:^7.23.7" "@babel/parser": "npm:^7.23.6" "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.6" + "@babel/traverse": "npm:^7.23.7" "@babel/types": "npm:^7.23.6" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: a02bae7d916029b70706dc301535e1b31e5d216f55d4ee6f64a15825c6b69ee2c14c52a213d1497ec414e925ed4e9d897d41fb0d75df9fea28ed2c0008790e31 + checksum: 38c9934973d384ed83369712978453eac91dc3f22167404dbdb272b64f602e74728a6f37012c53ee57e521b8ae2da60097f050497d9b6a212d28b59cdfb2cd1d languageName: node linkType: hard @@ -167,9 +167,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.3": - version: 0.4.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" +"@babel/helper-define-polyfill-provider@npm:^0.4.4": + version: 0.4.4 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.4" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -178,7 +178,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 0007035157e0d32ee9cb4ca319b89d6f3705523383efe52a59eb3d4dfa2ed08c5147e49c10a6e6d69c15221d89c76c8e5875475d6710fb44a5c37b8e69388e40 + checksum: 60126f5f719b9e2114df62e3bf3ac0797b71d8dc733db60192eb169b004fde72ee309fa5848c5fdfe98b8e8863c46f55e16da5aa8a4e420b4d2670cd0c5dd708 languageName: node linkType: hard @@ -342,14 +342,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helpers@npm:7.23.6" +"@babel/helpers@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/helpers@npm:7.23.7" dependencies: "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.6" + "@babel/traverse": "npm:^7.23.7" "@babel/types": "npm:^7.23.6" - checksum: df1cf6607676ad36f52f652ec03536f2732d70aef5e76dba5c964e34d49f3c2d3dcf9fb3740db359f53071d74b64606a833d5ba156f79f437f71bfe06e2e7e19 + checksum: f74a61ad28a1bc1fdd9133ad571c07787b66d6db017c707b87c203b0cd06879cea8b33e9c6a8585765a4949efa5df3cc9e19b710fe867f11be38ee29fd4a0488 languageName: node linkType: hard @@ -397,15 +397,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 0f43b74741d50e637ba4dcef2786621126fe4da6ccf4ee2e94423ee23f6a04ecd91d458e59764c43e4968be139e5197ee43be8a2fea2c09f0b202a3391e548cc + checksum: 355746e21ad7f43e4f4daef54cfe2ef461ecd19446b2afedd53c39df1bf9aa2eeeeaabee2279b1321de89a97c9360e4f76e9ba950fee50ff1676c25f6929d625 languageName: node linkType: hard @@ -661,9 +661,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.7" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -671,7 +671,7 @@ __metadata: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f2eef4de609975a3f7da7832576b5ffc93e43c80f87e1a99e886b0f8591096cfc4c37e2d5f52fdeaa2a9c09a25a59f3e621159abaca75d3193922a5c0e4cbe0c + checksum: 63d314edc9fbeaf2700745ca0e19bf9840e87f2d7d1f6c5638e06d2aec3e7418d0d7493ed09087e2fe369cc15e9d96c113fb2cd367cb5e3ff922e3712c27b7d4 languageName: node linkType: hard @@ -1201,18 +1201,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.4": - version: 7.23.6 - resolution: "@babel/plugin-transform-runtime@npm:7.23.6" + version: 7.23.7 + resolution: "@babel/plugin-transform-runtime@npm:7.23.7" dependencies: "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.6" - babel-plugin-polyfill-corejs3: "npm:^0.8.5" - babel-plugin-polyfill-regenerator: "npm:^0.5.3" + babel-plugin-polyfill-corejs2: "npm:^0.4.7" + babel-plugin-polyfill-corejs3: "npm:^0.8.7" + babel-plugin-polyfill-regenerator: "npm:^0.5.4" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 94a7ee92f073df53fd8bebf9ed391a95553716077da1c6c3a57f10f042358c938495d55e6b09b4b50544c01f03560c4770c17698e1c24817a15d3668e8231249 + checksum: 0d5038462a5762c3a88d820785f685ce1b659075527a3ad538647fd9ce486052777d5aea3d62e626639d60441a04dd0ded2ed32c86b92cf8afbdbd3d54460c13 languageName: node linkType: hard @@ -1334,8 +1334,8 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.23.6 - resolution: "@babel/preset-env@npm:7.23.6" + version: 7.23.7 + resolution: "@babel/preset-env@npm:7.23.7" dependencies: "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" @@ -1343,7 +1343,7 @@ __metadata: "@babel/helper-validator-option": "npm:^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" @@ -1364,7 +1364,7 @@ __metadata: "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.4" + "@babel/plugin-transform-async-generator-functions": "npm:^7.23.7" "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" "@babel/plugin-transform-block-scoping": "npm:^7.23.4" @@ -1412,14 +1412,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.6" - babel-plugin-polyfill-corejs3: "npm:^0.8.5" - babel-plugin-polyfill-regenerator: "npm:^0.5.3" + babel-plugin-polyfill-corejs2: "npm:^0.4.7" + babel-plugin-polyfill-corejs3: "npm:^0.8.7" + babel-plugin-polyfill-regenerator: "npm:^0.5.4" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5b24d179af52f082d04b9b98cc4777e37bf31a97cef5a91d8917e996dbd75f2f743c88c40f80744cb8529355bb674619d150c0260c32d834aa4067e21d0c8962 + checksum: ac9def873cec52ee02a550bde6e22eced16d1ae331bb8ebc82c03e4c91c12ac17e3e4027647e61612937bcc25ac46e71370aaf99dc2e85dbd11f7777ffeed54e languageName: node linkType: hard @@ -1484,11 +1484,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.23.6 - resolution: "@babel/runtime@npm:7.23.6" + version: 7.23.7 + resolution: "@babel/runtime@npm:7.23.7" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: d886954e985ef8e421222f7a2848884d96a752e0020d3078b920dd104e672fdf23bcc6f51a44313a048796319f1ac9d09c2c88ec8cbb4e1f09174bcd3335b9ff + checksum: 3e304133ee55b0750e03e53cb4efb47fb2bdcdb5795f85bbffa10595196c34b9be60eb65bd6d833c87f49fc827f0365f86f95f51d85b188004d3128bb5129c93 languageName: node linkType: hard @@ -1503,9 +1503,9 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/traverse@npm:7.23.6" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/traverse@npm:7.23.7" dependencies: "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" @@ -1517,7 +1517,7 @@ __metadata: "@babel/types": "npm:^7.23.6" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 5b4ebb94a00a7e1daf111e4b0b45a7998d5b7598637a14e75e855e88cc1b702789e09a958726b5d599a003be1e9032dbdfde4b88ea6061332228738950d5582d + checksum: e32fceb4249beec2bde83968ddffe17444221c1ee5cd18c543a2feaf94e3ca83f2a4dfbc2dcca87cf226e0105973e0fe3717063a21e982a9de9945615ab3f3f5 languageName: node linkType: hard @@ -4764,39 +4764,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.6": - version: 0.4.6 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" +"babel-plugin-polyfill-corejs2@npm:^0.4.7": + version: 0.4.7 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.7" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" + "@babel/helper-define-polyfill-provider": "npm:^0.4.4" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 64a98811f343492aa6970ab253760194e389c0417e5b830522f944009c1f0c78e1251975fd1b9869cd48cc4623111b20a3389cf6732a1d10ba0d19de6fa5114f + checksum: f80f7284ec72c63e7dd751e0bdf25e9978df195a79e0887470603bfdea13ee518d62573cf360bb1bc01b80819e54915dd5edce9cff14c52d0af5f984aa3d36a3 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.5": - version: 0.8.5 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" +"babel-plugin-polyfill-corejs3@npm:^0.8.7": + version: 0.8.7 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.7" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - core-js-compat: "npm:^3.32.2" + "@babel/helper-define-polyfill-provider": "npm:^0.4.4" + core-js-compat: "npm:^3.33.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 577a072971bda2929a87655c816ad14b6a8f7276e6914851b98a6465bdb56f7f2e3db6136c8b8607bd6ba4cde3cd9cbde21f0078250cd93aee3df977c0a731d0 + checksum: 094e40f4ab9f131408202063964d63740609fd4fdb70a5b6332b371761921b540ffbcee7a434c0199b8317dfb2ba4675eef674867215fd3b85e24054607c1501 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.3": - version: 0.5.3 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" +"babel-plugin-polyfill-regenerator@npm:^0.5.4": + version: 0.5.4 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.4" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" + "@babel/helper-define-polyfill-provider": "npm:^0.4.4" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: cc32313b9ebbf1d7bedc33524a861136b9e5d3b6e9be317ac360a1c2a59ae5ed1b465a6c68b2715cdefb089780ddfb0c11f4a148e49827a947beee76e43da598 + checksum: 0b903f5fe2f8c487b4260935dfe60bd9a95bcaee7ae63958f063045093b16d4e8288c232199d411261300aa21f6b106a3cb83c42cc996de013b337f5825a79fe languageName: node linkType: hard @@ -5151,7 +5151,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.1, browserslist@npm:^4.22.2": +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.2": version: 4.22.2 resolution: "browserslist@npm:4.22.2" dependencies: @@ -5897,12 +5897,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2": - version: 3.33.1 - resolution: "core-js-compat@npm:3.33.1" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": + version: 3.35.0 + resolution: "core-js-compat@npm:3.35.0" dependencies: - browserslist: "npm:^4.22.1" - checksum: 9c7361b370eac30756e6ec52469988d62c6110759efa1c85edd15e6b30f05ace8319a9cc0671bf596a98e7e81c67ad693ceaab2691b85cb62c636da1afe8feb9 + browserslist: "npm:^4.22.2" + checksum: 8c4379240b8decb94b21e81d5ba6f768418721061923b28c9dfc97574680c35d778d39c010207402fc7c8308a68a4cf6d5e02bcbcb96e931c52e6e0dce29a68c languageName: node linkType: hard From 1982137590a888fb3a29e6b23cada06c799f25a7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:52:09 +0100 Subject: [PATCH 07/27] Update dependency classnames to v2.5.1 (#28524) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1f21b80657..a0a74ec3c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5531,9 +5531,9 @@ __metadata: linkType: hard "classnames@npm:^2.2.5, classnames@npm:^2.3.2": - version: 2.5.0 - resolution: "classnames@npm:2.5.0" - checksum: f10a5b07db7fda8eb77f701f795b7006f3de86a723ec62cc10f4d82b4195fc65a578bbf91c47675b8c6fcb2921b903bfea5c670bdb43513e454daa6c2e9738b3 + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69 languageName: node linkType: hard From fdec8d7ffbdaf480d8fb144c27983f7e0de0373e Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Tue, 2 Jan 2024 03:09:54 -0600 Subject: [PATCH 08/27] Fix OCR when using S3/CDN for assets (#28551) --- .../mastodon/features/ui/components/focal_point_modal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx b/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx index 5353ebdb8a..91dca26718 100644 --- a/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx @@ -222,7 +222,7 @@ class FocalPointModal extends ImmutablePureComponent { const worker = createWorker({ workerPath: tesseractWorkerPath, corePath: tesseractCorePath, - langPath: `${assetHost}/ocr/lang-data/`, + langPath: `${assetHost}/ocr/lang-data`, logger: ({ status, progress }) => { if (status === 'recognizing text') { this.setState({ ocrStatus: 'detecting', progress }); From 0374e110919fe99b4e4da86363febf433d47a5d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:11:53 +0000 Subject: [PATCH 09/27] New Crowdin Translations (automated) (#28529) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/cy.json | 11 ++++++++-- app/javascript/mastodon/locales/hr.json | 28 +++++++++++++++++++++++++ app/javascript/mastodon/locales/ie.json | 2 ++ app/javascript/mastodon/locales/ta.json | 28 +++++++++++++++++++++++++ config/locales/cy.yml | 1 + config/locales/devise.ie.yml | 2 ++ config/locales/doorkeeper.ie.yml | 1 + config/locales/fi.yml | 2 +- config/locales/ie.yml | 17 +++++++++++++++ config/locales/simple_form.ie.yml | 20 ++++++++++++++++++ config/locales/sk.yml | 2 ++ 11 files changed, 111 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 17133631a5..04b39904e4 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -21,6 +21,7 @@ "account.blocked": "Blociwyd", "account.browse_more_on_origin_server": "Pori mwy ar y proffil gwreiddiol", "account.cancel_follow_request": "Tynnu cais i ddilyn", + "account.copy": "Copïo dolen i'r proffil", "account.direct": "Crybwyll yn breifat @{name}", "account.disable_notifications": "Stopiwch fy hysbysu pan fydd @{name} yn postio", "account.domain_blocked": "Parth wedi ei flocio", @@ -31,6 +32,7 @@ "account.featured_tags.last_status_never": "Dim postiadau", "account.featured_tags.title": "Prif hashnodau {name}", "account.follow": "Dilyn", + "account.follow_back": "Dilyn yn ôl", "account.followers": "Dilynwyr", "account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.", "account.followers_counter": "{count, plural, one {Dilynwr: {counter}} other {Dilynwyr: {counter}}}", @@ -51,6 +53,7 @@ "account.mute_notifications_short": "Distewi hysbysiadau", "account.mute_short": "Tewi", "account.muted": "Wedi anwybyddu", + "account.mutual": "Cydgydnabod", "account.no_bio": "Dim disgrifiad wedi'i gynnig.", "account.open_original_page": "Agor y dudalen wreiddiol", "account.posts": "Postiadau", @@ -168,9 +171,9 @@ "confirmations.delete.confirm": "Dileu", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?", "confirmations.delete_list.confirm": "Dileu", - "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu y rhestr hwn am byth?", + "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", "confirmations.discard_edit_media.confirm": "Dileu", - "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg, eu taflu beth bynnag?", + "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", "confirmations.domain_block.confirm": "Blocio parth cyfan", "confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.", "confirmations.edit.confirm": "Golygu", @@ -481,12 +484,15 @@ "onboarding.follows.title": "Yn boblogaidd ar Mastodon", "onboarding.profile.discoverable": "Gwnewch fy mhroffil yn un y gellir ei ddarganfod", "onboarding.profile.discoverable_hint": "Pan fyddwch yn optio i mewn i ddarganfodadwyedd ar Mastodon, gall eich postiadau ymddangos mewn canlyniadau chwilio a thueddiadau, ac efallai y bydd eich proffil yn cael ei awgrymu i bobl sydd â diddordebau tebyg i chi.", + "onboarding.profile.display_name": "Enw dangos", "onboarding.profile.display_name_hint": "Eich enw llawn neu'ch enw hwyl…", + "onboarding.profile.lead": "Gallwch chi bob amser gwblhau hyn yn ddiweddarach yn y gosodiadau, lle mae hyd yn oed mwy o ddewisiadau cyfaddasu ar gael.", "onboarding.profile.note": "Bywgraffiad", "onboarding.profile.note_hint": "Gallwch @grybwyll pobl eraill neu #hashnodau…", "onboarding.profile.save_and_continue": "Cadw a pharhau", "onboarding.profile.title": "Gosodiad proffil", "onboarding.profile.upload_avatar": "Llwytho llun proffil", + "onboarding.profile.upload_header": "Llwytho pennyn proffil", "onboarding.share.lead": "Cofiwch ddweud wrth bobl sut y gallan nhw ddod o hyd i chi ar Mastodon!", "onboarding.share.message": "Fi yw {username} ar #Mastodon! Dewch i'm dilyn i yn {url}", "onboarding.share.next_steps": "Camau nesaf posib:", @@ -601,6 +607,7 @@ "search.quick_action.status_search": "Postiadau sy'n cyfateb i {x}", "search.search_or_paste": "Chwilio neu gludo URL", "search_popout.full_text_search_disabled_message": "Ddim ar gael ar {domain}.", + "search_popout.full_text_search_logged_out_message": "Dim ond ar gael pan wedi mewngofnodi.", "search_popout.language_code": "Cod iaith ISO", "search_popout.options": "Dewisiadau chwilio", "search_popout.quick_actions": "Gweithredoedd cyflym", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 654991a0f9..c535f1affc 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -1,8 +1,15 @@ { "about.blocks": "Moderirani poslužitelji", "about.contact": "Kontakt:", + "about.disclaimer": "Mastodon je besplatan softver otvorenog koda i zaštitni znak tvrtke Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razlog nije dostupan", + "about.domain_blocks.preamble": "Mastodon vam općenito omogućuje pregled sadržaja i interakciju s korisnicima s bilo kojeg drugog poslužitelja u fediverse. Ovo su iznimke napravljene na ovom poslužitelju.", + "about.domain_blocks.silenced.explanation": "Obično nećete vidjeti profile i sadržaj s ovog poslužitelja, osim ako ga izričito ne potražite ili uključite u njega slijedeći ga.", + "about.domain_blocks.silenced.title": "Ograničen", + "about.domain_blocks.suspended.explanation": "Podatci s ovog poslužitelja neće se obrađivati, pohranjivati ili razmjenjivati, što onemogućuje bilo kakvu interakciju ili komunikaciju s korisnicima s ovog poslužitelja.", "about.domain_blocks.suspended.title": "Suspendiran", + "about.not_available": "Te informacije nisu dostupne na ovom poslužitelju.", + "about.powered_by": "Decentralizirani društveni mediji koje pokreće {mastodon}", "about.rules": "Pravila servera", "account.account_note_header": "Bilješka", "account.add_or_remove_from_list": "Dodaj ili ukloni s liste", @@ -14,6 +21,8 @@ "account.blocked": "Blokirano", "account.browse_more_on_origin_server": "Pogledajte više na izvornom profilu", "account.cancel_follow_request": "Withdraw follow request", + "account.copy": "Kopiraj vezu u profil", + "account.direct": "Privatno spomeni @{name}", "account.disable_notifications": "Nemoj me obavjestiti kada @{name} napravi objavu", "account.domain_blocked": "Domena je blokirana", "account.edit_profile": "Uredi profil", @@ -21,7 +30,9 @@ "account.endorse": "Istakni na profilu", "account.featured_tags.last_status_at": "Zadnji post {date}", "account.featured_tags.last_status_never": "Nema postova", + "account.featured_tags.title": "Istaknuti hashtagovi {name}", "account.follow": "Prati", + "account.follow_back": "Slijedi natrag", "account.followers": "Pratitelji", "account.followers.empty": "Nitko još ne prati korisnika/cu.", "account.followers_counter": "{count, plural, one {{counter} pratitelj} other {{counter} pratitelja}}", @@ -32,6 +43,7 @@ "account.hide_reblogs": "Sakrij boostove od @{name}", "account.in_memoriam": "U sjećanje.", "account.joined_short": "Pridružen", + "account.languages": "Promjeni pretplaćene jezike", "account.link_verified_on": "Vlasništvo ove poveznice provjereno je {date}", "account.locked_info": "Status privatnosti ovog računa postavljen je na zaključano. Vlasnik ručno pregledava tko ih može pratiti.", "account.media": "Medijski sadržaj", @@ -40,11 +52,14 @@ "account.mute_notifications_short": "Utišaj obavijesti", "account.mute_short": "Utišaj", "account.muted": "Utišano", + "account.mutual": "Uzajamno", + "account.no_bio": "Nije dan opis.", "account.open_original_page": "Otvori originalnu stranicu", "account.posts": "Objave", "account.posts_with_replies": "Objave i odgovori", "account.report": "Prijavi @{name}", "account.requested": "Čekanje na potvrdu. Kliknite za poništavanje zahtjeva za praćenje", + "account.requested_follow": "{name} zatražio/la je praćenje", "account.share": "Podijeli profil @{name}", "account.show_reblogs": "Prikaži boostove od @{name}", "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}", @@ -54,11 +69,18 @@ "account.unendorse": "Ne ističi na profilu", "account.unfollow": "Prestani pratiti", "account.unmute": "Poništi utišavanje @{name}", + "account.unmute_notifications_short": "Uključi utišane obavijesti", "account.unmute_short": "Poništi utišavanje", "account_note.placeholder": "Kliknite za dodavanje bilješke", + "admin.dashboard.daily_retention": "Stopa zadržavanja korisnika po danu nakon prijave", + "admin.dashboard.monthly_retention": "Stopa zadržavanja korisnika po mjesecu nakon prijave", "admin.dashboard.retention.average": "Prosječno", "admin.dashboard.retention.cohort": "Mjesec prijave", "admin.dashboard.retention.cohort_size": "Novi korisnici", + "admin.impact_report.instance_accounts": "Profili računa koji bi ovo izbrisali", + "admin.impact_report.instance_followers": "Sljedbenici koje bi izgubili naši korisnici", + "admin.impact_report.instance_follows": "Sljedbenici koje bi izgubili njihovi korisnici", + "admin.impact_report.title": "Sažetak učinka", "alert.rate_limited.message": "Molimo pokušajte nakon {retry_time, time, medium}.", "alert.rate_limited.title": "Ograničenje učestalosti", "alert.unexpected.message": "Dogodila se neočekivana greška.", @@ -68,10 +90,14 @@ "audio.hide": "Sakrij audio", "autosuggest_hashtag.per_week": "{count} tjedno", "boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put", + "bundle_column_error.copy_stacktrace": "Kopiraj izvješće o pogrešci", + "bundle_column_error.error.body": "Zaraženu stranicu nije moguće prikazati. To bi moglo biti zbog pogreške u našem kodu ili problema s kompatibilnošću preglednika.", "bundle_column_error.error.title": "Oh, ne!", + "bundle_column_error.network.body": "Došlo je do pogreške prilikom pokušaja učitavanja ove stranice. Razlog može biti privremeni problem s internetskom vezom ili ovim poslužiteljem.", "bundle_column_error.network.title": "Greška mreže", "bundle_column_error.retry": "Pokušajte ponovno", "bundle_column_error.return": "Na glavnu", + "bundle_column_error.routing.body": "Traženu stranicu nije moguće pronaći. Jeste li sigurni da je URL u adresnoj traci točan?", "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Zatvori", "bundle_modal_error.message": "Nešto je pošlo po zlu tijekom učitavanja ove komponente.", @@ -171,6 +197,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Evo kako će izgledati:", "emoji_button.activity": "Aktivnost", + "emoji_button.clear": "Obriši", "emoji_button.custom": "Prilagođeno", "emoji_button.flags": "Zastave", "emoji_button.food": "Hrana i piće", @@ -211,6 +238,7 @@ "explore.trending_links": "Novosti", "explore.trending_statuses": "Objave", "explore.trending_tags": "Hashtagovi", + "filter_modal.added.context_mismatch_title": "Nepodudaranje konteksta!", "filter_modal.added.review_and_configure_title": "Postavke filtara", "filter_modal.added.title": "Filtar dodan!", "filter_modal.select_filter.prompt_new": "Nova kategorija: {name}", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 0344470edf..8579fc89c6 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -250,6 +250,7 @@ "error.unexpected_crash.explanation_addons": "Ti-ci págine ne posset esser monstrat correctmen. Li error es probabilmen causat de un extension al navigator o instrumentes por automatic traduction.", "error.unexpected_crash.next_steps": "Prova recargar li págine. Si to ne auxilia, tu fórsan posse usar Mastodon per un diferent navigator o aplication.", "error.unexpected_crash.next_steps_addons": "Prova desactivisar les e recargar li págine. Si to ne auxilia, tu fórsan posse usar Mastodon per un diferent navigator o aplication.", + "errors.unexpected_crash.copy_stacktrace": "Copiar cumul-tracie a paperiere", "errors.unexpected_crash.report_issue": "Raportar un problema", "explore.search_results": "Resultates de sercha", "explore.suggested_follows": "Gente", @@ -350,6 +351,7 @@ "keyboard_shortcuts.heading": "Rapid-tastes", "keyboard_shortcuts.home": "Aperter li hemal témpor-linea", "keyboard_shortcuts.hotkey": "Rapid clave", + "keyboard_shortcuts.legend": "Monstrar ti-ci legende", "keyboard_shortcuts.local": "Aperter li local témpor-linea", "keyboard_shortcuts.mention": "Mentionar li autor", "keyboard_shortcuts.muted": "Aperter li lista de silentiat usatores", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 6b2332d5b8..955955b8c2 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -10,6 +10,7 @@ "account.badges.group": "குழு", "account.block": "@{name} -ஐத் தடு", "account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை", + "account.block_short": "தடு", "account.blocked": "முடக்கப்பட்டது", "account.browse_more_on_origin_server": "மேலும் உலாவ சுயவிவரத்திற்குச் செல்க", "account.cancel_follow_request": "Withdraw follow request", @@ -18,20 +19,26 @@ "account.edit_profile": "சுயவிவரத்தை மாற்று", "account.enable_notifications": "@{name} பதிவிட்டல் எனக்குத் தெரியப்படுத்தவும்", "account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து", + "account.featured_tags.last_status_never": "இடுகைகள் இல்லை", "account.follow": "பின்தொடர்", + "account.follow_back": "பின்தொடரு", "account.followers": "பின்தொடர்பவர்கள்", "account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.", "account.followers_counter": "{count, plural, one {{counter} வாசகர்} other {{counter} வாசகர்கள்}}", "account.following": "பின்தொடரும்", "account.following_counter": "{count, plural,one {{counter} சந்தா} other {{counter} சந்தாக்கள்}}", "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.", + "account.go_to_profile": "சுயவிவரத்திற்குச் செல்லவும்", "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}", "account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}", "account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.", "account.media": "ஊடகங்கள்", "account.mention": "குறிப்பிடு @{name}", "account.mute": "ஊமையான @{name}", + "account.mute_notifications_short": "அறிவிப்புகளை ஒலியடக்கு", + "account.mute_short": "அமைதியாக்கு", "account.muted": "முடக்கியது", + "account.no_bio": "விளக்கம் எதுவும் வழங்கப்படவில்லை.", "account.posts": "டூட்டுகள்", "account.posts_with_replies": "Toots மற்றும் பதில்கள்", "account.report": "@{name} -ஐப் புகாரளி", @@ -61,15 +68,29 @@ "audio.hide": "ஆடியோவை மறை", "autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}", "boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்", + "bundle_column_error.error.title": "அடடே!", + "bundle_column_error.network.body": "இந்தப் பக்கத்தைத் திறக்கும்பொழுது ஒரு பிழை ஏற்பட்டுவிட்டது. இது உங்கள் இணைய தொடர்பில் அல்லது இப்பத்தின் வழங்க்கியில் ஏற்பட்டுள்ள ஒரு தற்காலிக பிரச்சணையாக இருக்கலாம்.", + "bundle_column_error.network.title": "பிணையப் பிழை", "bundle_column_error.retry": "மீண்டும் முயற்சிக்கவும்", + "bundle_column_error.return": "முகப்பிற்கு செல்லவும்", + "bundle_column_error.routing.body": "கேட்கப்பட்ட பக்கத்தைக் காணவில்லை. நீங்கள் உள்ளிட்ட முகவரி சரியனதா?", + "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "மூடுக", "bundle_modal_error.message": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.", "bundle_modal_error.retry": "மீண்டும் முயற்சி செய்", + "closed_registrations.other_server_instructions": "மசுடோடன் இரு பரவலாக்கப்பட்ட மென்பொருள் என்பதால், நீங்கள் வேரு ஒரு வழங்கியில் கணக்கை உருவாக்கியிருந்தாலும் இந்த வழங்கியில் பயன்படுத்தலாம்.", + "closed_registrations_modal.description": "{domain} இல் இப்பொழுது கணக்குகள் உருவாக்க முடியாது. நீங்கள் மசுடோடன் பயன்படுத்த, குறிப்பாக {domain} முகவரியில் கணக்கைத் துவங்க வேண்டும் என்ற அவசியமில்லை என்பதை மனதில் வைத்துக் கொள்ளவும்.", + "closed_registrations_modal.find_another_server": "வேறொரு வழங்கியைக் கண்டுபிடி", + "closed_registrations_modal.preamble": "மசுடோடன் ஒரு பரவலாக்கப்பட்ட மென்பொருள். ஆதனால் நீங்கள் எங்குக் கணக்கை உருவாக்கினாலும் இந்த வழங்கியில் உள்ள யாருடன் வேண்டும் என்றாலும் உரவாடலாம். நீங்களே கூட ஒரு வழங்கியை நிறுவலாம்!", + "closed_registrations_modal.title": "மசுடோடன் கணக்கு துவங்கப்படுகிறது", + "column.about": "பற்றி", "column.blocks": "தடுக்கப்பட்ட பயனர்கள்", "column.bookmarks": "அடையாளக்குறிகள்", "column.community": "சுய நிகழ்வு காலவரிசை", + "column.direct": "தனிப்பட்ட குறிப்புகள்", "column.directory": "சுயவிவரங்களை உலாவு", "column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்", + "column.favourites": "பிடித்தவை", "column.follow_requests": "பின்தொடர அனுமதிகள்", "column.home": "முகப்பு", "column.lists": "பட்டியல்கள்", @@ -90,6 +111,9 @@ "community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே", "compose.language.change": "மொழியை மாற்று", "compose.language.search": "தேடல் மொழிகள்...", + "compose.published.body": "பதிவிடப்பட்டது.", + "compose.published.open": "திற", + "compose.saved.body": "பதிவி சேமிக்கப்பட்டது.", "compose_form.direct_message_warning_learn_more": "மேலும் அறிய", "compose_form.encryption_warning": "Mastodonல் உள்ள பதிவுகள் முறையாக என்க்ரிப்ட்(encrypt) செய்யபடவில்லை. அதனால் முக்கிய தகவல்களை இங்கே பகிர வேண்டாம்.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", @@ -180,6 +204,10 @@ "error.unexpected_crash.next_steps": "பக்கத்தைப் புதுப்பித்துப் பார்க்கவும். அப்படியும் வேலை செய்யவில்லை எனில், மாஸ்டடானை வேறு ஒரு உலாவியின் மூலமோ, அல்லது பொருத்தமான செயலியின் மூலமோ பயன்படுத்திப் பார்க்கவும்.", "errors.unexpected_crash.copy_stacktrace": "Stacktrace-ஐ clipboard-ல் நகலெடு", "errors.unexpected_crash.report_issue": "புகாரளி", + "explore.title": "உலாவு", + "explore.trending_links": "செய்திகள்", + "explore.trending_statuses": "பதிவுகள்", + "explore.trending_tags": "ஹேஷ்டேக்குகள்", "follow_request.authorize": "அனுமதியளி", "follow_request.reject": "நிராகரி", "follow_requests.unlocked_explanation": "உங்கள் கணக்கு பூட்டப்படவில்லை என்றாலும், இந்தக் கணக்குகளிலிருந்து உங்களைப் பின்தொடர விரும்பும் கோரிக்கைகளை நீங்கள் பரீசீலிப்பது நலம் என்று {domain} ஊழியர் எண்ணுகிறார்.", diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 7f60e93422..9dd533b2ad 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -659,6 +659,7 @@ cy: created_at: Adroddwyd delete_and_resolve: Dileu postiadau forwarded: Wedi'i anfon ymlaen + forwarded_replies_explanation: Mae'r adroddiad hwn gan ddefnyddiwr o weinydd arall ac am gynnwys pell. Mae wedi ei anfon ymlaen atoch chi oherwydd bod y cynnwys sy'n cael ei adrodd yn ateb i un o'ch defnyddwyr. forwarded_to: Wedi'i anfon ymlaen i %{domain} mark_as_resolved: Nodi fel wedi'i ddatrys mark_as_sensitive: Marcio fel sensitif diff --git a/config/locales/devise.ie.yml b/config/locales/devise.ie.yml index 847b0f361b..e4f2e6fb19 100644 --- a/config/locales/devise.ie.yml +++ b/config/locales/devise.ie.yml @@ -18,6 +18,8 @@ ie: confirmation_instructions: action: Verificar e-posta action_with_app: Confirma e retorna a%{app} + explanation: Tu ha creat un conto sur %{host} con ti-ci e-posta, quel tu posse activar per un sol clicc. Si it ne esset tu qui creat li conto, ples ignorar ti-ci missage. + explanation_when_pending: Tu ha demandat un invitation a %{host} con ti-ci e-posta. Pos confirmation de tui adresse, noi va inspecter tui aplication. Tu posse inloggar por changear detallies o deleter li conto, ma li pluparte del functiones va restar ínusabil til quande tui conto es aprobat. Tui data va esser deletet si tui conto es rejectet, e in ti casu tu ne besona far quelcunc cose. Si it ne esset tu qui creat li conto, ples ignorar ti-ci missage. title: Verificar e-posta email_changed: explanation: 'Li e-mail adresse de tui es changeat a:' diff --git a/config/locales/doorkeeper.ie.yml b/config/locales/doorkeeper.ie.yml index e5e5146558..1b4b5994bd 100644 --- a/config/locales/doorkeeper.ie.yml +++ b/config/locales/doorkeeper.ie.yml @@ -151,6 +151,7 @@ ie: write:filters: crea filtres write:follows: sequer homes write:lists: crear listes + write:media: adcargar files de medie write:mutes: silentiar persones e conversationes write:notifications: aclarar tui notificationes write:reports: raportar altri persones diff --git a/config/locales/fi.yml b/config/locales/fi.yml index d48653edcc..93545b6a1b 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1559,7 +1559,7 @@ fi: last_active: Viimeksi aktiivinen most_recent: Viimeisimmät moved: Muuttaneet - mutual: Molemmat + mutual: Seuraatte toisianne primary: Ensisijaiset relationship: Suhde remove_selected_domains: Poista kaikki seuraajat valituista verkkotunnuksista diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 99e628fe3b..87aa1c41cc 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -112,6 +112,7 @@ ie: promote: Promoer protocol: Protocol public: Public + push_subscription_expires: Subscrition a PuSH expira redownload: Recargar li profil redownloaded_msg: Successosimen recargat li profil de %{username} del original fonte reject: Rejecter @@ -465,6 +466,7 @@ ie: unsuppress: Restaurar seque-recomandation instances: availability: + failure_threshold_reached: Límite de falliment atinget ye %{date}. failures_recorded: one: Fallit prova por %{count} die. other: Fallit provas por %{count} dies. @@ -478,6 +480,8 @@ ie: confirm_purge: Vole tu vermen permanentmen deleter data de ti dominia? content_policies: comment: Internal nota + description_html: Tu posse definar planes de contenete a aplicar sur omni contos de ti-ci dominia e omni su subdominias. + limited_federation_mode_description_html: Tu posse selecter ca permisser federation a ti-ci dominia. policies: reject_media: Rejecter medie reject_reports: Rejecter raportes @@ -704,6 +708,7 @@ ie: manage_users: Gerer usatores manage_users_description: Permisse que usatores vide detallies de altri usatores e fa actiones de moderation contra les manage_webhooks: Gerer Webcrocs + manage_webhooks_description: Permisse que usatores configura webcrocs por evenimentes administrativ view_audit_log: Vider li Jurnale de Audit view_audit_log_description: Permisse que usatores vide li historie de administrativ actiones sur li servitor view_dashboard: Vider Panel de Control @@ -714,6 +719,7 @@ ie: rules: add_new: Adjunter un regule delete: Deleter + description_html: Benque li pluparte di que ili ha leet e acorda con li termines de servicie, presc nequi perlee les til quande un problema eveni. Tu posse facilitar li perletura del regules de tui servitor per dar les sur un liste de plat balle-punctus. Li índividual regules posse esser curt e simplic, ma mem un liste de micri punctus posse esser tro exigent por li letor si it es tro grand. edit: Redacter regul empty: Ancor null regules de servitor ha esset definit. title: Regules del servitor @@ -724,6 +730,11 @@ ie: appearance: preamble: Customisar li interfacie web de Mastodon. title: Aspecte + branding: + title: Marca + captcha_enabled: + desc_html: To ci usa extern scrites de hCaptcha, quel posse esser ínquietant pro rasones de securitá e privatie. In plu, it posse far li processu de registration mult plu desfacil (particularimen por tis con deshabilitás). Pro ti rasones, ples considerar alternativ mesuras, tales quam registration per aprobation o invitation. + title: Exige que nov usatores solue un CAPTCHA por confirmar lor conto content_retention: title: Retention de contenete discovery: @@ -1374,6 +1385,7 @@ ie: media_attachments: validations: images_and_video: On ne posse atachar un video a un posta quel ja contene images + too_many: Ne posse atachar plu quam 4 files migrations: acct: Translocat a cancel: Anullar redirection @@ -1401,6 +1413,8 @@ ie: carry_blocks_over_text: Ti usator translocat se de %{acct}, quel tu hat bloccat. carry_mutes_over_text: Ti-ci usator movet se de %{acct}, quel tu hat silentiat. copy_account_note_text: 'Vi tui notas pri ti usator qui translocat se de %{acct}:' + navigation: + toggle_menu: Changear menú notification_mailer: admin: report: @@ -1443,6 +1457,7 @@ ie: number: human: decimal_units: + format: "%n%u" units: billion: B million: M @@ -1800,6 +1815,8 @@ ie: success: Tui clave de securitá esset adjuntet con successe. delete: Deleter delete_confirmation: Vole tu vermen deleter ti-ci clave de securitá? + destroy: + success: Tui clave de securitá esset successosimen deletet. invalid_credential: Ínvalid clave de securitá not_enabled: Tu ancor ne ha possibilisat WebAuthn not_supported: Ti-ci navigator ne subtene claves de securitá diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index 3bcce47d36..f945e2342e 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -6,6 +6,7 @@ ie: discoverable: Tui public postas e profil posse esser recomandat in multiplic areas de Mastodon e tui profil posse esser suggestat a altri usatores. display_name: Tui complet nómine o tui amusant nómine. fields: Tui websitu, pronómines, etá, quocunc quel tu vole. + indexable: Tui public postas posse aparir in sercha-resultates sur Mastodon. E in omni casu, tis qui ha interactet con tui postas va posser serchar e trovar les. note: 'Tu posse @mentionar altri persones o #hashtags.' unlocked: Persones va posser sequer te sin petir aprobation. Desselecte si tu vole manualmen tractar petitiones de sequer e decider ca acceptar o rejecter nov sequitores. account_alias: @@ -65,20 +66,27 @@ ie: hide: Celar completmen li contenete filtrat, quam si it ne existe warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre form_admin_settings: + backups_retention_period: Mantener usator-generat archives por li specificat quantitá de dies. bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores. peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation. profile_directory: Li profilarium monstra omni usatores volent esser decovribil. site_contact_email: Qualmen on posse contacter te por inquestes legal o de apoy. site_contact_username: Qualmen li gente posse atinger te sur Mastodon. + site_short_description: Un curt descrition por auxiliar identificar tui servitor. Qui gere it, por qual persones it es? site_title: Quant persones posse aluder a tui servitor ultra su nómine de dominia. + status_page_url: URL de un págine monstrant li statu de ti-ci servitor durant un ruptura de servicie theme: Li dessine quel ínregistrat visitantes e nov usatores vide. + thumbnail: Un image de dimensiones circa 2:1 monstrat along tui servitor-information. timeline_preview: Ínregistrat visitantes va posser vider li max recent public postas disponibil che li servitor. + trends: Tendenties monstra quel postas, hashtags e novas es ganiant atention sur tui servitor. trends_as_landing_page: Monstrar populari contenete a ínregistrat visitantes vice un description del servitor. Besona que tendenties es activisat. form_challenge: current_password: Tu nu intra un area secur ip_block: comment: Facultativ. Ne obliviar pro quo tu adjuntet ti-ci regul. + expires_in: IP-adresses es un ressurse finit, quelcvez partit e transferet de manu a manu. Pro to, un índefinit bloccada de IP ne es recomandat. severities: + no_access: Bloccar accesse a omni ressurses sign_up_block: Nov registrationes ne va esser possibil sign_up_requires_approval: Nov registrationes va besonar tui aprobation severity: Selecter quo va evenir con demandes ex ti-ci IP @@ -142,11 +150,13 @@ ie: honeypot: "%{label} (ne plenar)" irreversible: Lassar cader vice celar locale: Lingue del interfacie + max_uses: Max grand númere de usas new_password: Nov passa-parol note: Biografie password: Passa-parol phrase: Clave-parol o frase setting_advanced_layout: Possibilisar web-interfacie avansat + setting_always_send_emails: Sempre misser notificationes de e-posta setting_default_language: Lingue in quel postar setting_default_privacy: Privatie de postada setting_default_sensitive: Sempre marcar medie quam sensitiv @@ -162,18 +172,27 @@ ie: severity: Severitá sign_in_token_attempt: Code de securitá title: Titul + type: Specie de importation username: Nómine de usator whole_word: Plen parol + featured_tag: + name: Hashtag filters: actions: + hide: Celar completmen warn: Celar con un admonition form_admin_settings: + backups_retention_period: Periode de retener archives de usator + bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores + closed_registrations_message: Customisat missage quande registration ne disponibil custom_css: Custom CSS profile_directory: Possibilisar profilarium registrations_mode: Qui posse registrar se show_domain_blocks: Vider bloccas de dominia show_domain_blocks_rationale: Monstrar pro quo cert dominias esset bloccat site_contact_email: Contact e-mail adresse + site_contact_username: Usator-nómine de contact + site_extended_description: Extendet descrition site_title: Nómine de servitor theme: Predefenit tema trendable_by_default: Possibilisar tendenties sin priori inspection @@ -220,6 +239,7 @@ ie: events: Evenimentes activisat url: URL de punctu terminal 'no': 'No' + not_recommended: Ne recomandat recommended: Recomandat required: mark: "*" diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 4fe190cfec..feb84ea984 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -574,6 +574,7 @@ sk: manage_announcements: Spravuj oboznámenia manage_appeals: Spravuj námietky manage_blocks: Spravuj blokovania + manage_custom_emojis: Spravuj vlastné emotikony manage_federation: Spravuj federáciu manage_invites: Spravuj pozvánky manage_reports: Spravuj hlásenia @@ -696,6 +697,7 @@ sk: title: Populárne príspevky tags: dashboard: + tag_accounts_measure: unikátnych použití tag_servers_measure: iné servery tag_uses_measure: užívateľov celkovo not_usable: Nemôže byť použitý From cd09be054fcf12ba2bd0b85c20cfa0432b8d5532 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jan 2024 11:13:22 +0100 Subject: [PATCH 10/27] Update dependency eslint-plugin-jsdoc to v47 (#28541) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 7b09178adb..479852cd51 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "eslint-import-resolver-typescript": "^3.5.5", "eslint-plugin-formatjs": "^4.10.1", "eslint-plugin-import": "~2.29.0", - "eslint-plugin-jsdoc": "^46.1.0", + "eslint-plugin-jsdoc": "^47.0.0", "eslint-plugin-jsx-a11y": "~6.8.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-promise": "~6.1.1", diff --git a/yarn.lock b/yarn.lock index a0a74ec3c2..b44c218016 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2368,7 +2368,7 @@ __metadata: eslint-import-resolver-typescript: "npm:^3.5.5" eslint-plugin-formatjs: "npm:^4.10.1" eslint-plugin-import: "npm:~2.29.0" - eslint-plugin-jsdoc: "npm:^46.1.0" + eslint-plugin-jsdoc: "npm:^47.0.0" eslint-plugin-jsx-a11y: "npm:~6.8.0" eslint-plugin-prettier: "npm:^5.0.0" eslint-plugin-promise: "npm:~6.1.1" @@ -7361,9 +7361,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^46.1.0": - version: 46.9.1 - resolution: "eslint-plugin-jsdoc@npm:46.9.1" +"eslint-plugin-jsdoc@npm:^47.0.0": + version: 47.0.1 + resolution: "eslint-plugin-jsdoc@npm:47.0.1" dependencies: "@es-joy/jsdoccomment": "npm:~0.41.0" are-docs-informative: "npm:^0.0.2" @@ -7375,8 +7375,8 @@ __metadata: semver: "npm:^7.5.4" spdx-expression-parse: "npm:^4.0.0" peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: d15d68797e85bb7b6fdcfc1170653683c16ab1d62c2e9c537101e774cb3231913e2bc4781f2bb808d074adce5699e5b545e450c6801b637c6434587d226ad6ac + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: f2657cfc1394af0fca2c9c079065ffbc4e5fd41678299afb9ae261aff246cbd861d0ff38b57258caf6c9e9c57eb9975c75cd47c9f8c92bfefdaa4924eef62c24 languageName: node linkType: hard From 1184887b012e863fbf44f65ef5c65e0049123c27 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 2 Jan 2024 13:27:51 +0100 Subject: [PATCH 11/27] Fix streaming API redirection ignoring the port of `streaming_api_base_url` (#28558) --- app/controllers/api/v1/streaming_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/streaming_controller.rb b/app/controllers/api/v1/streaming_controller.rb index 0cdd00d62f..0cb6e856f2 100644 --- a/app/controllers/api/v1/streaming_controller.rb +++ b/app/controllers/api/v1/streaming_controller.rb @@ -13,7 +13,9 @@ class Api::V1::StreamingController < Api::BaseController def streaming_api_url Addressable::URI.parse(request.url).tap do |uri| - uri.host = Addressable::URI.parse(Rails.configuration.x.streaming_api_base_url).host + base_url = Addressable::URI.parse(Rails.configuration.x.streaming_api_base_url) + uri.host = base_url.host + uri.port = base_url.port end.to_s end end From 0cd497ba7d2764ea8d2677e1cd27545e61e981fa Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Tue, 2 Jan 2024 03:09:54 -0600 Subject: [PATCH 12/27] [Glitch] Fix OCR when using S3/CDN for assets Port fdec8d7ffbdaf480d8fb144c27983f7e0de0373e to glitch-soc Signed-off-by: Claire --- .../glitch/features/ui/components/focal_point_modal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx index 4230c6dd9a..169f72f97a 100644 --- a/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.jsx @@ -221,7 +221,7 @@ class FocalPointModal extends ImmutablePureComponent { const worker = createWorker({ workerPath: tesseractWorkerPath, corePath: tesseractCorePath, - langPath: `${assetHost}/ocr/lang-data/`, + langPath: `${assetHost}/ocr/lang-data`, logger: ({ status, progress }) => { if (status === 'recognizing text') { this.setState({ ocrStatus: 'detecting', progress }); From 65ea097f1df5f14a4b389aa6ec0b955f2066b41c Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 2 Jan 2024 16:02:25 +0100 Subject: [PATCH 13/27] Fix loading local accounts with extraneous domain part in WebUI (#28559) --- app/javascript/mastodon/reducers/accounts_map.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/reducers/accounts_map.js b/app/javascript/mastodon/reducers/accounts_map.js index d5ecad7dbf..9053dcc9c0 100644 --- a/app/javascript/mastodon/reducers/accounts_map.js +++ b/app/javascript/mastodon/reducers/accounts_map.js @@ -2,8 +2,13 @@ import { Map as ImmutableMap } from 'immutable'; import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts'; import { importAccounts } from '../actions/accounts_typed'; +import { domain } from '../initial_state'; -export const normalizeForLookup = str => str.toLowerCase(); +export const normalizeForLookup = str => { + str = str.toLowerCase(); + const trailingIndex = str.indexOf(`@${domain.toLowerCase()}`); + return (trailingIndex > 0) ? str.slice(0, trailingIndex) : str; +}; const initialState = ImmutableMap(); From 3944b12b5eec8c6ae4666ec922411b32b3442dd6 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 2 Jan 2024 10:19:54 -0500 Subject: [PATCH 14/27] Update `@typescript-eslint/parser` to version 6.17.0 (#28218) --- package.json | 2 +- yarn.lock | 64 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 479852cd51..54dac54cd5 100644 --- a/package.json +++ b/package.json @@ -181,7 +181,7 @@ "@types/webpack": "^4.41.33", "@types/yargs": "^17.0.24", "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@typescript-eslint/parser": "^6.17.0", "babel-jest": "^29.5.0", "eslint": "^8.41.0", "eslint-config-prettier": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index b44c218016..571e29e7d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2338,7 +2338,7 @@ __metadata: "@types/webpack": "npm:^4.41.33" "@types/yargs": "npm:^17.0.24" "@typescript-eslint/eslint-plugin": "npm:^6.0.0" - "@typescript-eslint/parser": "npm:^6.0.0" + "@typescript-eslint/parser": "npm:^6.17.0" arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.4.0" autoprefixer: "npm:^10.4.14" @@ -3693,21 +3693,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.0.0": - version: 6.16.0 - resolution: "@typescript-eslint/parser@npm:6.16.0" +"@typescript-eslint/parser@npm:^6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/parser@npm:6.17.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.16.0" - "@typescript-eslint/types": "npm:6.16.0" - "@typescript-eslint/typescript-estree": "npm:6.16.0" - "@typescript-eslint/visitor-keys": "npm:6.16.0" + "@typescript-eslint/scope-manager": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/typescript-estree": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 9d573d14df4ec661dccaca785223a8a330d64f50a9279ff9170b1da22198ff91b9afa3ee7d3d7127c0cbc148c86831e76b33fc5b47d630799e98940ef666bfe0 + checksum: 66b53159688083eb48259de5b4daf076f3de284ac3b4d2618bda3f7ab2d8ee27b01ae851b08e8487047e33ff3668424f17d677d66413164cb231f1519dcff82f languageName: node linkType: hard @@ -3721,6 +3721,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/scope-manager@npm:6.17.0" + dependencies: + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + checksum: b7ac7d9c39515c2a1b3844577fab967bf126ec25ccf28076240748b3f42d60ab3e64131bfffee61f66251bdf2d59e50e39f5cb0bee7987c85c49140c75d26b5f + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:6.16.0": version: 6.16.0 resolution: "@typescript-eslint/type-utils@npm:6.16.0" @@ -3745,6 +3755,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/types@npm:6.17.0" + checksum: c458d985b9ab4f369018536bcb88f0aedafb0c8c4b22ffd376e0c0c768a44e3956475c85ebeef40ae44238841c8df268893477b85873aa2621995c37e738e37e + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:6.16.0": version: 6.16.0 resolution: "@typescript-eslint/typescript-estree@npm:6.16.0" @@ -3764,6 +3781,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.17.0" + dependencies: + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 5a858288bb05f45a2a45b04394115826ff19f85555144bfb67dc281d4e75fc3a1e1aceb3dee68022e86b91f199d1310c15bda3100a4890004b8e474d86afad51 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:6.16.0, @typescript-eslint/utils@npm:^6.5.0": version: 6.16.0 resolution: "@typescript-eslint/utils@npm:6.16.0" @@ -3791,6 +3827,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.17.0" + dependencies: + "@typescript-eslint/types": "npm:6.17.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 75a48f5810c6a69bc1c082b07d2b840c40895807b1b4ecf9d3ab9eb783176eeb3e7b11eb89d652e8331da79d604f82300f315ffc21cd937819197a8601b48d1d + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" From 48c9192b47124d71ba8fe7b6e69e2ec9b6935981 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 2 Jan 2024 16:02:25 +0100 Subject: [PATCH 15/27] [Glitch] Fix loading local accounts with extraneous domain part in WebUI Port 65ea097f1df5f14a4b389aa6ec0b955f2066b41c to glitch-soc Signed-off-by: Claire --- app/javascript/flavours/glitch/reducers/accounts_map.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/reducers/accounts_map.js b/app/javascript/flavours/glitch/reducers/accounts_map.js index d5ecad7dbf..9053dcc9c0 100644 --- a/app/javascript/flavours/glitch/reducers/accounts_map.js +++ b/app/javascript/flavours/glitch/reducers/accounts_map.js @@ -2,8 +2,13 @@ import { Map as ImmutableMap } from 'immutable'; import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts'; import { importAccounts } from '../actions/accounts_typed'; +import { domain } from '../initial_state'; -export const normalizeForLookup = str => str.toLowerCase(); +export const normalizeForLookup = str => { + str = str.toLowerCase(); + const trailingIndex = str.indexOf(`@${domain.toLowerCase()}`); + return (trailingIndex > 0) ? str.slice(0, trailingIndex) : str; +}; const initialState = ImmutableMap(); From c2b4588f1cd65f2b36fc45f998681492ef2f0f79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:04:59 +0100 Subject: [PATCH 16/27] Update dependency sass to v1.69.7 (#28570) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 571e29e7d3..2bab9a2d0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14554,15 +14554,15 @@ __metadata: linkType: hard "sass@npm:^1.62.1": - version: 1.69.6 - resolution: "sass@npm:1.69.6" + version: 1.69.7 + resolution: "sass@npm:1.69.7" dependencies: chokidar: "npm:>=3.0.0 <4.0.0" immutable: "npm:^4.0.0" source-map-js: "npm:>=0.6.2 <2.0.0" bin: sass: sass.js - checksum: 8153db8e51e74a9007bb54332e14d122c34288c7d21a5f2eaefef753a1b7bb13f35e042dc6247253dab5b1550b05cea27970371e7548286b4f50f23dd1147d89 + checksum: 773d0938e7d4ff3972d3fda3132f34fe98a2f712e028a58e28fecd615434795eff3266eddc38d5e13f03b90c0d6360d0e737b30bff2949a47280c64a18e0fb18 languageName: node linkType: hard From 8c5d3e527892dee08f5f6ae7517f9af8f3b4963e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 09:05:52 +0000 Subject: [PATCH 17/27] Update dependency puma to v6.4.1 (#28569) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 08b9fc0de4..295461bd35 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -544,7 +544,7 @@ GEM psych (5.1.2) stringio public_suffix (5.0.4) - puma (6.4.0) + puma (6.4.1) nio4r (~> 2.0) pundit (2.3.1) activesupport (>= 3.0.0) From 2b330ede224d4fcc79b48f0de36da1ca9909d83d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:10:19 +0100 Subject: [PATCH 18/27] Update dependency eslint-plugin-jsdoc to v48 (#28564) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 54dac54cd5..82cfd689a5 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "eslint-import-resolver-typescript": "^3.5.5", "eslint-plugin-formatjs": "^4.10.1", "eslint-plugin-import": "~2.29.0", - "eslint-plugin-jsdoc": "^47.0.0", + "eslint-plugin-jsdoc": "^48.0.0", "eslint-plugin-jsx-a11y": "~6.8.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-promise": "~6.1.1", diff --git a/yarn.lock b/yarn.lock index 2bab9a2d0d..3cd45a11d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2368,7 +2368,7 @@ __metadata: eslint-import-resolver-typescript: "npm:^3.5.5" eslint-plugin-formatjs: "npm:^4.10.1" eslint-plugin-import: "npm:~2.29.0" - eslint-plugin-jsdoc: "npm:^47.0.0" + eslint-plugin-jsdoc: "npm:^48.0.0" eslint-plugin-jsx-a11y: "npm:~6.8.0" eslint-plugin-prettier: "npm:^5.0.0" eslint-plugin-promise: "npm:~6.1.1" @@ -7407,9 +7407,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^47.0.0": - version: 47.0.1 - resolution: "eslint-plugin-jsdoc@npm:47.0.1" +"eslint-plugin-jsdoc@npm:^48.0.0": + version: 48.0.1 + resolution: "eslint-plugin-jsdoc@npm:48.0.1" dependencies: "@es-joy/jsdoccomment": "npm:~0.41.0" are-docs-informative: "npm:^0.0.2" @@ -7422,7 +7422,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: f2657cfc1394af0fca2c9c079065ffbc4e5fd41678299afb9ae261aff246cbd861d0ff38b57258caf6c9e9c57eb9975c75cd47c9f8c92bfefdaa4924eef62c24 + checksum: 9b211cfb2e07e076dad12681cd2045c65766dd24fe9399fd0adeaf6f8785f9a4dd58608f1183195f63d3c6c91013aa1cf9edc9101580cff9cb60e1e688f456f9 languageName: node linkType: hard From 7cce2a41f279ff157cb04d826bd5c46a129689aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:19:46 +0100 Subject: [PATCH 19/27] New Crowdin Translations (automated) (#28573) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ia.json | 63 ++++++++++++++++++++++++- app/javascript/mastodon/locales/lt.json | 4 +- app/javascript/mastodon/locales/ta.json | 10 ++-- config/locales/doorkeeper.ie.yml | 4 ++ config/locales/simple_form.ie.yml | 6 +++ 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 917a034667..35397b8e12 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -1,23 +1,84 @@ { "account.add_or_remove_from_list": "Adder o remover ab listas", + "account.badges.group": "Gruppo", + "account.block": "Blocar @{name}", + "account.block_short": "Blocar", + "account.blocked": "Blocate", "account.copy": "Copiar ligamine a profilo", + "account.edit_profile": "Modificar profilo", + "account.go_to_profile": "Vader al profilo", + "account.moved_to": "{name} indicava que lor nove conto ora es:", + "account.share": "Compartir profilo de @{name}", + "account.unblock": "Disblocar @{name}", + "account.unblock_short": "Disblocar", + "account.unendorse": "Non evidentiar sur le profilo", + "account_note.placeholder": "Clicca pro adder un nota", + "admin.dashboard.retention.cohort_size": "Nove usatores", + "audio.hide": "Celar audio", + "autosuggest_hashtag.per_week": "{count} per septimana", "bundle_column_error.network.title": "Error de rete", + "bundle_column_error.retry": "Tentar novemente", + "bundle_column_error.return": "Retornar al initio", "bundle_modal_error.close": "Clauder", + "bundle_modal_error.retry": "Tentar novemente", + "column.blocks": "Usatores blocate", + "column.directory": "Navigar profilos", + "column.favourites": "Favoritos", "column.home": "Initio", + "column.lists": "Listas", + "column.notifications": "Notificationes", + "column_header.hide_settings": "Celar le parametros", + "column_header.show_settings": "Monstrar le parametros", "column_subheading.settings": "Parametros", + "compose.language.change": "Cambiar le lingua", "compose.language.search": "Cercar linguas...", "compose.published.open": "Aperir", + "compose_form.poll.add_option": "Adder un option", + "compose_form.poll.remove_option": "Remover iste option", "confirmation_modal.cancel": "Cancellar", + "confirmations.delete.confirm": "Deler", + "confirmations.delete_list.confirm": "Deler", "confirmations.logout.confirm": "Clauder le session", + "copy_icon_button.copied": "Copiate al area de transferentia", "copypaste.copy_to_clipboard": "Copiar al area de transferentia", + "disabled_account_banner.account_settings": "Parametros de conto", "dismissable_banner.dismiss": "Dimitter", + "emoji_button.activity": "Activitate", + "emoji_button.custom": "Personalisate", + "emoji_button.search_results": "Resultatos de recerca", + "empty_column.account_unavailable": "Profilo non disponibile", + "errors.unexpected_crash.report_issue": "Signalar un defecto", + "explore.search_results": "Resultatos de recerca", + "explore.trending_links": "Novas", + "firehose.all": "Toto", "firehose.local": "Iste servitor", + "firehose.remote": "Altere servitores", "footer.about": "A proposito de", + "footer.directory": "Directorio de profilos", + "footer.privacy_policy": "Politica de confidentialitate", + "footer.source_code": "Vider le codice fonte", + "footer.status": "Stato", "home.pending_critical_update.link": "Vider actualisationes", "keyboard_shortcuts.my_profile": "Aperir tu profilo", "lightbox.close": "Clauder", "lightbox.next": "Sequente", "link_preview.author": "Per {name}", "lists.account.add": "Adder al lista", - "navigation_bar.about": "A proposito de" + "mute_modal.duration": "Duration", + "mute_modal.hide_notifications": "Celar notificationes de iste usator?", + "navigation_bar.about": "A proposito de", + "navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate", + "navigation_bar.blocks": "Usatores blocate", + "navigation_bar.favourites": "Favoritos", + "navigation_bar.lists": "Listas", + "navigation_bar.logout": "Clauder le session", + "navigation_bar.preferences": "Preferentias", + "navigation_bar.security": "Securitate", + "notifications.column_settings.alert": "Notificationes de scriptorio", + "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", + "notifications.column_settings.sound": "Reproducer sono", + "notifications.filter.all": "Toto", + "onboarding.compose.template": "Salute #Mastodon!", + "onboarding.profile.save_and_continue": "Salvar e continuar", + "onboarding.share.title": "Compartir tu profilo" } diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 82f1669b1a..ec0d30363c 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -2,7 +2,7 @@ "about.blocks": "Prižiūrimi serveriai", "about.contact": "Kontaktuoti:", "about.disclaimer": "Mastodon – nemokama atvirojo kodo programa ir Mastodon gGmbH prekės ženklas.", - "about.domain_blocks.no_reason_available": "Priežastis nežinoma", + "about.domain_blocks.no_reason_available": "Priežastis nepateikta", "about.domain_blocks.preamble": "Mastodon paprastai leidžia peržiūrėti turinį ir bendrauti su naudotojais iš bet kurio kito fediverse esančio serverio. Šios yra išimtys, kurios buvo padarytos šiame konkrečiame serveryje.", "about.domain_blocks.silenced.explanation": "Paprastai nematysi profilių ir turinio iš šio serverio, nebent jį aiškiai ieškosi arba pasirinksi jį sekdamas (-a).", "about.domain_blocks.silenced.title": "Ribota", @@ -35,7 +35,7 @@ "account.follow_back": "Sekti atgal", "account.followers": "Sekėjai", "account.followers.empty": "Šio naudotojo dar niekas neseka.", - "account.followers_counter": "{count, plural, one {{counter} sekėjas (-a)} few {{counter} sekėjai} many {{counter} sekėjo} other {{counter} sekėjų}}", + "account.followers_counter": "{count, plural, one {{counter} sekėjas} few {{counter} sekėjai} many {{counter} sekėjo} other {{counter} sekėjų}}", "account.following": "Seka", "account.following_counter": "{count, plural, one {{counter} Seka} few {{counter} Seka} many {{counter} Seka} other {{counter} Seka}}", "account.follows.empty": "Šis (-i) naudotojas (-a) dar nieko neseka.", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 955955b8c2..5290e13ff4 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -78,11 +78,11 @@ "bundle_modal_error.close": "மூடுக", "bundle_modal_error.message": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.", "bundle_modal_error.retry": "மீண்டும் முயற்சி செய்", - "closed_registrations.other_server_instructions": "மசுடோடன் இரு பரவலாக்கப்பட்ட மென்பொருள் என்பதால், நீங்கள் வேரு ஒரு வழங்கியில் கணக்கை உருவாக்கியிருந்தாலும் இந்த வழங்கியில் பயன்படுத்தலாம்.", - "closed_registrations_modal.description": "{domain} இல் இப்பொழுது கணக்குகள் உருவாக்க முடியாது. நீங்கள் மசுடோடன் பயன்படுத்த, குறிப்பாக {domain} முகவரியில் கணக்கைத் துவங்க வேண்டும் என்ற அவசியமில்லை என்பதை மனதில் வைத்துக் கொள்ளவும்.", + "closed_registrations.other_server_instructions": "மேச்டடான் இரு பரவலாக்கப்பட்ட மென்பொருள் என்பதால், நீங்கள் வேரு ஒரு வழங்கியில் கணக்கை உருவாக்கியிருந்தாலும் இந்த வழங்கியில் பயன்படுத்தலாம்.", + "closed_registrations_modal.description": "{domain} இல் இப்பொழுது கணக்குகள் உருவாக்க முடியாது. நீங்கள் மேச்டடான் பயன்படுத்த, குறிப்பாக {domain} முகவரியில் கணக்கைத் துவங்க வேண்டும் என்ற அவசியமில்லை என்பதை மனதில் வைத்துக் கொள்ளவும்.", "closed_registrations_modal.find_another_server": "வேறொரு வழங்கியைக் கண்டுபிடி", - "closed_registrations_modal.preamble": "மசுடோடன் ஒரு பரவலாக்கப்பட்ட மென்பொருள். ஆதனால் நீங்கள் எங்குக் கணக்கை உருவாக்கினாலும் இந்த வழங்கியில் உள்ள யாருடன் வேண்டும் என்றாலும் உரவாடலாம். நீங்களே கூட ஒரு வழங்கியை நிறுவலாம்!", - "closed_registrations_modal.title": "மசுடோடன் கணக்கு துவங்கப்படுகிறது", + "closed_registrations_modal.preamble": "மேச்டடான் ஒரு பரவலாக்கப்பட்ட மென்பொருள். ஆதனால் நீங்கள் எங்குக் கணக்கை உருவாக்கினாலும் இந்த வழங்கியில் உள்ள யாருடன் வேண்டும் என்றாலும் உரவாடலாம். நீங்களே கூட ஒரு வழங்கியை நிறுவலாம்!", + "closed_registrations_modal.title": "மேச்டடான் கணக்கு துவங்கப்படுகிறது", "column.about": "பற்றி", "column.blocks": "தடுக்கப்பட்ட பயனர்கள்", "column.bookmarks": "அடையாளக்குறிகள்", @@ -113,7 +113,7 @@ "compose.language.search": "தேடல் மொழிகள்...", "compose.published.body": "பதிவிடப்பட்டது.", "compose.published.open": "திற", - "compose.saved.body": "பதிவி சேமிக்கப்பட்டது.", + "compose.saved.body": "பதிவு சேமிக்கப்பட்டது.", "compose_form.direct_message_warning_learn_more": "மேலும் அறிய", "compose_form.encryption_warning": "Mastodonல் உள்ள பதிவுகள் முறையாக என்க்ரிப்ட்(encrypt) செய்யபடவில்லை. அதனால் முக்கிய தகவல்களை இங்கே பகிர வேண்டாம்.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", diff --git a/config/locales/doorkeeper.ie.yml b/config/locales/doorkeeper.ie.yml index 1b4b5994bd..86a5de7b37 100644 --- a/config/locales/doorkeeper.ie.yml +++ b/config/locales/doorkeeper.ie.yml @@ -70,6 +70,10 @@ ie: invalid_redirect_uri: Li uri de redirection includet ne es valid. invalid_request: unknown: Li petition manca un postulat parametre, include un ne apoyat parametre-valore, o es altrimen mal format. + invalid_token: + expired: Li access-clave expirat + revoked: Li access-clave esset revocat + unknown: Li accesse-clave es ínvalid unsupported_grant_type: Li tip de autorisation concedet ne es subtenet per li autorisant servitor. unsupported_response_type: Li autorisant servitor ne subtene ti-ci tip de response. flash: diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index f945e2342e..bde52e2a78 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -68,6 +68,7 @@ ie: form_admin_settings: backups_retention_period: Mantener usator-generat archives por li specificat quantitá de dies. bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores. + mascot: Substitue li ilustration in li avansat interfacie web. peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation. profile_directory: Li profilarium monstra omni usatores volent esser decovribil. site_contact_email: Qualmen on posse contacter te por inquestes legal o de apoy. @@ -110,6 +111,10 @@ ie: name: Etiquette value: Contenete indexable: Includer public postas in resultates de sercha + account_alias: + acct: Usator-nómine del anteyan conto + account_migration: + acct: Usator-nómine del nov conto account_warning_preset: text: Textu prefigurat title: Titul @@ -240,6 +245,7 @@ ie: url: URL de punctu terminal 'no': 'No' not_recommended: Ne recomandat + overridden: Substituet recommended: Recomandat required: mark: "*" From bd415af9a11fe7057c9f428b7bdaeb8d4fb3a77b Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 3 Jan 2024 11:23:58 +0100 Subject: [PATCH 20/27] Change streaming API host to not be overridden to localhost in development mode (#28557) --- config/initializers/1_hosts.rb | 2 +- spec/requests/content_security_policy_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/1_hosts.rb b/config/initializers/1_hosts.rb index 6ff0845c46..5c59e28bd1 100644 --- a/config/initializers/1_hosts.rb +++ b/config/initializers/1_hosts.rb @@ -23,7 +23,7 @@ Rails.application.configure do if Rails.env.production? "ws#{https ? 's' : ''}://#{web_host}" else - "ws://#{ENV['REMOTE_DEV'] == 'true' ? host.split(':').first : 'localhost'}:4000" + "ws://#{host.split(':').first}:4000" end end diff --git a/spec/requests/content_security_policy_spec.rb b/spec/requests/content_security_policy_spec.rb index 7610e698cd..d4cc40bce5 100644 --- a/spec/requests/content_security_policy_spec.rb +++ b/spec/requests/content_security_policy_spec.rb @@ -20,7 +20,7 @@ describe 'Content-Security-Policy' do "form-action 'self'", "child-src 'self' blob: https://cb6e6126.ngrok.io", "worker-src 'self' blob: https://cb6e6126.ngrok.io", - "connect-src 'self' data: blob: https://cb6e6126.ngrok.io ws://localhost:4000", + "connect-src 'self' data: blob: https://cb6e6126.ngrok.io ws://cb6e6126.ngrok.io:4000", "script-src 'self' https://cb6e6126.ngrok.io 'wasm-unsafe-eval'" ) end From 092bb8a27af9ee87ff9ebabaf354477470ea3a94 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 3 Jan 2024 12:29:26 +0100 Subject: [PATCH 21/27] Fix Mastodon not correctly processing HTTP Signatures with query strings (#28476) --- .../concerns/signature_verification.rb | 22 ++++++- app/lib/request.rb | 11 +++- spec/requests/signature_verification_spec.rb | 66 +++++++++++++++++++ 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index f0a344f1c9..35391e64c4 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -91,14 +91,23 @@ module SignatureVerification raise SignatureVerificationError, "Public key not found for key #{signature_params['keyId']}" if actor.nil? signature = Base64.decode64(signature_params['signature']) - compare_signed_string = build_signed_string + compare_signed_string = build_signed_string(include_query_string: true) return actor unless verify_signature(actor, signature, compare_signed_string).nil? + # Compatibility quirk with older Mastodon versions + compare_signed_string = build_signed_string(include_query_string: false) + return actor unless verify_signature(actor, signature, compare_signed_string).nil? + actor = stoplight_wrap_request { actor_refresh_key!(actor) } raise SignatureVerificationError, "Could not refresh public key #{signature_params['keyId']}" if actor.nil? + compare_signed_string = build_signed_string(include_query_string: true) + return actor unless verify_signature(actor, signature, compare_signed_string).nil? + + # Compatibility quirk with older Mastodon versions + compare_signed_string = build_signed_string(include_query_string: false) return actor unless verify_signature(actor, signature, compare_signed_string).nil? fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri} using rsa-sha256 (RSASSA-PKCS1-v1_5 with SHA-256)", signed_string: compare_signed_string, signature: signature_params['signature'] @@ -180,11 +189,18 @@ module SignatureVerification nil end - def build_signed_string + def build_signed_string(include_query_string: true) signed_headers.map do |signed_header| case signed_header when Request::REQUEST_TARGET - "#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.path}" + if include_query_string + "#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.original_fullpath}" + else + # Current versions of Mastodon incorrectly omit the query string from the (request-target) pseudo-header. + # Therefore, temporarily support such incorrect signatures for compatibility. + # TODO: remove eventually some time after release of the fixed version + "#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.path}" + end when '(created)' raise SignatureVerificationError, 'Invalid pseudo-header (created) for rsa-sha256' unless signature_algorithm == 'hs2019' raise SignatureVerificationError, 'Pseudo-header (created) used but corresponding argument missing' if signature_params['created'].blank? diff --git a/app/lib/request.rb b/app/lib/request.rb index 5f128af734..8d4120868d 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -77,6 +77,7 @@ class Request @url = Addressable::URI.parse(url).normalize @http_client = options.delete(:http_client) @allow_local = options.delete(:allow_local) + @full_path = options.delete(:with_query_string) @options = options.merge(socket_class: use_proxy? || @allow_local ? ProxySocket : Socket) @options = @options.merge(timeout_class: PerOperationWithDeadline, timeout_options: TIMEOUT) @options = @options.merge(proxy_url) if use_proxy? @@ -146,7 +147,7 @@ class Request private def set_common_headers! - @headers[REQUEST_TARGET] = "#{@verb} #{@url.path}" + @headers[REQUEST_TARGET] = request_target @headers['User-Agent'] = Mastodon::Version.user_agent @headers['Host'] = @url.host @headers['Date'] = Time.now.utc.httpdate @@ -157,6 +158,14 @@ class Request @headers['Digest'] = "SHA-256=#{Digest::SHA256.base64digest(@options[:body])}" end + def request_target + if @url.query.nil? || !@full_path + "#{@verb} #{@url.path}" + else + "#{@verb} #{@url.path}?#{@url.query}" + end + end + def signature algorithm = 'rsa-sha256' signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string)) diff --git a/spec/requests/signature_verification_spec.rb b/spec/requests/signature_verification_spec.rb index b753750b84..401828c4a3 100644 --- a/spec/requests/signature_verification_spec.rb +++ b/spec/requests/signature_verification_spec.rb @@ -94,6 +94,72 @@ describe 'signature verification concern' do end end + context 'with a valid signature on a GET request that has a query string' do + let(:signature_header) do + 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="SDMa4r/DQYMXYxVgYO2yEqGWWUXugKjVuz0I8dniQAk+aunzBaF2aPu+4grBfawAshlx1Xytl8lhb0H2MllEz16/tKY7rUrb70MK0w8ohXgpb0qs3YvQgdj4X24L1x2MnkFfKHR/J+7TBlnivq0HZqXm8EIkPWLv+eQxu8fbowLwHIVvRd/3t6FzvcfsE0UZKkoMEX02542MhwSif6cu7Ec/clsY9qgKahb9JVGOGS1op9Lvg/9y1mc8KCgD83U5IxVygYeYXaVQ6gixA9NgZiTCwEWzHM5ELm7w5hpdLFYxYOHg/3G3fiqJzpzNQAcCD4S4JxfE7hMI0IzVlNLT6A=="' # rubocop:disable Layout/LineLength + end + + it 'successfuly verifies signature', :aggregate_failures do + expect(signature_header).to eq build_signature_string(actor_keypair, 'https://remote.domain/users/bob#main-key', 'get /activitypub/success?foo=42', { 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', 'Host' => 'www.example.com' }) + + get '/activitypub/success?foo=42', headers: { + 'Host' => 'www.example.com', + 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', + 'Signature' => signature_header, + } + + expect(response).to have_http_status(200) + expect(body_as_json).to match( + signed_request: true, + signature_actor_id: actor.id.to_s + ) + end + end + + context 'when the query string is missing from the signature verification (compatibility quirk)' do + let(:signature_header) do + 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="Z8ilar3J7bOwqZkMp7sL8sRs4B1FT+UorbmvWoE+A5UeoOJ3KBcUmbsh+k3wQwbP5gMNUrra9rEWabpasZGphLsbDxfbsWL3Cf0PllAc7c1c7AFEwnewtExI83/qqgEkfWc2z7UDutXc2NfgAx89Ox8DXU/fA2GG0jILjB6UpFyNugkY9rg6oI31UnvfVi3R7sr3/x8Ea3I9thPvqI2byF6cojknSpDAwYzeKdngX3TAQEGzFHz3SDWwyp3jeMWfwvVVbM38FxhvAnSumw7YwWW4L7M7h4M68isLimoT3yfCn2ucBVL5Dz8koBpYf/40w7QidClAwCafZQFC29yDOg=="' # rubocop:disable Layout/LineLength + end + + it 'successfuly verifies signature', :aggregate_failures do + expect(signature_header).to eq build_signature_string(actor_keypair, 'https://remote.domain/users/bob#main-key', 'get /activitypub/success', { 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', 'Host' => 'www.example.com' }) + + get '/activitypub/success?foo=42', headers: { + 'Host' => 'www.example.com', + 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', + 'Signature' => signature_header, + } + + expect(response).to have_http_status(200) + expect(body_as_json).to match( + signed_request: true, + signature_actor_id: actor.id.to_s + ) + end + end + + context 'with mismatching query string' do + let(:signature_header) do + 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="SDMa4r/DQYMXYxVgYO2yEqGWWUXugKjVuz0I8dniQAk+aunzBaF2aPu+4grBfawAshlx1Xytl8lhb0H2MllEz16/tKY7rUrb70MK0w8ohXgpb0qs3YvQgdj4X24L1x2MnkFfKHR/J+7TBlnivq0HZqXm8EIkPWLv+eQxu8fbowLwHIVvRd/3t6FzvcfsE0UZKkoMEX02542MhwSif6cu7Ec/clsY9qgKahb9JVGOGS1op9Lvg/9y1mc8KCgD83U5IxVygYeYXaVQ6gixA9NgZiTCwEWzHM5ELm7w5hpdLFYxYOHg/3G3fiqJzpzNQAcCD4S4JxfE7hMI0IzVlNLT6A=="' # rubocop:disable Layout/LineLength + end + + it 'fails to verify signature', :aggregate_failures do + expect(signature_header).to eq build_signature_string(actor_keypair, 'https://remote.domain/users/bob#main-key', 'get /activitypub/success?foo=42', { 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', 'Host' => 'www.example.com' }) + + get '/activitypub/success?foo=43', headers: { + 'Host' => 'www.example.com', + 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', + 'Signature' => signature_header, + } + + expect(body_as_json).to match( + signed_request: true, + signature_actor_id: nil, + error: anything + ) + end + end + context 'with a mismatching path' do it 'fails to verify signature', :aggregate_failures do get '/activitypub/alternative-path', headers: { From e12d8893f42e5d2b2c71b43e0dff09438fbe81a2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 3 Jan 2024 08:06:15 -0500 Subject: [PATCH 22/27] Fix intermittent failure from unspecified order in `export_domain_blocks` controller spec (#28562) --- app/controllers/admin/export_domain_blocks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/admin/export_domain_blocks_controller.rb b/app/controllers/admin/export_domain_blocks_controller.rb index 433b8a1587..ffc4478172 100644 --- a/app/controllers/admin/export_domain_blocks_controller.rb +++ b/app/controllers/admin/export_domain_blocks_controller.rb @@ -68,7 +68,7 @@ module Admin def export_data CSV.generate(headers: export_headers, write_headers: true) do |content| - DomainBlock.with_limitations.each do |instance| + DomainBlock.with_limitations.order(id: :asc).each do |instance| content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate] end end From 74a0d81e90607c275ab9c411a8b9c29512afa961 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 3 Jan 2024 08:06:38 -0500 Subject: [PATCH 23/27] Add coverage for CLI `self-destruct` command (#28565) Co-authored-by: Claire --- spec/lib/mastodon/cli/main_spec.rb | 109 +++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/spec/lib/mastodon/cli/main_spec.rb b/spec/lib/mastodon/cli/main_spec.rb index 59f1fc4784..931ca57c30 100644 --- a/spec/lib/mastodon/cli/main_spec.rb +++ b/spec/lib/mastodon/cli/main_spec.rb @@ -20,4 +20,113 @@ describe Mastodon::CLI::Main do .to output_results(Mastodon::Version.to_s) end end + + describe '#self_destruct' do + let(:action) { :self_destruct } + + context 'with self destruct mode enabled' do + before do + allow(SelfDestructHelper).to receive(:self_destruct?).and_return(true) + end + + context 'with pending accounts' do + before { Fabricate(:account) } + + it 'reports about pending accounts' do + expect { subject } + .to output_results( + 'already enabled', + 'still pending deletion' + ) + .and raise_error(SystemExit) + end + end + + context 'with sidekiq notices being processed' do + before do + Account.delete_all + stats_double = instance_double(Sidekiq::Stats, enqueued: 5) + allow(Sidekiq::Stats).to receive(:new).and_return(stats_double) + end + + it 'reports about notices' do + expect { subject } + .to output_results( + 'already enabled', + 'notices are still being' + ) + .and raise_error(SystemExit) + end + end + + context 'with sidekiq failed deliveries' do + before do + Account.delete_all + stats_double = instance_double(Sidekiq::Stats, enqueued: 0, retry_size: 10) + allow(Sidekiq::Stats).to receive(:new).and_return(stats_double) + end + + it 'reports about notices' do + expect { subject } + .to output_results( + 'already enabled', + 'some have failed and are scheduled' + ) + .and raise_error(SystemExit) + end + end + + context 'with self descruct mode ready' do + before do + Account.delete_all + stats_double = instance_double(Sidekiq::Stats, enqueued: 0, retry_size: 0) + allow(Sidekiq::Stats).to receive(:new).and_return(stats_double) + end + + it 'reports about notices' do + expect { subject } + .to output_results( + 'already enabled', + 'can safely delete all data' + ) + .and raise_error(SystemExit) + end + end + end + + context 'with self destruct mode disabled' do + before do + allow(SelfDestructHelper).to receive(:self_destruct?).and_return(false) + end + + context 'with an incorrect response to hostname' do + let(:prompt_double) { instance_double(TTY::Prompt, ask: 'wrong') } + + before do + allow(TTY::Prompt).to receive(:new).and_return(prompt_double) + end + + it 'reports failed answer' do + expect { subject } + .to raise_error(SystemExit) + end + end + + context 'with a correct response to hostname' do + # TODO: Update after tty-prompt replace with Thor methods + let(:prompt_double) { instance_double(TTY::Prompt, ask: Rails.configuration.x.local_domain, warn: nil, no?: false, ok: nil) } + + before do + allow(TTY::Prompt).to receive(:new).and_return(prompt_double) + end + + it 'instructs to set the appropriate environment variable' do + expect { subject } + .to_not raise_error + # TODO: Update after tty-prompt replace with Thor methods + expect(prompt_double).to have_received(:ok).with(/add the following variable/) + end + end + end + end end From 51d2b80ff7407a6c49a44eee80c67f81dc09d7dc Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 3 Jan 2024 08:22:03 -0500 Subject: [PATCH 24/27] Solve `Abc/*` metrics for `db/*migrate*` files (#28568) --- .rubocop.yml | 2 - ...221101190723_backfill_admin_action_logs.rb | 209 +++++++++++------- ...114142_backfill_admin_action_logs_again.rb | 209 +++++++++++------- 3 files changed, 254 insertions(+), 166 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 61cb1164b4..8832e28f6e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -74,14 +74,12 @@ Metrics/ModuleLength: Metrics/AbcSize: Exclude: - 'lib/mastodon/cli/*.rb' - - db/*migrate/**/* # Reason: Currently disabled in .rubocop_todo.yml # https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity Metrics/CyclomaticComplexity: Exclude: - lib/mastodon/cli/*.rb - - db/*migrate/**/* # Reason: # https://docs.rubocop.org/rubocop/cops_metrics.html#metricsparameterlists diff --git a/db/post_migrate/20221101190723_backfill_admin_action_logs.rb b/db/post_migrate/20221101190723_backfill_admin_action_logs.rb index 6476f4b13a..1d8d983b3a 100644 --- a/db/post_migrate/20221101190723_backfill_admin_action_logs.rb +++ b/db/post_migrate/20221101190723_backfill_admin_action_logs.rb @@ -77,90 +77,135 @@ class BackfillAdminActionLogs < ActiveRecord::Migration[6.1] def up safety_assured do - AdminActionLog.includes(:account).where(target_type: 'Account', human_identifier: nil).find_each do |log| - next if log.account.nil? - - log.update_attribute('human_identifier', log.account.acct) - end - - AdminActionLog.includes(user: :account).where(target_type: 'User', human_identifier: nil).find_each do |log| - next if log.user.nil? - - log.update_attribute('human_identifier', log.user.account.acct) - log.update_attribute('route_param', log.user.account_id) - end - - AdminActionLog.where(target_type: 'Report', human_identifier: nil).in_batches.update_all('human_identifier = target_id::text') - - AdminActionLog.includes(:domain_block).where(target_type: 'DomainBlock').find_each do |log| - next if log.domain_block.nil? - - log.update_attribute('human_identifier', log.domain_block.domain) - end - - AdminActionLog.includes(:domain_allow).where(target_type: 'DomainAllow').find_each do |log| - next if log.domain_allow.nil? - - log.update_attribute('human_identifier', log.domain_allow.domain) - end - - AdminActionLog.includes(:email_domain_block).where(target_type: 'EmailDomainBlock').find_each do |log| - next if log.email_domain_block.nil? - - log.update_attribute('human_identifier', log.email_domain_block.domain) - end - - AdminActionLog.includes(:unavailable_domain).where(target_type: 'UnavailableDomain').find_each do |log| - next if log.unavailable_domain.nil? - - log.update_attribute('human_identifier', log.unavailable_domain.domain) - end - - AdminActionLog.includes(status: :account).where(target_type: 'Status', human_identifier: nil).find_each do |log| - next if log.status.nil? - - log.update_attribute('human_identifier', log.status.account.acct) - log.update_attribute('permalink', log.status.uri) - end - - AdminActionLog.includes(account_warning: :account).where(target_type: 'AccountWarning', human_identifier: nil).find_each do |log| - next if log.account_warning.nil? - - log.update_attribute('human_identifier', log.account_warning.account.acct) - end - - AdminActionLog.includes(:announcement).where(target_type: 'Announcement', human_identifier: nil).find_each do |log| - next if log.announcement.nil? - - log.update_attribute('human_identifier', log.announcement.text) - end - - AdminActionLog.includes(:ip_block).where(target_type: 'IpBlock', human_identifier: nil).find_each do |log| - next if log.ip_block.nil? - - log.update_attribute('human_identifier', "#{log.ip_block.ip}/#{log.ip_block.ip.prefix}") - end - - AdminActionLog.includes(:custom_emoji).where(target_type: 'CustomEmoji', human_identifier: nil).find_each do |log| - next if log.custom_emoji.nil? - - log.update_attribute('human_identifier', log.custom_emoji.shortcode) - end - - AdminActionLog.includes(:canonical_email_block).where(target_type: 'CanonicalEmailBlock', human_identifier: nil).find_each do |log| - next if log.canonical_email_block.nil? - - log.update_attribute('human_identifier', log.canonical_email_block.canonical_email_hash) - end - - AdminActionLog.includes(appeal: :account).where(target_type: 'Appeal', human_identifier: nil).find_each do |log| - next if log.appeal.nil? - - log.update_attribute('human_identifier', log.appeal.account.acct) - log.update_attribute('route_param', log.appeal.account_warning_id) - end + process_logs_for_account + process_logs_for_user + process_logs_for_report + process_logs_for_domain_block + process_logs_for_domain_allow + process_logs_for_email_domain_block + process_logs_for_unavailable_domain + process_logs_for_status + process_logs_for_account_warning + process_logs_for_announcement + process_logs_for_ip_block + process_logs_for_custom_emoji + process_logs_for_canonical_email_block + process_logs_for_appeal end end def down; end + + private + + def process_logs_for_account + AdminActionLog.includes(:account).where(target_type: 'Account', human_identifier: nil).find_each do |log| + next if log.account.nil? + + log.update_attribute('human_identifier', log.account.acct) + end + end + + def process_logs_for_user + AdminActionLog.includes(user: :account).where(target_type: 'User', human_identifier: nil).find_each do |log| + next if log.user.nil? + + log.update_attribute('human_identifier', log.user.account.acct) + log.update_attribute('route_param', log.user.account_id) + end + end + + def process_logs_for_report + AdminActionLog.where(target_type: 'Report', human_identifier: nil).in_batches.update_all('human_identifier = target_id::text') + end + + def process_logs_for_domain_block + AdminActionLog.includes(:domain_block).where(target_type: 'DomainBlock').find_each do |log| + next if log.domain_block.nil? + + log.update_attribute('human_identifier', log.domain_block.domain) + end + end + + def process_logs_for_domain_allow + AdminActionLog.includes(:domain_allow).where(target_type: 'DomainAllow').find_each do |log| + next if log.domain_allow.nil? + + log.update_attribute('human_identifier', log.domain_allow.domain) + end + end + + def process_logs_for_email_domain_block + AdminActionLog.includes(:email_domain_block).where(target_type: 'EmailDomainBlock').find_each do |log| + next if log.email_domain_block.nil? + + log.update_attribute('human_identifier', log.email_domain_block.domain) + end + end + + def process_logs_for_unavailable_domain + AdminActionLog.includes(:unavailable_domain).where(target_type: 'UnavailableDomain').find_each do |log| + next if log.unavailable_domain.nil? + + log.update_attribute('human_identifier', log.unavailable_domain.domain) + end + end + + def process_logs_for_status + AdminActionLog.includes(status: :account).where(target_type: 'Status', human_identifier: nil).find_each do |log| + next if log.status.nil? + + log.update_attribute('human_identifier', log.status.account.acct) + log.update_attribute('permalink', log.status.uri) + end + end + + def process_logs_for_account_warning + AdminActionLog.includes(account_warning: :account).where(target_type: 'AccountWarning', human_identifier: nil).find_each do |log| + next if log.account_warning.nil? + + log.update_attribute('human_identifier', log.account_warning.account.acct) + end + end + + def process_logs_for_announcement + AdminActionLog.includes(:announcement).where(target_type: 'Announcement', human_identifier: nil).find_each do |log| + next if log.announcement.nil? + + log.update_attribute('human_identifier', log.announcement.text) + end + end + + def process_logs_for_ip_block + AdminActionLog.includes(:ip_block).where(target_type: 'IpBlock', human_identifier: nil).find_each do |log| + next if log.ip_block.nil? + + log.update_attribute('human_identifier', "#{log.ip_block.ip}/#{log.ip_block.ip.prefix}") + end + end + + def process_logs_for_custom_emoji + AdminActionLog.includes(:custom_emoji).where(target_type: 'CustomEmoji', human_identifier: nil).find_each do |log| + next if log.custom_emoji.nil? + + log.update_attribute('human_identifier', log.custom_emoji.shortcode) + end + end + + def process_logs_for_canonical_email_block + AdminActionLog.includes(:canonical_email_block).where(target_type: 'CanonicalEmailBlock', human_identifier: nil).find_each do |log| + next if log.canonical_email_block.nil? + + log.update_attribute('human_identifier', log.canonical_email_block.canonical_email_hash) + end + end + + def process_logs_for_appeal + AdminActionLog.includes(appeal: :account).where(target_type: 'Appeal', human_identifier: nil).find_each do |log| + next if log.appeal.nil? + + log.update_attribute('human_identifier', log.appeal.account.acct) + log.update_attribute('route_param', log.appeal.account_warning_id) + end + end end diff --git a/db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb b/db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb index 3c68470a7f..c080e77ecf 100644 --- a/db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb +++ b/db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb @@ -77,90 +77,135 @@ class BackfillAdminActionLogsAgain < ActiveRecord::Migration[6.1] def up safety_assured do - AdminActionLog.includes(:account).where(target_type: 'Account', human_identifier: nil).find_each do |log| - next if log.account.nil? - - log.update_attribute('human_identifier', log.account.acct) - end - - AdminActionLog.includes(user: :account).where(target_type: 'User', human_identifier: nil).find_each do |log| - next if log.user.nil? - - log.update_attribute('human_identifier', log.user.account.acct) - log.update_attribute('route_param', log.user.account_id) - end - - AdminActionLog.where(target_type: 'Report', human_identifier: nil).in_batches.update_all('human_identifier = target_id::text') - - AdminActionLog.includes(:domain_block).where(target_type: 'DomainBlock').find_each do |log| - next if log.domain_block.nil? - - log.update_attribute('human_identifier', log.domain_block.domain) - end - - AdminActionLog.includes(:domain_allow).where(target_type: 'DomainAllow').find_each do |log| - next if log.domain_allow.nil? - - log.update_attribute('human_identifier', log.domain_allow.domain) - end - - AdminActionLog.includes(:email_domain_block).where(target_type: 'EmailDomainBlock').find_each do |log| - next if log.email_domain_block.nil? - - log.update_attribute('human_identifier', log.email_domain_block.domain) - end - - AdminActionLog.includes(:unavailable_domain).where(target_type: 'UnavailableDomain').find_each do |log| - next if log.unavailable_domain.nil? - - log.update_attribute('human_identifier', log.unavailable_domain.domain) - end - - AdminActionLog.includes(status: :account).where(target_type: 'Status', human_identifier: nil).find_each do |log| - next if log.status.nil? - - log.update_attribute('human_identifier', log.status.account.acct) - log.update_attribute('permalink', log.status.uri) - end - - AdminActionLog.includes(account_warning: :account).where(target_type: 'AccountWarning', human_identifier: nil).find_each do |log| - next if log.account_warning.nil? - - log.update_attribute('human_identifier', log.account_warning.account.acct) - end - - AdminActionLog.includes(:announcement).where(target_type: 'Announcement', human_identifier: nil).find_each do |log| - next if log.announcement.nil? - - log.update_attribute('human_identifier', log.announcement.text) - end - - AdminActionLog.includes(:ip_block).where(target_type: 'IpBlock', human_identifier: nil).find_each do |log| - next if log.ip_block.nil? - - log.update_attribute('human_identifier', "#{log.ip_block.ip}/#{log.ip_block.ip.prefix}") - end - - AdminActionLog.includes(:custom_emoji).where(target_type: 'CustomEmoji', human_identifier: nil).find_each do |log| - next if log.custom_emoji.nil? - - log.update_attribute('human_identifier', log.custom_emoji.shortcode) - end - - AdminActionLog.includes(:canonical_email_block).where(target_type: 'CanonicalEmailBlock', human_identifier: nil).find_each do |log| - next if log.canonical_email_block.nil? - - log.update_attribute('human_identifier', log.canonical_email_block.canonical_email_hash) - end - - AdminActionLog.includes(appeal: :account).where(target_type: 'Appeal', human_identifier: nil).find_each do |log| - next if log.appeal.nil? - - log.update_attribute('human_identifier', log.appeal.account.acct) - log.update_attribute('route_param', log.appeal.account_warning_id) - end + process_logs_for_account + process_logs_for_user + process_logs_for_report + process_logs_for_domain_block + process_logs_for_domain_allow + process_logs_for_email_domain_block + process_logs_for_unavailable_domain + process_logs_for_status + process_logs_for_account_warning + process_logs_for_announcement + process_logs_for_ip_block + process_logs_for_custom_emoji + process_logs_for_canonical_email_block + process_logs_for_appeal end end def down; end + + private + + def process_logs_for_account + AdminActionLog.includes(:account).where(target_type: 'Account', human_identifier: nil).find_each do |log| + next if log.account.nil? + + log.update_attribute('human_identifier', log.account.acct) + end + end + + def process_logs_for_user + AdminActionLog.includes(user: :account).where(target_type: 'User', human_identifier: nil).find_each do |log| + next if log.user.nil? + + log.update_attribute('human_identifier', log.user.account.acct) + log.update_attribute('route_param', log.user.account_id) + end + end + + def process_logs_for_report + AdminActionLog.where(target_type: 'Report', human_identifier: nil).in_batches.update_all('human_identifier = target_id::text') + end + + def process_logs_for_domain_block + AdminActionLog.includes(:domain_block).where(target_type: 'DomainBlock').find_each do |log| + next if log.domain_block.nil? + + log.update_attribute('human_identifier', log.domain_block.domain) + end + end + + def process_logs_for_domain_allow + AdminActionLog.includes(:domain_allow).where(target_type: 'DomainAllow').find_each do |log| + next if log.domain_allow.nil? + + log.update_attribute('human_identifier', log.domain_allow.domain) + end + end + + def process_logs_for_email_domain_block + AdminActionLog.includes(:email_domain_block).where(target_type: 'EmailDomainBlock').find_each do |log| + next if log.email_domain_block.nil? + + log.update_attribute('human_identifier', log.email_domain_block.domain) + end + end + + def process_logs_for_unavailable_domain + AdminActionLog.includes(:unavailable_domain).where(target_type: 'UnavailableDomain').find_each do |log| + next if log.unavailable_domain.nil? + + log.update_attribute('human_identifier', log.unavailable_domain.domain) + end + end + + def process_logs_for_status + AdminActionLog.includes(status: :account).where(target_type: 'Status', human_identifier: nil).find_each do |log| + next if log.status.nil? + + log.update_attribute('human_identifier', log.status.account.acct) + log.update_attribute('permalink', log.status.uri) + end + end + + def process_logs_for_account_warning + AdminActionLog.includes(account_warning: :account).where(target_type: 'AccountWarning', human_identifier: nil).find_each do |log| + next if log.account_warning.nil? + + log.update_attribute('human_identifier', log.account_warning.account.acct) + end + end + + def process_logs_for_announcement + AdminActionLog.includes(:announcement).where(target_type: 'Announcement', human_identifier: nil).find_each do |log| + next if log.announcement.nil? + + log.update_attribute('human_identifier', log.announcement.text) + end + end + + def process_logs_for_ip_block + AdminActionLog.includes(:ip_block).where(target_type: 'IpBlock', human_identifier: nil).find_each do |log| + next if log.ip_block.nil? + + log.update_attribute('human_identifier', "#{log.ip_block.ip}/#{log.ip_block.ip.prefix}") + end + end + + def process_logs_for_custom_emoji + AdminActionLog.includes(:custom_emoji).where(target_type: 'CustomEmoji', human_identifier: nil).find_each do |log| + next if log.custom_emoji.nil? + + log.update_attribute('human_identifier', log.custom_emoji.shortcode) + end + end + + def process_logs_for_canonical_email_block + AdminActionLog.includes(:canonical_email_block).where(target_type: 'CanonicalEmailBlock', human_identifier: nil).find_each do |log| + next if log.canonical_email_block.nil? + + log.update_attribute('human_identifier', log.canonical_email_block.canonical_email_hash) + end + end + + def process_logs_for_appeal + AdminActionLog.includes(appeal: :account).where(target_type: 'Appeal', human_identifier: nil).find_each do |log| + next if log.appeal.nil? + + log.update_attribute('human_identifier', log.appeal.account.acct) + log.update_attribute('route_param', log.appeal.account_warning_id) + end + end end From 5c769de096ce7205308deaf5d62ad516b1e39259 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 3 Jan 2024 09:12:56 -0500 Subject: [PATCH 25/27] Add spec coverage for `CLI::Media#remove_orphans` command (#28267) --- lib/mastodon/cli/base.rb | 1 + spec/lib/mastodon/cli/media_spec.rb | 54 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lib/mastodon/cli/base.rb b/lib/mastodon/cli/base.rb index 32aff2fcc5..8c222bbb2b 100644 --- a/lib/mastodon/cli/base.rb +++ b/lib/mastodon/cli/base.rb @@ -4,6 +4,7 @@ require_relative '../../../config/boot' require_relative '../../../config/environment' require 'thor' +require 'pastel' require_relative 'progress_helper' module Mastodon diff --git a/spec/lib/mastodon/cli/media_spec.rb b/spec/lib/mastodon/cli/media_spec.rb index 24e1467a3c..071bcd9e34 100644 --- a/spec/lib/mastodon/cli/media_spec.rb +++ b/spec/lib/mastodon/cli/media_spec.rb @@ -184,4 +184,58 @@ describe Mastodon::CLI::Media do end end end + + describe '#remove_orphans' do + let(:action) { :remove_orphans } + + before do + FileUtils.mkdir_p Rails.public_path.join('system') + end + + context 'without any options' do + it 'runs without error' do + expect { subject } + .to output_results('Removed', 'orphans (approx') + end + end + + context 'when in azure mode' do + before do + allow(Paperclip::Attachment).to receive(:default_options).and_return(storage: :azure) + end + + it 'warns about usage and exits' do + expect { subject } + .to output_results('azure storage driver is not supported') + .and raise_error(SystemExit) + end + end + + context 'when in fog mode' do + before do + allow(Paperclip::Attachment).to receive(:default_options).and_return(storage: :fog) + end + + it 'warns about usage and exits' do + expect { subject } + .to output_results('fog storage driver is not supported') + .and raise_error(SystemExit) + end + end + + context 'when in filesystem mode' do + before do + allow(File).to receive(:delete).and_return(true) + media_attachment.delete + end + + let(:media_attachment) { Fabricate(:media_attachment) } + + it 'removes the unlinked files' do + expect { subject } + .to output_results('Removed', 'orphans (approx') + expect(File).to have_received(:delete).with(media_attachment.file.path) + end + end + end end From 905794fd57386a33f8773cbeaec7b1cbb37c3e68 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 3 Jan 2024 16:04:10 +0100 Subject: [PATCH 26/27] Remove v3.5 branch from supported Mastodon versions (#28574) --- SECURITY.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 954ff73a24..81472b01b4 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,10 +13,8 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through ## Supported Versions -| Version | Supported | -| ------- | ---------------- | -| 4.2.x | Yes | -| 4.1.x | Yes | -| 4.0.x | No | -| 3.5.x | Until 2023-12-31 | -| < 3.5 | No | +| Version | Supported | +| ------- | --------- | +| 4.2.x | Yes | +| 4.1.x | Yes | +| < 4.1 | No | From f92d8c654df654538096efff05e9b1a989d01490 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 3 Jan 2024 10:08:08 -0500 Subject: [PATCH 27/27] Standardize on Thor methods in CLI classes (#28566) --- lib/mastodon/cli/federation.rb | 36 ++++++---------- lib/mastodon/cli/preview_cards.rb | 1 - spec/lib/mastodon/cli/main_spec.rb | 68 ++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 35 deletions(-) diff --git a/lib/mastodon/cli/federation.rb b/lib/mastodon/cli/federation.rb index 1b4cb467a5..4a4dde3686 100644 --- a/lib/mastodon/cli/federation.rb +++ b/lib/mastodon/cli/federation.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'tty-prompt' - module Mastodon::CLI module Federation extend ActiveSupport::Concern @@ -30,45 +28,39 @@ module Mastodon::CLI LONG_DESC def self_destruct if SelfDestructHelper.self_destruct? - prompt.ok('Self-destruct mode is already enabled for this Mastodon server') + say('Self-destruct mode is already enabled for this Mastodon server', :green) pending_accounts = Account.local.without_suspended.count + Account.local.suspended.joins(:deletion_request).count sidekiq_stats = Sidekiq::Stats.new if pending_accounts.positive? - prompt.warn("#{pending_accounts} accounts are still pending deletion.") + say("#{pending_accounts} accounts are still pending deletion.", :yellow) elsif sidekiq_stats.enqueued.positive? - prompt.warn('Deletion notices are still being processed') + say('Deletion notices are still being processed', :yellow) elsif sidekiq_stats.retry_size.positive? - prompt.warn('At least one delivery attempt for each deletion notice has been made, but some have failed and are scheduled for retry') + say('At least one delivery attempt for each deletion notice has been made, but some have failed and are scheduled for retry', :yellow) else - prompt.ok('Every deletion notice has been sent! You can safely delete all data and decomission your servers!') + say('Every deletion notice has been sent! You can safely delete all data and decomission your servers!', :green) end exit(0) end - exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain + exit(1) unless ask('Type in the domain of the server to confirm:') == Rails.configuration.x.local_domain - prompt.warn('This operation WILL NOT be reversible.') - prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') - prompt.warn('The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process).') + say('This operation WILL NOT be reversible.', :yellow) + say('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.', :yellow) + say('The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process).', :yellow) - exit(1) if prompt.no?('Are you sure you want to proceed?') + exit(1) if no?('Are you sure you want to proceed?') self_destruct_value = Rails.application.message_verifier('self-destruct').generate(Rails.configuration.x.local_domain) - prompt.ok('To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes:') - prompt.ok(" SELF_DESTRUCT=#{self_destruct_value}") - prompt.ok("\nYou can re-run this command to see the state of the self-destruct process.") - rescue TTY::Reader::InputInterrupt + say('To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes:', :green) + say(" SELF_DESTRUCT=#{self_destruct_value}", :green) + say("\nYou can re-run this command to see the state of the self-destruct process.", :green) + rescue Interrupt exit(1) end - - private - - def prompt - @prompt ||= TTY::Prompt.new - end end end end diff --git a/lib/mastodon/cli/preview_cards.rb b/lib/mastodon/cli/preview_cards.rb index 2df3d095da..9b20a0cbb8 100644 --- a/lib/mastodon/cli/preview_cards.rb +++ b/lib/mastodon/cli/preview_cards.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require 'tty-prompt' require_relative 'base' module Mastodon::CLI diff --git a/spec/lib/mastodon/cli/main_spec.rb b/spec/lib/mastodon/cli/main_spec.rb index 931ca57c30..081cd2dd47 100644 --- a/spec/lib/mastodon/cli/main_spec.rb +++ b/spec/lib/mastodon/cli/main_spec.rb @@ -100,33 +100,77 @@ describe Mastodon::CLI::Main do end context 'with an incorrect response to hostname' do - let(:prompt_double) { instance_double(TTY::Prompt, ask: 'wrong') } - before do - allow(TTY::Prompt).to receive(:new).and_return(prompt_double) + answer_hostname_incorrectly end - it 'reports failed answer' do + it 'exits silently' do expect { subject } .to raise_error(SystemExit) end end - context 'with a correct response to hostname' do - # TODO: Update after tty-prompt replace with Thor methods - let(:prompt_double) { instance_double(TTY::Prompt, ask: Rails.configuration.x.local_domain, warn: nil, no?: false, ok: nil) } - + context 'with a correct response to hostname but no to proceed' do before do - allow(TTY::Prompt).to receive(:new).and_return(prompt_double) + answer_hostname_correctly + decline_proceed + end + + it 'passes first step but stops before instructions' do + expect { subject } + .to output_results('operation WILL NOT') + .and raise_error(SystemExit) + end + end + + context 'with a correct response to hostname and yes to proceed' do + before do + answer_hostname_correctly + accept_proceed end it 'instructs to set the appropriate environment variable' do expect { subject } - .to_not raise_error - # TODO: Update after tty-prompt replace with Thor methods - expect(prompt_double).to have_received(:ok).with(/add the following variable/) + .to output_results( + 'operation WILL NOT', + 'the following variable' + ) end end + + private + + def answer_hostname_incorrectly + allow(cli.shell) + .to receive(:ask) + .with('Type in the domain of the server to confirm:') + .and_return('wrong.host') + .once + end + + def answer_hostname_correctly + allow(cli.shell) + .to receive(:ask) + .with('Type in the domain of the server to confirm:') + .and_return(Rails.configuration.x.local_domain) + .once + end + + def decline_proceed + allow(cli.shell) + .to receive(:no?) + .with('Are you sure you want to proceed?') + .and_return(true) + .once + end + + def accept_proceed + allow(cli.shell) + .to receive(:no?) + .with('Are you sure you want to proceed?') + .and_return(false) + .once + end end end end