From c2b968fc16d6beaee529abfc29fd165834f208ae Mon Sep 17 00:00:00 2001 From: "Pia B." Date: Mon, 5 Oct 2026 13:49:58 +0000 Subject: [PATCH] add server directory and default server opt in options (#40750) --- app/models/form/admin_settings.rb | 4 ++++ app/serializers/node_info/serializer.rb | 2 ++ .../admin/settings/external/show.html.haml | 16 ++++++++++++++ config/locales/en.yml | 7 +++++++ config/settings.yml | 2 ++ spec/requests/admin/settings/external_spec.rb | 2 +- spec/requests/well_known/node_info_spec.rb | 21 +++++++++++++++++++ 7 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 794d99c87d3..d1b8a902311 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -47,6 +47,8 @@ class Form::AdminSettings landing_page wrapstodon email_footer_text + opt_in_server_directory + opt_in_server_recommendation ).freeze INTEGER_KEYS = %i( @@ -68,6 +70,8 @@ class Form::AdminSettings noindex require_invite_text captcha_enabled + opt_in_server_directory + opt_in_server_recommendation wrapstodon ).freeze diff --git a/app/serializers/node_info/serializer.rb b/app/serializers/node_info/serializer.rb index 3920b3ee424..3cf5b64c084 100644 --- a/app/serializers/node_info/serializer.rb +++ b/app/serializers/node_info/serializer.rb @@ -41,6 +41,8 @@ class NodeInfo::Serializer < ActiveModel::Serializer { nodeName: Setting.site_title, nodeDescription: Setting.site_short_description, + optInServerDirectory: Setting.opt_in_server_directory, + optInServerRecommendation: Setting.opt_in_server_recommendation, } end diff --git a/app/views/admin/settings/external/show.html.haml b/app/views/admin/settings/external/show.html.haml index 8ef4ea453e0..10f2d7eb202 100644 --- a/app/views/admin/settings/external/show.html.haml +++ b/app/views/admin/settings/external/show.html.haml @@ -10,6 +10,22 @@ %p.lead= t('admin.settings.external.preamble') + %h2= t('admin.settings.external.directory') + + .fields-group + = f.input :opt_in_server_directory, + as: :boolean, + hint: t('admin.settings.external.opt_in_server_directory.description'), + label: t('admin.settings.external.opt_in_server_directory.title'), + wrapper: :with_label + + .fields-group + = f.input :opt_in_server_recommendation, + as: :boolean, + hint: t('admin.settings.external.opt_in_server_recommendation.description'), + label: t('admin.settings.external.opt_in_server_recommendation.title'), + wrapper: :with_label + %h2= t('admin.settings.external.privacy') .fields-group diff --git a/config/locales/en.yml b/config/locales/en.yml index 3084e06e3ea..e40baa3de7d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1007,6 +1007,13 @@ en: disabled: To no one users: To logged-in local users external: + directory: Server Directory + opt_in_server_directory: + description: Allow your server to be listed in server directories such as the one featured on https://joinmastodon.org/servers. + title: Opt your server in for the server directory + opt_in_server_recommendation: + description: Allow your server to be recommended at sign-up time in applications such as the official Mastodon clients. + title: Opt your server in for server recommendation preamble: Control how much information about your server gets shared with other services and how discoverable your server should be. privacy: Privacy publish_statistics: Publish statistics diff --git a/config/settings.yml b/config/settings.yml index 9185d24a68d..3ee7ed5f697 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -34,6 +34,8 @@ defaults: &defaults captcha_enabled: false allow_referrer_origin: false landing_page: 'trends' + opt_in_server_directory: false + opt_in_server_recommendation: false wrapstodon: true development: diff --git a/spec/requests/admin/settings/external_spec.rb b/spec/requests/admin/settings/external_spec.rb index 5aaa1f07ce2..4e8746fc453 100644 --- a/spec/requests/admin/settings/external_spec.rb +++ b/spec/requests/admin/settings/external_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Admin Settings External Discovery' do end describe 'PUT /admin/settings/external with valid params' do - let(:request) { put admin_settings_external_path, params: { form_admin_settings: { activity_api_enabled: 'false' } } } + let(:request) { put admin_settings_external_path, params: { form_admin_settings: { activity_api_enabled: '0' } } } it 'saves the value for a valid key' do expect { request }.to change(Setting, :activity_api_enabled).from(true) diff --git a/spec/requests/well_known/node_info_spec.rb b/spec/requests/well_known/node_info_spec.rb index 3d5afc7e2d3..762eb757d5d 100644 --- a/spec/requests/well_known/node_info_spec.rb +++ b/spec/requests/well_known/node_info_spec.rb @@ -55,4 +55,25 @@ RSpec.describe 'The well-known node-info endpoints' do { 'foo' => 0 } end end + + describe '#nodeinfo/2.0 endpoint containing opt in metadata' do + before do + Setting.opt_in_server_directory = 'true' + end + + let(:expected_metadata) do + { + nodeName: 'Mastodon', + nodeDescription: '', + optInServerDirectory: 'true', + optInServerRecommendation: false, + } + end + + it 'returns server directory opt in data' do + get '/nodeinfo/2.0' + + expect(response.parsed_body[:metadata].symbolize_keys).to eq(expected_metadata) + end + end end