diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
index 4de6c2ae63..81f594ca6e 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
@@ -47,6 +47,12 @@ class NavigationPanel extends Component {
const { intl } = this.props;
const { signedIn, disabledAccountId } = this.context.identity;
+ const explorer = (showTrends ? (
+
+ ) : (
+
+ ));
+
return (
@@ -55,18 +61,10 @@ class NavigationPanel extends Component {
{signedIn && (
- <>
-
-
} text={intl.formatMessage(messages.notifications)} />
-
- >
+
)}
- {showTrends ? (
-
- ) : (
-
- )}
+ {!signedIn && explorer}
{(signedIn || timelinePreview) && (
<>
@@ -75,6 +73,34 @@ class NavigationPanel extends Component {
>
)}
+ {signedIn && (
+ <>
+
+
+ >
+ )}
+
+ {signedIn && (
+ <>
+
} text={intl.formatMessage(messages.notifications)} />
+
+
+ >
+ )}
+
+ {signedIn && explorer}
+
+ {signedIn && (
+ <>
+
+
+
+
+
+
+ >
+ )}
+
{!signedIn && (
@@ -82,21 +108,6 @@ class NavigationPanel extends Component {
)}
- {signedIn && (
- <>
-
-
-
-
-
-
-
-
-
-
- >
- )}
-
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 414ada0fa0..13a5d11361 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -526,7 +526,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
:public
elsif audience_cc.any? { |cc| ActivityPub::TagManager.instance.public_collection?(cc) }
:unlisted
- elsif audience_cc.include?('as:LoginOnly')
+ elsif audience_to.include?('as:LoginOnly') || audience_to.include?('LoginUser')
:login
elsif audience_to.include?(@account.followers_url)
:private
diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb
index aa871656e9..0e38861838 100644
--- a/app/lib/activitypub/parser/status_parser.rb
+++ b/app/lib/activitypub/parser/status_parser.rb
@@ -77,7 +77,7 @@ class ActivityPub::Parser::StatusParser
:public
elsif audience_cc.any? { |cc| ActivityPub::TagManager.instance.public_collection?(cc) }
:unlisted
- elsif audience_cc.include?('as:LoginOnly')
+ elsif audience_to.include?('as:LoginOnly') || audience_to.include?('LoginUser')
:login
elsif audience_to.include?(@magic_values[:followers_collection])
:private
diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb
index 091ac14601..8453eff890 100644
--- a/app/lib/activitypub/tag_manager.rb
+++ b/app/lib/activitypub/tag_manager.rb
@@ -90,8 +90,10 @@ class ActivityPub::TagManager
case status.visibility
when 'public'
[COLLECTIONS[:public]]
- when 'unlisted', 'public_unlisted', 'login', 'private'
+ when 'unlisted', 'public_unlisted', 'private'
[account_followers_url(status.account)]
+ when 'login'
+ [account_followers_url(status.account), 'as:LoginOnly', 'LoginUser']
when 'direct', 'limited'
if status.account.silenced?
# Only notify followers if the account is locally silenced
@@ -128,8 +130,6 @@ class ActivityPub::TagManager
cc << account_followers_url(status.account)
when 'unlisted', 'public_unlisted'
cc << COLLECTIONS[:public]
- when 'login'
- cc << 'as:LoginOnly'
end
cc + cc_private_visibility(status)
diff --git a/app/models/account.rb b/app/models/account.rb
index b31194d512..29bd688188 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -86,7 +86,7 @@ class Account < ApplicationRecord
enum protocol: { ostatus: 0, activitypub: 1 }
enum suspension_origin: { local: 0, remote: 1 }, _prefix: true
- enum searchability: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10 }, _suffix: :searchability
+ enum searchability: { public: 0, private: 1, direct: 2, limited: 3, unsupported: 4, public_unlisted: 10 }, _suffix: :searchability
validates :username, presence: true
validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? }
diff --git a/app/models/status.rb b/app/models/status.rb
index b6f5ac1152..c210633941 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -53,7 +53,7 @@ class Status < ApplicationRecord
update_index('statuses', :proper)
enum visibility: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10, login: 11 }, _suffix: :visibility
- enum searchability: { public: 0, private: 1, direct: 2, limited: 3, public_unlisted: 10 }, _suffix: :searchability
+ enum searchability: { public: 0, private: 1, direct: 2, limited: 3, unsupported: 4, public_unlisted: 10 }, _suffix: :searchability
belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
@@ -387,8 +387,9 @@ class Status < ApplicationRecord
# Fedibird code
# searchability || Status.searchabilities.invert.fetch([Account.searchabilities[account.searchability], Status.visibilities[visibility] || 0].max, nil) || 'direct'
# Reactions only (generic: direct)
+ return 'direct' if searchability && unsupported_searchability?
return searchability if searchability
- return account.searchability if account.local? && account.searchability
+ return account.searchability if account.local? && account.searchability && !account.unsupported_searchability?
'direct'
end
@@ -526,7 +527,15 @@ class Status < ApplicationRecord
def set_searchability
return if searchability.nil?
- self.searchability = [Status.searchabilities[searchability], Status.visibilities[visibility == 'public_unlisted' || visibility == 'login' ? 'public' : visibility]].max
+ if visibility == 'public' || visibility == 'public_unlisted' || visibility == 'login'
+ self.searchability = [Status.searchabilities[searchability], Status.visibilities['public']].max
+ elsif visibility == 'limited'
+ self.searchability = Status.searchabilities['limited']
+ else
+ s = [Status.searchabilities[searchability], Status.visibilities[visibility]].max
+ s = [s, 3].max
+ self.searchability = s
+ end
end
def set_conversation
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index a8355c7063..dbd6ab2186 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -5,7 +5,7 @@ class REST::AccountSerializer < ActiveModel::Serializer
include FormattingHelper
attributes :id, :username, :acct, :display_name, :locked, :bot, :discoverable, :group, :created_at,
- :note, :url, :avatar, :avatar_static, :header, :header_static, :searchability, :subscribable,
+ :note, :url, :avatar, :avatar_static, :header, :header_static, :subscribable,
:followers_count, :following_count, :statuses_count, :last_status_at, :other_settings,
:noindex
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 13103a8414..0903a5652a 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -246,9 +246,9 @@ class ActivityPub::ProcessAccountService < BaseService
if audience_searchable_by.any? { |uri| ActivityPub::TagManager.instance.public_collection?(uri) }
:public
elsif audience_searchable_by.include?(@account.followers_url)
- :unlisted # Followers only in kmyblue (generics: private)
+ :private # Followers only in kmyblue (generics: private)
else
- :private # Reaction only in kmyblue (generics: direct)
+ :direct # Reaction only in kmyblue (generics: direct)
end
end
diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb
index b8d37952e3..41b704c684 100644
--- a/app/services/fan_out_on_write_service.rb
+++ b/app/services/fan_out_on_write_service.rb
@@ -234,7 +234,7 @@ class FanOutOnWriteService < BaseService
end
def broadcastable?
- @status.public_visibility? && !@status.reblog? && !@account.silenced?
+ (@status.public_visibility? || @status.login_visibility?) && !@status.reblog? && !@account.silenced?
end
def broadcastable_unlisted?