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?