ruby-recaptcha 1.0.3 → 1.0.4
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.
- data/History.txt +3 -4
- data/lib/recaptcha.rb +12 -8
- data/lib/ruby-recaptcha.rb +1 -1
- data/test/test_recaptcha.rb +38 -13
- metadata +42 -68
data/History.txt
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
=== 1.0.
|
2
|
-
|
3
|
-
|
4
|
-
Lost History file
|
1
|
+
=== 1.0.4 / 2011-11-12
|
2
|
+
|
3
|
+
* 1 merged patch for ruby 1.8/1.9 support
|
data/lib/recaptcha.rb
CHANGED
@@ -68,14 +68,19 @@ module ReCaptcha
|
|
68
68
|
# to determine whether the ReCaptcha challenge was completed successfully.
|
69
69
|
# Simply include this module in your controller class
|
70
70
|
module AppHelper
|
71
|
+
DEFAULT_CAPTCHA_FAILURE_MESSAGE = 'Captcha failed.'
|
72
|
+
|
71
73
|
# Validate recaptcha from passed in params. Sets errors into the errors hash.
|
72
74
|
#
|
73
75
|
# [p] request parameters. Requires :recaptcha_challenge_field and :recaptcha_response_field
|
74
76
|
# [errors] errors hash-like thing. Usually ActiveRecord::Base.errors
|
75
77
|
# [options] Options hash. currently only uses :rcc_pub and :rcc_priv options for passing in ReCaptcha keys.
|
76
|
-
def validate_recap(p, errors, options = {})
|
78
|
+
def validate_recap(p, errors, options = {:msg => DEFAULT_CAPTCHA_FAILURE_MESSAGE})
|
79
|
+
unless options.has_key?(:msg)
|
80
|
+
options[:msg] = DEFAULT_CAPTCHA_FAILURE_MESSAGE
|
81
|
+
end
|
77
82
|
rcc=ReCaptcha::Client.new(options[:rcc_pub] || RCC_PUB, options[:rcc_priv] || RCC_PRIV)
|
78
|
-
res = rcc.validate(request.remote_ip, p[:recaptcha_challenge_field], p[:recaptcha_response_field], errors)
|
83
|
+
res = rcc.validate(request.remote_ip, p[:recaptcha_challenge_field], p[:recaptcha_response_field], errors, options[:msg])
|
79
84
|
session[:rcc_err]=rcc.last_error
|
80
85
|
res
|
81
86
|
end
|
@@ -154,7 +159,7 @@ module ReCaptcha
|
|
154
159
|
s << "\n</script>\n"
|
155
160
|
end
|
156
161
|
errslug = (error.empty?||error==nil||error=="success") ? '' : "&error=#{CGI.escape(error)}"
|
157
|
-
s
|
162
|
+
s << %{
|
158
163
|
<script type="text/javascript" src="#{@proto}://#{@host}/recaptcha/api/challenge?k=#{CGI.escape(@pubkey)}#{errslug}"> </script>
|
159
164
|
<noscript>
|
160
165
|
<iframe src="#{@proto}://#{@host}/recaptcha/api/noscript?k=#{CGI.escape(@pubkey)}#{errslug}"
|
@@ -164,7 +169,7 @@ module ReCaptcha
|
|
164
169
|
<input type="hidden" name="recaptcha_response_field"
|
165
170
|
value="manual_challenge">
|
166
171
|
</noscript>
|
167
|
-
|
172
|
+
}
|
168
173
|
end
|
169
174
|
|
170
175
|
# Validate request. Note that this function actually makes a network request.
|
@@ -172,8 +177,7 @@ module ReCaptcha
|
|
172
177
|
# [challenge] reCaptcha challenge
|
173
178
|
# [response] reCaptcha response
|
174
179
|
# [errors] errors hash-likethingy (usually from ActiveRecord::Base.errors)
|
175
|
-
def validate(remoteip, challenge, response, errors)
|
176
|
-
msg = "Captcha failed."
|
180
|
+
def validate(remoteip, challenge, response, errors, msg)
|
177
181
|
unless response and challenge
|
178
182
|
errors.add_to_base(msg)
|
179
183
|
return false
|
@@ -183,8 +187,8 @@ module ReCaptcha
|
|
183
187
|
http = Net::HTTP::Proxy(proxy_host, proxy_port).start(@vhost)
|
184
188
|
path='/recaptcha/api/verify'
|
185
189
|
data = "privatekey=#{CGI.escape(@privkey)}&remoteip=#{CGI.escape(remoteip)}&challenge=#{CGI.escape(challenge)}&response=#{CGI.escape(response)}"
|
186
|
-
resp
|
187
|
-
response =
|
190
|
+
resp = http.post(path, data, {'Content-Type'=>'application/x-www-form-urlencoded'})
|
191
|
+
response = resp.body.split
|
188
192
|
result = response[0].chomp
|
189
193
|
@last_error=response[1].chomp
|
190
194
|
errors.add_to_base(msg) if result != 'true'
|
data/lib/ruby-recaptcha.rb
CHANGED
data/test/test_recaptcha.rb
CHANGED
@@ -82,8 +82,7 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
82
82
|
def test_nil_challenge
|
83
83
|
client = new_client
|
84
84
|
estub = stub_everything('errors')
|
85
|
-
client.validate('abc', nil, 'foo', estub)
|
86
|
-
|
85
|
+
client.validate('abc', nil, 'foo', estub, 'Captcha failed.')
|
87
86
|
end
|
88
87
|
|
89
88
|
def test_constructor
|
@@ -109,6 +108,16 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
109
108
|
client = new_client
|
110
109
|
assert_match(/theme \: \"white\"/, client.get_challenge('somerror', :options => {:theme => 'white', :tabindex => 10}))
|
111
110
|
end
|
111
|
+
|
112
|
+
class ResponseMock
|
113
|
+
def initialize(response)
|
114
|
+
@response = response
|
115
|
+
end
|
116
|
+
|
117
|
+
def body
|
118
|
+
@response[1]
|
119
|
+
end
|
120
|
+
end
|
112
121
|
|
113
122
|
def test_validate_fails
|
114
123
|
badwords_resp="false\r\n360 incorrect-captcha-sol"
|
@@ -117,10 +126,10 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
117
126
|
stub_proxy=mock('proxy')
|
118
127
|
stub_http = mock('http mock')
|
119
128
|
stub_proxy.expects(:start).with('www.google.com').returns(stub_http)
|
120
|
-
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(['foo', badwords_resp])
|
129
|
+
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(ResponseMock.new(['foo', badwords_resp]))
|
121
130
|
Net::HTTP.expects(:Proxy).returns(stub_proxy)
|
122
131
|
client = new_client
|
123
|
-
assert !client.validate('localhost', 'abc', 'def', err_stub)
|
132
|
+
assert !client.validate('localhost', 'abc', 'def', err_stub, 'Captcha failed.')
|
124
133
|
end
|
125
134
|
def test_validate_good
|
126
135
|
goodwords_resp="true\r\nsuccess"
|
@@ -128,10 +137,10 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
128
137
|
stub_proxy=mock('proxy')
|
129
138
|
stub_http = mock('http mock')
|
130
139
|
stub_proxy.expects(:start).with('www.google.com').returns(stub_http)
|
131
|
-
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(['foo', goodwords_resp])
|
140
|
+
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(ResponseMock.new(['foo', goodwords_resp]))
|
132
141
|
Net::HTTP.expects(:Proxy).with(nil, nil).returns(stub_proxy)
|
133
142
|
client = new_client
|
134
|
-
assert client.validate('localhost', 'abc', 'def', err_stub)
|
143
|
+
assert client.validate('localhost', 'abc', 'def', err_stub, 'Captcha failed.')
|
135
144
|
end
|
136
145
|
def test_validate_good_proxy
|
137
146
|
ENV['proxy_host']='fubar:8080'
|
@@ -140,19 +149,19 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
140
149
|
stub_proxy=mock('proxy')
|
141
150
|
stub_http = mock('http mock')
|
142
151
|
stub_proxy.expects(:start).with('www.google.com').returns(stub_http)
|
143
|
-
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(['foo', goodwords_resp])
|
152
|
+
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(ResponseMock.new(['foo', goodwords_resp]))
|
144
153
|
Net::HTTP.expects(:Proxy).with('fubar', '8080').returns(stub_proxy)
|
145
154
|
client = new_client
|
146
|
-
assert client.validate('localhost', 'abc', 'def', err_stub)
|
155
|
+
assert client.validate('localhost', 'abc', 'def', err_stub, 'Captcha failed.')
|
147
156
|
ENV['proxy_host']='fubar'
|
148
157
|
err_stub=mock()
|
149
158
|
stub_proxy=mock('proxy')
|
150
159
|
stub_http = mock('http mock')
|
151
160
|
stub_proxy.expects(:start).with('www.google.com').returns(stub_http)
|
152
|
-
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(['foo', goodwords_resp])
|
161
|
+
stub_http.expects(:post).with('/recaptcha/api/verify', 'privatekey=def&remoteip=localhost&challenge=abc&response=def', {'Content-Type' => 'application/x-www-form-urlencoded'}).returns(ResponseMock.new(['foo', goodwords_resp]))
|
153
162
|
Net::HTTP.expects(:Proxy).with('fubar', nil).returns(stub_proxy)
|
154
163
|
client = new_client
|
155
|
-
assert client.validate('localhost', 'abc', 'def', err_stub)
|
164
|
+
assert client.validate('localhost', 'abc', 'def', err_stub, 'Captcha failed.')
|
156
165
|
end
|
157
166
|
|
158
167
|
#
|
@@ -275,7 +284,7 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
275
284
|
def test_validate_recap_succeeds_without_key_constants_but_with_options
|
276
285
|
mock = mock('client')
|
277
286
|
ReCaptcha::Client.expects(:new).returns(mock)
|
278
|
-
mock.expects(:validate).with('0.0.0.0', nil, nil, {}).returns(true)
|
287
|
+
mock.expects(:validate).with('0.0.0.0', nil, nil, {}, 'Captcha failed.').returns(true)
|
279
288
|
mock.expects(:last_error)
|
280
289
|
assert !ReCaptcha::AppHelper.const_defined?(:RCC_PUB)
|
281
290
|
assert !ReCaptcha::AppHelper.const_defined?(:RCC_PRIV)
|
@@ -286,7 +295,7 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
286
295
|
e = mock('errors')
|
287
296
|
mock = mock('client')
|
288
297
|
ReCaptcha::Client.expects(:new).returns(mock).times(2)
|
289
|
-
mock.expects(:validate).with('0.0.0.0', nil, nil, {}).returns(true)
|
298
|
+
mock.expects(:validate).with('0.0.0.0', nil, nil, {}, 'Captcha failed.').returns(true)
|
290
299
|
mock.expects(:last_error).times(2)
|
291
300
|
ReCaptcha::AppHelper.define_public_key # 'foo'
|
292
301
|
ReCaptcha::AppHelper.define_private_key # 'bar'
|
@@ -294,9 +303,25 @@ class TestRecaptcha < Test::Unit::TestCase
|
|
294
303
|
ReCaptcha::AppHelper.undefine_public_key
|
295
304
|
ReCaptcha::AppHelper.undefine_private_key
|
296
305
|
# next, with options
|
297
|
-
mock.expects(:validate).with('0.0.0.0', nil, nil, e).returns(true)
|
306
|
+
mock.expects(:validate).with('0.0.0.0', nil, nil, e, 'Captcha failed.').returns(true)
|
298
307
|
assert @cf.validate_recap({}, e, {:rcc_pub => 'foobar', :rcc_priv => 'blegga'})
|
299
308
|
end
|
309
|
+
def test_validate_recap_is_correct_with_constants_and_with_options_and_non_default_msg
|
310
|
+
# first, with constants
|
311
|
+
e = mock('errors')
|
312
|
+
mock = mock('client')
|
313
|
+
ReCaptcha::Client.expects(:new).returns(mock).times(2)
|
314
|
+
mock.expects(:validate).with('0.0.0.0', nil, nil, {}, 'Captcha failed.').returns(true)
|
315
|
+
mock.expects(:last_error).times(2)
|
316
|
+
ReCaptcha::AppHelper.define_public_key # 'foo'
|
317
|
+
ReCaptcha::AppHelper.define_private_key # 'bar'
|
318
|
+
assert @cf.validate_recap({}, {})
|
319
|
+
ReCaptcha::AppHelper.undefine_public_key
|
320
|
+
ReCaptcha::AppHelper.undefine_private_key
|
321
|
+
# next, with options
|
322
|
+
mock.expects(:validate).with('0.0.0.0', nil, nil, e, 'CAPTCHA failed.').returns(true)
|
323
|
+
assert @cf.validate_recap({}, e, {:rcc_pub => 'foobar', :rcc_priv => 'blegga', :msg => 'CAPTCHA failed.'})
|
324
|
+
end
|
300
325
|
|
301
326
|
#
|
302
327
|
# unit tests for HTTP/HTTPS-variants of get_captcha() method
|
metadata
CHANGED
@@ -1,108 +1,82 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-recaptcha
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 3
|
10
|
-
version: 1.0.3
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- McClain Looney
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-04-27 00:00:00 -05:00
|
12
|
+
date: 2011-11-12 00:00:00.000000000 -06:00
|
19
13
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: hoe
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &9701860 !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 27
|
30
|
-
segments:
|
31
|
-
- 2
|
32
|
-
- 5
|
33
|
-
- 0
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
34
22
|
version: 2.5.0
|
35
23
|
type: :development
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: hoe
|
39
24
|
prerelease: false
|
40
|
-
|
25
|
+
version_requirements: *9701860
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: hoe
|
28
|
+
requirement: &9700580 !ruby/object:Gem::Requirement
|
41
29
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 9
|
49
|
-
- 4
|
50
|
-
version: 2.9.4
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.12'
|
51
34
|
type: :development
|
52
|
-
|
53
|
-
|
54
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *9700580
|
37
|
+
description: ''
|
38
|
+
email:
|
55
39
|
- m@loonsoft.com
|
56
40
|
executables: []
|
57
|
-
|
58
41
|
extensions: []
|
59
|
-
|
60
|
-
extra_rdoc_files:
|
42
|
+
extra_rdoc_files:
|
61
43
|
- History.txt
|
62
44
|
- README.txt
|
63
|
-
files:
|
45
|
+
files:
|
64
46
|
- History.txt
|
65
47
|
- README.txt
|
66
48
|
- lib/recaptcha.rb
|
67
49
|
- lib/ruby-recaptcha.rb
|
68
|
-
- test/test_helper.rb
|
69
50
|
- test/test_recaptcha.rb
|
51
|
+
- test/test_helper.rb
|
70
52
|
- .gemtest
|
71
53
|
has_rdoc: true
|
72
54
|
homepage: http://www.bitbucket.org/mml/ruby-recaptcha
|
73
55
|
licenses: []
|
74
|
-
|
75
56
|
post_install_message:
|
76
|
-
rdoc_options:
|
57
|
+
rdoc_options:
|
77
58
|
- --main
|
78
59
|
- README.txt
|
79
|
-
require_paths:
|
60
|
+
require_paths:
|
80
61
|
- lib
|
81
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
63
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
|
88
|
-
- 0
|
89
|
-
version: "0"
|
90
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
69
|
none: false
|
92
|
-
requirements:
|
93
|
-
- -
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
|
96
|
-
segments:
|
97
|
-
- 0
|
98
|
-
version: "0"
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
99
74
|
requirements: []
|
100
|
-
|
101
75
|
rubyforge_project: ruby-recaptcha
|
102
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.6.2
|
103
77
|
signing_key:
|
104
78
|
specification_version: 3
|
105
|
-
summary:
|
106
|
-
test_files:
|
107
|
-
- test/test_helper.rb
|
79
|
+
summary: ''
|
80
|
+
test_files:
|
108
81
|
- test/test_recaptcha.rb
|
82
|
+
- test/test_helper.rb
|