Skip to content

Commit a4379cc

Browse files
committed
Merge remote-tracking branch 'parent/main' into upstream-20260325
2 parents bb8eb3a + a3bdcc7 commit a4379cc

104 files changed

Lines changed: 1573 additions & 687 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.storybook/preview.tsx

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ import { modes } from './modes';
2626
import '../app/javascript/styles/application.scss';
2727
import './styles.css';
2828

29-
const localeFiles = import.meta.glob('@/mastodon/locales/*.json', {
30-
query: { as: 'json' },
31-
});
29+
// Disabling locales in Storybook as it's breaking with Vite 8.
30+
// const localeFiles = import.meta.glob('@/mastodon/locales/*.json', {
31+
// query: { as: 'json' },
32+
// });
3233

3334
// Initialize MSW
3435
initialize({
@@ -39,17 +40,17 @@ const preview: Preview = {
3940
// Auto-generate docs: https://storybook.js.org/docs/writing-docs/autodocs
4041
tags: ['autodocs'],
4142
globalTypes: {
42-
locale: {
43-
description: 'Locale for the story',
44-
toolbar: {
45-
title: 'Locale',
46-
icon: 'globe',
47-
items: Object.keys(localeFiles).map((path) =>
48-
path.replace('/mastodon/locales/', '').replace('.json', ''),
49-
),
50-
dynamicTitle: true,
51-
},
52-
},
43+
// locale: {
44+
// description: 'Locale for the story',
45+
// toolbar: {
46+
// title: 'Locale',
47+
// icon: 'globe',
48+
// items: Object.keys(localeFiles).map((path) =>
49+
// path.replace('/mastodon/locales/', '').replace('.json', ''),
50+
// ),
51+
// dynamicTitle: true,
52+
// },
53+
// },
5354
theme: {
5455
description: 'Theme for the story',
5556
toolbar: {

CHANGELOG.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,36 @@
22

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

5+
## [4.5.8] - 2026-03-24
6+
7+
### Security
8+
9+
- Fix insufficient checks on quote authorizations ([GHSA-q4g8-82c5-9h33](https://github.com/mastodon/mastodon/security/advisories/GHSA-q4g8-82c5-9h33))
10+
- Fix open redirect in legacy path handler ([GHSA-xqw8-4j56-5hj6](https://github.com/mastodon/mastodon/security/advisories/GHSA-xqw8-4j56-5hj6))
11+
- Updated dependencies
12+
13+
### Added
14+
15+
- Add for searching already-known private GtS posts (#38057 by @ClearlyClaire)
16+
17+
### Changed
18+
19+
- Change media description length limit for remote media attachments from 1500 to 10000 characters (#37921 by @ClearlyClaire)
20+
- Change HTTP signatures to skip the `Accept` header (#38132 by @ClearlyClaire)
21+
- Change numeric AP endpoints to redirect to short account URLs when HTML is requested (#38056 by @ClearlyClaire)
22+
23+
### Fixed
24+
25+
- Fix some model definitions in `tootctl maintenance fix-duplicates` (#38214 by @ClearlyClaire)
26+
- Fix overly strict checks for current username on account migration page (#38183 by @mjankowski)
27+
- Fix OpenStack Swift Keystone token rate limiting (#38145 by @hugogameiro)
28+
- Fix poll expiration notification being re-triggered on implicit updates (#38078 by @ClearlyClaire)
29+
- Fix incorrect translation string in webauthn mailers (#38062 by @mjankowski)
30+
- Fix “Unblock” and “Unmute” actions being disabled when blocked (#38075 by @ClearlyClaire)
31+
- Fix username availability check being wrongly applied on race conditions (#37975 by @ClearlyClaire)
32+
- Fix hover card unintentionally being shown in some cases (#38039 and #38112 by @diondiondion)
33+
- Fix existing posts not being removed from lists when a list member is unfollowed (#38048 by @ClearlyClaire)
34+
535
## [4.5.7] - 2026-02-24
636

737
### Security

Gemfile.lock

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -12,46 +12,46 @@ GEM
1212
specs:
1313
action_text-trix (2.1.17)
1414
railties
15-
actioncable (8.1.2)
16-
actionpack (= 8.1.2)
17-
activesupport (= 8.1.2)
15+
actioncable (8.1.2.1)
16+
actionpack (= 8.1.2.1)
17+
activesupport (= 8.1.2.1)
1818
nio4r (~> 2.0)
1919
websocket-driver (>= 0.6.1)
2020
zeitwerk (~> 2.6)
21-
actionmailbox (8.1.2)
22-
actionpack (= 8.1.2)
23-
activejob (= 8.1.2)
24-
activerecord (= 8.1.2)
25-
activestorage (= 8.1.2)
26-
activesupport (= 8.1.2)
21+
actionmailbox (8.1.2.1)
22+
actionpack (= 8.1.2.1)
23+
activejob (= 8.1.2.1)
24+
activerecord (= 8.1.2.1)
25+
activestorage (= 8.1.2.1)
26+
activesupport (= 8.1.2.1)
2727
mail (>= 2.8.0)
28-
actionmailer (8.1.2)
29-
actionpack (= 8.1.2)
30-
actionview (= 8.1.2)
31-
activejob (= 8.1.2)
32-
activesupport (= 8.1.2)
28+
actionmailer (8.1.2.1)
29+
actionpack (= 8.1.2.1)
30+
actionview (= 8.1.2.1)
31+
activejob (= 8.1.2.1)
32+
activesupport (= 8.1.2.1)
3333
mail (>= 2.8.0)
3434
rails-dom-testing (~> 2.2)
35-
actionpack (8.1.2)
36-
actionview (= 8.1.2)
37-
activesupport (= 8.1.2)
35+
actionpack (8.1.2.1)
36+
actionview (= 8.1.2.1)
37+
activesupport (= 8.1.2.1)
3838
nokogiri (>= 1.8.5)
3939
rack (>= 2.2.4)
4040
rack-session (>= 1.0.1)
4141
rack-test (>= 0.6.3)
4242
rails-dom-testing (~> 2.2)
4343
rails-html-sanitizer (~> 1.6)
4444
useragent (~> 0.16)
45-
actiontext (8.1.2)
45+
actiontext (8.1.2.1)
4646
action_text-trix (~> 2.1.15)
47-
actionpack (= 8.1.2)
48-
activerecord (= 8.1.2)
49-
activestorage (= 8.1.2)
50-
activesupport (= 8.1.2)
47+
actionpack (= 8.1.2.1)
48+
activerecord (= 8.1.2.1)
49+
activestorage (= 8.1.2.1)
50+
activesupport (= 8.1.2.1)
5151
globalid (>= 0.6.0)
5252
nokogiri (>= 1.8.5)
53-
actionview (8.1.2)
54-
activesupport (= 8.1.2)
53+
actionview (8.1.2.1)
54+
activesupport (= 8.1.2.1)
5555
builder (~> 3.1)
5656
erubi (~> 1.11)
5757
rails-dom-testing (~> 2.2)
@@ -61,22 +61,22 @@ GEM
6161
activemodel (>= 4.1)
6262
case_transform (>= 0.2)
6363
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
64-
activejob (8.1.2)
65-
activesupport (= 8.1.2)
64+
activejob (8.1.2.1)
65+
activesupport (= 8.1.2.1)
6666
globalid (>= 0.3.6)
67-
activemodel (8.1.2)
68-
activesupport (= 8.1.2)
69-
activerecord (8.1.2)
70-
activemodel (= 8.1.2)
71-
activesupport (= 8.1.2)
67+
activemodel (8.1.2.1)
68+
activesupport (= 8.1.2.1)
69+
activerecord (8.1.2.1)
70+
activemodel (= 8.1.2.1)
71+
activesupport (= 8.1.2.1)
7272
timeout (>= 0.4.0)
73-
activestorage (8.1.2)
74-
actionpack (= 8.1.2)
75-
activejob (= 8.1.2)
76-
activerecord (= 8.1.2)
77-
activesupport (= 8.1.2)
73+
activestorage (8.1.2.1)
74+
actionpack (= 8.1.2.1)
75+
activejob (= 8.1.2.1)
76+
activerecord (= 8.1.2.1)
77+
activesupport (= 8.1.2.1)
7878
marcel (~> 1.0)
79-
activesupport (8.1.2)
79+
activesupport (8.1.2.1)
8080
base64
8181
bigdecimal
8282
concurrent-ruby (~> 1.0, >= 1.3.1)
@@ -472,7 +472,7 @@ GEM
472472
net-smtp (0.5.1)
473473
net-protocol
474474
nio4r (2.7.5)
475-
nokogiri (1.19.1)
475+
nokogiri (1.19.2)
476476
mini_portile2 (~> 2.8.2)
477477
racc (~> 1.4)
478478
omniauth (2.1.4)
@@ -657,20 +657,20 @@ GEM
657657
rack (>= 1.3)
658658
rackup (2.3.1)
659659
rack (>= 3)
660-
rails (8.1.2)
661-
actioncable (= 8.1.2)
662-
actionmailbox (= 8.1.2)
663-
actionmailer (= 8.1.2)
664-
actionpack (= 8.1.2)
665-
actiontext (= 8.1.2)
666-
actionview (= 8.1.2)
667-
activejob (= 8.1.2)
668-
activemodel (= 8.1.2)
669-
activerecord (= 8.1.2)
670-
activestorage (= 8.1.2)
671-
activesupport (= 8.1.2)
660+
rails (8.1.2.1)
661+
actioncable (= 8.1.2.1)
662+
actionmailbox (= 8.1.2.1)
663+
actionmailer (= 8.1.2.1)
664+
actionpack (= 8.1.2.1)
665+
actiontext (= 8.1.2.1)
666+
actionview (= 8.1.2.1)
667+
activejob (= 8.1.2.1)
668+
activemodel (= 8.1.2.1)
669+
activerecord (= 8.1.2.1)
670+
activestorage (= 8.1.2.1)
671+
activesupport (= 8.1.2.1)
672672
bundler (>= 1.15.0)
673-
railties (= 8.1.2)
673+
railties (= 8.1.2.1)
674674
rails-dom-testing (2.3.0)
675675
activesupport (>= 5.0.0)
676676
minitest
@@ -681,9 +681,9 @@ GEM
681681
rails-i18n (8.1.0)
682682
i18n (>= 0.7, < 2)
683683
railties (>= 8.0.0, < 9)
684-
railties (8.1.2)
685-
actionpack (= 8.1.2)
686-
activesupport (= 8.1.2)
684+
railties (8.1.2.1)
685+
actionpack (= 8.1.2.1)
686+
activesupport (= 8.1.2.1)
687687
irb (~> 1.13)
688688
rackup (>= 1.0.0)
689689
rake (>= 12.2)

app/controllers/admin/statuses_controller.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ def set_status
121121
end
122122

123123
def set_statuses
124-
@statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(:application, :preloadable_poll, :media_attachments, active_mentions: :account, reblog: [:account, :application, :preloadable_poll, :media_attachments, active_mentions: :account]).page(params[:page]).per(PER_PAGE)
124+
@statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(*preload_columns, reblog: [:account, *preload_columns]).page(params[:page]).per(PER_PAGE)
125+
end
126+
127+
def preload_columns
128+
[:application, :preloadable_poll, :media_attachments, active_mentions: :account]
125129
end
126130

127131
def edit_status_account_id

app/helpers/context_helper.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ module ContextHelper
3636
suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' },
3737
attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } },
3838
misskey_license: { 'misskey' => 'https://misskey-hub.net/ns#', '_misskey_license' => 'misskey:_misskey_license' },
39+
profile_settings: {
40+
'toot' => 'http://joinmastodon.org/ns#',
41+
'showFeatured' => 'toot:showFeatured',
42+
'showMedia' => 'toot:showMedia',
43+
'showRepliesInMedia' => 'toot:showRepliesInMedia',
44+
},
3945
quote_requests: { 'QuoteRequest' => 'https://w3id.org/fep/044f#QuoteRequest' },
4046
quotes: {
4147
'quote' => 'https://w3id.org/fep/044f#quote',

app/javascript/mastodon/components/column_header.tsx

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -267,28 +267,41 @@ export const ColumnHeader: React.FC<Props> = ({
267267
const hasTitle = (hasIcon || backButton) && title;
268268
const columnIndex = useColumnIndexContext();
269269

270+
const titleContents = (
271+
<>
272+
{!backButton && hasIcon && (
273+
<Icon id={icon} icon={iconComponent} className='column-header__icon' />
274+
)}
275+
{title}
276+
</>
277+
);
278+
270279
const component = (
271280
<div className={wrapperClassName}>
272281
<h1 className={buttonClassName}>
273282
{hasTitle && (
274283
<>
275284
{backButton}
276285

277-
<button
278-
onClick={handleTitleClick}
279-
className='column-header__title'
280-
type='button'
281-
id={getColumnSkipLinkId(columnIndex)}
282-
>
283-
{!backButton && hasIcon && (
284-
<Icon
285-
id={icon}
286-
icon={iconComponent}
287-
className='column-header__icon'
288-
/>
289-
)}
290-
{title}
291-
</button>
286+
{onClick && (
287+
<button
288+
onClick={handleTitleClick}
289+
className='column-header__title'
290+
type='button'
291+
id={getColumnSkipLinkId(columnIndex)}
292+
>
293+
{titleContents}
294+
</button>
295+
)}
296+
{!onClick && (
297+
<span
298+
className='column-header__title'
299+
tabIndex={-1}
300+
id={getColumnSkipLinkId(columnIndex)}
301+
>
302+
{titleContents}
303+
</span>
304+
)}
292305
</>
293306
)}
294307

app/javascript/mastodon/components/form_fields/range_input.module.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
margin: 6px 0;
1414
background-color: transparent;
1515
appearance: none;
16+
display: block;
1617

1718
&:focus {
1819
outline: none;

app/javascript/mastodon/components/form_fields/range_input_field.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ export type RangeInputProps = Omit<
1414
markers?: { value: number; label: string }[] | number[];
1515
};
1616

17-
interface Props extends RangeInputProps, CommonFieldWrapperProps {}
17+
interface Props extends RangeInputProps, CommonFieldWrapperProps {
18+
inputPlacement?: 'inline-start' | 'inline-end'; // TODO: Move this to the common field wrapper props for other fields.
19+
}
1820

1921
/**
2022
* A simple form field for single-line text.
@@ -25,7 +27,16 @@ interface Props extends RangeInputProps, CommonFieldWrapperProps {}
2527

2628
export const RangeInputField = forwardRef<HTMLInputElement, Props>(
2729
(
28-
{ id, label, hint, status, required, wrapperClassName, ...otherProps },
30+
{
31+
id,
32+
label,
33+
hint,
34+
status,
35+
required,
36+
wrapperClassName,
37+
inputPlacement,
38+
...otherProps
39+
},
2940
ref,
3041
) => (
3142
<FormFieldWrapper
@@ -34,6 +45,7 @@ export const RangeInputField = forwardRef<HTMLInputElement, Props>(
3445
required={required}
3546
status={status}
3647
inputId={id}
48+
inputPlacement={inputPlacement}
3749
className={wrapperClassName}
3850
>
3951
{(inputProps) => <RangeInput {...otherProps} {...inputProps} ref={ref} />}

0 commit comments

Comments
 (0)