recaptcha 0.3.1 → 0.3.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/.gitignore +2 -0
- data/CHANGELOG +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +26 -0
- data/README.rdoc +31 -4
- data/Rakefile +5 -56
- data/VERSION +1 -1
- data/init.rb +0 -1
- data/lib/recaptcha.rb +18 -10
- data/lib/recaptcha/client_helper.rb +15 -6
- data/lib/recaptcha/configuration.rb +2 -1
- data/lib/recaptcha/rails.rb +1 -0
- data/lib/recaptcha/railtie.rb +15 -0
- data/lib/recaptcha/verify.rb +19 -9
- data/lib/recaptcha/version.rb +3 -0
- data/recaptcha.gemspec +17 -55
- data/test/recaptcha_test.rb +16 -3
- data/test/verify_recaptcha_test.rb +36 -11
- metadata +73 -62
- data/tasks/recaptcha_tasks.rake +0 -4
data/.gitignore
ADDED
data/CHANGELOG
CHANGED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
recaptcha (0.3.4)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activesupport (3.1.3)
|
10
|
+
multi_json (~> 1.0)
|
11
|
+
i18n (0.6.0)
|
12
|
+
metaclass (0.0.1)
|
13
|
+
mocha (0.10.0)
|
14
|
+
metaclass (~> 0.0.1)
|
15
|
+
multi_json (1.0.3)
|
16
|
+
rake (0.9.2.2)
|
17
|
+
|
18
|
+
PLATFORMS
|
19
|
+
ruby
|
20
|
+
|
21
|
+
DEPENDENCIES
|
22
|
+
activesupport
|
23
|
+
i18n
|
24
|
+
mocha
|
25
|
+
rake
|
26
|
+
recaptcha!
|
data/README.rdoc
CHANGED
@@ -23,7 +23,11 @@ Hoptoad}[http://robots.thoughtbot.com/post/344833329/mygem-configure-block].
|
|
23
23
|
|
24
24
|
== Rails Installation
|
25
25
|
|
26
|
-
reCAPTCHA for Rails
|
26
|
+
reCAPTCHA for Rails, add this to your Gemfile:
|
27
|
+
|
28
|
+
gem "recaptcha", :require => "recaptcha/rails"
|
29
|
+
|
30
|
+
Or, it can be installed as a gem:
|
27
31
|
|
28
32
|
config.gem "recaptcha", :lib => "recaptcha/rails"
|
29
33
|
|
@@ -52,11 +56,20 @@ into a +config/initializers/recaptcha.rb+ when used in a Rails project.
|
|
52
56
|
Recaptcha.configure do |config|
|
53
57
|
config.public_key = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
|
54
58
|
config.private_key = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
|
59
|
+
config.proxy = 'http://myrpoxy.com.au:8080'
|
55
60
|
end
|
56
61
|
|
57
62
|
This way, you may also set additional options to fit recaptcha into your
|
58
63
|
deployment environment.
|
59
64
|
|
65
|
+
== Recaptcha#with_configuration
|
66
|
+
|
67
|
+
If you want to temporarily overwrite the configuration you set with `Recaptcha.configure` (when testing, for example), you can use a `Recaptcha#with_configuration` block:
|
68
|
+
|
69
|
+
Recaptcha.configure(:public_key => '12345') do
|
70
|
+
# Do stuff with the overwritten public_key.
|
71
|
+
end
|
72
|
+
|
60
73
|
=== Shell environment
|
61
74
|
|
62
75
|
Or, you can keep your keys out of your code base by exporting the following
|
@@ -79,7 +92,13 @@ and later,
|
|
79
92
|
This option might be useful, if the same code base is used for multiple
|
80
93
|
reCAPTCHA setups.
|
81
94
|
|
82
|
-
==
|
95
|
+
== To use 'recaptcha'
|
96
|
+
|
97
|
+
Add +recaptcha_tags+ to each form you want to protect.
|
98
|
+
|
99
|
+
And, add +verify_recaptcha+ logic to each form action that you've protected.
|
100
|
+
|
101
|
+
=== +recaptcha_tags+
|
83
102
|
|
84
103
|
Some of the options available:
|
85
104
|
|
@@ -93,10 +112,10 @@ Some of the options available:
|
|
93
112
|
You can also override the html attributes for the sizes of the generated +textarea+ and +iframe+
|
94
113
|
elements, if CSS isn't your thing. Inspect the source of +recaptcha_tags+ to see these options.
|
95
114
|
|
96
|
-
|
115
|
+
=== +verify_recaptcha+
|
97
116
|
|
98
117
|
This method returns +true+ or +false+ after processing the parameters from the reCAPTCHA widget. Why
|
99
|
-
isn't this a model validation? Because that violates MVC.
|
118
|
+
isn't this a model validation? Because that violates MVC. You can use it like this, or how ever you
|
100
119
|
like. Passing in the ActiveRecord object is optional, if you do--and the captcha fails to verify--an
|
101
120
|
error will be added to the object for you to use.
|
102
121
|
|
@@ -116,6 +135,14 @@ Some of the options available:
|
|
116
135
|
end
|
117
136
|
end
|
118
137
|
|
138
|
+
== I18n support
|
139
|
+
reCAPTCHA passes two types of error explanation to a linked model. It will use the I18n gem
|
140
|
+
to translate the default error message if I18n is available. To customize the messages to your locale,
|
141
|
+
add these keys to your I18n backend:
|
142
|
+
|
143
|
+
<tt>recaptcha.errors.verification_failed</tt>:: error message displayed if the captcha words didn't match
|
144
|
+
<tt>recaptcha.errors.recaptcha_unavailable</tt>:: displayed if a timout error occured while attempting to verify the captcha
|
145
|
+
|
119
146
|
== TODO
|
120
147
|
* Remove Rails/ActionController dependencies
|
121
148
|
* Framework agnostic
|
data/Rakefile
CHANGED
@@ -1,60 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
gem.name = "recaptcha"
|
7
|
-
gem.description = "This plugin adds helpers for the reCAPTCHA API "
|
8
|
-
gem.summary = "Helpers for the reCAPTCHA API"
|
9
|
-
gem.homepage = "http://ambethia.com/recaptcha"
|
10
|
-
gem.authors = ["Jason L. Perry"]
|
11
|
-
gem.email = "jasper@ambethia.com"
|
12
|
-
gem.files.reject! { |fn| fn.include? ".gitignore" }
|
13
|
-
gem.add_development_dependency "mocha"
|
14
|
-
gem.add_development_dependency "activesupport"
|
15
|
-
end
|
16
|
-
Jeweler::GemcutterTasks.new
|
17
|
-
rescue LoadError
|
18
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'rake/rdoctask'
|
22
|
-
Rake::RDocTask.new do |rd|
|
23
|
-
if File.exist?('VERSION.yml')
|
24
|
-
config = YAML.load(File.read('VERSION.yml'))
|
25
|
-
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
26
|
-
else
|
27
|
-
version = ""
|
28
|
-
end
|
29
|
-
|
30
|
-
rd.main = "README.rdoc"
|
31
|
-
rd.rdoc_files.include "README.rdoc", "LICENSE", "lib/**/*.rb"
|
32
|
-
rd.rdoc_dir = 'rdoc'
|
33
|
-
rd.options << '-N' # line numbers
|
34
|
-
rd.options << '-S' # inline source
|
35
|
-
end
|
36
|
-
|
37
|
-
require 'rake/testtask'
|
38
|
-
Rake::TestTask.new(:test) do |test|
|
39
|
-
test.libs << 'test'
|
40
|
-
test.pattern = 'test/**/*_test.rb'
|
41
|
-
# test.verbose = true
|
42
|
-
end
|
43
|
-
|
44
|
-
begin
|
45
|
-
require 'rcov/rcovtask'
|
46
|
-
Rcov::RcovTask.new do |test|
|
47
|
-
test.libs << 'test'
|
48
|
-
test.pattern = 'test/**/*_test.rb'
|
49
|
-
test.verbose = true
|
50
|
-
end
|
51
|
-
rescue LoadError
|
52
|
-
task :rcov do
|
53
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
54
|
-
end
|
4
|
+
Rake::TestTask.new :test do |test|
|
5
|
+
test.libs << "lib"
|
6
|
+
test.pattern = "test/*_test.rb"
|
55
7
|
end
|
56
8
|
|
57
9
|
task :default => :test
|
58
|
-
|
59
|
-
|
60
|
-
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/init.rb
CHANGED
data/lib/recaptcha.rb
CHANGED
@@ -3,16 +3,6 @@ require 'recaptcha/client_helper'
|
|
3
3
|
require 'recaptcha/verify'
|
4
4
|
|
5
5
|
module Recaptcha
|
6
|
-
module VERSION #:nodoc:
|
7
|
-
MAJOR = 0
|
8
|
-
MINOR = 2
|
9
|
-
TINY = 2
|
10
|
-
PATCH = 1
|
11
|
-
|
12
|
-
STRING = [MAJOR, MINOR, TINY, PATCH].join('.')
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
6
|
RECAPTCHA_API_SERVER_URL = 'http://www.google.com/recaptcha/api'
|
17
7
|
RECAPTCHA_API_SECURE_SERVER_URL = 'https://www.google.com/recaptcha/api'
|
18
8
|
RECAPTCHA_VERIFY_URL = 'http://www.google.com/recaptcha/api/verify'
|
@@ -35,6 +25,24 @@ module Recaptcha
|
|
35
25
|
yield(config)
|
36
26
|
end
|
37
27
|
|
28
|
+
def self.with_configuration(config)
|
29
|
+
original_config = {}
|
30
|
+
|
31
|
+
config.each do |key, value|
|
32
|
+
original_config[key] = configuration.send(key)
|
33
|
+
configuration.send("#{key}=", value)
|
34
|
+
end
|
35
|
+
|
36
|
+
result = yield if block_given?
|
37
|
+
|
38
|
+
original_config.each { |key, value| configuration.send("#{key}=", value) }
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
38
42
|
class RecaptchaError < StandardError
|
39
43
|
end
|
40
44
|
end
|
45
|
+
|
46
|
+
if defined?(Rails)
|
47
|
+
require 'recaptcha/rails'
|
48
|
+
end
|
@@ -15,11 +15,20 @@ module Recaptcha
|
|
15
15
|
html << %{</script>\n}
|
16
16
|
end
|
17
17
|
if options[:ajax]
|
18
|
-
html <<
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
html << <<-EOS
|
19
|
+
<div id="dynamic_recaptcha"></div>
|
20
|
+
<script type="text/javascript">
|
21
|
+
var rc_script_tag = document.createElement('script'),
|
22
|
+
rc_init_func = function(){Recaptcha.create("#{key}", document.getElementById("dynamic_recaptcha")#{',RecaptchaOptions' if options[:display]});}
|
23
|
+
rc_script_tag.src = "#{uri}/js/recaptcha_ajax.js";
|
24
|
+
rc_script_tag.type = 'text/javascript';
|
25
|
+
rc_script_tag.onload = function(){rc_init_func.call();};
|
26
|
+
rc_script_tag.onreadystatechange = function(){
|
27
|
+
if (rc_script_tag.readyState == 'loaded' || rc_script_tag.readyState == 'complete') {rc_init_func.call();}
|
28
|
+
};
|
29
|
+
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(rc_script_tag);
|
30
|
+
</script>
|
31
|
+
EOS
|
23
32
|
else
|
24
33
|
html << %{<script type="text/javascript" src="#{uri}/challenge?k=#{key}}
|
25
34
|
html << %{#{error ? "&error=#{CGI::escape(error)}" : ""}"></script>\n}
|
@@ -36,7 +45,7 @@ module Recaptcha
|
|
36
45
|
html << %{</noscript>\n}
|
37
46
|
end
|
38
47
|
end
|
39
|
-
return html.html_safe
|
48
|
+
return (html.respond_to?(:html_safe) && html.html_safe) || html
|
40
49
|
end # recaptcha_tags
|
41
50
|
end # ClientHelper
|
42
51
|
end # Recaptcha
|
data/lib/recaptcha/rails.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'recaptcha'
|
3
|
+
module Rails
|
4
|
+
module Recaptcha
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer "setup config" do
|
7
|
+
begin
|
8
|
+
ActionView::Base.send(:include, ::Recaptcha::ClientHelper)
|
9
|
+
ActionController::Base.send(:include, ::Recaptcha::Verify)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
data/lib/recaptcha/verify.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "uri"
|
1
2
|
module Recaptcha
|
2
3
|
module Verify
|
3
4
|
# Your private API can be specified in the +options+ hash or preferably
|
@@ -6,41 +7,50 @@ module Recaptcha
|
|
6
7
|
if !options.is_a? Hash
|
7
8
|
options = {:model => options}
|
8
9
|
end
|
9
|
-
|
10
|
+
|
10
11
|
env = options[:env] || ENV['RAILS_ENV']
|
11
12
|
return true if Recaptcha.configuration.skip_verify_env.include? env
|
12
13
|
model = options[:model]
|
13
14
|
attribute = options[:attribute] || :base
|
14
15
|
private_key = options[:private_key] || Recaptcha.configuration.private_key
|
15
16
|
raise RecaptchaError, "No private key specified." unless private_key
|
16
|
-
|
17
|
+
|
17
18
|
begin
|
18
19
|
recaptcha = nil
|
20
|
+
if(Recaptcha.configuration.proxy)
|
21
|
+
proxy_server = URI.parse(Recaptcha.configuration.proxy)
|
22
|
+
http = Net::HTTP::Proxy(proxy_server.host, proxy_server.port, proxy_server.user, proxy_server.password)
|
23
|
+
else
|
24
|
+
http = Net::HTTP
|
25
|
+
end
|
26
|
+
|
19
27
|
Timeout::timeout(options[:timeout] || 3) do
|
20
|
-
recaptcha =
|
28
|
+
recaptcha = http.post_form(URI.parse(Recaptcha.configuration.verify_url), {
|
21
29
|
"privatekey" => private_key,
|
22
30
|
"remoteip" => request.remote_ip,
|
23
31
|
"challenge" => params[:recaptcha_challenge_field],
|
24
32
|
"response" => params[:recaptcha_response_field]
|
25
|
-
}
|
33
|
+
})
|
26
34
|
end
|
27
35
|
answer, error = recaptcha.body.split.map { |s| s.chomp }
|
28
36
|
unless answer == 'true'
|
29
37
|
flash[:recaptcha_error] = error
|
30
38
|
if model
|
31
|
-
|
32
|
-
|
39
|
+
message = "Word verification response is incorrect, please try again."
|
40
|
+
message = I18n.translate(:'recaptcha.errors.verification_failed', {:default => message}) if defined?(I18n)
|
41
|
+
model.errors.add attribute, options[:message] || message
|
33
42
|
end
|
34
43
|
return false
|
35
44
|
else
|
36
45
|
flash[:recaptcha_error] = nil
|
37
46
|
return true
|
38
47
|
end
|
39
|
-
rescue Timeout::Error
|
48
|
+
rescue Timeout::Error
|
40
49
|
flash[:recaptcha_error] = "recaptcha-not-reachable"
|
41
50
|
if model
|
42
|
-
|
43
|
-
|
51
|
+
message = "Oops, we failed to validate your word verification response. Please try again."
|
52
|
+
message = I18n.translate(:'recaptcha.errors.recaptcha_unreachable', :default => message) if defined?(I18n)
|
53
|
+
model.errors.add attribute, options[:message] || message
|
44
54
|
end
|
45
55
|
return false
|
46
56
|
rescue Exception => e
|
data/recaptcha.gemspec
CHANGED
@@ -1,62 +1,24 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "recaptcha/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name
|
8
|
-
s.version
|
6
|
+
s.name = "recaptcha"
|
7
|
+
s.version = Recaptcha::VERSION
|
8
|
+
s.authors = ["Jason L Perry"]
|
9
|
+
s.email = ["jasper@ambethia.com"]
|
10
|
+
s.homepage = "http://github.com/ambethia/recaptcha"
|
11
|
+
s.summary = %q{Helpers for the reCAPTCHA API}
|
12
|
+
s.description = %q{This plugin adds helpers for the reCAPTCHA API}
|
9
13
|
|
10
|
-
s.
|
11
|
-
s.authors = ["Jason L. Perry"]
|
12
|
-
s.date = %q{2010-12-20}
|
13
|
-
s.description = %q{This plugin adds helpers for the reCAPTCHA API }
|
14
|
-
s.email = %q{jasper@ambethia.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
"CHANGELOG",
|
21
|
-
"LICENSE",
|
22
|
-
"README.rdoc",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"init.rb",
|
26
|
-
"lib/recaptcha.rb",
|
27
|
-
"lib/recaptcha/client_helper.rb",
|
28
|
-
"lib/recaptcha/configuration.rb",
|
29
|
-
"lib/recaptcha/merb.rb",
|
30
|
-
"lib/recaptcha/rails.rb",
|
31
|
-
"lib/recaptcha/verify.rb",
|
32
|
-
"recaptcha.gemspec",
|
33
|
-
"tasks/recaptcha_tasks.rake",
|
34
|
-
"test/recaptcha_test.rb",
|
35
|
-
"test/verify_recaptcha_test.rb"
|
36
|
-
]
|
37
|
-
s.homepage = %q{http://ambethia.com/recaptcha}
|
38
|
-
s.require_paths = ["lib"]
|
39
|
-
s.rubygems_version = %q{1.3.7}
|
40
|
-
s.summary = %q{Helpers for the reCAPTCHA API}
|
41
|
-
s.test_files = [
|
42
|
-
"test/recaptcha_test.rb",
|
43
|
-
"test/verify_recaptcha_test.rb"
|
44
|
-
]
|
14
|
+
s.rubyforge_project = "recaptcha"
|
45
15
|
|
46
|
-
|
47
|
-
|
48
|
-
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.require_paths = ["lib"]
|
49
19
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
s.add_dependency(%q<mocha>, [">= 0"])
|
55
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
56
|
-
end
|
57
|
-
else
|
58
|
-
s.add_dependency(%q<mocha>, [">= 0"])
|
59
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
60
|
-
end
|
20
|
+
s.add_development_dependency "mocha"
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "activesupport"
|
23
|
+
s.add_development_dependency "i18n"
|
61
24
|
end
|
62
|
-
|
data/test/recaptcha_test.rb
CHANGED
@@ -16,12 +16,12 @@ class RecaptchaClientHelperTest < Test::Unit::TestCase
|
|
16
16
|
config.private_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def test_recaptcha_tags
|
21
21
|
# Might as well match something...
|
22
22
|
assert_match /http:\/\/www.google.com\/recaptcha\/api\/challenge/, recaptcha_tags
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def test_recaptcha_tags_with_ssl
|
26
26
|
assert_match /https:\/\/www.google.com\/recaptcha\/api\/challenge/, recaptcha_tags(:ssl => true)
|
27
27
|
end
|
@@ -29,11 +29,24 @@ class RecaptchaClientHelperTest < Test::Unit::TestCase
|
|
29
29
|
def test_recaptcha_tags_without_noscript
|
30
30
|
assert_no_match /noscript/, recaptcha_tags(:noscript => false)
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def test_should_raise_exception_without_public_key
|
34
34
|
assert_raise RecaptchaError do
|
35
35
|
Recaptcha.configuration.public_key = nil
|
36
36
|
recaptcha_tags
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
def test_different_configuration_within_with_configuration_block
|
41
|
+
key = Recaptcha.with_configuration(:public_key => '12345') do
|
42
|
+
Recaptcha.configuration.public_key
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_equal('12345', key)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_reset_configuration_after_with_configuration_block
|
49
|
+
Recaptcha.with_configuration(:public_key => '12345')
|
50
|
+
assert_equal('0000000000000000000000000000000000000000', Recaptcha.configuration.public_key)
|
51
|
+
end
|
39
52
|
end
|
@@ -1,7 +1,10 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
1
3
|
require 'test/unit'
|
2
|
-
require 'active_support/core_ext/string'
|
3
4
|
require 'rubygems'
|
5
|
+
require 'active_support/core_ext/string'
|
4
6
|
require 'mocha'
|
7
|
+
require 'i18n'
|
5
8
|
require 'net/http'
|
6
9
|
require File.dirname(File.expand_path(__FILE__)) + '/../lib/recaptcha'
|
7
10
|
|
@@ -17,7 +20,7 @@ class RecaptchaVerifyTest < Test::Unit::TestCase
|
|
17
20
|
@expected_post_data["remoteip"] = @controller.request.remote_ip
|
18
21
|
@expected_post_data["challenge"] = "challenge"
|
19
22
|
@expected_post_data["response"] = "response"
|
20
|
-
|
23
|
+
|
21
24
|
@expected_uri = URI.parse(Recaptcha.configuration.verify_url)
|
22
25
|
end
|
23
26
|
|
@@ -31,24 +34,24 @@ class RecaptchaVerifyTest < Test::Unit::TestCase
|
|
31
34
|
def test_should_return_false_when_key_is_invalid
|
32
35
|
expect_http_post(response_with_body("false\ninvalid-site-private-key"))
|
33
36
|
|
34
|
-
assert !@controller.verify_recaptcha
|
37
|
+
assert !@controller.verify_recaptcha
|
35
38
|
assert_equal "invalid-site-private-key", @controller.flash[:recaptcha_error]
|
36
39
|
end
|
37
|
-
|
40
|
+
|
38
41
|
def test_returns_true_on_success
|
39
|
-
@controller.flash[:recaptcha_error] = "previous error that should be cleared"
|
42
|
+
@controller.flash[:recaptcha_error] = "previous error that should be cleared"
|
40
43
|
expect_http_post(response_with_body("true\n"))
|
41
44
|
|
42
45
|
assert @controller.verify_recaptcha
|
43
46
|
assert_nil @controller.flash[:recaptcha_error]
|
44
47
|
end
|
45
|
-
|
48
|
+
|
46
49
|
def test_errors_should_be_added_to_model
|
47
50
|
expect_http_post(response_with_body("false\nbad-news"))
|
48
|
-
|
51
|
+
|
49
52
|
errors = mock
|
50
53
|
errors.expects(:add).with(:base, "Word verification response is incorrect, please try again.")
|
51
|
-
model = mock(:
|
54
|
+
model = mock(:errors => errors)
|
52
55
|
|
53
56
|
assert !@controller.verify_recaptcha(:model => model)
|
54
57
|
assert_equal "bad-news", @controller.flash[:recaptcha_error]
|
@@ -70,17 +73,39 @@ class RecaptchaVerifyTest < Test::Unit::TestCase
|
|
70
73
|
assert_equal "recaptcha-not-reachable", @controller.flash[:recaptcha_error]
|
71
74
|
end
|
72
75
|
|
76
|
+
def test_message_should_use_i18n
|
77
|
+
I18n.locale = :de
|
78
|
+
verification_failed_translated = "Sicherheitscode konnte nicht verifiziert werden."
|
79
|
+
verification_failed_default = "Word verification response is incorrect, please try again."
|
80
|
+
recaptcha_unreachable_translated = "Netzwerkfehler, bitte versuchen Sie es später erneut."
|
81
|
+
recaptcha_unreachable_default = "Oops, we failed to validate your word verification response. Please try again."
|
82
|
+
I18n.expects(:translate).with(:'recaptcha.errors.verification_failed', :default => verification_failed_default).returns(verification_failed_translated)
|
83
|
+
I18n.expects(:translate).with(:'recaptcha.errors.recaptcha_unreachable', :default => recaptcha_unreachable_default).returns(recaptcha_unreachable_translated)
|
84
|
+
|
85
|
+
errors = mock
|
86
|
+
errors.expects(:add).with(:base, verification_failed_translated)
|
87
|
+
errors.expects(:add).with(:base, recaptcha_unreachable_translated)
|
88
|
+
model = mock; model.stubs(:errors => errors)
|
89
|
+
|
90
|
+
expect_http_post(response_with_body("false\nbad-news"))
|
91
|
+
@controller.verify_recaptcha(:model => model)
|
92
|
+
|
93
|
+
expect_http_post(Timeout::Error, :exception => true)
|
94
|
+
@controller.verify_recaptcha(:model => model)
|
95
|
+
|
96
|
+
end
|
97
|
+
|
73
98
|
private
|
74
99
|
|
75
100
|
class TestController
|
76
101
|
include Recaptcha::Verify
|
77
102
|
attr_accessor :request, :params, :flash
|
78
|
-
|
103
|
+
|
79
104
|
def initialize
|
80
105
|
@flash = {}
|
81
106
|
end
|
82
107
|
end
|
83
|
-
|
108
|
+
|
84
109
|
def expect_http_post(response, options = {})
|
85
110
|
unless options[:exception]
|
86
111
|
Net::HTTP.expects(:post_form).with(@expected_uri, @expected_post_data).returns(response)
|
@@ -88,7 +113,7 @@ class RecaptchaVerifyTest < Test::Unit::TestCase
|
|
88
113
|
Net::HTTP.expects(:post_form).raises response
|
89
114
|
end
|
90
115
|
end
|
91
|
-
|
116
|
+
|
92
117
|
def response_with_body(body)
|
93
118
|
stub(:body => body)
|
94
119
|
end
|
metadata
CHANGED
@@ -1,59 +1,71 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: recaptcha
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 3
|
8
|
-
- 1
|
9
|
-
version: 0.3.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.4
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
12
|
-
- Jason L
|
7
|
+
authors:
|
8
|
+
- Jason L Perry
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-12-13 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: mocha
|
16
|
+
requirement: &70162456439800 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
22
23
|
prerelease: false
|
23
|
-
|
24
|
+
version_requirements: *70162456439800
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70162456438320 !ruby/object:Gem::Requirement
|
24
28
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 0
|
30
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
31
33
|
type: :development
|
32
|
-
|
33
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70162456438320
|
36
|
+
- !ruby/object:Gem::Dependency
|
34
37
|
name: activesupport
|
38
|
+
requirement: &70162456437340 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
35
45
|
prerelease: false
|
36
|
-
|
46
|
+
version_requirements: *70162456437340
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: i18n
|
49
|
+
requirement: &70162456435080 !ruby/object:Gem::Requirement
|
37
50
|
none: false
|
38
|
-
requirements:
|
39
|
-
- -
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
- 0
|
43
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
44
55
|
type: :development
|
45
|
-
|
46
|
-
|
47
|
-
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70162456435080
|
58
|
+
description: This plugin adds helpers for the reCAPTCHA API
|
59
|
+
email:
|
60
|
+
- jasper@ambethia.com
|
48
61
|
executables: []
|
49
|
-
|
50
62
|
extensions: []
|
51
|
-
|
52
|
-
|
53
|
-
-
|
54
|
-
- README.rdoc
|
55
|
-
files:
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- .gitignore
|
56
66
|
- CHANGELOG
|
67
|
+
- Gemfile
|
68
|
+
- Gemfile.lock
|
57
69
|
- LICENSE
|
58
70
|
- README.rdoc
|
59
71
|
- Rakefile
|
@@ -64,43 +76,42 @@ files:
|
|
64
76
|
- lib/recaptcha/configuration.rb
|
65
77
|
- lib/recaptcha/merb.rb
|
66
78
|
- lib/recaptcha/rails.rb
|
79
|
+
- lib/recaptcha/railtie.rb
|
67
80
|
- lib/recaptcha/verify.rb
|
81
|
+
- lib/recaptcha/version.rb
|
68
82
|
- recaptcha.gemspec
|
69
|
-
- tasks/recaptcha_tasks.rake
|
70
83
|
- test/recaptcha_test.rb
|
71
84
|
- test/verify_recaptcha_test.rb
|
72
|
-
|
73
|
-
homepage: http://ambethia.com/recaptcha
|
85
|
+
homepage: http://github.com/ambethia/recaptcha
|
74
86
|
licenses: []
|
75
|
-
|
76
87
|
post_install_message:
|
77
88
|
rdoc_options: []
|
78
|
-
|
79
|
-
require_paths:
|
89
|
+
require_paths:
|
80
90
|
- lib
|
81
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
92
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
segments:
|
87
98
|
- 0
|
88
|
-
|
89
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
hash: -241857000290141400
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
101
|
none: false
|
91
|
-
requirements:
|
92
|
-
- -
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
segments:
|
95
107
|
- 0
|
96
|
-
|
108
|
+
hash: -241857000290141400
|
97
109
|
requirements: []
|
98
|
-
|
99
|
-
|
100
|
-
rubygems_version: 1.3.7
|
110
|
+
rubyforge_project: recaptcha
|
111
|
+
rubygems_version: 1.8.11
|
101
112
|
signing_key:
|
102
113
|
specification_version: 3
|
103
114
|
summary: Helpers for the reCAPTCHA API
|
104
|
-
test_files:
|
115
|
+
test_files:
|
105
116
|
- test/recaptcha_test.rb
|
106
117
|
- test/verify_recaptcha_test.rb
|
data/tasks/recaptcha_tasks.rake
DELETED