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

This commit is contained in:
FredysFonseca 2025-08-05 21:53:02 -04:00 committed by GitHub
commit 7af438159a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
73 changed files with 215 additions and 33 deletions

View File

@ -2,6 +2,28 @@
All notable changes to this project will be documented in this file.
## [4.4.3] - 2025-08-05
### Security
- Update dependencies
- Fix incorrect rate-limit handling [GHSA-84ch-6436-c7mg](https://github.com/mastodon/mastodon/security/advisories/GHSA-84ch-6436-c7mg)
### Fixed
- Fix race condition caused by ActiveRecord query cache in `Create` critical path (#35662 by @ClearlyClaire)
- Fix race condition caused by quote post processing (#35657 by @ClearlyClaire)
- Fix WebUI crashing for accounts with `null` URL (#35651 by @ClearlyClaire)
- Fix friends-of-friends recommendations suggesting already-requested accounts (#35604 by @ClearlyClaire)
- Fix synchronous recursive fetching of deeply-nested quoted posts (#35600 by @ClearlyClaire)
- Fix “Expand this post” link including user `@undefined` (#35478 by @ClearlyClaire)
### Changed
- Change `StatusReachFinder` to consider quotes as well as reblogs (#35601 by @ClearlyClaire)
- Add restrictions on which quote posts can trend (#35507 by @ClearlyClaire)
- Change quote verification to not bypass authorization flow for mentions (#35528 by @ClearlyClaire)
## [4.4.2] - 2025-07-23
### Security

View File

@ -144,7 +144,7 @@ GEM
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
capybara-playwright-driver (0.5.6)
capybara-playwright-driver (0.5.7)
addressable
capybara
playwright-ruby-client (>= 1.16.0)
@ -438,7 +438,7 @@ GEM
mime-types (3.7.0)
logger
mime-types-data (~> 3.2025, >= 3.2025.0507)
mime-types-data (3.2025.0722)
mime-types-data (3.2025.0729)
mini_mime (1.1.5)
mini_portile2 (2.8.9)
minitest (5.25.5)
@ -610,7 +610,7 @@ GEM
pg (1.6.1)
pghero (3.7.0)
activerecord (>= 7.1)
playwright-ruby-client (1.54.0)
playwright-ruby-client (1.54.1)
concurrent-ruby (>= 1.1.6)
mime-types (>= 3.0)
pp (0.6.2)

View File

@ -19,7 +19,7 @@ class Api::V1::Statuses::QuotesController < Api::V1::Statuses::BaseController
RevokeQuoteService.new.call(@quote)
render_empty # TODO: do we want to return something? an updated status?
render json: @quote.status, serializer: REST::StatusSerializer
end
private

View File

@ -20,7 +20,7 @@ class Api::V2::SearchController < Api::BaseController
@search = Search.new(search_results)
render json: @search, serializer: REST::SearchSerializer
rescue Mastodon::SyntaxError
unprocessable_entity
unprocessable_content
rescue ActiveRecord::RecordNotFound
not_found
end

View File

@ -29,7 +29,7 @@ class ApplicationController < ActionController::Base
rescue_from Mastodon::NotPermittedError, with: :forbidden
rescue_from ActionController::RoutingError, ActiveRecord::RecordNotFound, with: :not_found
rescue_from ActionController::UnknownFormat, with: :not_acceptable
rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_content
rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests
rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error)
@ -124,7 +124,7 @@ class ApplicationController < ActionController::Base
respond_with_error(410)
end
def unprocessable_entity
def unprocessable_content
respond_with_error(422)
end

View File

@ -52,7 +52,7 @@ module Settings
end
else
flash[:error] = I18n.t('webauthn_credentials.create.error')
status = :unprocessable_entity
status = :unprocessable_content
end
else
flash[:error] = t('webauthn_credentials.create.error')

View File

@ -161,7 +161,9 @@ export const processNewNotificationForGroups = createAppAsyncThunk(
if (!showInColumn) return;
if (
(notification.type === 'mention' || notification.type === 'update') &&
(notification.type === 'mention' ||
notification.type === 'update' ||
notification.type === 'quote') &&
notification.status?.filtered
) {
const filters = notification.status.filtered.filter((result) =>

View File

@ -31,7 +31,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
let filtered = false;
if (['mention', 'status'].includes(notification.type) && notification.status.filtered) {
if (['mention', 'status', 'quote'].includes(notification.type) && notification.status.filtered) {
const filters = notification.status.filtered.filter(result => result.filter.context.includes('notifications'));
if (filters.some(result => result.filter.filter_action === 'hide')) {

View File

@ -143,6 +143,17 @@ class ColumnSettings extends PureComponent {
</div>
</section>
<section role='group' aria-labelledby='notifications-quote'>
<h3 id='notifications-quote'><FormattedMessage id='notifications.column_settings.quote' defaultMessage='Quotes:' /></h3>
<div className='column-settings__row'>
<SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'quote']} onChange={onChange} label={alertStr} />
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'quote']} onChange={this.onPushChange} label={pushStr} />}
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'quote']} onChange={onChange} label={showStr} />
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'quote']} onChange={onChange} label={soundStr} />
</div>
</section>
<section role='group' aria-labelledby='notifications-poll'>
<h3 id='notifications-poll'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></h3>

View File

@ -497,6 +497,8 @@
"keyboard_shortcuts.translate": "per a traduir una publicació",
"keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
"keyboard_shortcuts.up": "Apuja a la llista",
"learn_more_link.got_it": "Entesos",
"learn_more_link.learn_more": "Per a saber-ne més",
"lightbox.close": "Tanca",
"lightbox.next": "Següent",
"lightbox.previous": "Anterior",
@ -597,6 +599,7 @@
"notification.label.mention": "Menció",
"notification.label.private_mention": "Menció privada",
"notification.label.private_reply": "Resposta en privat",
"notification.label.quote": "{name} ha citat la vostra publicació",
"notification.label.reply": "Resposta",
"notification.mention": "Menció",
"notification.mentioned_you": "{name} us ha mencionat",
@ -872,6 +875,11 @@
"status.open": "Amplia el tut",
"status.pin": "Fixa en el perfil",
"status.quote_error.filtered": "No es mostra a causa d'un dels vostres filtres",
"status.quote_error.not_available": "Publicació no disponible",
"status.quote_error.pending_approval": "Publicació pendent",
"status.quote_error.pending_approval_popout.body": "Les citacions compartides a través del Fediverse poden trigar en aparèixer, perquè diferents servidors tenen diferents protocols.",
"status.quote_error.pending_approval_popout.title": "Publicació pendent? Mantinguem la calma",
"status.quote_post_author": "S'ha citat una publicació de @{name}",
"status.read_more": "Més informació",
"status.reblog": "Impulsa",
"status.reblog_private": "Impulsa amb la visibilitat original",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Omtale",
"notification.label.private_mention": "Privat omtale",
"notification.label.private_reply": "Privat svar",
"notification.label.quote": "{name} citerede dit indlæg",
"notification.label.reply": "Svar",
"notification.mention": "Omtale",
"notification.mentioned_you": "{name} omtalte dig",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Επισήμανση",
"notification.label.private_mention": "Ιδιωτική επισήμανση",
"notification.label.private_reply": "Ιδιωτική απάντηση",
"notification.label.quote": "Ο/Η {name} έκανε παράθεση της ανάρτησής σου",
"notification.label.reply": "Απάντηση",
"notification.mention": "Επισήμανση",
"notification.mentioned_you": "Ο χρήστης {name} σε επισήμανε",

View File

@ -658,6 +658,7 @@
"notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.poll": "Poll results:",
"notifications.column_settings.push": "Push notifications",
"notifications.column_settings.quote": "Quotes:",
"notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Mención",
"notification.label.private_mention": "Mención privada",
"notification.label.private_reply": "Respuesta privada",
"notification.label.quote": "{name} citó tu mensaje",
"notification.label.reply": "Respuesta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} te mencionó",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Mención",
"notification.label.private_mention": "Mención privada",
"notification.label.private_reply": "Respuesta privada",
"notification.label.quote": "{name} citó tu publicación",
"notification.label.reply": "Respuesta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} te mencionó",
@ -877,7 +878,7 @@
"status.quote_error.filtered": "Oculto debido a uno de tus filtros",
"status.quote_error.not_available": "Publicación no disponible",
"status.quote_error.pending_approval": "Publicación pendiente",
"status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que los diferentes servidores tienen diferentes protocolos.",
"status.quote_error.pending_approval_popout.body": "Las citas compartidas en el Fediverso pueden tardar en mostrarse, ya que cada servidor tiene un protocolo diferente.",
"status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma",
"status.quote_post_author": "Ha citado una publicación de @{name}",
"status.read_more": "Leer más",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Mención",
"notification.label.private_mention": "Mención privada",
"notification.label.private_reply": "Respuesta privada",
"notification.label.quote": "{name} citó tu publicación",
"notification.label.reply": "Respuesta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} te ha mencionado",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Említés",
"notification.label.private_mention": "Privát említés",
"notification.label.private_reply": "Privát válasz",
"notification.label.quote": "{name} idézte a bejegyzésedet",
"notification.label.reply": "Válasz",
"notification.mention": "Említés",
"notification.mentioned_you": "{name} megemlített",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Menziona",
"notification.label.private_mention": "Menzione privata",
"notification.label.private_reply": "Rispondi in privato",
"notification.label.quote": "{name} ha citato il tuo post",
"notification.label.reply": "Rispondi",
"notification.mention": "Menziona",
"notification.mentioned_you": "{name} ti ha menzionato",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Vermelding",
"notification.label.private_mention": "Privébericht",
"notification.label.private_reply": "Privéreactie",
"notification.label.quote": "{name} heeft jouw bericht geciteerd",
"notification.label.reply": "Reactie",
"notification.mention": "Vermelding",
"notification.mentioned_you": "Je bent vermeld door {name}",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Bahsetme",
"notification.label.private_mention": "Özel bahsetme",
"notification.label.private_reply": "Özel yanıt",
"notification.label.quote": "{name} gönderini yeniden paylaştı",
"notification.label.reply": "Yanıt",
"notification.mention": "Bahsetme",
"notification.mentioned_you": "{name} sizden söz etti",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "Lượt nhắc",
"notification.label.private_mention": "Nhắn riêng",
"notification.label.private_reply": "Trả lời riêng",
"notification.label.quote": "{name} đã trích dẫn tút của bạn",
"notification.label.reply": "Trả lời",
"notification.mention": "Nhắc đến bạn",
"notification.mentioned_you": "{name} nhắc đến bạn",

View File

@ -600,6 +600,7 @@
"notification.label.mention": "提及",
"notification.label.private_mention": "私訊",
"notification.label.private_reply": "私訊回嘟",
"notification.label.quote": "{name} 已引用您的嘟文",
"notification.label.reply": "回嘟",
"notification.mention": "提及",
"notification.mentioned_you": "{name} 已提及您",

View File

@ -36,6 +36,7 @@ const initialState = ImmutableMap({
follow_request: false,
favourite: false,
reblog: false,
quote: false,
mention: false,
poll: false,
status: false,
@ -59,6 +60,7 @@ const initialState = ImmutableMap({
follow_request: false,
favourite: true,
reblog: true,
quote: true,
mention: true,
poll: true,
status: true,
@ -72,6 +74,7 @@ const initialState = ImmutableMap({
follow_request: false,
favourite: true,
reblog: true,
quote: true,
mention: true,
poll: true,
status: true,

View File

@ -29,10 +29,12 @@ class UsernameBlock < ApplicationRecord
validates :username, presence: true, uniqueness: true
scope :matches_exactly, ->(str) { where(exact: true).where(normalized_username: str) }
scope :matches_partially, ->(str) { where(exact: false).where(Arel::Nodes.build_quoted(str).matches(Arel::Nodes.build_quoted('%').concat(arel_table[:normalized_username]).concat(Arel::Nodes.build_quoted('%')))) }
scope :matches_partially, ->(str) { where(exact: false).where(Arel::Nodes.build_quoted(normalize_value_for(:normalized_username, str)).matches(Arel::Nodes.build_quoted('%').concat(arel_table[:normalized_username]).concat(Arel::Nodes.build_quoted('%')))) }
before_save :set_normalized_username
normalizes :normalized_username, with: ->(value) { value.downcase.gsub(Regexp.union(HOMOGLYPHS.keys), HOMOGLYPHS) }
def comparison
exact? ? 'equals' : 'contains'
end
@ -42,8 +44,7 @@ class UsernameBlock < ApplicationRecord
end
def self.matches?(str, allow_with_approval: false)
normalized_str = str.downcase.gsub(Regexp.union(HOMOGLYPHS.keys), HOMOGLYPHS)
matches_exactly(normalized_str).or(matches_partially(normalized_str)).where(allow_with_approval: allow_with_approval).any?
matches_exactly(str).or(matches_partially(str)).where(allow_with_approval: allow_with_approval).any?
end
def to_log_human_identifier
@ -53,10 +54,6 @@ class UsernameBlock < ApplicationRecord
private
def set_normalized_username
self.normalized_username = normalize(username)
end
def normalize(str)
str.downcase.gsub(Regexp.union(HOMOGLYPHS.keys), HOMOGLYPHS)
self.normalized_username = username
end
end

View File

@ -126,7 +126,7 @@ class Rack::Attack
end
throttle('throttle_email_confirmations/email', limit: 5, period: 30.minutes) do |req|
if req.post? && req.path_matches?('/auth/password')
if req.post? && req.path_matches?('/auth/confirmation')
req.params.dig('user', 'email').presence
elsif req.post? && req.path == '/api/v1/emails/confirmations'
req.authenticated_user_id

View File

@ -1660,6 +1660,10 @@ ca:
title: Nova menció
poll:
subject: Ha finalitzat l'enquesta de %{name}
quote:
body: 'La vostra publicació ha estat citada per %{name}:'
subject: "%{name} ha citat la vostra publicació"
title: Nova citació
reblog:
body: "%{name} ha impulsat el teu estat:"
subject: "%{name} ha impulsat el teu estat"

View File

@ -1765,6 +1765,10 @@ cs:
title: Nová zmínka
poll:
subject: Anketa od %{name} skončila
quote:
body: 'Váš příspěvek citoval účet %{name}:'
subject: "%{name} citovali váš příspěvek"
title: Nová citace
reblog:
body: 'Uživatel %{name} boostnul váš příspěvek:'
subject: Uživatel %{name} boostnul váš příspěvek

View File

@ -1687,6 +1687,10 @@ da:
title: Ny omtale
poll:
subject: En afstemning fra %{name} er afsluttet
quote:
body: 'Dit indlæg blev citeret af %{name}:'
subject: "%{name} citerede dit indlæg"
title: Nyt citat
reblog:
body: 'Dit indlæg blev fremhævet af %{name}:'
subject: "%{name} fremhævede dit indlæg"
@ -1905,7 +1909,7 @@ da:
ownership: Andres indlæg kan ikke fastgøres
reblog: En fremhævelse kan ikke fastgøres
quote_policies:
followers: Kun egne følgere
followers: Kun dine følgere
nobody: Ingen
public: Alle
title: '%{name}: "%{quote}"'

View File

@ -1687,6 +1687,10 @@ de:
title: Neue Erwähnung
poll:
subject: Eine Umfrage von %{name} ist beendet
quote:
body: 'Dein Beitrag wurde von %{name} zitiert:'
subject: "%{name} zitierte deinen Beitrag"
title: Neuer zitierter Beitrag
reblog:
body: 'Dein Beitrag wurde von %{name} geteilt:'
subject: "%{name} teilte deinen Beitrag"

View File

@ -1687,6 +1687,10 @@ el:
title: Νέα επισήμανση
poll:
subject: Μια δημοσκόπηση του %{name} έληξε
quote:
body: 'Η ανάρτησή σου παρατέθηκε από %{name}:'
subject: Ο/Η %{name} έκανε παράθεση της ανάρτησής σου
title: Νέα παράθεση
reblog:
body: 'Η ανάρτησή σου ενισχύθηκε από τον/την %{name}:'
subject: Ο/Η %{name} ενίσχυσε την ανάρτηση σου

View File

@ -1687,6 +1687,10 @@ es-AR:
title: Nueva mención
poll:
subject: Terminó una encuesta de %{name}
quote:
body: 'Tu mensaje fue citado por %{name}:'
subject: "%{name} citó tu mensaje"
title: Nueva cita
reblog:
body: "%{name} adhirió a tu mensaje:"
subject: "%{name} adhirió a tu mensaje"

View File

@ -1687,6 +1687,10 @@ es-MX:
title: Nueva mención
poll:
subject: Una encuesta de %{name} ha terminado
quote:
body: 'Tu publicación fue citada por %{name}:'
subject: "%{name} citó tu publicación"
title: Nueva cita
reblog:
body: 'Tu publicación fue impulsada por %{name}:'
subject: "%{name} ha impulsado tu publicación"

View File

@ -1687,6 +1687,10 @@ es:
title: Nueva mención
poll:
subject: Una encuesta de %{name} ha terminado
quote:
body: 'Tu publicación ha sido citada por %{name}:'
subject: "%{name} citó tu publicación"
title: Nueva cita
reblog:
body: 'Tu publicación fue impulsada por %{name}:'
subject: "%{name} impulsó tu publicación"

View File

@ -1685,6 +1685,10 @@ fi:
title: Uusi maininta
poll:
subject: Äänestys käyttäjältä %{name} on päättynyt
quote:
body: "%{name} lainasi julkaisuasi:"
subject: "%{name} lainasi julkaisuasi"
title: Uusi lainaus
reblog:
body: "%{name} tehosti julkaisuasi:"
subject: "%{name} tehosti julkaisuasi"

View File

@ -1852,6 +1852,10 @@ fr-CA:
limit: Vous avez déjà épinglé le nombre maximum de messages
ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
reblog: Un partage ne peut pas être épinglé
quote_policies:
followers: Vos abonné·es seulement
nobody: Personne
public: Tout le monde
title: "%{name}: « %{quote} »"
visibilities:
direct: Direct

View File

@ -1852,6 +1852,10 @@ fr:
limit: Vous avez déjà épinglé le nombre maximum de messages
ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
reblog: Un partage ne peut pas être épinglé
quote_policies:
followers: Vos abonné·es seulement
nobody: Personne
public: Tout le monde
title: "%{name}: « %{quote} »"
visibilities:
direct: Direct

View File

@ -1687,6 +1687,10 @@ gl:
title: Nova mención
poll:
subject: A enquisa de %{name} rematou
quote:
body: 'A túa publicación foi citada por %{name}:'
subject: "%{name} citou a túa publicación"
title: Nova cita
reblog:
body: 'A túa publicación promovida por %{name}:'
subject: "%{name} promoveu a túa publicación"

View File

@ -1765,6 +1765,10 @@ he:
title: אזכור חדש
poll:
subject: סקר מאת %{name} הסתיים
quote:
body: 'הודעתך צוטטה על ידי %{name}:'
subject: "%{name} ציטט.ה את הודעתך"
title: ציטוט חדש
reblog:
body: 'הודעתך הודהדה על ידי %{name}:'
subject: הודעתך הודהדה על ידי%{name}

View File

@ -1687,6 +1687,10 @@ hu:
title: Új említés
poll:
subject: "%{name} szavazása véget ért"
quote:
body: 'A bejegyzésedet %{name} idézte:'
subject: "%{name} idézte a bejegyzésedet"
title: Új idézet
reblog:
body: 'A bejegyzésedet %{name} megtolta:'
subject: "%{name} megtolta a bejegyzésedet"
@ -1905,6 +1909,8 @@ hu:
ownership: Nem tűzheted ki valaki más bejegyzését
reblog: Megtolt bejegyzést nem tudsz kitűzni
quote_policies:
followers: Csak a követőid
nobody: Senki
public: Mindenki
title: "%{name}: „%{quote}”"
visibilities:

View File

@ -1042,6 +1042,16 @@ ia:
other: Usate per %{count} personas in le ultime septimana
title: Recommendationes e tendentias
trending: In tendentia
username_blocks:
edit:
title: Modificar regula de nomine de usator
new:
create: Crear regula
title: Crear nove regula de nomine de usator
no_username_block_selected: Necun regula de usator ha essite cambiate perque necun ha essite seligite
not_permitted: Non permittite
title: Regulas de nomine de usator
updated_msg: Regula de nomine de usator actualisate con successo
warning_presets:
add_new: Adder nove
delete: Deler

View File

@ -1691,6 +1691,10 @@ is:
title: Ný tilvísun
poll:
subject: Könnun frá %{name} er lokið
quote:
body: "%{name} vitnaði í færsluna þína:"
subject: "%{name} vitnaði í færsluna þína"
title: Ný tilvitnun
reblog:
body: "%{name} endurbirti færsluna þína:"
subject: "%{name} endurbirti færsluna þína"

View File

@ -1689,6 +1689,10 @@ it:
title: Nuova menzione
poll:
subject: Un sondaggio da %{name} è terminato
quote:
body: 'Il tuo post è stato citato da %{name}:'
subject: "%{name} ha citato il tuo post"
title: Nuova citazione
reblog:
body: 'Il tuo status è stato condiviso da %{name}:'
subject: "%{name} ha condiviso il tuo status"
@ -1907,6 +1911,8 @@ it:
ownership: Non puoi fissare in cima un post di qualcun altro
reblog: Un toot condiviso non può essere fissato in cima
quote_policies:
followers: Solo i tuoi seguaci
nobody: Nessuno
public: Tutti
title: '%{name}: "%{quote}"'
visibilities:

View File

@ -1687,6 +1687,10 @@ nl:
title: Nieuwe vermelding
poll:
subject: Een peiling van %{name} is beëindigd
quote:
body: 'Jouw bericht werd door %{name} geciteerd:'
subject: "%{name} heeft jouw bericht geciteerd"
title: Nieuw citaat
reblog:
body: 'Jouw bericht werd door %{name} geboost:'
subject: "%{name} boostte jouw bericht"

View File

@ -323,6 +323,7 @@ ca:
follow_request: Algú sol·licita seguir-te
mention: Algú et menciona
pending_account: Un nou compte necessita revisió
quote: Algú us ha citat
reblog: Algú comparteix el teu estat
report: S'ha enviat l'informe nou
software_updates:

View File

@ -331,6 +331,7 @@ cs:
follow_request: Někdo požádal o možnost vás sledovat
mention: Někdo vás zmínil
pending_account: Je třeba posoudit nový účet
quote: Někdo vás citoval
reblog: Někdo boostnul váš příspěvek
report: Je odesláno nové hlášení
software_updates:

View File

@ -329,6 +329,7 @@ da:
follow_request: Nogen anmodede om at følge dig
mention: Nogen omtalte dig
pending_account: Ny konto kræver gennemgang
quote: Nogle citerede dig
reblog: Nogen fremhævede dit indlæg
report: Ny anmeldelse indsendt
software_updates:

View File

@ -329,6 +329,7 @@ de:
follow_request: Jemand möchte mir folgen
mention: Ich wurde erwähnt
pending_account: Ein neues Konto muss überprüft werden
quote: Jemand zitierte dich
reblog: Mein Beitrag wurde geteilt
report: Eine neue Meldung wurde eingereicht
software_updates:

View File

@ -329,6 +329,7 @@ el:
follow_request: Κάποιος ζήτησε να σε ακολουθήσει
mention: Κάποιος σε επισήμανε
pending_account: Νέος λογαριασμός χρειάζεται αναθεώρηση
quote: Κάποιος σε παρέθεσε
reblog: Κάποιος ενίσχυσε την ανάρτηση σου
report: Υποβλήθηκε νέα αναφορά
software_updates:

View File

@ -329,6 +329,7 @@ es-AR:
follow_request: Una cuenta solicita seguirte
mention: Una cuenta te menciona
pending_account: Una nueva cuenta necesita revisión
quote: Alguien te citó
reblog: Una cuenta adhiere a tu mensaje
report: Se envió una nueva denuncia
software_updates:

View File

@ -56,7 +56,7 @@ es-MX:
scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales.
setting_aggregate_reblogs: No mostrar nuevos impulsos para las publicaciones que han sido recientemente impulsadas (sólo afecta a las publicaciones recibidas recientemente)
setting_always_send_emails: Normalmente las notificaciones por correo electrónico no se enviarán cuando estés usando Mastodon activamente
setting_default_quote_policy: Este ajuste solo tendrá efecto en publicaciones creadas con la próxima versión de Mastodon, pero puedes configurarlo previamente.
setting_default_quote_policy: Esta configuración solo tendrá efecto en las publicaciones creadas con la próxima versión de Mastodon, pero puedes seleccionar tu preferencia como preparación.
setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un clic
setting_display_media_default: Ocultar contenido multimedia marcado como sensible
setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia
@ -329,6 +329,7 @@ es-MX:
follow_request: Enviar correo electrónico cuando alguien solicita seguirte
mention: Enviar correo electrónico cuando alguien te mencione
pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión
quote: Alguien te citó
reblog: Enviar correo electrónico cuando alguien comparta su publicación
report: Nuevo reporte enviado
software_updates:

View File

@ -329,6 +329,7 @@ es:
follow_request: Enviar correo electrónico cuando alguien solicita seguirte
mention: Enviar correo electrónico cuando alguien te mencione
pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión
quote: Alguien te ha citado
reblog: Enviar correo electrónico cuando alguien comparta su publicación
report: Nuevo informe enviado
software_updates:

View File

@ -328,6 +328,7 @@ fi:
follow_request: Joku pyysi lupaa seurata sinua
mention: Joku mainitsi sinut
pending_account: Uusi tili tarvitsee tarkastuksen
quote: Joku lainasi sinua
reblog: Joku tehosti julkaisuasi
report: Uusi raportti lähetettiin
software_updates:

View File

@ -56,6 +56,7 @@ fr-CA:
scopes: À quelles APIs lapplication sera autorisée à accéder. Si vous sélectionnez une permission générale, vous navez pas besoin de sélectionner les permissions plus précises.
setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (naffecte que les partages futurs)
setting_always_send_emails: Normalement, les notifications par courriel ne seront pas envoyées lorsque vous utilisez Mastodon activement
setting_default_quote_policy: Ce paramètre ne prendra effet que pour les messages créés avec la prochaine version de Mastodon, mais vous pouvez sélectionner votre préférence en avance.
setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés dun simple clic
setting_display_media_default: Masquer les médias marqués comme sensibles
setting_display_media_hide_all: Toujours masquer les médias
@ -228,6 +229,7 @@ fr-CA:
setting_boost_modal: Demander confirmation avant de partager un message
setting_default_language: Langue de publication
setting_default_privacy: Confidentialité des messages
setting_default_quote_policy: Autoriser les citations pour
setting_default_sensitive: Toujours marquer les médias comme sensibles
setting_delete_modal: Demander confirmation avant de supprimer un message
setting_disable_hover_cards: Désactiver l'aperçu du profil au survol

View File

@ -56,6 +56,7 @@ fr:
scopes: À quelles APIs lapplication sera autorisée à accéder. Si vous sélectionnez une permission générale, vous navez pas besoin de sélectionner les permissions plus précises.
setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (naffecte que les partages futurs)
setting_always_send_emails: Normalement, les notifications par courriel ne seront pas envoyées lorsque vous utilisez Mastodon activement
setting_default_quote_policy: Ce paramètre ne prendra effet que pour les messages créés avec la prochaine version de Mastodon, mais vous pouvez sélectionner votre préférence en avance.
setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés dun simple clic
setting_display_media_default: Masquer les médias marqués comme sensibles
setting_display_media_hide_all: Toujours masquer les médias
@ -228,6 +229,7 @@ fr:
setting_boost_modal: Demander confirmation avant de partager un message
setting_default_language: Langue de publication
setting_default_privacy: Confidentialité des messages
setting_default_quote_policy: Autoriser les citations pour
setting_default_sensitive: Toujours marquer les médias comme sensibles
setting_delete_modal: Demander confirmation avant de supprimer un message
setting_disable_hover_cards: Désactiver l'aperçu du profil au survol

View File

@ -329,6 +329,7 @@ gl:
follow_request: Enviar un correo cando alguén solicita seguirte
mention: Enviar un correo cando alguén te menciona
pending_account: Enviar un correo cando unha nova conta precisa revisión
quote: Citoute alguén
reblog: Enviar un correo cando alguén promociona a tua mensaxe
report: Enviouse unha nova denuncia
software_updates:

View File

@ -331,6 +331,7 @@ he:
follow_request: מישהו.י ביקש.ה לעקוב אחריך
mention: שליחת דוא"ל כשפונים אלייך
pending_account: נדרשת סקירה של חשבון חדש
quote: שליחת דוא"ל כשמצטטים הודעה שלך
reblog: שליחת דוא"ל כשמהדהדים הודעה שלך
report: דו"ח חדש הוגש
software_updates:

View File

@ -56,6 +56,7 @@ hu:
scopes: Mely API-kat érheti el az alkalmazás. Ha felső szintű hatáskört választasz, nem kell egyesével kiválasztanod az alatta lévőeket.
setting_aggregate_reblogs: Ne mutassunk megtolásokat olyan bejegyzésekhez, melyeket nemrég toltak meg (csak új megtolásokra lép életbe)
setting_always_send_emails: Alapesetben nem küldünk e-mail-értesítéseket, ha aktívan használod a Mastodont
setting_default_quote_policy: A beállítás csak a Mastodon következő verziójával készült bejegyzésekre lesz hatással, de előre kiválaszthatod az előnyben részesített beállítást.
setting_default_sensitive: A kényes médiatartalmat alapesetben elrejtjük, de egyetlen kattintással előhozható
setting_display_media_default: Kényes tartalomnak jelölt média elrejtése
setting_display_media_hide_all: Média elrejtése mindig
@ -328,6 +329,7 @@ hu:
follow_request: E-mail küldése, amikor valaki követni szeretne téged
mention: E-mail küldése, amikor valaki megemlít téged
pending_account: E-mail küldése, ha új fiókot kell engedélyezni
quote: E-mail küldése, amikor valaki idéz téged
reblog: Valaki megtolta a bejegyzésedet
report: Új bejelentést küldtek be
software_updates:

View File

@ -329,6 +329,7 @@ is:
follow_request: Einhver hefur beðið um að fylgjast með þér
mention: Einhver minntist á þig
pending_account: Nýr notandaaðgangur þarfnast yfirferðar
quote: Einhver vitnaði í þig
reblog: Einhver endurbirti færsluna þína
report: Ný kæra hefur verið send inn
software_updates:

View File

@ -56,6 +56,7 @@ it:
scopes: A quali API l'applicazione potrà avere accesso. Se selezionate un ambito di alto livello, non c'è bisogno di selezionare quelle singole.
setting_aggregate_reblogs: Non mostrare nuove condivisioni per toot che sono stati condivisi di recente (ha effetto solo sulle nuove condivisioni)
setting_always_send_emails: Normalmente le notifiche e-mail non vengono inviate quando si utilizza attivamente Mastodon
setting_default_quote_policy: Questa impostazione avrà effetto solo per i post creati con la prossima versione di Mastodon, ma puoi selezionare le tue preferenze in fase di preparazione.
setting_default_sensitive: Media con contenuti sensibili sono nascosti in modo predefinito e possono essere rivelati con un click
setting_display_media_default: Nascondi media segnati come sensibili
setting_display_media_hide_all: Nascondi sempre tutti i media
@ -328,6 +329,7 @@ it:
follow_request: Invia email quando qualcuno chiede di seguirti
mention: Invia email quando qualcuno ti menziona
pending_account: Invia e-mail quando un nuovo account richiede l'approvazione
quote: Qualcuno ti ha citato
reblog: Qualcuno ha condiviso il tuo post
report: Una nuova segnalazione è stata inviata
software_updates:

View File

@ -329,6 +329,7 @@ nl:
follow_request: Wanneer iemand jou wil volgen
mention: Je bent door iemand vermeld
pending_account: Wanneer een nieuw account moet worden beoordeeld
quote: Iemand heeft jou geciteerd
reblog: Wanneer iemand jouw bericht heeft geboost
report: Nieuwe rapportage is ingediend
software_updates:

View File

@ -329,6 +329,7 @@ tr:
follow_request: Biri seni takip etmek istedi
mention: Birisi senden bahsetti
pending_account: Yeni hesabın incelenmesi gerekiyor
quote: Birisi senden alıntı yaptı
reblog: Birisi gönderini boostladı
report: Yeni rapor gönderildi
software_updates:

View File

@ -317,6 +317,7 @@ uk:
follow_request: Коли хтось запитує дозвіл підписатися
mention: Коли хтось згадує вас
pending_account: Надсилати електронного листа, коли новий обліковий запис потребує розгляду
quote: Хтось процитував вас
reblog: Коли хтось поширює ваш допис
report: Нову скаргу надіслано
software_updates:

View File

@ -328,6 +328,7 @@ vi:
follow_request: Ai đó yêu cầu theo dõi bạn
mention: Ai đó nhắc đến bạn
pending_account: Phê duyệt tài khoản mới
quote: Ai đó trích dẫn bạn
reblog: Ai đó đăng lại tút của bạn
report: Ai đó gửi báo cáo
software_updates:

View File

@ -328,6 +328,7 @@ zh-TW:
follow_request: 當有使用者請求跟隨您時,傳送電子郵件通知
mention: 當有使用者於嘟文提及您時,傳送電子郵件通知
pending_account: 有新的帳號需要審核
quote: 當有使用者引用您的嘟文時
reblog: 當有使用者轉嘟您的嘟文時,傳送電子郵件通知
report: 新回報已遞交
software_updates:

View File

@ -1596,7 +1596,7 @@ tr:
password: parola
sign_in_token: e-posta güvenlik kodu
webauthn: güvenlik anahtarları
description_html: Eğer tanımadığınız bir faaliyet görüyorsanız, parolanızı değiştirmeyi ve iki aşamalı kimlik doğrulamayı etkinleştirmeyi düşünün.
description_html: Eğer tanımadığınız bir faaliyet görürseniz, parolanızı değiştirmeyi ve iki aşamalı kimlik doğrulamayı etkinleştirmeyi değerlendirin.
empty: Kimlik doğrulama geçmişi yok
failed_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarısız oturum açma girişimi"
successful_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarılı oturum açma"
@ -1687,6 +1687,10 @@ tr:
title: Yeni bahsetme
poll:
subject: Anket %{name} tarafından sonlandırıldı
quote:
body: "%{name} durumunuzu yeniden paylaştı:"
subject: "%{name} gönderini yeniden paylaştı"
title: Yeni alıntı
reblog:
body: "%{name} durumunuzu yeniden paylaştı:"
subject: "%{name} durumunuzu yeniden paylaştı"

View File

@ -1633,6 +1633,8 @@ uk:
title: Нова згадка
poll:
subject: Опитування від %{name} завершено
quote:
body: 'Ваш пост був процитований %{name}:'
reblog:
body: "%{name} поширює ваш допис:"
subject: "%{name} поширив ваш статус"

View File

@ -1648,6 +1648,10 @@ vi:
title: Lượt nhắc mới
poll:
subject: Vốt của %{name} đã kết thúc
quote:
body: 'Tút của bạn được trích dẫn bởi %{name}:'
subject: "%{name} vừa trích dẫn tút của bạn"
title: Trích dẫn mới
reblog:
body: Tút của bạn vừa được %{name} đăng lại
subject: "%{name} vừa đăng lại tút của bạn"

View File

@ -1650,6 +1650,10 @@ zh-TW:
title: 新的提及
poll:
subject: 由 %{name} 發起的投票已結束
quote:
body: 您的嘟文被 %{name} 引用:
subject: "%{name} 已引用您的嘟文"
title: 新引用
reblog:
body: 您的嘟文被 %{name} 轉嘟:
subject: "%{name} 已轉嘟您的嘟文"

View File

@ -59,7 +59,7 @@ services:
web:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
# build: .
image: ghcr.io/mastodon/mastodon:v4.4.2
image: ghcr.io/mastodon/mastodon:v4.4.3
restart: always
env_file: .env.production
command: bundle exec puma -C config/puma.rb
@ -83,7 +83,7 @@ services:
# build:
# dockerfile: ./streaming/Dockerfile
# context: .
image: ghcr.io/mastodon/mastodon-streaming:v4.4.2
image: ghcr.io/mastodon/mastodon-streaming:v4.4.3
restart: always
env_file: .env.production
command: node ./streaming/index.js
@ -102,7 +102,7 @@ services:
sidekiq:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
# build: .
image: ghcr.io/mastodon/mastodon:v4.4.2
image: ghcr.io/mastodon/mastodon:v4.4.3
restart: always
env_file: .env.production
command: bundle exec sidekiq

View File

@ -17,7 +17,7 @@ module Mastodon
end
def default_prerelease
'alpha.1'
'alpha.2'
end
def prerelease

View File

@ -219,16 +219,16 @@ RSpec.describe ApplicationController do
it_behaves_like 'error response', 410
end
describe 'unprocessable_entity' do
describe 'unprocessable_content' do
controller do
def route_unprocessable_entity
unprocessable_entity
def route_unprocessable_content
unprocessable_content
end
end
subject do
routes.draw { get 'route_unprocessable_entity' => 'anonymous#route_unprocessable_entity' }
get 'route_unprocessable_entity'
routes.draw { get 'route_unprocessable_content' => 'anonymous#route_unprocessable_content' }
get 'route_unprocessable_content'
end
it_behaves_like 'error response', 422

View File

@ -108,6 +108,12 @@ RSpec.describe 'API V1 Statuses Quotes' do
expect(response)
.to have_http_status(200)
expect(response.content_type)
.to start_with('application/json')
expect(response.parsed_body)
.to match(
a_hash_including(id: quote.status.id.to_s, quote: a_hash_including(state: 'revoked'))
)
end
end

View File

@ -98,7 +98,7 @@ RSpec.describe 'Search API' do
context 'when search raises syntax error' do
before { allow(Search).to receive(:new).and_raise(Mastodon::SyntaxError) }
it 'returns http unprocessable_entity' do
it 'returns http unprocessable_content' do
get '/api/v2/search', headers: headers, params: params
expect(response).to have_http_status(422)