Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f198ec7
Fix existing posts not being removed from lists when a list member is…
ClearlyClaire Mar 4, 2026
ba22c3f
Prevent hover card from showing on touch devices (#38039)
diondiondion Mar 3, 2026
ed521e9
Fix username availability check being wrongly applied on race conditi…
ClearlyClaire Feb 25, 2026
a3f0a03
Fix “Unblock” and “Unmute” actions being disabled when blocked (#38075)
ClearlyClaire Mar 5, 2026
a475f2b
Fix incorrect I18n string in webauthn mailers (#38062)
mjankowski Mar 5, 2026
6fcdc05
Add for searching already-known private GtS posts (#38057)
ClearlyClaire Mar 5, 2026
a7bfcf7
Redirect to short account URLs when requesting HTML for one of the AP…
ClearlyClaire Mar 4, 2026
d7059dc
Fix poll expiration notification being re-triggered on implicit updat…
ClearlyClaire Mar 5, 2026
dff7d55
Prevent hover card from showing unintentionally (#38112)
diondiondion Mar 11, 2026
ac91d30
Change HTTP signatures to skip the `Accept` header (#38132)
ClearlyClaire Mar 11, 2026
9171fa4
Fix OpenStack Swift Keystone token rate limiting (#38145)
hugogameiro Mar 12, 2026
f37dc6c
Normalize `current_username` on account migration (#38183)
mjankowski Mar 13, 2026
1fa9451
Change media description length limit for remote media attachments fr…
ClearlyClaire Mar 23, 2026
c2f9c7c
Fixes some model definitions in `tootctl maintenance fix-duplicates` …
ClearlyClaire Mar 16, 2026
e0d097f
New Crowdin Translations for stable-4.5 (automated) (#38341)
github-actions[bot] Mar 24, 2026
5bf82b1
Update dependency `rails`
ClearlyClaire Mar 24, 2026
841ea70
Update dependency `rack`
ClearlyClaire Mar 24, 2026
a5f1988
Update dependency `faraday`
ClearlyClaire Mar 24, 2026
23be60a
Update devise to version 5.0 (#37419)
mjankowski Feb 5, 2026
92d7ad4
Update dependency `devise`
ClearlyClaire Mar 24, 2026
d6d73bd
Update dependency `nokogiri`
ClearlyClaire Mar 24, 2026
c188e65
Merge commit from fork
ClearlyClaire Mar 24, 2026
089a141
Merge commit from fork
ClearlyClaire Mar 24, 2026
38e7bb9
Bump version to v4.5.8 (#38371)
ClearlyClaire Mar 24, 2026
55252ef
Merge remote-tracking branch 'parent/stable-4.5' into kb-draft-21.9-lts
kmycode Mar 24, 2026
3facc1d
Fix test
kmycode Mar 25, 2026
8816718
Fix test
kmycode Mar 25, 2026
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
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,36 @@

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

## [4.5.8] - 2026-03-24

### Security

- Fix insufficient checks on quote authorizations ([GHSA-q4g8-82c5-9h33](https://github.com/mastodon/mastodon/security/advisories/GHSA-q4g8-82c5-9h33))
- Fix open redirect in legacy path handler ([GHSA-xqw8-4j56-5hj6](https://github.com/mastodon/mastodon/security/advisories/GHSA-xqw8-4j56-5hj6))
- Updated dependencies

### Added

- Add for searching already-known private GtS posts (#38057 by @ClearlyClaire)

### Changed

- Change media description length limit for remote media attachments from 1500 to 10000 characters (#37921 by @ClearlyClaire)
- Change HTTP signatures to skip the `Accept` header (#38132 by @ClearlyClaire)
- Change numeric AP endpoints to redirect to short account URLs when HTML is requested (#38056 by @ClearlyClaire)

### Fixed

- Fix some model definitions in `tootctl maintenance fix-duplicates` (#38214 by @ClearlyClaire)
- Fix overly strict checks for current username on account migration page (#38183 by @mjankowski)
- Fix OpenStack Swift Keystone token rate limiting (#38145 by @hugogameiro)
- Fix poll expiration notification being re-triggered on implicit updates (#38078 by @ClearlyClaire)
- Fix incorrect translation string in webauthn mailers (#38062 by @mjankowski)
- Fix “Unblock” and “Unmute” actions being disabled when blocked (#38075 by @ClearlyClaire)
- Fix username availability check being wrongly applied on race conditions (#37975 by @ClearlyClaire)
- Fix hover card unintentionally being shown in some cases (#38039 and #38112 by @diondiondion)
- Fix existing posts not being removed from lists when a list member is unfollowed (#38048 by @ClearlyClaire)

## [4.5.7] - 2026-02-24

### Security
Expand Down
1 change: 1 addition & 0 deletions FEDERATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,4 @@ The following table attempts to summary those limits.
| Account `attributionDomains` | 256 | List will be truncated |
| Account aliases (actor `alsoKnownAs`) | 256 | List will be truncated |
| Custom emoji shortcode (`Emoji` `name`) | 2048 | Emoji will be rejected |
| Media descriptions (`name`/`summary`) | 10000 | Description will be truncated |
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ gem 'bootsnap', '~> 1.18.0', require: false
gem 'browser'
gem 'charlock_holmes', '~> 0.7.7'
gem 'chewy', '~> 7.3'
gem 'devise', '~> 4.9'
gem 'devise'
gem 'devise-two-factor'

group :pam_authentication, optional: true do
Expand Down
128 changes: 64 additions & 64 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,45 +10,45 @@ GIT
GEM
remote: https://rubygems.org/
specs:
actioncable (8.0.3)
actionpack (= 8.0.3)
activesupport (= 8.0.3)
actioncable (8.0.4.1)
actionpack (= 8.0.4.1)
activesupport (= 8.0.4.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (8.0.3)
actionpack (= 8.0.3)
activejob (= 8.0.3)
activerecord (= 8.0.3)
activestorage (= 8.0.3)
activesupport (= 8.0.3)
actionmailbox (8.0.4.1)
actionpack (= 8.0.4.1)
activejob (= 8.0.4.1)
activerecord (= 8.0.4.1)
activestorage (= 8.0.4.1)
activesupport (= 8.0.4.1)
mail (>= 2.8.0)
actionmailer (8.0.3)
actionpack (= 8.0.3)
actionview (= 8.0.3)
activejob (= 8.0.3)
activesupport (= 8.0.3)
actionmailer (8.0.4.1)
actionpack (= 8.0.4.1)
actionview (= 8.0.4.1)
activejob (= 8.0.4.1)
activesupport (= 8.0.4.1)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (8.0.3)
actionview (= 8.0.3)
activesupport (= 8.0.3)
actionpack (8.0.4.1)
actionview (= 8.0.4.1)
activesupport (= 8.0.4.1)
nokogiri (>= 1.8.5)
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
actiontext (8.0.3)
actionpack (= 8.0.3)
activerecord (= 8.0.3)
activestorage (= 8.0.3)
activesupport (= 8.0.3)
actiontext (8.0.4.1)
actionpack (= 8.0.4.1)
activerecord (= 8.0.4.1)
activestorage (= 8.0.4.1)
activesupport (= 8.0.4.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (8.0.3)
activesupport (= 8.0.3)
actionview (8.0.4.1)
activesupport (= 8.0.4.1)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
Expand All @@ -58,22 +58,22 @@ GEM
activemodel (>= 4.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
activejob (8.0.3)
activesupport (= 8.0.3)
activejob (8.0.4.1)
activesupport (= 8.0.4.1)
globalid (>= 0.3.6)
activemodel (8.0.3)
activesupport (= 8.0.3)
activerecord (8.0.3)
activemodel (= 8.0.3)
activesupport (= 8.0.3)
activemodel (8.0.4.1)
activesupport (= 8.0.4.1)
activerecord (8.0.4.1)
activemodel (= 8.0.4.1)
activesupport (= 8.0.4.1)
timeout (>= 0.4.0)
activestorage (8.0.3)
actionpack (= 8.0.3)
activejob (= 8.0.3)
activerecord (= 8.0.3)
activesupport (= 8.0.3)
activestorage (8.0.4.1)
actionpack (= 8.0.4.1)
activejob (= 8.0.4.1)
activerecord (= 8.0.4.1)
activesupport (= 8.0.4.1)
marcel (~> 1.0)
activesupport (8.0.3)
activesupport (8.0.4.1)
base64
benchmark (>= 0.3)
bigdecimal
Expand All @@ -82,7 +82,7 @@ GEM
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
minitest (>= 5.1, < 6)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
Expand Down Expand Up @@ -184,16 +184,16 @@ GEM
irb (~> 1.10)
reline (>= 0.3.8)
debug_inspector (1.2.0)
devise (4.9.4)
devise (5.0.3)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0)
railties (>= 7.0)
responders
warden (~> 1.2.3)
devise-two-factor (6.2.0)
activesupport (>= 7.0, < 8.2)
devise (~> 4.0)
railties (>= 7.0, < 8.2)
devise-two-factor (6.4.0)
activesupport (>= 7.2, < 8.2)
devise (>= 4.0, < 6.0)
railties (>= 7.2, < 8.2)
rotp (~> 6.0)
devise_pam_authenticatable2 (9.2.0)
devise (>= 4.0.0)
Expand Down Expand Up @@ -233,7 +233,7 @@ GEM
fabrication (3.0.0)
faker (3.5.2)
i18n (>= 1.8.11, < 2)
faraday (2.14.0)
faraday (2.14.1)
faraday-net_http (>= 2.0, < 3.5)
json
logger
Expand Down Expand Up @@ -462,7 +462,7 @@ GEM
net-smtp (0.5.1)
net-protocol
nio4r (2.7.4)
nokogiri (1.18.10)
nokogiri (1.19.2)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
oj (3.16.11)
Expand Down Expand Up @@ -621,7 +621,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
rack (3.2.4)
rack (3.2.5)
rack-attack (6.8.0)
rack (>= 1.0, < 4)
rack-cors (3.0.0)
Expand All @@ -647,20 +647,20 @@ GEM
rack (>= 1.3)
rackup (2.2.1)
rack (>= 3)
rails (8.0.3)
actioncable (= 8.0.3)
actionmailbox (= 8.0.3)
actionmailer (= 8.0.3)
actionpack (= 8.0.3)
actiontext (= 8.0.3)
actionview (= 8.0.3)
activejob (= 8.0.3)
activemodel (= 8.0.3)
activerecord (= 8.0.3)
activestorage (= 8.0.3)
activesupport (= 8.0.3)
rails (8.0.4.1)
actioncable (= 8.0.4.1)
actionmailbox (= 8.0.4.1)
actionmailer (= 8.0.4.1)
actionpack (= 8.0.4.1)
actiontext (= 8.0.4.1)
actionview (= 8.0.4.1)
activejob (= 8.0.4.1)
activemodel (= 8.0.4.1)
activerecord (= 8.0.4.1)
activestorage (= 8.0.4.1)
activesupport (= 8.0.4.1)
bundler (>= 1.15.0)
railties (= 8.0.3)
railties (= 8.0.4.1)
rails-dom-testing (2.3.0)
activesupport (>= 5.0.0)
minitest
Expand All @@ -671,9 +671,9 @@ GEM
rails-i18n (8.0.2)
i18n (>= 0.7, < 2)
railties (>= 8.0.0, < 9)
railties (8.0.3)
actionpack (= 8.0.3)
activesupport (= 8.0.3)
railties (8.0.4.1)
actionpack (= 8.0.4.1)
activesupport (= 8.0.4.1)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
Expand Down Expand Up @@ -954,7 +954,7 @@ DEPENDENCIES
csv (~> 3.2)
database_cleaner-active_record
debug (~> 1.8)
devise (~> 4.9)
devise
devise-two-factor
devise_pam_authenticatable2 (~> 9.2)
discard (~> 1.2)
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/accounts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ def show
respond_to do |format|
format.html do
expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.hour) unless user_signed_in?

redirect_to short_account_path(@account) if account_id_param.present? && username_param.blank?
end

format.rss do
Expand Down
4 changes: 2 additions & 2 deletions app/controllers/auth/sessions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -217,14 +217,14 @@ def second_factor_attempts_key(user)
"2fa_auth_attempts:#{user.id}:#{Time.now.utc.hour}"
end

def respond_to_on_destroy
def respond_to_on_destroy(**)
respond_to do |format|
format.json do
render json: {
redirect_to: after_sign_out_path_for(resource_name),
}, status: 200
end
format.all { super }
format.all { super(**) }
end
end
end
2 changes: 2 additions & 0 deletions app/controllers/statuses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ def show
respond_to do |format|
format.html do
expires_in 10.seconds, public: true if current_account.nil?

redirect_to short_account_status_path(@account, @status) if account_id_param.present? && username_param.blank?
end

format.json do
Expand Down
18 changes: 14 additions & 4 deletions app/javascript/entrypoints/public.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -183,15 +183,25 @@ function loaded() {
({ target }) => {
if (!(target instanceof HTMLInputElement)) return;

if (target.value && target.value.length > 0) {
const checkedUsername = target.value;
if (checkedUsername && checkedUsername.length > 0) {
axios
.get('/api/v1/accounts/lookup', { params: { acct: target.value } })
.get('/api/v1/accounts/lookup', {
params: { acct: checkedUsername },
})
.then(() => {
target.setCustomValidity(formatMessage(messages.usernameTaken));
// Only update the validity if the result is for the currently-typed username
if (checkedUsername === target.value) {
target.setCustomValidity(formatMessage(messages.usernameTaken));
}

return true;
})
.catch(() => {
target.setCustomValidity('');
// Only update the validity if the result is for the currently-typed username
if (checkedUsername === target.value) {
target.setCustomValidity('');
}
});
} else {
target.setCustomValidity('');
Expand Down
12 changes: 7 additions & 5 deletions app/javascript/mastodon/components/follow_button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ export const FollowButton: React.FC<{
: messages.follow;

let label;
let disabled =
relationship?.blocked_by || account?.suspended || !!account?.moved;

if (!signedIn) {
label = intl.formatMessage(followMessage);
Expand All @@ -138,12 +140,16 @@ export const FollowButton: React.FC<{
label = <LoadingIndicator />;
} else if (relationship.muting) {
label = intl.formatMessage(messages.unmute);
disabled = false;
} else if (relationship.following) {
label = intl.formatMessage(messages.unfollow);
disabled = false;
} else if (relationship.blocking) {
label = intl.formatMessage(messages.unblock);
disabled = false;
} else if (relationship.requested) {
label = intl.formatMessage(messages.followRequestCancel);
disabled = false;
} else if (
relationship.followed_by &&
!account?.locked &&
Expand Down Expand Up @@ -172,11 +178,7 @@ export const FollowButton: React.FC<{
return (
<Button
onClick={handleClick}
disabled={
relationship?.blocked_by ||
(!(relationship?.following || relationship?.requested) &&
(account?.suspended || !!account?.moved))
}
disabled={disabled}
secondary={following}
compact={compact}
className={classNames(className, { 'button--destructive': following })}
Expand Down
Loading
Loading