lib/double_trouble/protection.rb in double_trouble-0.1.0 vs lib/double_trouble/protection.rb in double_trouble-0.1.1

- old
+ new

@@ -1,54 +1,49 @@ module DoubleTrouble module Protection def self.included(base) base.class_eval do class_inheritable_accessor :allow_double_trouble_protection - class_inheritable_accessor :double_trouble_resource_name cattr_accessor :double_trouble_nonce_store cattr_accessor :double_trouble_nonce_param helper_method :protect_against_double_trouble?, :double_trouble_nonce_param, :double_trouble_form_nonce self.allow_double_trouble_protection = true + extend(ClassMethods) end end module ClassMethods def protect_from_double_trouble(resource_name, options = {}) - self.double_trouble_resource_name = resource_name self.double_trouble_nonce_param ||= :form_nonce self.double_trouble_nonce_store ||= CachedNonce - around_filter :double_trouble_protection, options.slice(:only, :except) - end - end + around_filter(options.slice(:only, :except)) do |controller, action_block| + if controller.send(:protect_against_double_trouble?) + nonce = controller.params[double_trouble_nonce_param] - protected + double_trouble_nonce_store.valid?(nonce) || raise(InvalidNonce) - def double_trouble_protection - if protect_against_double_trouble? - nonce = params[double_trouble_nonce_param] - store = double_trouble_nonce_store + action_block.call - store.valid?(nonce) || raise(InvalidNonce) - yield - instance_variable_get("@#{double_trouble_resource_name}").tap do |resource| - resource.present? && !resource.new_record? && store.store!(nonce) + controller.instance_variable_get("@#{resource_name}").tap do |resource| + resource.present? && !resource.new_record? && double_trouble_nonce_store.store!(nonce) + end + else + action_block.call + end end - else - yield end end + protected + def double_trouble_form_nonce ActiveSupport::SecureRandom.base64(32) end def protect_against_double_trouble? - allow_double_trouble_protection && - double_trouble_resource_name && - double_trouble_nonce_store && - double_trouble_nonce_param + allow_double_trouble_protection && double_trouble_nonce_store && double_trouble_nonce_param end end end