From 583fd2c1fd4323d0b9532fa0f9fe88669ced6ebc Mon Sep 17 00:00:00 2001 From: Fire Demon Date: Sun, 20 Sep 2020 17:02:15 -0500 Subject: [Privacy, UI] Split privacy-related preferences into Privacy options section; add option to disable RSS --- app/controllers/accounts_controller.rb | 6 +++- .../settings/preferences/privacy_controller.rb | 9 ++++++ app/controllers/settings/preferences_controller.rb | 1 + app/lib/user_settings_decorator.rb | 5 ++++ app/models/user.rb | 4 +-- .../settings/preferences/appearance/show.html.haml | 3 ++ .../settings/preferences/other/show.html.haml | 22 +-------------- .../settings/preferences/privacy/show.html.haml | 32 ++++++++++++++++++++++ config/locales/en-MP.yml | 1 + config/locales/simple_form.en-MP.yml | 2 ++ config/navigation.rb | 9 +++--- config/routes.rb | 1 + 12 files changed, 67 insertions(+), 28 deletions(-) create mode 100644 app/controllers/settings/preferences/privacy_controller.rb create mode 100644 app/views/settings/preferences/privacy/show.html.haml diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 232a5fc71..d648e1a08 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -43,7 +43,7 @@ class AccountsController < ApplicationController end format.rss do - return forbidden if unauthorized? + return render xml: '', status: 404 if rss_disabled? || unauthorized? expires_in 1.minute, public: !current_account? @@ -198,4 +198,8 @@ class AccountsController < ApplicationController def unauthorized? @unauthorized ||= blocked? || (@account.private? && !following?(@account)) end + + def rss_disabled? + current_user.setting_rss_disabled + end end diff --git a/app/controllers/settings/preferences/privacy_controller.rb b/app/controllers/settings/preferences/privacy_controller.rb new file mode 100644 index 000000000..f447fa598 --- /dev/null +++ b/app/controllers/settings/preferences/privacy_controller.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class Settings::Preferences::PrivacyController < Settings::PreferencesController + private + + def after_update_redirect_path + settings_preferences_privacy_path + end +end diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index ddbf89665..bbfd82869 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -77,6 +77,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_filter_to_unknown, :setting_filter_from_unknown, :setting_unpublish_on_delete, + :setting_rss_disabled, notification_emails: %i(follow follow_request reblog favourite mention digest report pending_account trending_tag), interactions: %i(must_be_follower must_be_following must_be_following_dm) ) diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 386b1dcf6..a58a17166 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -63,6 +63,7 @@ class UserSettingsDecorator user.settings['filter_to_unknown'] = filter_to_unknown_preference if change?('setting_filter_to_unknown') user.settings['filter_from_unknown'] = filter_from_unknown_preference if change?('setting_filter_from_unknown') user.settings['unpublish_on_delete'] = unpublish_on_delete_preference if change?('setting_unpublish_on_delete') + user.settings['rss_disabled'] = rss_disabled_preference if change?('setting_rss_disabled') end def merged_notification_emails @@ -241,6 +242,10 @@ class UserSettingsDecorator boolean_cast_setting 'setting_unpublish_on_delete' end + def rss_disabled_preference + boolean_cast_setting 'setting_rss_disabled' + end + def boolean_cast_setting(key) ActiveModel::Type::Boolean.new.cast(settings[key]) end diff --git a/app/models/user.rb b/app/models/user.rb index 0b2d61862..07a4c9ab8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -123,8 +123,8 @@ class User < ApplicationRecord :style_css_profile_errors, :style_css_webapp, :style_css_webapp_errors, :style_wide_media, :publish_in, :unpublish_in, :unpublish_delete, :boost_every, :boost_jitter, - :boost_random, - :filter_to_unknown, :filter_from_unknown, :unpublish_on_delete, + :boost_random, :filter_to_unknown, :filter_from_unknown, :unpublish_on_delete, + :rss_disabled, to: :settings, prefix: :setting, allow_nil: false attr_reader :invite_code, :sign_in_token_attempt diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index 48031a973..87e7b91c5 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -16,6 +16,9 @@ %p.hint= t 'appearance.advanced_web_interface_hint' + .fields-group + = f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true + .fields-group = f.input :setting_advanced_layout, as: :boolean, wrapper: :with_label, hint: false diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml index a1d3d4357..b85b24a58 100644 --- a/app/views/settings/preferences/other/show.html.haml +++ b/app/views/settings/preferences/other/show.html.haml @@ -7,33 +7,13 @@ = simple_form_for current_user, url: settings_preferences_other_path, html: { method: :put, id: 'edit_preferences' } do |f| = render 'shared/error_messages', object: current_user - .fields-group - = f.input :setting_noindex, as: :boolean, wrapper: :with_label - - .fields-group - = f.input :setting_hide_network, as: :boolean, wrapper: :with_label - - .fields-group - = f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true - - - unless Setting.hide_followers_count - .fields-group - = f.input :setting_hide_followers_count, as: :boolean, wrapper: :with_label - %h4= t 'preferences.posting_defaults' - .fields-row - .fields-group.fields-row__column.fields-row__column-6 - = f.input :setting_default_privacy, collection: Status.selectable_visibilities, wrapper: :with_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), I18n.t("statuses.visibilities.#{visibility}_long")], ' - ') }, required: false, hint: false - - .fields-group.fields-row__column.fields-row__column-6 - = f.input :setting_default_language, collection: [nil] + filterable_languages.sort, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.language_detection') : human_locale(locale) }, required: false, include_blank: false, hint: false - .fields-group = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label .fields-group - = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true + = f.input :setting_default_language, collection: [nil] + filterable_languages.sort, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.language_detection') : human_locale(locale) }, required: false, include_blank: false, hint: false .fields-group = f.input :setting_default_content_type, collection: ['text/plain', 'text/markdown', 'text/html'], wrapper: :with_label, include_blank: false, label_method: lambda { |item| safe_join([t("simple_form.labels.defaults.setting_default_content_type_#{item.split('/')[1]}"), content_tag(:span, t("simple_form.hints.defaults.setting_default_content_type_#{item.split('/')[1]}"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' diff --git a/app/views/settings/preferences/privacy/show.html.haml b/app/views/settings/preferences/privacy/show.html.haml new file mode 100644 index 000000000..fa65c969e --- /dev/null +++ b/app/views/settings/preferences/privacy/show.html.haml @@ -0,0 +1,32 @@ +- content_for :page_title do + = t('settings.preferences') + +- content_for :heading_actions do + = button_tag t('generic.save_changes'), class: 'button', form: 'edit_preferences' + += simple_form_for current_user, url: settings_preferences_privacy_path, html: { method: :put, id: 'edit_preferences' } do |f| + = render 'shared/error_messages', object: current_user + + %h4= t 'preferences.privacy' + + .fields-group + = f.input :setting_default_privacy, collection: Status.selectable_visibilities, wrapper: :with_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), I18n.t("statuses.visibilities.#{visibility}_long")], ' - ') }, required: false, hint: false + + .fields-group + = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true + + .fields-group + = f.input :setting_noindex, as: :boolean, wrapper: :with_label + + .fields-group + = f.input :setting_hide_network, as: :boolean, wrapper: :with_label + + .fields-group + = f.input :setting_rss_disabled, as: :boolean, wrapper: :with_label + + - unless Setting.hide_followers_count + .fields-group + = f.input :setting_hide_followers_count, as: :boolean, wrapper: :with_label + + .actions + = f.button :button, t('generic.save_changes'), type: :submit diff --git a/config/locales/en-MP.yml b/config/locales/en-MP.yml index 6c4d37c9f..481787c00 100644 --- a/config/locales/en-MP.yml +++ b/config/locales/en-MP.yml @@ -112,6 +112,7 @@ en-MP: advanced_publishing: Advanced publishing options filtering: Filtering options publishing: Advanced publishing + privacy: Privacy options remote_interaction: favourite: proceed: Proceed to admire diff --git a/config/locales/simple_form.en-MP.yml b/config/locales/simple_form.en-MP.yml index 6987e4492..6e992f942 100644 --- a/config/locales/simple_form.en-MP.yml +++ b/config/locales/simple_form.en-MP.yml @@ -29,6 +29,7 @@ en-MP: setting_filter_to_unknown: Do not show replies to unfollowed accounts on your home timeline. Takes effect for newly-pushed items. setting_filter_from_unknown: Do not show boosts from unfollowed accounts on your home timeline. Takes effect for newly-pushed items. setting_manual_publish: This allows you to draft, proofread, and edit your roars before publishing them. You can publish a roar from its action menu (the three dots). + setting_rss_disabled: Improves privacy by turning off your account's public RSS feed. setting_show_application: The application you use to toot will be displayed in the detailed view of your roars setting_skin: Reskins the selected UI flavour setting_unpublish_on_delete: When enabled, deleting a published roar will unpublish it then make it local-only. Deleting an unpublished roar will permanently destroy it. @@ -67,6 +68,7 @@ en-MP: setting_boost_every: Automatically queue and space out boosts setting_boost_jitter: Add a random delay up to setting_boost_random: Boost in random order + setting_rss_disabled: Disable RSS feed setting_unpublish_delete: Delete after unpublishing setting_unpublish_in: Then unpublish after setting_unpublish_on_delete: Unpublish on delete diff --git a/config/navigation.rb b/config/navigation.rb index 364747adb..538e2c8d3 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -12,10 +12,11 @@ SimpleNavigation::Configuration.run do |navigation| n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_url, if: -> { current_user.functional? } do |s| s.item :appearance, safe_join([fa_icon('desktop fw'), t('settings.appearance')]), settings_preferences_appearance_url - s.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_preferences_notifications_url - s.item :filters, safe_join([fa_icon('filter fw'), t('preferences.filters')]), settings_preferences_filters_url + s.item :other, safe_join([fa_icon('cog fw'), t('preferences.posting_defaults')]), settings_preferences_other_url + s.item :privacy, safe_join([fa_icon('lock fw'), t('preferences.privacy')]), settings_preferences_privacy_url s.item :publishing, safe_join([fa_icon('pencil-square-o fw'), t('preferences.publishing')]), settings_preferences_publishing_url - s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_url + s.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_preferences_notifications_url + s.item :filters, safe_join([fa_icon('filter fw'), t('preferences.filters')]), settings_preferences_filters_url, highlights_on: %r{/settings/preferences/filters} end n.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours| @@ -25,7 +26,7 @@ SimpleNavigation::Configuration.run do |navigation| end n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_url, if: -> { current_user.functional? } - n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? } + n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{^/filters}, if: -> { current_user.functional? } n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_url do |s| s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases} diff --git a/config/routes.rb b/config/routes.rb index 4e36fe074..9a862517a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -121,6 +121,7 @@ Rails.application.routes.draw do resource :other, only: [:show, :update], controller: :other resource :filters, only: [:show, :update], controller: :filters resource :publishing, only: [:show, :update], controller: :publishing + resource :privacy, only: [:show, :update], controller: :privacy end resource :import, only: [:show, :create] -- cgit