forked from cybrespace/mastodon
		
	Fixing FanOutOnWriteService, fixing Sidekiq not having enough DB connections
in the pool, adding a throttle of 60rpm per IP, adding mini profiler, adding admin status to users
This commit is contained in:
		
							parent
							
								
									8eeec389c1
								
							
						
					
					
						commit
						e24bfbde1a
					
				
					 10 changed files with 36 additions and 13 deletions
				
			
		
							
								
								
									
										5
									
								
								Gemfile
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								Gemfile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -58,10 +58,13 @@ group :development do
 | 
			
		|||
  gem 'rubocop', require: false
 | 
			
		||||
  gem 'better_errors'
 | 
			
		||||
  gem 'binding_of_caller'
 | 
			
		||||
  gem 'rack-mini-profiler'
 | 
			
		||||
  gem 'letter_opener'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
group :production do
 | 
			
		||||
  gem 'rails_12factor'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
group :development, :production do
 | 
			
		||||
  gem 'rack-mini-profiler'
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,4 +2,11 @@ class ApplicationController < ActionController::Base
 | 
			
		|||
  # Prevent CSRF attacks by raising an exception.
 | 
			
		||||
  # For APIs, you may want to use :null_session instead.
 | 
			
		||||
  protect_from_forgery with: :exception
 | 
			
		||||
 | 
			
		||||
  # Profiling
 | 
			
		||||
  before_action do
 | 
			
		||||
    if current_user && current_user.admin?
 | 
			
		||||
      Rack::MiniProfiler.authorize_request
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ class FeedManager
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def self.filter_status?(status, follower)
 | 
			
		||||
    replied_to_user = status.reply? ? status.thread.account : nil
 | 
			
		||||
    (status.reply? && !(follower.id = replied_to_user.id || follower.following?(replied_to_user)))
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,4 +7,8 @@ class User < ActiveRecord::Base
 | 
			
		|||
  validates :account, presence: true
 | 
			
		||||
 | 
			
		||||
  has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner
 | 
			
		||||
 | 
			
		||||
  def admin?
 | 
			
		||||
    self.admin
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ class FanOutOnWriteService < BaseService
 | 
			
		|||
  # @param [Status] status
 | 
			
		||||
  def call(status)
 | 
			
		||||
    deliver_to_self(status) if status.account.local?
 | 
			
		||||
    deliver_to_followers(status, status.reply? ? status.thread.account : nil)
 | 
			
		||||
    deliver_to_followers(status)
 | 
			
		||||
    deliver_to_mentioned(status)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ class FanOutOnWriteService < BaseService
 | 
			
		|||
    push(:home, status.account.id, status)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def deliver_to_followers(status, replied_to_user)
 | 
			
		||||
  def deliver_to_followers(status)
 | 
			
		||||
    status.account.followers.each do |follower|
 | 
			
		||||
      next if !follower.local? || FeedManager.filter_status?(status, follower)
 | 
			
		||||
      push(:home, follower.id, status)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
default: &default
 | 
			
		||||
  adapter: postgresql
 | 
			
		||||
  pool: 5
 | 
			
		||||
  pool: 25
 | 
			
		||||
  timeout: 5000
 | 
			
		||||
  encoding: unicode
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,5 @@
 | 
			
		|||
class Rack::Attack
 | 
			
		||||
  # TODO
 | 
			
		||||
  throttle('req/ip', limit: 300, period: 5.minutes) do |req|
 | 
			
		||||
    req.ip
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
require 'sidekiq/web'
 | 
			
		||||
 | 
			
		||||
Rails.application.routes.draw do
 | 
			
		||||
  authenticate :user do
 | 
			
		||||
  authenticate :user, lambda { |u| u.admin? } do
 | 
			
		||||
    mount Sidekiq::Web => '/sidekiq'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								db/migrate/20160325130944_add_admin_to_users.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								db/migrate/20160325130944_add_admin_to_users.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
class AddAdminToUsers < ActiveRecord::Migration
 | 
			
		||||
  def change
 | 
			
		||||
    add_column :users, :admin, :boolean, default: false
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +11,7 @@
 | 
			
		|||
#
 | 
			
		||||
# It's strongly recommended that you check this file into your version control system.
 | 
			
		||||
 | 
			
		||||
ActiveRecord::Schema.define(version: 20160322193748) do
 | 
			
		||||
ActiveRecord::Schema.define(version: 20160325130944) do
 | 
			
		||||
 | 
			
		||||
  # These are extensions that must be enabled in order to support this database
 | 
			
		||||
  enable_extension "plpgsql"
 | 
			
		||||
| 
						 | 
				
			
			@ -156,6 +156,7 @@ ActiveRecord::Schema.define(version: 20160322193748) do
 | 
			
		|||
    t.datetime "last_sign_in_at"
 | 
			
		||||
    t.inet     "current_sign_in_ip"
 | 
			
		||||
    t.inet     "last_sign_in_ip"
 | 
			
		||||
    t.boolean  "admin",                  default: false
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  add_index "users", ["account_id"], name: "index_users_on_account_id", using: :btree
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue