Merge branch 'main' into feature/require-mfa-by-admin

This commit is contained in:
FredysFonseca 2025-08-12 22:02:18 -04:00 committed by GitHub
commit 8bd9d60cdf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 182 additions and 51 deletions

View File

@ -88,7 +88,7 @@ gem 'sidekiq-scheduler', '~> 6.0'
gem 'sidekiq-unique-jobs', '> 8' gem 'sidekiq-unique-jobs', '> 8'
gem 'simple_form', '~> 5.2' gem 'simple_form', '~> 5.2'
gem 'simple-navigation', '~> 4.4' gem 'simple-navigation', '~> 4.4'
gem 'stoplight', '~> 4.1' gem 'stoplight'
gem 'strong_migrations' gem 'strong_migrations'
gem 'tty-prompt', '~> 0.23', require: false gem 'tty-prompt', '~> 0.23', require: false
gem 'twitter-text', '~> 3.1.0' gem 'twitter-text', '~> 3.1.0'
@ -146,7 +146,7 @@ group :test do
gem 'climate_control' gem 'climate_control'
# Validate schemas in specs # Validate schemas in specs
gem 'json-schema', '~> 5.0' gem 'json-schema', '~> 6.0'
# Test harness fo rack components # Test harness fo rack components
gem 'rack-test', '~> 2.1' gem 'rack-test', '~> 2.1'

View File

@ -365,7 +365,7 @@ GEM
json-ld-preloaded (3.3.2) json-ld-preloaded (3.3.2)
json-ld (~> 3.3) json-ld (~> 3.3)
rdf (~> 3.3) rdf (~> 3.3)
json-schema (5.2.1) json-schema (6.0.0)
addressable (~> 2.8) addressable (~> 2.8)
bigdecimal (~> 3.1) bigdecimal (~> 3.1)
jsonapi-renderer (0.2.2) jsonapi-renderer (0.2.2)
@ -719,9 +719,7 @@ GEM
redis (4.8.1) redis (4.8.1)
redis-client (0.25.2) redis-client (0.25.2)
connection_pool connection_pool
redlock (1.3.2) regexp_parser (2.11.1)
redis (>= 3.0.0, < 6.0)
regexp_parser (2.11.0)
reline (0.6.2) reline (0.6.2)
io-console (~> 0.5) io-console (~> 0.5)
request_store (1.7.0) request_store (1.7.0)
@ -751,7 +749,7 @@ GEM
rspec-mocks (3.13.5) rspec-mocks (3.13.5)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-rails (8.0.1) rspec-rails (8.0.2)
actionpack (>= 7.2) actionpack (>= 7.2)
activesupport (>= 7.2) activesupport (>= 7.2)
railties (>= 7.2) railties (>= 7.2)
@ -789,7 +787,7 @@ GEM
lint_roller (~> 1.1) lint_roller (~> 1.1)
rubocop (>= 1.75.0, < 2.0) rubocop (>= 1.75.0, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rails (2.32.0) rubocop-rails (2.33.1)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
lint_roller (~> 1.1) lint_roller (~> 1.1)
rack (>= 1.1) rack (>= 1.1)
@ -855,8 +853,8 @@ GEM
stackprof (0.2.27) stackprof (0.2.27)
starry (0.2.0) starry (0.2.0)
base64 base64
stoplight (4.1.1) stoplight (5.3.1)
redlock (~> 1.0) zeitwerk
stringio (3.1.7) stringio (3.1.7)
strong_migrations (2.5.0) strong_migrations (2.5.0)
activerecord (>= 7.1) activerecord (>= 7.1)
@ -1005,7 +1003,7 @@ DEPENDENCIES
jd-paperclip-azure (~> 3.0) jd-paperclip-azure (~> 3.0)
json-ld json-ld
json-ld-preloaded (~> 3.2) json-ld-preloaded (~> 3.2)
json-schema (~> 5.0) json-schema (~> 6.0)
kaminari (~> 1.2) kaminari (~> 1.2)
kt-paperclip (~> 7.2) kt-paperclip (~> 7.2)
letter_opener (~> 1.8) letter_opener (~> 1.8)
@ -1088,7 +1086,7 @@ DEPENDENCIES
simplecov (~> 0.22) simplecov (~> 0.22)
simplecov-lcov (~> 0.8) simplecov-lcov (~> 0.8)
stackprof stackprof
stoplight (~> 4.1) stoplight
strong_migrations strong_migrations
test-prof test-prof
thor (~> 1.2) thor (~> 1.2)

View File

@ -24,11 +24,11 @@ class Auth::RegistrationsController < Devise::RegistrationsController
super(&:build_invite_request) super(&:build_invite_request)
end end
def edit # rubocop:disable Lint/UselessMethodDefinition def edit
super super
end end
def create # rubocop:disable Lint/UselessMethodDefinition def create
super super
end end

View File

@ -9,6 +9,8 @@ module SignatureVerification
EXPIRATION_WINDOW_LIMIT = 12.hours EXPIRATION_WINDOW_LIMIT = 12.hours
CLOCK_SKEW_MARGIN = 1.hour CLOCK_SKEW_MARGIN = 1.hour
STOPLIGHT_COOL_OFF_TIME = 5.minutes.seconds
STOPLIGHT_THRESHOLD = 1
def require_account_signature! def require_account_signature!
render json: signature_verification_failure_reason, status: signature_verification_failure_code unless signed_request_account render json: signature_verification_failure_reason, status: signature_verification_failure_code unless signed_request_account
@ -107,10 +109,12 @@ module SignatureVerification
end end
def stoplight_wrapper def stoplight_wrapper
Stoplight("source:#{request.remote_ip}") Stoplight(
.with_threshold(1) "source:#{request.remote_ip}",
.with_cool_off_time(5.minutes.seconds) cool_off_time: STOPLIGHT_COOL_OFF_TIME,
.with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) } threshold: STOPLIGHT_THRESHOLD,
tracked_errors: [HTTP::Error, OpenSSL::SSL::SSLError]
)
end end
def actor_refresh_key!(actor) def actor_refresh_key!(actor)

View File

@ -25,7 +25,7 @@ export const ReplyIndicator = () => {
<div className='reply-indicator__line' /> <div className='reply-indicator__line' />
<Link to={`/@${account.get('acct')}`} className='detailed-status__display-avatar'> <Link to={`/@${account.get('acct')}`} className='detailed-status__display-avatar'>
<Avatar account={account} size={46} /> <Avatar key={`avatar-${account.get('id')}`} account={account} size={46} />
</Link> </Link>
<div className='reply-indicator__main'> <div className='reply-indicator__main'>

View File

@ -224,6 +224,7 @@
"confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszystkich zmian wprowadzonych przez Ciebie w aktualnie edytowanym poście.", "confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszystkich zmian wprowadzonych przez Ciebie w aktualnie edytowanym poście.",
"confirmations.discard_draft.edit.title": "Odrzucić zmiany w poście?", "confirmations.discard_draft.edit.title": "Odrzucić zmiany w poście?",
"confirmations.discard_draft.post.cancel": "Wznów wersję roboczą", "confirmations.discard_draft.post.cancel": "Wznów wersję roboczą",
"confirmations.discard_draft.post.message": "Kontynuacja odrzuci aktualnie tworzony post.",
"confirmations.discard_draft.post.title": "Anulować wersję roboczą?", "confirmations.discard_draft.post.title": "Anulować wersję roboczą?",
"confirmations.discard_edit_media.confirm": "Odrzuć", "confirmations.discard_edit_media.confirm": "Odrzuć",
"confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?", "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?",
@ -244,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Usuń obserwującego", "confirmations.remove_from_followers.confirm": "Usuń obserwującego",
"confirmations.remove_from_followers.message": "{name} przestanie Cię obserwować. Czy na pewno chcesz kontynuować?", "confirmations.remove_from_followers.message": "{name} przestanie Cię obserwować. Czy na pewno chcesz kontynuować?",
"confirmations.remove_from_followers.title": "Usunąć obserwującego?", "confirmations.remove_from_followers.title": "Usunąć obserwującego?",
"confirmations.revoke_quote.confirm": "Usuń post",
"confirmations.revoke_quote.message": "Tej akcji nie można cofnąć.",
"confirmations.revoke_quote.title": "Usuń post?",
"confirmations.unfollow.confirm": "Nie obserwuj", "confirmations.unfollow.confirm": "Nie obserwuj",
"confirmations.unfollow.message": "Czy na pewno nie chcesz obserwować {name}?", "confirmations.unfollow.message": "Czy na pewno nie chcesz obserwować {name}?",
"confirmations.unfollow.title": "Cofnąć obserwację?", "confirmations.unfollow.title": "Cofnąć obserwację?",
@ -305,6 +309,9 @@
"emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.search_results": "Wyniki wyszukiwania",
"emoji_button.symbols": "Symbole", "emoji_button.symbols": "Symbole",
"emoji_button.travel": "Podróże i miejsca", "emoji_button.travel": "Podróże i miejsca",
"empty_column.account_featured.me": "Niczego jeszcze nie poleciłeś. Czy wiesz, że możesz wyświetlać swoje hashtagi, z których korzystasz najbardziej, a nawet konta znajomego na swoim profilu?",
"empty_column.account_featured.other": "{acct} nie wyróżnił jeszcze nic. Czy wiesz, że możesz wyświetlać swoje hashtagi, z których korzystasz najbardziej, a nawet konta znajomego na swoim profilu?",
"empty_column.account_featured_other.unknown": "To konto nie zostało jeszcze wyróżnione.",
"empty_column.account_hides_collections": "Ta osoba postanowiła nie udostępniać tych informacji", "empty_column.account_hides_collections": "Ta osoba postanowiła nie udostępniać tych informacji",
"empty_column.account_suspended": "Konto zawieszone", "empty_column.account_suspended": "Konto zawieszone",
"empty_column.account_timeline": "Brak wpisów!", "empty_column.account_timeline": "Brak wpisów!",
@ -560,6 +567,8 @@
"navigation_bar.follows_and_followers": "Obserwowani i obserwujący", "navigation_bar.follows_and_followers": "Obserwowani i obserwujący",
"navigation_bar.import_export": "Import i eksport", "navigation_bar.import_export": "Import i eksport",
"navigation_bar.lists": "Listy", "navigation_bar.lists": "Listy",
"navigation_bar.live_feed_local": "Kanał na żywo (lokalny)",
"navigation_bar.live_feed_public": "Kanał na żywo (publiczny)",
"navigation_bar.logout": "Wyloguj", "navigation_bar.logout": "Wyloguj",
"navigation_bar.moderation": "Moderacja", "navigation_bar.moderation": "Moderacja",
"navigation_bar.more": "Więcej", "navigation_bar.more": "Więcej",
@ -594,6 +603,7 @@
"notification.label.mention": "Wzmianka", "notification.label.mention": "Wzmianka",
"notification.label.private_mention": "Wzmianka bezpośrednia", "notification.label.private_mention": "Wzmianka bezpośrednia",
"notification.label.private_reply": "Komentarz bezpośredni", "notification.label.private_reply": "Komentarz bezpośredni",
"notification.label.quote": "{name} cytował twój post",
"notification.label.reply": "Komentarz", "notification.label.reply": "Komentarz",
"notification.mention": "Wzmianka", "notification.mention": "Wzmianka",
"notification.mentioned_you": "{name} wzmiankuje cię", "notification.mentioned_you": "{name} wzmiankuje cię",
@ -651,6 +661,7 @@
"notifications.column_settings.mention": "Wzmianki:", "notifications.column_settings.mention": "Wzmianki:",
"notifications.column_settings.poll": "Wyniki ankiety:", "notifications.column_settings.poll": "Wyniki ankiety:",
"notifications.column_settings.push": "Powiadomienia push", "notifications.column_settings.push": "Powiadomienia push",
"notifications.column_settings.quote": "Cytaty:",
"notifications.column_settings.reblog": "Podbicia:", "notifications.column_settings.reblog": "Podbicia:",
"notifications.column_settings.show": "Pokaż w kolumnie", "notifications.column_settings.show": "Pokaż w kolumnie",
"notifications.column_settings.sound": "Odtwarzaj dźwięk", "notifications.column_settings.sound": "Odtwarzaj dźwięk",
@ -871,6 +882,8 @@
"status.quote_error.filtered": "Ukryte z powodu jednego z Twoich filtrów", "status.quote_error.filtered": "Ukryte z powodu jednego z Twoich filtrów",
"status.quote_error.not_available": "Post niedostępny", "status.quote_error.not_available": "Post niedostępny",
"status.quote_error.pending_approval": "Post oczekujący", "status.quote_error.pending_approval": "Post oczekujący",
"status.quote_error.pending_approval_popout.body": "Oferty współdzielone przez Fediverse mogą wymagać czasu, ponieważ różne serwery mają różne protokoły.",
"status.quote_error.pending_approval_popout.title": "Oczekujący cytat? Spokojnie, bądź cierpliwy :)",
"status.quote_post_author": "Zacytowano post @{name}", "status.quote_post_author": "Zacytowano post @{name}",
"status.read_more": "Czytaj dalej", "status.read_more": "Czytaj dalej",
"status.reblog": "Podbij", "status.reblog": "Podbij",
@ -886,6 +899,7 @@
"status.reply": "Odpowiedz", "status.reply": "Odpowiedz",
"status.replyAll": "Odpowiedz na wątek", "status.replyAll": "Odpowiedz na wątek",
"status.report": "Zgłoś @{name}", "status.report": "Zgłoś @{name}",
"status.revoke_quote": "Usuń mój wpis z postu @{name}",
"status.sensitive_warning": "Wrażliwa zawartość", "status.sensitive_warning": "Wrażliwa zawartość",
"status.share": "Udostępnij", "status.share": "Udostępnij",
"status.show_less_all": "Zwiń wszystkie", "status.show_less_all": "Zwiń wszystkie",

View File

@ -245,6 +245,9 @@
"confirmations.remove_from_followers.confirm": "Убрать подписчика", "confirmations.remove_from_followers.confirm": "Убрать подписчика",
"confirmations.remove_from_followers.message": "Пользователь {name} перестанет быть подписан на вас. Продолжить?", "confirmations.remove_from_followers.message": "Пользователь {name} перестанет быть подписан на вас. Продолжить?",
"confirmations.remove_from_followers.title": "Убрать подписчика?", "confirmations.remove_from_followers.title": "Убрать подписчика?",
"confirmations.revoke_quote.confirm": "Убрать пост",
"confirmations.revoke_quote.message": "Это действие невозможно отменить.",
"confirmations.revoke_quote.title": "Убрать пост?",
"confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.confirm": "Отписаться",
"confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
"confirmations.unfollow.title": "Отписаться?", "confirmations.unfollow.title": "Отписаться?",
@ -498,6 +501,8 @@
"keyboard_shortcuts.translate": "перевести пост", "keyboard_shortcuts.translate": "перевести пост",
"keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска", "keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска",
"keyboard_shortcuts.up": "вверх по списку", "keyboard_shortcuts.up": "вверх по списку",
"learn_more_link.got_it": "Понятно",
"learn_more_link.learn_more": "Узнать больше",
"lightbox.close": "Закрыть", "lightbox.close": "Закрыть",
"lightbox.next": "Далее", "lightbox.next": "Далее",
"lightbox.previous": "Назад", "lightbox.previous": "Назад",
@ -845,6 +850,8 @@
"status.bookmark": "Добавить в закладки", "status.bookmark": "Добавить в закладки",
"status.cancel_reblog_private": "Отменить продвижение", "status.cancel_reblog_private": "Отменить продвижение",
"status.cannot_reblog": "Этот пост не может быть продвинут", "status.cannot_reblog": "Этот пост не может быть продвинут",
"status.context.load_new_replies": "Доступны новые ответы",
"status.context.loading": "Проверяем, есть ли еще ответы",
"status.continued_thread": "Продолжение предыдущего поста", "status.continued_thread": "Продолжение предыдущего поста",
"status.copy": "Скопировать ссылку на пост", "status.copy": "Скопировать ссылку на пост",
"status.delete": "Удалить", "status.delete": "Удалить",
@ -871,6 +878,7 @@
"status.open": "Открыть пост", "status.open": "Открыть пост",
"status.pin": "Закрепить в профиле", "status.pin": "Закрепить в профиле",
"status.quote_error.filtered": "Скрыто одним из ваших фильтров", "status.quote_error.filtered": "Скрыто одним из ваших фильтров",
"status.quote_error.not_available": "Пост недоступен",
"status.read_more": "Читать далее", "status.read_more": "Читать далее",
"status.reblog": "Продвинуть", "status.reblog": "Продвинуть",
"status.reblog_private": "Продвинуть для своей аудитории", "status.reblog_private": "Продвинуть для своей аудитории",

View File

@ -74,7 +74,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
end end
def update_interaction_policies! def update_interaction_policies!
@status.quote_approval_policy = @status_parser.quote_policy @status.update(quote_approval_policy: @status_parser.quote_policy)
end end
def update_media_attachments! def update_media_attachments!

View File

@ -1,6 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
class BulkImportRowService class BulkImportRowService
STOPLIGHT_COOL_OFF_TIME = 5.minutes.seconds
STOPLIGHT_THRESHOLD = 1
def call(row) def call(row)
@account = row.bulk_import.account @account = row.bulk_import.account
@data = row.data @data = row.data
@ -10,7 +13,7 @@ class BulkImportRowService
when :following, :blocking, :muting, :lists when :following, :blocking, :muting, :lists
target_acct = @data['acct'] target_acct = @data['acct']
target_domain = domain(target_acct) target_domain = domain(target_acct)
@target_account = stoplight_wrapper(target_domain).run { ResolveAccountService.new.call(target_acct, { check_delivery_availability: true }) } @target_account = stoplight_wrapper(target_domain).run(stoplight_fallback) { ResolveAccountService.new.call(target_acct, { check_delivery_availability: true }) }
return false if @target_account.nil? return false if @target_account.nil?
when :bookmarks when :bookmarks
target_uri = @data['uri'] target_uri = @data['uri']
@ -18,7 +21,7 @@ class BulkImportRowService
@target_status = ActivityPub::TagManager.instance.uri_to_resource(target_uri, Status) @target_status = ActivityPub::TagManager.instance.uri_to_resource(target_uri, Status)
return false if @target_status.nil? && ActivityPub::TagManager.instance.local_uri?(target_uri) return false if @target_status.nil? && ActivityPub::TagManager.instance.local_uri?(target_uri)
@target_status ||= stoplight_wrapper(target_domain).run { ActivityPub::FetchRemoteStatusService.new.call(target_uri) } @target_status ||= stoplight_wrapper(target_domain).run(stoplight_fallback) { ActivityPub::FetchRemoteStatusService.new.call(target_uri) }
return false if @target_status.nil? return false if @target_status.nil?
end end
@ -51,13 +54,18 @@ class BulkImportRowService
TagManager.instance.local_domain?(domain) ? nil : TagManager.instance.normalize_domain(domain) TagManager.instance.local_domain?(domain) ? nil : TagManager.instance.normalize_domain(domain)
end end
def stoplight_fallback
->(error) {}
end
def stoplight_wrapper(domain) def stoplight_wrapper(domain)
if domain.present? if domain.present?
Stoplight("source:#{domain}") Stoplight(
.with_fallback { nil } "source:#{domain}",
.with_threshold(1) cool_off_time: STOPLIGHT_COOL_OFF_TIME,
.with_cool_off_time(5.minutes.seconds) threshold: STOPLIGHT_THRESHOLD,
.with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) } tracked_errors: [HTTP::Error, OpenSSL::SSL::SSLError]
)
else else
Stoplight('domain-blank') Stoplight('domain-blank')
end end

View File

@ -5,8 +5,8 @@ class ActivityPub::DeliveryWorker
include RoutingHelper include RoutingHelper
include JsonLdHelper include JsonLdHelper
STOPLIGHT_COOL_OFF_TIME = 60
STOPLIGHT_FAILURE_THRESHOLD = 10 STOPLIGHT_FAILURE_THRESHOLD = 10
STOPLIGHT_COOLDOWN = 60
sidekiq_options queue: 'push', retry: 16, dead: false sidekiq_options queue: 'push', retry: 16, dead: false
@ -75,9 +75,11 @@ class ActivityPub::DeliveryWorker
end end
def stoplight_wrapper def stoplight_wrapper
Stoplight(@inbox_url) Stoplight(
.with_threshold(STOPLIGHT_FAILURE_THRESHOLD) @inbox_url,
.with_cool_off_time(STOPLIGHT_COOLDOWN) cool_off_time: STOPLIGHT_COOL_OFF_TIME,
threshold: STOPLIGHT_FAILURE_THRESHOLD
)
end end
def failure_tracker def failure_tracker

View File

@ -3,6 +3,8 @@
require 'stoplight' require 'stoplight'
Rails.application.reloader.to_prepare do Rails.application.reloader.to_prepare do
Stoplight.default_data_store = Stoplight::DataStore::Redis.new(RedisConnection.new.connection) Stoplight.configure do |config|
Stoplight.default_notifiers = [Stoplight::Notifier::Logger.new(Rails.logger)] config.data_store = Stoplight::DataStore::Redis.new(RedisConnection.new.connection)
config.notifiers = [Stoplight::Notifier::Logger.new(Rails.logger)]
end
end end

View File

@ -599,6 +599,7 @@ pl:
limited: Ograniczone limited: Ograniczone
title: Moderacja title: Moderacja
moderation_notes: moderation_notes:
create: Dodaj notatkę moderacyjną
title: Notatki moderacyjne title: Notatki moderacyjne
private_comment: Prywatny komentarz private_comment: Prywatny komentarz
public_comment: Publiczny komentarz public_comment: Publiczny komentarz
@ -1109,6 +1110,7 @@ pl:
trending: Popularne trending: Popularne
username_blocks: username_blocks:
add_new: Dodaj nową add_new: Dodaj nową
block_registrations: Zablokuj rejestracje
comparison: comparison:
contains: Zawiera contains: Zawiera
equals: Równa się equals: Równa się
@ -1742,6 +1744,9 @@ pl:
title: Nowe wspomnienie o Tobie title: Nowe wspomnienie o Tobie
poll: poll:
subject: Ankieta %{name} zakończyła się subject: Ankieta %{name} zakończyła się
quote:
subject: "%{name} cytował twój post"
title: Nowy cytat
reblog: reblog:
body: 'Twój wpis został podbity przez %{name}:' body: 'Twój wpis został podbity przez %{name}:'
subject: Twój wpis został podbity przez %{name} subject: Twój wpis został podbity przez %{name}
@ -2024,6 +2029,9 @@ pl:
does_not_match_previous_name: nie pasuje do poprzedniej nazwy does_not_match_previous_name: nie pasuje do poprzedniej nazwy
terms_of_service: terms_of_service:
title: Regulamin title: Regulamin
terms_of_service_interstitial:
review_link: Przeglądnij Warunki Korzystania
title: Warunki korzystania z %{domain} zmieniają się
themes: themes:
contrast: Mastodon (Wysoki kontrast) contrast: Mastodon (Wysoki kontrast)
default: Mastodon (Ciemny) default: Mastodon (Ciemny)

View File

@ -196,6 +196,7 @@ ru:
create_relay: Создание ретранслятора create_relay: Создание ретранслятора
create_unavailable_domain: Добавление домена в список недоступных create_unavailable_domain: Добавление домена в список недоступных
create_user_role: Создание ролей create_user_role: Создание ролей
create_username_block: Создать правило имени пользователя
demote_user: Разжалование пользователей demote_user: Разжалование пользователей
destroy_announcement: Удаление объявлений destroy_announcement: Удаление объявлений
destroy_canonical_email_block: Удаление блокировок e-mail destroy_canonical_email_block: Удаление блокировок e-mail
@ -209,6 +210,7 @@ ru:
destroy_status: Удаление постов destroy_status: Удаление постов
destroy_unavailable_domain: Исключение доменов из списка недоступных destroy_unavailable_domain: Исключение доменов из списка недоступных
destroy_user_role: Удаление ролей destroy_user_role: Удаление ролей
destroy_username_block: Удалить правило имени пользователя
disable_2fa_user: Отключение 2FA disable_2fa_user: Отключение 2FA
disable_custom_emoji: Отключение эмодзи disable_custom_emoji: Отключение эмодзи
disable_relay: Отключение ретранслятора disable_relay: Отключение ретранслятора
@ -243,6 +245,7 @@ ru:
update_report: Изменение жалоб update_report: Изменение жалоб
update_status: Изменение постов update_status: Изменение постов
update_user_role: Изменение ролей update_user_role: Изменение ролей
update_username_block: Обновить правило имени пользователя
actions: actions:
approve_appeal_html: "%{name} одобрил(а) обжалование действий модерации от %{target}" approve_appeal_html: "%{name} одобрил(а) обжалование действий модерации от %{target}"
approve_user_html: "%{name} утвердил(а) регистрацию %{target}" approve_user_html: "%{name} утвердил(а) регистрацию %{target}"
@ -261,6 +264,7 @@ ru:
create_relay_html: "%{name} создал(а) ретранслятор %{target}" create_relay_html: "%{name} создал(а) ретранслятор %{target}"
create_unavailable_domain_html: "%{name} приостановил доставку на узел %{target}" create_unavailable_domain_html: "%{name} приостановил доставку на узел %{target}"
create_user_role_html: "%{name} создал(а) роль %{target}" create_user_role_html: "%{name} создал(а) роль %{target}"
create_username_block_html: "%{name} создал(а) правило для имён пользователей, содержащих %{target}"
demote_user_html: "%{name} разжаловал(а) пользователя %{target}" demote_user_html: "%{name} разжаловал(а) пользователя %{target}"
destroy_announcement_html: "%{name} удалил(а) объявление %{target}" destroy_announcement_html: "%{name} удалил(а) объявление %{target}"
destroy_canonical_email_block_html: "%{name} снял(а) блокировку e-mail с хэшем %{target}" destroy_canonical_email_block_html: "%{name} снял(а) блокировку e-mail с хэшем %{target}"
@ -274,6 +278,7 @@ ru:
destroy_status_html: "%{name} удалил(а) пост пользователя %{target}" destroy_status_html: "%{name} удалил(а) пост пользователя %{target}"
destroy_unavailable_domain_html: "%{name} возобновил доставку на узел %{target}" destroy_unavailable_domain_html: "%{name} возобновил доставку на узел %{target}"
destroy_user_role_html: "%{name} удалил(а) роль %{target}" destroy_user_role_html: "%{name} удалил(а) роль %{target}"
destroy_username_block_html: "%{name} удалил(а) правило для имён пользователей, содержащих %{target}"
disable_2fa_user_html: "%{name} отключил(а) требование двухэтапной авторизации для пользователя %{target}" disable_2fa_user_html: "%{name} отключил(а) требование двухэтапной авторизации для пользователя %{target}"
disable_custom_emoji_html: "%{name} отключил(а) эмодзи %{target}" disable_custom_emoji_html: "%{name} отключил(а) эмодзи %{target}"
disable_relay_html: "%{name} отключил(а) ретранслятор %{target}" disable_relay_html: "%{name} отключил(а) ретранслятор %{target}"
@ -308,6 +313,7 @@ ru:
update_report_html: "%{name} изменил(а) жалобу %{target}" update_report_html: "%{name} изменил(а) жалобу %{target}"
update_status_html: "%{name} изменил(а) пост пользователя %{target}" update_status_html: "%{name} изменил(а) пост пользователя %{target}"
update_user_role_html: "%{name} изменил(а) роль %{target}" update_user_role_html: "%{name} изменил(а) роль %{target}"
update_username_block_html: "%{name} обновил(а) правило для имён пользователей, содержащих %{target}"
deleted_account: удалённая учётная запись deleted_account: удалённая учётная запись
empty: Журнал пуст. empty: Журнал пуст.
filter_by_action: Фильтр по действию filter_by_action: Фильтр по действию
@ -499,15 +505,24 @@ ru:
fasp: fasp:
debug: debug:
callbacks: callbacks:
created_at: Создано в
delete: Удалить delete: Удалить
ip: IP-адрес ip: IP-адрес
request_body: Тело запроса
providers: providers:
active: Активен
base_url: Основной URL base_url: Основной URL
delete: Удалить delete: Удалить
edit: Редактировать поставщика
finish_registration: Завершить регистрацию
name: Имя
providers: Поставщики
registration_requested: Требуется регистрация
registrations: registrations:
confirm: Подтвердить confirm: Подтвердить
reject: Отклонить reject: Отклонить
save: Сохранить save: Сохранить
select_capabilities: Выберите возможности
sign_in: sign_in:
status: Пост status: Пост
title: FASP title: FASP
@ -585,6 +600,9 @@ ru:
all: Все all: Все
limited: Ограниченные limited: Ограниченные
title: Модерация title: Модерация
moderation_notes:
create: Добавить заметку модератора
title: Заметки модератора
private_comment: Приватный комментарий private_comment: Приватный комментарий
public_comment: Публичный комментарий public_comment: Публичный комментарий
purge: Удалить данные purge: Удалить данные
@ -799,11 +817,16 @@ ru:
title: Роли title: Роли
rules: rules:
add_new: Добавить правило add_new: Добавить правило
add_translation: Добавить перевод
delete: Удалить delete: Удалить
description_html: Хотя большинство утверждает, что прочитали и согласны с условиями обслуживания, обычно люди не читают их до тех пор, пока не возникнет проблема. <strong>Упростите просмотр правил вашего сервера с первого взгляда, предоставив их в виде простого маркированного списка.</strong> Старайтесь, чтобы отдельные правила были краткими и простыми, но старайтесь не разбивать их на множество отдельных элементов. description_html: Хотя большинство утверждает, что прочитали и согласны с условиями обслуживания, обычно люди не читают их до тех пор, пока не возникнет проблема. <strong>Упростите просмотр правил вашего сервера с первого взгляда, предоставив их в виде простого маркированного списка.</strong> Старайтесь, чтобы отдельные правила были краткими и простыми, но старайтесь не разбивать их на множество отдельных элементов.
edit: Редактировать правило edit: Редактировать правило
empty: Правила сервера еще не определены. empty: Правила сервера еще не определены.
move_down: Переместить вниз
move_up: Переместить вверх
title: Правила сервера title: Правила сервера
translation: Перевод
translations: Переводы
settings: settings:
about: about:
manage_rules: Управление правилами на сервере manage_rules: Управление правилами на сервере
@ -829,6 +852,7 @@ ru:
discovery: discovery:
follow_recommendations: Рекомендации подписок follow_recommendations: Рекомендации подписок
preamble: Наблюдение интересного контента играет важную роль при открытии новых пользователей, которые могут не знать ни одного Mastodon. Контролируйте как работают различные функции обнаружения на вашем сервере. preamble: Наблюдение интересного контента играет важную роль при открытии новых пользователей, которые могут не знать ни одного Mastodon. Контролируйте как работают различные функции обнаружения на вашем сервере.
privacy: Конфиденциальность
profile_directory: Каталог профилей profile_directory: Каталог профилей
public_timelines: Публичные ленты public_timelines: Публичные ленты
publish_statistics: Опубликовать стаитстику publish_statistics: Опубликовать стаитстику
@ -1087,6 +1111,23 @@ ru:
other: За последнюю неделю использовал %{count} человек other: За последнюю неделю использовал %{count} человек
title: Рекомендации и тренды title: Рекомендации и тренды
trending: Популярное trending: Популярное
username_blocks:
add_new: Добавить новое
block_registrations: Блокировать регистрации
comparison:
contains: Содержит
equals: Равен
contains_html: Содержит %{string}
created_msg: Успешно создано правило имени пользователя
delete: Удалить
edit:
title: Редактировать правило имени пользователя
matches_exactly_html: Равен %{string}
new:
create: Создать правило
title: Создать новое правило имени пользователя
not_permitted: Не разрешено
title: Правила имени пользователя
warning_presets: warning_presets:
add_new: Добавить add_new: Добавить
delete: Удалить delete: Удалить
@ -1705,6 +1746,10 @@ ru:
title: Новое упоминание title: Новое упоминание
poll: poll:
subject: Опрос %{name} завершился subject: Опрос %{name} завершился
quote:
body: 'Ваш пост был процитирован %{name}:'
subject: "%{name} процитировал(а) ваш пост"
title: Новая цитата
reblog: reblog:
body: "%{name} продвинул(а) ваш пост:" body: "%{name} продвинул(а) ваш пост:"
subject: "%{name} продвинул(а) ваш пост" subject: "%{name} продвинул(а) ваш пост"
@ -1987,6 +2032,10 @@ ru:
does_not_match_previous_name: не совпадает с предыдущим именем does_not_match_previous_name: не совпадает с предыдущим именем
terms_of_service: terms_of_service:
title: Пользовательское соглашение title: Пользовательское соглашение
terms_of_service_interstitial:
past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением.
review_link: Посмотреть пользовательское соглашение
title: Изменяется пользовательское соглашение %{domain}
themes: themes:
contrast: Mastodon (высококонтрастная) contrast: Mastodon (высококонтрастная)
default: Mastodon (тёмная) default: Mastodon (тёмная)

View File

@ -56,10 +56,12 @@ pl:
scopes: Wybór API, do których aplikacja będzie miała dostęp. Jeżeli wybierzesz nadrzędny zakres, nie musisz wybierać jego elementów. scopes: Wybór API, do których aplikacja będzie miała dostęp. Jeżeli wybierzesz nadrzędny zakres, nie musisz wybierać jego elementów.
setting_aggregate_reblogs: Nie pokazuj nowych podbić dla wpisów, które zostały niedawno podbite (dotyczy tylko nowo otrzymanych podbić) setting_aggregate_reblogs: Nie pokazuj nowych podbić dla wpisów, które zostały niedawno podbite (dotyczy tylko nowo otrzymanych podbić)
setting_always_send_emails: Powiadomienia e-mail zwykle nie będą wysyłane, gdy używasz Mastodon setting_always_send_emails: Powiadomienia e-mail zwykle nie będą wysyłane, gdy używasz Mastodon
setting_default_quote_policy: To ustawienie będzie skuteczne tylko dla postów utworzonych z następną wersją Mastodon, ale możesz wybrać swoje preferencje w przygotowaniu.
setting_default_sensitive: Wrażliwe multimedia są domyślnie schowane i mogą być odkryte kliknięciem setting_default_sensitive: Wrażliwe multimedia są domyślnie schowane i mogą być odkryte kliknięciem
setting_display_media_default: Ukrywaj zawartość multimedialną oznaczoną jako wrażliwa setting_display_media_default: Ukrywaj zawartość multimedialną oznaczoną jako wrażliwa
setting_display_media_hide_all: Zawsze ukrywaj zawartość multimedialną setting_display_media_hide_all: Zawsze ukrywaj zawartość multimedialną
setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną
setting_emoji_style: Jak wyświetlić emotikony. "Auto" spróbuje użyć natywnych emoji, ale wróci do Twemoji dla starszych przeglądarek.
setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome
setting_use_blurhash: Gradienty są oparte na kolorach ukrywanej zawartości, ale uniewidaczniają wszystkie szczegóły setting_use_blurhash: Gradienty są oparte na kolorach ukrywanej zawartości, ale uniewidaczniają wszystkie szczegóły
setting_use_pending_items: Ukryj aktualizacje osi czasu za kliknięciem, zamiast automatycznego przewijania strumienia setting_use_pending_items: Ukryj aktualizacje osi czasu za kliknięciem, zamiast automatycznego przewijania strumienia
@ -75,6 +77,7 @@ pl:
filters: filters:
action: Wybierz akcję do wykonania, gdy post pasuje do filtra action: Wybierz akcję do wykonania, gdy post pasuje do filtra
actions: actions:
blur: Ukryj media za ostrzeżeniem, bez ukrywania samego tekstu
hide: Całkowicie ukryj przefiltrowaną zawartość, jakby nie istniała hide: Całkowicie ukryj przefiltrowaną zawartość, jakby nie istniała
warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra
form_admin_settings: form_admin_settings:
@ -88,6 +91,7 @@ pl:
favicon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną faviconę Mastodona. favicon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną faviconę Mastodona.
mascot: Nadpisuje ilustrację w zaawansowanym interfejsie internetowym. mascot: Nadpisuje ilustrację w zaawansowanym interfejsie internetowym.
media_cache_retention_period: Media z wpisów od obcych użytkowników są cache'owane na twoim serwerze. Kiedy dana wartość jest dodatnia, media te będą usunięte po tylu dniach. Jeżeli usunięte media zostaną potem zażądane, oryginał zostanie ponownie pobrany (o ile jest dalej dostępny). Z powodu ograniczeń dot. częstotliwości z jaką karty podglądu linków dopytują się o dane od stron trzecich, zalecana wartość to min. 14 dni, bo karty podglądu linków nie będą wcześniej odświeżane na żądane. media_cache_retention_period: Media z wpisów od obcych użytkowników są cache'owane na twoim serwerze. Kiedy dana wartość jest dodatnia, media te będą usunięte po tylu dniach. Jeżeli usunięte media zostaną potem zażądane, oryginał zostanie ponownie pobrany (o ile jest dalej dostępny). Z powodu ograniczeń dot. częstotliwości z jaką karty podglądu linków dopytują się o dane od stron trzecich, zalecana wartość to min. 14 dni, bo karty podglądu linków nie będą wcześniej odświeżane na żądane.
min_age: Użytkownicy zostaną poproszeni o potwierdzenie daty urodzenia podczas rejestracji
peers_api_enabled: Lista nazw domen, z którymi ten serwer spotkał się w fediverse. Nie są tu zawarte żadne dane o tym, czy użytkownik dokonuje federacji z danym serwerem, a jedynie, że jego serwer o tym wie. Jest to wykorzystywane przez serwisy, które zbierają statystyki dotyczące federacji w ogólnym sensie. peers_api_enabled: Lista nazw domen, z którymi ten serwer spotkał się w fediverse. Nie są tu zawarte żadne dane o tym, czy użytkownik dokonuje federacji z danym serwerem, a jedynie, że jego serwer o tym wie. Jest to wykorzystywane przez serwisy, które zbierają statystyki dotyczące federacji w ogólnym sensie.
profile_directory: Katalog profili zawiera listę wszystkich użytkowników, którzy zgodzili się na bycie znalezionymi. profile_directory: Katalog profili zawiera listę wszystkich użytkowników, którzy zgodzili się na bycie znalezionymi.
require_invite_text: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne require_invite_text: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne
@ -132,13 +136,18 @@ pl:
name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne
terms_of_service: terms_of_service:
changelog: Może być stworzony przy pomocy składni Markdown. changelog: Może być stworzony przy pomocy składni Markdown.
effective_date: Uzasadnione ramy czasowe mogą być różne w dowolnym miejscu od 10 do 30 dni od daty powiadomienia użytkowników.
text: Może być stworzony przy pomocy składni Markdown. text: Może być stworzony przy pomocy składni Markdown.
terms_of_service_generator: terms_of_service_generator:
admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania. admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania.
arbitration_address: Czy może być taki sam jak adres fizyczny powyżej lub „N/A” jeśli używasz adresu e-mail.
arbitration_website: Może być formularzem internetowym lub „N/A”, jeśli używasz adresu e-mail.
choice_of_law: Miasto, region, terytorium lub stan, którego wewnętrzne prawo będzie regulowało wszelkie roszczenia. choice_of_law: Miasto, region, terytorium lub stan, którego wewnętrzne prawo będzie regulowało wszelkie roszczenia.
dmca_address: W przypadku operatorów z USA należy użyć adresu zarejestrowanego w DMCA Designated Agent Directory. Lista skrytek pocztowych dostępna jest na bezpośrednią prośbę użytkownika. Użyj DMCA Agent Post Office Box Waiver Request, aby wysłać email do Copyright Office z informacją, że jesteś domowym administratorm treści i z powodu obawy o zemstę lub odwetu za swoje działania, musisz użyć skrytki pocztowej, żeby usunąć swój adres domowy z dostępu publicznego. dmca_address: W przypadku operatorów z USA należy użyć adresu zarejestrowanego w DMCA Designated Agent Directory. Lista skrytek pocztowych dostępna jest na bezpośrednią prośbę użytkownika. Użyj DMCA Agent Post Office Box Waiver Request, aby wysłać email do Copyright Office z informacją, że jesteś domowym administratorm treści i z powodu obawy o zemstę lub odwetu za swoje działania, musisz użyć skrytki pocztowej, żeby usunąć swój adres domowy z dostępu publicznego.
dmca_email: Czy może ten sam adres e-mail używany dla powyższego "Adres e-mail dla prawnych zawiadomień"?
domain: Unikalny numer identyfikacji świadczonej przez Ciebie usługi online. domain: Unikalny numer identyfikacji świadczonej przez Ciebie usługi online.
jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo. jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo.
min_age: Nie powinien być niższy niż minimalny wiek wymagany przez prawo twojego państwa.
user: user:
chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu
role: Rola kontroluje uprawnienia użytkownika. role: Rola kontroluje uprawnienia użytkownika.
@ -148,6 +157,10 @@ pl:
name: Publiczna nazwa roli, jeśli włączone jest wyświetlanie odznaki name: Publiczna nazwa roli, jeśli włączone jest wyświetlanie odznaki
permissions_as_keys: Użytkownicy z tą rolą będą mieli dostęp do... permissions_as_keys: Użytkownicy z tą rolą będą mieli dostęp do...
position: Wyższa rola decyduje o rozwiązywaniu konfliktów w pewnych sytuacjach. Niektóre działania mogą być wykonywane tylko na rolach z niższym priorytetem position: Wyższa rola decyduje o rozwiązywaniu konfliktów w pewnych sytuacjach. Niektóre działania mogą być wykonywane tylko na rolach z niższym priorytetem
username_block:
allow_with_approval: Zamiast bezwzględnie uniemożliwiać rejestrację, pasujące rejestracje będą wymagały Twojej zgody
comparison: Proszę pamiętać o problemie Scunthorpe podczas blokowania częściowych dopasowań
username: Będą dopasowane niezależnie od otoczki i zwykłych homoglików, takich jak "4" dla "a" lub "3" dla "e"
webhook: webhook:
events: Wybierz zdarzenia do wysłania events: Wybierz zdarzenia do wysłania
template: Poskładaj zawartość JSON, podstawiając zmienne. Użyjemy domyślnej wartości, jeżeli pole zostawisz pustym. template: Poskładaj zawartość JSON, podstawiając zmienne. Użyjemy domyślnej wartości, jeżeli pole zostawisz pustym.
@ -255,6 +268,7 @@ pl:
name: Hasztag name: Hasztag
filters: filters:
actions: actions:
blur: Ukryj media z ostrzeżeniem
hide: Ukryj całkowicie hide: Ukryj całkowicie
warn: Ukryj z ostrzeżeniem warn: Ukryj z ostrzeżeniem
form_admin_settings: form_admin_settings:
@ -312,6 +326,7 @@ pl:
follow_request: Powiadamiaj mnie e-mailem, gdy ktoś poprosi o pozwolenie na obserwowanie mnie follow_request: Powiadamiaj mnie e-mailem, gdy ktoś poprosi o pozwolenie na obserwowanie mnie
mention: Powiadamiaj mnie e-mailem, gdy ktoś o mnie wspomni mention: Powiadamiaj mnie e-mailem, gdy ktoś o mnie wspomni
pending_account: Wyślij e-mail kiedy nowe konto potrzebuje recenzji pending_account: Wyślij e-mail kiedy nowe konto potrzebuje recenzji
quote: Ktoś Cię cytował
reblog: Powiadamiaj mnie e-mailem, gdy ktoś podbije mój wpis reblog: Powiadamiaj mnie e-mailem, gdy ktoś podbije mój wpis
report: Nowe zgłoszenie zostało wysłane report: Nowe zgłoszenie zostało wysłane
software_updates: software_updates:

View File

@ -237,6 +237,7 @@ ru:
setting_display_media_default: По умолчанию setting_display_media_default: По умолчанию
setting_display_media_hide_all: Скрывать все setting_display_media_hide_all: Скрывать все
setting_display_media_show_all: Показывать все setting_display_media_show_all: Показывать все
setting_emoji_style: Стиль эмодзи
setting_expand_spoilers: Разворачивать все посты с предупреждением о содержании setting_expand_spoilers: Разворачивать все посты с предупреждением о содержании
setting_hide_network: Скрыть мои связи setting_hide_network: Скрыть мои связи
setting_missing_alt_text_modal: Запрашивать подтверждение при публикации медиа без альтернативного текста setting_missing_alt_text_modal: Запрашивать подтверждение при публикации медиа без альтернативного текста
@ -319,6 +320,7 @@ ru:
follow_request: Мне пришёл запрос на подписку follow_request: Мне пришёл запрос на подписку
mention: Меня упомянули в посте mention: Меня упомянули в посте
pending_account: Новая заявка на создание аккаунта pending_account: Новая заявка на создание аккаунта
quote: Кто-то процитировал вас
reblog: Мой пост продвинули reblog: Мой пост продвинули
report: Новое обращение отправлено report: Новое обращение отправлено
software_updates: software_updates:
@ -365,6 +367,9 @@ ru:
name: Название name: Название
permissions_as_keys: Разрешения permissions_as_keys: Разрешения
position: Приоритет position: Приоритет
username_block:
allow_with_approval: Разрешить регистрацию с одобрением
comparison: Метод сравнения
webhook: webhook:
events: Включенные события events: Включенные события
template: Шаблон полезной нагрузки template: Шаблон полезной нагрузки

View File

@ -73,8 +73,8 @@ module Paperclip
@url_generator.for_as_default(style_name) @url_generator.for_as_default(style_name)
end end
STOPLIGHT_COOL_OFF_TIME = 30
STOPLIGHT_THRESHOLD = 10 STOPLIGHT_THRESHOLD = 10
STOPLIGHT_COOLDOWN = 30
# We overwrite this method to put a circuit breaker around # We overwrite this method to put a circuit breaker around
# calls to object storage, to stop hitting APIs that are slow # calls to object storage, to stop hitting APIs that are slow
@ -84,11 +84,12 @@ module Paperclip
# Don't go through Stoplight if we don't have anything object-storage-oriented to do # Don't go through Stoplight if we don't have anything object-storage-oriented to do
return super if @queued_for_delete.empty? && @queued_for_write.empty? && !dirty? return super if @queued_for_delete.empty? && @queued_for_write.empty? && !dirty?
Stoplight('object-storage') Stoplight(
.with_threshold(STOPLIGHT_THRESHOLD) 'object-storage',
.with_cool_off_time(STOPLIGHT_COOLDOWN) cool_off_time: STOPLIGHT_COOL_OFF_TIME,
.with_error_handler { |error, handle| error.is_a?(Seahorse::Client::NetworkingError) ? handle.call(error) : raise(error) } threshold: STOPLIGHT_THRESHOLD,
.run { super } tracked_errors: [Seahorse::Client::NetworkingError]
).run { super }
end end
end end
end end

View File

@ -170,7 +170,7 @@
"eslint-import-resolver-typescript": "^4.2.5", "eslint-import-resolver-typescript": "^4.2.5",
"eslint-plugin-formatjs": "^5.3.1", "eslint-plugin-formatjs": "^5.3.1",
"eslint-plugin-import": "~2.32.0", "eslint-plugin-import": "~2.32.0",
"eslint-plugin-jsdoc": "^52.0.0", "eslint-plugin-jsdoc": "^53.0.0",
"eslint-plugin-jsx-a11y": "~6.10.2", "eslint-plugin-jsx-a11y": "~6.10.2",
"eslint-plugin-promise": "~7.2.1", "eslint-plugin-promise": "~7.2.1",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.37.4",

View File

@ -316,6 +316,23 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do
expect(existing_status.edits).to_not be_empty expect(existing_status.edits).to_not be_empty
end end
end end
context 'with an implicit update to quoting policy' do
let(:object) do
note.merge({
'content' => existing_status.text,
'interactionPolicy' => {
'canQuote' => {
'automaticApproval' => ['https://www.w3.org/ns/activitystreams#Public'],
},
},
})
end
it 'updates status' do
expect(existing_status.reload.quote_approval_policy).to eq(Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16)
end
end
end end
end end

View File

@ -2680,7 +2680,7 @@ __metadata:
eslint-import-resolver-typescript: "npm:^4.2.5" eslint-import-resolver-typescript: "npm:^4.2.5"
eslint-plugin-formatjs: "npm:^5.3.1" eslint-plugin-formatjs: "npm:^5.3.1"
eslint-plugin-import: "npm:~2.32.0" eslint-plugin-import: "npm:~2.32.0"
eslint-plugin-jsdoc: "npm:^52.0.0" eslint-plugin-jsdoc: "npm:^53.0.0"
eslint-plugin-jsx-a11y: "npm:~6.10.2" eslint-plugin-jsx-a11y: "npm:~6.10.2"
eslint-plugin-promise: "npm:~7.2.1" eslint-plugin-promise: "npm:~7.2.1"
eslint-plugin-react: "npm:^7.37.4" eslint-plugin-react: "npm:^7.37.4"
@ -6986,9 +6986,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-jsdoc@npm:^52.0.0": "eslint-plugin-jsdoc@npm:^53.0.0":
version: 52.0.2 version: 53.0.1
resolution: "eslint-plugin-jsdoc@npm:52.0.2" resolution: "eslint-plugin-jsdoc@npm:53.0.1"
dependencies: dependencies:
"@es-joy/jsdoccomment": "npm:~0.52.0" "@es-joy/jsdoccomment": "npm:~0.52.0"
are-docs-informative: "npm:^0.0.2" are-docs-informative: "npm:^0.0.2"
@ -7002,7 +7002,7 @@ __metadata:
spdx-expression-parse: "npm:^4.0.0" spdx-expression-parse: "npm:^4.0.0"
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
checksum: 10c0/e36d8c75a5a100f71f4f5287ce12ffdf15474194b2877dbe1e06c3c24a1c0c0c7f13c2d92cb289a80515b6fe1e43c4c0b19814b5c5b22a46ac2ca7df23ab55ad checksum: 10c0/d629863faa98026edc09535e8095669d97be4e77173bfe6cbe7ea0fcd641cd2537bec58e25db433cc6f4103d9a2a13c1bbb3916a8ed4ff05b18c566971dec472
languageName: node languageName: node
linkType: hard linkType: hard
@ -10308,8 +10308,8 @@ __metadata:
linkType: hard linkType: hard
"pino@npm:^9.0.0": "pino@npm:^9.0.0":
version: 9.7.0 version: 9.8.0
resolution: "pino@npm:9.7.0" resolution: "pino@npm:9.8.0"
dependencies: dependencies:
atomic-sleep: "npm:^1.0.0" atomic-sleep: "npm:^1.0.0"
fast-redact: "npm:^3.1.1" fast-redact: "npm:^3.1.1"
@ -10324,7 +10324,7 @@ __metadata:
thread-stream: "npm:^3.0.0" thread-stream: "npm:^3.0.0"
bin: bin:
pino: bin.js pino: bin.js
checksum: 10c0/c7f8a83a9a9d728b4eff6d0f4b9367f031c91bcaa5806fbf0eedcc8e77faba593d59baf11a8fba0dd1c778bb17ca7ed01418ac1df4ec129faeedd4f3ecaff66f checksum: 10c0/a6de40d8c777520a0f2bdd1727512db2dba51d0d8098500ec8326f1f95412e4e704ee4301287ccbbafbf7a7ab07999d5659333a7079d1b70341d0d69e4d40b29
languageName: node languageName: node
linkType: hard linkType: hard
@ -13898,8 +13898,8 @@ __metadata:
linkType: hard linkType: hard
"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1": "vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1":
version: 7.1.1 version: 7.1.2
resolution: "vite@npm:7.1.1" resolution: "vite@npm:7.1.2"
dependencies: dependencies:
esbuild: "npm:^0.25.0" esbuild: "npm:^0.25.0"
fdir: "npm:^6.4.6" fdir: "npm:^6.4.6"
@ -13948,7 +13948,7 @@ __metadata:
optional: true optional: true
bin: bin:
vite: bin/vite.js vite: bin/vite.js
checksum: 10c0/391a5c8b8f287b7b1653dedbe952fb4cb93bf7c99b19dab915cf63497892427198fef637e943a3391eacfecf7f2e8f55c40d0fa065fabdd885641430d0b74af7 checksum: 10c0/4ed825b20bc0f49db99cd382de9506b2721ccd47dcebd4a68e0ef65e3cdd2347fded52b306c34178308e0fd7fe78fd5ff517623002cb00710182ad3012c92ced
languageName: node languageName: node
linkType: hard linkType: hard