Merge branch 'glitch-soc' into develop

This commit is contained in:
Jeremy Kescher 2024-01-04 17:55:25 +01:00
commit 3b9a52aab6
No known key found for this signature in database
GPG key ID: 80A419A7A613DFA4
38 changed files with 988 additions and 363 deletions

View file

@ -74,14 +74,12 @@ Metrics/ModuleLength:
Metrics/AbcSize: Metrics/AbcSize:
Exclude: Exclude:
- 'lib/mastodon/cli/*.rb' - 'lib/mastodon/cli/*.rb'
- db/*migrate/**/*
# Reason: Currently disabled in .rubocop_todo.yml # Reason: Currently disabled in .rubocop_todo.yml
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity # https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Exclude: Exclude:
- lib/mastodon/cli/*.rb - lib/mastodon/cli/*.rb
- db/*migrate/**/*
# Reason: # Reason:
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsparameterlists # https://docs.rubocop.org/rubocop/cops_metrics.html#metricsparameterlists

View file

@ -103,6 +103,7 @@ RUN \
procps \ procps \
tini \ tini \
tzdata \ tzdata \
wget \
; \ ; \
# Patch Ruby to use jemalloc # Patch Ruby to use jemalloc
patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \ patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \

View file

@ -457,9 +457,9 @@ GEM
azure-storage-blob (~> 2.0.1) azure-storage-blob (~> 2.0.1)
hashie (~> 5.0) hashie (~> 5.0)
memory_profiler (1.0.1) memory_profiler (1.0.1)
mime-types (3.5.1) mime-types (3.5.2)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2023.1003) mime-types-data (3.2023.1205)
mini_mime (1.1.5) mini_mime (1.1.5)
mini_portile2 (2.8.5) mini_portile2 (2.8.5)
minitest (5.20.0) minitest (5.20.0)
@ -544,7 +544,7 @@ GEM
psych (5.1.2) psych (5.1.2)
stringio stringio
public_suffix (5.0.4) public_suffix (5.0.4)
puma (6.4.0) puma (6.4.1)
nio4r (~> 2.0) nio4r (~> 2.0)
pundit (2.3.1) pundit (2.3.1)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)

View file

@ -13,10 +13,8 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
## Supported Versions ## Supported Versions
| Version | Supported | | Version | Supported |
| ------- | ---------------- | | ------- | --------- |
| 4.2.x | Yes | | 4.2.x | Yes |
| 4.1.x | Yes | | 4.1.x | Yes |
| 4.0.x | No | | < 4.1 | No |
| 3.5.x | Until 2023-12-31 |
| < 3.5 | No |

View file

@ -68,7 +68,7 @@ module Admin
def export_data def export_data
CSV.generate(headers: export_headers, write_headers: true) do |content| 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] content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate]
end end
end end

View file

@ -13,7 +13,9 @@ class Api::V1::StreamingController < Api::BaseController
def streaming_api_url def streaming_api_url
Addressable::URI.parse(request.url).tap do |uri| 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.to_s
end end
end end

View file

@ -91,14 +91,23 @@ module SignatureVerification
raise SignatureVerificationError, "Public key not found for key #{signature_params['keyId']}" if actor.nil? raise SignatureVerificationError, "Public key not found for key #{signature_params['keyId']}" if actor.nil?
signature = Base64.decode64(signature_params['signature']) 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? 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) } actor = stoplight_wrap_request { actor_refresh_key!(actor) }
raise SignatureVerificationError, "Could not refresh public key #{signature_params['keyId']}" if actor.nil? 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? 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'] 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 nil
end end
def build_signed_string def build_signed_string(include_query_string: true)
signed_headers.map do |signed_header| signed_headers.map do |signed_header|
case signed_header case signed_header
when Request::REQUEST_TARGET 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)' when '(created)'
raise SignatureVerificationError, 'Invalid pseudo-header (created) for rsa-sha256' unless signature_algorithm == 'hs2019' 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? raise SignatureVerificationError, 'Pseudo-header (created) used but corresponding argument missing' if signature_params['created'].blank?

View file

@ -221,7 +221,7 @@ class FocalPointModal extends ImmutablePureComponent {
const worker = createWorker({ const worker = createWorker({
workerPath: tesseractWorkerPath, workerPath: tesseractWorkerPath,
corePath: tesseractCorePath, corePath: tesseractCorePath,
langPath: `${assetHost}/ocr/lang-data/`, langPath: `${assetHost}/ocr/lang-data`,
logger: ({ status, progress }) => { logger: ({ status, progress }) => {
if (status === 'recognizing text') { if (status === 'recognizing text') {
this.setState({ ocrStatus: 'detecting', progress }); this.setState({ ocrStatus: 'detecting', progress });

View file

@ -2,8 +2,13 @@ import { Map as ImmutableMap } from 'immutable';
import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts'; import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts';
import { importAccounts } from '../actions/accounts_typed'; 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(); const initialState = ImmutableMap();

View file

@ -222,7 +222,7 @@ class FocalPointModal extends ImmutablePureComponent {
const worker = createWorker({ const worker = createWorker({
workerPath: tesseractWorkerPath, workerPath: tesseractWorkerPath,
corePath: tesseractCorePath, corePath: tesseractCorePath,
langPath: `${assetHost}/ocr/lang-data/`, langPath: `${assetHost}/ocr/lang-data`,
logger: ({ status, progress }) => { logger: ({ status, progress }) => {
if (status === 'recognizing text') { if (status === 'recognizing text') {
this.setState({ ocrStatus: 'detecting', progress }); this.setState({ ocrStatus: 'detecting', progress });

View file

@ -21,6 +21,7 @@
"account.blocked": "Blociwyd", "account.blocked": "Blociwyd",
"account.browse_more_on_origin_server": "Pori mwy ar y proffil gwreiddiol", "account.browse_more_on_origin_server": "Pori mwy ar y proffil gwreiddiol",
"account.cancel_follow_request": "Tynnu cais i ddilyn", "account.cancel_follow_request": "Tynnu cais i ddilyn",
"account.copy": "Copïo dolen i'r proffil",
"account.direct": "Crybwyll yn breifat @{name}", "account.direct": "Crybwyll yn breifat @{name}",
"account.disable_notifications": "Stopiwch fy hysbysu pan fydd @{name} yn postio", "account.disable_notifications": "Stopiwch fy hysbysu pan fydd @{name} yn postio",
"account.domain_blocked": "Parth wedi ei flocio", "account.domain_blocked": "Parth wedi ei flocio",
@ -31,6 +32,7 @@
"account.featured_tags.last_status_never": "Dim postiadau", "account.featured_tags.last_status_never": "Dim postiadau",
"account.featured_tags.title": "Prif hashnodau {name}", "account.featured_tags.title": "Prif hashnodau {name}",
"account.follow": "Dilyn", "account.follow": "Dilyn",
"account.follow_back": "Dilyn yn ôl",
"account.followers": "Dilynwyr", "account.followers": "Dilynwyr",
"account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.", "account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.",
"account.followers_counter": "{count, plural, one {Dilynwr: {counter}} other {Dilynwyr: {counter}}}", "account.followers_counter": "{count, plural, one {Dilynwr: {counter}} other {Dilynwyr: {counter}}}",
@ -51,6 +53,7 @@
"account.mute_notifications_short": "Distewi hysbysiadau", "account.mute_notifications_short": "Distewi hysbysiadau",
"account.mute_short": "Tewi", "account.mute_short": "Tewi",
"account.muted": "Wedi anwybyddu", "account.muted": "Wedi anwybyddu",
"account.mutual": "Cydgydnabod",
"account.no_bio": "Dim disgrifiad wedi'i gynnig.", "account.no_bio": "Dim disgrifiad wedi'i gynnig.",
"account.open_original_page": "Agor y dudalen wreiddiol", "account.open_original_page": "Agor y dudalen wreiddiol",
"account.posts": "Postiadau", "account.posts": "Postiadau",
@ -168,9 +171,9 @@
"confirmations.delete.confirm": "Dileu", "confirmations.delete.confirm": "Dileu",
"confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?",
"confirmations.delete_list.confirm": "Dileu", "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.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.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.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", "confirmations.edit.confirm": "Golygu",
@ -481,12 +484,15 @@
"onboarding.follows.title": "Yn boblogaidd ar Mastodon", "onboarding.follows.title": "Yn boblogaidd ar Mastodon",
"onboarding.profile.discoverable": "Gwnewch fy mhroffil yn un y gellir ei ddarganfod", "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.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.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": "Bywgraffiad",
"onboarding.profile.note_hint": "Gallwch @grybwyll pobl eraill neu #hashnodau…", "onboarding.profile.note_hint": "Gallwch @grybwyll pobl eraill neu #hashnodau…",
"onboarding.profile.save_and_continue": "Cadw a pharhau", "onboarding.profile.save_and_continue": "Cadw a pharhau",
"onboarding.profile.title": "Gosodiad proffil", "onboarding.profile.title": "Gosodiad proffil",
"onboarding.profile.upload_avatar": "Llwytho llun 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.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.message": "Fi yw {username} ar #Mastodon! Dewch i'm dilyn i yn {url}",
"onboarding.share.next_steps": "Camau nesaf posib:", "onboarding.share.next_steps": "Camau nesaf posib:",
@ -601,6 +607,7 @@
"search.quick_action.status_search": "Postiadau sy'n cyfateb i {x}", "search.quick_action.status_search": "Postiadau sy'n cyfateb i {x}",
"search.search_or_paste": "Chwilio neu gludo URL", "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_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.language_code": "Cod iaith ISO",
"search_popout.options": "Dewisiadau chwilio", "search_popout.options": "Dewisiadau chwilio",
"search_popout.quick_actions": "Gweithredoedd cyflym", "search_popout.quick_actions": "Gweithredoedd cyflym",

View file

@ -1,8 +1,15 @@
{ {
"about.blocks": "Moderirani poslužitelji", "about.blocks": "Moderirani poslužitelji",
"about.contact": "Kontakt:", "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.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.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", "about.rules": "Pravila servera",
"account.account_note_header": "Bilješka", "account.account_note_header": "Bilješka",
"account.add_or_remove_from_list": "Dodaj ili ukloni s liste", "account.add_or_remove_from_list": "Dodaj ili ukloni s liste",
@ -14,6 +21,8 @@
"account.blocked": "Blokirano", "account.blocked": "Blokirano",
"account.browse_more_on_origin_server": "Pogledajte više na izvornom profilu", "account.browse_more_on_origin_server": "Pogledajte više na izvornom profilu",
"account.cancel_follow_request": "Withdraw follow request", "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.disable_notifications": "Nemoj me obavjestiti kada @{name} napravi objavu",
"account.domain_blocked": "Domena je blokirana", "account.domain_blocked": "Domena je blokirana",
"account.edit_profile": "Uredi profil", "account.edit_profile": "Uredi profil",
@ -21,7 +30,9 @@
"account.endorse": "Istakni na profilu", "account.endorse": "Istakni na profilu",
"account.featured_tags.last_status_at": "Zadnji post {date}", "account.featured_tags.last_status_at": "Zadnji post {date}",
"account.featured_tags.last_status_never": "Nema postova", "account.featured_tags.last_status_never": "Nema postova",
"account.featured_tags.title": "Istaknuti hashtagovi {name}",
"account.follow": "Prati", "account.follow": "Prati",
"account.follow_back": "Slijedi natrag",
"account.followers": "Pratitelji", "account.followers": "Pratitelji",
"account.followers.empty": "Nitko još ne prati korisnika/cu.", "account.followers.empty": "Nitko još ne prati korisnika/cu.",
"account.followers_counter": "{count, plural, one {{counter} pratitelj} other {{counter} pratitelja}}", "account.followers_counter": "{count, plural, one {{counter} pratitelj} other {{counter} pratitelja}}",
@ -32,6 +43,7 @@
"account.hide_reblogs": "Sakrij boostove od @{name}", "account.hide_reblogs": "Sakrij boostove od @{name}",
"account.in_memoriam": "U sjećanje.", "account.in_memoriam": "U sjećanje.",
"account.joined_short": "Pridružen", "account.joined_short": "Pridružen",
"account.languages": "Promjeni pretplaćene jezike",
"account.link_verified_on": "Vlasništvo ove poveznice provjereno je {date}", "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.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", "account.media": "Medijski sadržaj",
@ -40,11 +52,14 @@
"account.mute_notifications_short": "Utišaj obavijesti", "account.mute_notifications_short": "Utišaj obavijesti",
"account.mute_short": "Utišaj", "account.mute_short": "Utišaj",
"account.muted": "Utišano", "account.muted": "Utišano",
"account.mutual": "Uzajamno",
"account.no_bio": "Nije dan opis.",
"account.open_original_page": "Otvori originalnu stranicu", "account.open_original_page": "Otvori originalnu stranicu",
"account.posts": "Objave", "account.posts": "Objave",
"account.posts_with_replies": "Objave i odgovori", "account.posts_with_replies": "Objave i odgovori",
"account.report": "Prijavi @{name}", "account.report": "Prijavi @{name}",
"account.requested": "Čekanje na potvrdu. Kliknite za poništavanje zahtjeva za praćenje", "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.share": "Podijeli profil @{name}",
"account.show_reblogs": "Prikaži boostove od @{name}", "account.show_reblogs": "Prikaži boostove od @{name}",
"account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}", "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}",
@ -54,11 +69,18 @@
"account.unendorse": "Ne ističi na profilu", "account.unendorse": "Ne ističi na profilu",
"account.unfollow": "Prestani pratiti", "account.unfollow": "Prestani pratiti",
"account.unmute": "Poništi utišavanje @{name}", "account.unmute": "Poništi utišavanje @{name}",
"account.unmute_notifications_short": "Uključi utišane obavijesti",
"account.unmute_short": "Poništi utišavanje", "account.unmute_short": "Poništi utišavanje",
"account_note.placeholder": "Kliknite za dodavanje bilješke", "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.average": "Prosječno",
"admin.dashboard.retention.cohort": "Mjesec prijave", "admin.dashboard.retention.cohort": "Mjesec prijave",
"admin.dashboard.retention.cohort_size": "Novi korisnici", "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.message": "Molimo pokušajte nakon {retry_time, time, medium}.",
"alert.rate_limited.title": "Ograničenje učestalosti", "alert.rate_limited.title": "Ograničenje učestalosti",
"alert.unexpected.message": "Dogodila se neočekivana greška.", "alert.unexpected.message": "Dogodila se neočekivana greška.",
@ -68,10 +90,14 @@
"audio.hide": "Sakrij audio", "audio.hide": "Sakrij audio",
"autosuggest_hashtag.per_week": "{count} tjedno", "autosuggest_hashtag.per_week": "{count} tjedno",
"boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put", "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.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.network.title": "Greška mreže",
"bundle_column_error.retry": "Pokušajte ponovno", "bundle_column_error.retry": "Pokušajte ponovno",
"bundle_column_error.return": "Na glavnu", "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_column_error.routing.title": "404",
"bundle_modal_error.close": "Zatvori", "bundle_modal_error.close": "Zatvori",
"bundle_modal_error.message": "Nešto je pošlo po zlu tijekom učitavanja ove komponente.", "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.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Evo kako će izgledati:", "embed.preview": "Evo kako će izgledati:",
"emoji_button.activity": "Aktivnost", "emoji_button.activity": "Aktivnost",
"emoji_button.clear": "Obriši",
"emoji_button.custom": "Prilagođeno", "emoji_button.custom": "Prilagođeno",
"emoji_button.flags": "Zastave", "emoji_button.flags": "Zastave",
"emoji_button.food": "Hrana i piće", "emoji_button.food": "Hrana i piće",
@ -211,6 +238,7 @@
"explore.trending_links": "Novosti", "explore.trending_links": "Novosti",
"explore.trending_statuses": "Objave", "explore.trending_statuses": "Objave",
"explore.trending_tags": "Hashtagovi", "explore.trending_tags": "Hashtagovi",
"filter_modal.added.context_mismatch_title": "Nepodudaranje konteksta!",
"filter_modal.added.review_and_configure_title": "Postavke filtara", "filter_modal.added.review_and_configure_title": "Postavke filtara",
"filter_modal.added.title": "Filtar dodan!", "filter_modal.added.title": "Filtar dodan!",
"filter_modal.select_filter.prompt_new": "Nova kategorija: {name}", "filter_modal.select_filter.prompt_new": "Nova kategorija: {name}",

View file

@ -1,23 +1,84 @@
{ {
"account.add_or_remove_from_list": "Adder o remover ab listas", "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.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.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.close": "Clauder",
"bundle_modal_error.retry": "Tentar novemente",
"column.blocks": "Usatores blocate",
"column.directory": "Navigar profilos",
"column.favourites": "Favoritos",
"column.home": "Initio", "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", "column_subheading.settings": "Parametros",
"compose.language.change": "Cambiar le lingua",
"compose.language.search": "Cercar linguas...", "compose.language.search": "Cercar linguas...",
"compose.published.open": "Aperir", "compose.published.open": "Aperir",
"compose_form.poll.add_option": "Adder un option",
"compose_form.poll.remove_option": "Remover iste option",
"confirmation_modal.cancel": "Cancellar", "confirmation_modal.cancel": "Cancellar",
"confirmations.delete.confirm": "Deler",
"confirmations.delete_list.confirm": "Deler",
"confirmations.logout.confirm": "Clauder le session", "confirmations.logout.confirm": "Clauder le session",
"copy_icon_button.copied": "Copiate al area de transferentia",
"copypaste.copy_to_clipboard": "Copiar 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", "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.local": "Iste servitor",
"firehose.remote": "Altere servitores",
"footer.about": "A proposito de", "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", "home.pending_critical_update.link": "Vider actualisationes",
"keyboard_shortcuts.my_profile": "Aperir tu profilo", "keyboard_shortcuts.my_profile": "Aperir tu profilo",
"lightbox.close": "Clauder", "lightbox.close": "Clauder",
"lightbox.next": "Sequente", "lightbox.next": "Sequente",
"link_preview.author": "Per {name}", "link_preview.author": "Per {name}",
"lists.account.add": "Adder al lista", "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"
} }

View file

@ -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.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": "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.", "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", "errors.unexpected_crash.report_issue": "Raportar un problema",
"explore.search_results": "Resultates de sercha", "explore.search_results": "Resultates de sercha",
"explore.suggested_follows": "Gente", "explore.suggested_follows": "Gente",
@ -350,6 +351,7 @@
"keyboard_shortcuts.heading": "Rapid-tastes", "keyboard_shortcuts.heading": "Rapid-tastes",
"keyboard_shortcuts.home": "Aperter li hemal témpor-linea", "keyboard_shortcuts.home": "Aperter li hemal témpor-linea",
"keyboard_shortcuts.hotkey": "Rapid clave", "keyboard_shortcuts.hotkey": "Rapid clave",
"keyboard_shortcuts.legend": "Monstrar ti-ci legende",
"keyboard_shortcuts.local": "Aperter li local témpor-linea", "keyboard_shortcuts.local": "Aperter li local témpor-linea",
"keyboard_shortcuts.mention": "Mentionar li autor", "keyboard_shortcuts.mention": "Mentionar li autor",
"keyboard_shortcuts.muted": "Aperter li lista de silentiat usatores", "keyboard_shortcuts.muted": "Aperter li lista de silentiat usatores",

View file

@ -2,7 +2,7 @@
"about.blocks": "Prižiūrimi serveriai", "about.blocks": "Prižiūrimi serveriai",
"about.contact": "Kontaktuoti:", "about.contact": "Kontaktuoti:",
"about.disclaimer": "Mastodon nemokama atvirojo kodo programa ir Mastodon gGmbH prekės ženklas.", "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.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.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", "about.domain_blocks.silenced.title": "Ribota",
@ -35,7 +35,7 @@
"account.follow_back": "Sekti atgal", "account.follow_back": "Sekti atgal",
"account.followers": "Sekėjai", "account.followers": "Sekėjai",
"account.followers.empty": "Šio naudotojo dar niekas neseka.", "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": "Seka",
"account.following_counter": "{count, plural, one {{counter} Seka} few {{counter} Seka} many {{counter} Seka} other {{counter} 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.", "account.follows.empty": "Šis (-i) naudotojas (-a) dar nieko neseka.",

View file

@ -10,6 +10,7 @@
"account.badges.group": "குழு", "account.badges.group": "குழு",
"account.block": "@{name} -ஐத் தடு", "account.block": "@{name} -ஐத் தடு",
"account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை", "account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை",
"account.block_short": "தடு",
"account.blocked": "முடக்கப்பட்டது", "account.blocked": "முடக்கப்பட்டது",
"account.browse_more_on_origin_server": "மேலும் உலாவ சுயவிவரத்திற்குச் செல்க", "account.browse_more_on_origin_server": "மேலும் உலாவ சுயவிவரத்திற்குச் செல்க",
"account.cancel_follow_request": "Withdraw follow request", "account.cancel_follow_request": "Withdraw follow request",
@ -18,20 +19,26 @@
"account.edit_profile": "சுயவிவரத்தை மாற்று", "account.edit_profile": "சுயவிவரத்தை மாற்று",
"account.enable_notifications": "@{name} பதிவிட்டல் எனக்குத் தெரியப்படுத்தவும்", "account.enable_notifications": "@{name} பதிவிட்டல் எனக்குத் தெரியப்படுத்தவும்",
"account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து", "account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து",
"account.featured_tags.last_status_never": "இடுகைகள் இல்லை",
"account.follow": "பின்தொடர்", "account.follow": "பின்தொடர்",
"account.follow_back": "பின்தொடரு",
"account.followers": "பின்தொடர்பவர்கள்", "account.followers": "பின்தொடர்பவர்கள்",
"account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.", "account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.",
"account.followers_counter": "{count, plural, one {{counter} வாசகர்} other {{counter} வாசகர்கள்}}", "account.followers_counter": "{count, plural, one {{counter} வாசகர்} other {{counter} வாசகர்கள்}}",
"account.following": "பின்தொடரும்", "account.following": "பின்தொடரும்",
"account.following_counter": "{count, plural,one {{counter} சந்தா} other {{counter} சந்தாக்கள்}}", "account.following_counter": "{count, plural,one {{counter} சந்தா} other {{counter} சந்தாக்கள்}}",
"account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.", "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.",
"account.go_to_profile": "சுயவிவரத்திற்குச் செல்லவும்",
"account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}", "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}",
"account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}", "account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}",
"account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.", "account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.",
"account.media": "ஊடகங்கள்", "account.media": "ஊடகங்கள்",
"account.mention": "குறிப்பிடு @{name}", "account.mention": "குறிப்பிடு @{name}",
"account.mute": "ஊமையான @{name}", "account.mute": "ஊமையான @{name}",
"account.mute_notifications_short": "அறிவிப்புகளை ஒலியடக்கு",
"account.mute_short": "அமைதியாக்கு",
"account.muted": "முடக்கியது", "account.muted": "முடக்கியது",
"account.no_bio": "விளக்கம் எதுவும் வழங்கப்படவில்லை.",
"account.posts": "டூட்டுகள்", "account.posts": "டூட்டுகள்",
"account.posts_with_replies": "Toots மற்றும் பதில்கள்", "account.posts_with_replies": "Toots மற்றும் பதில்கள்",
"account.report": "@{name} -ஐப் புகாரளி", "account.report": "@{name} -ஐப் புகாரளி",
@ -61,15 +68,29 @@
"audio.hide": "ஆடியோவை மறை", "audio.hide": "ஆடியோவை மறை",
"autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}", "autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}",
"boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்", "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.retry": "மீண்டும் முயற்சிக்கவும்",
"bundle_column_error.return": "முகப்பிற்கு செல்லவும்",
"bundle_column_error.routing.body": "கேட்கப்பட்ட பக்கத்தைக் காணவில்லை. நீங்கள் உள்ளிட்ட முகவரி சரியனதா?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "மூடுக", "bundle_modal_error.close": "மூடுக",
"bundle_modal_error.message": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.", "bundle_modal_error.message": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.",
"bundle_modal_error.retry": "மீண்டும் முயற்சி செய்", "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.blocks": "தடுக்கப்பட்ட பயனர்கள்",
"column.bookmarks": "அடையாளக்குறிகள்", "column.bookmarks": "அடையாளக்குறிகள்",
"column.community": "சுய நிகழ்வு காலவரிசை", "column.community": "சுய நிகழ்வு காலவரிசை",
"column.direct": "தனிப்பட்ட குறிப்புகள்",
"column.directory": "சுயவிவரங்களை உலாவு", "column.directory": "சுயவிவரங்களை உலாவு",
"column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்", "column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்",
"column.favourites": "பிடித்தவை",
"column.follow_requests": "பின்தொடர அனுமதிகள்", "column.follow_requests": "பின்தொடர அனுமதிகள்",
"column.home": "முகப்பு", "column.home": "முகப்பு",
"column.lists": "பட்டியல்கள்", "column.lists": "பட்டியல்கள்",
@ -90,6 +111,9 @@
"community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே", "community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே",
"compose.language.change": "மொழியை மாற்று", "compose.language.change": "மொழியை மாற்று",
"compose.language.search": "தேடல் மொழிகள்...", "compose.language.search": "தேடல் மொழிகள்...",
"compose.published.body": "பதிவிடப்பட்டது.",
"compose.published.open": "திற",
"compose.saved.body": "பதிவு சேமிக்கப்பட்டது.",
"compose_form.direct_message_warning_learn_more": "மேலும் அறிய", "compose_form.direct_message_warning_learn_more": "மேலும் அறிய",
"compose_form.encryption_warning": "Mastodonல் உள்ள பதிவுகள் முறையாக என்க்ரிப்ட்(encrypt) செய்யபடவில்லை. அதனால் முக்கிய தகவல்களை இங்கே பகிர வேண்டாம்.", "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.", "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": "பக்கத்தைப் புதுப்பித்துப் பார்க்கவும். அப்படியும் வேலை செய்யவில்லை எனில், மாஸ்டடானை வேறு ஒரு உலாவியின் மூலமோ, அல்லது பொருத்தமான செயலியின் மூலமோ பயன்படுத்திப் பார்க்கவும்.", "error.unexpected_crash.next_steps": "பக்கத்தைப் புதுப்பித்துப் பார்க்கவும். அப்படியும் வேலை செய்யவில்லை எனில், மாஸ்டடானை வேறு ஒரு உலாவியின் மூலமோ, அல்லது பொருத்தமான செயலியின் மூலமோ பயன்படுத்திப் பார்க்கவும்.",
"errors.unexpected_crash.copy_stacktrace": "Stacktrace-ஐ clipboard-ல் நகலெடு", "errors.unexpected_crash.copy_stacktrace": "Stacktrace-ஐ clipboard-ல் நகலெடு",
"errors.unexpected_crash.report_issue": "புகாரளி", "errors.unexpected_crash.report_issue": "புகாரளி",
"explore.title": "உலாவு",
"explore.trending_links": "செய்திகள்",
"explore.trending_statuses": "பதிவுகள்",
"explore.trending_tags": "ஹேஷ்டேக்குகள்",
"follow_request.authorize": "அனுமதியளி", "follow_request.authorize": "அனுமதியளி",
"follow_request.reject": "நிராகரி", "follow_request.reject": "நிராகரி",
"follow_requests.unlocked_explanation": "உங்கள் கணக்கு பூட்டப்படவில்லை என்றாலும், இந்தக் கணக்குகளிலிருந்து உங்களைப் பின்தொடர விரும்பும் கோரிக்கைகளை நீங்கள் பரீசீலிப்பது நலம் என்று {domain} ஊழியர் எண்ணுகிறார்.", "follow_requests.unlocked_explanation": "உங்கள் கணக்கு பூட்டப்படவில்லை என்றாலும், இந்தக் கணக்குகளிலிருந்து உங்களைப் பின்தொடர விரும்பும் கோரிக்கைகளை நீங்கள் பரீசீலிப்பது நலம் என்று {domain} ஊழியர் எண்ணுகிறார்.",

View file

@ -2,8 +2,13 @@ import { Map as ImmutableMap } from 'immutable';
import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts'; import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts';
import { importAccounts } from '../actions/accounts_typed'; 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(); const initialState = ImmutableMap();

View file

@ -77,6 +77,7 @@ class Request
@url = Addressable::URI.parse(url).normalize @url = Addressable::URI.parse(url).normalize
@http_client = options.delete(:http_client) @http_client = options.delete(:http_client)
@allow_local = options.delete(:allow_local) @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(socket_class: use_proxy? || @allow_local ? ProxySocket : Socket)
@options = @options.merge(timeout_class: PerOperationWithDeadline, timeout_options: TIMEOUT) @options = @options.merge(timeout_class: PerOperationWithDeadline, timeout_options: TIMEOUT)
@options = @options.merge(proxy_url) if use_proxy? @options = @options.merge(proxy_url) if use_proxy?
@ -146,7 +147,7 @@ class Request
private private
def set_common_headers! def set_common_headers!
@headers[REQUEST_TARGET] = "#{@verb} #{@url.path}" @headers[REQUEST_TARGET] = request_target
@headers['User-Agent'] = Mastodon::Version.user_agent @headers['User-Agent'] = Mastodon::Version.user_agent
@headers['Host'] = @url.host @headers['Host'] = @url.host
@headers['Date'] = Time.now.utc.httpdate @headers['Date'] = Time.now.utc.httpdate
@ -157,6 +158,14 @@ class Request
@headers['Digest'] = "SHA-256=#{Digest::SHA256.base64digest(@options[:body])}" @headers['Digest'] = "SHA-256=#{Digest::SHA256.base64digest(@options[:body])}"
end end
def request_target
if @url.query.nil? || !@full_path
"#{@verb} #{@url.path}"
else
"#{@verb} #{@url.path}?#{@url.query}"
end
end
def signature def signature
algorithm = 'rsa-sha256' algorithm = 'rsa-sha256'
signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string)) signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string))

View file

@ -23,7 +23,7 @@ Rails.application.configure do
if Rails.env.production? if Rails.env.production?
"ws#{https ? 's' : ''}://#{web_host}" "ws#{https ? 's' : ''}://#{web_host}"
else else
"ws://#{ENV['REMOTE_DEV'] == 'true' ? host.split(':').first : 'localhost'}:4000" "ws://#{host.split(':').first}:4000"
end end
end end

View file

@ -659,6 +659,7 @@ cy:
created_at: Adroddwyd created_at: Adroddwyd
delete_and_resolve: Dileu postiadau delete_and_resolve: Dileu postiadau
forwarded: Wedi'i anfon ymlaen 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} forwarded_to: Wedi'i anfon ymlaen i %{domain}
mark_as_resolved: Nodi fel wedi'i ddatrys mark_as_resolved: Nodi fel wedi'i ddatrys
mark_as_sensitive: Marcio fel sensitif mark_as_sensitive: Marcio fel sensitif

View file

@ -18,6 +18,8 @@ ie:
confirmation_instructions: confirmation_instructions:
action: Verificar e-posta action: Verificar e-posta
action_with_app: Confirma e retorna a%{app} 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 title: Verificar e-posta
email_changed: email_changed:
explanation: 'Li e-mail adresse de tui es changeat a:' explanation: 'Li e-mail adresse de tui es changeat a:'

View file

@ -70,6 +70,10 @@ ie:
invalid_redirect_uri: Li uri de redirection includet ne es valid. invalid_redirect_uri: Li uri de redirection includet ne es valid.
invalid_request: invalid_request:
unknown: Li petition manca un postulat parametre, include un ne apoyat parametre-valore, o es altrimen mal format. 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_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. unsupported_response_type: Li autorisant servitor ne subtene ti-ci tip de response.
flash: flash:
@ -151,6 +155,7 @@ ie:
write:filters: crea filtres write:filters: crea filtres
write:follows: sequer homes write:follows: sequer homes
write:lists: crear listes write:lists: crear listes
write:media: adcargar files de medie
write:mutes: silentiar persones e conversationes write:mutes: silentiar persones e conversationes
write:notifications: aclarar tui notificationes write:notifications: aclarar tui notificationes
write:reports: raportar altri persones write:reports: raportar altri persones

View file

@ -1559,7 +1559,7 @@ fi:
last_active: Viimeksi aktiivinen last_active: Viimeksi aktiivinen
most_recent: Viimeisimmät most_recent: Viimeisimmät
moved: Muuttaneet moved: Muuttaneet
mutual: Molemmat mutual: Seuraatte toisianne
primary: Ensisijaiset primary: Ensisijaiset
relationship: Suhde relationship: Suhde
remove_selected_domains: Poista kaikki seuraajat valituista verkkotunnuksista remove_selected_domains: Poista kaikki seuraajat valituista verkkotunnuksista

View file

@ -112,6 +112,7 @@ ie:
promote: Promoer promote: Promoer
protocol: Protocol protocol: Protocol
public: Public public: Public
push_subscription_expires: Subscrition a PuSH expira
redownload: Recargar li profil redownload: Recargar li profil
redownloaded_msg: Successosimen recargat li profil de %{username} del original fonte redownloaded_msg: Successosimen recargat li profil de %{username} del original fonte
reject: Rejecter reject: Rejecter
@ -465,6 +466,7 @@ ie:
unsuppress: Restaurar seque-recomandation unsuppress: Restaurar seque-recomandation
instances: instances:
availability: availability:
failure_threshold_reached: Límite de falliment atinget ye %{date}.
failures_recorded: failures_recorded:
one: Fallit prova por %{count} die. one: Fallit prova por %{count} die.
other: Fallit provas por %{count} dies. other: Fallit provas por %{count} dies.
@ -478,6 +480,8 @@ ie:
confirm_purge: Vole tu vermen permanentmen deleter data de ti dominia? confirm_purge: Vole tu vermen permanentmen deleter data de ti dominia?
content_policies: content_policies:
comment: Internal nota 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: policies:
reject_media: Rejecter medie reject_media: Rejecter medie
reject_reports: Rejecter raportes reject_reports: Rejecter raportes
@ -704,6 +708,7 @@ ie:
manage_users: Gerer usatores manage_users: Gerer usatores
manage_users_description: Permisse que usatores vide detallies de altri usatores e fa actiones de moderation contra les manage_users_description: Permisse que usatores vide detallies de altri usatores e fa actiones de moderation contra les
manage_webhooks: Gerer Webcrocs 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: Vider li Jurnale de Audit
view_audit_log_description: Permisse que usatores vide li historie de administrativ actiones sur li servitor view_audit_log_description: Permisse que usatores vide li historie de administrativ actiones sur li servitor
view_dashboard: Vider Panel de Control view_dashboard: Vider Panel de Control
@ -714,6 +719,7 @@ ie:
rules: rules:
add_new: Adjunter un regule add_new: Adjunter un regule
delete: Deleter 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. <strong>Tu posse facilitar li perletura del regules de tui servitor per dar les sur un liste de plat balle-punctus.</strong> 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 edit: Redacter regul
empty: Ancor null regules de servitor ha esset definit. empty: Ancor null regules de servitor ha esset definit.
title: Regules del servitor title: Regules del servitor
@ -724,6 +730,11 @@ ie:
appearance: appearance:
preamble: Customisar li interfacie web de Mastodon. preamble: Customisar li interfacie web de Mastodon.
title: Aspecte 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, <strong>it posse far li processu de registration mult plu desfacil (particularimen por tis con deshabilitás)</strong>. 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: content_retention:
title: Retention de contenete title: Retention de contenete
discovery: discovery:
@ -1374,6 +1385,7 @@ ie:
media_attachments: media_attachments:
validations: validations:
images_and_video: On ne posse atachar un video a un posta quel ja contene images 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: migrations:
acct: Translocat a acct: Translocat a
cancel: Anullar redirection cancel: Anullar redirection
@ -1401,6 +1413,8 @@ ie:
carry_blocks_over_text: Ti usator translocat se de %{acct}, quel tu hat bloccat. 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. 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}:' copy_account_note_text: 'Vi tui notas pri ti usator qui translocat se de %{acct}:'
navigation:
toggle_menu: Changear menú
notification_mailer: notification_mailer:
admin: admin:
report: report:
@ -1443,6 +1457,7 @@ ie:
number: number:
human: human:
decimal_units: decimal_units:
format: "%n%u"
units: units:
billion: B billion: B
million: M million: M
@ -1800,6 +1815,8 @@ ie:
success: Tui clave de securitá esset adjuntet con successe. success: Tui clave de securitá esset adjuntet con successe.
delete: Deleter delete: Deleter
delete_confirmation: Vole tu vermen deleter ti-ci clave de securitá? 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á invalid_credential: Ínvalid clave de securitá
not_enabled: Tu ancor ne ha possibilisat WebAuthn not_enabled: Tu ancor ne ha possibilisat WebAuthn
not_supported: Ti-ci navigator ne subtene claves de securitá not_supported: Ti-ci navigator ne subtene claves de securitá

View file

@ -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. 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. display_name: Tui complet nómine o tui amusant nómine.
fields: Tui websitu, pronómines, etá, quocunc quel tu vole. 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.' 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. 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: account_alias:
@ -65,20 +66,28 @@ ie:
hide: Celar completmen li contenete filtrat, quam si it ne existe hide: Celar completmen li contenete filtrat, quam si it ne existe
warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre
form_admin_settings: 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. 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. 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. 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_email: Qualmen on posse contacter te por inquestes legal o de apoy.
site_contact_username: Qualmen li gente posse atinger te sur Mastodon. 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. 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. 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. 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. trends_as_landing_page: Monstrar populari contenete a ínregistrat visitantes vice un description del servitor. Besona que tendenties es activisat.
form_challenge: form_challenge:
current_password: Tu nu intra un area secur current_password: Tu nu intra un area secur
ip_block: ip_block:
comment: Facultativ. Ne obliviar pro quo tu adjuntet ti-ci regul. 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: severities:
no_access: Bloccar accesse a omni ressurses
sign_up_block: Nov registrationes ne va esser possibil sign_up_block: Nov registrationes ne va esser possibil
sign_up_requires_approval: Nov registrationes va besonar tui aprobation sign_up_requires_approval: Nov registrationes va besonar tui aprobation
severity: Selecter quo va evenir con demandes ex ti-ci IP severity: Selecter quo va evenir con demandes ex ti-ci IP
@ -102,6 +111,10 @@ ie:
name: Etiquette name: Etiquette
value: Contenete value: Contenete
indexable: Includer public postas in resultates de sercha 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: account_warning_preset:
text: Textu prefigurat text: Textu prefigurat
title: Titul title: Titul
@ -142,11 +155,13 @@ ie:
honeypot: "%{label} (ne plenar)" honeypot: "%{label} (ne plenar)"
irreversible: Lassar cader vice celar irreversible: Lassar cader vice celar
locale: Lingue del interfacie locale: Lingue del interfacie
max_uses: Max grand númere de usas
new_password: Nov passa-parol new_password: Nov passa-parol
note: Biografie note: Biografie
password: Passa-parol password: Passa-parol
phrase: Clave-parol o frase phrase: Clave-parol o frase
setting_advanced_layout: Possibilisar web-interfacie avansat 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_language: Lingue in quel postar
setting_default_privacy: Privatie de postada setting_default_privacy: Privatie de postada
setting_default_sensitive: Sempre marcar medie quam sensitiv setting_default_sensitive: Sempre marcar medie quam sensitiv
@ -162,18 +177,27 @@ ie:
severity: Severitá severity: Severitá
sign_in_token_attempt: Code de securitá sign_in_token_attempt: Code de securitá
title: Titul title: Titul
type: Specie de importation
username: Nómine de usator username: Nómine de usator
whole_word: Plen parol whole_word: Plen parol
featured_tag:
name: Hashtag
filters: filters:
actions: actions:
hide: Celar completmen
warn: Celar con un admonition warn: Celar con un admonition
form_admin_settings: 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 custom_css: Custom CSS
profile_directory: Possibilisar profilarium profile_directory: Possibilisar profilarium
registrations_mode: Qui posse registrar se registrations_mode: Qui posse registrar se
show_domain_blocks: Vider bloccas de dominia show_domain_blocks: Vider bloccas de dominia
show_domain_blocks_rationale: Monstrar pro quo cert dominias esset bloccat show_domain_blocks_rationale: Monstrar pro quo cert dominias esset bloccat
site_contact_email: Contact e-mail adresse 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 site_title: Nómine de servitor
theme: Predefenit tema theme: Predefenit tema
trendable_by_default: Possibilisar tendenties sin priori inspection trendable_by_default: Possibilisar tendenties sin priori inspection
@ -220,6 +244,8 @@ ie:
events: Evenimentes activisat events: Evenimentes activisat
url: URL de punctu terminal url: URL de punctu terminal
'no': 'No' 'no': 'No'
not_recommended: Ne recomandat
overridden: Substituet
recommended: Recomandat recommended: Recomandat
required: required:
mark: "*" mark: "*"

View file

@ -574,6 +574,7 @@ sk:
manage_announcements: Spravuj oboznámenia manage_announcements: Spravuj oboznámenia
manage_appeals: Spravuj námietky manage_appeals: Spravuj námietky
manage_blocks: Spravuj blokovania manage_blocks: Spravuj blokovania
manage_custom_emojis: Spravuj vlastné emotikony
manage_federation: Spravuj federáciu manage_federation: Spravuj federáciu
manage_invites: Spravuj pozvánky manage_invites: Spravuj pozvánky
manage_reports: Spravuj hlásenia manage_reports: Spravuj hlásenia
@ -696,6 +697,7 @@ sk:
title: Populárne príspevky title: Populárne príspevky
tags: tags:
dashboard: dashboard:
tag_accounts_measure: unikátnych použití
tag_servers_measure: iné servery tag_servers_measure: iné servery
tag_uses_measure: užívateľov celkovo tag_uses_measure: užívateľov celkovo
not_usable: Nemôže byť použitý not_usable: Nemôže byť použitý

View file

@ -77,90 +77,135 @@ class BackfillAdminActionLogs < ActiveRecord::Migration[6.1]
def up def up
safety_assured do safety_assured do
AdminActionLog.includes(:account).where(target_type: 'Account', human_identifier: nil).find_each do |log| process_logs_for_account
next if log.account.nil? process_logs_for_user
process_logs_for_report
log.update_attribute('human_identifier', log.account.acct) process_logs_for_domain_block
end process_logs_for_domain_allow
process_logs_for_email_domain_block
AdminActionLog.includes(user: :account).where(target_type: 'User', human_identifier: nil).find_each do |log| process_logs_for_unavailable_domain
next if log.user.nil? process_logs_for_status
process_logs_for_account_warning
log.update_attribute('human_identifier', log.user.account.acct) process_logs_for_announcement
log.update_attribute('route_param', log.user.account_id) process_logs_for_ip_block
end process_logs_for_custom_emoji
process_logs_for_canonical_email_block
AdminActionLog.where(target_type: 'Report', human_identifier: nil).in_batches.update_all('human_identifier = target_id::text') process_logs_for_appeal
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
end end
end end
def down; 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 end

View file

@ -77,90 +77,135 @@ class BackfillAdminActionLogsAgain < ActiveRecord::Migration[6.1]
def up def up
safety_assured do safety_assured do
AdminActionLog.includes(:account).where(target_type: 'Account', human_identifier: nil).find_each do |log| process_logs_for_account
next if log.account.nil? process_logs_for_user
process_logs_for_report
log.update_attribute('human_identifier', log.account.acct) process_logs_for_domain_block
end process_logs_for_domain_allow
process_logs_for_email_domain_block
AdminActionLog.includes(user: :account).where(target_type: 'User', human_identifier: nil).find_each do |log| process_logs_for_unavailable_domain
next if log.user.nil? process_logs_for_status
process_logs_for_account_warning
log.update_attribute('human_identifier', log.user.account.acct) process_logs_for_announcement
log.update_attribute('route_param', log.user.account_id) process_logs_for_ip_block
end process_logs_for_custom_emoji
process_logs_for_canonical_email_block
AdminActionLog.where(target_type: 'Report', human_identifier: nil).in_batches.update_all('human_identifier = target_id::text') process_logs_for_appeal
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
end end
end end
def down; 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 end

View file

@ -4,6 +4,7 @@ require_relative '../../../config/boot'
require_relative '../../../config/environment' require_relative '../../../config/environment'
require 'thor' require 'thor'
require 'pastel'
require_relative 'progress_helper' require_relative 'progress_helper'
module Mastodon module Mastodon

View file

@ -1,7 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tty-prompt'
module Mastodon::CLI module Mastodon::CLI
module Federation module Federation
extend ActiveSupport::Concern extend ActiveSupport::Concern
@ -30,45 +28,39 @@ module Mastodon::CLI
LONG_DESC LONG_DESC
def self_destruct def self_destruct
if SelfDestructHelper.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 pending_accounts = Account.local.without_suspended.count + Account.local.suspended.joins(:deletion_request).count
sidekiq_stats = Sidekiq::Stats.new sidekiq_stats = Sidekiq::Stats.new
if pending_accounts.positive? 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? 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? 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 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 end
exit(0) exit(0)
end 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.') say('This operation WILL NOT be reversible.', :yellow)
prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') say('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.', :yellow)
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('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) 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:') 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)
prompt.ok(" SELF_DESTRUCT=#{self_destruct_value}") say(" SELF_DESTRUCT=#{self_destruct_value}", :green)
prompt.ok("\nYou can re-run this command to see the state of the self-destruct process.") say("\nYou can re-run this command to see the state of the self-destruct process.", :green)
rescue TTY::Reader::InputInterrupt rescue Interrupt
exit(1) exit(1)
end end
private
def prompt
@prompt ||= TTY::Prompt.new
end
end end
end end
end end

View file

@ -1,6 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tty-prompt'
require_relative 'base' require_relative 'base'
module Mastodon::CLI module Mastodon::CLI

View file

@ -25,7 +25,7 @@ module Mastodon
end end
def catstodon_revision def catstodon_revision
'1.0.2' '1.0.3'
end end
def build_metadata def build_metadata

View file

@ -169,7 +169,7 @@
"@types/react-dom": "^18.2.4", "@types/react-dom": "^18.2.4",
"@types/react-helmet": "^6.1.6", "@types/react-helmet": "^6.1.6",
"@types/react-immutable-proptypes": "^2.1.0", "@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-overlays": "^3.1.0",
"@types/react-router": "^5.1.20", "@types/react-router": "^5.1.20",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
@ -184,7 +184,7 @@
"@types/webpack": "^4.41.33", "@types/webpack": "^4.41.33",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0", "@typescript-eslint/parser": "^6.17.0",
"babel-jest": "^29.5.0", "babel-jest": "^29.5.0",
"eslint": "^8.41.0", "eslint": "^8.41.0",
"eslint-config-prettier": "^9.0.0", "eslint-config-prettier": "^9.0.0",
@ -192,7 +192,7 @@
"eslint-import-resolver-typescript": "^3.5.5", "eslint-import-resolver-typescript": "^3.5.5",
"eslint-plugin-formatjs": "^4.10.1", "eslint-plugin-formatjs": "^4.10.1",
"eslint-plugin-import": "~2.29.0", "eslint-plugin-import": "~2.29.0",
"eslint-plugin-jsdoc": "^46.1.0", "eslint-plugin-jsdoc": "^48.0.0",
"eslint-plugin-jsx-a11y": "~6.8.0", "eslint-plugin-jsx-a11y": "~6.8.0",
"eslint-plugin-prettier": "^5.0.0", "eslint-plugin-prettier": "^5.0.0",
"eslint-plugin-promise": "~6.1.1", "eslint-plugin-promise": "~6.1.1",

View file

@ -20,4 +20,157 @@ describe Mastodon::CLI::Main do
.to output_results(Mastodon::Version.to_s) .to output_results(Mastodon::Version.to_s)
end end
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
before do
answer_hostname_incorrectly
end
it 'exits silently' do
expect { subject }
.to raise_error(SystemExit)
end
end
context 'with a correct response to hostname but no to proceed' do
before do
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 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 end

View file

@ -184,4 +184,58 @@ describe Mastodon::CLI::Media do
end end
end 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 end

View file

@ -20,7 +20,7 @@ describe 'Content-Security-Policy' do
"form-action 'self'", "form-action 'self'",
"child-src 'self' blob: https://cb6e6126.ngrok.io", "child-src 'self' blob: https://cb6e6126.ngrok.io",
"worker-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'" "script-src 'self' https://cb6e6126.ngrok.io 'wasm-unsafe-eval'"
) )
end end

View file

@ -94,6 +94,72 @@ describe 'signature verification concern' do
end end
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 context 'with a mismatching path' do
it 'fails to verify signature', :aggregate_failures do it 'fails to verify signature', :aggregate_failures do
get '/activitypub/alternative-path', headers: { get '/activitypub/alternative-path', headers: {

341
yarn.lock
View file

@ -12,10 +12,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@adobe/css-tools@npm:^4.3.1": "@adobe/css-tools@npm:^4.3.2":
version: 4.3.1 version: 4.3.2
resolution: "@adobe/css-tools@npm:4.3.1" resolution: "@adobe/css-tools@npm:4.3.2"
checksum: 05672719b544cc0c21ae3ed0eb6349bf458e9d09457578eeeb07cf0f696469ac6417e9c9be1b129e5d6a18098a061c1db55b2275591760ef30a79822436fcbfa checksum: 296a03dd29f227c60500d2da8c7f64991fecf1d8b456ce2b4adb8cec7363d9c08b5b03f1463673fc8cbfe54b538745588e7a13c736d2dd14a80c01a20f127f39
languageName: node languageName: node
linkType: hard linkType: hard
@ -60,25 +60,25 @@ __metadata:
linkType: hard 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": "@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 version: 7.23.7
resolution: "@babel/core@npm:7.23.6" resolution: "@babel/core@npm:7.23.7"
dependencies: dependencies:
"@ampproject/remapping": "npm:^2.2.0" "@ampproject/remapping": "npm:^2.2.0"
"@babel/code-frame": "npm:^7.23.5" "@babel/code-frame": "npm:^7.23.5"
"@babel/generator": "npm:^7.23.6" "@babel/generator": "npm:^7.23.6"
"@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6"
"@babel/helper-module-transforms": "npm:^7.23.3" "@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/parser": "npm:^7.23.6"
"@babel/template": "npm:^7.22.15" "@babel/template": "npm:^7.22.15"
"@babel/traverse": "npm:^7.23.6" "@babel/traverse": "npm:^7.23.7"
"@babel/types": "npm:^7.23.6" "@babel/types": "npm:^7.23.6"
convert-source-map: "npm:^2.0.0" convert-source-map: "npm:^2.0.0"
debug: "npm:^4.1.0" debug: "npm:^4.1.0"
gensync: "npm:^1.0.0-beta.2" gensync: "npm:^1.0.0-beta.2"
json5: "npm:^2.2.3" json5: "npm:^2.2.3"
semver: "npm:^6.3.1" semver: "npm:^6.3.1"
checksum: a02bae7d916029b70706dc301535e1b31e5d216f55d4ee6f64a15825c6b69ee2c14c52a213d1497ec414e925ed4e9d897d41fb0d75df9fea28ed2c0008790e31 checksum: 38c9934973d384ed83369712978453eac91dc3f22167404dbdb272b64f602e74728a6f37012c53ee57e521b8ae2da60097f050497d9b6a212d28b59cdfb2cd1d
languageName: node languageName: node
linkType: hard linkType: hard
@ -167,9 +167,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-define-polyfill-provider@npm:^0.4.3": "@babel/helper-define-polyfill-provider@npm:^0.4.4":
version: 0.4.3 version: 0.4.4
resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" resolution: "@babel/helper-define-polyfill-provider@npm:0.4.4"
dependencies: dependencies:
"@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-compilation-targets": "npm:^7.22.6"
"@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5"
@ -178,7 +178,7 @@ __metadata:
resolve: "npm:^1.14.2" resolve: "npm:^1.14.2"
peerDependencies: peerDependencies:
"@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
checksum: 0007035157e0d32ee9cb4ca319b89d6f3705523383efe52a59eb3d4dfa2ed08c5147e49c10a6e6d69c15221d89c76c8e5875475d6710fb44a5c37b8e69388e40 checksum: 60126f5f719b9e2114df62e3bf3ac0797b71d8dc733db60192eb169b004fde72ee309fa5848c5fdfe98b8e8863c46f55e16da5aa8a4e420b4d2670cd0c5dd708
languageName: node languageName: node
linkType: hard linkType: hard
@ -342,14 +342,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helpers@npm:^7.23.6": "@babel/helpers@npm:^7.23.7":
version: 7.23.6 version: 7.23.7
resolution: "@babel/helpers@npm:7.23.6" resolution: "@babel/helpers@npm:7.23.7"
dependencies: dependencies:
"@babel/template": "npm:^7.22.15" "@babel/template": "npm:^7.22.15"
"@babel/traverse": "npm:^7.23.6" "@babel/traverse": "npm:^7.23.7"
"@babel/types": "npm:^7.23.6" "@babel/types": "npm:^7.23.6"
checksum: df1cf6607676ad36f52f652ec03536f2732d70aef5e76dba5c964e34d49f3c2d3dcf9fb3740db359f53071d74b64606a833d5ba156f79f437f71bfe06e2e7e19 checksum: f74a61ad28a1bc1fdd9133ad571c07787b66d6db017c707b87c203b0cd06879cea8b33e9c6a8585765a4949efa5df3cc9e19b710fe867f11be38ee29fd4a0488
languageName: node languageName: node
linkType: hard linkType: hard
@ -397,15 +397,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@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.3 version: 7.23.7
resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7"
dependencies: dependencies:
"@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-environment-visitor": "npm:^7.22.20"
"@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5"
peerDependencies: peerDependencies:
"@babel/core": ^7.0.0 "@babel/core": ^7.0.0
checksum: 0f43b74741d50e637ba4dcef2786621126fe4da6ccf4ee2e94423ee23f6a04ecd91d458e59764c43e4968be139e5197ee43be8a2fea2c09f0b202a3391e548cc checksum: 355746e21ad7f43e4f4daef54cfe2ef461ecd19446b2afedd53c39df1bf9aa2eeeeaabee2279b1321de89a97c9360e4f76e9ba950fee50ff1676c25f6929d625
languageName: node languageName: node
linkType: hard linkType: hard
@ -661,9 +661,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/plugin-transform-async-generator-functions@npm:^7.23.4": "@babel/plugin-transform-async-generator-functions@npm:^7.23.7":
version: 7.23.4 version: 7.23.7
resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.7"
dependencies: dependencies:
"@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-environment-visitor": "npm:^7.22.20"
"@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5"
@ -671,7 +671,7 @@ __metadata:
"@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
peerDependencies: peerDependencies:
"@babel/core": ^7.0.0-0 "@babel/core": ^7.0.0-0
checksum: f2eef4de609975a3f7da7832576b5ffc93e43c80f87e1a99e886b0f8591096cfc4c37e2d5f52fdeaa2a9c09a25a59f3e621159abaca75d3193922a5c0e4cbe0c checksum: 63d314edc9fbeaf2700745ca0e19bf9840e87f2d7d1f6c5638e06d2aec3e7418d0d7493ed09087e2fe369cc15e9d96c113fb2cd367cb5e3ff922e3712c27b7d4
languageName: node languageName: node
linkType: hard linkType: hard
@ -1201,18 +1201,18 @@ __metadata:
linkType: hard linkType: hard
"@babel/plugin-transform-runtime@npm:^7.22.4": "@babel/plugin-transform-runtime@npm:^7.22.4":
version: 7.23.6 version: 7.23.7
resolution: "@babel/plugin-transform-runtime@npm:7.23.6" resolution: "@babel/plugin-transform-runtime@npm:7.23.7"
dependencies: dependencies:
"@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-module-imports": "npm:^7.22.15"
"@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-plugin-utils": "npm:^7.22.5"
babel-plugin-polyfill-corejs2: "npm:^0.4.6" babel-plugin-polyfill-corejs2: "npm:^0.4.7"
babel-plugin-polyfill-corejs3: "npm:^0.8.5" babel-plugin-polyfill-corejs3: "npm:^0.8.7"
babel-plugin-polyfill-regenerator: "npm:^0.5.3" babel-plugin-polyfill-regenerator: "npm:^0.5.4"
semver: "npm:^6.3.1" semver: "npm:^6.3.1"
peerDependencies: peerDependencies:
"@babel/core": ^7.0.0-0 "@babel/core": ^7.0.0-0
checksum: 94a7ee92f073df53fd8bebf9ed391a95553716077da1c6c3a57f10f042358c938495d55e6b09b4b50544c01f03560c4770c17698e1c24817a15d3668e8231249 checksum: 0d5038462a5762c3a88d820785f685ce1b659075527a3ad538647fd9ce486052777d5aea3d62e626639d60441a04dd0ded2ed32c86b92cf8afbdbd3d54460c13
languageName: node languageName: node
linkType: hard linkType: hard
@ -1334,8 +1334,8 @@ __metadata:
linkType: hard linkType: hard
"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": "@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 version: 7.23.7
resolution: "@babel/preset-env@npm:7.23.6" resolution: "@babel/preset-env@npm:7.23.7"
dependencies: dependencies:
"@babel/compat-data": "npm:^7.23.5" "@babel/compat-data": "npm:^7.23.5"
"@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6"
@ -1343,7 +1343,7 @@ __metadata:
"@babel/helper-validator-option": "npm:^7.23.5" "@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-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-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-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-async-generators": "npm:^7.8.4"
"@babel/plugin-syntax-class-properties": "npm:^7.12.13" "@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-top-level-await": "npm:^7.14.5"
"@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6"
"@babel/plugin-transform-arrow-functions": "npm:^7.23.3" "@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-async-to-generator": "npm:^7.23.3"
"@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3"
"@babel/plugin-transform-block-scoping": "npm:^7.23.4" "@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-regex": "npm:^7.23.3"
"@babel/plugin-transform-unicode-sets-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/preset-modules": "npm:0.1.6-no-external-plugins"
babel-plugin-polyfill-corejs2: "npm:^0.4.6" babel-plugin-polyfill-corejs2: "npm:^0.4.7"
babel-plugin-polyfill-corejs3: "npm:^0.8.5" babel-plugin-polyfill-corejs3: "npm:^0.8.7"
babel-plugin-polyfill-regenerator: "npm:^0.5.3" babel-plugin-polyfill-regenerator: "npm:^0.5.4"
core-js-compat: "npm:^3.31.0" core-js-compat: "npm:^3.31.0"
semver: "npm:^6.3.1" semver: "npm:^6.3.1"
peerDependencies: peerDependencies:
"@babel/core": ^7.0.0-0 "@babel/core": ^7.0.0-0
checksum: 5b24d179af52f082d04b9b98cc4777e37bf31a97cef5a91d8917e996dbd75f2f743c88c40f80744cb8529355bb674619d150c0260c32d834aa4067e21d0c8962 checksum: ac9def873cec52ee02a550bde6e22eced16d1ae331bb8ebc82c03e4c91c12ac17e3e4027647e61612937bcc25ac46e71370aaf99dc2e85dbd11f7777ffeed54e
languageName: node languageName: node
linkType: hard linkType: hard
@ -1484,11 +1484,11 @@ __metadata:
linkType: hard 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": "@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 version: 7.23.7
resolution: "@babel/runtime@npm:7.23.6" resolution: "@babel/runtime@npm:7.23.7"
dependencies: dependencies:
regenerator-runtime: "npm:^0.14.0" regenerator-runtime: "npm:^0.14.0"
checksum: d886954e985ef8e421222f7a2848884d96a752e0020d3078b920dd104e672fdf23bcc6f51a44313a048796319f1ac9d09c2c88ec8cbb4e1f09174bcd3335b9ff checksum: 3e304133ee55b0750e03e53cb4efb47fb2bdcdb5795f85bbffa10595196c34b9be60eb65bd6d833c87f49fc827f0365f86f95f51d85b188004d3128bb5129c93
languageName: node languageName: node
linkType: hard linkType: hard
@ -1503,9 +1503,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/traverse@npm:7, @babel/traverse@npm:^7.23.6": "@babel/traverse@npm:7, @babel/traverse@npm:^7.23.7":
version: 7.23.6 version: 7.23.7
resolution: "@babel/traverse@npm:7.23.6" resolution: "@babel/traverse@npm:7.23.7"
dependencies: dependencies:
"@babel/code-frame": "npm:^7.23.5" "@babel/code-frame": "npm:^7.23.5"
"@babel/generator": "npm:^7.23.6" "@babel/generator": "npm:^7.23.6"
@ -1517,7 +1517,7 @@ __metadata:
"@babel/types": "npm:^7.23.6" "@babel/types": "npm:^7.23.6"
debug: "npm:^4.3.1" debug: "npm:^4.3.1"
globals: "npm:^11.1.0" globals: "npm:^11.1.0"
checksum: 5b4ebb94a00a7e1daf111e4b0b45a7998d5b7598637a14e75e855e88cc1b702789e09a958726b5d599a003be1e9032dbdfde4b88ea6061332228738950d5582d checksum: e32fceb4249beec2bde83968ddffe17444221c1ee5cd18c543a2feaf94e3ca83f2a4dfbc2dcca87cf226e0105973e0fe3717063a21e982a9de9945615ab3f3f5
languageName: node languageName: node
linkType: hard linkType: hard
@ -1539,38 +1539,38 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/css-parser-algorithms@npm:^2.3.2": "@csstools/css-parser-algorithms@npm:^2.4.0":
version: 2.3.2 version: 2.5.0
resolution: "@csstools/css-parser-algorithms@npm:2.3.2" resolution: "@csstools/css-parser-algorithms@npm:2.5.0"
peerDependencies: peerDependencies:
"@csstools/css-tokenizer": ^2.2.1 "@csstools/css-tokenizer": ^2.2.3
checksum: ccae373a3ab5c10716418b69ce1f6db10a26d3a2d60b65df5fe69099afe4fb1d3192925f3c0f93c3b17c3ab1964b0f39ad2b0e97312ec4a51caa55d6b6a31672 checksum: 31b4a523d956e204af9842183678cca5a88ad76551d54dcb6083f8a6f2dfd8fdec6c09bca5410842af54b90997308bebee7593c17dbc1a4e951453b54bd3f024
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/css-tokenizer@npm:^2.2.1": "@csstools/css-tokenizer@npm:^2.2.2":
version: 2.2.1 version: 2.2.3
resolution: "@csstools/css-tokenizer@npm:2.2.1" resolution: "@csstools/css-tokenizer@npm:2.2.3"
checksum: 0c6901d291e99c567893846a47068057c2a28b3edc4219b6da589a530f55f51ddd4675f906f707b393bfe7a508ab2604bf3f75708f064db857bb277636bd5a44 checksum: 557266ec52e8b36c19008a5bbd7151effba085cdd6d68270c01afebf914981caac698eda754b2a530a8a9947a3dd70e3f3a39a5e037c4170bb2a055a92754acb
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/media-query-list-parser@npm:^2.1.5": "@csstools/media-query-list-parser@npm:^2.1.6":
version: 2.1.5 version: 2.1.7
resolution: "@csstools/media-query-list-parser@npm:2.1.5" resolution: "@csstools/media-query-list-parser@npm:2.1.7"
peerDependencies: peerDependencies:
"@csstools/css-parser-algorithms": ^2.3.2 "@csstools/css-parser-algorithms": ^2.5.0
"@csstools/css-tokenizer": ^2.2.1 "@csstools/css-tokenizer": ^2.2.3
checksum: ae0692c6f92cdc82053291c7a50028b692094dfed795f0259571c5eb40f4b3fa580182ac3701e56c2834e40a62a122ea6639299e43ae88b3a835ae4c869a1a12 checksum: 433aef06b00f1d402fd24074a1919b8e2de94245a3b780da6466c8cc9e0f3cc93d2db930f0fce36c7d6908cd50b626cd61e803d3f62dddad79eeb742858028ef
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/selector-specificity@npm:^3.0.0": "@csstools/selector-specificity@npm:^3.0.1":
version: 3.0.0 version: 3.0.1
resolution: "@csstools/selector-specificity@npm:3.0.0" resolution: "@csstools/selector-specificity@npm:3.0.1"
peerDependencies: peerDependencies:
postcss-selector-parser: ^6.0.13 postcss-selector-parser: ^6.0.13
checksum: 6f0e2fa9a3c5dcbc7a446fd827d3eb85ca775cc884f73f0bbb119ab49b4f5f0af8763dd23a37d423f4e7989069c09bb977e7e5f017db296e1417abb1fba75c30 checksum: 4280f494726d5e38de74e28dee2ff74ec86244560dff4edeec3ddff3ac73c774c19535bd1bb70cad77949bfb359cf87e977d0ec3264591e3b7260342a20dd84f
languageName: node languageName: node
linkType: hard linkType: hard
@ -2323,7 +2323,7 @@ __metadata:
"@types/react-dom": "npm:^18.2.4" "@types/react-dom": "npm:^18.2.4"
"@types/react-helmet": "npm:^6.1.6" "@types/react-helmet": "npm:^6.1.6"
"@types/react-immutable-proptypes": "npm:^2.1.0" "@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-overlays": "npm:^3.1.0"
"@types/react-router": "npm:^5.1.20" "@types/react-router": "npm:^5.1.20"
"@types/react-router-dom": "npm:^5.3.3" "@types/react-router-dom": "npm:^5.3.3"
@ -2338,7 +2338,7 @@ __metadata:
"@types/webpack": "npm:^4.41.33" "@types/webpack": "npm:^4.41.33"
"@types/yargs": "npm:^17.0.24" "@types/yargs": "npm:^17.0.24"
"@typescript-eslint/eslint-plugin": "npm:^6.0.0" "@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" arrow-key-navigation: "npm:^1.2.0"
async-mutex: "npm:^0.4.0" async-mutex: "npm:^0.4.0"
atrament: "npm:0.2.4" atrament: "npm:0.2.4"
@ -2369,7 +2369,7 @@ __metadata:
eslint-import-resolver-typescript: "npm:^3.5.5" eslint-import-resolver-typescript: "npm:^3.5.5"
eslint-plugin-formatjs: "npm:^4.10.1" eslint-plugin-formatjs: "npm:^4.10.1"
eslint-plugin-import: "npm:~2.29.0" eslint-plugin-import: "npm:~2.29.0"
eslint-plugin-jsdoc: "npm:^46.1.0" eslint-plugin-jsdoc: "npm:^48.0.0"
eslint-plugin-jsx-a11y: "npm:~6.8.0" eslint-plugin-jsx-a11y: "npm:~6.8.0"
eslint-plugin-prettier: "npm:^5.0.0" eslint-plugin-prettier: "npm:^5.0.0"
eslint-plugin-promise: "npm:~6.1.1" eslint-plugin-promise: "npm:~6.1.1"
@ -2897,10 +2897,10 @@ __metadata:
linkType: hard linkType: hard
"@testing-library/jest-dom@npm:^6.0.0": "@testing-library/jest-dom@npm:^6.0.0":
version: 6.1.5 version: 6.1.6
resolution: "@testing-library/jest-dom@npm:6.1.5" resolution: "@testing-library/jest-dom@npm:6.1.6"
dependencies: dependencies:
"@adobe/css-tools": "npm:^4.3.1" "@adobe/css-tools": "npm:^4.3.2"
"@babel/runtime": "npm:^7.9.2" "@babel/runtime": "npm:^7.9.2"
aria-query: "npm:^5.0.0" aria-query: "npm:^5.0.0"
chalk: "npm:^3.0.0" chalk: "npm:^3.0.0"
@ -2922,7 +2922,7 @@ __metadata:
optional: true optional: true
vitest: vitest:
optional: true optional: true
checksum: f3643a56fcd970b5c7e8fd10faf3c4817d8ab0e74fb1198d726643bdc5ac675ceaac3b0068c5b4fbad254470e8f98ed50028741de875a29ceaa2f854570979c9 checksum: f98f79f3e470517469c86947d0ff1bb83ac2e59fd2a29728ab306eca5fba63c948084ec06b7b531642e6002d1f0211d918c298c628f0d386c0ef63ba881c47ba
languageName: node languageName: node
linkType: hard linkType: hard
@ -3382,12 +3382,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/react-motion@npm:^0.0.39": "@types/react-motion@npm:^0.0.40":
version: 0.0.39 version: 0.0.40
resolution: "@types/react-motion@npm:0.0.39" resolution: "@types/react-motion@npm:0.0.40"
dependencies: dependencies:
"@types/react": "npm:*" "@types/react": "npm:*"
checksum: 0dfcde777576b3c3289b4dbf2a5085decf71aba6d543697f4c1069d02ed3b543792a253692bd98870af04112c92469328a4fdb93988f93af2e099de8f2c9bc2e checksum: 8a560051be917833fdbe051185b53aeafbe8657968ac8e073ac874b9a55c6f16e3793748b13cfb9bd6d9a3d27aba116d6f8f296ec1950f4175dc94d17c5e8470
languageName: node languageName: node
linkType: hard linkType: hard
@ -3485,13 +3485,13 @@ __metadata:
linkType: hard linkType: hard
"@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": "@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 version: 18.2.46
resolution: "@types/react@npm:18.2.45" resolution: "@types/react@npm:18.2.46"
dependencies: dependencies:
"@types/prop-types": "npm:*" "@types/prop-types": "npm:*"
"@types/scheduler": "npm:*" "@types/scheduler": "npm:*"
csstype: "npm:^3.0.2" csstype: "npm:^3.0.2"
checksum: 4cc650c47ffb88baac29fb7a74e842e4af4a55f437086ef70250fdc75f0a5f2fcf8adc272d05ab2e00b1de6e14613296881271caee037dadf9130fdeb498c59e checksum: 814cc67107e5e69501d65bfc371cc2c716665d2a3608d395a2f81e24c3a2875db28e2cad717dfb17017eabcffd1d68ee2c9e09ecaba3f7108d5b7fbb9888ebab
languageName: node languageName: node
linkType: hard linkType: hard
@ -3696,21 +3696,21 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/parser@npm:^6.0.0": "@typescript-eslint/parser@npm:^6.17.0":
version: 6.16.0 version: 6.17.0
resolution: "@typescript-eslint/parser@npm:6.16.0" resolution: "@typescript-eslint/parser@npm:6.17.0"
dependencies: dependencies:
"@typescript-eslint/scope-manager": "npm:6.16.0" "@typescript-eslint/scope-manager": "npm:6.17.0"
"@typescript-eslint/types": "npm:6.16.0" "@typescript-eslint/types": "npm:6.17.0"
"@typescript-eslint/typescript-estree": "npm:6.16.0" "@typescript-eslint/typescript-estree": "npm:6.17.0"
"@typescript-eslint/visitor-keys": "npm:6.16.0" "@typescript-eslint/visitor-keys": "npm:6.17.0"
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 9d573d14df4ec661dccaca785223a8a330d64f50a9279ff9170b1da22198ff91b9afa3ee7d3d7127c0cbc148c86831e76b33fc5b47d630799e98940ef666bfe0 checksum: 66b53159688083eb48259de5b4daf076f3de284ac3b4d2618bda3f7ab2d8ee27b01ae851b08e8487047e33ff3668424f17d677d66413164cb231f1519dcff82f
languageName: node languageName: node
linkType: hard linkType: hard
@ -3724,6 +3724,16 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "@typescript-eslint/type-utils@npm:6.16.0":
version: 6.16.0 version: 6.16.0
resolution: "@typescript-eslint/type-utils@npm:6.16.0" resolution: "@typescript-eslint/type-utils@npm:6.16.0"
@ -3748,6 +3758,13 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "@typescript-eslint/typescript-estree@npm:6.16.0":
version: 6.16.0 version: 6.16.0
resolution: "@typescript-eslint/typescript-estree@npm:6.16.0" resolution: "@typescript-eslint/typescript-estree@npm:6.16.0"
@ -3767,6 +3784,25 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "@typescript-eslint/utils@npm:6.16.0, @typescript-eslint/utils@npm:^6.5.0":
version: 6.16.0 version: 6.16.0
resolution: "@typescript-eslint/utils@npm:6.16.0" resolution: "@typescript-eslint/utils@npm:6.16.0"
@ -3794,6 +3830,16 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "@ungap/structured-clone@npm:^1.2.0":
version: 1.2.0 version: 1.2.0
resolution: "@ungap/structured-clone@npm:1.2.0" resolution: "@ungap/structured-clone@npm:1.2.0"
@ -4774,39 +4820,39 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"babel-plugin-polyfill-corejs2@npm:^0.4.6": "babel-plugin-polyfill-corejs2@npm:^0.4.7":
version: 0.4.6 version: 0.4.7
resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" resolution: "babel-plugin-polyfill-corejs2@npm:0.4.7"
dependencies: dependencies:
"@babel/compat-data": "npm:^7.22.6" "@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" semver: "npm:^6.3.1"
peerDependencies: peerDependencies:
"@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
checksum: 64a98811f343492aa6970ab253760194e389c0417e5b830522f944009c1f0c78e1251975fd1b9869cd48cc4623111b20a3389cf6732a1d10ba0d19de6fa5114f checksum: f80f7284ec72c63e7dd751e0bdf25e9978df195a79e0887470603bfdea13ee518d62573cf360bb1bc01b80819e54915dd5edce9cff14c52d0af5f984aa3d36a3
languageName: node languageName: node
linkType: hard linkType: hard
"babel-plugin-polyfill-corejs3@npm:^0.8.5": "babel-plugin-polyfill-corejs3@npm:^0.8.7":
version: 0.8.5 version: 0.8.7
resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" resolution: "babel-plugin-polyfill-corejs3@npm:0.8.7"
dependencies: dependencies:
"@babel/helper-define-polyfill-provider": "npm:^0.4.3" "@babel/helper-define-polyfill-provider": "npm:^0.4.4"
core-js-compat: "npm:^3.32.2" core-js-compat: "npm:^3.33.1"
peerDependencies: peerDependencies:
"@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
checksum: 577a072971bda2929a87655c816ad14b6a8f7276e6914851b98a6465bdb56f7f2e3db6136c8b8607bd6ba4cde3cd9cbde21f0078250cd93aee3df977c0a731d0 checksum: 094e40f4ab9f131408202063964d63740609fd4fdb70a5b6332b371761921b540ffbcee7a434c0199b8317dfb2ba4675eef674867215fd3b85e24054607c1501
languageName: node languageName: node
linkType: hard linkType: hard
"babel-plugin-polyfill-regenerator@npm:^0.5.3": "babel-plugin-polyfill-regenerator@npm:^0.5.4":
version: 0.5.3 version: 0.5.4
resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" resolution: "babel-plugin-polyfill-regenerator@npm:0.5.4"
dependencies: dependencies:
"@babel/helper-define-polyfill-provider": "npm:^0.4.3" "@babel/helper-define-polyfill-provider": "npm:^0.4.4"
peerDependencies: peerDependencies:
"@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
checksum: cc32313b9ebbf1d7bedc33524a861136b9e5d3b6e9be317ac360a1c2a59ae5ed1b465a6c68b2715cdefb089780ddfb0c11f4a148e49827a947beee76e43da598 checksum: 0b903f5fe2f8c487b4260935dfe60bd9a95bcaee7ae63958f063045093b16d4e8288c232199d411261300aa21f6b106a3cb83c42cc996de013b337f5825a79fe
languageName: node languageName: node
linkType: hard linkType: hard
@ -5161,7 +5207,7 @@ __metadata:
languageName: node languageName: node
linkType: hard 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 version: 4.22.2
resolution: "browserslist@npm:4.22.2" resolution: "browserslist@npm:4.22.2"
dependencies: dependencies:
@ -5541,9 +5587,9 @@ __metadata:
linkType: hard linkType: hard
"classnames@npm:^2.2.5, classnames@npm:^2.3.2": "classnames@npm:^2.2.5, classnames@npm:^2.3.2":
version: 2.5.0 version: 2.5.1
resolution: "classnames@npm:2.5.0" resolution: "classnames@npm:2.5.1"
checksum: f10a5b07db7fda8eb77f701f795b7006f3de86a723ec62cc10f4d82b4195fc65a578bbf91c47675b8c6fcb2921b903bfea5c670bdb43513e454daa6c2e9738b3 checksum: afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69
languageName: node languageName: node
linkType: hard linkType: hard
@ -5907,12 +5953,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2": "core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1":
version: 3.33.1 version: 3.35.0
resolution: "core-js-compat@npm:3.33.1" resolution: "core-js-compat@npm:3.35.0"
dependencies: dependencies:
browserslist: "npm:^4.22.1" browserslist: "npm:^4.22.2"
checksum: 9c7361b370eac30756e6ec52469988d62c6110759efa1c85edd15e6b30f05ace8319a9cc0671bf596a98e7e81c67ad693ceaab2691b85cb62c636da1afe8feb9 checksum: 8c4379240b8decb94b21e81d5ba6f768418721061923b28c9dfc97574680c35d778d39c010207402fc7c8308a68a4cf6d5e02bcbcb96e931c52e6e0dce29a68c
languageName: node languageName: node
linkType: hard linkType: hard
@ -7371,9 +7417,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-jsdoc@npm:^46.1.0": "eslint-plugin-jsdoc@npm:^48.0.0":
version: 46.9.1 version: 48.0.1
resolution: "eslint-plugin-jsdoc@npm:46.9.1" resolution: "eslint-plugin-jsdoc@npm:48.0.1"
dependencies: dependencies:
"@es-joy/jsdoccomment": "npm:~0.41.0" "@es-joy/jsdoccomment": "npm:~0.41.0"
are-docs-informative: "npm:^0.0.2" are-docs-informative: "npm:^0.0.2"
@ -7385,8 +7431,8 @@ __metadata:
semver: "npm:^7.5.4" semver: "npm:^7.5.4"
spdx-expression-parse: "npm:^4.0.0" spdx-expression-parse: "npm:^4.0.0"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
checksum: d15d68797e85bb7b6fdcfc1170653683c16ab1d62c2e9c537101e774cb3231913e2bc4781f2bb808d074adce5699e5b545e450c6801b637c6434587d226ad6ac checksum: 9b211cfb2e07e076dad12681cd2045c65766dd24fe9399fd0adeaf6f8785f9a4dd58608f1183195f63d3c6c91013aa1cf9edc9101580cff9cb60e1e688f456f9
languageName: node languageName: node
linkType: hard linkType: hard
@ -7964,12 +8010,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"file-entry-cache@npm:^7.0.2": "file-entry-cache@npm:^8.0.0":
version: 7.0.2 version: 8.0.0
resolution: "file-entry-cache@npm:7.0.2" resolution: "file-entry-cache@npm:8.0.0"
dependencies: dependencies:
flat-cache: "npm:^3.2.0" flat-cache: "npm:^4.0.0"
checksum: 822664e35c3e295e6a8ca7ec490d8d8077017607f41f94b29922f1f49c6dd07025048e3ed528e2909a1439eba66d60f802c0774aa612cf6ee053ee4ecc16c8c5 checksum: 9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638
languageName: node languageName: node
linkType: hard linkType: hard
@ -8103,7 +8149,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": "flat-cache@npm:^3.0.4":
version: 3.2.0 version: 3.2.0
resolution: "flat-cache@npm:3.2.0" resolution: "flat-cache@npm:3.2.0"
dependencies: dependencies:
@ -8114,6 +8160,17 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "flat@npm:^5.0.2":
version: 5.0.2 version: 5.0.2
resolution: "flat@npm:5.0.2" resolution: "flat@npm:5.0.2"
@ -10761,7 +10818,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"keyv@npm:^4.5.3": "keyv@npm:^4.5.3, keyv@npm:^4.5.4":
version: 4.5.4 version: 4.5.4
resolution: "keyv@npm:4.5.4" resolution: "keyv@npm:4.5.4"
dependencies: dependencies:
@ -11289,10 +11346,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"meow@npm:^12.1.1": "meow@npm:^13.0.0":
version: 12.1.1 version: 13.0.0
resolution: "meow@npm:12.1.1" resolution: "meow@npm:13.0.0"
checksum: a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 checksum: fab0f91578154c048e792a81704f3f28099ffff900f364df8a85f6e770a57e1c124859a25e186186e149dad30692c7893af0dfd71517bea343bfe5d749b1fa04
languageName: node languageName: node
linkType: hard linkType: hard
@ -14368,7 +14425,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"rimraf@npm:^5.0.1": "rimraf@npm:^5.0.1, rimraf@npm:^5.0.5":
version: 5.0.5 version: 5.0.5
resolution: "rimraf@npm:5.0.5" resolution: "rimraf@npm:5.0.5"
dependencies: dependencies:
@ -14521,15 +14578,15 @@ __metadata:
linkType: hard linkType: hard
"sass@npm:^1.62.1": "sass@npm:^1.62.1":
version: 1.69.6 version: 1.69.7
resolution: "sass@npm:1.69.6" resolution: "sass@npm:1.69.7"
dependencies: dependencies:
chokidar: "npm:>=3.0.0 <4.0.0" chokidar: "npm:>=3.0.0 <4.0.0"
immutable: "npm:^4.0.0" immutable: "npm:^4.0.0"
source-map-js: "npm:>=0.6.2 <2.0.0" source-map-js: "npm:>=0.6.2 <2.0.0"
bin: bin:
sass: sass.js sass: sass.js
checksum: 8153db8e51e74a9007bb54332e14d122c34288c7d21a5f2eaefef753a1b7bb13f35e042dc6247253dab5b1550b05cea27970371e7548286b4f50f23dd1147d89 checksum: 773d0938e7d4ff3972d3fda3132f34fe98a2f712e028a58e28fecd615434795eff3266eddc38d5e13f03b90c0d6360d0e737b30bff2949a47280c64a18e0fb18
languageName: node languageName: node
linkType: hard linkType: hard
@ -15633,13 +15690,13 @@ __metadata:
linkType: hard linkType: hard
"stylelint@npm:^16.0.2": "stylelint@npm:^16.0.2":
version: 16.0.2 version: 16.1.0
resolution: "stylelint@npm:16.0.2" resolution: "stylelint@npm:16.1.0"
dependencies: dependencies:
"@csstools/css-parser-algorithms": "npm:^2.3.2" "@csstools/css-parser-algorithms": "npm:^2.4.0"
"@csstools/css-tokenizer": "npm:^2.2.1" "@csstools/css-tokenizer": "npm:^2.2.2"
"@csstools/media-query-list-parser": "npm:^2.1.5" "@csstools/media-query-list-parser": "npm:^2.1.6"
"@csstools/selector-specificity": "npm:^3.0.0" "@csstools/selector-specificity": "npm:^3.0.1"
balanced-match: "npm:^2.0.0" balanced-match: "npm:^2.0.0"
colord: "npm:^2.9.3" colord: "npm:^2.9.3"
cosmiconfig: "npm:^9.0.0" cosmiconfig: "npm:^9.0.0"
@ -15648,7 +15705,7 @@ __metadata:
debug: "npm:^4.3.4" debug: "npm:^4.3.4"
fast-glob: "npm:^3.3.2" fast-glob: "npm:^3.3.2"
fastest-levenshtein: "npm:^1.0.16" 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" global-modules: "npm:^2.0.0"
globby: "npm:^11.1.0" globby: "npm:^11.1.0"
globjoin: "npm:^0.1.4" globjoin: "npm:^0.1.4"
@ -15658,7 +15715,7 @@ __metadata:
is-plain-object: "npm:^5.0.0" is-plain-object: "npm:^5.0.0"
known-css-properties: "npm:^0.29.0" known-css-properties: "npm:^0.29.0"
mathml-tag-names: "npm:^2.1.3" mathml-tag-names: "npm:^2.1.3"
meow: "npm:^12.1.1" meow: "npm:^13.0.0"
micromatch: "npm:^4.0.5" micromatch: "npm:^4.0.5"
normalize-path: "npm:^3.0.0" normalize-path: "npm:^3.0.0"
picocolors: "npm:^1.0.0" picocolors: "npm:^1.0.0"
@ -15676,7 +15733,7 @@ __metadata:
write-file-atomic: "npm:^5.0.1" write-file-atomic: "npm:^5.0.1"
bin: bin:
stylelint: bin/stylelint.mjs stylelint: bin/stylelint.mjs
checksum: 5ec755e209beb1877ff40d50f18c1ebb05bf251925da1f98f28fb3911e4031195eb86adaf641ac5cdb01ba973f4c999bc0c6b0270d08c1d5c070adbdd9e734cf checksum: 765eea0b07319d1e7989502c07b8b5794938e5a8542bec00990b09ec10c3f7006891689930099e948d06c9ef9982066edb98b1ea64a435138a6b0f0905eb2b87
languageName: node languageName: node
linkType: hard linkType: hard