Recaptcha::Verify

Public Instance Methods

verify_recaptcha(options = {}) click to toggle source

Your private API can be specified in the options hash or preferably using the Configuration.

# File lib/recaptcha/verify.rb, line 6
def verify_recaptcha(options = {})
  if !options.is_a? Hash
    options = {:model => options}
  end

  env = options[:env] || ENV['RAILS_ENV']
  return true if Recaptcha.configuration.skip_verify_env.include? env
  model = options[:model]
  attribute = options[:attribute] || :base
  private_key = options[:private_key] || Recaptcha.configuration.private_key
  raise RecaptchaError, "No private key specified." unless private_key

  begin
    recaptcha = nil
    if(Recaptcha.configuration.proxy)
      proxy_server = URI.parse(Recaptcha.configuration.proxy)
      http = Net::HTTP::Proxy(proxy_server.host, proxy_server.port, proxy_server.user, proxy_server.password)
    else
      http = Net::HTTP
    end

    Timeout::timeout(options[:timeout] || 3) do
      recaptcha = http.post_form(URI.parse(Recaptcha.configuration.verify_url), {
        "privatekey" => private_key,
        "remoteip"   => request.remote_ip,
        "challenge"  => params[:recaptcha_challenge_field],
        "response"   => params[:recaptcha_response_field]
      })
    end
    answer, error = recaptcha.body.split.map { |s| s.chomp }
    unless answer == 'true'
      flash[:recaptcha_error] = if defined?(I18n)
        I18n.translate("recaptcha.errors.#{error}", {:default => error})
      else
        error
      end

      if model
        message = "Word verification response is incorrect, please try again."
        message = I18n.translate('recaptcha.errors.verification_failed', {:default => message}) if defined?(I18n)
        model.errors.add attribute, options[:message] || message
      end
      return false
    else
      flash.delete(:recaptcha_error)
      return true
    end
  rescue Timeout::Error
    if Recaptcha.configuration.handle_timeouts_gracefully
      flash[:recaptcha_error] = if defined?(I18n)
        I18n.translate('recaptcha.errors.recaptcha_unreachable', {:default => 'Recaptcha unreachable.'})
      else
        'Recaptcha unreachable.'
      end

      if model
        message = "Oops, we failed to validate your word verification response. Please try again."
        message = I18n.translate('recaptcha.errors.recaptcha_unreachable', :default => message) if defined?(I18n)
        model.errors.add attribute, options[:message] || message
      end
      return false
    else
      raise RecaptchaError, "Recaptcha unreachable."
    end
  rescue Exception => e
    raise RecaptchaError, e.message, e.backtrace
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.