Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6ae1b4f
Allow quotes to be displayed in the featured carousel (#36335)
diondiondion Oct 2, 2025
cb0065c
Fix redirect to external object when URL is missing or malformed (#36…
ClearlyClaire Oct 3, 2025
636ecd1
Display quotes in email notifications (#36379)
diondiondion Oct 7, 2025
4c12c2e
Add integration tests for mastodon-streaming (#36025)
ThisIsMissEm Sep 30, 2025
d8ddf95
Fix JSON payload being potentially mutated when processing interactio…
ClearlyClaire Oct 8, 2025
3c72524
Update dependency `rack`
ClearlyClaire Oct 8, 2025
6703164
Update dependency `uri`
ClearlyClaire Oct 8, 2025
d911397
Use tag filter for pending tag count on admin dashboard (#36404)
mjankowski Oct 9, 2025
67575e5
Fix quote post state sometimes not being updated through streaming se…
ClearlyClaire Oct 9, 2025
a186bad
Fix `"quote": { "type": "Tombstone" }` being ignored
ClearlyClaire Oct 7, 2025
d7d6407
Explicitly record Tombstone quotes as deleted
ClearlyClaire Oct 9, 2025
e4bdbcc
New Crowdin Translations for stable-4.4 (automated) (#36431)
github-actions[bot] Oct 10, 2025
044a20f
Update dependency `rack`
ClearlyClaire Oct 13, 2025
6796765
Update dependency `openssl`
ClearlyClaire Oct 13, 2025
8477bec
Merge commit from fork
ClearlyClaire Oct 13, 2025
1631fb8
Merge commit from fork
ClearlyClaire Oct 13, 2025
cbef4c9
Merge commit from fork
ThisIsMissEm Oct 13, 2025
adf2916
Bump version to v4.4.6 (#36444)
ClearlyClaire Oct 13, 2025
d7f4eca
Fix streaming still being authorized for suspended accounts (#36449)
ClearlyClaire Oct 13, 2025
14bfb0f
Merge remote-tracking branch 'parent/stable-4.4' into kb-draft-19.7-lts
kmycode Oct 14, 2025
6a0a64c
Fix test
kmycode Oct 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

All notable changes to this project will be documented in this file.

## [4.4.6] - 2025-10-13

### Security

- Update dependencies `rack` and `uri`
- Fix streaming server connection not being closed on user suspension (by @ThisIsMissEm, [GHSA-r2fh-jr9c-9pxh](https://github.com/mastodon/mastodon/security/advisories/GHSA-r2fh-jr9c-9pxh))
- Fix password change through admin CLI not invalidating existing sessions and access tokens (by @ThisIsMissEm, [GHSA-f3q3-rmf7-9655](https://github.com/mastodon/mastodon/security/advisories/GHSA-f3q3-rmf7-9655))
- Fix streaming server allowing access to public timelines even without the `read` or `read:statuses` OAuth scopes (by @ThisIsMissEm, [GHSA-7gwh-mw97-qjgp](https://github.com/mastodon/mastodon/security/advisories/GHSA-7gwh-mw97-qjgp))

### Added

- Add support for processing quotes of deleted posts signaled through a `Tombstone` (#36381 by @ClearlyClaire)

### Fixed

- Fix quote post state sometimes not being updated through streaming server (#36408 by @ClearlyClaire)
- Fix inconsistent “pending tags” count on admin dashboard (#36404 by @mjankowski)
- Fix JSON payload being potentially mutated when processing interaction policies (#36392 by @ClearlyClaire)
- Fix quotes not being displayed in email notifications (#36379 by @diondiondion)
- Fix redirect to external object when URL is missing or malformed (#36347 by @ClearlyClaire)
- Fix quotes not being displayed in the featured carousel (#36335 by @diondiondion)

## [4.4.5] - 2025-09-23

### Security
Expand Down
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ group :test do

# Stub web requests for specs
gem 'webmock', '~> 3.18'

# Websocket driver for testing integration between rails/sidekiq and streaming
gem 'websocket-driver', '~> 0.8', require: false
end

group :development do
Expand Down
9 changes: 5 additions & 4 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ GEM
tzinfo
validate_url
webfinger (~> 2.0)
openssl (3.3.0)
openssl (3.3.1)
openssl-signature_algorithm (1.3.0)
openssl (> 2.0)
opentelemetry-api (1.5.0)
Expand Down Expand Up @@ -642,7 +642,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
rack (3.1.16)
rack (3.1.18)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-cors (3.0.0)
Expand Down Expand Up @@ -899,7 +899,7 @@ GEM
unicode-display_width (3.1.4)
unicode-emoji (~> 4.0, >= 4.0.4)
unicode-emoji (4.0.4)
uri (1.0.3)
uri (1.0.4)
useragent (0.16.11)
validate_url (1.0.15)
activemodel (>= 3.0.0)
Expand Down Expand Up @@ -932,7 +932,7 @@ GEM
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
webrick (1.9.1)
websocket-driver (0.7.7)
websocket-driver (0.8.0)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
Expand Down Expand Up @@ -1096,6 +1096,7 @@ DEPENDENCIES
webauthn (~> 3.0)
webmock (~> 3.18)
webpush!
websocket-driver (~> 0.8)
xorcist (~> 1.1)

RUBY VERSION
Expand Down
8 changes: 7 additions & 1 deletion app/controllers/admin/dashboard_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,16 @@ def index

@pending_appeals_count = Appeal.pending.async_count
@pending_reports_count = Report.unresolved.async_count
@pending_tags_count = Tag.pending_review.async_count
@pending_tags_count = pending_tags.async_count
@pending_users_count = User.pending.async_count
@system_checks = Admin::SystemCheck.perform(current_user)
@time_period = (29.days.ago.to_date...Time.now.utc.to_date)
end

private

def pending_tags
::Trends::TagFilter.new(status: :pending_review).results
end
end
end
9 changes: 2 additions & 7 deletions app/javascript/mastodon/components/featured_carousel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { useDrag } from '@use-gesture/react';
import { expandAccountFeaturedTimeline } from '@/mastodon/actions/timelines';
import { Icon } from '@/mastodon/components/icon';
import { IconButton } from '@/mastodon/components/icon_button';
import StatusContainer from '@/mastodon/containers/status_container';
import { StatusQuoteManager } from '@/mastodon/components/status_quoted';
import { usePrevious } from '@/mastodon/hooks/usePrevious';
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
Expand Down Expand Up @@ -218,12 +218,7 @@ const FeaturedCarouselItem: React.FC<
ref={handleRef}
{...props}
>
<StatusContainer
// @ts-expect-error inferred props are wrong
id={statusId}
contextType='account'
withCounters
/>
<StatusQuoteManager id={statusId} contextType='account' withCounters />
</animated.div>
);
};
3 changes: 2 additions & 1 deletion app/javascript/mastodon/locales/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
"annual_report.summary.archetype.replier": "الفراشة الاجتماعية",
"annual_report.summary.followers.followers": "المُتابِعُون",
"annual_report.summary.followers.total": "{count} في المجمل",
"annual_report.summary.here_it_is": "هذا ملخص الخص بك لسنة {year}:",
"annual_report.summary.here_it_is": "فيما يلي ملخصك لسنة {year}:",
"annual_report.summary.highlighted_post.by_favourites": "المنشور ذو أعلى عدد تفضيلات",
"annual_report.summary.highlighted_post.by_reblogs": "أكثر منشور مُعاد نشره",
"annual_report.summary.highlighted_post.by_replies": "المنشور بأعلى عدد تعليقات",
Expand Down Expand Up @@ -873,6 +873,7 @@
"status.open": "وسّع هذا المنشور",
"status.pin": "دبّسه على الصفحة التعريفية",
"status.quote_error.filtered": "مُخفي بسبب إحدى إعدادات التصفية خاصتك",
"status.quote_error.limited_account_hint.action": "إظهاره على أي حال",
"status.quote_error.not_found": "لا يمكن عرض هذا المنشور.",
"status.quote_error.pending_approval": "هذا المنشور ينتظر موافقة صاحب المنشور الأصلي.",
"status.quote_error.rejected": "لا يمكن عرض هذا المنشور لأن صاحب المنشور الأصلي لا يسمح له بأن يكون مقتبس.",
Expand Down
48 changes: 25 additions & 23 deletions app/javascript/mastodon/locales/be.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"account.locked_info": "Гэты ўліковы запіс пазначаны як схаваны. Уладальнік сам вырашае, хто можа падпісвацца на яго.",
"account.media": "Медыя",
"account.mention": "Згадаць @{name}",
"account.moved_to": "{name} указаў, што яго/яе новы ўліковы запіс цяпер:",
"account.moved_to": "{name} указаў(-ла), што яго/яе новы ўліковы запіс цяпер:",
"account.mute": "Ігнараваць @{name}",
"account.mute_notifications_short": "Не апавяшчаць",
"account.mute_short": "Ігнараваць",
Expand All @@ -68,10 +68,10 @@
"account.open_original_page": "Адкрыць арыгінальную старонку",
"account.posts": "Допісы",
"account.posts_with_replies": "Допісы і адказы",
"account.remove_from_followers": "Выдаліць карыстальніка {name} з падпісчыкаў",
"account.remove_from_followers": "Выдаліць {name} з падпісчыкаў",
"account.report": "Паскардзіцца на @{name}",
"account.requested": "Чакаецца ўхваленне. Націсніце, каб скасаваць запыт на падпіску",
"account.requested_follow": "{name} адправіў запыт на падпіску",
"account.requested_follow": "{name} адправіў(-ла) запыт на падпіску",
"account.requests_to_follow_you": "Хоча падпісацца на вас",
"account.share": "Абагуліць профіль @{name}",
"account.show_reblogs": "Паказаць падштурхоўванні ад @{name}",
Expand Down Expand Up @@ -229,7 +229,7 @@
"confirmations.discard_edit_media.confirm": "Адмяніць",
"confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?",
"confirmations.follow_to_list.confirm": "Падпісацца і дадаць у спіс",
"confirmations.follow_to_list.message": "Вам трэба падпісацца на карыстальніка {name}, каб дадаць яго ў спіс.",
"confirmations.follow_to_list.message": "Вам трэба падпісацца на {name}, каб дадаць яго/яе ў спіс.",
"confirmations.follow_to_list.title": "Падпісацца на карыстальніка?",
"confirmations.logout.confirm": "Выйсці",
"confirmations.logout.message": "Вы ўпэўненыя, што хочаце выйсці?",
Expand All @@ -243,7 +243,7 @@
"confirmations.redraft.message": "Вы ўпэўнены, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.",
"confirmations.redraft.title": "Выдаліць і перапісаць допіс?",
"confirmations.remove_from_followers.confirm": "Выдаліць падпісчыка",
"confirmations.remove_from_followers.message": "Карыстальнік {name} больш не будзе падпісаны на Вас. Упэўненыя, што хочаце працягнуць?",
"confirmations.remove_from_followers.message": "{name} больш не будзе падпісаны(-ая) на Вас. Упэўненыя, што хочаце працягнуць?",
"confirmations.remove_from_followers.title": "Выдаліць падпісчыка?",
"confirmations.unfollow.confirm": "Адпісацца",
"confirmations.unfollow.message": "Вы ўпэўненыя, што хочаце адпісацца ад {name}?",
Expand Down Expand Up @@ -580,29 +580,29 @@
"navigation_panel.expand_followed_tags": "Разгарнуць меню падпісак на хэштэгі",
"navigation_panel.expand_lists": "Разгарнуць меню спіса",
"not_signed_in_indicator.not_signed_in": "Вам трэба ўвайсці каб атрымаць доступ да гэтага рэсурсу.",
"notification.admin.report": "{name} паскардзіўся на {target}",
"notification.admin.report_account": "{name} паскардзіўся на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target} з прычыны {category}",
"notification.admin.report_account_other": "{name} паскардзіўся на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target}",
"notification.admin.report_statuses": "{name} паскардзіўся на {target} з прычыны {category}",
"notification.admin.report_statuses_other": "{name} паскардзіўся на {target}",
"notification.admin.sign_up": "{name} зарэгістраваўся",
"notification.admin.sign_up.name_and_others": "{name} і {count, plural, one {# іншы} other {# іншых}} зарэгістраваліся",
"notification.admin.report": "{name} паскардзіўся(-лась) на {target}",
"notification.admin.report_account": "{name} паскардзіўся(-лась) на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target} з прычыны {category}",
"notification.admin.report_account_other": "{name} паскардзіўся(-лась) на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target}",
"notification.admin.report_statuses": "{name} паскардзіўся(-лась) на {target} з прычыны {category}",
"notification.admin.report_statuses_other": "{name} паскардзіўся(-лась) на {target}",
"notification.admin.sign_up": "{name} зарэгістраваўся(-лась)",
"notification.admin.sign_up.name_and_others": "{name} і {count, plural, one {# іншы(-ая)} other {# іншых}} зарэгістраваліся",
"notification.annual_report.message": "Вас чакае Ваш #Wrapstodon нумар {year}! Падзяліцеся сваімі галоўнымі падзеямі і запамінальнымі момантамі ў Mastodon!",
"notification.annual_report.view": "Перайсці да #Wrapstodon",
"notification.favourite": "Карыстальнік {name} упадабаў Ваш допіс",
"notification.favourite.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы} other {# іншыя}}</a> ўпадабалі Ваш допіс",
"notification.favourite_pm": "Ваша асабістае згадванне ўпадабана {name}",
"notification.favourite_pm.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы} few {# іншыя} many {# іншых} other {# іншых}}</a> ўпадабалі ваша асабістае згадванне",
"notification.follow": "{name} падпісаўся на вас",
"notification.follow.name_and_others": "{name} і <a>{count, plural, one {# іншы} other {# іншыя}}</a> падпісаліся на Вас",
"notification.follow_request": "{name} адправіў запыт на падпіску",
"notification.favourite": "{name} упадабаў(-ла) Ваш допіс",
"notification.favourite.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы(-ая)} other {# іншыя}}</a> ўпадабалі Ваш допіс",
"notification.favourite_pm": "{name} упадабаў(-ла) Вашае прыватнае згадванне",
"notification.favourite_pm.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы(-ая)} few {# іншыя} many {# іншых} other {# іншых}}</a> ўпадабалі ваша асабістае згадванне",
"notification.follow": "{name} падпісаўся(-лась) на Вас",
"notification.follow.name_and_others": "{name} і <a>{count, plural, one {# іншы(-ая)} other {# іншыя}}</a> падпісаліся на Вас",
"notification.follow_request": "{name} адправіў(-ла) запыт на падпіску",
"notification.follow_request.name_and_others": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}} запыталіся падпісацца на вас",
"notification.label.mention": "Згадванне",
"notification.label.private_mention": "Асабістае згадванне",
"notification.label.private_reply": "Асабісты адказ",
"notification.label.reply": "Адказ",
"notification.mention": "Згадванне",
"notification.mentioned_you": "{name} згадаў вас",
"notification.mentioned_you": "{name} згадаў(-ла) Вас",
"notification.moderation-warning.learn_more": "Даведацца больш",
"notification.moderation_warning": "Вы атрымалі папярэджанне ад мадэратараў",
"notification.moderation_warning.action_delete_statuses": "Некаторыя Вашыя допісы былі выдаленыя.",
Expand All @@ -614,8 +614,8 @@
"notification.moderation_warning.action_suspend": "Ваш уліковы запіс быў заблакіраваны.",
"notification.own_poll": "Ваша апытанне скончылася",
"notification.poll": "Апытанне, дзе Вы прынялі ўдзел, скончылася",
"notification.reblog": "{name} пашырыў ваш допіс",
"notification.reblog.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы} many {# іншых} other {# іншых}}</a> пашырылі ваш допіс",
"notification.reblog": "{name} пашырыў(-ла) Ваш допіс",
"notification.reblog.name_and_others_with_link": "{name} і <a>{count, plural, one {# іншы(-ая)} many {# іншых} other {# іншых}}</a> пашырылі Ваш допіс",
"notification.relationships_severance_event": "Страціў сувязь з {name}",
"notification.relationships_severance_event.account_suspension": "Адміністратар з {from} прыпыніў працу ўліковага запісу {target}, што азначае, што Вы больш не можаце атрымліваць ад іх абнаўленні ці ўзаемадзейнічаць з імі.",
"notification.relationships_severance_event.domain_block": "Адміністратар з {from} заблакіраваў {target}, у тым ліку {followersCount} вашых падпісчыка(-аў) і {followingCount, plural, one {# уліковы запіс} few {# уліковыя запісы} many {# уліковых запісаў} other {# уліковых запісаў}}.",
Expand Down Expand Up @@ -843,7 +843,7 @@
"status.admin_account": "Адкрыць інтэрфейс мадэратара для @{name}",
"status.admin_domain": "Адкрыць інтэрфейс мадэратара для {domain}",
"status.admin_status": "Адкрыць гэты допіс у інтэрфейсе мадэрацыі",
"status.block": "Заблакаваць @{name}",
"status.block": "Заблакіраваць @{name}",
"status.bookmark": "Дадаць закладку",
"status.cancel_reblog_private": "Прыбраць",
"status.cannot_reblog": "Гэты допіс нельга пашырыць",
Expand Down Expand Up @@ -873,6 +873,8 @@
"status.open": "Разгарнуць гэты допіс",
"status.pin": "Замацаваць у профілі",
"status.quote_error.filtered": "Схавана адным з Вашых фільтраў",
"status.quote_error.limited_account_hint.action": "Усё адно паказаць",
"status.quote_error.limited_account_hint.title": "Гэты ўліковы запіс быў схаваны мадэратарамі {domain}.",
"status.quote_error.not_found": "Гэты допіс немагчыма паказаць.",
"status.quote_error.pending_approval": "Гэты допіс чакае ўхвалення ад аўтара арыгінала.",
"status.quote_error.rejected": "Гэты допіс немагчыма паказаць, паколькі аўтар арыгінала не дазваляе цытаваць яго.",
Expand Down
Loading