From c926f5fd6764aa4dcc7a3da826a91d2d6bd4a5c7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 25 Oct 2023 08:01:00 -0400 Subject: [PATCH 1/6] Fix haml-lint `UnnecessaryStringOutput` for views (#27531) --- .haml-lint_todo.yml | 20 ------------------- app/views/accounts/show.html.haml | 2 +- .../custom_emojis/_custom_emoji.html.haml | 2 +- app/views/admin/relays/_relay.html.haml | 6 +++--- app/views/admin/rules/_rule.html.haml | 2 +- app/views/admin/statuses/index.html.haml | 2 +- .../auth/registrations/_session.html.haml | 2 +- app/views/disputes/strikes/show.html.haml | 4 ++-- .../notification_mailer/_status.html.haml | 2 +- .../index.html.haml | 2 +- app/views/statuses/_detailed_status.html.haml | 6 +++--- app/views/statuses/_poll.html.haml | 2 +- app/views/statuses/_simple_status.html.haml | 2 +- .../user_mailer/suspicious_sign_in.html.haml | 4 ++-- .../webauthn_credential_added.html.haml | 2 +- .../webauthn_credential_deleted.html.haml | 2 +- app/views/user_mailer/welcome.html.haml | 2 +- 17 files changed, 22 insertions(+), 42 deletions(-) diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index c7209cdf7e..c3cca9c9a3 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -11,26 +11,6 @@ linters: LineLength: enabled: false - # Offense count: 22 - UnnecessaryStringOutput: - exclude: - - 'app/views/accounts/show.html.haml' - - 'app/views/admin/custom_emojis/_custom_emoji.html.haml' - - 'app/views/admin/relays/_relay.html.haml' - - 'app/views/admin/rules/_rule.html.haml' - - 'app/views/admin/statuses/index.html.haml' - - 'app/views/auth/registrations/_session.html.haml' - - 'app/views/disputes/strikes/show.html.haml' - - 'app/views/notification_mailer/_status.html.haml' - - 'app/views/settings/two_factor_authentication_methods/index.html.haml' - - 'app/views/statuses/_detailed_status.html.haml' - - 'app/views/statuses/_poll.html.haml' - - 'app/views/statuses/_simple_status.html.haml' - - 'app/views/user_mailer/suspicious_sign_in.html.haml' - - 'app/views/user_mailer/webauthn_credential_added.html.haml' - - 'app/views/user_mailer/webauthn_credential_deleted.html.haml' - - 'app/views/user_mailer/welcome.html.haml' - # Offense count: 45 RuboCop: exclude: diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index e8fd27e109..d56f10a7ff 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -1,5 +1,5 @@ - content_for :page_title do - = "#{display_name(@account)} (#{acct(@account)})" + #{display_name(@account)} (#{acct(@account)}) - content_for :header_tags do - if @account.user_prefers_noindex? diff --git a/app/views/admin/custom_emojis/_custom_emoji.html.haml b/app/views/admin/custom_emojis/_custom_emoji.html.haml index c6789d4f89..f0cb64ec52 100644 --- a/app/views/admin/custom_emojis/_custom_emoji.html.haml +++ b/app/views/admin/custom_emojis/_custom_emoji.html.haml @@ -6,7 +6,7 @@ = custom_emoji_tag(custom_emoji) .batch-table__row__content__text - %samp= ":#{custom_emoji.shortcode}:" + %samp :#{custom_emoji.shortcode}: - if custom_emoji.local? %span.information-badge= custom_emoji.category&.name || t('admin.custom_emojis.uncategorized') diff --git a/app/views/admin/relays/_relay.html.haml b/app/views/admin/relays/_relay.html.haml index 6678218947..f1dd2b2dd1 100644 --- a/app/views/admin/relays/_relay.html.haml +++ b/app/views/admin/relays/_relay.html.haml @@ -5,16 +5,16 @@ - if relay.accepted? %span.positive-hint = fa_icon('check') - = ' ' +   = t 'admin.relays.enabled' - elsif relay.pending? = fa_icon('hourglass') - = ' ' +   = t 'admin.relays.pending' - else %span.negative-hint = fa_icon('times') - = ' ' +   = t 'admin.relays.disabled' %td - if relay.accepted? diff --git a/app/views/admin/rules/_rule.html.haml b/app/views/admin/rules/_rule.html.haml index f8a9ac7868..a0896fe806 100644 --- a/app/views/admin/rules/_rule.html.haml +++ b/app/views/admin/rules/_rule.html.haml @@ -1,6 +1,6 @@ .announcements-list__item = link_to edit_admin_rule_path(rule), class: 'announcements-list__item__title' do - = "#{rule_counter + 1}." + #{rule_counter + 1}. = truncate(rule.text) .announcements-list__item__action-bar diff --git a/app/views/admin/statuses/index.html.haml b/app/views/admin/statuses/index.html.haml index 9163dee795..a2e3cbc0da 100644 --- a/app/views/admin/statuses/index.html.haml +++ b/app/views/admin/statuses/index.html.haml @@ -1,7 +1,7 @@ - content_for :page_title do = t('admin.statuses.title') \- - = "@#{@account.pretty_acct}" + @#{@account.pretty_acct} .filters .filter-subset diff --git a/app/views/auth/registrations/_session.html.haml b/app/views/auth/registrations/_session.html.haml index 11eae566fa..28499a7c91 100644 --- a/app/views/auth/registrations/_session.html.haml +++ b/app/views/auth/registrations/_session.html.haml @@ -2,7 +2,7 @@ %td %span{ title: session.user_agent }< = fa_icon "#{session_device_icon(session)} fw", 'aria-label': session_device_icon(session) - = ' ' +   = t 'sessions.description', browser: t("sessions.browsers.#{session.browser}", default: session.browser.to_s), platform: t("sessions.platforms.#{session.platform}", default: session.platform.to_s) %td %samp= session.ip diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml index 1c16e0bbf5..62695b155e 100644 --- a/app/views/disputes/strikes/show.html.haml +++ b/app/views/disputes/strikes/show.html.haml @@ -10,13 +10,13 @@ %p.hint %span.positive-hint = fa_icon 'check' - = ' ' +   = t 'disputes.strikes.appeal_approved' - elsif @appeal.persisted? && @appeal.rejected? %p.hint %span.negative-hint = fa_icon 'times' - = ' ' +   = t 'disputes.strikes.appeal_rejected' .report-header diff --git a/app/views/notification_mailer/_status.html.haml b/app/views/notification_mailer/_status.html.haml index 7f614e99cb..e053a30fde 100644 --- a/app/views/notification_mailer/_status.html.haml +++ b/app/views/notification_mailer/_status.html.haml @@ -23,7 +23,7 @@ = image_tag full_asset_url(status.account.avatar.url), alt: '' %td{ align: 'left' } %bdi= display_name(status.account) - = "@#{status.account.pretty_acct}" + @#{status.account.pretty_acct} - if status.spoiler_text? .auto-dir diff --git a/app/views/settings/two_factor_authentication_methods/index.html.haml b/app/views/settings/two_factor_authentication_methods/index.html.haml index 315443e6d5..51141fab4f 100644 --- a/app/views/settings/two_factor_authentication_methods/index.html.haml +++ b/app/views/settings/two_factor_authentication_methods/index.html.haml @@ -7,7 +7,7 @@ %p.hint %span.positive-hint = fa_icon 'check' - = ' ' +   = t 'two_factor_authentication.enabled' .table-wrapper diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml index 9e171ff592..c55dff5d96 100644 --- a/app/views/statuses/_detailed_status.html.haml +++ b/app/views/statuses/_detailed_status.html.haml @@ -62,18 +62,18 @@ - else = fa_icon('reply-all') %span.detailed-status__reblogs>= friendly_number_to_human status.replies_count - = ' ' +   · - if status.public_visibility? || status.unlisted_visibility? %span.detailed-status__link = fa_icon('retweet') %span.detailed-status__reblogs>= friendly_number_to_human status.reblogs_count - = ' ' +   · %span.detailed-status__link = fa_icon('star') %span.detailed-status__favorites>= friendly_number_to_human status.favourites_count - = ' ' +   - if user_signed_in? · diff --git a/app/views/statuses/_poll.html.haml b/app/views/statuses/_poll.html.haml index b537eb48ca..cf01b1da01 100644 --- a/app/views/statuses/_poll.html.haml +++ b/app/views/statuses/_poll.html.haml @@ -11,7 +11,7 @@ - percent = total_votes_count.positive? ? 100 * option.votes_count / total_votes_count : 0 %label.poll__option>< %span.poll__number>< - = "#{percent.round}%" + #{percent.round}% %span.poll__option__text = prerender_custom_emojis(h(option.title), status.emojis) - if own_votes.include?(index) diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml index 32584c92a1..93effc4524 100644 --- a/app/views/statuses/_simple_status.html.haml +++ b/app/views/statuses/_simple_status.html.haml @@ -23,7 +23,7 @@ %span.display-name %bdi %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: prefers_autoplay?) - = ' ' +   %span.display-name__account = acct(status.account) = fa_icon('lock') if status.account.locked? diff --git a/app/views/user_mailer/suspicious_sign_in.html.haml b/app/views/user_mailer/suspicious_sign_in.html.haml index 75bcb2d54b..5bafe9d1b2 100644 --- a/app/views/user_mailer/suspicious_sign_in.html.haml +++ b/app/views/user_mailer/suspicious_sign_in.html.haml @@ -41,10 +41,10 @@ %tr %td.column-cell.text-center %p - %strong= "#{t('sessions.ip')}:" + %strong #{t('sessions.ip')}: = @remote_ip %br/ - %strong= "#{t('sessions.browser')}:" + %strong #{t('sessions.browser')}: %span{ title: @user_agent }= t 'sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: @detection.id.to_s), platform: t("sessions.platforms.#{@detection.platform.id}", default: @detection.platform.id.to_s) %br/ = l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) diff --git a/app/views/user_mailer/webauthn_credential_added.html.haml b/app/views/user_mailer/webauthn_credential_added.html.haml index c91c96d6fa..2ecb62d967 100644 --- a/app/views/user_mailer/webauthn_credential_added.html.haml +++ b/app/views/user_mailer/webauthn_credential_added.html.haml @@ -20,7 +20,7 @@ = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' %h1= t 'devise.mailer.webauthn_credential.added.title' - %p.lead= "#{t('devise.mailer.webauthn_credential.added.explanation')}:" + %p.lead #{t('devise.mailer.webauthn_credential.added.explanation')}: %p.lead= @webauthn_credential.nickname %table.email-table{ cellspacing: 0, cellpadding: 0 } diff --git a/app/views/user_mailer/webauthn_credential_deleted.html.haml b/app/views/user_mailer/webauthn_credential_deleted.html.haml index 578a080220..f282985b14 100644 --- a/app/views/user_mailer/webauthn_credential_deleted.html.haml +++ b/app/views/user_mailer/webauthn_credential_deleted.html.haml @@ -20,7 +20,7 @@ = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' %h1= t 'devise.mailer.webauthn_credential.deleted.title' - %p.lead= "#{t('devise.mailer.webauthn_credential.deleted.explanation')}:" + %p.lead #{t('devise.mailer.webauthn_credential.deleted.explanation')}: %p.lead= @webauthn_credential.nickname %table.email-table{ cellspacing: 0, cellpadding: 0 } diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml index 3ab994ad3f..0d8a15cfd7 100644 --- a/app/views/user_mailer/welcome.html.haml +++ b/app/views/user_mailer/welcome.html.haml @@ -41,7 +41,7 @@ %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 } %tbody %tr - %td= "@#{@resource.account.username}@#{@instance}" + %td @#{@resource.account.username}@#{@instance} .col-3 %table.column{ cellspacing: 0, cellpadding: 0 } %tbody From fa65c8244f9390757767cff19b87950c54a4cb50 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 25 Oct 2023 14:01:21 +0200 Subject: [PATCH 2/6] Fix cache store pool config deprecation warnings (#27551) --- lib/mastodon/redis_config.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/mastodon/redis_config.rb b/lib/mastodon/redis_config.rb index 2dbe76f83c..e885712f89 100644 --- a/lib/mastodon/redis_config.rb +++ b/lib/mastodon/redis_config.rb @@ -35,9 +35,11 @@ REDIS_CACHE_PARAMS = { url: ENV['CACHE_REDIS_URL'], expires_in: 10.minutes, namespace: cache_namespace, - pool_size: Sidekiq.server? ? Sidekiq[:concurrency] : Integer(ENV['MAX_THREADS'] || 5), - pool_timeout: 5, connect_timeout: 5, + pool: { + size: Sidekiq.server? ? Sidekiq[:concurrency] : Integer(ENV['MAX_THREADS'] || 5), + timeout: 5, + }, }.freeze REDIS_SIDEKIQ_PARAMS = { From 70dbf84b9b3f8c948d82a790424e2321958e1f41 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 25 Oct 2023 08:38:01 -0400 Subject: [PATCH 3/6] Solve simplest haml-lint `Rubocop` lints (#27529) --- .haml-lint_todo.yml | 34 ++----------------- app/views/.rubocop.yml | 5 +++ app/views/admin/accounts/_account.html.haml | 2 +- app/views/admin/accounts/show.html.haml | 2 +- .../confirm_suspension.html.haml | 1 - .../admin/software_updates/index.html.haml | 2 +- app/views/admin/tags/show.html.haml | 1 - app/views/admin/trends/tags/_tag.html.haml | 2 +- app/views/auth/registrations/new.html.haml | 1 - app/views/layouts/error.html.haml | 2 +- app/views/statuses_cleanup/show.html.haml | 1 - 11 files changed, 12 insertions(+), 41 deletions(-) create mode 100644 app/views/.rubocop.yml diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index c3cca9c9a3..7684ab63f7 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `haml-lint --auto-gen-config` -# on 2023-10-24 14:08:37 -0400 using Haml-Lint version 0.51.0. +# on 2023-10-25 08:29:48 -0400 using Haml-Lint version 0.51.0. # The point is for the user to remove these configuration records # one by one as the lints are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -11,41 +11,11 @@ linters: LineLength: enabled: false - # Offense count: 45 + # Offense count: 10 RuboCop: exclude: - - 'app/views/admin/accounts/_account.html.haml' - 'app/views/admin/accounts/_buttons.html.haml' - 'app/views/admin/accounts/_local_account.html.haml' - - 'app/views/admin/accounts/_remote_account.html.haml' - 'app/views/admin/accounts/index.html.haml' - - 'app/views/admin/accounts/show.html.haml' - - 'app/views/admin/custom_emojis/index.html.haml' - - 'app/views/admin/dashboard/index.html.haml' - - 'app/views/admin/domain_blocks/confirm_suspension.html.haml' - - 'app/views/admin/follow_recommendations/show.html.haml' - - 'app/views/admin/invites/_invite.html.haml' - - 'app/views/admin/invites/index.html.haml' - - 'app/views/admin/ip_blocks/index.html.haml' - - 'app/views/admin/reports/_status.html.haml' - - 'app/views/admin/reports/show.html.haml' - 'app/views/admin/roles/_form.html.haml' - - 'app/views/admin/software_updates/index.html.haml' - - 'app/views/admin/status_edits/_status_edit.html.haml' - - 'app/views/admin/statuses/index.html.haml' - - 'app/views/admin/tags/show.html.haml' - - 'app/views/admin/trends/tags/_tag.html.haml' - - 'app/views/auth/registrations/_session.html.haml' - - 'app/views/auth/registrations/new.html.haml' - - 'app/views/auth/sessions/two_factor.html.haml' - - 'app/views/auth/shared/_progress.html.haml' - - 'app/views/disputes/strikes/_card.html.haml' - - 'app/views/filters/statuses/index.html.haml' - - 'app/views/invites/_invite.html.haml' - 'app/views/layouts/application.html.haml' - - 'app/views/layouts/error.html.haml' - - 'app/views/statuses/_detailed_status.html.haml' - - 'app/views/statuses/_og_image.html.haml' - - 'app/views/statuses/_simple_status.html.haml' - - 'app/views/statuses_cleanup/show.html.haml' - - 'app/views/user_mailer/warning.html.haml' diff --git a/app/views/.rubocop.yml b/app/views/.rubocop.yml new file mode 100644 index 0000000000..4e268848c7 --- /dev/null +++ b/app/views/.rubocop.yml @@ -0,0 +1,5 @@ +inherit_from: ../../.rubocop.yml + +# Disable for the `Rubocop` lints in haml-lint +Style/IfUnlessModifier: + Enabled: false diff --git a/app/views/admin/accounts/_account.html.haml b/app/views/admin/accounts/_account.html.haml index 82dd8dfb2b..755b987a87 100644 --- a/app/views/admin/accounts/_account.html.haml +++ b/app/views/admin/accounts/_account.html.haml @@ -30,6 +30,6 @@ \- %br/ %samp.ellipsized-ip= relevant_account_ip(account, params[:ip]) - - if !account.suspended? && account.user_pending? && account.user&.invite_request&.text&.present? + - if !account.suspended? && account.user_pending? && account.user&.invite_request&.text.present? .batch-table__row__content__quote %p= account.user&.invite_request&.text diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index 80b8fc92c2..da2f2055d0 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -73,7 +73,7 @@ %hr.spacer/ - - if @account.user&.invite_request&.text&.present? + - if @account.user&.invite_request&.text.present? .speech-bubble .speech-bubble__bubble = @account.user&.invite_request&.text diff --git a/app/views/admin/domain_blocks/confirm_suspension.html.haml b/app/views/admin/domain_blocks/confirm_suspension.html.haml index e0e55e70f3..a5df8ba3f3 100644 --- a/app/views/admin/domain_blocks/confirm_suspension.html.haml +++ b/app/views/admin/domain_blocks/confirm_suspension.html.haml @@ -2,7 +2,6 @@ = t('.title', domain: Addressable::IDNA.to_unicode(@domain_block.domain)) = simple_form_for @domain_block, url: admin_domain_blocks_path, method: :post do |f| - %p.hint= t('.preamble_html', domain: Addressable::IDNA.to_unicode(@domain_block.domain)) %ul.hint %li= t('.stop_communication') diff --git a/app/views/admin/software_updates/index.html.haml b/app/views/admin/software_updates/index.html.haml index 7a223ee07b..d2ba115590 100644 --- a/app/views/admin/software_updates/index.html.haml +++ b/app/views/admin/software_updates/index.html.haml @@ -23,7 +23,7 @@ %td= update.version %td= t("admin.software_updates.types.#{update.type}") - if update.urgent? - %td.critical= t("admin.software_updates.critical_update") + %td.critical= t('admin.software_updates.critical_update') - else %td %td= table_link_to 'link', t('admin.software_updates.release_notes'), update.release_notes diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index 0878887cea..e4c985c19e 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -35,7 +35,6 @@ %span= t('admin.trends.tags.not_trendable') = fa_icon 'lock fw' - = link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.listable? ? 'positive' : 'negative'] do - if @tag.listable? %span= t('admin.trends.tags.listable') diff --git a/app/views/admin/trends/tags/_tag.html.haml b/app/views/admin/trends/tags/_tag.html.haml index 72f8178ef2..70c7d8dbd4 100644 --- a/app/views/admin/trends/tags/_tag.html.haml +++ b/app/views/admin/trends/tags/_tag.html.haml @@ -10,7 +10,7 @@ %br/ - = link_to tag_path(tag), target: '_blank' do + = link_to tag_path(tag), target: '_blank', rel: 'noopener noreferrer' do = t('admin.trends.tags.used_by_over_week', count: tag.history.reduce(0) { |sum, day| sum + day.accounts }) - if tag.trendable? && (rank = Trends.tags.rank(tag.id)) diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index c001b66c22..4cac7b51bd 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -33,7 +33,6 @@ = f.simple_fields_for :invite_request, resource.invite_request || resource.build_invite_request do |invite_request_fields| = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: Setting.require_invite_text, label: false, hint: false - = hidden_field_tag :accept, params[:accept] = f.input :invite_code, as: :hidden diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index 852a0c69b6..b7aafe9879 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -1,7 +1,7 @@ !!! %html{ lang: I18n.locale } %head - %meta{ content: 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type' }/ + %meta{ 'content' => 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type' }/ %meta{ charset: 'utf-8' }/ %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ diff --git a/app/views/statuses_cleanup/show.html.haml b/app/views/statuses_cleanup/show.html.haml index 99b9ddab93..bd4cc1d86c 100644 --- a/app/views/statuses_cleanup/show.html.haml +++ b/app/views/statuses_cleanup/show.html.haml @@ -5,7 +5,6 @@ = button_tag t('generic.save_changes'), class: 'button', form: 'edit_policy' = simple_form_for @policy, url: statuses_cleanup_path, method: :put, html: { id: 'edit_policy' } do |f| - .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :enabled, as: :boolean, wrapper: :with_label, label: t('statuses_cleanup.enabled'), hint: t('statuses_cleanup.enabled_hint') From a4e6fe36cb79b24bf31599222ebb99ceef051414 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Wed, 25 Oct 2023 14:47:37 +0200 Subject: [PATCH 4/6] Add missing ban icons (#27555) --- app/javascript/mastodon/features/blocks/index.jsx | 3 ++- app/javascript/mastodon/features/domain_blocks/index.jsx | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/blocks/index.jsx b/app/javascript/mastodon/features/blocks/index.jsx index d976174ce0..210260c811 100644 --- a/app/javascript/mastodon/features/blocks/index.jsx +++ b/app/javascript/mastodon/features/blocks/index.jsx @@ -6,6 +6,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; +import { ReactComponent as BlockIcon } from '@material-symbols/svg-600/outlined/block-fill.svg'; import { debounce } from 'lodash'; import { fetchBlocks, expandBlocks } from '../../actions/blocks'; @@ -59,7 +60,7 @@ class Blocks extends ImmutablePureComponent { const emptyMessage = ; return ( - + ; return ( - + Date: Wed, 25 Oct 2023 15:55:57 +0200 Subject: [PATCH 5/6] Fix batch attachment deletion when using OpenStack Swift (#27554) --- app/lib/attachment_batch.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb index b75938bdd7..78bd593160 100644 --- a/app/lib/attachment_batch.rb +++ b/app/lib/attachment_batch.rb @@ -75,7 +75,7 @@ class AttachmentBatch end when :fog logger.debug { "Deleting #{attachment.path(style)}" } - attachment.directory.files.new(key: attachment.path(style)).destroy + attachment.send(:directory).files.new(key: attachment.path(style)).destroy when :azure logger.debug { "Deleting #{attachment.path(style)}" } attachment.destroy From 9a3d047f3e604e581e18346424569e28fc9c5b96 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 25 Oct 2023 09:56:09 -0400 Subject: [PATCH 6/6] Run `bin/rails app:update` with Rails 7.1 (#27522) --- config/application.rb | 23 +- config/environments/development.rb | 6 + config/environments/production.rb | 36 ++- config/environments/test.rb | 18 +- .../initializers/content_security_policy.rb | 8 +- config/initializers/cors.rb | 2 +- .../initializers/filter_parameter_logging.rb | 6 +- config/initializers/inflections.rb | 11 +- .../new_framework_defaults_7_1.rb | 225 ++++++++++++++++++ config/initializers/permissions_policy.rb | 21 +- 10 files changed, 308 insertions(+), 48 deletions(-) create mode 100644 config/initializers/new_framework_defaults_7_1.rb diff --git a/config/application.rb b/config/application.rb index 0fd053f83f..7f7f8b5d6c 100644 --- a/config/application.rb +++ b/config/application.rb @@ -71,15 +71,20 @@ module Mastodon # https://github.com/mastodon/mastodon/pull/24241#discussion_r1162890242 config.active_support.cache_format_version = 6.1 - config.add_autoload_paths_to_load_path = false - - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. - - # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. - # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. - # config.time_zone = 'Central Time (US & Canada)' + # Please, add to the `ignore` list any other `lib` subdirectories that do + # not contain `.rb` files, or that should not be reloaded or eager loaded. + # Common ones are `templates`, `generators`, or `middleware`, for example. + # config.autoload_lib(ignore: %w(assets tasks templates generators)) + # TODO: We should enable this eventually, but for now there are many things + # in the wrong path from the perspective of zeitwerk. + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") # All translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] diff --git a/config/environments/development.rb b/config/environments/development.rb index 9a6637bdb9..e601fc014c 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -68,6 +68,9 @@ Rails.application.configure do # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true + # Highlight code that enqueued background job in logs. + config.active_job.verbose_enqueue_logs = true + # Debug mode disables concatenation and preprocessing of assets. config.assets.debug = true @@ -98,6 +101,9 @@ Rails.application.configure do # We provide a default secret for the development environment here. # This value should not be used in production environments! config.x.otp_secret = ENV.fetch('OTP_SECRET', '1fc2b87989afa6351912abeebe31ffc5c476ead9bf8b3d74cbc4a302c7b69a45b40b1bbef3506ddad73e942e15ed5ca4b402bf9a66423626051104f4b5f05109') + + # Raise error when a before_action's only/except options reference missing actions + config.action_controller.raise_on_missing_callback_actions = true end Redis.raise_deprecations = true diff --git a/config/environments/production.rb b/config/environments/production.rb index 7da9d62410..94e74699fc 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -6,7 +6,7 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. - config.cache_classes = true + config.enable_reloading = false # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers @@ -19,8 +19,8 @@ Rails.application.configure do config.action_controller.perform_caching = true config.action_controller.asset_host = ENV['CDN_HOST'] if ENV['CDN_HOST'].present? - # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] - # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment + # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files). # config.require_master_key = true # Compress CSS using a preprocessor. @@ -48,10 +48,9 @@ Rails.application.configure do } } - # Include generic and useful information about system operation, but avoid logging too much - # information to avoid inadvertent exposure of personally identifiable information (PII). - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. + # Info include generic and useful information about system operation, but avoids logging too much + # information to avoid inadvertent exposure of personally identifiable information (PII). If you + # want to log everything, set the level to "debug". config.log_level = ENV.fetch('RAILS_LOG_LEVEL', 'info').to_sym # Prepend all log lines with the following tags. @@ -72,10 +71,13 @@ Rails.application.configure do # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # English when a translation cannot be found). + # This setting would typically be `true` to use the `I18n.default_locale`. + # Some locales are missing translation entries and would have errors: + # https://github.com/mastodon/mastodon/pull/24727 config.i18n.fallbacks = [:en] - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify + # Don't log any deprecations. + config.active_support.report_deprecations = false # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new @@ -93,10 +95,10 @@ Rails.application.configure do # require "syslog/logger" # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name") - ActiveSupport::Logger.new(STDOUT).tap do |logger| - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end + # Log to STDOUT by default + config.logger = ActiveSupport::Logger.new(STDOUT) + .tap { |logger| logger.formatter = ::Logger::Formatter.new } + .then { |logger| ActiveSupport::TaggedLogging.new(logger) } # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false @@ -156,4 +158,12 @@ Rails.application.configure do } config.x.otp_secret = ENV.fetch('OTP_SECRET') + + # Enable DNS rebinding protection and other `Host` header attacks. + # config.hosts = [ + # "example.com", # Allow requests from example.com + # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` + # ] + # Skip DNS rebinding protection for the default health check endpoint. + # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } end diff --git a/config/environments/test.rb b/config/environments/test.rb index 210329848e..0b2f57fba7 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -10,12 +10,13 @@ require 'active_support/core_ext/integer/time' Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # Turn false under Spring and add config.action_view.cache_template_loading = true. - config.cache_classes = true + # While tests run files are not watched, reloading is not necessary. + config.enable_reloading = false - # Eager loading loads your whole application. When running a single test locally, - # this probably isn't necessary. It's a good idea to do in a continuous integration - # system, or in some way before deploying your code. + # Eager loading loads your entire application. When running a single test locally, + # this is usually not necessary, and can slow down your test suite. However, it's + # recommended that you enable it in continuous integration systems to ensure eager + # loading is working properly before deploying your code. config.eager_load = ENV['CI'].present? config.assets_digest = false @@ -26,7 +27,7 @@ Rails.application.configure do config.cache_store = :memory_store # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false + config.action_dispatch.show_exceptions = :rescuable # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false @@ -73,11 +74,14 @@ Rails.application.configure do # Annotate rendered view with file names. # config.action_view.annotate_rendered_view_with_filenames = true + + # Raise error when a before_action's only/except options reference missing actions + config.action_controller.raise_on_missing_callback_actions = true end Paperclip::Attachment.default_options[:path] = Rails.root.join('spec', 'test_files', ':class', ':id_partition', ':style.:extension') -# set fake_data for pam, don't do real calls, just use fake data +# Enable fake_data for PAM if ENV['PAM_ENABLED'] == 'true' Rpam2.fake_data = { diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 7023410921..e5e672f2c7 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -1,8 +1,10 @@ # frozen_string_literal: true -# Define an application-wide content security policy -# For further information see the following documentation -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy. +# See the Securing Rails Applications Guide for more information: +# https://guides.rubyonrails.org/security.html#content-security-policy-header def host_to_url(str) return if str.blank? diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index 6424477846..37a818bf46 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -3,7 +3,7 @@ # Be sure to restart your server when you modify this file. # Avoid CORS issues when API is called from the frontend app. -# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. +# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin Ajax requests. # Read more: https://github.com/cyu/rack-cors diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index ca55f952da..a119afa124 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -2,9 +2,9 @@ # Be sure to restart your server when you modify this file. -# Configure parameters to be filtered from the log file. Use this to limit dissemination of -# sensitive information. See the ActiveSupport::ParameterFilter documentation for supported -# notations and behaviors. +# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. +# Use this to limit dissemination of sensitive information. +# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. Rails.application.config.filter_parameters += [ :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn ] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 0dad009b1f..727a1350d0 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -6,9 +6,9 @@ # are locale specific, and you may define rules for as many different # locales as you wish. All of these examples are active by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' +# inflect.plural /^(ox)$/i, "\\1en" +# inflect.singular /^(ox)en/i, "\\1" +# inflect.irregular "person", "people" # inflect.uncountable %w( fish sheep ) # end @@ -32,3 +32,8 @@ ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.singular 'data', 'data' end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym "RESTful" +# end diff --git a/config/initializers/new_framework_defaults_7_1.rb b/config/initializers/new_framework_defaults_7_1.rb new file mode 100644 index 0000000000..2fa0e42746 --- /dev/null +++ b/config/initializers/new_framework_defaults_7_1.rb @@ -0,0 +1,225 @@ +# frozen_string_literal: true + +# Be sure to restart your server when you modify this file. +# +# This file eases your Rails 7.1 framework defaults upgrade. +# +# Uncomment each configuration one by one to switch to the new default. +# Once your application is ready to run with all new defaults, you can remove +# this file and set the `config.load_defaults` to `7.1`. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. +# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html + +# No longer add autoloaded paths into `$LOAD_PATH`. This means that you won't be able +# to manually require files that are managed by the autoloader, which you shouldn't do anyway. +# This will reduce the size of the load path, making `require` faster if you don't use bootsnap, or reduce the size +# of the bootsnap cache if you use it. +Rails.application.config.add_autoload_paths_to_load_path = false + +# Remove the default X-Download-Options headers since it is used only by Internet Explorer. +# If you need to support Internet Explorer, add back `"X-Download-Options" => "noopen"`. +# Rails.application.config.action_dispatch.default_headers = { +# "X-Frame-Options" => "SAMEORIGIN", +# "X-XSS-Protection" => "0", +# "X-Content-Type-Options" => "nosniff", +# "X-Permitted-Cross-Domain-Policies" => "none", +# "Referrer-Policy" => "strict-origin-when-cross-origin" +# } + +# Do not treat an `ActionController::Parameters` instance +# as equal to an equivalent `Hash` by default. +# Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false + +# Active Record Encryption now uses SHA-256 as its hash digest algorithm. Important: If you have +# data encrypted with previous Rails versions, there are two scenarios to consider: +# +# 1. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA1 (the default +# before Rails 7.0), you need to configure SHA-1 for Active Record Encryption too: +# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA1 +# 2. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA256 (the new default +# in 7.0), then you need to configure SHA-256 for Active Record Encryption: +# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256 +# +# If you don't currently have data encrypted with Active Record encryption, you can disable this setting to +# configure the default behavior starting 7.1+: +# Rails.application.config.active_record.encryption.support_sha1_for_non_deterministic_encryption = false + +# No longer run after_commit callbacks on the first of multiple Active Record +# instances to save changes to the same database row within a transaction. +# Instead, run these callbacks on the instance most likely to have internal +# state which matches what was committed to the database, typically the last +# instance to save. +# Rails.application.config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = false + +# Configures SQLite with a strict strings mode, which disables double-quoted string literals. +# +# SQLite has some quirks around double-quoted string literals. +# It first tries to consider double-quoted strings as identifier names, but if they don't exist +# it then considers them as string literals. Because of this, typos can silently go unnoticed. +# For example, it is possible to create an index for a non existing column. +# See https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted for more details. +# Rails.application.config.active_record.sqlite3_adapter_strict_strings_by_default = true + +# Disable deprecated singular associations names +# Rails.application.config.active_record.allow_deprecated_singular_associations_name = false + +# Enable the Active Job `BigDecimal` argument serializer, which guarantees +# roundtripping. Without this serializer, some queue adapters may serialize +# `BigDecimal` arguments as simple (non-roundtrippable) strings. +# +# When deploying an application with multiple replicas, old (pre-Rails 7.1) +# replicas will not be able to deserialize `BigDecimal` arguments from this +# serializer. Therefore, this setting should only be enabled after all replicas +# have been successfully upgraded to Rails 7.1. +# Rails.application.config.active_job.use_big_decimal_serializer = true + +# Specify if an `ArgumentError` should be raised if `Rails.cache` `fetch` or +# `write` are given an invalid `expires_at` or `expires_in` time. +# Options are `true`, and `false`. If `false`, the exception will be reported +# as `handled` and logged instead. +# Rails.application.config.active_support.raise_on_invalid_cache_expiration_time = true + +# Specify whether Query Logs will format tags using the SQLCommenter format +# (https://open-telemetry.github.io/opentelemetry-sqlcommenter/), or using the legacy format. +# Options are `:legacy` and `:sqlcommenter`. +# Rails.application.config.active_record.query_log_tags_format = :sqlcommenter + +# Specify the default serializer used by `MessageEncryptor` and `MessageVerifier` +# instances. +# +# The legacy default is `:marshal`, which is a potential vector for +# deserialization attacks in cases where a message signing secret has been +# leaked. +# +# In Rails 7.1, the new default is `:json_allow_marshal` which serializes and +# deserializes with `ActiveSupport::JSON`, but can fall back to deserializing +# with `Marshal` so that legacy messages can still be read. +# +# In Rails 7.2, the default will become `:json` which serializes and +# deserializes with `ActiveSupport::JSON` only. +# +# Alternatively, you can choose `:message_pack` or `:message_pack_allow_marshal`, +# which serialize with `ActiveSupport::MessagePack`. `ActiveSupport::MessagePack` +# can roundtrip some Ruby types that are not supported by JSON, and may provide +# improved performance, but it requires the `msgpack` gem. +# +# For more information, see +# https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer +# +# If you are performing a rolling deploy of a Rails 7.1 upgrade, wherein servers +# that have not yet been upgraded must be able to read messages from upgraded +# servers, first deploy without changing the serializer, then set the serializer +# in a subsequent deploy. +# Rails.application.config.active_support.message_serializer = :json_allow_marshal + +# Enable a performance optimization that serializes message data and metadata +# together. This changes the message format, so messages serialized this way +# cannot be read by older versions of Rails. However, messages that use the old +# format can still be read, regardless of whether this optimization is enabled. +# +# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have +# not yet been upgraded must be able to read messages from upgraded servers, +# leave this optimization off on the first deploy, then enable it on a +# subsequent deploy. +# Rails.application.config.active_support.use_message_serializer_for_metadata = true + +# Set the maximum size for Rails log files. +# +# `config.load_defaults 7.1` does not set this value for environments other than +# development and test. +# +# if Rails.env.local? +# Rails.application.config.log_file_size = 100 * 1024 * 1024 +# end + +# Enable raising on assignment to attr_readonly attributes. The previous +# behavior would allow assignment but silently not persist changes to the +# database. +# Rails.application.config.active_record.raise_on_assign_to_attr_readonly = true + +# Enable validating only parent-related columns for presence when the parent is mandatory. +# The previous behavior was to validate the presence of the parent record, which performed an extra query +# to get the parent every time the child record was updated, even when parent has not changed. +# Rails.application.config.active_record.belongs_to_required_validates_foreign_key = false + +# Enable precompilation of `config.filter_parameters`. Precompilation can +# improve filtering performance, depending on the quantity and types of filters. +# Rails.application.config.precompile_filter_parameters = true + +# Enable before_committed! callbacks on all enrolled records in a transaction. +# The previous behavior was to only run the callbacks on the first copy of a record +# if there were multiple copies of the same record enrolled in the transaction. +# Rails.application.config.active_record.before_committed_on_all_records = true + +# Disable automatic column serialization into YAML. +# To keep the historic behavior, you can set it to `YAML`, however it is +# recommended to explicitly define the serialization method for each column +# rather than to rely on a global default. +# Rails.application.config.active_record.default_column_serializer = nil + +# Enable a performance optimization that serializes Active Record models +# in a faster and more compact way. +# +# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have +# not yet been upgraded must be able to read caches from upgraded servers, +# leave this optimization off on the first deploy, then enable it on a +# subsequent deploy. +# Rails.application.config.active_record.marshalling_format_version = 7.1 + +# Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model. +# This matches the behaviour of all other callbacks. +# In previous versions of Rails, they ran in the inverse order. +# Rails.application.config.active_record.run_after_transaction_callbacks_in_order_defined = true + +# Whether a `transaction` block is committed or rolled back when exited via `return`, `break` or `throw`. +# +# Rails.application.config.active_record.commit_transaction_on_non_local_return = true + +# Controls when to generate a value for has_secure_token declarations. +# +# Rails.application.config.active_record.generate_secure_token_on = :initialize + +# ** Please read carefully, this must be configured in config/application.rb ** +# Change the format of the cache entry. +# Changing this default means that all new cache entries added to the cache +# will have a different format that is not supported by Rails 7.0 +# applications. +# Only change this value after your application is fully deployed to Rails 7.1 +# and you have no plans to rollback. +# When you're ready to change format, add this to `config/application.rb` (NOT +# this file): +# config.active_support.cache_format_version = 7.1 + +# Configure Action View to use HTML5 standards-compliant sanitizers when they are supported on your +# platform. +# +# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action View to use HTML5-compliant +# sanitizers if they are supported, else fall back to HTML4 sanitizers. +# +# In previous versions of Rails, Action View always used `Rails::HTML4::Sanitizer` as its vendor. +# +# Rails.application.config.action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor + +# Configure Action Text to use an HTML5 standards-compliant sanitizer when it is supported on your +# platform. +# +# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action Text to use HTML5-compliant +# sanitizers if they are supported, else fall back to HTML4 sanitizers. +# +# In previous versions of Rails, Action Text always used `Rails::HTML4::Sanitizer` as its vendor. +# +# Rails.application.config.action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor + +# Configure the log level used by the DebugExceptions middleware when logging +# uncaught exceptions during requests +# Rails.application.config.action_dispatch.debug_exception_log_level = :error + +# Configure the test helpers in Action View, Action Dispatch, and rails-dom-testing to use HTML5 +# parsers. +# +# Nokogiri::HTML5 isn't supported on JRuby, so JRuby applications must set this to :html4. +# +# In previous versions of Rails, these test helpers always used an HTML4 parser. +# +# Rails.application.config.dom_testing_default_html_version = :html5 diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb index 50bcf4eade..e8d0b2ae81 100644 --- a/config/initializers/permissions_policy.rb +++ b/config/initializers/permissions_policy.rb @@ -1,12 +1,15 @@ # frozen_string_literal: true + +# Be sure to restart your server when you modify this file. + # Define an application-wide HTTP permissions policy. For further -# information see https://developers.google.com/web/updates/2018/06/feature-policy -# -# Rails.application.config.permissions_policy do |f| -# f.camera :none -# f.gyroscope :none -# f.microphone :none -# f.usb :none -# f.fullscreen :self -# f.payment :self, "https://secure.example.com" +# information see: https://developers.google.com/web/updates/2018/06/feature-policy + +# Rails.application.config.permissions_policy do |policy| +# policy.camera :none +# policy.gyroscope :none +# policy.microphone :none +# policy.usb :none +# policy.fullscreen :self +# policy.payment :self, "https://secure.example.com" # end