module SubmitOnce::ControllerHelper

Public Instance Methods

check_form_token() click to toggle source

TODO: force or no

# File lib/submit_once/controller_helper.rb, line 14
def check_form_token
  # TODO: 顺便做超时 token 清理工作
  clean_expired_token

  return false if params[TOKEN_KEY].blank?

  form_token_key = params[TOKEN_KEY]
  if session[form_token_key] == params[TOKEN_VALUE]
    session.delete(form_token_key)
    true
  else
    false
  end
end
check_form_token!() click to toggle source
# File lib/submit_once/controller_helper.rb, line 29
def check_form_token!
  unless check_form_token
    # TODO: path, and i18n
    redirect_to '/', notice: "Couldn't repeat submit form"
  end
end
clean_expired_token() click to toggle source
# File lib/submit_once/controller_helper.rb, line 45
def clean_expired_token
  session.each do |key, value|
    if key.start_with? TOKEN_KEY
      timestamp = Time.zone.at key.sub(TOKEN_KEY, '').to_i
      session.delete(key) if timestamp < 30.minutes.ago
    end
  end
end
gen_form_token() click to toggle source
# File lib/submit_once/controller_helper.rb, line 36
def gen_form_token
  clean_expired_token
  
  @__form_token_key ||= "#{TOKEN_KEY}#{Time.now.to_i}"
  @__form_token ||=
    (session[@__form_token_key] = Digest::SHA1.hexdigest((Time.now.to_i + rand(0xffffff)).to_s)[0..39])
  [@__form_token_key, @__form_token]
end