Merge commit 'b896b16cb3c8626fbee12a7eda7f882114b1a040' into glitch-soc/merge-upstream

main
Claire 2023-05-28 15:01:53 +02:00
commit 6dbd44faea
40 changed files with 227 additions and 216 deletions

View File

@ -43,7 +43,7 @@ Layout/LineLength:
- !ruby/regexp / \# .*$/ - !ruby/regexp / \# .*$/
- !ruby/regexp /^\# .*$/ - !ruby/regexp /^\# .*$/
Exclude: Exclude:
- lib/**/*cli*.rb - 'lib/mastodon/cli/*.rb'
- db/*migrate/**/* - db/*migrate/**/*
- db/seeds/**/* - db/seeds/**/*
@ -57,7 +57,7 @@ Lint/UselessAccessModifier:
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize # https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize
Metrics/AbcSize: Metrics/AbcSize:
Exclude: Exclude:
- 'lib/**/*cli*.rb' - 'lib/mastodon/cli/*.rb'
- db/*migrate/**/* - db/*migrate/**/*
# Reason: Some functions cannot be broken up, but others may be refactor candidates # Reason: Some functions cannot be broken up, but others may be refactor candidates
@ -66,7 +66,7 @@ Metrics/BlockLength:
CountAsOne: ['array', 'hash', 'heredoc', 'method_call'] CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
Exclude: Exclude:
- 'config/routes.rb' - 'config/routes.rb'
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/cli/*.rb'
- 'lib/tasks/*.rake' - 'lib/tasks/*.rake'
- 'app/models/concerns/account_associations.rb' - 'app/models/concerns/account_associations.rb'
- 'app/models/concerns/account_interactions.rb' - 'app/models/concerns/account_interactions.rb'
@ -95,14 +95,14 @@ Metrics/BlockLength:
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting # https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting
Metrics/BlockNesting: Metrics/BlockNesting:
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/cli/*.rb'
# Reason: Some Excluded files would be candidates for refactoring but not currently addressed # Reason: Some Excluded files would be candidates for refactoring but not currently addressed
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsclasslength # https://docs.rubocop.org/rubocop/cops_metrics.html#metricsclasslength
Metrics/ClassLength: Metrics/ClassLength:
CountAsOne: ['array', 'hash', 'heredoc', 'method_call'] CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/cli/*.rb'
- 'app/controllers/admin/accounts_controller.rb' - 'app/controllers/admin/accounts_controller.rb'
- 'app/controllers/api/base_controller.rb' - 'app/controllers/api/base_controller.rb'
- 'app/controllers/api/v1/admin/accounts_controller.rb' - 'app/controllers/api/v1/admin/accounts_controller.rb'
@ -146,7 +146,7 @@ Metrics/ClassLength:
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity # https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Exclude: Exclude:
- lib/mastodon/*cli*.rb - lib/mastodon/cli/*.rb
- db/*migrate/**/* - db/*migrate/**/*
# Reason: Currently disabled in .rubocop_todo.yml # Reason: Currently disabled in .rubocop_todo.yml
@ -154,7 +154,7 @@ Metrics/CyclomaticComplexity:
Metrics/MethodLength: Metrics/MethodLength:
CountAsOne: [array, heredoc] CountAsOne: [array, heredoc]
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/cli/*.rb'
# Reason: # Reason:
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmodulelength # https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmodulelength
@ -171,13 +171,12 @@ Rails/FilePath:
Rails/HttpStatus: Rails/HttpStatus:
EnforcedStyle: numeric EnforcedStyle: numeric
# Reason: Allowed only in the `tootctl` CLI application code # Reason: Allowed in `tootctl` CLI code and in boot ENV checker
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit # https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit
Rails/Exit: Rails/Exit:
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'config/boot.rb'
- 'lib/mastodon/cli_helper.rb' - 'lib/mastodon/cli/*.rb'
- 'lib/cli.rb'
# Reason: Some single letter camel case files shouldn't be split # Reason: Some single letter camel case files shouldn't be split
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath # https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath

View File

@ -396,12 +396,6 @@ RSpec/ExpectChange:
- 'spec/services/unsuspend_account_service_spec.rb' - 'spec/services/unsuspend_account_service_spec.rb'
- 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb' - 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb'
RSpec/ExpectInHook:
Exclude:
- 'spec/controllers/api/v1/media_controller_spec.rb'
- 'spec/controllers/settings/applications_controller_spec.rb'
- 'spec/lib/status_filter_spec.rb'
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle. # Configuration parameters: EnforcedStyle.
# SupportedStyles: implicit, each, example # SupportedStyles: implicit, each, example
@ -565,15 +559,6 @@ RSpec/PendingWithoutReason:
Exclude: Exclude:
- 'spec/models/account_spec.rb' - 'spec/models/account_spec.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Strict, EnforcedStyle, AllowedExplicitMatchers.
# SupportedStyles: inflected, explicit
RSpec/PredicateMatcher:
Exclude:
- 'spec/controllers/api/v1/accounts/notes_controller_spec.rb'
- 'spec/models/user_spec.rb'
- 'spec/services/post_status_service_spec.rb'
RSpec/StubbedMock: RSpec/StubbedMock:
Exclude: Exclude:
- 'spec/controllers/api/base_controller_spec.rb' - 'spec/controllers/api/base_controller_spec.rb'
@ -715,12 +700,6 @@ Rails/DuplicateAssociation:
- 'app/serializers/activitypub/collection_serializer.rb' - 'app/serializers/activitypub/collection_serializer.rb'
- 'app/serializers/activitypub/note_serializer.rb' - 'app/serializers/activitypub/note_serializer.rb'
# Configuration parameters: Include.
# Include: app/**/*.rb, config/**/*.rb, lib/**/*.rb
Rails/Exit:
Exclude:
- 'config/boot.rb'
# Configuration parameters: Include. # Configuration parameters: Include.
# Include: app/models/**/*.rb # Include: app/models/**/*.rb
Rails/HasAndBelongsToMany: Rails/HasAndBelongsToMany:
@ -855,9 +834,9 @@ Rails/SkipsModelValidations:
- 'db/post_migrate/20220617202502_migrate_roles.rb' - 'db/post_migrate/20220617202502_migrate_roles.rb'
- 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb' - 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb'
- 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb' - 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb'
- 'lib/cli.rb' - 'lib/mastodon/cli/accounts.rb'
- 'lib/mastodon/accounts_cli.rb' - 'lib/mastodon/cli/main.rb'
- 'lib/mastodon/maintenance_cli.rb' - 'lib/mastodon/cli/maintenance.rb'
- 'spec/controllers/api/v1/admin/accounts_controller_spec.rb' - 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
- 'spec/lib/activitypub/activity/follow_spec.rb' - 'spec/lib/activitypub/activity/follow_spec.rb'
- 'spec/services/follow_service_spec.rb' - 'spec/services/follow_service_spec.rb'
@ -939,7 +918,7 @@ Rails/WhereExists:
- 'app/validators/vote_validator.rb' - 'app/validators/vote_validator.rb'
- 'app/workers/move_worker.rb' - 'app/workers/move_worker.rb'
- 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb' - 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb'
- 'lib/mastodon/email_domain_blocks_cli.rb' - 'lib/mastodon/cli/email_domain_blocks.rb'
- 'lib/tasks/tests.rake' - 'lib/tasks/tests.rake'
- 'spec/controllers/api/v1/accounts/notes_controller_spec.rb' - 'spec/controllers/api/v1/accounts/notes_controller_spec.rb'
- 'spec/controllers/api/v1/tags_controller_spec.rb' - 'spec/controllers/api/v1/tags_controller_spec.rb'
@ -1001,7 +980,7 @@ Style/FormatStringToken:
Exclude: Exclude:
- 'app/models/privacy_policy.rb' - 'app/models/privacy_policy.rb'
- 'config/initializers/devise.rb' - 'config/initializers/devise.rb'
- 'lib/mastodon/maintenance_cli.rb' - 'lib/mastodon/cli/maintenance.rb'
- 'lib/paperclip/color_extractor.rb' - 'lib/paperclip/color_extractor.rb'
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
@ -1446,9 +1425,9 @@ Style/GuardClause:
- 'db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb' - 'db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb'
- 'lib/devise/two_factor_ldap_authenticatable.rb' - 'lib/devise/two_factor_ldap_authenticatable.rb'
- 'lib/devise/two_factor_pam_authenticatable.rb' - 'lib/devise/two_factor_pam_authenticatable.rb'
- 'lib/mastodon/accounts_cli.rb' - 'lib/mastodon/cli/accounts.rb'
- 'lib/mastodon/maintenance_cli.rb' - 'lib/mastodon/cli/maintenance.rb'
- 'lib/mastodon/media_cli.rb' - 'lib/mastodon/cli/media.rb'
- 'lib/paperclip/attachment_extensions.rb' - 'lib/paperclip/attachment_extensions.rb'
- 'lib/tasks/repo.rake' - 'lib/tasks/repo.rake'

View File

@ -31,8 +31,4 @@ class Api::V1::FeaturedTagsController < Api::BaseController
def set_featured_tags def set_featured_tags
@featured_tags = current_account.featured_tags.order(statuses_count: :desc) @featured_tags = current_account.featured_tags.order(statuses_count: :desc)
end end
def featured_tag_params
params.require(:name)
end
end end

View File

@ -46,7 +46,7 @@ class MediaController < ApplicationController
end end
def allow_iframing def allow_iframing
response.headers['X-Frame-Options'] = 'ALLOWALL' response.headers.delete('X-Frame-Options')
end end
def set_pack def set_pack

View File

@ -46,7 +46,7 @@ class StatusesController < ApplicationController
return not_found if @status.hidden? || @status.reblog? return not_found if @status.hidden? || @status.reblog?
expires_in 180, public: true expires_in 180, public: true
response.headers['X-Frame-Options'] = 'ALLOWALL' response.headers.delete('X-Frame-Options')
render layout: 'embedded' render layout: 'embedded'
end end

View File

@ -52,7 +52,7 @@ module ApplicationHelper
if closed_registrations? || omniauth_only? if closed_registrations? || omniauth_only?
'https://joinmastodon.org/#getting-started' 'https://joinmastodon.org/#getting-started'
else else
new_user_registration_path ENV.fetch('SSO_ACCOUNT_SIGN_UP', new_user_registration_path)
end end
end end

View File

@ -73,6 +73,13 @@ export default class MediaContainer extends PureComponent {
render () { render () {
const { locale, components } = this.props; const { locale, components } = this.props;
let handleOpenVideo;
// Don't offer to expand the video in a lightbox if we're in a frame
if (window.self === window.top) {
handleOpenVideo = this.handleOpenVideo;
}
return ( return (
<IntlProvider locale={locale} messages={messages}> <IntlProvider locale={locale} messages={messages}>
<> <>
@ -89,7 +96,7 @@ export default class MediaContainer extends PureComponent {
...(componentName === 'Video' ? { ...(componentName === 'Video' ? {
componentIndex: i, componentIndex: i,
onOpenVideo: this.handleOpenVideo, onOpenVideo: handleOpenVideo,
} : { } : {
onOpenMedia: this.handleOpenMedia, onOpenMedia: this.handleOpenMedia,
}), }),

View File

@ -9,6 +9,7 @@ import { openModal, closeModal } from 'mastodon/actions/modal';
const mapStateToProps = (state, { accountId }) => ({ const mapStateToProps = (state, { accountId }) => ({
displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']), displayNameHtml: state.getIn(['accounts', accountId, 'display_name_html']),
signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], '/auth/sign_up'),
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
@ -81,6 +82,7 @@ class InteractionModal extends PureComponent {
url: PropTypes.string, url: PropTypes.string,
type: PropTypes.oneOf(['reply', 'reblog', 'favourite', 'follow']), type: PropTypes.oneOf(['reply', 'reblog', 'favourite', 'follow']),
onSignupClick: PropTypes.func.isRequired, onSignupClick: PropTypes.func.isRequired,
signupUrl: PropTypes.string.isRequired,
}; };
handleSignupClick = () => { handleSignupClick = () => {
@ -88,7 +90,7 @@ class InteractionModal extends PureComponent {
}; };
render () { render () {
const { url, type, displayNameHtml } = this.props; const { url, type, displayNameHtml, signupUrl } = this.props;
const name = <bdi dangerouslySetInnerHTML={{ __html: displayNameHtml }} />; const name = <bdi dangerouslySetInnerHTML={{ __html: displayNameHtml }} />;
@ -121,7 +123,7 @@ class InteractionModal extends PureComponent {
if (registrationsOpen) { if (registrationsOpen) {
signupButton = ( signupButton = (
<a href='/auth/sign_up' className='button button--block button-tertiary'> <a href={signupUrl} className='button button--block button-tertiary'>
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
</a> </a>
); );

View File

@ -16,6 +16,10 @@ const Account = connect(state => ({
</Link> </Link>
)); ));
const mapStateToProps = (state) => ({
signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], '/auth/sign_up'),
});
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
openClosedRegistrationsModal() { openClosedRegistrationsModal() {
dispatch(openModal('CLOSED_REGISTRATIONS')); dispatch(openModal('CLOSED_REGISTRATIONS'));
@ -31,11 +35,12 @@ class Header extends PureComponent {
static propTypes = { static propTypes = {
openClosedRegistrationsModal: PropTypes.func, openClosedRegistrationsModal: PropTypes.func,
location: PropTypes.object, location: PropTypes.object,
signupUrl: PropTypes.string.isRequired,
}; };
render () { render () {
const { signedIn } = this.context.identity; const { signedIn } = this.context.identity;
const { location, openClosedRegistrationsModal } = this.props; const { location, openClosedRegistrationsModal, signupUrl } = this.props;
let content; let content;
@ -51,7 +56,7 @@ class Header extends PureComponent {
if (registrationsOpen) { if (registrationsOpen) {
signupButton = ( signupButton = (
<a href='/auth/sign_up' className='button'> <a href={signupUrl} className='button'>
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
</a> </a>
); );
@ -87,4 +92,4 @@ class Header extends PureComponent {
} }
export default withRouter(connect(null, mapDispatchToProps)(Header)); export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Header));

View File

@ -1,11 +1,11 @@
import { useCallback } from 'react'; import { useCallback } from 'react';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import { useDispatch } from 'react-redux'; import { useAppDispatch, useAppSelector } from 'mastodon/store';
import { registrationsOpen } from 'mastodon/initial_state'; import { registrationsOpen } from 'mastodon/initial_state';
import { openModal } from 'mastodon/actions/modal'; import { openModal } from 'mastodon/actions/modal';
const SignInBanner = () => { const SignInBanner = () => {
const dispatch = useDispatch(); const dispatch = useAppDispatch();
const openClosedRegistrationsModal = useCallback( const openClosedRegistrationsModal = useCallback(
() => dispatch(openModal('CLOSED_REGISTRATIONS')), () => dispatch(openModal('CLOSED_REGISTRATIONS')),
@ -14,9 +14,11 @@ const SignInBanner = () => {
let signupButton; let signupButton;
const signupUrl = useAppSelector((state) => state.getIn(['server', 'server', 'registrations', 'url'], '/auth/sign_up'));
if (registrationsOpen) { if (registrationsOpen) {
signupButton = ( signupButton = (
<a href='/auth/sign_up' className='button button--block'> <a href={signupUrl} className='button button--block'>
<FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' /> <FormattedMessage id='sign_in_banner.create_account' defaultMessage='Create account' />
</a> </a>
); );

View File

@ -13,7 +13,7 @@
# #
class Identity < ApplicationRecord class Identity < ApplicationRecord
belongs_to :user, dependent: :destroy belongs_to :user
validates :uid, presence: true, uniqueness: { scope: :provider } validates :uid, presence: true, uniqueness: { scope: :provider }
validates :provider, presence: true validates :provider, presence: true

View File

@ -86,6 +86,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
enabled: registrations_enabled?, enabled: registrations_enabled?,
approval_required: Setting.registrations_mode == 'approved', approval_required: Setting.registrations_mode == 'approved',
message: registrations_enabled? ? nil : registrations_message, message: registrations_enabled? ? nil : registrations_message,
url: ENV.fetch('SSO_ACCOUNT_SIGN_UP', nil),
} }
end end

View File

@ -2,11 +2,11 @@
APP_PATH = File.expand_path('../config/application', __dir__) APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot' require_relative '../config/boot'
require_relative '../lib/cli' require_relative '../lib/mastodon/cli/main'
begin begin
Chewy.strategy(:mastodon) do Chewy.strategy(:mastodon) do
Mastodon::CLI.start(ARGV) Mastodon::CLI::Main.start(ARGV)
end end
rescue Interrupt rescue Interrupt
exit(130) exit(130)

View File

@ -1,13 +1,13 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'set' require 'set'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class AccountsCLI < Thor class Accounts < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class CacheCLI < Thor class Cache < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,13 +1,13 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'concurrent' require 'concurrent'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class CanonicalEmailBlocksCLI < Thor class CanonicalEmailBlocks < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,13 +1,13 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'concurrent' require 'concurrent'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class DomainsCLI < Thor class Domains < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,13 +1,13 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'concurrent' require 'concurrent'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class EmailDomainBlocksCLI < Thor class EmailDomainBlocks < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'rubygems/package' require 'rubygems/package'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class EmojiCLI < Thor class Emoji < Thor
def self.exit_on_failure? def self.exit_on_failure?
true true
end end

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class FeedsCLI < Thor class Feeds < Thor
include CLIHelper include Helper
include Redisable include Redisable
def self.exit_on_failure? def self.exit_on_failure?

View File

@ -9,8 +9,8 @@ HttpLog.configuration.logger = dev_null
Paperclip.options[:log] = false Paperclip.options[:log] = false
Chewy.logger = dev_null Chewy.logger = dev_null
module Mastodon module Mastodon::CLI
module CLIHelper module Helper
def dry_run? def dry_run?
options[:dry_run] options[:dry_run]
end end

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'rubygems/package' require 'rubygems/package'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class IpBlocksCLI < Thor class IpBlocks < Thor
def self.exit_on_failure? def self.exit_on_failure?
true true
end end

View File

@ -1,73 +1,73 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'thor' require 'thor'
require_relative 'mastodon/media_cli' require_relative 'media'
require_relative 'mastodon/emoji_cli' require_relative 'emoji'
require_relative 'mastodon/accounts_cli' require_relative 'accounts'
require_relative 'mastodon/feeds_cli' require_relative 'feeds'
require_relative 'mastodon/search_cli' require_relative 'search'
require_relative 'mastodon/settings_cli' require_relative 'settings'
require_relative 'mastodon/statuses_cli' require_relative 'statuses'
require_relative 'mastodon/domains_cli' require_relative 'domains'
require_relative 'mastodon/preview_cards_cli' require_relative 'preview_cards'
require_relative 'mastodon/cache_cli' require_relative 'cache'
require_relative 'mastodon/upgrade_cli' require_relative 'upgrade'
require_relative 'mastodon/email_domain_blocks_cli' require_relative 'email_domain_blocks'
require_relative 'mastodon/canonical_email_blocks_cli' require_relative 'canonical_email_blocks'
require_relative 'mastodon/ip_blocks_cli' require_relative 'ip_blocks'
require_relative 'mastodon/maintenance_cli' require_relative 'maintenance'
require_relative 'mastodon/version' require_relative '../version'
module Mastodon module Mastodon::CLI
class CLI < Thor class Main < Thor
def self.exit_on_failure? def self.exit_on_failure?
true true
end end
desc 'media SUBCOMMAND ...ARGS', 'Manage media files' desc 'media SUBCOMMAND ...ARGS', 'Manage media files'
subcommand 'media', Mastodon::MediaCLI subcommand 'media', Media
desc 'emoji SUBCOMMAND ...ARGS', 'Manage custom emoji' desc 'emoji SUBCOMMAND ...ARGS', 'Manage custom emoji'
subcommand 'emoji', Mastodon::EmojiCLI subcommand 'emoji', Emoji
desc 'accounts SUBCOMMAND ...ARGS', 'Manage accounts' desc 'accounts SUBCOMMAND ...ARGS', 'Manage accounts'
subcommand 'accounts', Mastodon::AccountsCLI subcommand 'accounts', Accounts
desc 'feeds SUBCOMMAND ...ARGS', 'Manage feeds' desc 'feeds SUBCOMMAND ...ARGS', 'Manage feeds'
subcommand 'feeds', Mastodon::FeedsCLI subcommand 'feeds', Feeds
desc 'search SUBCOMMAND ...ARGS', 'Manage the search engine' desc 'search SUBCOMMAND ...ARGS', 'Manage the search engine'
subcommand 'search', Mastodon::SearchCLI subcommand 'search', Search
desc 'settings SUBCOMMAND ...ARGS', 'Manage dynamic settings' desc 'settings SUBCOMMAND ...ARGS', 'Manage dynamic settings'
subcommand 'settings', Mastodon::SettingsCLI subcommand 'settings', Settings
desc 'statuses SUBCOMMAND ...ARGS', 'Manage statuses' desc 'statuses SUBCOMMAND ...ARGS', 'Manage statuses'
subcommand 'statuses', Mastodon::StatusesCLI subcommand 'statuses', Statuses
desc 'domains SUBCOMMAND ...ARGS', 'Manage account domains' desc 'domains SUBCOMMAND ...ARGS', 'Manage account domains'
subcommand 'domains', Mastodon::DomainsCLI subcommand 'domains', Domains
desc 'preview_cards SUBCOMMAND ...ARGS', 'Manage preview cards' desc 'preview_cards SUBCOMMAND ...ARGS', 'Manage preview cards'
subcommand 'preview_cards', Mastodon::PreviewCardsCLI subcommand 'preview_cards', PreviewCards
desc 'cache SUBCOMMAND ...ARGS', 'Manage cache' desc 'cache SUBCOMMAND ...ARGS', 'Manage cache'
subcommand 'cache', Mastodon::CacheCLI subcommand 'cache', Cache
desc 'upgrade SUBCOMMAND ...ARGS', 'Various version upgrade utilities' desc 'upgrade SUBCOMMAND ...ARGS', 'Various version upgrade utilities'
subcommand 'upgrade', Mastodon::UpgradeCLI subcommand 'upgrade', Upgrade
desc 'email_domain_blocks SUBCOMMAND ...ARGS', 'Manage e-mail domain blocks' desc 'email_domain_blocks SUBCOMMAND ...ARGS', 'Manage e-mail domain blocks'
subcommand 'email_domain_blocks', Mastodon::EmailDomainBlocksCLI subcommand 'email_domain_blocks', EmailDomainBlocks
desc 'ip_blocks SUBCOMMAND ...ARGS', 'Manage IP blocks' desc 'ip_blocks SUBCOMMAND ...ARGS', 'Manage IP blocks'
subcommand 'ip_blocks', Mastodon::IpBlocksCLI subcommand 'ip_blocks', IpBlocks
desc 'canonical_email_blocks SUBCOMMAND ...ARGS', 'Manage canonical e-mail blocks' desc 'canonical_email_blocks SUBCOMMAND ...ARGS', 'Manage canonical e-mail blocks'
subcommand 'canonical_email_blocks', Mastodon::CanonicalEmailBlocksCLI subcommand 'canonical_email_blocks', CanonicalEmailBlocks
desc 'maintenance SUBCOMMAND ...ARGS', 'Various maintenance utilities' desc 'maintenance SUBCOMMAND ...ARGS', 'Various maintenance utilities'
subcommand 'maintenance', Mastodon::MaintenanceCLI subcommand 'maintenance', Maintenance
option :dry_run, type: :boolean option :dry_run, type: :boolean
desc 'self-destruct', 'Erase the server from the federation' desc 'self-destruct', 'Erase the server from the federation'

View File

@ -1,13 +1,13 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tty-prompt' require 'tty-prompt'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class MaintenanceCLI < Thor class Maintenance < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,13 +1,13 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class MediaCLI < Thor class Media < Thor
include ActionView::Helpers::NumberHelper include ActionView::Helpers::NumberHelper
include CLIHelper include Helper
VALID_PATH_SEGMENTS_SIZE = [7, 10].freeze VALID_PATH_SEGMENTS_SIZE = [7, 10].freeze

View File

@ -1,14 +1,14 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tty-prompt' require 'tty-prompt'
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class PreviewCardsCLI < Thor class PreviewCards < Thor
include ActionView::Helpers::NumberHelper include ActionView::Helpers::NumberHelper
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class SearchCLI < Thor class Search < Thor
include CLIHelper include Helper
# Indices are sorted by amount of data to be expected in each, so that # Indices are sorted by amount of data to be expected in each, so that
# smaller indices can go online sooner # smaller indices can go online sooner

View File

@ -1,11 +1,11 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class RegistrationsCLI < Thor class Registrations < Thor
def self.exit_on_failure? def self.exit_on_failure?
true true
end end
@ -37,8 +37,8 @@ module Mastodon
end end
end end
class SettingsCLI < Thor class Settings < Thor
desc 'registrations SUBCOMMAND ...ARGS', 'Manage state of registrations' desc 'registrations SUBCOMMAND ...ARGS', 'Manage state of registrations'
subcommand 'registrations', RegistrationsCLI subcommand 'registrations', Registrations
end end
end end

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class StatusesCLI < Thor class Statuses < Thor
include CLIHelper include Helper
include ActionView::Helpers::NumberHelper include ActionView::Helpers::NumberHelper
def self.exit_on_failure? def self.exit_on_failure?

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../config/boot' require_relative '../../../config/boot'
require_relative '../../config/environment' require_relative '../../../config/environment'
require_relative 'cli_helper' require_relative 'helper'
module Mastodon module Mastodon::CLI
class UpgradeCLI < Thor class Upgrade < Thor
include CLIHelper include Helper
def self.exit_on_failure? def self.exit_on_failure?
true true

View File

@ -43,7 +43,7 @@ describe Api::V1::Accounts::NotesController do
it 'does not create account note' do it 'does not create account note' do
subject subject
expect(AccountNote.where(account_id: user.account.id, target_account_id: account.id).exists?).to be_falsey expect(AccountNote.where(account_id: user.account.id, target_account_id: account.id)).to_not exist
end end
end end
end end

View File

@ -15,23 +15,19 @@ RSpec.describe Api::V1::MediaController do
describe 'POST #create' do describe 'POST #create' do
describe 'with paperclip errors' do describe 'with paperclip errors' do
context 'when imagemagick cant identify the file type' do context 'when imagemagick cant identify the file type' do
before do it 'returns http 422' do
expect_any_instance_of(Account).to receive_message_chain(:media_attachments, :create!).and_raise(Paperclip::Errors::NotIdentifiedByImageMagickError) expect_any_instance_of(Account).to receive_message_chain(:media_attachments, :create!).and_raise(Paperclip::Errors::NotIdentifiedByImageMagickError)
post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') } post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') }
end
it 'returns http 422' do
expect(response).to have_http_status(422) expect(response).to have_http_status(422)
end end
end end
context 'when there is a generic error' do context 'when there is a generic error' do
before do it 'returns http 422' do
expect_any_instance_of(Account).to receive_message_chain(:media_attachments, :create!).and_raise(Paperclip::Error) expect_any_instance_of(Account).to receive_message_chain(:media_attachments, :create!).and_raise(Paperclip::Error)
post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') } post :create, params: { file: fixture_file_upload('attachment.jpg', 'image/jpeg') }
end
it 'returns http 422' do
expect(response).to have_http_status(500) expect(response).to have_http_status(500)
end end
end end

View File

@ -182,12 +182,10 @@ describe Settings::ApplicationsController do
describe 'regenerate' do describe 'regenerate' do
let(:token) { user.token_for_app(app) } let(:token) { user.token_for_app(app) }
before do it 'creates new token' do
expect(token).to_not be_nil expect(token).to_not be_nil
post :regenerate, params: { id: app.id } post :regenerate, params: { id: app.id }
end
it 'creates new token' do
expect(user.token_for_app(app)).to_not eql(token) expect(user.token_for_app(app)).to_not eql(token)
end end
end end

View File

@ -1,9 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'rails_helper' require 'rails_helper'
require 'mastodon/ip_blocks_cli' require 'mastodon/cli/ip_blocks'
RSpec.describe Mastodon::IpBlocksCLI do RSpec.describe Mastodon::CLI::IpBlocks do
let(:cli) { described_class.new } let(:cli) { described_class.new }
describe '#add' do describe '#add' do

View File

@ -1,9 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'rails_helper' require 'rails_helper'
require 'cli' require 'mastodon/cli/main'
describe Mastodon::CLI do describe Mastodon::CLI::Main do
describe 'version' do describe 'version' do
it 'returns the Mastodon version' do it 'returns the Mastodon version' do
expect { described_class.new.invoke(:version) }.to output( expect { described_class.new.invoke(:version) }.to output(

View File

@ -1,11 +1,11 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'rails_helper' require 'rails_helper'
require 'mastodon/settings_cli' require 'mastodon/cli/settings'
RSpec.describe Mastodon::SettingsCLI do RSpec.describe Mastodon::CLI::Settings do
describe 'subcommand "registrations"' do describe 'subcommand "registrations"' do
let(:cli) { Mastodon::RegistrationsCLI.new } let(:cli) { Mastodon::CLI::Registrations.new }
before do before do
Setting.registrations_mode = nil Setting.registrations_mode = nil

View File

@ -7,7 +7,7 @@ describe StatusFilter do
let(:status) { Fabricate(:status) } let(:status) { Fabricate(:status) }
context 'without an account' do context 'without an account' do
subject { described_class.new(status, nil) } subject(:filter) { described_class.new(status, nil) }
context 'when there are no connections' do context 'when there are no connections' do
it { is_expected.to_not be_filtered } it { is_expected.to_not be_filtered }
@ -22,16 +22,16 @@ describe StatusFilter do
end end
context 'when status policy does not allow show' do context 'when status policy does not allow show' do
before do it 'filters the status' do
expect_any_instance_of(StatusPolicy).to receive(:show?).and_return(false) expect_any_instance_of(StatusPolicy).to receive(:show?).and_return(false)
end
it { is_expected.to be_filtered } expect(filter).to be_filtered
end
end end
end end
context 'with real account' do context 'with real account' do
subject { described_class.new(status, account) } subject(:filter) { described_class.new(status, account) }
let(:account) { Fabricate(:account) } let(:account) { Fabricate(:account) }
@ -73,11 +73,11 @@ describe StatusFilter do
end end
context 'when status policy does not allow show' do context 'when status policy does not allow show' do
before do it 'filters the status' do
expect_any_instance_of(StatusPolicy).to receive(:show?).and_return(false) expect_any_instance_of(StatusPolicy).to receive(:show?).and_return(false)
end
it { is_expected.to be_filtered } expect(filter).to be_filtered
end
end end
end end
end end

View File

@ -115,19 +115,19 @@ RSpec.describe User do
it 'allows a non-blacklisted user to be created' do it 'allows a non-blacklisted user to be created' do
user = User.new(email: 'foo@example.com', account: account, password: password, agreement: true) user = User.new(email: 'foo@example.com', account: account, password: password, agreement: true)
expect(user.valid?).to be_truthy expect(user).to be_valid
end end
it 'does not allow a blacklisted user to be created' do it 'does not allow a blacklisted user to be created' do
user = User.new(email: 'foo@mvrht.com', account: account, password: password, agreement: true) user = User.new(email: 'foo@mvrht.com', account: account, password: password, agreement: true)
expect(user.valid?).to be_falsey expect(user).to_not be_valid
end end
it 'does not allow a subdomain blacklisted user to be created' do it 'does not allow a subdomain blacklisted user to be created' do
user = User.new(email: 'foo@mvrht.com.topdomain.tld', account: account, password: password, agreement: true) user = User.new(email: 'foo@mvrht.com.topdomain.tld', account: account, password: password, agreement: true)
expect(user.valid?).to be_falsey expect(user).to_not be_valid
end end
end end
@ -350,17 +350,17 @@ RSpec.describe User do
it 'does not allow a user to be created unless they are whitelisted' do it 'does not allow a user to be created unless they are whitelisted' do
user = User.new(email: 'foo@example.com', account: account, password: password, agreement: true) user = User.new(email: 'foo@example.com', account: account, password: password, agreement: true)
expect(user.valid?).to be_falsey expect(user).to_not be_valid
end end
it 'allows a user to be created if they are whitelisted' do it 'allows a user to be created if they are whitelisted' do
user = User.new(email: 'foo@mastodon.space', account: account, password: password, agreement: true) user = User.new(email: 'foo@mastodon.space', account: account, password: password, agreement: true)
expect(user.valid?).to be_truthy expect(user).to be_valid
end end
it 'does not allow a user with a whitelisted top domain as subdomain in their email address to be created' do it 'does not allow a user with a whitelisted top domain as subdomain in their email address to be created' do
user = User.new(email: 'foo@mastodon.space.userdomain.com', account: account, password: password, agreement: true) user = User.new(email: 'foo@mastodon.space.userdomain.com', account: account, password: password, agreement: true)
expect(user.valid?).to be_falsey expect(user).to_not be_valid
end end
context do context do
@ -374,7 +374,7 @@ RSpec.describe User do
Rails.configuration.x.email_domains_blacklist = 'blacklisted.mastodon.space' Rails.configuration.x.email_domains_blacklist = 'blacklisted.mastodon.space'
user = User.new(email: 'foo@blacklisted.mastodon.space', account: account, password: password) user = User.new(email: 'foo@blacklisted.mastodon.space', account: account, password: password)
expect(user.valid?).to be_falsey expect(user).to_not be_valid
end end
end end
end end

View File

@ -0,0 +1,26 @@
# frozen_string_literal: true
require 'rails_helper'
describe 'Backups' do
include RoutingHelper
describe 'GET backups#download' do
let(:user) { Fabricate(:user) }
let(:backup) { Fabricate(:backup, user: user) }
before do
sign_in user
end
it 'Downloads a user backup' do
get download_backup_path(backup)
expect(response).to redirect_to(backup_dump_url)
end
def backup_dump_url
full_asset_url(backup.dump.url)
end
end
end

View File

@ -48,7 +48,7 @@ RSpec.describe PostStatusService, type: :service do
expect(status.params['text']).to eq 'Hi future!' expect(status.params['text']).to eq 'Hi future!'
expect(status.params['media_ids']).to eq [media.id] expect(status.params['media_ids']).to eq [media.id]
expect(media.reload.status).to be_nil expect(media.reload.status).to be_nil
expect(Status.where(text: 'Hi future!').exists?).to be_falsey expect(Status.where(text: 'Hi future!')).to_not exist
end end
it 'does not change statuses count' do it 'does not change statuses count' do