forked from haifeng/breve
-
Notifications
You must be signed in to change notification settings - Fork 0
/
recaptcha.rb
51 lines (45 loc) · 2.57 KB
/
recaptcha.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
require 'uri'
require 'net/http'
module Recaptcha
def Recaptcha.verify(privatekey, remoteip, params={})
return true if Rails.env.development?
params = {
:privatekey => privatekey,
:remoteip => remoteip,
:response => params[:recaptcha_response_field],
:challenge => params[:recaptcha_challenge_field]
}
response = Net::HTTP.post_form(URI.parse('http://api-verify.recaptcha.net/verify'), params)
flag, status = response.body.split("\n")
case
when flag =~ /^true$/
return true
when status =~ /^(invalid-site-public-key|invalid-request-cookie|verify-params-incorrect|invalid-referrer)$/
raise RecaptchaError.new(status)
when status =~ /^(unknown|recaptcha-not-reachable)$/
raise RecaptchaException.new(status)
when status =~ /^incorrect-captcha-sol$/
return false
else
raise RecaptchaError.new
end
end
class RecaptchaError < Exception; end
class RecaptachException < Exception; end
def self.diagnose(flag, status)
flag =~ /^true$/ ? { :message => 'OK' } : DIAGNOSIS[status.to_sym]
end
DIAGNOSIS = { :unknown => { :message => 'Unknown error.' },
:'invalid-site-public-key' => { :message => 'We weren\'t able to verify the public key.', :tips =>
['Did you swap the public and private key? It is important to use the correct one.',
'Did you make sure to copy the entire key, with all hyphens and underscores, but without any spaces? The key should be exactly 40 letters long.'] },
:'invalid-site-private-key' => { :message => 'We weren\'t able to verify the private key.', :tips => [
'Did you swap the public and private key? It is important to use the correct one.',
'Did you make sure to copy the entire key, with all hyphens and underscores, but without any spaces? The key should be exactly 40 letters long.'] },
:'invalid-request-cookie' => { :message => 'The challenge parameter of the verify script was incorrect.' },
:'incorrect-captcha-sol' => { :message => ' The CAPTCHA solution was incorrect.' },
:'verify-params-incorrect' => { :message => 'The parameters to /verify were incorrect, make sure you are passing all the required parameters.' },
:'invalid-referrer' => { :message => 'reCAPTCHA API keys are tied to a specific domain name for security reasons. See above for tips on this matter.' },
:'recaptcha-not-reachable' => { :message => 'reCAPTCHA never returns this error code. A plugin should manually return this code in the unlikely event that it is unable to contact the reCAPTCHA verify server.' }
}
end