Compare commits
	
		
			167 Commits
		
	
	
		
			bugfix/lda
			...
			production
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b916182bc1 | |||
| 6110ef33a0 | |||
| 10b8caaa5c | |||
| 
						 | 
					a5b4a2b7e7 | ||
| 
						 | 
					d4bf22b632 | ||
| 
						 | 
					4fb4721072 | ||
| 
						 | 
					df974a912b | ||
| 
						 | 
					6cd9bd6ae1 | ||
| 
						 | 
					9b6219c48f | ||
| 
						 | 
					88b2d6eca5 | ||
| 
						 | 
					846f59c6e9 | ||
| 
						 | 
					17f69c0002 | ||
| 
						 | 
					1e87634a43 | ||
| 
						 | 
					5fd7cd79e0 | ||
| 
						 | 
					fcae9435ec | ||
| 
						 | 
					55408f8085 | ||
| 
						 | 
					3f75c6f048 | ||
| 
						 | 
					bfc287fd6b | ||
| 
						 | 
					19ed22dc58 | ||
| 
						 | 
					520b2086af | ||
| 
						 | 
					c93aacafde | ||
| 
						 | 
					9740c7eaea | ||
| 
						 | 
					8ab0ca7d64 | ||
| 
						 | 
					7920aa59e8 | ||
| 
						 | 
					943792c187 | ||
| 
						 | 
					186f916192 | ||
| 
						 | 
					f9c41ae43b | ||
| 
						 | 
					b8edc95e8a | ||
| 
						 | 
					16213a678d | ||
| 
						 | 
					a8dd32102f | ||
| 
						 | 
					6fc07ff31f | ||
| 
						 | 
					997b021b69 | ||
| 
						 | 
					2865bfadaf | ||
| 
						 | 
					8c72e80019 | ||
| 
						 | 
					8cf78825a2 | ||
| 
						 | 
					67b2e62331 | ||
| 
						 | 
					56b7d1a7b6 | ||
| 
						 | 
					51ef619140 | ||
| 
						 | 
					e69780ec59 | ||
| 
						 | 
					c3be5a3d2e | ||
| 
						 | 
					86807e4799 | ||
| 
						 | 
					0143c9d3e1 | ||
| 
						 | 
					ab3f9852f2 | ||
| 
						 | 
					7af69f5cf5 | ||
| 
						 | 
					f784213c64 | ||
| 
						 | 
					6536d96d1b | ||
| 
						 | 
					ed8e4bab4c | ||
| 
						 | 
					bdb6650ebc | ||
| 
						 | 
					f3ad918950 | ||
| 
						 | 
					9a7802655f | ||
| 
						 | 
					328a9b8157 | ||
| 
						 | 
					4fd22acb4a | ||
| 
						 | 
					28b666b0d5 | ||
| 
						 | 
					fbb07893b8 | ||
| 
						 | 
					c5d56de98d | ||
| 
						 | 
					0e4e98fad1 | ||
| 
						 | 
					15de520201 | ||
| 
						 | 
					684f99908f | ||
| 
						 | 
					e4ec4ce217 | ||
| 
						 | 
					870ee80fd3 | ||
| 
						 | 
					76a37bd040 | ||
| 
						 | 
					7c8ca0c6d6 | ||
| 
						 | 
					f1700523f1 | ||
| 
						 | 
					0b0c7af2c1 | ||
| 
						 | 
					1a33d348d0 | ||
| 
						 | 
					6d43b63275 | ||
| 
						 | 
					ae2dce813a | ||
| 
						 | 
					b7230cd759 | ||
| 
						 | 
					a6641f828b | ||
| 
						 | 
					4633bb8ce0 | ||
| 
						 | 
					1ab050eb52 | ||
| 
						 | 
					4eb98ef755 | ||
| 
						 | 
					7a22999f92 | ||
| 
						 | 
					c5c464804d | ||
| 
						 | 
					779237f054 | ||
| 
						 | 
					b377f82b1d | ||
| 
						 | 
					6fe2a47357 | ||
| 
						 | 
					2dbf176d23 | ||
| 
						 | 
					499bc716a5 | ||
| 
						 | 
					3837ec2227 | ||
| 
						 | 
					1998c561b2 | ||
| 
						 | 
					c0a9db3611 | ||
| 
						 | 
					01caa18e5b | ||
| 
						 | 
					c609b726cb | ||
| 
						 | 
					4d96d716c4 | ||
| 
						 | 
					3ecc991f63 | ||
| 
						 | 
					8f2dac0567 | ||
| 
						 | 
					dfc8fcc6f0 | ||
| 
						 | 
					e8c5754142 | ||
| 
						 | 
					0a01bc01d2 | ||
| 
						 | 
					a12b7551cf | ||
| 
						 | 
					7abc61887f | ||
| 
						 | 
					279be07679 | ||
| 
						 | 
					d7875adad2 | ||
| 
						 | 
					90371a4fc4 | ||
| 
						 | 
					71b60b09f4 | ||
| 
						 | 
					4b8fe9df73 | ||
| 
						 | 
					7b9496322f | ||
| 
						 | 
					09115731d6 | ||
| 
						 | 
					e11100d782 | ||
| 
						 | 
					252ea2fc67 | ||
| 
						 | 
					8d02e58ff4 | ||
| 
						 | 
					1076a6cd62 | ||
| 
						 | 
					54a07731d1 | ||
| 
						 | 
					81d7cfd544 | ||
| 
						 | 
					e6f4c91c5c | ||
| 
						 | 
					de86e822f4 | ||
| 
						 | 
					4c38706474 | ||
| 
						 | 
					4fc2523546 | ||
| 
						 | 
					d5bc10b711 | ||
| 
						 | 
					c66ade7de8 | ||
| 
						 | 
					bece853e3c | ||
| 
						 | 
					700ae1f918 | ||
| 
						 | 
					13205b54fd | ||
| 
						 | 
					8be33d4316 | ||
| 
						 | 
					cdedae6d63 | ||
| 
						 | 
					aa69ca74ed | ||
| 
						 | 
					156d32689b | ||
| 
						 | 
					ef149674f0 | ||
| 
						 | 
					eea2654236 | ||
| 
						 | 
					74dd325112 | ||
| 
						 | 
					790fd1374f | ||
| 
						 | 
					a1f7d2d19a | ||
| 
						 | 
					4262cfbe41 | ||
| 
						 | 
					bcfc3b3f65 | ||
| 
						 | 
					6dcccd325f | ||
| 
						 | 
					5a33b81479 | ||
| 
						 | 
					8f55224307 | ||
| 
						 | 
					f71b7943f9 | ||
| 
						 | 
					2e2936eb64 | ||
| 
						 | 
					f4b0a10490 | ||
| 
						 | 
					b9b8eafc98 | ||
| 
						 | 
					88fc73dbbc | ||
| 
						 | 
					aba0c5abd9 | ||
| 
						 | 
					ffcf2c691e | ||
| 
						 | 
					a9588065b2 | ||
| 
						 | 
					3e21780cf1 | ||
| 
						 | 
					0619ec1592 | ||
| 
						 | 
					451884a36b | ||
| 
						 | 
					aa4c4f5737 | ||
| 
						 | 
					82502f54ac | ||
| 
						 | 
					16dcdfcb4e | ||
| 
						 | 
					7c6f41039d | ||
| 
						 | 
					6ba4b208b8 | ||
| 
						 | 
					8a6fa34040 | ||
| 
						 | 
					cfd2c6e28d | ||
| 
						 | 
					7b86708980 | ||
| 
						 | 
					ccb980beac | ||
| 
						 | 
					ac32f4b3c3 | ||
| 
						 | 
					2cd969cca7 | ||
| 
						 | 
					4e420d8459 | ||
| 
						 | 
					8bc5fe204e | ||
| 
						 | 
					4e5791bba1 | ||
| 
						 | 
					11f0b6bc7e | ||
| 
						 | 
					91047c36b5 | ||
| 
						 | 
					6a3d09dde2 | ||
| 
						 | 
					aed930b629 | ||
| 
						 | 
					2191858cff | ||
| 
						 | 
					916b5bd4ad | ||
| 
						 | 
					12bbccbe82 | ||
| 
						 | 
					6c25730024 | ||
| 
						 | 
					fa98c9b077 | ||
| 
						 | 
					58477a6163 | ||
| 
						 | 
					9cb7fa57f6 | ||
| 
						 | 
					8b382b8df7 | ||
| 
						 | 
					40702a81fa | ||
| 
						 | 
					238a17b145 | 
@ -1,9 +1,7 @@
 | 
			
		||||
[production]
 | 
			
		||||
defaults
 | 
			
		||||
> 0.2%
 | 
			
		||||
ios >= 15.6
 | 
			
		||||
not IE 11
 | 
			
		||||
not dead
 | 
			
		||||
not OperaMini all
 | 
			
		||||
 | 
			
		||||
[development]
 | 
			
		||||
supports es6-module
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ FROM mcr.microsoft.com/devcontainers/ruby:1-3.2-bullseye
 | 
			
		||||
# Install Rails
 | 
			
		||||
# RUN gem install rails webdrivers
 | 
			
		||||
 | 
			
		||||
ARG NODE_VERSION="20"
 | 
			
		||||
ARG NODE_VERSION="16"
 | 
			
		||||
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"
 | 
			
		||||
 | 
			
		||||
# [Optional] Uncomment this section to install additional OS packages.
 | 
			
		||||
@ -15,6 +15,6 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
 | 
			
		||||
RUN gem install foreman
 | 
			
		||||
 | 
			
		||||
# [Optional] Uncomment this line to install global node packages.
 | 
			
		||||
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && corepack enable" 2>&1
 | 
			
		||||
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g yarn" 2>&1
 | 
			
		||||
 | 
			
		||||
COPY welcome-message.txt /usr/local/etc/vscode-dev-containers/first-run-notice.txt
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,7 @@ services:
 | 
			
		||||
        hard: -1
 | 
			
		||||
 | 
			
		||||
  libretranslate:
 | 
			
		||||
    image: libretranslate/libretranslate:v1.5.6
 | 
			
		||||
    image: libretranslate/libretranslate:v1.3.11
 | 
			
		||||
    restart: unless-stopped
 | 
			
		||||
    volumes:
 | 
			
		||||
      - lt-data:/home/libretranslate/.local
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,7 @@ bundle install
 | 
			
		||||
git checkout -- Gemfile.lock
 | 
			
		||||
 | 
			
		||||
# Fetch Javascript dependencies
 | 
			
		||||
corepack prepare
 | 
			
		||||
yarn install --immutable
 | 
			
		||||
yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
# [re]create, migrate, and seed the test database
 | 
			
		||||
RAILS_ENV=test ./bin/rails db:setup
 | 
			
		||||
@ -24,4 +23,4 @@ RAILS_ENV=development ./bin/rails db:setup
 | 
			
		||||
RAILS_ENV=development ./bin/rails assets:precompile
 | 
			
		||||
 | 
			
		||||
# Precompile assets for test
 | 
			
		||||
RAILS_ENV=test ./bin/rails assets:precompile
 | 
			
		||||
RAILS_ENV=test NODE_ENV=tests ./bin/rails assets:precompile
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,6 @@
 | 
			
		||||
public/system
 | 
			
		||||
public/assets
 | 
			
		||||
public/packs
 | 
			
		||||
public/packs-test
 | 
			
		||||
node_modules
 | 
			
		||||
neo4j
 | 
			
		||||
vendor/bundle
 | 
			
		||||
 | 
			
		||||
@ -1,4 +0,0 @@
 | 
			
		||||
# Required by ActiveRecord encryption feature
 | 
			
		||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
 | 
			
		||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
 | 
			
		||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
 | 
			
		||||
@ -1,10 +1,5 @@
 | 
			
		||||
# In test, compile the NodeJS code as if we are in production
 | 
			
		||||
NODE_ENV=production
 | 
			
		||||
# Node.js
 | 
			
		||||
NODE_ENV=tests
 | 
			
		||||
# Federation
 | 
			
		||||
LOCAL_DOMAIN=cb6e6126.ngrok.io
 | 
			
		||||
LOCAL_HTTPS=true
 | 
			
		||||
 | 
			
		||||
# Required by ActiveRecord encryption feature
 | 
			
		||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
 | 
			
		||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
 | 
			
		||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										50
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								.eslintrc.js
									
									
									
									
									
								
							@ -1,7 +1,4 @@
 | 
			
		||||
// @ts-check
 | 
			
		||||
const { defineConfig } = require('eslint-define-config');
 | 
			
		||||
 | 
			
		||||
module.exports = defineConfig({
 | 
			
		||||
module.exports = {
 | 
			
		||||
  root: true,
 | 
			
		||||
 | 
			
		||||
  extends: [
 | 
			
		||||
@ -12,6 +9,7 @@ module.exports = defineConfig({
 | 
			
		||||
    'plugin:import/recommended',
 | 
			
		||||
    'plugin:promise/recommended',
 | 
			
		||||
    'plugin:jsdoc/recommended',
 | 
			
		||||
    'plugin:prettier/recommended',
 | 
			
		||||
  ],
 | 
			
		||||
 | 
			
		||||
  env: {
 | 
			
		||||
@ -65,9 +63,7 @@ module.exports = defineConfig({
 | 
			
		||||
    'consistent-return': 'error',
 | 
			
		||||
    'dot-notation': 'error',
 | 
			
		||||
    eqeqeq: ['error', 'always', { 'null': 'ignore' }],
 | 
			
		||||
    'indent': ['error', 2],
 | 
			
		||||
    'jsx-quotes': ['error', 'prefer-single'],
 | 
			
		||||
    'semi': ['error', 'always'],
 | 
			
		||||
    'no-case-declarations': 'off',
 | 
			
		||||
    'no-catch-shadow': 'error',
 | 
			
		||||
    'no-console': [
 | 
			
		||||
@ -120,10 +116,11 @@ module.exports = defineConfig({
 | 
			
		||||
    'react/jsx-uses-react': 'off', // not needed with new JSX transform
 | 
			
		||||
    'react/jsx-wrap-multilines': 'error',
 | 
			
		||||
    'react/no-deprecated': 'off',
 | 
			
		||||
    'react/no-unknown-property': 'off',
 | 
			
		||||
    'react/react-in-jsx-scope': 'off', // not needed with new JSX transform
 | 
			
		||||
    'react/self-closing-comp': 'error',
 | 
			
		||||
 | 
			
		||||
    // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/v6.8.0/src/index.js#L46
 | 
			
		||||
    // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/src/index.js
 | 
			
		||||
    'jsx-a11y/accessible-emoji': 'warn',
 | 
			
		||||
    'jsx-a11y/click-events-have-key-events': 'off',
 | 
			
		||||
    'jsx-a11y/label-has-associated-control': 'off',
 | 
			
		||||
@ -165,7 +162,7 @@ module.exports = defineConfig({
 | 
			
		||||
    //   },
 | 
			
		||||
    // ],
 | 
			
		||||
    'jsx-a11y/no-noninteractive-tabindex': 'off',
 | 
			
		||||
    'jsx-a11y/no-onchange': 'off',
 | 
			
		||||
    'jsx-a11y/no-onchange': 'warn',
 | 
			
		||||
    // recommended is full 'error'
 | 
			
		||||
    'jsx-a11y/no-static-element-interactions': [
 | 
			
		||||
      'warn',
 | 
			
		||||
@ -176,7 +173,7 @@ module.exports = defineConfig({
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
 | 
			
		||||
    // See https://github.com/import-js/eslint-plugin-import/blob/v2.29.1/config/recommended.js
 | 
			
		||||
    // See https://github.com/import-js/eslint-plugin-import/blob/main/config/recommended.js
 | 
			
		||||
    'import/extensions': [
 | 
			
		||||
      'error',
 | 
			
		||||
      'always',
 | 
			
		||||
@ -195,7 +192,6 @@ module.exports = defineConfig({
 | 
			
		||||
      'error',
 | 
			
		||||
      {
 | 
			
		||||
        devDependencies: [
 | 
			
		||||
          '.eslintrc.js',
 | 
			
		||||
          'config/webpack/**',
 | 
			
		||||
          'app/javascript/mastodon/performance.js',
 | 
			
		||||
          'app/javascript/mastodon/test_setup.js',
 | 
			
		||||
@ -239,13 +235,13 @@ module.exports = defineConfig({
 | 
			
		||||
          },
 | 
			
		||||
          // Common React utilities
 | 
			
		||||
          {
 | 
			
		||||
            pattern: '{classnames,react-helmet,react-router,react-router-dom}',
 | 
			
		||||
            pattern: '{classnames,react-helmet,react-router-dom}',
 | 
			
		||||
            group: 'external',
 | 
			
		||||
            position: 'before',
 | 
			
		||||
          },
 | 
			
		||||
          // Immutable / Redux / data store
 | 
			
		||||
          {
 | 
			
		||||
            pattern: '{immutable,@reduxjs/toolkit,react-redux,react-immutable-proptypes,react-immutable-pure-component}',
 | 
			
		||||
            pattern: '{immutable,react-redux,react-immutable-proptypes,react-immutable-pure-component,reselect}',
 | 
			
		||||
            group: 'external',
 | 
			
		||||
            position: 'before',
 | 
			
		||||
          },
 | 
			
		||||
@ -283,6 +279,7 @@ module.exports = defineConfig({
 | 
			
		||||
    'formatjs/no-id': 'off', // IDs are used for translation keys
 | 
			
		||||
    'formatjs/no-invalid-icu': 'error',
 | 
			
		||||
    'formatjs/no-literal-string-in-jsx': 'off', // Should be looked at, but mainly flagging punctuation outside of strings
 | 
			
		||||
    'formatjs/no-multiple-plurals': 'off', // Only used by hashtag.jsx
 | 
			
		||||
    'formatjs/no-multiple-whitespaces': 'error',
 | 
			
		||||
    'formatjs/no-offset': 'error',
 | 
			
		||||
    'formatjs/no-useless-message': 'error',
 | 
			
		||||
@ -301,7 +298,6 @@ module.exports = defineConfig({
 | 
			
		||||
  overrides: [
 | 
			
		||||
    {
 | 
			
		||||
      files: [
 | 
			
		||||
        '.eslintrc.js',
 | 
			
		||||
        '*.config.js',
 | 
			
		||||
        '.*rc.js',
 | 
			
		||||
        'ide-helper.js',
 | 
			
		||||
@ -338,6 +334,7 @@ module.exports = defineConfig({
 | 
			
		||||
        'plugin:import/typescript',
 | 
			
		||||
        'plugin:promise/recommended',
 | 
			
		||||
        'plugin:jsdoc/recommended-typescript',
 | 
			
		||||
        'plugin:prettier/recommended',
 | 
			
		||||
      ],
 | 
			
		||||
 | 
			
		||||
      parserOptions: {
 | 
			
		||||
@ -346,24 +343,13 @@ module.exports = defineConfig({
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      rules: {
 | 
			
		||||
        // Disable formatting rules that have been enabled in the base config
 | 
			
		||||
        'indent': 'off',
 | 
			
		||||
 | 
			
		||||
        'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
 | 
			
		||||
 | 
			
		||||
        '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'],
 | 
			
		||||
        '@typescript-eslint/consistent-type-exports': 'error',
 | 
			
		||||
        '@typescript-eslint/consistent-type-imports': 'error',
 | 
			
		||||
        "@typescript-eslint/prefer-nullish-coalescing": ['error', { ignorePrimitives: { boolean: true } }],
 | 
			
		||||
        "@typescript-eslint/no-restricted-imports": [
 | 
			
		||||
          "warn",
 | 
			
		||||
          {
 | 
			
		||||
            "name": "react-redux",
 | 
			
		||||
            "importNames": ["useSelector", "useDispatch"],
 | 
			
		||||
            "message": "Use typed hooks `useAppDispatch` and `useAppSelector` instead."
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "@typescript-eslint/restrict-template-expressions": ['warn', { allowNumber: true }],
 | 
			
		||||
        "@typescript-eslint/prefer-nullish-coalescing": ['error', {ignorePrimitives: {boolean: true}}],
 | 
			
		||||
 | 
			
		||||
        'jsdoc/require-jsdoc': 'off',
 | 
			
		||||
 | 
			
		||||
        // Those rules set stricter rules for TS files
 | 
			
		||||
@ -385,6 +371,14 @@ module.exports = defineConfig({
 | 
			
		||||
      env: {
 | 
			
		||||
        jest: true,
 | 
			
		||||
      },
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      files: [
 | 
			
		||||
        'streaming/**/*',
 | 
			
		||||
      ],
 | 
			
		||||
      rules: {
 | 
			
		||||
        'import/no-commonjs': 'off',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
patreon: mastodon
 | 
			
		||||
open_collective: mastodon
 | 
			
		||||
custom: https://sponsor.joinmastodon.org
 | 
			
		||||
							
								
								
									
										42
									
								
								.github/actions/setup-javascript/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								.github/actions/setup-javascript/action.yml
									
									
									
									
										vendored
									
									
								
							@ -1,42 +0,0 @@
 | 
			
		||||
name: 'Setup Javascript'
 | 
			
		||||
description: 'Setup a Javascript environment ready to run the Mastodon code'
 | 
			
		||||
inputs:
 | 
			
		||||
  onlyProduction:
 | 
			
		||||
    description: Only install production dependencies
 | 
			
		||||
    default: 'false'
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: 'composite'
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Set up Node.js
 | 
			
		||||
      uses: actions/setup-node@v4
 | 
			
		||||
      with:
 | 
			
		||||
        node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
    # The following is needed because we can not use `cache: true` for `setup-node`, as it does not support Corepack yet and mess up with the cache location if ran after Node is installed
 | 
			
		||||
    - name: Enable corepack
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: corepack enable
 | 
			
		||||
 | 
			
		||||
    - name: Get yarn cache directory path
 | 
			
		||||
      id: yarn-cache-dir-path
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT
 | 
			
		||||
 | 
			
		||||
    - uses: actions/cache@v4
 | 
			
		||||
      id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
 | 
			
		||||
        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
 | 
			
		||||
        restore-keys: |
 | 
			
		||||
          ${{ runner.os }}-yarn-
 | 
			
		||||
 | 
			
		||||
    - name: Install all yarn packages
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: yarn install --immutable
 | 
			
		||||
      if: inputs.onlyProduction == 'false'
 | 
			
		||||
 | 
			
		||||
    - name: Install all production yarn packages
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: yarn workspaces focus --production
 | 
			
		||||
      if: inputs.onlyProduction != 'false'
 | 
			
		||||
							
								
								
									
										23
									
								
								.github/actions/setup-ruby/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								.github/actions/setup-ruby/action.yml
									
									
									
									
										vendored
									
									
								
							@ -1,23 +0,0 @@
 | 
			
		||||
name: 'Setup RUby'
 | 
			
		||||
description: 'Setup a Ruby environment ready to run the Mastodon code'
 | 
			
		||||
inputs:
 | 
			
		||||
  ruby-version:
 | 
			
		||||
    description: The Ruby version to install
 | 
			
		||||
    default: '.ruby-version'
 | 
			
		||||
  additional-system-dependencies:
 | 
			
		||||
    description: 'Additional packages to install'
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: 'composite'
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Install system dependencies
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        sudo apt-get update
 | 
			
		||||
        sudo apt-get install -y libicu-dev libidn11-dev ${{ inputs.additional-system-dependencies }}
 | 
			
		||||
 | 
			
		||||
    - name: Set up Ruby
 | 
			
		||||
      uses: ruby/setup-ruby@v1
 | 
			
		||||
      with:
 | 
			
		||||
        ruby-version: ${{ inputs.ruby-version }}
 | 
			
		||||
        bundler-cache: true
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/codecov.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/codecov.yml
									
									
									
									
										vendored
									
									
								
							@ -1,11 +0,0 @@
 | 
			
		||||
comment: false # Do not leave PR comments
 | 
			
		||||
coverage:
 | 
			
		||||
  status:
 | 
			
		||||
    project:
 | 
			
		||||
      default:
 | 
			
		||||
        # Github status check is not blocking
 | 
			
		||||
        informational: true
 | 
			
		||||
    patch:
 | 
			
		||||
      default:
 | 
			
		||||
        # Github status check is not blocking
 | 
			
		||||
        informational: true
 | 
			
		||||
							
								
								
									
										30
									
								
								.github/renovate.json5
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.github/renovate.json5
									
									
									
									
										vendored
									
									
								
							@ -3,6 +3,7 @@
 | 
			
		||||
  extends: [
 | 
			
		||||
    'config:recommended',
 | 
			
		||||
    ':labels(dependencies)',
 | 
			
		||||
    ':maintainLockFilesMonthly', // update non-direct dependencies monthly
 | 
			
		||||
    ':prConcurrentLimitNone', // Remove limit for open PRs at any time.
 | 
			
		||||
    ':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour.
 | 
			
		||||
  ],
 | 
			
		||||
@ -12,7 +13,6 @@
 | 
			
		||||
  // If we do not want a package to be grouped with others, we need to set its groupName
 | 
			
		||||
  // to `null` after any other rule set it to something.
 | 
			
		||||
  dependencyDashboardHeader: 'This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. Before approving any upgrade: read the description and comments in the [`renovate.json5` file](https://github.com/mastodon/mastodon/blob/main/.github/renovate.json5).',
 | 
			
		||||
  postUpdateOptions: ['yarnDedupeHighest'],
 | 
			
		||||
  packageRules: [
 | 
			
		||||
    {
 | 
			
		||||
      // Require Dependency Dashboard Approval for major version bumps of these node packages
 | 
			
		||||
@ -22,7 +22,6 @@
 | 
			
		||||
        'react-hotkeys', // Requires code changes
 | 
			
		||||
 | 
			
		||||
        // Requires Webpacker upgrade or replacement
 | 
			
		||||
        '@svgr/webpack',
 | 
			
		||||
        '@types/webpack',
 | 
			
		||||
        'babel-loader',
 | 
			
		||||
        'compression-webpack-plugin',
 | 
			
		||||
@ -50,6 +49,7 @@
 | 
			
		||||
      matchManagers: ['bundler'],
 | 
			
		||||
      matchPackageNames: [
 | 
			
		||||
        'rack', // Needs to be synced with Rails version
 | 
			
		||||
        'sprockets', // Requires manual upgrade https://github.com/rails/sprockets/blob/master/UPGRADING.md#guide-to-upgrading-from-sprockets-3x-to-4x
 | 
			
		||||
        'strong_migrations', // Requires manual upgrade
 | 
			
		||||
        'sidekiq', // Requires manual upgrade
 | 
			
		||||
        'sidekiq-unique-jobs', // Requires manual upgrades and sync with Sidekiq version
 | 
			
		||||
@ -99,16 +99,6 @@
 | 
			
		||||
      matchUpdateTypes: ['patch', 'minor'],
 | 
			
		||||
      groupName: 'eslint (non-major)',
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      // Group actions/*-artifact in the same PR
 | 
			
		||||
      matchManagers: ['github-actions'],
 | 
			
		||||
      matchPackageNames: [
 | 
			
		||||
        'actions/download-artifact',
 | 
			
		||||
        'actions/upload-artifact',
 | 
			
		||||
      ],
 | 
			
		||||
      matchUpdateTypes: ['major'],
 | 
			
		||||
      groupName: 'artifact actions (major)',
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      // Update @types/* packages every week, with one grouped PR
 | 
			
		||||
      matchPackagePrefixes: '@types/',
 | 
			
		||||
@ -125,22 +115,6 @@
 | 
			
		||||
      ],
 | 
			
		||||
      groupName: null, // We dont want them to belong to any group
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      // Group all RuboCop packages with `rubocop` in the same PR
 | 
			
		||||
      matchManagers: ['bundler'],
 | 
			
		||||
      matchPackageNames: ['rubocop'],
 | 
			
		||||
      matchPackagePrefixes: ['rubocop-'],
 | 
			
		||||
      matchUpdateTypes: ['patch', 'minor'],
 | 
			
		||||
      groupName: 'RuboCop (non-major)',
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      // Group all RSpec packages with `rspec` in the same PR
 | 
			
		||||
      matchManagers: ['bundler'],
 | 
			
		||||
      matchPackageNames: ['rspec'],
 | 
			
		||||
      matchPackagePrefixes: ['rspec-'],
 | 
			
		||||
      matchUpdateTypes: ['patch', 'minor'],
 | 
			
		||||
      groupName: 'RSpec (non-major)',
 | 
			
		||||
    },
 | 
			
		||||
    // Add labels depending on package manager
 | 
			
		||||
    { matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
 | 
			
		||||
    { matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								.github/workflows/build-container-image.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/build-container-image.yml
									
									
									
									
										vendored
									
									
								
							@ -21,8 +21,6 @@ on:
 | 
			
		||||
        type: string
 | 
			
		||||
      labels:
 | 
			
		||||
        type: string
 | 
			
		||||
      file_to_build:
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build-image:
 | 
			
		||||
@ -31,10 +29,10 @@ jobs:
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - uses: docker/setup-qemu-action@v3
 | 
			
		||||
      - uses: docker/setup-qemu-action@v2
 | 
			
		||||
        if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder
 | 
			
		||||
 | 
			
		||||
      - uses: docker/setup-buildx-action@v3
 | 
			
		||||
      - uses: docker/setup-buildx-action@v2
 | 
			
		||||
        id: buildx
 | 
			
		||||
        if: ${{ !(inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')) }}
 | 
			
		||||
 | 
			
		||||
@ -43,7 +41,7 @@ jobs:
 | 
			
		||||
        run: |
 | 
			
		||||
          docker run --rm -d --name buildkitd -p 1234:1234 --privileged moby/buildkit:latest --addr tcp://0.0.0.0:1234
 | 
			
		||||
 | 
			
		||||
      - uses: docker/setup-buildx-action@v3
 | 
			
		||||
      - uses: docker/setup-buildx-action@v2
 | 
			
		||||
        id: buildx-native
 | 
			
		||||
        if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')
 | 
			
		||||
        with:
 | 
			
		||||
@ -63,20 +61,20 @@ jobs:
 | 
			
		||||
 | 
			
		||||
      - name: Log in to Docker Hub
 | 
			
		||||
        if: contains(inputs.push_to_images, 'tootsuite')
 | 
			
		||||
        uses: docker/login-action@v3
 | 
			
		||||
        uses: docker/login-action@v2
 | 
			
		||||
        with:
 | 
			
		||||
          username: ${{ secrets.DOCKERHUB_USERNAME }}
 | 
			
		||||
          password: ${{ secrets.DOCKERHUB_TOKEN }}
 | 
			
		||||
 | 
			
		||||
      - name: Log in to the Github Container registry
 | 
			
		||||
        if: contains(inputs.push_to_images, 'ghcr.io')
 | 
			
		||||
        uses: docker/login-action@v3
 | 
			
		||||
        uses: docker/login-action@v2
 | 
			
		||||
        with:
 | 
			
		||||
          registry: ghcr.io
 | 
			
		||||
          username: ${{ github.actor }}
 | 
			
		||||
          password: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 | 
			
		||||
      - uses: docker/metadata-action@v5
 | 
			
		||||
      - uses: docker/metadata-action@v4
 | 
			
		||||
        id: meta
 | 
			
		||||
        if: ${{ inputs.push_to_images != '' }}
 | 
			
		||||
        with:
 | 
			
		||||
@ -85,10 +83,9 @@ jobs:
 | 
			
		||||
          tags: ${{ inputs.tags }}
 | 
			
		||||
          labels: ${{ inputs.labels }}
 | 
			
		||||
 | 
			
		||||
      - uses: docker/build-push-action@v5
 | 
			
		||||
      - uses: docker/build-push-action@v4
 | 
			
		||||
        with:
 | 
			
		||||
          context: .
 | 
			
		||||
          file: ${{ inputs.file_to_build }}
 | 
			
		||||
          build-args: |
 | 
			
		||||
            MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }}
 | 
			
		||||
            MASTODON_VERSION_METADATA=${{ inputs.version_metadata }}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										24
									
								
								.github/workflows/build-nightly.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/build-nightly.yml
									
									
									
									
										vendored
									
									
								
							@ -11,7 +11,6 @@ permissions:
 | 
			
		||||
jobs:
 | 
			
		||||
  compute-suffix:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: github.repository == 'mastodon/mastodon'
 | 
			
		||||
    steps:
 | 
			
		||||
      - id: version_vars
 | 
			
		||||
        env:
 | 
			
		||||
@ -25,7 +24,6 @@ jobs:
 | 
			
		||||
    needs: compute-suffix
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      cache: false
 | 
			
		||||
@ -42,25 +40,3 @@ jobs:
 | 
			
		||||
        type=raw,value=nightly
 | 
			
		||||
        type=schedule,pattern=${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
  build-image-streaming:
 | 
			
		||||
    needs: compute-suffix
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: streaming/Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      cache: false
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
        tootsuite/mastodon-streaming
 | 
			
		||||
        ghcr.io/mastodon/mastodon-streaming
 | 
			
		||||
      version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
      labels: |
 | 
			
		||||
        org.opencontainers.image.description=Nightly build image used for testing purposes
 | 
			
		||||
      flavor: |
 | 
			
		||||
        latest=auto
 | 
			
		||||
      tags: |
 | 
			
		||||
        type=raw,value=edge
 | 
			
		||||
        type=raw,value=nightly
 | 
			
		||||
        type=schedule,pattern=${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								.github/workflows/build-push-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/build-push-pr.yml
									
									
									
									
										vendored
									
									
								
							@ -29,7 +29,6 @@ jobs:
 | 
			
		||||
    needs: compute-suffix
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
@ -40,19 +39,3 @@ jobs:
 | 
			
		||||
      tags: |
 | 
			
		||||
        type=ref,event=pr
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
  build-image-streaming:
 | 
			
		||||
    needs: compute-suffix
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: streaming/Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
        ghcr.io/mastodon/mastodon-streaming
 | 
			
		||||
      version_metadata: ${{ needs.compute-suffix.outputs.metadata }}
 | 
			
		||||
      flavor: |
 | 
			
		||||
        latest=auto
 | 
			
		||||
      tags: |
 | 
			
		||||
        type=ref,event=pr
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								.github/workflows/build-releases.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/build-releases.yml
									
									
									
									
										vendored
									
									
								
							@ -12,7 +12,6 @@ jobs:
 | 
			
		||||
  build-image:
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
@ -28,24 +27,3 @@ jobs:
 | 
			
		||||
        type=pep440,pattern={{raw}}
 | 
			
		||||
        type=pep440,pattern=v{{major}}.{{minor}}
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
  build-image-streaming:
 | 
			
		||||
    if: startsWith(github.ref, 'refs/tags/v4.3.')
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: streaming/Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
        tootsuite/mastodon-streaming
 | 
			
		||||
        ghcr.io/mastodon/mastodon-streaming
 | 
			
		||||
      # Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
 | 
			
		||||
      cache: false
 | 
			
		||||
      # Only tag with latest when ran against the latest stable branch
 | 
			
		||||
      # This needs to be updated after each minor version release
 | 
			
		||||
      flavor: |
 | 
			
		||||
        latest=${{ startsWith(github.ref, 'refs/tags/v4.3.') }}
 | 
			
		||||
      tags: |
 | 
			
		||||
        type=pep440,pattern={{raw}}
 | 
			
		||||
        type=pep440,pattern=v{{major}}.{{minor}}
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										64
									
								
								.github/workflows/build-security.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								.github/workflows/build-security.yml
									
									
									
									
										vendored
									
									
								
							@ -1,64 +0,0 @@
 | 
			
		||||
name: Build security nightly container image
 | 
			
		||||
on:
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
  packages: write
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  compute-suffix:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: github.repository == 'mastodon/mastodon'
 | 
			
		||||
    steps:
 | 
			
		||||
      - id: version_vars
 | 
			
		||||
        env:
 | 
			
		||||
          TZ: Etc/UTC
 | 
			
		||||
        run: |
 | 
			
		||||
          echo mastodon_version_prerelease=nightly.$(date --date='next day' +'%Y-%m-%d')-security>> $GITHUB_OUTPUT
 | 
			
		||||
    outputs:
 | 
			
		||||
      prerelease: ${{ steps.version_vars.outputs.mastodon_version_prerelease }}
 | 
			
		||||
 | 
			
		||||
  build-image:
 | 
			
		||||
    needs: compute-suffix
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      cache: false
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
        tootsuite/mastodon
 | 
			
		||||
        ghcr.io/mastodon/mastodon
 | 
			
		||||
      version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
      labels: |
 | 
			
		||||
        org.opencontainers.image.description=Nightly build image used for testing purposes
 | 
			
		||||
      flavor: |
 | 
			
		||||
        latest=auto
 | 
			
		||||
      tags: |
 | 
			
		||||
        type=raw,value=edge
 | 
			
		||||
        type=raw,value=nightly
 | 
			
		||||
        type=raw,value=${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
 | 
			
		||||
  build-image-streaming:
 | 
			
		||||
    needs: compute-suffix
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: streaming/Dockerfile
 | 
			
		||||
      platforms: linux/amd64,linux/arm64
 | 
			
		||||
      use_native_arm64_builder: true
 | 
			
		||||
      cache: false
 | 
			
		||||
      push_to_images: |
 | 
			
		||||
        tootsuite/mastodon-streaming
 | 
			
		||||
        ghcr.io/mastodon/mastodon-streaming
 | 
			
		||||
      version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
      labels: |
 | 
			
		||||
        org.opencontainers.image.description=Nightly build image used for testing purposes
 | 
			
		||||
      flavor: |
 | 
			
		||||
        latest=auto
 | 
			
		||||
      tags: |
 | 
			
		||||
        type=raw,value=edge
 | 
			
		||||
        type=raw,value=nightly
 | 
			
		||||
        type=raw,value=${{ needs.compute-suffix.outputs.prerelease }}
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/workflows/bundler-audit.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/bundler-audit.yml
									
									
									
									
										vendored
									
									
								
							@ -27,8 +27,14 @@ jobs:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Run bundler-audit
 | 
			
		||||
        run: bundle exec bundler-audit
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								.github/workflows/check-i18n.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/check-i18n.yml
									
									
									
									
										vendored
									
									
								
							@ -19,11 +19,25 @@ jobs:
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install system dependencies
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - name: Set up Ruby
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Check for missing strings in English JSON
 | 
			
		||||
        run: |
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							@ -31,7 +31,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
      # Initializes the CodeQL tools for scanning.
 | 
			
		||||
      - name: Initialize CodeQL
 | 
			
		||||
        uses: github/codeql-action/init@v3
 | 
			
		||||
        uses: github/codeql-action/init@v2
 | 
			
		||||
        with:
 | 
			
		||||
          languages: ${{ matrix.language }}
 | 
			
		||||
          # If you wish to specify custom queries, you can do so here or in a config file.
 | 
			
		||||
@ -44,7 +44,7 @@ jobs:
 | 
			
		||||
      # Autobuild attempts to build any compiled languages  (C/C++, C#, Go, or Java).
 | 
			
		||||
      # If this step fails, then you should remove it and run the build manually (see below)
 | 
			
		||||
      - name: Autobuild
 | 
			
		||||
        uses: github/codeql-action/autobuild@v3
 | 
			
		||||
        uses: github/codeql-action/autobuild@v2
 | 
			
		||||
 | 
			
		||||
      # ℹ️ Command-line programs to run using the OS shell.
 | 
			
		||||
      # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
 | 
			
		||||
@ -57,6 +57,6 @@ jobs:
 | 
			
		||||
      #   ./location_of_script_within_repo/buildscript.sh
 | 
			
		||||
 | 
			
		||||
      - name: Perform CodeQL Analysis
 | 
			
		||||
        uses: github/codeql-action/analyze@v3
 | 
			
		||||
        uses: github/codeql-action/analyze@v2
 | 
			
		||||
        with:
 | 
			
		||||
          category: '/language:${{matrix.language}}'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								.github/workflows/crowdin-download.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/workflows/crowdin-download.yml
									
									
									
									
										vendored
									
									
								
							@ -11,7 +11,6 @@ permissions:
 | 
			
		||||
jobs:
 | 
			
		||||
  download-translations:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: github.repository == 'mastodon/mastodon'
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
@ -44,15 +43,21 @@ jobs:
 | 
			
		||||
        run: sudo chown -R runner:docker .
 | 
			
		||||
 | 
			
		||||
      # This is needed to run the normalize step
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Run i18n normalize task
 | 
			
		||||
        run: bundle exec i18n-tasks normalize
 | 
			
		||||
 | 
			
		||||
      # Create or update the pull request
 | 
			
		||||
      - name: Create Pull Request
 | 
			
		||||
        uses: peter-evans/create-pull-request@v6.0.4
 | 
			
		||||
        uses: peter-evans/create-pull-request@v5.0.2
 | 
			
		||||
        with:
 | 
			
		||||
          commit-message: 'New Crowdin translations'
 | 
			
		||||
          title: 'New Crowdin Translations (automated)'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								.github/workflows/format-check.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/format-check.yml
									
									
									
									
										vendored
									
									
								
							@ -1,18 +0,0 @@
 | 
			
		||||
name: Check formatting
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
  pull_request:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  lint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
 | 
			
		||||
      - name: Check formatting with Prettier
 | 
			
		||||
        run: yarn format:check
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/workflows/lint-css.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/lint-css.yml
									
									
									
									
										vendored
									
									
								
							@ -35,12 +35,18 @@ jobs:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - uses: xt0rted/stylelint-problem-matcher@v1
 | 
			
		||||
 | 
			
		||||
      - run: echo "::add-matcher::.github/stylelint-matcher.json"
 | 
			
		||||
 | 
			
		||||
      - name: Stylelint
 | 
			
		||||
        run: yarn lint:css
 | 
			
		||||
        run: yarn lint:sass
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								.github/workflows/lint-haml.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/lint-haml.yml
									
									
									
									
										vendored
									
									
								
							@ -30,10 +30,18 @@ jobs:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Run haml-lint
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json"
 | 
			
		||||
          bundle exec haml-lint --reporter github
 | 
			
		||||
          bundle exec haml-lint
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/workflows/lint-js.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/lint-js.yml
									
									
									
									
										vendored
									
									
								
							@ -39,8 +39,14 @@ jobs:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: ESLint
 | 
			
		||||
        run: yarn lint:js --max-warnings 0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										44
									
								
								.github/workflows/lint-json.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.github/workflows/lint-json.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
name: JSON Linting
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches-ignore:
 | 
			
		||||
      - 'dependabot/**'
 | 
			
		||||
      - 'renovate/**'
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'package.json'
 | 
			
		||||
      - 'yarn.lock'
 | 
			
		||||
      - '.nvmrc'
 | 
			
		||||
      - '.prettier*'
 | 
			
		||||
      - '**/*.json'
 | 
			
		||||
      - '.github/workflows/lint-json.yml'
 | 
			
		||||
      - '!app/javascript/mastodon/locales/*.json'
 | 
			
		||||
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'package.json'
 | 
			
		||||
      - 'yarn.lock'
 | 
			
		||||
      - '.nvmrc'
 | 
			
		||||
      - '.prettier*'
 | 
			
		||||
      - '**/*.json'
 | 
			
		||||
      - '.github/workflows/lint-json.yml'
 | 
			
		||||
      - '!app/javascript/mastodon/locales/*.json'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  lint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Prettier
 | 
			
		||||
        run: yarn lint:json
 | 
			
		||||
							
								
								
									
										44
									
								
								.github/workflows/lint-md.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.github/workflows/lint-md.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
name: Markdown Linting
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches-ignore:
 | 
			
		||||
      - 'dependabot/**'
 | 
			
		||||
      - 'renovate/**'
 | 
			
		||||
    paths:
 | 
			
		||||
      - '.github/workflows/lint-md.yml'
 | 
			
		||||
      - '.nvmrc'
 | 
			
		||||
      - '.prettier*'
 | 
			
		||||
      - '**/*.md'
 | 
			
		||||
      - '!AUTHORS.md'
 | 
			
		||||
      - 'package.json'
 | 
			
		||||
      - 'yarn.lock'
 | 
			
		||||
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - '.github/workflows/lint-md.yml'
 | 
			
		||||
      - '.nvmrc'
 | 
			
		||||
      - '.prettier*'
 | 
			
		||||
      - '**/*.md'
 | 
			
		||||
      - '!AUTHORS.md'
 | 
			
		||||
      - 'package.json'
 | 
			
		||||
      - 'yarn.lock'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  lint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Prettier
 | 
			
		||||
        run: yarn lint:md
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/workflows/lint-ruby.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/lint-ruby.yml
									
									
									
									
										vendored
									
									
								
							@ -31,8 +31,14 @@ jobs:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Set-up RuboCop Problem Matcher
 | 
			
		||||
        uses: r7kamura/rubocop-problem-matchers-action@v1
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										46
									
								
								.github/workflows/lint-yml.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								.github/workflows/lint-yml.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
			
		||||
name: YML Linting
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches-ignore:
 | 
			
		||||
      - 'dependabot/**'
 | 
			
		||||
      - 'renovate/**'
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'package.json'
 | 
			
		||||
      - 'yarn.lock'
 | 
			
		||||
      - '.nvmrc'
 | 
			
		||||
      - '.prettier*'
 | 
			
		||||
      - '**/*.yaml'
 | 
			
		||||
      - '**/*.yml'
 | 
			
		||||
      - '.github/workflows/lint-yml.yml'
 | 
			
		||||
      - '!config/locales/*.yml'
 | 
			
		||||
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'package.json'
 | 
			
		||||
      - 'yarn.lock'
 | 
			
		||||
      - '.nvmrc'
 | 
			
		||||
      - '.prettier*'
 | 
			
		||||
      - '**/*.yaml'
 | 
			
		||||
      - '**/*.yml'
 | 
			
		||||
      - '.github/workflows/lint-yml.yml'
 | 
			
		||||
      - '!config/locales/*.yml'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  lint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Prettier
 | 
			
		||||
        run: yarn lint:yml
 | 
			
		||||
							
								
								
									
										14
									
								
								.github/workflows/test-image-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/test-image-build.yml
									
									
									
									
										vendored
									
									
								
							@ -7,7 +7,6 @@ on:
 | 
			
		||||
      - .github/workflows/build-releases.yml
 | 
			
		||||
      - .github/workflows/test-image-build.yml
 | 
			
		||||
      - Dockerfile
 | 
			
		||||
      - streaming/Dockerfile
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
@ -19,17 +18,4 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: Dockerfile
 | 
			
		||||
      platforms: linux/amd64 # Testing only on native platform so it is performant
 | 
			
		||||
      cache: true
 | 
			
		||||
 | 
			
		||||
  build-image-streaming:
 | 
			
		||||
    concurrency:
 | 
			
		||||
      group: ${{ github.workflow }}-${{ github.ref }}-streaming
 | 
			
		||||
      cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/build-container-image.yml
 | 
			
		||||
    with:
 | 
			
		||||
      file_to_build: streaming/Dockerfile
 | 
			
		||||
      platforms: linux/amd64 # Testing only on native platform so it is performant
 | 
			
		||||
      cache: true
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/workflows/test-js.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/test-js.yml
									
									
									
									
										vendored
									
									
								
							@ -35,8 +35,14 @@ jobs:
 | 
			
		||||
      - name: Clone repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: JavaScript testing
 | 
			
		||||
      - name: Install all yarn packages
 | 
			
		||||
        run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Jest testing
 | 
			
		||||
        run: yarn jest --reporters github-actions summary
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								.github/workflows/test-migrations-one-step.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								.github/workflows/test-migrations-one-step.yml
									
									
									
									
										vendored
									
									
								
							@ -72,14 +72,37 @@ jobs:
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up bundler cache
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Create database
 | 
			
		||||
        run: './bin/rails db:create'
 | 
			
		||||
 | 
			
		||||
      - name: Run historical migrations with data population
 | 
			
		||||
        run: './bin/rails tests:migrations:prepare_database'
 | 
			
		||||
      - name: Run migrations up to v2.0.0
 | 
			
		||||
        run: './bin/rails db:migrate VERSION=20171010025614'
 | 
			
		||||
 | 
			
		||||
      - name: Populate database with test data
 | 
			
		||||
        run: './bin/rails tests:migrations:populate_v2'
 | 
			
		||||
 | 
			
		||||
      - name: Run migrations up to v2.4.0
 | 
			
		||||
        run: './bin/rails db:migrate VERSION=20180514140000'
 | 
			
		||||
 | 
			
		||||
      - name: Populate database with test data
 | 
			
		||||
        run: './bin/rails tests:migrations:populate_v2_4'
 | 
			
		||||
 | 
			
		||||
      - name: Run migrations up to v2.4.3
 | 
			
		||||
        run: './bin/rails db:migrate VERSION=20180707154237'
 | 
			
		||||
 | 
			
		||||
      - name: Populate database with test data
 | 
			
		||||
        run: './bin/rails tests:migrations:populate_v2_4_3'
 | 
			
		||||
 | 
			
		||||
      - name: Run all remaining migrations
 | 
			
		||||
        run: './bin/rails db:migrate'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										34
									
								
								.github/workflows/test-migrations-two-step.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								.github/workflows/test-migrations-two-step.yml
									
									
									
									
										vendored
									
									
								
							@ -45,7 +45,6 @@ jobs:
 | 
			
		||||
          --health-retries 5
 | 
			
		||||
        ports:
 | 
			
		||||
          - 5432:5432
 | 
			
		||||
 | 
			
		||||
      redis:
 | 
			
		||||
        image: redis:7-alpine
 | 
			
		||||
        options: >-
 | 
			
		||||
@ -72,17 +71,42 @@ jobs:
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up bundler cache
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Create database
 | 
			
		||||
        run: './bin/rails db:create'
 | 
			
		||||
 | 
			
		||||
      - name: Run historical migrations with data population
 | 
			
		||||
        run: './bin/rails tests:migrations:prepare_database'
 | 
			
		||||
      - name: Run migrations up to v2.0.0
 | 
			
		||||
        run: './bin/rails db:migrate VERSION=20171010025614'
 | 
			
		||||
 | 
			
		||||
      - name: Populate database with test data
 | 
			
		||||
        run: './bin/rails tests:migrations:populate_v2'
 | 
			
		||||
 | 
			
		||||
      - name: Run pre-deployment migrations up to v2.4.0
 | 
			
		||||
        run: './bin/rails db:migrate VERSION=20180514140000'
 | 
			
		||||
        env:
 | 
			
		||||
          SKIP_POST_DEPLOYMENT_MIGRATIONS: true
 | 
			
		||||
 | 
			
		||||
      - name: Populate database with test data
 | 
			
		||||
        run: './bin/rails tests:migrations:populate_v2_4'
 | 
			
		||||
 | 
			
		||||
      - name: Run migrations up to v2.4.3
 | 
			
		||||
        run: './bin/rails db:migrate VERSION=20180707154237'
 | 
			
		||||
        env:
 | 
			
		||||
          SKIP_POST_DEPLOYMENT_MIGRATIONS: true
 | 
			
		||||
 | 
			
		||||
      - name: Populate database with test data
 | 
			
		||||
        run: './bin/rails tests:migrations:populate_v2_4_3'
 | 
			
		||||
 | 
			
		||||
      - name: Run all remaining pre-deployment migrations
 | 
			
		||||
        run: './bin/rails db:migrate'
 | 
			
		||||
        env:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										155
									
								
								.github/workflows/test-ruby.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										155
									
								
								.github/workflows/test-ruby.yml
									
									
									
									
										vendored
									
									
								
							@ -28,38 +28,42 @@ jobs:
 | 
			
		||||
    env:
 | 
			
		||||
      RAILS_ENV: ${{ matrix.mode }}
 | 
			
		||||
      BUNDLE_WITH: ${{ matrix.mode }}
 | 
			
		||||
      ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY: precompile_placeholder
 | 
			
		||||
      ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT: precompile_placeholder
 | 
			
		||||
      ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY: precompile_placeholder
 | 
			
		||||
      OTP_SECRET: precompile_placeholder
 | 
			
		||||
      SECRET_KEY_BASE: precompile_placeholder
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          onlyProduction: 'true'
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up bundler cache
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: .ruby-version
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - run: yarn --frozen-lockfile --production
 | 
			
		||||
      - name: Precompile assets
 | 
			
		||||
        # Previously had set this, but it's not supported
 | 
			
		||||
        # export NODE_OPTIONS=--openssl-legacy-provider
 | 
			
		||||
        run: |-
 | 
			
		||||
          ./bin/rails assets:precompile
 | 
			
		||||
 | 
			
		||||
      - name: Archive asset artifacts
 | 
			
		||||
        run: |
 | 
			
		||||
          tar --exclude={"*.br","*.gz"} -zcf artifacts.tar.gz public/assets public/packs*
 | 
			
		||||
 | 
			
		||||
      - uses: actions/upload-artifact@v4
 | 
			
		||||
      - uses: actions/upload-artifact@v3
 | 
			
		||||
        if: matrix.mode == 'test'
 | 
			
		||||
        with:
 | 
			
		||||
          path: |-
 | 
			
		||||
            ./artifacts.tar.gz
 | 
			
		||||
            ./public/assets
 | 
			
		||||
            ./public/packs-test
 | 
			
		||||
          name: ${{ github.sha }}
 | 
			
		||||
          retention-days: 0
 | 
			
		||||
 | 
			
		||||
@ -97,7 +101,7 @@ jobs:
 | 
			
		||||
      DB_HOST: localhost
 | 
			
		||||
      DB_USER: postgres
 | 
			
		||||
      DB_PASS: postgres
 | 
			
		||||
      DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }}
 | 
			
		||||
      DISABLE_SIMPLECOV: true
 | 
			
		||||
      RAILS_ENV: test
 | 
			
		||||
      ALLOW_NOPAM: true
 | 
			
		||||
      PAM_ENABLED: true
 | 
			
		||||
@ -108,43 +112,47 @@ jobs:
 | 
			
		||||
      SAML_ENABLED: true
 | 
			
		||||
      CAS_ENABLED: true
 | 
			
		||||
      BUNDLE_WITH: 'pam_authentication test'
 | 
			
		||||
      GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }}
 | 
			
		||||
      CI_JOBS: ${{ matrix.ci_job }}/4
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        ruby-version:
 | 
			
		||||
          - '3.0'
 | 
			
		||||
          - '3.1'
 | 
			
		||||
          - '.ruby-version'
 | 
			
		||||
          - '3.3'
 | 
			
		||||
        ci_job:
 | 
			
		||||
          - 1
 | 
			
		||||
          - 2
 | 
			
		||||
          - 3
 | 
			
		||||
          - 4
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: './'
 | 
			
		||||
          path: './public'
 | 
			
		||||
          name: ${{ github.sha }}
 | 
			
		||||
 | 
			
		||||
      - name: Expand archived asset artifacts
 | 
			
		||||
        run: |
 | 
			
		||||
          tar xvzf artifacts.tar.gz
 | 
			
		||||
      - name: Update package index
 | 
			
		||||
        run: sudo apt-get update
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Install additional system dependencies
 | 
			
		||||
        run: sudo apt-get install -y ffmpeg imagemagick libpam-dev
 | 
			
		||||
 | 
			
		||||
      - name: Set up bundler cache
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: ${{ matrix.ruby-version}}
 | 
			
		||||
          additional-system-dependencies: ffmpeg imagemagick libpam-dev
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Load database schema
 | 
			
		||||
        run: './bin/rails db:create db:schema:load db:seed'
 | 
			
		||||
 | 
			
		||||
      - run: bin/rspec
 | 
			
		||||
 | 
			
		||||
      - name: Upload coverage reports to Codecov
 | 
			
		||||
        if: matrix.ruby-version == '.ruby-version'
 | 
			
		||||
        uses: codecov/codecov-action@v4
 | 
			
		||||
        with:
 | 
			
		||||
          files: coverage/lcov/mastodon.lcov
 | 
			
		||||
      - run: bundle exec rake rspec_chunked
 | 
			
		||||
 | 
			
		||||
  test-e2e:
 | 
			
		||||
    name: End to End testing
 | 
			
		||||
@ -189,26 +197,40 @@ jobs:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        ruby-version:
 | 
			
		||||
          - '3.0'
 | 
			
		||||
          - '3.1'
 | 
			
		||||
          - '.ruby-version'
 | 
			
		||||
          - '3.3'
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: './public'
 | 
			
		||||
          name: ${{ github.sha }}
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Update package index
 | 
			
		||||
        run: sudo apt-get update
 | 
			
		||||
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Install additional system dependencies
 | 
			
		||||
        run: sudo apt-get install -y ffmpeg imagemagick
 | 
			
		||||
 | 
			
		||||
      - name: Set up bundler cache
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: ${{ matrix.ruby-version}}
 | 
			
		||||
          additional-system-dependencies: ffmpeg imagemagick
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Load database schema
 | 
			
		||||
        run: './bin/rails db:create db:schema:load db:seed'
 | 
			
		||||
@ -216,21 +238,21 @@ jobs:
 | 
			
		||||
      - run: bundle exec rake spec:system
 | 
			
		||||
 | 
			
		||||
      - name: Archive logs
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        if: failure()
 | 
			
		||||
        with:
 | 
			
		||||
          name: e2e-logs-${{ matrix.ruby-version }}
 | 
			
		||||
          path: log/
 | 
			
		||||
 | 
			
		||||
      - name: Archive test screenshots
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        if: failure()
 | 
			
		||||
        with:
 | 
			
		||||
          name: e2e-screenshots
 | 
			
		||||
          path: tmp/capybara/
 | 
			
		||||
          path: tmp/screenshots/
 | 
			
		||||
 | 
			
		||||
  test-search:
 | 
			
		||||
    name: Elastic Search integration testing
 | 
			
		||||
    name: Testing search
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    needs:
 | 
			
		||||
@ -260,8 +282,8 @@ jobs:
 | 
			
		||||
        ports:
 | 
			
		||||
          - 6379:6379
 | 
			
		||||
 | 
			
		||||
      search:
 | 
			
		||||
        image: ${{ matrix.search-image }}
 | 
			
		||||
      elasticsearch:
 | 
			
		||||
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.13
 | 
			
		||||
        env:
 | 
			
		||||
          discovery.type: single-node
 | 
			
		||||
          xpack.security.enabled: false
 | 
			
		||||
@ -288,47 +310,56 @@ jobs:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        ruby-version:
 | 
			
		||||
          - '3.0'
 | 
			
		||||
          - '3.1'
 | 
			
		||||
          - '.ruby-version'
 | 
			
		||||
          - '3.3'
 | 
			
		||||
        search-image:
 | 
			
		||||
          - docker.elastic.co/elasticsearch/elasticsearch:7.17.13
 | 
			
		||||
        include:
 | 
			
		||||
          - ruby-version: '.ruby-version'
 | 
			
		||||
            search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: './public'
 | 
			
		||||
          name: ${{ github.sha }}
 | 
			
		||||
 | 
			
		||||
      - name: Set up Ruby environment
 | 
			
		||||
        uses: ./.github/actions/setup-ruby
 | 
			
		||||
      - name: Update package index
 | 
			
		||||
        run: sudo apt-get update
 | 
			
		||||
 | 
			
		||||
      - name: Set up Node.js
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: yarn
 | 
			
		||||
          node-version-file: '.nvmrc'
 | 
			
		||||
 | 
			
		||||
      - name: Install native Ruby dependencies
 | 
			
		||||
        run: sudo apt-get install -y libicu-dev libidn11-dev
 | 
			
		||||
 | 
			
		||||
      - name: Install additional system dependencies
 | 
			
		||||
        run: sudo apt-get install -y ffmpeg imagemagick
 | 
			
		||||
 | 
			
		||||
      - name: Set up bundler cache
 | 
			
		||||
        uses: ruby/setup-ruby@v1
 | 
			
		||||
        with:
 | 
			
		||||
          ruby-version: ${{ matrix.ruby-version}}
 | 
			
		||||
          additional-system-dependencies: ffmpeg imagemagick
 | 
			
		||||
          bundler-cache: true
 | 
			
		||||
 | 
			
		||||
      - name: Set up Javascript environment
 | 
			
		||||
        uses: ./.github/actions/setup-javascript
 | 
			
		||||
      - run: yarn --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Load database schema
 | 
			
		||||
        run: './bin/rails db:create db:schema:load db:seed'
 | 
			
		||||
 | 
			
		||||
      - run: bin/rspec --tag search
 | 
			
		||||
      - run: bundle exec rake spec:search
 | 
			
		||||
 | 
			
		||||
      - name: Archive logs
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        if: failure()
 | 
			
		||||
        with:
 | 
			
		||||
          name: test-search-logs-${{ matrix.ruby-version }}
 | 
			
		||||
          path: log/
 | 
			
		||||
 | 
			
		||||
      - name: Archive test screenshots
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        if: failure()
 | 
			
		||||
        with:
 | 
			
		||||
          name: test-search-screenshots
 | 
			
		||||
          path: tmp/capybara/
 | 
			
		||||
          path: tmp/screenshots/
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -24,12 +24,16 @@
 | 
			
		||||
/public/packs-test
 | 
			
		||||
.env
 | 
			
		||||
.env.production
 | 
			
		||||
.env.development
 | 
			
		||||
/node_modules/
 | 
			
		||||
/build/
 | 
			
		||||
 | 
			
		||||
# Ignore Vagrant files
 | 
			
		||||
.vagrant/
 | 
			
		||||
 | 
			
		||||
# Ignore Capistrano customizations
 | 
			
		||||
/config/deploy/*
 | 
			
		||||
 | 
			
		||||
# Ignore IDE files
 | 
			
		||||
.vscode/
 | 
			
		||||
.idea/
 | 
			
		||||
@ -54,20 +58,8 @@ npm-debug.log
 | 
			
		||||
yarn-error.log
 | 
			
		||||
yarn-debug.log
 | 
			
		||||
 | 
			
		||||
# From https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
 | 
			
		||||
.pnp.*
 | 
			
		||||
.yarn/*
 | 
			
		||||
!.yarn/patches
 | 
			
		||||
!.yarn/plugins
 | 
			
		||||
!.yarn/releases
 | 
			
		||||
!.yarn/sdks
 | 
			
		||||
!.yarn/versions
 | 
			
		||||
 | 
			
		||||
# Ignore vagrant log files
 | 
			
		||||
*-cloudimg-console.log
 | 
			
		||||
 | 
			
		||||
# Ignore Docker option files
 | 
			
		||||
docker-compose.override.yml
 | 
			
		||||
 | 
			
		||||
# Ignore dotenv .local files
 | 
			
		||||
.env*.local
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,8 @@
 | 
			
		||||
inherits_from: .haml-lint_todo.yml
 | 
			
		||||
 | 
			
		||||
exclude:
 | 
			
		||||
  - 'vendor/**/*'
 | 
			
		||||
  - lib/templates/haml/scaffold/_form.html.haml
 | 
			
		||||
 | 
			
		||||
require:
 | 
			
		||||
  - ./lib/linter/haml_middle_dot.rb
 | 
			
		||||
@ -9,7 +12,3 @@ linters:
 | 
			
		||||
    enabled: true
 | 
			
		||||
  MiddleDot:
 | 
			
		||||
    enabled: true
 | 
			
		||||
  LineLength:
 | 
			
		||||
    max: 300
 | 
			
		||||
  ViewLength:
 | 
			
		||||
    max: 200 # Override default value of 100 inherited from rubocop
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										47
									
								
								.haml-lint_todo.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								.haml-lint_todo.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
			
		||||
# This configuration was generated by
 | 
			
		||||
# `haml-lint --auto-gen-config`
 | 
			
		||||
# on 2023-07-20 09:47:50 -0400 using Haml-Lint version 0.48.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
 | 
			
		||||
# versions of Haml-Lint, may require this file to be generated again.
 | 
			
		||||
 | 
			
		||||
linters:
 | 
			
		||||
  # Offense count: 951
 | 
			
		||||
  LineLength:
 | 
			
		||||
    enabled: false
 | 
			
		||||
 | 
			
		||||
  # Offense count: 22
 | 
			
		||||
  UnnecessaryStringOutput:
 | 
			
		||||
    enabled: false
 | 
			
		||||
 | 
			
		||||
  # Offense count: 57
 | 
			
		||||
  RuboCop:
 | 
			
		||||
    enabled: false
 | 
			
		||||
 | 
			
		||||
  # Offense count: 3
 | 
			
		||||
  ViewLength:
 | 
			
		||||
    exclude:
 | 
			
		||||
      - 'app/views/admin/accounts/show.html.haml'
 | 
			
		||||
      - 'app/views/admin/reports/show.html.haml'
 | 
			
		||||
      - 'app/views/disputes/strikes/show.html.haml'
 | 
			
		||||
 | 
			
		||||
  # Offense count: 32
 | 
			
		||||
  InstanceVariables:
 | 
			
		||||
    exclude:
 | 
			
		||||
      - 'app/views/admin/reports/_actions.html.haml'
 | 
			
		||||
      - 'app/views/admin/roles/_form.html.haml'
 | 
			
		||||
      - 'app/views/admin/webhooks/_form.html.haml'
 | 
			
		||||
      - 'app/views/auth/registrations/_status.html.haml'
 | 
			
		||||
      - 'app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml'
 | 
			
		||||
      - 'app/views/authorize_interactions/_post_follow_actions.html.haml'
 | 
			
		||||
      - 'app/views/invites/_form.html.haml'
 | 
			
		||||
      - 'app/views/relationships/_account.html.haml'
 | 
			
		||||
      - 'app/views/shared/_og.html.haml'
 | 
			
		||||
 | 
			
		||||
  # Offense count: 3
 | 
			
		||||
  IdNames:
 | 
			
		||||
    exclude:
 | 
			
		||||
      - 'app/views/authorize_interactions/error.html.haml'
 | 
			
		||||
      - 'app/views/oauth/authorizations/error.html.haml'
 | 
			
		||||
      - 'app/views/shared/_error_messages.html.haml'
 | 
			
		||||
@ -1 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
. "$(dirname "$0")/_/husky.sh"
 | 
			
		||||
 | 
			
		||||
yarn lint-staged
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,9 @@
 | 
			
		||||
# Ignore Vagrant files
 | 
			
		||||
.vagrant/
 | 
			
		||||
 | 
			
		||||
# Ignore Capistrano customizations
 | 
			
		||||
/config/deploy/*
 | 
			
		||||
 | 
			
		||||
# Ignore IDE files
 | 
			
		||||
.vscode/
 | 
			
		||||
.idea/
 | 
			
		||||
@ -54,13 +57,6 @@
 | 
			
		||||
# Ignore Docker option files
 | 
			
		||||
docker-compose.override.yml
 | 
			
		||||
 | 
			
		||||
# Ignore public
 | 
			
		||||
/public/assets
 | 
			
		||||
/public/emoji
 | 
			
		||||
/public/packs
 | 
			
		||||
/public/packs-test
 | 
			
		||||
/public/system
 | 
			
		||||
 | 
			
		||||
# Ignore emoji map file
 | 
			
		||||
/app/javascript/mastodon/features/emoji/emoji_map.json
 | 
			
		||||
 | 
			
		||||
@ -80,6 +76,3 @@ app/javascript/styles/mastodon/reset.scss
 | 
			
		||||
 | 
			
		||||
# Ignore the generated AUTHORS.md
 | 
			
		||||
AUTHORS.md
 | 
			
		||||
 | 
			
		||||
# Process a few selected JS files
 | 
			
		||||
!lint-staged.config.js
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										113
									
								
								.rubocop.yml
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								.rubocop.yml
									
									
									
									
									
								
							@ -9,13 +9,12 @@ inherit_mode:
 | 
			
		||||
require:
 | 
			
		||||
  - rubocop-rails
 | 
			
		||||
  - rubocop-rspec
 | 
			
		||||
  - rubocop-rspec_rails
 | 
			
		||||
  - rubocop-performance
 | 
			
		||||
  - rubocop-capybara
 | 
			
		||||
  - ./lib/linter/rubocop_middle_dot
 | 
			
		||||
 | 
			
		||||
AllCops:
 | 
			
		||||
  TargetRubyVersion: 3.1 # Set to minimum supported version of CI
 | 
			
		||||
  TargetRubyVersion: 3.0 # Set to minimum supported version of CI
 | 
			
		||||
  DisplayCopNames: true
 | 
			
		||||
  DisplayStyleGuide: true
 | 
			
		||||
  ExtraDetails: true
 | 
			
		||||
@ -28,8 +27,7 @@ AllCops:
 | 
			
		||||
    - 'node_modules/**/*'
 | 
			
		||||
    - 'Vagrantfile'
 | 
			
		||||
    - 'vendor/**/*'
 | 
			
		||||
    - 'config/initializers/json_ld*' # Generated files
 | 
			
		||||
    - 'lib/mastodon/migration_helpers.rb' # Vendored from GitLab
 | 
			
		||||
    - 'lib/json_ld/*' # Generated files
 | 
			
		||||
    - 'lib/templates/**/*'
 | 
			
		||||
 | 
			
		||||
# Reason: Prefer Hashes without extreme indentation
 | 
			
		||||
@ -40,7 +38,13 @@ Layout/FirstHashElementIndentation:
 | 
			
		||||
# Reason: Currently disabled in .rubocop_todo.yml
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
 | 
			
		||||
Layout/LineLength:
 | 
			
		||||
  Max: 300 # Default of 120 causes a duplicate entry in generated todo file
 | 
			
		||||
  Max: 320 # Default of 120 causes a duplicate entry in generated todo file
 | 
			
		||||
 | 
			
		||||
# Reason:
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_lint.html#lintuselessaccessmodifier
 | 
			
		||||
Lint/UselessAccessModifier:
 | 
			
		||||
  ContextCreatingMethods:
 | 
			
		||||
    - class_methods
 | 
			
		||||
 | 
			
		||||
## Disable most Metrics/*Length cops
 | 
			
		||||
# Reason: those are often triggered and force significant refactors when this happend
 | 
			
		||||
@ -67,6 +71,13 @@ Metrics/ModuleLength:
 | 
			
		||||
# Reason: Currently disabled in .rubocop_todo.yml
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize
 | 
			
		||||
Metrics/AbcSize:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/mastodon/cli/*.rb'
 | 
			
		||||
    - db/*migrate/**/*
 | 
			
		||||
 | 
			
		||||
# Reason:
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting
 | 
			
		||||
Metrics/BlockNesting:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/mastodon/cli/*.rb'
 | 
			
		||||
 | 
			
		||||
@ -75,17 +86,13 @@ Metrics/AbcSize:
 | 
			
		||||
Metrics/CyclomaticComplexity:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - lib/mastodon/cli/*.rb
 | 
			
		||||
    - db/*migrate/**/*
 | 
			
		||||
 | 
			
		||||
# Reason:
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsparameterlists
 | 
			
		||||
Metrics/ParameterLists:
 | 
			
		||||
  CountKeywordArgs: false
 | 
			
		||||
 | 
			
		||||
# Reason: Prefer seeing a variable name
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_naming.html#namingblockforwarding
 | 
			
		||||
Naming/BlockForwarding:
 | 
			
		||||
  EnforcedStyle: explicit
 | 
			
		||||
 | 
			
		||||
# Reason: Prevailing style is argument file paths
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsfilepath
 | 
			
		||||
Rails/FilePath:
 | 
			
		||||
@ -96,47 +103,27 @@ Rails/FilePath:
 | 
			
		||||
Rails/HttpStatus:
 | 
			
		||||
  EnforcedStyle: numeric
 | 
			
		||||
 | 
			
		||||
# Reason: Conflicts with `Lint/UselessMethodDefinition` for inherited controller actions
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railslexicallyscopedactionfilter
 | 
			
		||||
Rails/LexicallyScopedActionFilter:
 | 
			
		||||
# Reason: Allowed in `tootctl` CLI code and in boot ENV checker
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit
 | 
			
		||||
Rails/Exit:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/auth/*'
 | 
			
		||||
    - 'config/boot.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/*.rb'
 | 
			
		||||
 | 
			
		||||
# Reason: These tasks are doing local work which do not need full env loaded
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsrakeenvironment
 | 
			
		||||
Rails/RakeEnvironment:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/tasks/auto_annotate_models.rake'
 | 
			
		||||
    - 'lib/tasks/emojis.rake'
 | 
			
		||||
    - 'lib/tasks/mastodon.rake'
 | 
			
		||||
    - 'lib/tasks/repo.rake'
 | 
			
		||||
    - 'lib/tasks/statistics.rake'
 | 
			
		||||
 | 
			
		||||
# Reason: There are appropriate times to use these features
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsskipsmodelvalidations
 | 
			
		||||
Rails/SkipsModelValidations:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# Reason: We want to preserve the ability to migrate from arbitrary old versions,
 | 
			
		||||
# and cannot guarantee that every installation has run every migration as they upgrade.
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsunusedignoredcolumns
 | 
			
		||||
Rails/UnusedIgnoredColumns:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# Reason: Prevailing style choice
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsnegateinclude
 | 
			
		||||
Rails/NegateInclude:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# Reason: Enforce default limit, but allow some elements to span lines
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecexamplelength
 | 
			
		||||
RSpec/ExampleLength:
 | 
			
		||||
  CountAsOne: ['array', 'heredoc', 'method_call']
 | 
			
		||||
 | 
			
		||||
# Reason: Deprecated cop, will be removed in 3.0, replaced by SpecFilePathFormat
 | 
			
		||||
# Reason: Some single letter camel case files shouldn't be split
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath
 | 
			
		||||
RSpec/FilePath:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
  CustomTransform:
 | 
			
		||||
    ActivityPub: activitypub # Ignore the snake_case due to the amount of files to rename
 | 
			
		||||
    DeepL: deepl
 | 
			
		||||
    FetchOEmbedService: fetch_oembed_service
 | 
			
		||||
    JsonLdHelper: jsonld_helper
 | 
			
		||||
    OEmbedController: oembed_controller
 | 
			
		||||
    OStatus: ostatus
 | 
			
		||||
    NodeInfoController: nodeinfo_controller # NodeInfo isn't snake_cased for any of the instances
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/config/initializers/rack_attack_spec.rb' # namespaces usually have separate folder
 | 
			
		||||
    - 'spec/lib/sanitize_config_spec.rb' # namespaces usually have separate folder
 | 
			
		||||
 | 
			
		||||
# Reason:
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject
 | 
			
		||||
@ -148,19 +135,9 @@ RSpec/NamedSubject:
 | 
			
		||||
RSpec/NotToNot:
 | 
			
		||||
  EnforcedStyle: to_not
 | 
			
		||||
 | 
			
		||||
# Reason: Match overrides from Rspec/FilePath rule above
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecspecfilepathformat
 | 
			
		||||
RSpec/SpecFilePathFormat:
 | 
			
		||||
  CustomTransform:
 | 
			
		||||
    ActivityPub: activitypub
 | 
			
		||||
    DeepL: deepl
 | 
			
		||||
    FetchOEmbedService: fetch_oembed_service
 | 
			
		||||
    OEmbedController: oembed_controller
 | 
			
		||||
    OStatus: ostatus
 | 
			
		||||
 | 
			
		||||
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
 | 
			
		||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
 | 
			
		||||
RSpecRails/HttpStatus:
 | 
			
		||||
RSpec/Rails/HttpStatus:
 | 
			
		||||
  EnforcedStyle: numeric
 | 
			
		||||
 | 
			
		||||
# Reason:
 | 
			
		||||
@ -173,25 +150,10 @@ Style/ClassAndModuleChildren:
 | 
			
		||||
Style/Documentation:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# Reason: Route redirects are not token-formatted and must be skipped
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_style.html#styleformatstringtoken
 | 
			
		||||
Style/FormatStringToken:
 | 
			
		||||
  inherit_mode:
 | 
			
		||||
    merge:
 | 
			
		||||
      - AllowedMethods # The rubocop-rails config adds `redirect`
 | 
			
		||||
  AllowedMethods:
 | 
			
		||||
    - redirect_with_vary
 | 
			
		||||
 | 
			
		||||
# Reason: Prevailing style choice
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashaslastarrayitem
 | 
			
		||||
Style/HashAsLastArrayItem:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# Reason: Enforce modern Ruby style
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
 | 
			
		||||
Style/HashSyntax:
 | 
			
		||||
  EnforcedStyle: ruby19_no_mixed_keys
 | 
			
		||||
  EnforcedShorthandSyntax: either
 | 
			
		||||
 | 
			
		||||
# Reason:
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
 | 
			
		||||
@ -216,6 +178,11 @@ Style/RedundantBegin:
 | 
			
		||||
Style/RescueStandardError:
 | 
			
		||||
  EnforcedStyle: implicit
 | 
			
		||||
 | 
			
		||||
# Reason: Simplify some spec layouts
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylesemicolon
 | 
			
		||||
Style/Semicolon:
 | 
			
		||||
  AllowAsExpressionSeparator: true
 | 
			
		||||
 | 
			
		||||
# Reason: Originally disabled for CodeClimate, and no config consensus has been found
 | 
			
		||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylesymbolarray
 | 
			
		||||
Style/SymbolArray:
 | 
			
		||||
 | 
			
		||||
@ -1,18 +1,111 @@
 | 
			
		||||
# This configuration was generated by
 | 
			
		||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
 | 
			
		||||
# using RuboCop version 1.62.1.
 | 
			
		||||
# using RuboCop version 1.56.1.
 | 
			
		||||
# The point is for the user to remove these configuration records
 | 
			
		||||
# one by one as the offenses are removed from the code base.
 | 
			
		||||
# Note that changes in the inspected code, or installation of new
 | 
			
		||||
# versions of RuboCop, may require this file to be generated again.
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
 | 
			
		||||
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
 | 
			
		||||
Bundler/OrderedGems:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'Gemfile'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle, IndentationWidth.
 | 
			
		||||
# SupportedStyles: with_first_argument, with_fixed_indentation
 | 
			
		||||
Layout/ArgumentAlignment:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/cors.rb'
 | 
			
		||||
    - 'config/initializers/session_store.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
 | 
			
		||||
# SupportedHashRocketStyles: key, separator, table
 | 
			
		||||
# SupportedColonStyles: key, separator, table
 | 
			
		||||
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
 | 
			
		||||
Layout/HashAlignment:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
    - 'config/initializers/rack_attack.rb'
 | 
			
		||||
    - 'config/routes.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: AllowDoxygenCommentStyle, AllowGemfileRubyComment.
 | 
			
		||||
Layout/LeadingCommentSpace:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/application.rb'
 | 
			
		||||
    - 'config/initializers/3_omniauth.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
 | 
			
		||||
# URISchemes: http, https
 | 
			
		||||
Layout/LineLength:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/account.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: require_no_space, require_space
 | 
			
		||||
Layout/SpaceInLambdaLiteral:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
    - 'config/initializers/content_security_policy.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: AllowComments, AllowEmptyLambdas.
 | 
			
		||||
Lint/EmptyBlock:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/api/v2/search_controller_spec.rb'
 | 
			
		||||
    - 'spec/fabricators/access_token_fabricator.rb'
 | 
			
		||||
    - 'spec/fabricators/conversation_fabricator.rb'
 | 
			
		||||
    - 'spec/fabricators/system_key_fabricator.rb'
 | 
			
		||||
    - 'spec/lib/activitypub/adapter_spec.rb'
 | 
			
		||||
    - 'spec/models/user_role_spec.rb'
 | 
			
		||||
 | 
			
		||||
Lint/NonLocalExitFromIterator:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/helpers/jsonld_helper.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Lint/OrAssignmentToConstant:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/sanitize_ext/sanitize_config.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
 | 
			
		||||
Lint/UnusedBlockArgument:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/content_security_policy.rb'
 | 
			
		||||
    - 'config/initializers/doorkeeper.rb'
 | 
			
		||||
    - 'config/initializers/paperclip.rb'
 | 
			
		||||
    - 'config/initializers/simple_form.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Lint/UselessAssignment:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/services/activitypub/process_status_update_service.rb'
 | 
			
		||||
    - 'config/initializers/3_omniauth.rb'
 | 
			
		||||
    - 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb'
 | 
			
		||||
    - 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/favourites_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/concerns/account_controller_concern_spec.rb'
 | 
			
		||||
    - 'spec/helpers/jsonld_helper_spec.rb'
 | 
			
		||||
    - 'spec/models/account_spec.rb'
 | 
			
		||||
    - 'spec/models/domain_block_spec.rb'
 | 
			
		||||
    - 'spec/models/status_spec.rb'
 | 
			
		||||
    - 'spec/models/user_spec.rb'
 | 
			
		||||
    - 'spec/models/webauthn_credentials_spec.rb'
 | 
			
		||||
    - 'spec/services/account_search_service_spec.rb'
 | 
			
		||||
    - 'spec/services/post_status_service_spec.rb'
 | 
			
		||||
    - 'spec/services/precompute_feed_service_spec.rb'
 | 
			
		||||
    - 'spec/services/resolve_url_service_spec.rb'
 | 
			
		||||
    - 'spec/views/statuses/show.html.haml_spec.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
 | 
			
		||||
Metrics/AbcSize:
 | 
			
		||||
  Max: 82
 | 
			
		||||
  Max: 144
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: CountBlocks, Max.
 | 
			
		||||
Metrics/BlockNesting:
 | 
			
		||||
@ -27,34 +120,429 @@ Metrics/CyclomaticComplexity:
 | 
			
		||||
Metrics/PerceivedComplexity:
 | 
			
		||||
  Max: 27
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
 | 
			
		||||
# SupportedStyles: snake_case, normalcase, non_integer
 | 
			
		||||
# AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339, x86_64
 | 
			
		||||
Naming/VariableNumber:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20190820003045_update_statuses_index.rb'
 | 
			
		||||
    - 'db/migrate/20190823221802_add_local_index_to_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20200119112504_add_public_index_to_statuses.rb'
 | 
			
		||||
    - 'spec/models/account_spec.rb'
 | 
			
		||||
    - 'spec/models/domain_block_spec.rb'
 | 
			
		||||
    - 'spec/models/user_spec.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: SafeMultiline.
 | 
			
		||||
Performance/DeletePrefix:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/featured_tag.rb'
 | 
			
		||||
 | 
			
		||||
Performance/MapMethodChain:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/feed.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/maintenance.rb'
 | 
			
		||||
    - 'spec/services/bulk_import_service_spec.rb'
 | 
			
		||||
    - 'spec/services/import_service_spec.rb'
 | 
			
		||||
 | 
			
		||||
RSpec/AnyInstance:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/activitypub/inboxes_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/resets_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/settings/branding_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/media_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/sessions_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb'
 | 
			
		||||
    - 'spec/lib/request_spec.rb'
 | 
			
		||||
    - 'spec/lib/status_filter_spec.rb'
 | 
			
		||||
    - 'spec/models/account_spec.rb'
 | 
			
		||||
    - 'spec/models/setting_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/process_collection_service_spec.rb'
 | 
			
		||||
    - 'spec/validators/follow_limit_validator_spec.rb'
 | 
			
		||||
    - 'spec/workers/activitypub/delivery_worker_spec.rb'
 | 
			
		||||
    - 'spec/workers/web/push_notification_worker_spec.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: CountAsOne.
 | 
			
		||||
RSpec/ExampleLength:
 | 
			
		||||
  Max: 18
 | 
			
		||||
  Max: 22
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: implicit, each, example
 | 
			
		||||
RSpec/HookArgument:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/api/v1/streaming_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/well_known/webfinger_controller_spec.rb'
 | 
			
		||||
    - 'spec/helpers/instance_helper_spec.rb'
 | 
			
		||||
    - 'spec/models/user_spec.rb'
 | 
			
		||||
    - 'spec/rails_helper.rb'
 | 
			
		||||
    - 'spec/serializers/activitypub/note_serializer_spec.rb'
 | 
			
		||||
    - 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
 | 
			
		||||
    - 'spec/services/import_service_spec.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: AssignmentOnly.
 | 
			
		||||
RSpec/InstanceVariable:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/api/v1/streaming_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/confirmations_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/passwords_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/sessions_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/concerns/export_controller_concern_spec.rb'
 | 
			
		||||
    - 'spec/controllers/home_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/statuses_cleanup_controller_spec.rb'
 | 
			
		||||
    - 'spec/models/concerns/account_finder_concern_spec.rb'
 | 
			
		||||
    - 'spec/models/concerns/account_interactions_spec.rb'
 | 
			
		||||
    - 'spec/models/public_feed_spec.rb'
 | 
			
		||||
    - 'spec/serializers/activitypub/note_serializer_spec.rb'
 | 
			
		||||
    - 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
 | 
			
		||||
    - 'spec/services/remove_status_service_spec.rb'
 | 
			
		||||
    - 'spec/services/search_service_spec.rb'
 | 
			
		||||
    - 'spec/services/unblock_domain_service_spec.rb'
 | 
			
		||||
 | 
			
		||||
RSpec/LetSetup:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/admin/accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/action_logs_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/instances_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/reports/actions_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/admin/statuses_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/accounts/statuses_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/filters_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/followed_tags_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v2/admin/accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v2/filters/keywords_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/api/v2/filters/statuses_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/confirmations_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/passwords_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/auth/sessions_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/follower_accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/following_accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/oauth/authorized_applications_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/oauth/tokens_controller_spec.rb'
 | 
			
		||||
    - 'spec/controllers/settings/imports_controller_spec.rb'
 | 
			
		||||
    - 'spec/lib/activitypub/activity/delete_spec.rb'
 | 
			
		||||
    - 'spec/lib/vacuum/applications_vacuum_spec.rb'
 | 
			
		||||
    - 'spec/lib/vacuum/preview_cards_vacuum_spec.rb'
 | 
			
		||||
    - 'spec/models/account_spec.rb'
 | 
			
		||||
    - 'spec/models/account_statuses_cleanup_policy_spec.rb'
 | 
			
		||||
    - 'spec/models/canonical_email_block_spec.rb'
 | 
			
		||||
    - 'spec/models/status_spec.rb'
 | 
			
		||||
    - 'spec/models/user_spec.rb'
 | 
			
		||||
    - 'spec/services/account_statuses_cleanup_service_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/fetch_featured_collection_service_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/fetch_remote_status_service_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/process_account_service_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/process_collection_service_spec.rb'
 | 
			
		||||
    - 'spec/services/batched_remove_status_service_spec.rb'
 | 
			
		||||
    - 'spec/services/block_domain_service_spec.rb'
 | 
			
		||||
    - 'spec/services/bulk_import_service_spec.rb'
 | 
			
		||||
    - 'spec/services/delete_account_service_spec.rb'
 | 
			
		||||
    - 'spec/services/import_service_spec.rb'
 | 
			
		||||
    - 'spec/services/notify_service_spec.rb'
 | 
			
		||||
    - 'spec/services/remove_status_service_spec.rb'
 | 
			
		||||
    - 'spec/services/report_service_spec.rb'
 | 
			
		||||
    - 'spec/services/resolve_account_service_spec.rb'
 | 
			
		||||
    - 'spec/services/suspend_account_service_spec.rb'
 | 
			
		||||
    - 'spec/services/unallow_domain_service_spec.rb'
 | 
			
		||||
    - 'spec/services/unsuspend_account_service_spec.rb'
 | 
			
		||||
    - 'spec/workers/scheduler/user_cleanup_scheduler_spec.rb'
 | 
			
		||||
 | 
			
		||||
RSpec/MessageChain:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/api/v1/media_controller_spec.rb'
 | 
			
		||||
    - 'spec/models/concerns/remotable_spec.rb'
 | 
			
		||||
    - 'spec/models/session_activation_spec.rb'
 | 
			
		||||
    - 'spec/models/setting_spec.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: have_received, receive
 | 
			
		||||
RSpec/MessageSpies:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'spec/controllers/admin/accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/helpers/admin/account_moderation_notes_helper_spec.rb'
 | 
			
		||||
    - 'spec/lib/webfinger_resource_spec.rb'
 | 
			
		||||
    - 'spec/models/admin/account_action_spec.rb'
 | 
			
		||||
    - 'spec/models/concerns/remotable_spec.rb'
 | 
			
		||||
    - 'spec/models/follow_request_spec.rb'
 | 
			
		||||
    - 'spec/models/identity_spec.rb'
 | 
			
		||||
    - 'spec/models/session_activation_spec.rb'
 | 
			
		||||
    - 'spec/models/setting_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/fetch_replies_service_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/process_collection_service_spec.rb'
 | 
			
		||||
    - 'spec/spec_helper.rb'
 | 
			
		||||
    - 'spec/validators/status_length_validator_spec.rb'
 | 
			
		||||
 | 
			
		||||
RSpec/MultipleExpectations:
 | 
			
		||||
  Max: 7
 | 
			
		||||
  Max: 8
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: AllowSubject.
 | 
			
		||||
RSpec/MultipleMemoizedHelpers:
 | 
			
		||||
  Max: 17
 | 
			
		||||
  Max: 21
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: AllowedGroups.
 | 
			
		||||
RSpec/NestedGroups:
 | 
			
		||||
  Max: 6
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Rails/ApplicationController:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/health_controller.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: db/**/*.rb
 | 
			
		||||
Rails/CreateTableWithTimestamps:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'db/migrate/20170508230434_create_conversation_mutes.rb'
 | 
			
		||||
    - 'db/migrate/20170823162448_create_status_pins.rb'
 | 
			
		||||
    - 'db/migrate/20171116161857_create_list_accounts.rb'
 | 
			
		||||
    - 'db/migrate/20180929222014_create_account_conversations.rb'
 | 
			
		||||
    - 'db/migrate/20181007025445_create_pghero_space_stats.rb'
 | 
			
		||||
    - 'db/migrate/20190103124649_create_scheduled_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20220824233535_create_status_trends.rb'
 | 
			
		||||
    - 'db/migrate/20221006061337_create_preview_card_trends.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: Severity.
 | 
			
		||||
Rails/DuplicateAssociation:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/serializers/activitypub/collection_serializer.rb'
 | 
			
		||||
    - 'app/serializers/activitypub/note_serializer.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: app/models/**/*.rb
 | 
			
		||||
Rails/HasAndBelongsToMany:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/concerns/account/associations.rb'
 | 
			
		||||
    - 'app/models/concerns/account_associations.rb'
 | 
			
		||||
    - 'app/models/preview_card.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
    - 'app/models/tag.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: app/models/**/*.rb
 | 
			
		||||
Rails/HasManyOrHasOneDependent:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/concerns/account_counters.rb'
 | 
			
		||||
    - 'app/models/conversation.rb'
 | 
			
		||||
    - 'app/models/custom_emoji.rb'
 | 
			
		||||
    - 'app/models/custom_emoji_category.rb'
 | 
			
		||||
    - 'app/models/domain_block.rb'
 | 
			
		||||
    - 'app/models/invite.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
    - 'app/models/user.rb'
 | 
			
		||||
    - 'app/models/web/push_subscription.rb'
 | 
			
		||||
 | 
			
		||||
Rails/I18nLocaleTexts:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/tasks/mastodon.rake'
 | 
			
		||||
    - 'spec/helpers/flashes_helper_spec.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: app/controllers/**/*.rb, app/mailers/**/*.rb
 | 
			
		||||
Rails/LexicallyScopedActionFilter:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/auth/passwords_controller.rb'
 | 
			
		||||
    - 'app/controllers/auth/registrations_controller.rb'
 | 
			
		||||
    - 'app/controllers/auth/sessions_controller.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Rails/NegateInclude:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/concerns/signature_verification.rb'
 | 
			
		||||
    - 'app/helpers/jsonld_helper.rb'
 | 
			
		||||
    - 'app/lib/activitypub/activity/create.rb'
 | 
			
		||||
    - 'app/lib/activitypub/activity/move.rb'
 | 
			
		||||
    - 'app/lib/feed_manager.rb'
 | 
			
		||||
    - 'app/lib/link_details_extractor.rb'
 | 
			
		||||
    - 'app/models/concerns/attachmentable.rb'
 | 
			
		||||
    - 'app/models/concerns/remotable.rb'
 | 
			
		||||
    - 'app/models/custom_filter.rb'
 | 
			
		||||
    - 'app/services/activitypub/process_status_update_service.rb'
 | 
			
		||||
    - 'app/services/fetch_link_card_service.rb'
 | 
			
		||||
    - 'app/services/search_service.rb'
 | 
			
		||||
    - 'app/workers/web/push_notification_worker.rb'
 | 
			
		||||
    - 'lib/paperclip/color_extractor.rb'
 | 
			
		||||
 | 
			
		||||
Rails/OutputSafety:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/simple_form.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: **/Rakefile, **/*.rake
 | 
			
		||||
Rails/RakeEnvironment:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/tasks/auto_annotate_models.rake'
 | 
			
		||||
    - 'lib/tasks/db.rake'
 | 
			
		||||
    - 'lib/tasks/emojis.rake'
 | 
			
		||||
    - 'lib/tasks/mastodon.rake'
 | 
			
		||||
    - 'lib/tasks/repo.rake'
 | 
			
		||||
    - 'lib/tasks/statistics.rake'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: db/**/*.rb
 | 
			
		||||
Rails/ReversibleMigration:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'db/migrate/20160223164502_make_uris_nullable_in_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20161122163057_remove_unneeded_indexes.rb'
 | 
			
		||||
    - 'db/migrate/20170205175257_remove_devices.rb'
 | 
			
		||||
    - 'db/migrate/20170322143850_change_primary_key_to_bigint_on_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20170520145338_change_language_filter_to_opt_out.rb'
 | 
			
		||||
    - 'db/migrate/20170609145826_remove_default_language_from_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20170711225116_fix_null_booleans.rb'
 | 
			
		||||
    - 'db/migrate/20171129172043_add_index_on_stream_entries.rb'
 | 
			
		||||
    - 'db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb'
 | 
			
		||||
    - 'db/migrate/20171226094803_more_faster_index_on_notifications.rb'
 | 
			
		||||
    - 'db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20180617162849_remove_unused_indexes.rb'
 | 
			
		||||
    - 'db/migrate/20220827195229_change_canonical_email_blocks_nullable.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: ForbiddenMethods, AllowedMethods.
 | 
			
		||||
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
 | 
			
		||||
Rails/SkipsModelValidations:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/admin/invites_controller.rb'
 | 
			
		||||
    - 'app/controllers/concerns/session_tracking_concern.rb'
 | 
			
		||||
    - 'app/models/concerns/account_merging.rb'
 | 
			
		||||
    - 'app/models/concerns/expireable.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
    - 'app/models/trends/links.rb'
 | 
			
		||||
    - 'app/models/trends/preview_card_batch.rb'
 | 
			
		||||
    - 'app/models/trends/preview_card_provider_batch.rb'
 | 
			
		||||
    - 'app/models/trends/status_batch.rb'
 | 
			
		||||
    - 'app/models/trends/statuses.rb'
 | 
			
		||||
    - 'app/models/trends/tag_batch.rb'
 | 
			
		||||
    - 'app/models/trends/tags.rb'
 | 
			
		||||
    - 'app/models/user.rb'
 | 
			
		||||
    - 'app/services/activitypub/process_status_update_service.rb'
 | 
			
		||||
    - 'app/services/approve_appeal_service.rb'
 | 
			
		||||
    - 'app/services/block_domain_service.rb'
 | 
			
		||||
    - 'app/services/delete_account_service.rb'
 | 
			
		||||
    - 'app/services/process_mentions_service.rb'
 | 
			
		||||
    - 'app/services/unallow_domain_service.rb'
 | 
			
		||||
    - 'app/services/unblock_domain_service.rb'
 | 
			
		||||
    - 'app/services/update_status_service.rb'
 | 
			
		||||
    - 'app/workers/activitypub/post_upgrade_worker.rb'
 | 
			
		||||
    - 'app/workers/move_worker.rb'
 | 
			
		||||
    - 'app/workers/scheduler/ip_cleanup_scheduler.rb'
 | 
			
		||||
    - 'app/workers/scheduler/scheduled_statuses_scheduler.rb'
 | 
			
		||||
    - 'db/migrate/20161203164520_add_from_account_id_to_notifications.rb'
 | 
			
		||||
    - 'db/migrate/20170105224407_add_shortcode_to_media_attachments.rb'
 | 
			
		||||
    - 'db/migrate/20170209184350_add_reply_to_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20170304202101_add_type_to_media_attachments.rb'
 | 
			
		||||
    - 'db/migrate/20180528141303_fix_accounts_unique_index.rb'
 | 
			
		||||
    - 'db/migrate/20180609104432_migrate_web_push_subscriptions2.rb'
 | 
			
		||||
    - 'db/migrate/20181207011115_downcase_custom_emoji_domains.rb'
 | 
			
		||||
    - 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb'
 | 
			
		||||
    - 'db/migrate/20191007013357_update_pt_locales.rb'
 | 
			
		||||
    - 'db/migrate/20220316233212_update_kurdish_locales.rb'
 | 
			
		||||
    - 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb'
 | 
			
		||||
    - 'db/post_migrate/20200917193528_migrate_notifications_type.rb'
 | 
			
		||||
    - 'db/post_migrate/20201017234926_fill_account_suspension_origin.rb'
 | 
			
		||||
    - 'db/post_migrate/20220617202502_migrate_roles.rb'
 | 
			
		||||
    - 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb'
 | 
			
		||||
    - 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/accounts.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/main.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/maintenance.rb'
 | 
			
		||||
    - 'spec/controllers/api/v1/admin/accounts_controller_spec.rb'
 | 
			
		||||
    - 'spec/lib/activitypub/activity/follow_spec.rb'
 | 
			
		||||
    - 'spec/services/follow_service_spec.rb'
 | 
			
		||||
    - 'spec/services/update_account_service_spec.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: db/**/*.rb
 | 
			
		||||
Rails/ThreeStateBooleanColumn:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'db/migrate/20160325130944_add_admin_to_users.rb'
 | 
			
		||||
    - 'db/migrate/20161123093447_add_sensitive_to_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20170123203248_add_reject_media_to_domain_blocks.rb'
 | 
			
		||||
    - 'db/migrate/20170127165745_add_devise_two_factor_to_users.rb'
 | 
			
		||||
    - 'db/migrate/20170209184350_add_reply_to_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20170330163835_create_imports.rb'
 | 
			
		||||
    - 'db/migrate/20170905165803_add_local_to_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20181203021853_add_discoverable_to_accounts.rb'
 | 
			
		||||
    - 'db/migrate/20190509164208_add_by_moderator_to_tombstone.rb'
 | 
			
		||||
    - 'db/migrate/20190805123746_add_capabilities_to_tags.rb'
 | 
			
		||||
    - 'db/migrate/20191212163405_add_hide_collections_to_accounts.rb'
 | 
			
		||||
    - 'db/migrate/20200309150742_add_forwarded_to_reports.rb'
 | 
			
		||||
    - 'db/migrate/20210609202149_create_login_activities.rb'
 | 
			
		||||
    - 'db/migrate/20210621221010_add_skip_sign_in_token_to_users.rb'
 | 
			
		||||
    - 'db/migrate/20211031031021_create_preview_card_providers.rb'
 | 
			
		||||
    - 'db/migrate/20211115032527_add_trendable_to_preview_cards.rb'
 | 
			
		||||
    - 'db/migrate/20220202200743_add_trendable_to_accounts.rb'
 | 
			
		||||
    - 'db/migrate/20220202200926_add_trendable_to_statuses.rb'
 | 
			
		||||
    - 'db/migrate/20220303000827_add_ordered_media_attachment_ids_to_status_edits.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: app/models/**/*.rb
 | 
			
		||||
Rails/UniqueValidationWithoutIndex:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/account_alias.rb'
 | 
			
		||||
    - 'app/models/custom_filter_status.rb'
 | 
			
		||||
    - 'app/models/identity.rb'
 | 
			
		||||
    - 'app/models/webauthn_credential.rb'
 | 
			
		||||
 | 
			
		||||
# Configuration parameters: Include.
 | 
			
		||||
# Include: app/models/**/*.rb
 | 
			
		||||
Rails/UnusedIgnoredColumns:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/account.rb'
 | 
			
		||||
    - 'app/models/account_stat.rb'
 | 
			
		||||
    - 'app/models/admin/action_log.rb'
 | 
			
		||||
    - 'app/models/custom_filter.rb'
 | 
			
		||||
    - 'app/models/email_domain_block.rb'
 | 
			
		||||
    - 'app/models/report.rb'
 | 
			
		||||
    - 'app/models/status_edit.rb'
 | 
			
		||||
    - 'app/models/user.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: exists, where
 | 
			
		||||
Rails/WhereExists:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/activitypub/inboxes_controller.rb'
 | 
			
		||||
    - 'app/controllers/admin/email_domain_blocks_controller.rb'
 | 
			
		||||
    - 'app/controllers/auth/registrations_controller.rb'
 | 
			
		||||
    - 'app/lib/activitypub/activity/create.rb'
 | 
			
		||||
    - 'app/lib/delivery_failure_tracker.rb'
 | 
			
		||||
    - 'app/lib/feed_manager.rb'
 | 
			
		||||
    - 'app/lib/status_cache_hydrator.rb'
 | 
			
		||||
    - 'app/lib/suspicious_sign_in_detector.rb'
 | 
			
		||||
    - 'app/models/concerns/account_interactions.rb'
 | 
			
		||||
    - 'app/models/featured_tag.rb'
 | 
			
		||||
    - 'app/models/poll.rb'
 | 
			
		||||
    - 'app/models/session_activation.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
    - 'app/models/user.rb'
 | 
			
		||||
    - 'app/policies/status_policy.rb'
 | 
			
		||||
    - 'app/serializers/rest/announcement_serializer.rb'
 | 
			
		||||
    - 'app/serializers/rest/tag_serializer.rb'
 | 
			
		||||
    - 'app/services/activitypub/fetch_remote_status_service.rb'
 | 
			
		||||
    - 'app/services/app_sign_up_service.rb'
 | 
			
		||||
    - 'app/services/vote_service.rb'
 | 
			
		||||
    - 'app/validators/reaction_validator.rb'
 | 
			
		||||
    - 'app/validators/vote_validator.rb'
 | 
			
		||||
    - 'app/workers/move_worker.rb'
 | 
			
		||||
    - 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb'
 | 
			
		||||
    - 'lib/tasks/tests.rake'
 | 
			
		||||
    - 'spec/models/account_spec.rb'
 | 
			
		||||
    - 'spec/services/activitypub/process_collection_service_spec.rb'
 | 
			
		||||
    - 'spec/services/purge_domain_service_spec.rb'
 | 
			
		||||
    - 'spec/services/unallow_domain_service_spec.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: AllowOnConstant, AllowOnSelfClass.
 | 
			
		||||
Style/CaseEquality:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/trusted_proxies.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
 | 
			
		||||
# AllowedMethods: ==, equal?, eql?
 | 
			
		||||
Style/ClassEqualityComparison:
 | 
			
		||||
@ -66,20 +554,29 @@ Style/ClassVars:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/devise.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Style/CombinableLoops:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/form/custom_emoji_batch.rb'
 | 
			
		||||
    - 'app/models/form/ip_block_batch.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: AllowedVars.
 | 
			
		||||
Style/FetchEnvVar:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/lib/redis_configuration.rb'
 | 
			
		||||
    - 'app/lib/translation_service.rb'
 | 
			
		||||
    - 'config/environments/development.rb'
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
    - 'config/initializers/2_limited_federation_mode.rb'
 | 
			
		||||
    - 'config/initializers/3_omniauth.rb'
 | 
			
		||||
    - 'config/initializers/blacklists.rb'
 | 
			
		||||
    - 'config/initializers/cache_buster.rb'
 | 
			
		||||
    - 'config/initializers/content_security_policy.rb'
 | 
			
		||||
    - 'config/initializers/devise.rb'
 | 
			
		||||
    - 'config/initializers/paperclip.rb'
 | 
			
		||||
    - 'config/initializers/vapid.rb'
 | 
			
		||||
    - 'lib/mastodon/premailer_webpack_strategy.rb'
 | 
			
		||||
    - 'lib/mastodon/redis_config.rb'
 | 
			
		||||
    - 'lib/tasks/repo.rake'
 | 
			
		||||
    - 'spec/features/profile_spec.rb'
 | 
			
		||||
@ -90,12 +587,14 @@ Style/FetchEnvVar:
 | 
			
		||||
# AllowedMethods: redirect
 | 
			
		||||
Style/FormatStringToken:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/privacy_policy.rb'
 | 
			
		||||
    - 'config/initializers/devise.rb'
 | 
			
		||||
    - 'lib/paperclip/color_extractor.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Style/GlobalStdStream:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/boot.rb'
 | 
			
		||||
    - 'config/environments/development.rb'
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
 | 
			
		||||
@ -103,13 +602,17 @@ Style/GlobalStdStream:
 | 
			
		||||
# Configuration parameters: MinBodyLength, AllowConsecutiveConditionals.
 | 
			
		||||
Style/GuardClause:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/admin/confirmations_controller.rb'
 | 
			
		||||
    - 'app/controllers/auth/confirmations_controller.rb'
 | 
			
		||||
    - 'app/controllers/auth/passwords_controller.rb'
 | 
			
		||||
    - 'app/controllers/settings/two_factor_authentication/webauthn_credentials_controller.rb'
 | 
			
		||||
    - 'app/lib/activitypub/activity/block.rb'
 | 
			
		||||
    - 'app/lib/request.rb'
 | 
			
		||||
    - 'app/lib/request_pool.rb'
 | 
			
		||||
    - 'app/lib/webfinger.rb'
 | 
			
		||||
    - 'app/lib/webfinger_resource.rb'
 | 
			
		||||
    - 'app/models/concerns/account/counters.rb'
 | 
			
		||||
    - 'app/models/concerns/user/ldap_authenticable.rb'
 | 
			
		||||
    - 'app/models/concerns/account_counters.rb'
 | 
			
		||||
    - 'app/models/concerns/ldap_authenticable.rb'
 | 
			
		||||
    - 'app/models/tag.rb'
 | 
			
		||||
    - 'app/models/user.rb'
 | 
			
		||||
    - 'app/services/fan_out_on_write_service.rb'
 | 
			
		||||
@ -121,13 +624,30 @@ Style/GuardClause:
 | 
			
		||||
    - 'app/workers/redownload_media_worker.rb'
 | 
			
		||||
    - 'app/workers/remote_account_refresh_worker.rb'
 | 
			
		||||
    - 'config/initializers/devise.rb'
 | 
			
		||||
    - 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
 | 
			
		||||
    - 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
 | 
			
		||||
    - 'db/migrate/20170901141119_truncate_preview_cards.rb'
 | 
			
		||||
    - 'db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb'
 | 
			
		||||
    - 'lib/devise/two_factor_ldap_authenticatable.rb'
 | 
			
		||||
    - 'lib/devise/two_factor_pam_authenticatable.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/accounts.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/maintenance.rb'
 | 
			
		||||
    - 'lib/mastodon/cli/media.rb'
 | 
			
		||||
    - 'lib/paperclip/attachment_extensions.rb'
 | 
			
		||||
    - 'lib/tasks/repo.rake'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: braces, no_braces
 | 
			
		||||
Style/HashAsLastArrayItem:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/admin/statuses_controller.rb'
 | 
			
		||||
    - 'app/controllers/api/v1/statuses_controller.rb'
 | 
			
		||||
    - 'app/models/concerns/account_counters.rb'
 | 
			
		||||
    - 'app/models/concerns/status_threading_concern.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
    - 'app/services/batched_remove_status_service.rb'
 | 
			
		||||
    - 'app/services/notify_service.rb'
 | 
			
		||||
    - 'db/migrate/20181024224956_migrate_account_conversations.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Style/HashTransformValues:
 | 
			
		||||
  Exclude:
 | 
			
		||||
@ -141,6 +661,22 @@ Style/IfUnlessModifier:
 | 
			
		||||
    - 'config/initializers/devise.rb'
 | 
			
		||||
    - 'config/initializers/ffmpeg.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: InverseMethods, InverseBlocks.
 | 
			
		||||
Style/InverseMethods:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/custom_filter.rb'
 | 
			
		||||
    - 'app/services/update_account_service.rb'
 | 
			
		||||
    - 'spec/controllers/activitypub/replies_controller_spec.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: line_count_dependent, lambda, literal
 | 
			
		||||
Style/Lambda:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/simple_form.rb'
 | 
			
		||||
    - 'config/routes.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Style/MapToHash:
 | 
			
		||||
  Exclude:
 | 
			
		||||
@ -175,6 +711,13 @@ Style/OptionalBooleanParameter:
 | 
			
		||||
    - 'app/workers/unfollow_follow_worker.rb'
 | 
			
		||||
    - 'lib/mastodon/redis_config.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: PreferredDelimiters.
 | 
			
		||||
Style/PercentLiteralDelimiters:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/deploy.rb'
 | 
			
		||||
    - 'config/initializers/doorkeeper.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: short, verbose
 | 
			
		||||
@ -198,20 +741,48 @@ Style/RedundantFetchBlock:
 | 
			
		||||
    - 'config/initializers/paperclip.rb'
 | 
			
		||||
    - 'config/puma.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: AllowMultipleReturnValues.
 | 
			
		||||
Style/RedundantReturn:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/api/v1/directories_controller.rb'
 | 
			
		||||
    - 'app/controllers/auth/confirmations_controller.rb'
 | 
			
		||||
    - 'app/lib/ostatus/tag_manager.rb'
 | 
			
		||||
    - 'app/models/form/import.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
 | 
			
		||||
# AllowedMethods: present?, blank?, presence, try, try!
 | 
			
		||||
Style/SafeNavigation:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/models/concerns/account/finder_concern.rb'
 | 
			
		||||
    - 'app/models/concerns/account_finder_concern.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: only_raise, only_fail, semantic
 | 
			
		||||
Style/SignalException:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
 | 
			
		||||
    - 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
 | 
			
		||||
    - 'lib/devise/two_factor_ldap_authenticatable.rb'
 | 
			
		||||
    - 'lib/devise/two_factor_pam_authenticatable.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
Style/SingleArgumentDig:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'lib/webpacker/manifest_extensions.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle.
 | 
			
		||||
# SupportedStyles: require_parentheses, require_no_parentheses
 | 
			
		||||
Style/StabbyLambdaParentheses:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
    - 'config/initializers/content_security_policy.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
Style/StderrPuts:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/boot.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: Mode.
 | 
			
		||||
@ -220,8 +791,52 @@ Style/StringConcatenation:
 | 
			
		||||
    - 'config/initializers/paperclip.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: WordRegex.
 | 
			
		||||
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
 | 
			
		||||
# SupportedStyles: single_quotes, double_quotes
 | 
			
		||||
Style/StringLiterals:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
    - 'config/initializers/backtrace_silencers.rb'
 | 
			
		||||
    - 'config/initializers/http_client_proxy.rb'
 | 
			
		||||
    - 'config/initializers/rack_attack.rb'
 | 
			
		||||
    - 'config/initializers/webauthn.rb'
 | 
			
		||||
    - 'config/routes.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports unsafe autocorrection (--autocorrect-all).
 | 
			
		||||
# Configuration parameters: AllowMethodsWithArguments, AllowedMethods, AllowedPatterns, AllowComments.
 | 
			
		||||
# AllowedMethods: define_method, mail, respond_to
 | 
			
		||||
Style/SymbolProc:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/3_omniauth.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle, AllowSafeAssignment.
 | 
			
		||||
# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex
 | 
			
		||||
Style/TernaryParentheses:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/environments/development.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyleForMultiline.
 | 
			
		||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
 | 
			
		||||
Style/TrailingCommaInArguments:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/initializers/paperclip.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyleForMultiline.
 | 
			
		||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
 | 
			
		||||
Style/TrailingCommaInHashLiteral:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'config/environments/production.rb'
 | 
			
		||||
    - 'config/environments/test.rb'
 | 
			
		||||
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
# Configuration parameters: EnforcedStyle, MinSize, WordRegex.
 | 
			
		||||
# SupportedStyles: percent, brackets
 | 
			
		||||
Style/WordArray:
 | 
			
		||||
  EnforcedStyle: percent
 | 
			
		||||
  MinSize: 3
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/helpers/languages_helper.rb'
 | 
			
		||||
    - 'config/initializers/cors.rb'
 | 
			
		||||
    - 'spec/controllers/settings/imports_controller_spec.rb'
 | 
			
		||||
    - 'spec/models/form/import_spec.rb'
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
3.2.4
 | 
			
		||||
3.3.0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								.simplecov
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								.simplecov
									
									
									
									
									
								
							@ -1,22 +0,0 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
if ENV['CI']
 | 
			
		||||
  require 'simplecov-lcov'
 | 
			
		||||
  SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
 | 
			
		||||
  SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
 | 
			
		||||
else
 | 
			
		||||
  SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
SimpleCov.start 'rails' do
 | 
			
		||||
  enable_coverage :branch
 | 
			
		||||
 | 
			
		||||
  add_filter 'lib/linter'
 | 
			
		||||
 | 
			
		||||
  add_group 'Libraries', 'lib'
 | 
			
		||||
  add_group 'Policies', 'app/policies'
 | 
			
		||||
  add_group 'Presenters', 'app/presenters'
 | 
			
		||||
  add_group 'Serializers', 'app/serializers'
 | 
			
		||||
  add_group 'Services', 'app/services'
 | 
			
		||||
  add_group 'Validators', 'app/validators'
 | 
			
		||||
end
 | 
			
		||||
@ -1,3 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "ignore_dirs": ["node_modules/", "public/"]
 | 
			
		||||
}
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
diff --git a/lib/index.js b/lib/index.js
 | 
			
		||||
index 16ed6be8be8f555cc99096c2ff60954b42dc313d..d009c069770d066ad0db7ad02de1ea473a29334e 100644
 | 
			
		||||
--- a/lib/index.js
 | 
			
		||||
+++ b/lib/index.js
 | 
			
		||||
@@ -99,7 +99,7 @@ function lodash(_ref) {
 | 
			
		||||
 
 | 
			
		||||
         var node = _ref3;
 | 
			
		||||
 
 | 
			
		||||
-        if ((0, _types.isModuleDeclaration)(node)) {
 | 
			
		||||
+        if ((0, _types.isImportDeclaration)(node)  || (0, _types.isExportDeclaration)(node)) {
 | 
			
		||||
           isModule = true;
 | 
			
		||||
           break;
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										49
									
								
								.yarnclean
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								.yarnclean
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
# test directories
 | 
			
		||||
__tests__
 | 
			
		||||
test
 | 
			
		||||
tests
 | 
			
		||||
powered-test
 | 
			
		||||
 | 
			
		||||
# asset directories
 | 
			
		||||
docs
 | 
			
		||||
doc
 | 
			
		||||
website
 | 
			
		||||
images
 | 
			
		||||
# assets
 | 
			
		||||
 | 
			
		||||
# examples
 | 
			
		||||
example
 | 
			
		||||
examples
 | 
			
		||||
 | 
			
		||||
# code coverage directories
 | 
			
		||||
coverage
 | 
			
		||||
.nyc_output
 | 
			
		||||
 | 
			
		||||
# build scripts
 | 
			
		||||
Makefile
 | 
			
		||||
Gulpfile.js
 | 
			
		||||
Gruntfile.js
 | 
			
		||||
 | 
			
		||||
# configs
 | 
			
		||||
.tern-project
 | 
			
		||||
.gitattributes
 | 
			
		||||
.editorconfig
 | 
			
		||||
.*ignore
 | 
			
		||||
.eslintrc
 | 
			
		||||
.jshintrc
 | 
			
		||||
.flowconfig
 | 
			
		||||
.documentup.json
 | 
			
		||||
.yarn-metadata.json
 | 
			
		||||
.*.yml
 | 
			
		||||
*.yml
 | 
			
		||||
 | 
			
		||||
# misc
 | 
			
		||||
*.gz
 | 
			
		||||
*.md
 | 
			
		||||
 | 
			
		||||
# for specific ignore
 | 
			
		||||
!.svgo.yml
 | 
			
		||||
!sass-lint/**/*.yml
 | 
			
		||||
 | 
			
		||||
# breaks lint-staged or generally anything using https://github.com/eemeli/yaml/issues/384
 | 
			
		||||
!**/yaml/dist/**/doc
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
nodeLinker: node-modules
 | 
			
		||||
							
								
								
									
										2415
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										2415
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -11,10 +11,6 @@ You can contribute in the following ways:
 | 
			
		||||
 | 
			
		||||
If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
 | 
			
		||||
 | 
			
		||||
## API Changes and Additions
 | 
			
		||||
 | 
			
		||||
Please note that any changes or additions made to the API should have an accompanying pull request on [our documentation repository](https://github.com/mastodon/documentation).
 | 
			
		||||
 | 
			
		||||
## Bug reports
 | 
			
		||||
 | 
			
		||||
Bug reports and feature suggestions must use descriptive and concise titles and be submitted to [GitHub Issues](https://github.com/mastodon/mastodon/issues). Please use the search function to make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								Capfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Capfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'capistrano/setup'
 | 
			
		||||
require 'capistrano/deploy'
 | 
			
		||||
require 'capistrano/scm/git'
 | 
			
		||||
 | 
			
		||||
install_plugin Capistrano::SCM::Git
 | 
			
		||||
 | 
			
		||||
require 'capistrano/rbenv'
 | 
			
		||||
require 'capistrano/bundler'
 | 
			
		||||
require 'capistrano/yarn'
 | 
			
		||||
require 'capistrano/rails/assets'
 | 
			
		||||
require 'capistrano/rails/migrations'
 | 
			
		||||
 | 
			
		||||
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
 | 
			
		||||
							
								
								
									
										332
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										332
									
								
								Dockerfile
									
									
									
									
									
								
							@ -1,265 +1,105 @@
 | 
			
		||||
# syntax=docker/dockerfile:1.7
 | 
			
		||||
# syntax=docker/dockerfile:1.4
 | 
			
		||||
# This needs to be bookworm-slim because the Ruby image is built on bookworm-slim
 | 
			
		||||
ARG NODE_VERSION="20.6-bookworm-slim"
 | 
			
		||||
 | 
			
		||||
# Please see https://docs.docker.com/engine/reference/builder for information about
 | 
			
		||||
# the extended buildx capabilities used in this file.
 | 
			
		||||
# Make sure multiarch TARGETPLATFORM is available for interpolation
 | 
			
		||||
# See: https://docs.docker.com/build/building/multi-platform/
 | 
			
		||||
ARG TARGETPLATFORM=${TARGETPLATFORM}
 | 
			
		||||
ARG BUILDPLATFORM=${BUILDPLATFORM}
 | 
			
		||||
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.3-slim as ruby
 | 
			
		||||
FROM node:${NODE_VERSION} as build
 | 
			
		||||
 | 
			
		||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.2.4"]
 | 
			
		||||
ARG RUBY_VERSION="3.2.4"
 | 
			
		||||
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
 | 
			
		||||
ARG NODE_MAJOR_VERSION="20"
 | 
			
		||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
 | 
			
		||||
ARG DEBIAN_VERSION="bookworm"
 | 
			
		||||
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
 | 
			
		||||
FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim as node
 | 
			
		||||
# Ruby image to use for base image based on combined variables (ex: 3.2.4-slim-bookworm)
 | 
			
		||||
FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby
 | 
			
		||||
COPY --link --from=ruby /opt/ruby /opt/ruby
 | 
			
		||||
 | 
			
		||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
 | 
			
		||||
# Example: v4.2.0-nightly.2023.11.09+something
 | 
			
		||||
# Overwrite existence of 'alpha.0' in version.rb [--build-arg MASTODON_VERSION_PRERELEASE="nightly.2023.11.09"]
 | 
			
		||||
ENV DEBIAN_FRONTEND="noninteractive" \
 | 
			
		||||
    PATH="${PATH}:/opt/ruby/bin"
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
 | 
			
		||||
WORKDIR /opt/mastodon
 | 
			
		||||
COPY Gemfile* package.json yarn.lock /opt/mastodon/
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3008
 | 
			
		||||
RUN apt-get update && \
 | 
			
		||||
    apt-get -yq dist-upgrade && \
 | 
			
		||||
    apt-get install -y --no-install-recommends build-essential \
 | 
			
		||||
        git \
 | 
			
		||||
        libicu-dev \
 | 
			
		||||
        libidn-dev \
 | 
			
		||||
        libpq-dev \
 | 
			
		||||
        libjemalloc-dev \
 | 
			
		||||
        zlib1g-dev \
 | 
			
		||||
        libgdbm-dev \
 | 
			
		||||
        libgmp-dev \
 | 
			
		||||
        libssl-dev \
 | 
			
		||||
        libyaml-0-2 \
 | 
			
		||||
        ca-certificates \
 | 
			
		||||
        libreadline8 \
 | 
			
		||||
        python3 \
 | 
			
		||||
        shared-mime-info && \
 | 
			
		||||
    bundle config set --local deployment 'true' && \
 | 
			
		||||
    bundle config set --local without 'development test' && \
 | 
			
		||||
    bundle config set silence_root_warning true && \
 | 
			
		||||
    bundle install -j"$(nproc)" && \
 | 
			
		||||
    yarn install --pure-lockfile --production --network-timeout 600000 && \
 | 
			
		||||
    yarn cache clean
 | 
			
		||||
 | 
			
		||||
FROM node:${NODE_VERSION}
 | 
			
		||||
 | 
			
		||||
# Use those args to specify your own version flags & suffixes
 | 
			
		||||
ARG MASTODON_VERSION_PRERELEASE=""
 | 
			
		||||
# Append build metadata or fork information to version.rb [--build-arg MASTODON_VERSION_METADATA="something"]
 | 
			
		||||
ARG MASTODON_VERSION_METADATA=""
 | 
			
		||||
 | 
			
		||||
# Allow Ruby on Rails to serve static files
 | 
			
		||||
# See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files
 | 
			
		||||
ARG RAILS_SERVE_STATIC_FILES="true"
 | 
			
		||||
# Allow to use YJIT compiler
 | 
			
		||||
# See: https://github.com/ruby/ruby/blob/v3_2_4/doc/yjit/yjit.md
 | 
			
		||||
ARG RUBY_YJIT_ENABLE="1"
 | 
			
		||||
# Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin]
 | 
			
		||||
ARG TZ="Etc/UTC"
 | 
			
		||||
# Linux UID (user id) for the mastodon user, change with [--build-arg UID=1234]
 | 
			
		||||
ARG UID="991"
 | 
			
		||||
# Linux GID (group id) for the mastodon user, change with [--build-arg GID=1234]
 | 
			
		||||
ARG GID="991"
 | 
			
		||||
 | 
			
		||||
# Apply Mastodon build options based on options above
 | 
			
		||||
ENV \
 | 
			
		||||
# Apply Mastodon version information
 | 
			
		||||
  MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
 | 
			
		||||
  MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \
 | 
			
		||||
# Apply Mastodon static files and YJIT options
 | 
			
		||||
  RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES} \
 | 
			
		||||
  RUBY_YJIT_ENABLE=${RUBY_YJIT_ENABLE} \
 | 
			
		||||
# Apply timezone
 | 
			
		||||
  TZ=${TZ}
 | 
			
		||||
COPY --link --from=ruby /opt/ruby /opt/ruby
 | 
			
		||||
 | 
			
		||||
ENV \
 | 
			
		||||
# Configure the IP to bind Mastodon to when serving traffic
 | 
			
		||||
  BIND="0.0.0.0" \
 | 
			
		||||
# Use production settings for Yarn, Node and related nodejs based tools
 | 
			
		||||
  NODE_ENV="production" \
 | 
			
		||||
# Use production settings for Ruby on Rails
 | 
			
		||||
  RAILS_ENV="production" \
 | 
			
		||||
# Add Ruby and Mastodon installation to the PATH
 | 
			
		||||
  DEBIAN_FRONTEND="noninteractive" \
 | 
			
		||||
  PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" \
 | 
			
		||||
# Optimize jemalloc 5.x performance
 | 
			
		||||
  MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0"
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
 | 
			
		||||
# Set default shell used for running commands
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"]
 | 
			
		||||
ENV DEBIAN_FRONTEND="noninteractive" \
 | 
			
		||||
    PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin"
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
# Ignoring these here since we don't want to pin any versions and the Debian image removes apt-get content after use
 | 
			
		||||
# hadolint ignore=DL3008,DL3009
 | 
			
		||||
RUN apt-get update && \
 | 
			
		||||
    echo "Etc/UTC" > /etc/localtime && \
 | 
			
		||||
    groupadd -g "${GID}" mastodon && \
 | 
			
		||||
    useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
 | 
			
		||||
    apt-get -y --no-install-recommends install whois \
 | 
			
		||||
        wget \
 | 
			
		||||
        procps \
 | 
			
		||||
        libssl3 \
 | 
			
		||||
        libpq5 \
 | 
			
		||||
        imagemagick \
 | 
			
		||||
        ffmpeg \
 | 
			
		||||
        libjemalloc2 \
 | 
			
		||||
        libicu72 \
 | 
			
		||||
        libidn12 \
 | 
			
		||||
        libyaml-0-2 \
 | 
			
		||||
        file \
 | 
			
		||||
        ca-certificates \
 | 
			
		||||
        tzdata \
 | 
			
		||||
        libreadline8 \
 | 
			
		||||
        tini && \
 | 
			
		||||
    ln -s /opt/mastodon /mastodon
 | 
			
		||||
 | 
			
		||||
RUN echo "Target platform is $TARGETPLATFORM"
 | 
			
		||||
# Note: no, cleaning here since Debian does this automatically
 | 
			
		||||
# See the file /etc/apt/apt.conf.d/docker-clean within the Docker image's filesystem
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Remove automatic apt cache Docker cleanup scripts
 | 
			
		||||
  rm -f /etc/apt/apt.conf.d/docker-clean; \
 | 
			
		||||
# Sets timezone
 | 
			
		||||
  echo "${TZ}" > /etc/localtime; \
 | 
			
		||||
# Creates mastodon user/group and sets home directory
 | 
			
		||||
  groupadd -g "${GID}" mastodon; \
 | 
			
		||||
  useradd -l -u "${UID}" -g "${GID}" -m -d /opt/mastodon mastodon; \
 | 
			
		||||
# Creates /mastodon symlink to /opt/mastodon
 | 
			
		||||
  ln -s /opt/mastodon /mastodon;
 | 
			
		||||
COPY --chown=mastodon:mastodon . /opt/mastodon
 | 
			
		||||
COPY --chown=mastodon:mastodon --from=build /opt/mastodon /opt/mastodon
 | 
			
		||||
 | 
			
		||||
# Set /opt/mastodon as working directory
 | 
			
		||||
ENV RAILS_ENV="production" \
 | 
			
		||||
    NODE_ENV="production" \
 | 
			
		||||
    RAILS_SERVE_STATIC_FILES="true" \
 | 
			
		||||
    BIND="0.0.0.0" \
 | 
			
		||||
    MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
 | 
			
		||||
    MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}"
 | 
			
		||||
 | 
			
		||||
# Set the run user
 | 
			
		||||
USER mastodon
 | 
			
		||||
WORKDIR /opt/mastodon
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3008,DL3005
 | 
			
		||||
RUN \
 | 
			
		||||
# Mount Apt cache and lib directories from Docker buildx caches
 | 
			
		||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
 | 
			
		||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
 | 
			
		||||
# Apt update & upgrade to check for security updates to Debian image
 | 
			
		||||
  apt-get update; \
 | 
			
		||||
  apt-get dist-upgrade -yq; \
 | 
			
		||||
# Install jemalloc, curl and other necessary components
 | 
			
		||||
  apt-get install -y --no-install-recommends \
 | 
			
		||||
    ca-certificates \
 | 
			
		||||
    curl \
 | 
			
		||||
    ffmpeg \
 | 
			
		||||
    file \
 | 
			
		||||
    imagemagick \
 | 
			
		||||
    libjemalloc2 \
 | 
			
		||||
    patchelf \
 | 
			
		||||
    procps \
 | 
			
		||||
    tini \
 | 
			
		||||
    tzdata \
 | 
			
		||||
    wget \
 | 
			
		||||
  ; \
 | 
			
		||||
# Patch Ruby to use jemalloc
 | 
			
		||||
  patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \
 | 
			
		||||
# Discard patchelf after use
 | 
			
		||||
  apt-get purge -y \
 | 
			
		||||
    patchelf \
 | 
			
		||||
  ;
 | 
			
		||||
# Precompile assets
 | 
			
		||||
RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile
 | 
			
		||||
 | 
			
		||||
# Create temporary build layer from base image
 | 
			
		||||
FROM ruby as build
 | 
			
		||||
 | 
			
		||||
# Copy Node package configuration files into working directory
 | 
			
		||||
COPY package.json yarn.lock .yarnrc.yml /opt/mastodon/
 | 
			
		||||
COPY .yarn /opt/mastodon/.yarn
 | 
			
		||||
 | 
			
		||||
COPY --from=node /usr/local/bin /usr/local/bin
 | 
			
		||||
COPY --from=node /usr/local/lib /usr/local/lib
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3008
 | 
			
		||||
RUN \
 | 
			
		||||
# Mount Apt cache and lib directories from Docker buildx caches
 | 
			
		||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
 | 
			
		||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
 | 
			
		||||
# Install build tools and bundler dependencies from APT
 | 
			
		||||
  apt-get install -y --no-install-recommends \
 | 
			
		||||
    g++ \
 | 
			
		||||
    gcc \
 | 
			
		||||
    git \
 | 
			
		||||
    libgdbm-dev \
 | 
			
		||||
    libgmp-dev \
 | 
			
		||||
    libicu-dev \
 | 
			
		||||
    libidn-dev \
 | 
			
		||||
    libpq-dev \
 | 
			
		||||
    libssl-dev \
 | 
			
		||||
    make \
 | 
			
		||||
    shared-mime-info \
 | 
			
		||||
    zlib1g-dev \
 | 
			
		||||
  ;
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Configure Corepack
 | 
			
		||||
  rm /usr/local/bin/yarn*; \
 | 
			
		||||
  corepack enable; \
 | 
			
		||||
  corepack prepare --activate;
 | 
			
		||||
 | 
			
		||||
# Create temporary bundler specific build layer from build layer
 | 
			
		||||
FROM build as bundler
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
 | 
			
		||||
# Copy Gemfile config into working directory
 | 
			
		||||
COPY Gemfile* /opt/mastodon/
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Mount Ruby Gem caches
 | 
			
		||||
--mount=type=cache,id=gem-cache-${TARGETPLATFORM},target=/usr/local/bundle/cache/,sharing=locked \
 | 
			
		||||
# Configure bundle to prevent changes to Gemfile and Gemfile.lock
 | 
			
		||||
  bundle config set --global frozen "true"; \
 | 
			
		||||
# Configure bundle to not cache downloaded Gems
 | 
			
		||||
  bundle config set --global cache_all "false"; \
 | 
			
		||||
# Configure bundle to only process production Gems
 | 
			
		||||
  bundle config set --local without "development test"; \
 | 
			
		||||
# Configure bundle to not warn about root user
 | 
			
		||||
  bundle config set silence_root_warning "true"; \
 | 
			
		||||
# Download and install required Gems
 | 
			
		||||
  bundle install -j"$(nproc)";
 | 
			
		||||
 | 
			
		||||
# Create temporary node specific build layer from build layer
 | 
			
		||||
FROM build as yarn
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
 | 
			
		||||
# Copy Node package configuration files into working directory
 | 
			
		||||
COPY package.json yarn.lock .yarnrc.yml /opt/mastodon/
 | 
			
		||||
COPY streaming/package.json /opt/mastodon/streaming/
 | 
			
		||||
COPY .yarn /opt/mastodon/.yarn
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3008
 | 
			
		||||
RUN \
 | 
			
		||||
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
 | 
			
		||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
 | 
			
		||||
# Install Node packages
 | 
			
		||||
  yarn workspaces focus --production @mastodon/mastodon;
 | 
			
		||||
 | 
			
		||||
# Create temporary assets build layer from build layer
 | 
			
		||||
FROM build as precompiler
 | 
			
		||||
 | 
			
		||||
# Copy Mastodon sources into precompiler layer
 | 
			
		||||
COPY . /opt/mastodon/
 | 
			
		||||
 | 
			
		||||
# Copy bundler and node packages from build layer to container
 | 
			
		||||
COPY --from=yarn /opt/mastodon /opt/mastodon/
 | 
			
		||||
COPY --from=bundler /opt/mastodon /opt/mastodon/
 | 
			
		||||
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Use Ruby on Rails to create Mastodon assets
 | 
			
		||||
  ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=precompile_placeholder \
 | 
			
		||||
  ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=precompile_placeholder \
 | 
			
		||||
  ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=precompile_placeholder \
 | 
			
		||||
  OTP_SECRET=precompile_placeholder \
 | 
			
		||||
  SECRET_KEY_BASE=precompile_placeholder \
 | 
			
		||||
  bundle exec rails assets:precompile; \
 | 
			
		||||
# Cleanup temporary files
 | 
			
		||||
  rm -fr /opt/mastodon/tmp;
 | 
			
		||||
 | 
			
		||||
# Prep final Mastodon Ruby layer
 | 
			
		||||
FROM ruby as mastodon
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3008
 | 
			
		||||
RUN \
 | 
			
		||||
# Mount Apt cache and lib directories from Docker buildx caches
 | 
			
		||||
--mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \
 | 
			
		||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
 | 
			
		||||
# Mount Corepack and Yarn caches from Docker buildx caches
 | 
			
		||||
--mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \
 | 
			
		||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
 | 
			
		||||
# Apt update install non-dev versions of necessary components
 | 
			
		||||
  apt-get install -y --no-install-recommends \
 | 
			
		||||
    libssl3 \
 | 
			
		||||
    libpq5 \
 | 
			
		||||
    libicu72 \
 | 
			
		||||
    libidn12 \
 | 
			
		||||
    libreadline8 \
 | 
			
		||||
    libyaml-0-2 \
 | 
			
		||||
  ;
 | 
			
		||||
 | 
			
		||||
# Copy Mastodon sources into final layer
 | 
			
		||||
COPY . /opt/mastodon/
 | 
			
		||||
 | 
			
		||||
# Copy compiled assets to layer
 | 
			
		||||
COPY --from=precompiler /opt/mastodon/public/packs /opt/mastodon/public/packs
 | 
			
		||||
COPY --from=precompiler /opt/mastodon/public/assets /opt/mastodon/public/assets
 | 
			
		||||
# Copy bundler components to layer
 | 
			
		||||
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Precompile bootsnap code for faster Rails startup
 | 
			
		||||
  bundle exec bootsnap precompile --gemfile app/ lib/;
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Pre-create and chown system volume to Mastodon user
 | 
			
		||||
  mkdir -p /opt/mastodon/public/system; \
 | 
			
		||||
  chown mastodon:mastodon /opt/mastodon/public/system; \
 | 
			
		||||
# Set Mastodon user as owner of tmp folder
 | 
			
		||||
  chown -R mastodon:mastodon /opt/mastodon/tmp;
 | 
			
		||||
 | 
			
		||||
# Set the running user for resulting container
 | 
			
		||||
USER mastodon
 | 
			
		||||
# Expose default Puma ports
 | 
			
		||||
EXPOSE 3000
 | 
			
		||||
# Set container tini as default entry point
 | 
			
		||||
# Set the work dir and the container entry point
 | 
			
		||||
ENTRYPOINT ["/usr/bin/tini", "--"]
 | 
			
		||||
EXPOSE 3000 4000
 | 
			
		||||
 | 
			
		||||
@ -1,35 +1,19 @@
 | 
			
		||||
# Federation
 | 
			
		||||
 | 
			
		||||
## Supported federation protocols and standards
 | 
			
		||||
 | 
			
		||||
- [ActivityPub](https://www.w3.org/TR/activitypub/) (Server-to-Server)
 | 
			
		||||
- [WebFinger](https://webfinger.net/)
 | 
			
		||||
- [Http Signatures](https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures)
 | 
			
		||||
- [NodeInfo](https://nodeinfo.diaspora.software/)
 | 
			
		||||
 | 
			
		||||
## Supported FEPs
 | 
			
		||||
 | 
			
		||||
- [FEP-67ff: FEDERATION.md](https://codeberg.org/fediverse/fep/src/branch/main/fep/67ff/fep-67ff.md)
 | 
			
		||||
- [FEP-f1d5: NodeInfo in Fediverse Software](https://codeberg.org/fediverse/fep/src/branch/main/fep/f1d5/fep-f1d5.md)
 | 
			
		||||
- [FEP-8fcf: Followers collection synchronization across servers](https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md)
 | 
			
		||||
- [FEP-5feb: Search indexing consent for actors](https://codeberg.org/fediverse/fep/src/branch/main/fep/5feb/fep-5feb.md)
 | 
			
		||||
 | 
			
		||||
## ActivityPub in Mastodon
 | 
			
		||||
## ActivityPub federation in Mastodon
 | 
			
		||||
 | 
			
		||||
Mastodon largely follows the ActivityPub server-to-server specification but it makes uses of some non-standard extensions, some of which are required for interacting with Mastodon at all.
 | 
			
		||||
 | 
			
		||||
- [Supported ActivityPub vocabulary](https://docs.joinmastodon.org/spec/activitypub/)
 | 
			
		||||
Supported vocabulary: https://docs.joinmastodon.org/spec/activitypub/
 | 
			
		||||
 | 
			
		||||
### Required extensions
 | 
			
		||||
 | 
			
		||||
#### WebFinger
 | 
			
		||||
#### Webfinger
 | 
			
		||||
 | 
			
		||||
In Mastodon, users are identified by a `username` and `domain` pair (e.g., `Gargron@mastodon.social`).
 | 
			
		||||
This is used both for discovery and for unambiguously mentioning users across the fediverse. Furthermore, this is part of Mastodon's database design from its very beginnings.
 | 
			
		||||
 | 
			
		||||
As a result, Mastodon requires that each ActivityPub actor uniquely maps back to an `acct:` URI that can be resolved via WebFinger.
 | 
			
		||||
 | 
			
		||||
- [WebFinger information and examples](https://docs.joinmastodon.org/spec/webfinger/)
 | 
			
		||||
More information and examples are available at: https://docs.joinmastodon.org/spec/webfinger/
 | 
			
		||||
 | 
			
		||||
#### HTTP Signatures
 | 
			
		||||
 | 
			
		||||
@ -37,13 +21,11 @@ In order to authenticate activities, Mastodon relies on HTTP Signatures, signing
 | 
			
		||||
 | 
			
		||||
Mastodon requires all `POST` requests to be signed, and MAY require `GET` requests to be signed, depending on the configuration of the Mastodon server.
 | 
			
		||||
 | 
			
		||||
- [HTTP Signatures information and examples](https://docs.joinmastodon.org/spec/security/#http)
 | 
			
		||||
More information on HTTP Signatures, as well as examples, can be found here: https://docs.joinmastodon.org/spec/security/#http
 | 
			
		||||
 | 
			
		||||
### Optional extensions
 | 
			
		||||
 | 
			
		||||
- [Linked-Data Signatures](https://docs.joinmastodon.org/spec/security/#ld)
 | 
			
		||||
- [Bearcaps](https://docs.joinmastodon.org/spec/bearcaps/)
 | 
			
		||||
 | 
			
		||||
### Additional documentation
 | 
			
		||||
 | 
			
		||||
- [Mastodon documentation](https://docs.joinmastodon.org/)
 | 
			
		||||
- Linked-Data Signatures: https://docs.joinmastodon.org/spec/security/#ld
 | 
			
		||||
- Bearcaps: https://docs.joinmastodon.org/spec/bearcaps/
 | 
			
		||||
- Followers collection synchronization: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md
 | 
			
		||||
- Search indexing consent for actors: https://codeberg.org/fediverse/fep/src/branch/main/fep/5feb/fep-5feb.md
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										89
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								Gemfile
									
									
									
									
									
								
							@ -1,32 +1,29 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
source 'https://rubygems.org'
 | 
			
		||||
ruby '>= 3.1.0'
 | 
			
		||||
ruby '>= 3.0.0'
 | 
			
		||||
 | 
			
		||||
gem 'propshaft'
 | 
			
		||||
gem 'puma', '~> 6.3'
 | 
			
		||||
gem 'rack', '~> 2.2.7'
 | 
			
		||||
gem 'rails', '~> 7.1.1'
 | 
			
		||||
gem 'rails', '~> 7.0'
 | 
			
		||||
gem 'sprockets', '~> 3.7.2'
 | 
			
		||||
gem 'thor', '~> 1.2'
 | 
			
		||||
gem 'rack', '~> 2.2.7'
 | 
			
		||||
 | 
			
		||||
# For why irb is in the Gemfile, see: https://ruby.social/@st0012/111444685161478182
 | 
			
		||||
gem 'irb', '~> 1.8'
 | 
			
		||||
 | 
			
		||||
gem 'dotenv'
 | 
			
		||||
gem 'haml-rails', '~>2.0'
 | 
			
		||||
gem 'pg', '~> 1.5'
 | 
			
		||||
gem 'pghero'
 | 
			
		||||
gem 'dotenv-rails', '~> 2.8'
 | 
			
		||||
 | 
			
		||||
gem 'aws-sdk-s3', '~> 1.123', require: false
 | 
			
		||||
gem 'blurhash', '~> 0.1'
 | 
			
		||||
gem 'fog-core', '<= 2.4.0'
 | 
			
		||||
gem 'fog-openstack', '~> 1.0', require: false
 | 
			
		||||
gem 'fog-openstack', '~> 0.3', require: false
 | 
			
		||||
gem 'kt-paperclip', '~> 7.2'
 | 
			
		||||
gem 'md-paperclip-azure', '~> 2.2', require: false
 | 
			
		||||
gem 'blurhash', '~> 0.1'
 | 
			
		||||
 | 
			
		||||
gem 'active_model_serializers', '~> 0.10'
 | 
			
		||||
gem 'addressable', '~> 2.8'
 | 
			
		||||
gem 'bootsnap', '~> 1.18.0', require: false
 | 
			
		||||
gem 'bootsnap', '~> 1.16.0', require: false
 | 
			
		||||
gem 'browser'
 | 
			
		||||
gem 'charlock_holmes', '~> 0.7.7'
 | 
			
		||||
gem 'chewy', '~> 7.3'
 | 
			
		||||
@ -39,63 +36,64 @@ end
 | 
			
		||||
 | 
			
		||||
gem 'net-ldap', '~> 0.18'
 | 
			
		||||
 | 
			
		||||
gem 'omniauth', '~> 2.0'
 | 
			
		||||
gem 'omniauth-cas', '~> 3.0.0.beta.1'
 | 
			
		||||
gem 'omniauth_openid_connect', '~> 0.6.1'
 | 
			
		||||
gem 'omniauth-rails_csrf_protection', '~> 1.0'
 | 
			
		||||
# TODO: Point back at released omniauth-cas gem when PR merged
 | 
			
		||||
# https://github.com/dlindahl/omniauth-cas/pull/68
 | 
			
		||||
gem 'omniauth-cas', github: 'stanhu/omniauth-cas', ref: '4211e6d05941b4a981f9a36b49ec166cecd0e271'
 | 
			
		||||
gem 'omniauth-saml', '~> 2.0'
 | 
			
		||||
gem 'omniauth_openid_connect', '~> 0.6.1'
 | 
			
		||||
gem 'omniauth', '~> 2.0'
 | 
			
		||||
gem 'omniauth-rails_csrf_protection', '~> 1.0'
 | 
			
		||||
 | 
			
		||||
gem 'color_diff', '~> 0.1'
 | 
			
		||||
gem 'csv', '~> 3.2'
 | 
			
		||||
gem 'discard', '~> 1.2'
 | 
			
		||||
gem 'doorkeeper', '~> 5.6'
 | 
			
		||||
gem 'ed25519', '~> 1.3'
 | 
			
		||||
gem 'fast_blank', '~> 1.0'
 | 
			
		||||
gem 'fastimage'
 | 
			
		||||
gem 'hiredis', '~> 0.6'
 | 
			
		||||
gem 'redis-namespace', '~> 1.10'
 | 
			
		||||
gem 'htmlentities', '~> 4.3'
 | 
			
		||||
gem 'http', '~> 5.2.0'
 | 
			
		||||
gem 'http', '~> 5.1'
 | 
			
		||||
gem 'http_accept_language', '~> 2.1'
 | 
			
		||||
gem 'httplog', '~> 1.6.2'
 | 
			
		||||
gem 'i18n', '1.14.1' # TODO: Remove version when resolved: https://github.com/glebm/i18n-tasks/issues/552 / https://github.com/ruby-i18n/i18n/pull/688
 | 
			
		||||
gem 'idn-ruby', require: 'idn'
 | 
			
		||||
gem 'inline_svg'
 | 
			
		||||
gem 'kaminari', '~> 1.2'
 | 
			
		||||
gem 'link_header', '~> 0.0'
 | 
			
		||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
 | 
			
		||||
gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar'
 | 
			
		||||
gem 'nokogiri', '~> 1.15'
 | 
			
		||||
gem 'nsa'
 | 
			
		||||
gem 'oj', '~> 3.14'
 | 
			
		||||
gem 'ox', '~> 2.14'
 | 
			
		||||
gem 'parslet'
 | 
			
		||||
gem 'premailer-rails'
 | 
			
		||||
gem 'public_suffix', '~> 5.0'
 | 
			
		||||
gem 'pundit', '~> 2.3'
 | 
			
		||||
gem 'premailer-rails'
 | 
			
		||||
gem 'rack-attack', '~> 6.6'
 | 
			
		||||
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
 | 
			
		||||
gem 'rails-i18n', '~> 7.0'
 | 
			
		||||
gem 'rails-settings-cached', '~> 0.6', git: 'https://github.com/mastodon/rails-settings-cached.git', branch: 'v0.6.6-aliases-true'
 | 
			
		||||
gem 'redcarpet', '~> 3.6'
 | 
			
		||||
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
 | 
			
		||||
gem 'redis-namespace', '~> 1.10'
 | 
			
		||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
 | 
			
		||||
gem 'rqrcode', '~> 2.2'
 | 
			
		||||
gem 'ruby-progressbar', '~> 1.13'
 | 
			
		||||
gem 'sanitize', '~> 6.0'
 | 
			
		||||
gem 'scenic', '~> 1.7'
 | 
			
		||||
gem 'sidekiq', '~> 6.5'
 | 
			
		||||
gem 'sidekiq-bulk', '~> 0.2.0'
 | 
			
		||||
gem 'sidekiq-scheduler', '~> 5.0'
 | 
			
		||||
gem 'sidekiq-unique-jobs', '~> 7.1'
 | 
			
		||||
gem 'simple_form', '~> 5.2'
 | 
			
		||||
gem 'sidekiq-bulk', '~> 0.2.0'
 | 
			
		||||
gem 'simple-navigation', '~> 4.4'
 | 
			
		||||
gem 'stoplight', '~> 4.1'
 | 
			
		||||
gem 'strong_migrations', '1.8.0'
 | 
			
		||||
gem 'simple_form', '~> 5.2'
 | 
			
		||||
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
 | 
			
		||||
gem 'stoplight', '~> 3.0.1'
 | 
			
		||||
gem 'strong_migrations', '~> 0.8'
 | 
			
		||||
gem 'tty-prompt', '~> 0.23', require: false
 | 
			
		||||
gem 'twitter-text', '~> 3.1.0'
 | 
			
		||||
gem 'tzinfo-data', '~> 1.2023'
 | 
			
		||||
gem 'webauthn', '~> 3.0'
 | 
			
		||||
gem 'webpacker', '~> 5.4'
 | 
			
		||||
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
 | 
			
		||||
gem 'webauthn', '~> 3.0'
 | 
			
		||||
 | 
			
		||||
gem 'json-ld'
 | 
			
		||||
gem 'json-ld-preloaded', '~> 3.2'
 | 
			
		||||
@ -104,16 +102,13 @@ gem 'rdf-normalize', '~> 0.5'
 | 
			
		||||
gem 'private_address_check', '~> 0.5'
 | 
			
		||||
 | 
			
		||||
group :test do
 | 
			
		||||
  # Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
 | 
			
		||||
  gem 'rspec-github', '~> 2.4', require: false
 | 
			
		||||
  # Used to split testing into chunks in CI
 | 
			
		||||
  gem 'rspec_chunked', '~> 0.6'
 | 
			
		||||
 | 
			
		||||
  # RSpec progress bar formatter
 | 
			
		||||
  gem 'fuubar', '~> 2.5'
 | 
			
		||||
 | 
			
		||||
  # RSpec helpers for email specs
 | 
			
		||||
  gem 'email_spec'
 | 
			
		||||
 | 
			
		||||
  # Extra RSpec extension methods and helpers for sidekiq
 | 
			
		||||
  # Extra RSpec extenion methods and helpers for sidekiq
 | 
			
		||||
  gem 'rspec-sidekiq', '~> 4.0'
 | 
			
		||||
 | 
			
		||||
  # Browser integration testing
 | 
			
		||||
@ -124,7 +119,13 @@ group :test do
 | 
			
		||||
  gem 'database_cleaner-active_record'
 | 
			
		||||
 | 
			
		||||
  # Used to mock environment variables
 | 
			
		||||
  gem 'climate_control'
 | 
			
		||||
  gem 'climate_control', '~> 0.2'
 | 
			
		||||
 | 
			
		||||
  # Generating fake data for specs
 | 
			
		||||
  gem 'faker', '~> 3.2'
 | 
			
		||||
 | 
			
		||||
  # Generate test objects for specs
 | 
			
		||||
  gem 'fabrication', '~> 2.30'
 | 
			
		||||
 | 
			
		||||
  # Add back helpers functions removed in Rails 5.1
 | 
			
		||||
  gem 'rails-controller-testing', '~> 1.0'
 | 
			
		||||
@ -137,7 +138,6 @@ group :test do
 | 
			
		||||
 | 
			
		||||
  # Coverage formatter for RSpec test if DISABLE_SIMPLECOV is false
 | 
			
		||||
  gem 'simplecov', '~> 0.22', require: false
 | 
			
		||||
  gem 'simplecov-lcov', '~> 0.8', require: false
 | 
			
		||||
 | 
			
		||||
  # Stub web requests for specs
 | 
			
		||||
  gem 'webmock', '~> 3.18'
 | 
			
		||||
@ -169,20 +169,17 @@ group :development do
 | 
			
		||||
  # Linter CLI for HAML files
 | 
			
		||||
  gem 'haml_lint', require: false
 | 
			
		||||
 | 
			
		||||
  # Deployment automation
 | 
			
		||||
  gem 'capistrano', '~> 3.17'
 | 
			
		||||
  gem 'capistrano-rails', '~> 1.6'
 | 
			
		||||
  gem 'capistrano-rbenv', '~> 2.2'
 | 
			
		||||
  gem 'capistrano-yarn', '~> 2.0'
 | 
			
		||||
 | 
			
		||||
  # Validate missing i18n keys
 | 
			
		||||
  gem 'i18n-tasks', '~> 1.0', require: false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
group :development, :test do
 | 
			
		||||
  # Interactive Debugging tools
 | 
			
		||||
  gem 'debug', '~> 1.8'
 | 
			
		||||
 | 
			
		||||
  # Generate fake data values
 | 
			
		||||
  gem 'faker', '~> 3.2'
 | 
			
		||||
 | 
			
		||||
  # Generate factory objects
 | 
			
		||||
  gem 'fabrication', '~> 2.30'
 | 
			
		||||
 | 
			
		||||
  # Profiling tools
 | 
			
		||||
  gem 'memory_profiler', require: false
 | 
			
		||||
  gem 'ruby-prof', require: false
 | 
			
		||||
@ -197,12 +194,12 @@ group :production do
 | 
			
		||||
  gem 'lograge', '~> 0.12'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
gem 'cocoon', '~> 1.2'
 | 
			
		||||
gem 'concurrent-ruby', require: false
 | 
			
		||||
gem 'connection_pool', require: false
 | 
			
		||||
gem 'xorcist', '~> 1.1'
 | 
			
		||||
gem 'cocoon', '~> 1.2'
 | 
			
		||||
 | 
			
		||||
gem 'net-http', '~> 0.4.0'
 | 
			
		||||
gem 'net-http', '~> 0.3.2'
 | 
			
		||||
gem 'rubyzip', '~> 2.3'
 | 
			
		||||
 | 
			
		||||
gem 'hcaptcha', '~> 7.1'
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										623
									
								
								Gemfile.lock
									
									
									
									
									
								
							
							
						
						
									
										623
									
								
								Gemfile.lock
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
web: env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb
 | 
			
		||||
sidekiq: env PORT=3000 RAILS_ENV=development bundle exec sidekiq
 | 
			
		||||
stream: env PORT=4000 yarn workspace @mastodon/streaming start
 | 
			
		||||
stream: env PORT=4000 yarn run start
 | 
			
		||||
webpack: bin/webpack-dev-server
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								README.md
									
									
									
									
									
								
							@ -67,10 +67,10 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
 | 
			
		||||
 | 
			
		||||
### Requirements
 | 
			
		||||
 | 
			
		||||
- **PostgreSQL** 12+
 | 
			
		||||
- **PostgreSQL** 9.5+
 | 
			
		||||
- **Redis** 4+
 | 
			
		||||
- **Ruby** 3.1+
 | 
			
		||||
- **Node.js** 16+
 | 
			
		||||
- **Ruby** 2.7+
 | 
			
		||||
- **Node.js** 14+
 | 
			
		||||
 | 
			
		||||
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
 | 
			
		||||
 | 
			
		||||
@ -83,19 +83,22 @@ A **Vagrant** configuration is included for development purposes. To use it, com
 | 
			
		||||
- Install Vagrant and Virtualbox
 | 
			
		||||
- Install the `vagrant-hostsupdater` plugin: `vagrant plugin install vagrant-hostsupdater`
 | 
			
		||||
- Run `vagrant up`
 | 
			
		||||
- Run `vagrant ssh -c "cd /vagrant && bin/dev"`
 | 
			
		||||
- Run `vagrant ssh -c "cd /vagrant && foreman start"`
 | 
			
		||||
- Open `http://mastodon.local` in your browser
 | 
			
		||||
 | 
			
		||||
### MacOS
 | 
			
		||||
 | 
			
		||||
To set up **MacOS** for native development, complete the following steps:
 | 
			
		||||
 | 
			
		||||
- Use a Ruby version manager to install the specified version from `.ruby-version`
 | 
			
		||||
- Run `brew install postgresql@14 redis imagemagick libidn` to install required dependencies
 | 
			
		||||
- Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from `.nvmrc`
 | 
			
		||||
- Run `corepack enable && corepack prepare`
 | 
			
		||||
- Install the latest stable Ruby version (use a Ruby version manager for easy installation and management of Ruby versions)
 | 
			
		||||
- Run `brew install postgresql@14`
 | 
			
		||||
- Run `brew install redis`
 | 
			
		||||
- Run `brew install imagemagick`
 | 
			
		||||
- Install Foreman or a similar tool (such as [overmind](https://github.com/DarthSim/overmind)) to handle multiple process launching.
 | 
			
		||||
- Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from .nvmrc
 | 
			
		||||
- Run `corepack enable && yarn set version classic`
 | 
			
		||||
- Run `bundle exec rails db:setup` (optionally prepend `RAILS_ENV=development` to target the dev environment)
 | 
			
		||||
- Finally, run `bin/dev` which will launch the local services via `overmind` (if installed) or `foreman`
 | 
			
		||||
- Finally, run `overmind start -f Procfile.dev`
 | 
			
		||||
 | 
			
		||||
### Docker
 | 
			
		||||
 | 
			
		||||
@ -104,7 +107,7 @@ For development with **Docker**, complete the following steps:
 | 
			
		||||
- Install Docker Desktop
 | 
			
		||||
- Run `docker compose -f .devcontainer/docker-compose.yml up -d`
 | 
			
		||||
- Run `docker compose -f .devcontainer/docker-compose.yml exec app .devcontainer/post-create.sh`
 | 
			
		||||
- Finally, run `docker compose -f .devcontainer/docker-compose.yml exec app bin/dev`
 | 
			
		||||
- Finally, run `docker compose -f .devcontainer/docker-compose.yml exec app foreman start -f Procfile.dev`
 | 
			
		||||
 | 
			
		||||
If you are using an IDE with [support for the Development Container specification](https://containers.dev/supporting), it will run the above `docker compose` commands automatically. For **Visual Studio Code** this requires the [Dev Container extension](https://containers.dev/supporting#dev-containers).
 | 
			
		||||
 | 
			
		||||
@ -115,7 +118,7 @@ To get you coding in just a few minutes, GitHub Codespaces provides a web-based
 | 
			
		||||
- Click this button to create a new codespace:<br>
 | 
			
		||||
  [](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=52281283&devcontainer_path=.devcontainer%2Fcodespaces%2Fdevcontainer.json)
 | 
			
		||||
- Wait for the environment to build. This will take a few minutes.
 | 
			
		||||
- When the editor is ready, run `bin/dev` in the terminal.
 | 
			
		||||
- When the editor is ready, run `foreman start -f Procfile.dev` in the terminal.
 | 
			
		||||
- After a few seconds, a popup will appear with a button labeled _Open in Browser_. This will open Mastodon.
 | 
			
		||||
- On the _Ports_ tab, right click on the “stream” row and select _Port visibility_ → _Public_.
 | 
			
		||||
 | 
			
		||||
@ -129,7 +132,7 @@ You can open issues for bugs you've found or features you think are missing. You
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2016-2024 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md))
 | 
			
		||||
Copyright (C) 2016-2023 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md))
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								Vagrantfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								Vagrantfile
									
									
									
									
										vendored
									
									
								
							@ -10,11 +10,7 @@ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
 | 
			
		||||
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
 | 
			
		||||
 | 
			
		||||
# Add repo for NodeJS
 | 
			
		||||
sudo mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
NODE_MAJOR=20
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
sudo apt-get update
 | 
			
		||||
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -
 | 
			
		||||
 | 
			
		||||
# Add firewall rule to redirect 80 to PORT and save
 | 
			
		||||
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
 | 
			
		||||
@ -116,11 +112,11 @@ bundle install
 | 
			
		||||
 | 
			
		||||
# Install node modules
 | 
			
		||||
sudo corepack enable
 | 
			
		||||
corepack prepare
 | 
			
		||||
yarn set version classic
 | 
			
		||||
yarn install
 | 
			
		||||
 | 
			
		||||
# Build Mastodon
 | 
			
		||||
export RAILS_ENV=development
 | 
			
		||||
export RAILS_ENV=development 
 | 
			
		||||
export $(cat ".env.vagrant" | xargs)
 | 
			
		||||
bundle exec rails db:setup
 | 
			
		||||
 | 
			
		||||
@ -173,7 +169,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 | 
			
		||||
 | 
			
		||||
  # Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
 | 
			
		||||
  config.vm.network :forwarded_port, guest: 3000, host: 3000
 | 
			
		||||
  config.vm.network :forwarded_port, guest: 3035, host: 3035
 | 
			
		||||
  config.vm.network :forwarded_port, guest: 4000, host: 4000
 | 
			
		||||
  config.vm.network :forwarded_port, guest: 8080, host: 8080
 | 
			
		||||
  config.vm.network :forwarded_port, guest: 9200, host: 9200
 | 
			
		||||
@ -189,7 +184,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 | 
			
		||||
 | 
			
		||||
  config.vm.post_up_message = <<MESSAGE
 | 
			
		||||
To start server
 | 
			
		||||
  $ vagrant ssh -c "cd /vagrant && bin/dev"
 | 
			
		||||
  $ vagrant ssh -c "cd /vagrant && foreman start"
 | 
			
		||||
MESSAGE
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@ class PublicStatusesIndex < Chewy::Index
 | 
			
		||||
  index_scope ::Status.unscoped
 | 
			
		||||
                      .kept
 | 
			
		||||
                      .indexable
 | 
			
		||||
                      .includes(:media_attachments, :preloadable_poll, :tags, preview_cards_status: :preview_card)
 | 
			
		||||
                      .includes(:media_attachments, :preloadable_poll, :preview_cards, :tags)
 | 
			
		||||
 | 
			
		||||
  root date_detection: false do
 | 
			
		||||
    field(:id, type: 'long')
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ class StatusesIndex < Chewy::Index
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :local_mentioned, :local_favorited, :local_reblogged, :local_bookmarked, :tags, preview_cards_status: :preview_card, preloadable_poll: :local_voters), delete_if: ->(status) { status.searchable_by.empty? }
 | 
			
		||||
  index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preview_cards, :local_mentioned, :local_favorited, :local_reblogged, :local_bookmarked, :tags, preloadable_poll: :local_voters), delete_if: ->(status) { status.searchable_by.empty? }
 | 
			
		||||
 | 
			
		||||
  root date_detection: false do
 | 
			
		||||
    field(:id, type: 'long')
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,15 @@ class AboutController < ApplicationController
 | 
			
		||||
 | 
			
		||||
  skip_before_action :require_functional!
 | 
			
		||||
 | 
			
		||||
  before_action :set_instance_presenter
 | 
			
		||||
 | 
			
		||||
  def show
 | 
			
		||||
    expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def set_instance_presenter
 | 
			
		||||
    @instance_presenter = InstancePresenter.new
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,8 @@ class AccountsController < ApplicationController
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.html do
 | 
			
		||||
        expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.hour) unless user_signed_in?
 | 
			
		||||
 | 
			
		||||
        @rss_url = rss_url
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      format.rss do
 | 
			
		||||
@ -46,11 +48,11 @@ class AccountsController < ApplicationController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def default_statuses
 | 
			
		||||
    @account.statuses.distributable_visibility
 | 
			
		||||
    @account.statuses.where(visibility: [:public, :unlisted])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def only_media_scope
 | 
			
		||||
    Status.joins(:media_attachments).merge(@account.media_attachments).group(:id)
 | 
			
		||||
    Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def no_replies_scope
 | 
			
		||||
@ -82,21 +84,29 @@ class AccountsController < ApplicationController
 | 
			
		||||
      short_account_url(@account, format: 'rss')
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  helper_method :rss_url
 | 
			
		||||
 | 
			
		||||
  def media_requested?
 | 
			
		||||
    path_without_format.end_with?('/media') && !tag_requested?
 | 
			
		||||
    request.path.split('.').first.end_with?('/media') && !tag_requested?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def replies_requested?
 | 
			
		||||
    path_without_format.end_with?('/with_replies') && !tag_requested?
 | 
			
		||||
    request.path.split('.').first.end_with?('/with_replies') && !tag_requested?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def tag_requested?
 | 
			
		||||
    path_without_format.end_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
 | 
			
		||||
    request.path.split('.').first.end_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def path_without_format
 | 
			
		||||
    request.path.split('.').first
 | 
			
		||||
  def cached_filtered_status_page
 | 
			
		||||
    cache_collection_paginated_by_id(
 | 
			
		||||
      filtered_statuses,
 | 
			
		||||
      Status,
 | 
			
		||||
      PAGE_SIZE,
 | 
			
		||||
      params_slice(:max_id, :min_id, :since_id)
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def params_slice(*keys)
 | 
			
		||||
    params.slice(*keys).permit(*keys)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,6 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::BaseController < Api::BaseController
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  skip_before_action :require_authenticated_user!
 | 
			
		||||
  skip_before_action :require_not_suspended!
 | 
			
		||||
  skip_around_action :set_locale
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::ClaimsController < ActivityPub::BaseController
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  skip_before_action :authenticate_user!
 | 
			
		||||
 | 
			
		||||
  before_action :require_account_signature!
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::CollectionsController < ActivityPub::BaseController
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  vary_by -> { 'Signature' if authorized_fetch_mode? }
 | 
			
		||||
 | 
			
		||||
  before_action :require_account_signature!, if: :authorized_fetch_mode?
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::FollowersSynchronizationsController < ActivityPub::BaseController
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  vary_by -> { 'Signature' if authorized_fetch_mode? }
 | 
			
		||||
 | 
			
		||||
  before_action :require_account_signature!
 | 
			
		||||
@ -21,7 +24,7 @@ class ActivityPub::FollowersSynchronizationsController < ActivityPub::BaseContro
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_items
 | 
			
		||||
    @items = @account.followers.matches_uri_prefix(uri_prefix).pluck(:uri)
 | 
			
		||||
    @items = @account.followers.where(Account.arel_table[:uri].matches("#{Account.sanitize_sql_like(uri_prefix)}/%", false, true)).or(@account.followers.where(uri: uri_prefix)).pluck(:uri)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def collection_presenter
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::InboxesController < ActivityPub::BaseController
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include JsonLdHelper
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  before_action :skip_unknown_actor_activity
 | 
			
		||||
  before_action :require_actor_signature!
 | 
			
		||||
@ -22,7 +24,7 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
 | 
			
		||||
 | 
			
		||||
  def unknown_affected_account?
 | 
			
		||||
    json = Oj.load(body, mode: :strict)
 | 
			
		||||
    json.is_a?(Hash) && %w(Delete Update).include?(json['type']) && json['actor'].present? && json['actor'] == value_or_id(json['object']) && !Account.exists?(uri: json['actor'])
 | 
			
		||||
    json.is_a?(Hash) && %w(Delete Update).include?(json['type']) && json['actor'].present? && json['actor'] == value_or_id(json['object']) && !Account.where(uri: json['actor']).exists?
 | 
			
		||||
  rescue Oj::ParseError
 | 
			
		||||
    false
 | 
			
		||||
  end
 | 
			
		||||
@ -60,10 +62,11 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
 | 
			
		||||
    return if raw_params.blank? || ENV['DISABLE_FOLLOWERS_SYNCHRONIZATION'] == 'true' || signed_request_account.nil?
 | 
			
		||||
 | 
			
		||||
    # Re-using the syntax for signature parameters
 | 
			
		||||
    params = SignatureParser.parse(raw_params)
 | 
			
		||||
    tree   = SignatureParamsParser.new.parse(raw_params)
 | 
			
		||||
    params = SignatureParamsTransformer.new.apply(tree)
 | 
			
		||||
 | 
			
		||||
    ActivityPub::PrepareFollowersSynchronizationService.new.call(signed_request_account, params)
 | 
			
		||||
  rescue SignatureParser::ParsingError
 | 
			
		||||
  rescue Parslet::ParseFailed
 | 
			
		||||
    Rails.logger.warn 'Error parsing Collection-Synchronization header'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,9 @@
 | 
			
		||||
class ActivityPub::OutboxesController < ActivityPub::BaseController
 | 
			
		||||
  LIMIT = 20
 | 
			
		||||
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  vary_by -> { 'Signature' if authorized_fetch_mode? || page_requested? }
 | 
			
		||||
 | 
			
		||||
  before_action :require_account_signature!, if: :authorized_fetch_mode?
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,9 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::RepliesController < ActivityPub::BaseController
 | 
			
		||||
  include SignatureVerification
 | 
			
		||||
  include Authorization
 | 
			
		||||
  include AccountOwnedConcern
 | 
			
		||||
 | 
			
		||||
  DESCENDANTS_LIMIT = 60
 | 
			
		||||
 | 
			
		||||
@ -31,7 +33,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
 | 
			
		||||
 | 
			
		||||
  def set_replies
 | 
			
		||||
    @replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses
 | 
			
		||||
    @replies = @replies.distributable_visibility.where(in_reply_to_id: @status.id)
 | 
			
		||||
    @replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted])
 | 
			
		||||
    @replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ module Admin
 | 
			
		||||
        @moderation_notes = @account.targeted_moderation_notes.latest
 | 
			
		||||
        @warnings         = @account.strikes.custom.latest
 | 
			
		||||
 | 
			
		||||
        render 'admin/accounts/show'
 | 
			
		||||
        render template: 'admin/accounts/show'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -128,7 +128,7 @@ module Admin
 | 
			
		||||
    def unblock_email
 | 
			
		||||
      authorize @account, :unblock_email?
 | 
			
		||||
 | 
			
		||||
      CanonicalEmailBlock.matching_account(@account).delete_all
 | 
			
		||||
      CanonicalEmailBlock.where(reference_account: @account).delete_all
 | 
			
		||||
 | 
			
		||||
      log_action :unblock_email, @account
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ module Admin
 | 
			
		||||
 | 
			
		||||
    def index
 | 
			
		||||
      authorize :audit_log, :index?
 | 
			
		||||
      @auditable_accounts = Account.auditable.select(:id, :username)
 | 
			
		||||
      @auditable_accounts = Account.where(id: Admin::ActionLog.reorder(nil).select('distinct account_id')).select(:id, :username)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
@ -3,11 +3,11 @@
 | 
			
		||||
module Admin
 | 
			
		||||
  class ConfirmationsController < BaseController
 | 
			
		||||
    before_action :set_user
 | 
			
		||||
    before_action :redirect_confirmed_user, only: [:resend], if: :user_confirmed?
 | 
			
		||||
    before_action :check_confirmation, only: [:resend]
 | 
			
		||||
 | 
			
		||||
    def create
 | 
			
		||||
      authorize @user, :confirm?
 | 
			
		||||
      @user.mark_email_as_confirmed!
 | 
			
		||||
      @user.confirm!
 | 
			
		||||
      log_action :confirm, @user
 | 
			
		||||
      redirect_to admin_accounts_path
 | 
			
		||||
    end
 | 
			
		||||
@ -25,13 +25,11 @@ module Admin
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def redirect_confirmed_user
 | 
			
		||||
      flash[:error] = I18n.t('admin.accounts.resend_confirmation.already_confirmed')
 | 
			
		||||
      redirect_to admin_accounts_path
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def user_confirmed?
 | 
			
		||||
      @user.confirmed?
 | 
			
		||||
    def check_confirmation
 | 
			
		||||
      if @user.confirmed?
 | 
			
		||||
        flash[:error] = I18n.t('admin.accounts.resend_confirmation.already_confirmed')
 | 
			
		||||
        redirect_to admin_accounts_path
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ class Admin::Disputes::AppealsController < Admin::BaseController
 | 
			
		||||
    authorize @appeal, :approve?
 | 
			
		||||
    log_action :reject, @appeal
 | 
			
		||||
    @appeal.reject!(current_account)
 | 
			
		||||
    UserMailer.appeal_rejected(@appeal.account.user, @appeal).deliver_later
 | 
			
		||||
    UserMailer.appeal_rejected(@appeal.account.user, @appeal)
 | 
			
		||||
    redirect_to disputes_strike_path(@appeal.strike)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,8 @@ class Admin::DomainAllowsController < Admin::BaseController
 | 
			
		||||
  def destroy
 | 
			
		||||
    authorize @domain_allow, :destroy?
 | 
			
		||||
    UnallowDomainService.new.call(@domain_allow)
 | 
			
		||||
    log_action :destroy, @domain_allow
 | 
			
		||||
 | 
			
		||||
    redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ module Admin
 | 
			
		||||
 | 
			
		||||
      # Disallow accidentally downgrading a domain block
 | 
			
		||||
      if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block)
 | 
			
		||||
        @domain_block.validate
 | 
			
		||||
        @domain_block.save
 | 
			
		||||
        flash.now[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe
 | 
			
		||||
        @domain_block.errors.delete(:domain)
 | 
			
		||||
        return render :new
 | 
			
		||||
 | 
			
		||||
@ -38,9 +38,9 @@ module Admin
 | 
			
		||||
          log_action :create, @email_domain_block
 | 
			
		||||
 | 
			
		||||
          (@email_domain_block.other_domains || []).uniq.each do |domain|
 | 
			
		||||
            next if EmailDomainBlock.exists?(domain: domain)
 | 
			
		||||
            next if EmailDomainBlock.where(domain: domain).exists?
 | 
			
		||||
 | 
			
		||||
            other_email_domain_block = EmailDomainBlock.create!(domain: domain, allow_with_approval: @email_domain_block.allow_with_approval, parent: @email_domain_block)
 | 
			
		||||
            other_email_domain_block = EmailDomainBlock.create!(domain: domain, parent: @email_domain_block)
 | 
			
		||||
            log_action :create, other_email_domain_block
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
@ -65,7 +65,7 @@ module Admin
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def resource_params
 | 
			
		||||
      params.require(:email_domain_block).permit(:domain, :allow_with_approval, other_domains: [])
 | 
			
		||||
      params.require(:email_domain_block).permit(:domain, other_domains: [])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def form_email_domain_block_batch_params
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ require 'csv'
 | 
			
		||||
 | 
			
		||||
module Admin
 | 
			
		||||
  class ExportDomainAllowsController < BaseController
 | 
			
		||||
    include Admin::ExportControllerConcern
 | 
			
		||||
    include AdminExportControllerConcern
 | 
			
		||||
 | 
			
		||||
    before_action :set_dummy_import!, only: [:new]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ require 'csv'
 | 
			
		||||
 | 
			
		||||
module Admin
 | 
			
		||||
  class ExportDomainBlocksController < BaseController
 | 
			
		||||
    include Admin::ExportControllerConcern
 | 
			
		||||
    include AdminExportControllerConcern
 | 
			
		||||
 | 
			
		||||
    before_action :set_dummy_import!, only: [:new]
 | 
			
		||||
 | 
			
		||||
@ -49,7 +49,7 @@ module Admin
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @warning_domains = instances_from_imported_blocks.pluck(:domain)
 | 
			
		||||
      @warning_domains = Instance.where(domain: @domain_blocks.map(&:domain)).where('EXISTS (SELECT 1 FROM follows JOIN accounts ON follows.account_id = accounts.id OR follows.target_account_id = accounts.id WHERE accounts.domain = instances.domain)').pluck(:domain)
 | 
			
		||||
    rescue ActionController::ParameterMissing
 | 
			
		||||
      flash.now[:alert] = I18n.t('admin.export_domain_blocks.no_file')
 | 
			
		||||
      set_dummy_import!
 | 
			
		||||
@ -58,10 +58,6 @@ module Admin
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def instances_from_imported_blocks
 | 
			
		||||
      Instance.with_domain_follows(@domain_blocks.map(&:domain))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def export_filename
 | 
			
		||||
      'domain_blocks.csv'
 | 
			
		||||
    end
 | 
			
		||||
@ -72,7 +68,7 @@ module Admin
 | 
			
		||||
 | 
			
		||||
    def export_data
 | 
			
		||||
      CSV.generate(headers: export_headers, write_headers: true) do |content|
 | 
			
		||||
        DomainBlock.with_limitations.order(id: :asc).each do |instance|
 | 
			
		||||
        DomainBlock.with_limitations.each do |instance|
 | 
			
		||||
          content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate]
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ module Admin
 | 
			
		||||
      authorize :follow_recommendation, :show?
 | 
			
		||||
 | 
			
		||||
      @form     = Form::AccountBatch.new
 | 
			
		||||
      @accounts = filtered_follow_recommendations.page(params[:page])
 | 
			
		||||
      @accounts = filtered_follow_recommendations
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def update
 | 
			
		||||
 | 
			
		||||
@ -49,7 +49,7 @@ module Admin
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def set_instance
 | 
			
		||||
      @instance = Instance.find_or_initialize_by(domain: TagManager.instance.normalize_domain(params[:id]&.strip))
 | 
			
		||||
      @instance = Instance.find(TagManager.instance.normalize_domain(params[:id]&.strip))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def set_instances
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ module Admin
 | 
			
		||||
        @relay.enable!
 | 
			
		||||
        redirect_to admin_relays_path
 | 
			
		||||
      else
 | 
			
		||||
        render :new
 | 
			
		||||
        render action: :new
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@ module Admin
 | 
			
		||||
        @form         = Admin::StatusBatchAction.new
 | 
			
		||||
        @statuses     = @report.statuses.with_includes
 | 
			
		||||
 | 
			
		||||
        render 'admin/reports/show'
 | 
			
		||||
        render template: 'admin/reports/show'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,7 @@ module Admin
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def resource_params
 | 
			
		||||
      params.require(:rule).permit(:text, :hint, :priority)
 | 
			
		||||
      params.require(:rule).permit(:text, :priority)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -31,11 +31,6 @@ module Admin
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def batched_ordered_status_edits
 | 
			
		||||
      @status.edits.includes(:account, status: [:account]).find_each(order: :asc)
 | 
			
		||||
    end
 | 
			
		||||
    helper_method :batched_ordered_status_edits
 | 
			
		||||
 | 
			
		||||
    def admin_status_batch_action_params
 | 
			
		||||
      params.require(:admin_status_batch_action).permit(status_ids: [])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -4,12 +4,9 @@ class Api::BaseController < ApplicationController
 | 
			
		||||
  DEFAULT_STATUSES_LIMIT = 20
 | 
			
		||||
  DEFAULT_ACCOUNTS_LIMIT = 40
 | 
			
		||||
 | 
			
		||||
  include Api::RateLimitHeaders
 | 
			
		||||
  include Api::AccessTokenTrackingConcern
 | 
			
		||||
  include Api::CachingConcern
 | 
			
		||||
  include Api::ContentSecurityPolicy
 | 
			
		||||
  include Api::ErrorHandling
 | 
			
		||||
  include Api::Pagination
 | 
			
		||||
  include RateLimitHeaders
 | 
			
		||||
  include AccessTokenTrackingConcern
 | 
			
		||||
  include ApiCachingConcern
 | 
			
		||||
 | 
			
		||||
  skip_before_action :require_functional!, unless: :limited_federation_mode?
 | 
			
		||||
 | 
			
		||||
@ -20,8 +17,73 @@ class Api::BaseController < ApplicationController
 | 
			
		||||
 | 
			
		||||
  protect_from_forgery with: :null_session
 | 
			
		||||
 | 
			
		||||
  content_security_policy do |p|
 | 
			
		||||
    # Set every directive that does not have a fallback
 | 
			
		||||
    p.default_src :none
 | 
			
		||||
    p.frame_ancestors :none
 | 
			
		||||
    p.form_action :none
 | 
			
		||||
 | 
			
		||||
    # Disable every directive with a fallback to cut on response size
 | 
			
		||||
    p.base_uri false
 | 
			
		||||
    p.font_src false
 | 
			
		||||
    p.img_src false
 | 
			
		||||
    p.style_src false
 | 
			
		||||
    p.media_src false
 | 
			
		||||
    p.frame_src false
 | 
			
		||||
    p.manifest_src false
 | 
			
		||||
    p.connect_src false
 | 
			
		||||
    p.script_src false
 | 
			
		||||
    p.child_src false
 | 
			
		||||
    p.worker_src false
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
 | 
			
		||||
    render json: { error: e.to_s }, status: 422
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from ActiveRecord::RecordNotUnique do
 | 
			
		||||
    render json: { error: 'Duplicate record' }, status: 422
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from Date::Error do
 | 
			
		||||
    render json: { error: 'Invalid date supplied' }, status: 422
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from ActiveRecord::RecordNotFound do
 | 
			
		||||
    render json: { error: 'Record not found' }, status: 404
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do
 | 
			
		||||
    render json: { error: 'Remote data could not be fetched' }, status: 503
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from OpenSSL::SSL::SSLError do
 | 
			
		||||
    render json: { error: 'Remote SSL certificate could not be verified' }, status: 503
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from Mastodon::NotPermittedError do
 | 
			
		||||
    render json: { error: 'This action is not allowed' }, status: 403
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from Seahorse::Client::NetworkingError do |e|
 | 
			
		||||
    Rails.logger.warn "Storage server error: #{e}"
 | 
			
		||||
    render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight do
 | 
			
		||||
    render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from Mastodon::RateLimitExceededError do
 | 
			
		||||
    render json: { error: I18n.t('errors.429') }, status: 429
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from ActionController::ParameterMissing, Mastodon::InvalidParameterError do |e|
 | 
			
		||||
    render json: { error: e.to_s }, status: 400
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def doorkeeper_unauthorized_render_options(error: nil)
 | 
			
		||||
    { json: { error: error.try(:description) || 'Not authorized' } }
 | 
			
		||||
    { json: { error: (error.try(:description) || 'Not authorized') } }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def doorkeeper_forbidden_render_options(*)
 | 
			
		||||
@ -30,6 +92,13 @@ class Api::BaseController < ApplicationController
 | 
			
		||||
 | 
			
		||||
  protected
 | 
			
		||||
 | 
			
		||||
  def set_pagination_headers(next_path = nil, prev_path = nil)
 | 
			
		||||
    links = []
 | 
			
		||||
    links << [next_path, [%w(rel next)]] if next_path
 | 
			
		||||
    links << [prev_path, [%w(rel prev)]] if prev_path
 | 
			
		||||
    response.headers['Link'] = LinkHeader.new(links) unless links.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def limit_param(default_limit)
 | 
			
		||||
    return default_limit unless params[:limit]
 | 
			
		||||
 | 
			
		||||
@ -55,7 +124,7 @@ class Api::BaseController < ApplicationController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def require_not_suspended!
 | 
			
		||||
    render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.unavailable?
 | 
			
		||||
    render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.suspended?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def require_user!
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class Api::V1::Accounts::CredentialsController < Api::BaseController
 | 
			
		||||
  before_action -> { doorkeeper_authorize! :read, :'read:accounts', :'read:me' }, except: [:update]
 | 
			
		||||
  before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, except: [:update]
 | 
			
		||||
  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update]
 | 
			
		||||
  before_action :require_user!
 | 
			
		||||
 | 
			
		||||
@ -16,8 +16,6 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
 | 
			
		||||
    current_user.update(user_params) if user_params
 | 
			
		||||
    ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
 | 
			
		||||
    render json: @account, serializer: REST::CredentialAccountSerializer
 | 
			
		||||
  rescue ActiveRecord::RecordInvalid => e
 | 
			
		||||
    render json: ValidationErrorFormatter.new(e).as_json, status: 422
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ class Api::V1::Accounts::FamiliarFollowersController < Api::BaseController
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def set_accounts
 | 
			
		||||
    @accounts = Account.without_suspended.where(id: account_ids).select('id, hide_collections')
 | 
			
		||||
    @accounts = Account.without_suspended.where(id: account_ids).select('id, hide_collections').index_by(&:id).values_at(*account_ids).compact
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def familiar_followers
 | 
			
		||||
 | 
			
		||||
@ -21,16 +21,16 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
 | 
			
		||||
    return [] if hide_results?
 | 
			
		||||
 | 
			
		||||
    scope = default_accounts
 | 
			
		||||
    scope = scope.not_excluded_by_account(current_account) unless current_account.nil? || current_account.id == @account.id
 | 
			
		||||
    scope = scope.where.not(id: current_account.excluded_from_timeline_account_ids) unless current_account.nil? || current_account.id == @account.id
 | 
			
		||||
    scope.merge(paginated_follows).to_a
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def hide_results?
 | 
			
		||||
    @account.unavailable? || (@account.hides_followers? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
 | 
			
		||||
    @account.suspended? || (@account.hides_followers? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def default_accounts
 | 
			
		||||
    Account.includes(:active_relationships, :account_stat, :user).references(:active_relationships)
 | 
			
		||||
    Account.includes(:active_relationships, :account_stat).references(:active_relationships)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def paginated_follows
 | 
			
		||||
@ -41,6 +41,10 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_account_followers_url pagination_params(max_id: pagination_max_id) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -21,16 +21,16 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
 | 
			
		||||
    return [] if hide_results?
 | 
			
		||||
 | 
			
		||||
    scope = default_accounts
 | 
			
		||||
    scope = scope.not_excluded_by_account(current_account) unless current_account.nil? || current_account.id == @account.id
 | 
			
		||||
    scope = scope.where.not(id: current_account.excluded_from_timeline_account_ids) unless current_account.nil? || current_account.id == @account.id
 | 
			
		||||
    scope.merge(paginated_follows).to_a
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def hide_results?
 | 
			
		||||
    @account.unavailable? || (@account.hides_following? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
 | 
			
		||||
    @account.suspended? || (@account.hides_following? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def default_accounts
 | 
			
		||||
    Account.includes(:passive_relationships, :account_stat, :user).references(:passive_relationships)
 | 
			
		||||
    Account.includes(:passive_relationships, :account_stat).references(:passive_relationships)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def paginated_follows
 | 
			
		||||
@ -41,6 +41,10 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_account_following_index_url pagination_params(max_id: pagination_max_id) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -5,9 +5,10 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController
 | 
			
		||||
  before_action :require_user!
 | 
			
		||||
 | 
			
		||||
  def index
 | 
			
		||||
    @accounts = Account.where(id: account_ids).select(:id, :domain)
 | 
			
		||||
    @accounts.merge!(Account.without_suspended) unless truthy_param?(:with_suspended)
 | 
			
		||||
    render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships
 | 
			
		||||
    @accounts = Account.without_suspended.where(id: account_ids).select(:id, :domain).to_a
 | 
			
		||||
    # .where doesn't guarantee that our results are in the same order
 | 
			
		||||
    # we requested them, so return the "right" order to the requestor.
 | 
			
		||||
    render json: @accounts.index_by(&:id).values_at(*account_ids).compact, each_serializer: REST::RelationshipSerializer, relationships: relationships
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
 | 
			
		||||
  before_action -> { authorize_if_got_token! :read, :'read:statuses' }
 | 
			
		||||
  before_action :set_account
 | 
			
		||||
 | 
			
		||||
  after_action :insert_pagination_headers
 | 
			
		||||
  after_action :insert_pagination_headers, unless: -> { truthy_param?(:pinned) }
 | 
			
		||||
 | 
			
		||||
  def index
 | 
			
		||||
    cache_if_unauthenticated!
 | 
			
		||||
@ -19,7 +19,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def load_statuses
 | 
			
		||||
    @account.unavailable? ? [] : cached_account_statuses
 | 
			
		||||
    @account.suspended? ? [] : cached_account_statuses
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def cached_account_statuses
 | 
			
		||||
@ -35,6 +35,10 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
 | 
			
		||||
    params.slice(:limit, *AccountStatusesFilter::KEYS).permit(:limit, *AccountStatusesFilter::KEYS).merge(core_params)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_account_statuses_url pagination_params(max_id: pagination_max_id) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
@ -47,7 +51,11 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
 | 
			
		||||
    @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_collection
 | 
			
		||||
    @statuses
 | 
			
		||||
  def pagination_max_id
 | 
			
		||||
    @statuses.last.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_since_id
 | 
			
		||||
    @statuses.first.id
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,6 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class Api::V1::AccountsController < Api::BaseController
 | 
			
		||||
  include RegistrationHelper
 | 
			
		||||
 | 
			
		||||
  before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:create, :follow, :unfollow, :remove_from_followers, :block, :unblock, :mute, :unmute]
 | 
			
		||||
  before_action -> { doorkeeper_authorize! :follow, :write, :'write:follows' }, only: [:follow, :unfollow, :remove_from_followers]
 | 
			
		||||
  before_action -> { doorkeeper_authorize! :follow, :write, :'write:mutes' }, only: [:mute, :unmute]
 | 
			
		||||
@ -49,7 +47,7 @@ class Api::V1::AccountsController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def mute
 | 
			
		||||
    MuteService.new.call(current_user.account, @account, notifications: truthy_param?(:notifications), duration: params[:duration].to_i)
 | 
			
		||||
    MuteService.new.call(current_user.account, @account, notifications: truthy_param?(:notifications), duration: (params[:duration]&.to_i || 0))
 | 
			
		||||
    render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -92,14 +90,18 @@ class Api::V1::AccountsController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def account_params
 | 
			
		||||
    params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone, :invite_code)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def invite
 | 
			
		||||
    Invite.find_by(code: params[:invite_code]) if params[:invite_code].present?
 | 
			
		||||
    params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def check_enabled_registrations
 | 
			
		||||
    forbidden unless allowed_registration?(request.remote_ip, invite)
 | 
			
		||||
    forbidden if single_user_mode? || omniauth_only? || !allowed_registrations?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def allowed_registrations?
 | 
			
		||||
    Setting.registrations_mode != 'none'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def omniauth_only?
 | 
			
		||||
    ENV['OMNIAUTH_ONLY'] == 'true'
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -125,6 +125,10 @@ class Api::V1::Admin::AccountsController < Api::BaseController
 | 
			
		||||
    translated_params
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_admin_accounts_url(pagination_params(max_id: pagination_max_id)) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
@ -133,8 +137,12 @@ class Api::V1::Admin::AccountsController < Api::BaseController
 | 
			
		||||
    api_v1_admin_accounts_url(pagination_params(min_id: pagination_since_id)) unless @accounts.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_collection
 | 
			
		||||
    @accounts
 | 
			
		||||
  def pagination_max_id
 | 
			
		||||
    @accounts.last.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_since_id
 | 
			
		||||
    @accounts.first.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def records_continue?
 | 
			
		||||
 | 
			
		||||
@ -65,6 +65,10 @@ class Api::V1::Admin::CanonicalEmailBlocksController < Api::BaseController
 | 
			
		||||
    @canonical_email_block = CanonicalEmailBlock.find(params[:id])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_admin_canonical_email_blocks_url(pagination_params(max_id: pagination_max_id)) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
@ -73,8 +77,12 @@ class Api::V1::Admin::CanonicalEmailBlocksController < Api::BaseController
 | 
			
		||||
    api_v1_admin_canonical_email_blocks_url(pagination_params(min_id: pagination_since_id)) unless @canonical_email_blocks.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_collection
 | 
			
		||||
    @canonical_email_blocks
 | 
			
		||||
  def pagination_max_id
 | 
			
		||||
    @canonical_email_blocks.last.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_since_id
 | 
			
		||||
    @canonical_email_blocks.first.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def records_continue?
 | 
			
		||||
 | 
			
		||||
@ -61,6 +61,10 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController
 | 
			
		||||
    DomainAllow.all
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_admin_domain_allows_url(pagination_params(max_id: pagination_max_id)) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
@ -69,8 +73,12 @@ class Api::V1::Admin::DomainAllowsController < Api::BaseController
 | 
			
		||||
    api_v1_admin_domain_allows_url(pagination_params(min_id: pagination_since_id)) unless @domain_allows.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_collection
 | 
			
		||||
    @domain_allows
 | 
			
		||||
  def pagination_max_id
 | 
			
		||||
    @domain_allows.last.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_since_id
 | 
			
		||||
    @domain_allows.first.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def records_continue?
 | 
			
		||||
 | 
			
		||||
@ -29,10 +29,11 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
 | 
			
		||||
  def create
 | 
			
		||||
    authorize :domain_block, :create?
 | 
			
		||||
 | 
			
		||||
    @domain_block = DomainBlock.new(resource_params)
 | 
			
		||||
    existing_domain_block = resource_params[:domain].present? ? DomainBlock.rule_for(resource_params[:domain]) : nil
 | 
			
		||||
    return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if existing_domain_block.present?
 | 
			
		||||
    return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if conflicts_with_existing_block?(@domain_block, existing_domain_block)
 | 
			
		||||
 | 
			
		||||
    @domain_block = DomainBlock.create!(resource_params)
 | 
			
		||||
    @domain_block.save!
 | 
			
		||||
    DomainBlockWorker.perform_async(@domain_block.id)
 | 
			
		||||
    log_action :create, @domain_block
 | 
			
		||||
    render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
 | 
			
		||||
@ -55,6 +56,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def conflicts_with_existing_block?(domain_block, existing_domain_block)
 | 
			
		||||
    existing_domain_block.present? && (existing_domain_block.domain == TagManager.instance.normalize_domain(domain_block.domain) || !domain_block.stricter_than?(existing_domain_block))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_domain_blocks
 | 
			
		||||
    @domain_blocks = filtered_domain_blocks.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
 | 
			
		||||
  end
 | 
			
		||||
@ -72,6 +77,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
 | 
			
		||||
    params.permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
    api_v1_admin_domain_blocks_url(pagination_params(max_id: pagination_max_id)) if records_continue?
 | 
			
		||||
  end
 | 
			
		||||
@ -80,8 +89,12 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
 | 
			
		||||
    api_v1_admin_domain_blocks_url(pagination_params(min_id: pagination_since_id)) unless @domain_blocks.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_collection
 | 
			
		||||
    @domain_blocks
 | 
			
		||||
  def pagination_max_id
 | 
			
		||||
    @domain_blocks.last.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_since_id
 | 
			
		||||
    @domain_blocks.first.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def records_continue?
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,11 @@ class Api::V1::Admin::EmailDomainBlocksController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def resource_params
 | 
			
		||||
    params.permit(:domain, :allow_with_approval)
 | 
			
		||||
    params.permit(:domain)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def insert_pagination_headers
 | 
			
		||||
    set_pagination_headers(next_path, prev_path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_path
 | 
			
		||||
@ -66,8 +70,12 @@ class Api::V1::Admin::EmailDomainBlocksController < Api::BaseController
 | 
			
		||||
    api_v1_admin_email_domain_blocks_url(pagination_params(min_id: pagination_since_id)) unless @email_domain_blocks.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_collection
 | 
			
		||||
    @email_domain_blocks
 | 
			
		||||
  def pagination_max_id
 | 
			
		||||
    @email_domain_blocks.last.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pagination_since_id
 | 
			
		||||
    @email_domain_blocks.first.id
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def records_continue?
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user