action_interceptor 0.5.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -2
- data/README.md +30 -107
- data/config/initializers/action_interceptor.rb +22 -48
- data/lib/action_interceptor.rb +6 -19
- data/lib/action_interceptor/action_controller/base.rb +94 -0
- data/lib/action_interceptor/configuration.rb +7 -0
- data/lib/action_interceptor/engine.rb +1 -3
- data/lib/action_interceptor/strategies.rb +19 -0
- data/lib/action_interceptor/strategies/session.rb +28 -0
- data/lib/action_interceptor/version.rb +1 -1
- data/spec/dummy/config/application.rb +0 -2
- data/spec/dummy/config/environments/production.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/initializers/action_interceptor.rb +3 -11
- data/spec/dummy/lib/strategies/dummy.rb +24 -0
- data/spec/dummy/log/test.log +1 -0
- data/spec/lib/action_interceptor/action_controller/base_spec.rb +65 -0
- data/spec/lib/action_interceptor/configuration_spec.rb +20 -0
- data/spec/lib/action_interceptor/strategies/session_spec.rb +29 -0
- data/spec/lib/action_interceptor/strategies_spec.rb +23 -0
- data/spec/lib/action_interceptor_spec.rb +2 -18
- metadata +35 -35
- data/lib/action_interceptor/action_controller.rb +0 -175
- data/lib/action_interceptor/action_mailer.rb +0 -21
- data/lib/action_interceptor/common.rb +0 -74
- data/lib/action_interceptor/encryptor.rb +0 -36
- data/lib/action_interceptor/undefined_interceptor.rb +0 -4
- data/spec/lib/action_interceptor/action_controller_spec.rb +0 -62
- data/spec/lib/action_interceptor/action_mailer_spec.rb +0 -16
- data/spec/lib/action_interceptor/common_spec.rb +0 -25
- data/spec/lib/action_interceptor/encryptor_spec.rb +0 -19
| @@ -1,21 +0,0 @@ | |
| 1 | 
            -
            module ActionInterceptor
         | 
| 2 | 
            -
              module ActionMailer
         | 
| 3 | 
            -
             | 
| 4 | 
            -
                def self.included(base)
         | 
| 5 | 
            -
                  base.helper_method :interceptor_enabled, :interceptor_enabled=
         | 
| 6 | 
            -
                end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                protected
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                def interceptor_enabled
         | 
| 11 | 
            -
                  false
         | 
| 12 | 
            -
                end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                def interceptor_enabled=(arg)
         | 
| 15 | 
            -
                  false
         | 
| 16 | 
            -
                end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
            end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            ActionMailer::Base.send :include, ActionInterceptor::ActionMailer
         | 
| @@ -1,74 +0,0 @@ | |
| 1 | 
            -
            require 'action_interceptor/action_controller'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module ActionInterceptor
         | 
| 4 | 
            -
              module Common
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                def self.included(base)
         | 
| 7 | 
            -
                  base.alias_method_chain :url_for, :interceptor
         | 
| 8 | 
            -
                end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                def url_for_with_interceptor(options = {})
         | 
| 11 | 
            -
                  url = url_for_without_interceptor(options)
         | 
| 12 | 
            -
                  return url unless interceptor_enabled
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  @interceptor_url_for_hash ||= is_interceptor? ? \
         | 
| 15 | 
            -
                                                intercepted_url_hash : \
         | 
| 16 | 
            -
                                                current_url_hash
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                  uri = URI(url)
         | 
| 19 | 
            -
                  new_query = HashWithIndifferentAccess[
         | 
| 20 | 
            -
                                URI.decode_www_form(uri.query || '')
         | 
| 21 | 
            -
                              ].merge(@interceptor_url_for_hash)
         | 
| 22 | 
            -
                  uri.query = URI.encode_www_form(new_query)
         | 
| 23 | 
            -
                  uri.to_s
         | 
| 24 | 
            -
                end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                protected
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                # Executes the given block as if it was inside an interceptor
         | 
| 29 | 
            -
                def with_interceptor(&block)
         | 
| 30 | 
            -
                  previous_interceptor_enabled = interceptor_enabled
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                  begin
         | 
| 33 | 
            -
                    # Send the referer with intercepted requests
         | 
| 34 | 
            -
                    # So we don't rely on the user's browser to do it for us
         | 
| 35 | 
            -
                    self.interceptor_enabled = true
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                    # Execute the block as if it was defined in this controller
         | 
| 38 | 
            -
                    instance_exec &block
         | 
| 39 | 
            -
                  rescue LocalJumpError => e
         | 
| 40 | 
            -
                    # Silently ignore `return` errors in the block
         | 
| 41 | 
            -
                    # and return the given value
         | 
| 42 | 
            -
                    e.exit_value
         | 
| 43 | 
            -
                  ensure
         | 
| 44 | 
            -
                    self.interceptor_enabled = previous_interceptor_enabled
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
                end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                # Executes the given block as if it was not inside an interceptor
         | 
| 49 | 
            -
                def without_interceptor(&block)
         | 
| 50 | 
            -
                  previous_interceptor_enabled = interceptor_enabled
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                  begin
         | 
| 53 | 
            -
                    # Send the referer with intercepted requests
         | 
| 54 | 
            -
                    # So we don't rely on the user's browser to do it for us
         | 
| 55 | 
            -
                    self.interceptor_enabled = false
         | 
| 56 | 
            -
             | 
| 57 | 
            -
                    # Execute the block as if it was defined in this controller
         | 
| 58 | 
            -
                    instance_exec &block
         | 
| 59 | 
            -
                  rescue LocalJumpError => e
         | 
| 60 | 
            -
                    # Silently ignore `return` errors in the block
         | 
| 61 | 
            -
                    # and return the given value
         | 
| 62 | 
            -
                    e.exit_value
         | 
| 63 | 
            -
                  ensure
         | 
| 64 | 
            -
                    self.interceptor_enabled = previous_interceptor_enabled
         | 
| 65 | 
            -
                  end
         | 
| 66 | 
            -
                end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
              end
         | 
| 69 | 
            -
            end
         | 
| 70 | 
            -
             | 
| 71 | 
            -
            ActionController::Base.send :include, ActionInterceptor::Common
         | 
| 72 | 
            -
            ActionView::Base.send :include, ActionInterceptor::Common
         | 
| 73 | 
            -
            ActionView::RoutingUrlFor.send :include, ActionInterceptor::Common \
         | 
| 74 | 
            -
              if defined?(ActionView::RoutingUrlFor)
         | 
| @@ -1,36 +0,0 @@ | |
| 1 | 
            -
            module ActionInterceptor
         | 
| 2 | 
            -
              class Encryptor
         | 
| 3 | 
            -
             | 
| 4 | 
            -
                def self.encrypt_and_sign(value)
         | 
| 5 | 
            -
                  message_encryptor.encrypt_and_sign(value)
         | 
| 6 | 
            -
                end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                def self.decrypt_and_verify(value)
         | 
| 9 | 
            -
                  message_encryptor.decrypt_and_verify(value)
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                protected
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                def self.message_encryptor
         | 
| 15 | 
            -
                  return @message_encryptor if @message_encryptor
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  application = Rails.application
         | 
| 18 | 
            -
                  config = application.config
         | 
| 19 | 
            -
                  application_secret = application.secrets[:secret_key_base] \
         | 
| 20 | 
            -
                                         if application.respond_to?(:secrets)
         | 
| 21 | 
            -
                  application_secret ||= config.secret_key_base if config.respond_to?(:secret_key_base)
         | 
| 22 | 
            -
                  application_secret ||= config.secret_token
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  # This is how Rails 4 generates keys for encrypted cookies
         | 
| 25 | 
            -
                  # Except that, in Rails 4, MessageEncryptor can take 2 different secrets,
         | 
| 26 | 
            -
                  # one for encryption and one for verification
         | 
| 27 | 
            -
                  salt = 'encrypted intercepted url'
         | 
| 28 | 
            -
                  secret = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
         | 
| 29 | 
            -
                             application_secret, salt, 2**16, 64)
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  @message_encryptor = ActiveSupport::MessageEncryptor.new(secret,
         | 
| 32 | 
            -
                    :serializer => ActiveSupport::MessageEncryptor::NullSerializer)
         | 
| 33 | 
            -
                end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
              end
         | 
| 36 | 
            -
            end
         | 
| @@ -1,62 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module ActionInterceptor
         | 
| 4 | 
            -
              describe ActionController do
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                it 'modifies ActionController::Base' do
         | 
| 7 | 
            -
                  expect(::ActionController::Base).to respond_to(:interceptor_filters)
         | 
| 8 | 
            -
                  expect(::ActionController::Base.interceptor_filters).to be_a(Hash)
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  expect(::ActionController::Base).to respond_to(:interceptor)
         | 
| 11 | 
            -
                  expect(::ActionController::Base).to respond_to(:skip_interceptor)
         | 
| 12 | 
            -
                  expect(::ActionController::Base).to respond_to(:acts_as_interceptor)
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 15 | 
            -
                    :is_interceptor?, true)).to eq(true)
         | 
| 16 | 
            -
                  expect(::ActionController::Base.new.send :is_interceptor?).to eq(false)
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 19 | 
            -
                    :interceptor_enabled, true)).to eq(true)
         | 
| 20 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 21 | 
            -
                    :current_page?, true)).to eq(true)
         | 
| 22 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 23 | 
            -
                    :current_url, true)).to eq(true)
         | 
| 24 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 25 | 
            -
                    :current_url_hash, true)).to eq(true)
         | 
| 26 | 
            -
                end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                it 'modifies classes that act_as_interceptor' do
         | 
| 29 | 
            -
                  expect(RegistrationsController.new.send :is_interceptor?).to eq(true)
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  expect(RegistrationsController.new.respond_to?(
         | 
| 32 | 
            -
                    :intercepted_url, true)).to eq(true)
         | 
| 33 | 
            -
                  expect(RegistrationsController.new.respond_to?(
         | 
| 34 | 
            -
                    :intercepted_url=, true)).to eq(true)
         | 
| 35 | 
            -
                  expect(RegistrationsController.new.respond_to?(
         | 
| 36 | 
            -
                    :intercepted_url_hash, true)).to eq(true)
         | 
| 37 | 
            -
                  expect(RegistrationsController.new.respond_to?(
         | 
| 38 | 
            -
                    :redirect_back, true)).to eq(true)
         | 
| 39 | 
            -
                end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                it 'registers and skips before_filters' do
         | 
| 42 | 
            -
                  filters = RegistrationsController.new._process_action_callbacks
         | 
| 43 | 
            -
                                                       .collect{|c| c.filter}
         | 
| 44 | 
            -
                  expect(filters).not_to include(:my_interceptor)
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  RegistrationsController.interceptor :my_interceptor
         | 
| 47 | 
            -
                  filters = RegistrationsController.new._process_action_callbacks
         | 
| 48 | 
            -
                                                       .collect{|c| c.filter}
         | 
| 49 | 
            -
                  expect(filters).to include(:my_interceptor)
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                  filters = ApplicationController.new._process_action_callbacks
         | 
| 52 | 
            -
                                                     .collect{|c| c.filter}
         | 
| 53 | 
            -
                  expect(filters).to include(:my_interceptor)
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                  ApplicationController.skip_interceptor :my_interceptor
         | 
| 56 | 
            -
                  filters = ApplicationController.new._process_action_callbacks
         | 
| 57 | 
            -
                                                     .collect{|c| c.filter}
         | 
| 58 | 
            -
                  expect(filters).not_to include(:my_interceptor)
         | 
| 59 | 
            -
                end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
              end
         | 
| 62 | 
            -
            end
         | 
| @@ -1,16 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module ActionInterceptor
         | 
| 4 | 
            -
              describe ActionMailer do
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                it 'modifies ActionMailer::Base' do
         | 
| 7 | 
            -
                  mailer = ::ActionMailer::Base.send(:new)
         | 
| 8 | 
            -
                  expect(mailer.respond_to?(:interceptor_enabled, true)).to eq(true)
         | 
| 9 | 
            -
                  expect(mailer.respond_to?(:interceptor_enabled=, true)).to eq(true)
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  expect(mailer.send(:interceptor_enabled)).to eq(false)
         | 
| 12 | 
            -
                  expect(mailer.send(:interceptor_enabled=, true)).to eq(false)
         | 
| 13 | 
            -
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
            end
         | 
| @@ -1,25 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module ActionInterceptor
         | 
| 4 | 
            -
              describe Common do
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                it 'modifies ActionController::Base' do
         | 
| 7 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 8 | 
            -
                    :url_for, true)).to eq(true)
         | 
| 9 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 10 | 
            -
                    :with_interceptor, true)).to eq(true)
         | 
| 11 | 
            -
                  expect(::ActionController::Base.new.respond_to?(
         | 
| 12 | 
            -
                    :without_interceptor, true)).to eq(true)
         | 
| 13 | 
            -
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                it 'modifies ActionView::Base' do
         | 
| 16 | 
            -
                  expect(::ActionView::Base.new.respond_to?(
         | 
| 17 | 
            -
                    :url_for, true)).to eq(true)
         | 
| 18 | 
            -
                  expect(::ActionView::Base.new.respond_to?(
         | 
| 19 | 
            -
                    :with_interceptor, true)).to eq(true)
         | 
| 20 | 
            -
                  expect(::ActionView::Base.new.respond_to?(
         | 
| 21 | 
            -
                    :without_interceptor, true)).to eq(true)
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
              end
         | 
| 25 | 
            -
            end
         | 
| @@ -1,19 +0,0 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module ActionInterceptor
         | 
| 4 | 
            -
              describe Encryptor do
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                it 'encrypts and decrypts strings' do
         | 
| 7 | 
            -
                  my_string = 'My string'
         | 
| 8 | 
            -
                  encrypted_string = Encryptor.encrypt_and_sign(my_string)
         | 
| 9 | 
            -
                  expect(encrypted_string).not_to include(my_string)
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  decrypted_string = Encryptor.decrypt_and_verify(encrypted_string)
         | 
| 12 | 
            -
                  expect(decrypted_string).to eq(my_string)
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  expect{Encryptor.decrypt_and_verify(my_string)}.to(
         | 
| 15 | 
            -
                    raise_error(ActiveSupport::MessageVerifier::InvalidSignature))
         | 
| 16 | 
            -
                end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
            end
         |