recaptcha 0.2.2

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.
@@ -0,0 +1,23 @@
1
+ == 0.2.2 / 2009-09-14
2
+
3
+ * Add a timeout to the validator
4
+ * Give the documentation some love
5
+
6
+ == 0.2.1 / 2009-09-14
7
+
8
+ * Removed Ambethia namespace, and restructured classes a bit
9
+ * Added an example rails app in the example-rails branch
10
+
11
+ == 0.2.0 / 2009-09-12
12
+
13
+ * RecaptchaOptions AJAX API Fix
14
+ * Added 'cucumber' as a test environment to skip
15
+ * Ruby 1.9 compat fixes
16
+ * Added option :message => 'Custom error message' to verify_recaptcha
17
+ * Removed dependency on ActiveRecord constant
18
+ * Add I18n
19
+
20
+ == 0.1.0 / 2008-2-8
21
+
22
+ * 1 major enhancement
23
+ * Initial Gem Release
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2007 Jason L Perry
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,92 @@
1
+ = reCAPTCHA
2
+
3
+ Author:: Jason L Perry (http://ambethia.com)
4
+ Copyright:: Copyright (c) 2007 Jason L Perry
5
+ License:: {MIT}[http://creativecommons.org/licenses/MIT/]
6
+ Info:: http://ambethia.com/recaptcha
7
+ Git:: http://github.com/ambethia/recaptcha/tree/master
8
+ Bugs:: http://github.com/ambethia/recaptcha/issues
9
+
10
+ This plugin adds helpers for the {reCAPTCHA API}[http://recaptcha.net]. In your views you can use
11
+ the +recaptcha_tags+ method to embed the needed javascript, and you can validate in your controllers
12
+ with +verify_recaptcha+.
13
+
14
+ You'll want to add your public and private API keys in the environment variables +RECAPTCHA_PUBLIC_KEY+
15
+ and +RECAPTCHA_PRIVATE_KEY+, respectively. You could also specify them in <tt>config/environment.rb</tt> if you
16
+ are so inclined (see below). Exceptions will be raised if you call these methods and the keys can't be found.
17
+
18
+ == Rails Installation
19
+
20
+ reCAPTCHA for Rails can be installed as a gem:
21
+
22
+ config.gem "ambethia-recaptcha", :lib => "recaptcha/rails", :source => "http://gems.github.com"
23
+
24
+ Or, as a standard rails plugin:
25
+
26
+ script/plugin install git://github.com/ambethia/recaptcha.git
27
+
28
+ == Setting up your API Keys
29
+
30
+ There are two ways to setup your reCAPTCHA API keys once you {obtain}[http://recaptcha.net/whyrecaptcha.html]
31
+ a pair. You can pass in your keys as options at runtime, for example:
32
+
33
+ recaptcha_tags :public_key => '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
34
+
35
+ and later,
36
+
37
+ verify_recaptcha :private_key => '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
38
+
39
+
40
+ Or, preferably, you can keep your keys out of your code base by exporting the environment variables
41
+ mentioned earlier. You might do this in the .profile/rc, or equivalent for the user running your
42
+ application:
43
+
44
+ export RECAPTCHA_PUBLIC_KEY = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
45
+ export RECAPTCHA_PRIVATE_KEY = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
46
+
47
+ If that's not your thing, and dropping things into <tt>config/environment.rb</tt> is, you can just do:
48
+
49
+ ENV['RECAPTCHA_PUBLIC_KEY'] = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
50
+ ENV['RECAPTCHA_PRIVATE_KEY'] = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
51
+
52
+ == +recaptcha_tags+
53
+
54
+ Some of the options available:
55
+
56
+ <tt>:ssl</tt>:: Uses secure http for captcha widget (default +false+)
57
+ <tt>:noscript</tt>:: Include <noscript> content (default +true+)
58
+ <tt>:display</tt>:: Takes a hash containing the +theme+ and +tabindex+ options per the API. (default +nil+)
59
+ <tt>:ajax</tt>:: Render the dynamic AJAX captcha per the API. (default +false+)
60
+ <tt>:public_key</tt>:: Your public API key, takes precedence over the ENV variable (default +nil+)
61
+ <tt>:error</tt>:: Override the error code returned from the reCAPTCHA API (default +nil+)
62
+
63
+ You can also override the html attributes for the sizes of the generated +textarea+ and +iframe+
64
+ elements, if CSS isn't your thing. Inspect the source of +recaptcha_tags+ to see these options.
65
+
66
+ == +verify_recaptcha+
67
+
68
+ This method returns +true+ or +false+ after processing the parameters from the reCAPTCHA widget. Why
69
+ isn't this a model validation? Because that violates MVC. Use can use it like this, or how ever you
70
+ like. Passing in the ActiveRecord object is optional, if you do--and the captcha fails to verify--an
71
+ error will be added to the object for you to use.
72
+
73
+ Some of the options available:
74
+
75
+ <tt>:model</tt>:: Model to set errors
76
+ <tt>:message</tt>:: Custom error message
77
+ <tt>:private_key</tt>:: Your private API key, takes precedence over the ENV variable (default +nil+).
78
+ <tt>:timeout</tt>:: The number of seconds to wait for reCAPTCHA servers before give up. (default +3+)
79
+
80
+ respond_to do |format|
81
+ if verify_recaptcha(:model => @post, :message => 'Oh! It's error with reCAPTCHA!') && @post.save
82
+ # ...
83
+ else
84
+ # ...
85
+ end
86
+ end
87
+
88
+ == TODO
89
+ * Remove Rails/ActionController dependencies
90
+ * Framework agnostic
91
+ * Add some helpers to use in before_filter and what not
92
+ * Better documentation
@@ -0,0 +1,57 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
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://github.com/ambethia/recaptcha"
10
+ gem.authors = ["Jason L. Perry"]
11
+ gem.email = "jasper@ambethia.com"
12
+ gem.files.reject! { |fn| fn.include? ".gitignore" }
13
+ end
14
+ rescue LoadError
15
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
16
+ end
17
+
18
+ require 'rake/rdoctask'
19
+ Rake::RDocTask.new do |rd|
20
+ if File.exist?('VERSION.yml')
21
+ config = YAML.load(File.read('VERSION.yml'))
22
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
23
+ else
24
+ version = ""
25
+ end
26
+
27
+ rd.main = "README.rdoc"
28
+ rd.rdoc_files.include "README.rdoc", "LICENSE", "lib/**/*.rb"
29
+ rd.rdoc_dir = 'rdoc'
30
+ rd.options << '-N' # line numbers
31
+ rd.options << '-S' # inline source
32
+ end
33
+
34
+ require 'rake/testtask'
35
+ Rake::TestTask.new(:test) do |test|
36
+ test.libs << 'test'
37
+ test.pattern = 'test/**/*_test.rb'
38
+ # test.verbose = true
39
+ end
40
+
41
+ begin
42
+ require 'rcov/rcovtask'
43
+ Rcov::RcovTask.new do |test|
44
+ test.libs << 'test'
45
+ test.pattern = 'test/**/*_test.rb'
46
+ test.verbose = true
47
+ end
48
+ rescue LoadError
49
+ task :rcov do
50
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
51
+ end
52
+ end
53
+
54
+ task :default => :test
55
+
56
+
57
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.2
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ # Rails plugin initialization.
2
+ # You can also install it as a gem:
3
+ # config.gem "ambethia-recaptcha", :lib => "recaptcha/rails", :source => "http://gems.github.com"
4
+ require 'recaptcha/rails'
@@ -0,0 +1,22 @@
1
+ require 'recaptcha/client_helper'
2
+ require 'recaptcha/verify'
3
+
4
+ module Recaptcha
5
+ module VERSION #:nodoc:
6
+ MAJOR = 0
7
+ MINOR = 2
8
+ TINY = 2
9
+
10
+ STRING = [MAJOR, MINOR, TINY].join('.')
11
+ end
12
+
13
+
14
+ RECAPTCHA_API_SERVER = 'http://api.recaptcha.net';
15
+ RECAPTCHA_API_SECURE_SERVER = 'https://api-secure.recaptcha.net';
16
+ RECAPTCHA_VERIFY_SERVER = 'api-verify.recaptcha.net';
17
+
18
+ SKIP_VERIFY_ENV = ['test', 'cucumber']
19
+
20
+ class RecaptchaError < StandardError
21
+ end
22
+ end
@@ -0,0 +1,42 @@
1
+ module Recaptcha
2
+ module ClientHelper
3
+ # Your public API can be specified in the +options+ hash or preferably
4
+ # the environment variable +RECAPTCHA_PUBLIC_KEY+.
5
+ def recaptcha_tags(options = {})
6
+ # Default options
7
+ key = options[:public_key] ||= ENV['RECAPTCHA_PUBLIC_KEY']
8
+ error = options[:error] ||= session[:recaptcha_error]
9
+ uri = options[:ssl] ? RECAPTCHA_API_SECURE_SERVER : RECAPTCHA_API_SERVER
10
+ html = ""
11
+ if options[:display]
12
+ html << %{<script type="text/javascript">\n}
13
+ html << %{ var RecaptchaOptions = #{options[:display].to_json};\n}
14
+ html << %{</script>\n}
15
+ end
16
+ if options[:ajax]
17
+ html << %{<div id="dynamic_recaptcha"></div>}
18
+ html << %{<script type="text/javascript" src="#{uri}/js/recaptcha_ajax.js"></script>\n}
19
+ html << %{<script type="text/javascript">\n}
20
+ html << %{ Recaptcha.create('#{key}', document.getElementById('dynamic_recaptcha')#{options[:display] ? '' : ',RecaptchaOptions'});}
21
+ html << %{</script>\n}
22
+ else
23
+ html << %{<script type="text/javascript" src="#{uri}/challenge?k=#{key}}
24
+ html << %{#{error ? "&error=#{CGI::escape(error)}" : ""}"></script>\n}
25
+ unless options[:noscript] == false
26
+ html << %{<noscript>\n }
27
+ html << %{<iframe src="#{uri}/noscript?k=#{key}" }
28
+ html << %{height="#{options[:iframe_height] ||= 300}" }
29
+ html << %{width="#{options[:iframe_width] ||= 500}" }
30
+ html << %{frameborder="0"></iframe><br/>\n }
31
+ html << %{<textarea name="recaptcha_challenge_field" }
32
+ html << %{rows="#{options[:textarea_rows] ||= 3}" }
33
+ html << %{cols="#{options[:textarea_cols] ||= 40}"></textarea>\n }
34
+ html << %{<input type="hidden" name="recaptcha_response_field" value="manual_challenge">}
35
+ html << %{</noscript>\n}
36
+ end
37
+ end
38
+ raise RecaptchaError, "No public key specified." unless key
39
+ return html
40
+ end # recaptcha_tags
41
+ end # ClientHelper
42
+ end # Recaptcha
@@ -0,0 +1,4 @@
1
+ require 'recaptcha'
2
+
3
+ ActionView::Base.send(:include, Recaptcha::ClientHelper)
4
+ ActionController::Base.send(:include, Recaptcha::Verify)
@@ -0,0 +1,45 @@
1
+ module Recaptcha
2
+ module Verify
3
+ # Your private API can be specified in the +options+ hash or preferably
4
+ # the environment variable +RECAPTCHA_PUBLIC_KEY+.
5
+ def verify_recaptcha(options = {})
6
+ return true if SKIP_VERIFY_ENV.include? ENV['RAILS_ENV']
7
+ model = options.is_a?(Hash)? options[:model] : options
8
+ private_key = options[:private_key] if options.is_a?(Hash)
9
+ private_key ||= ENV['RECAPTCHA_PRIVATE_KEY']
10
+ raise RecaptchaError, "No private key specified." unless private_key
11
+ begin
12
+ recaptcha = nil
13
+ Timeout::timeout(options[:timeout] || 3) do
14
+ recaptcha = Net::HTTP.post_form URI.parse("http://#{RECAPTCHA_VERIFY_SERVER}/verify"), {
15
+ "privatekey" => private_key,
16
+ "remoteip" => request.remote_ip,
17
+ "challenge" => params[:recaptcha_challenge_field],
18
+ "response" => params[:recaptcha_response_field]
19
+ }
20
+ end
21
+ answer, error = recaptcha.body.split.map { |s| s.chomp }
22
+ unless answer == 'true'
23
+ session[:recaptcha_error] = error
24
+ if model
25
+ model.valid?
26
+ model.errors.add :base, options[:message] || "Captcha response is incorrect, please try again."
27
+ end
28
+ return false
29
+ else
30
+ session[:recaptcha_error] = nil
31
+ return true
32
+ end
33
+ rescue Timeout::Error
34
+ session[:recaptcha_error] = "recaptcha-not-reachable"
35
+ if model
36
+ model.valid?
37
+ model.errors.add :base, options[:message] || "Oops, we failed to validate your Captcha. Please try again."
38
+ end
39
+ return false
40
+ rescue Exception => e
41
+ raise RecaptchaError, e.message, e.backtrace
42
+ end
43
+ end # verify_recaptcha
44
+ end # Verify
45
+ end # Recaptcha
@@ -0,0 +1,54 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{recaptcha}
8
+ s.version = "0.2.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jason L. Perry"]
12
+ s.date = %q{2009-10-14}
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/rails.rb",
29
+ "lib/recaptcha/verify.rb",
30
+ "recaptcha.gemspec",
31
+ "tasks/recaptcha_tasks.rake",
32
+ "test/recaptcha_test.rb",
33
+ "test/verify_recaptcha_test.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/ambethia/recaptcha}
36
+ s.rdoc_options = ["--charset=UTF-8"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.5}
39
+ s.summary = %q{Helpers for the reCAPTCHA API}
40
+ s.test_files = [
41
+ "test/recaptcha_test.rb",
42
+ "test/verify_recaptcha_test.rb"
43
+ ]
44
+
45
+ if s.respond_to? :specification_version then
46
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
50
+ else
51
+ end
52
+ else
53
+ end
54
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :recaptcha do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,37 @@
1
+ require 'test/unit'
2
+ require 'cgi'
3
+ require File.dirname(__FILE__) + '/../lib/recaptcha'
4
+
5
+ class RecaptchaClientHelperTest < Test::Unit::TestCase
6
+ include Recaptcha
7
+ include Recaptcha::ClientHelper
8
+ include Recaptcha::Verify
9
+
10
+ attr_accessor :session
11
+
12
+ def setup
13
+ @session = {}
14
+ ENV['RECAPTCHA_PUBLIC_KEY'] = '0000000000000000000000000000000000000000'
15
+ ENV['RECAPTCHA_PRIVATE_KEY'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
16
+ end
17
+
18
+ def test_recaptcha_tags
19
+ # Might as well match something...
20
+ assert_match /http:\/\/api.recaptcha.net/, recaptcha_tags
21
+ end
22
+
23
+ def test_recaptcha_tags_with_ssl
24
+ assert_match /https:\/\/api-secure.recaptcha.net/, recaptcha_tags(:ssl => true)
25
+ end
26
+
27
+ def test_recaptcha_tags_without_noscript
28
+ assert_no_match /noscript/, recaptcha_tags(:noscript => false)
29
+ end
30
+
31
+ def test_should_raise_exception_without_public_key
32
+ assert_raise RecaptchaError do
33
+ ENV['RECAPTCHA_PUBLIC_KEY'] = nil
34
+ recaptcha_tags
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,96 @@
1
+ require 'test/unit'
2
+ require 'rails/version' # For getting the rails version constants
3
+ require 'active_support/vendor' # For loading I18n
4
+ require 'mocha'
5
+ require 'net/http'
6
+ require File.dirname(__FILE__) + '/../lib/recaptcha'
7
+
8
+ class RecaptchaVerifyTest < Test::Unit::TestCase
9
+ def setup
10
+
11
+ ENV['RECAPTCHA_PRIVATE_KEY'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
12
+ @controller = TestController.new
13
+ @controller.request = stub(:remote_ip => "1.1.1.1")
14
+ @controller.params = {:recaptcha_challenge_field => "challenge", :recaptcha_response_field => "response"}
15
+
16
+ @expected_post_data = {}
17
+ @expected_post_data["privatekey"] = ENV['RECAPTCHA_PRIVATE_KEY']
18
+ @expected_post_data["remoteip"] = @controller.request.remote_ip
19
+ @expected_post_data["challenge"] = "challenge"
20
+ @expected_post_data["response"] = "response"
21
+
22
+ @expected_uri = URI.parse("http://#{Recaptcha::RECAPTCHA_VERIFY_SERVER}/verify")
23
+ end
24
+
25
+ def test_should_raise_exception_without_private_key
26
+ assert_raise Recaptcha::RecaptchaError do
27
+ ENV['RECAPTCHA_PRIVATE_KEY'] = nil
28
+ @controller.verify_recaptcha
29
+ end
30
+ end
31
+
32
+ def test_should_return_false_when_key_is_invalid
33
+ expect_http_post(response_with_body("false\ninvalid-site-private-key"))
34
+
35
+ assert !@controller.verify_recaptcha
36
+ assert_equal "invalid-site-private-key", @controller.session[:recaptcha_error]
37
+ end
38
+
39
+ def test_returns_true_on_success
40
+ @controller.session[:recaptcha_error] = "previous error that should be cleared"
41
+ expect_http_post(response_with_body("true\n"))
42
+
43
+ assert @controller.verify_recaptcha
44
+ assert_nil @controller.session[:recaptcha_error]
45
+ end
46
+
47
+ def test_errors_should_be_added_to_model
48
+ expect_http_post(response_with_body("false\nbad-news"))
49
+
50
+ errors = mock
51
+ errors.expects(:add).with(:base, "Captcha response is incorrect, please try again.")
52
+ model = mock(:valid? => false, :errors => errors)
53
+
54
+ assert !@controller.verify_recaptcha(:model => model)
55
+ assert_equal "bad-news", @controller.session[:recaptcha_error]
56
+ end
57
+
58
+ def test_returns_true_on_success_with_optional_key
59
+ @controller.session[:recaptcha_error] = "previous error that should be cleared"
60
+ # reset private key
61
+ @expected_post_data["privatekey"] = 'ADIFFERENTPRIVATEKEYXXXXXXXXXXXXXX'
62
+ expect_http_post(response_with_body("true\n"))
63
+
64
+ assert @controller.verify_recaptcha(:private_key => 'ADIFFERENTPRIVATEKEYXXXXXXXXXXXXXX')
65
+ assert_nil @controller.session[:recaptcha_error]
66
+ end
67
+
68
+ def test_timeout
69
+ expect_http_post(Timeout::Error, :exception => true)
70
+ assert !@controller.verify_recaptcha()
71
+ assert_equal "recaptcha-not-reachable", @controller.session[:recaptcha_error]
72
+ end
73
+
74
+ private
75
+
76
+ class TestController
77
+ include Recaptcha::Verify
78
+ attr_accessor :request, :params, :session
79
+
80
+ def initialize
81
+ @session = {}
82
+ end
83
+ end
84
+
85
+ def expect_http_post(response, options = {})
86
+ unless options[:exception]
87
+ Net::HTTP.expects(:post_form).with(@expected_uri, @expected_post_data).returns(response)
88
+ else
89
+ Net::HTTP.expects(:post_form).raises response
90
+ end
91
+ end
92
+
93
+ def response_with_body(body)
94
+ stub(:body => body)
95
+ end
96
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: recaptcha
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: ruby
6
+ authors:
7
+ - Jason L. Perry
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-14 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: "This plugin adds helpers for the reCAPTCHA API "
17
+ email: jasper@ambethia.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - LICENSE
24
+ - README.rdoc
25
+ files:
26
+ - CHANGELOG
27
+ - LICENSE
28
+ - README.rdoc
29
+ - Rakefile
30
+ - VERSION
31
+ - init.rb
32
+ - lib/recaptcha.rb
33
+ - lib/recaptcha/client_helper.rb
34
+ - lib/recaptcha/rails.rb
35
+ - lib/recaptcha/verify.rb
36
+ - recaptcha.gemspec
37
+ - tasks/recaptcha_tasks.rake
38
+ - test/recaptcha_test.rb
39
+ - test/verify_recaptcha_test.rb
40
+ has_rdoc: true
41
+ homepage: http://github.com/ambethia/recaptcha
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options:
46
+ - --charset=UTF-8
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project:
64
+ rubygems_version: 1.3.5
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Helpers for the reCAPTCHA API
68
+ test_files:
69
+ - test/recaptcha_test.rb
70
+ - test/verify_recaptcha_test.rb