antage-merb-recaptcha 1.0.0
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/LICENSE +20 -0
- data/README.textile +45 -0
- data/Rakefile +66 -0
- data/TODO +1 -0
- data/lib/merb-recaptcha/controller_mixin.rb +29 -0
- data/lib/merb-recaptcha/exceptions.rb +10 -0
- data/lib/merb-recaptcha/merbtasks.rb +0 -0
- data/lib/merb-recaptcha/view_helpers.rb +72 -0
- data/lib/merb-recaptcha.rb +28 -0
- data/merb-recaptcha.gemspec +38 -0
- data/spec/fixture/app/controllers/application.rb +2 -0
- data/spec/fixture/app/controllers/exceptions.rb +13 -0
- data/spec/fixture/app/controllers/recaptcha.rb +29 -0
- data/spec/fixture/app/helpers/global_helpers.rb +5 -0
- data/spec/fixture/app/helpers/recaptcha_helpers.rb +4 -0
- data/spec/fixture/app/views/exceptions/not_acceptable.html.erb +63 -0
- data/spec/fixture/app/views/exceptions/not_found.html.erb +47 -0
- data/spec/fixture/app/views/layout/application.html.erb +10 -0
- data/spec/fixture/app/views/recaptcha/ajax.html.erb +2 -0
- data/spec/fixture/app/views/recaptcha/ajax_with_callback.html.erb +2 -0
- data/spec/fixture/app/views/recaptcha/ajax_with_jquery.html.erb +2 -0
- data/spec/fixture/app/views/recaptcha/ajax_with_options.html.erb +2 -0
- data/spec/fixture/app/views/recaptcha/noajax_with_noscript.html.erb +1 -0
- data/spec/fixture/app/views/recaptcha/noajax_with_options.html.erb +1 -0
- data/spec/fixture/app/views/recaptcha/noajax_without_noscript.html.erb +1 -0
- data/spec/recaptcha_ajax_spec.rb +39 -0
- data/spec/recaptcha_ajax_with_callback_spec.rb +35 -0
- data/spec/recaptcha_ajax_with_jquery_spec.rb +39 -0
- data/spec/recaptcha_ajax_with_options_spec.rb +35 -0
- data/spec/recaptcha_noajax_with_noscript_spec.rb +59 -0
- data/spec/recaptcha_noajax_with_options_spec.rb +39 -0
- data/spec/recaptcha_noajax_without_noscript_spec.rb +39 -0
- data/spec/recaptcha_valid_spec.rb +97 -0
- data/spec/spec_helper.rb +43 -0
- metadata +137 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 Anton Ageev
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
h1. merb-recaptcha
|
2
|
+
|
3
|
+
h2. About
|
4
|
+
|
5
|
+
Merb-recaptcha is plugin for "Merb":http://github.com/wycats/merb web-framework. It provides view and controller helpers for "Recaptcha":http://recaptcha.net service.
|
6
|
+
|
7
|
+
h2. Installation
|
8
|
+
|
9
|
+
Install gem from github.com:
|
10
|
+
<pre><code>gem install antage-merb-recaptcha --source=http://gems.github.com</code></pre>
|
11
|
+
|
12
|
+
Add following line in <tt>config/dependencies.rb</tt> of your web application:
|
13
|
+
<pre><code>dependency "antage-merb-recaptcha", "~> 1.0.0", :require_as => "merb-recaptcha"</code></pre>
|
14
|
+
|
15
|
+
Sign up at "Recaptcha":http://recaptcha.net and get public and private keys. Add keys in <tt>config/init.rb</tt>:
|
16
|
+
<pre><code>Merb::BootLoader.after_app_loads do
|
17
|
+
Merb::Plugins.config[:merb_recaptcha][:public_key] = "... here your public key ..."
|
18
|
+
Merb::Plugins.config[:merb_recaptcha][:private_key] = "... here your private key ..."
|
19
|
+
end</code></pre>
|
20
|
+
|
21
|
+
h2. Usage
|
22
|
+
|
23
|
+
Just add helper in your form:
|
24
|
+
<pre><code><%= form_for @users, :action => resource(:users), :method => :post do %>
|
25
|
+
.....
|
26
|
+
<%= recaptcha_tags %>
|
27
|
+
<%= submit "Send" %>
|
28
|
+
<% end %></code></pre>
|
29
|
+
|
30
|
+
And then check captcha in controller:
|
31
|
+
<pre><code>class Users < Application
|
32
|
+
......
|
33
|
+
def create(user)
|
34
|
+
@user = User.new(user)
|
35
|
+
if (captcha_correct = recaptcha_valid?) && @user.save
|
36
|
+
redirect resource(@user)
|
37
|
+
else
|
38
|
+
unless captcha_correct
|
39
|
+
@user.valid?
|
40
|
+
@user.errors.add(:general, "Captcha code is incorrect")
|
41
|
+
end
|
42
|
+
render :new
|
43
|
+
end
|
44
|
+
......
|
45
|
+
end</code></pre>
|
data/Rakefile
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/clean'
|
4
|
+
|
5
|
+
require 'spec/rake/spectask'
|
6
|
+
|
7
|
+
require 'merb-core'
|
8
|
+
require 'merb-core/tasks/merb'
|
9
|
+
|
10
|
+
GEM_NAME = "merb-recaptcha"
|
11
|
+
GEM_VERSION = "1.0.0"
|
12
|
+
AUTHOR = "Anton Ageev"
|
13
|
+
EMAIL = "antage@gmail.com"
|
14
|
+
HOMEPAGE = "http://github.com/antage/merb-recaptcha/"
|
15
|
+
SUMMARY = "Merb plugin that provides helpers for recaptcha.net service"
|
16
|
+
|
17
|
+
spec = Gem::Specification.new do |s|
|
18
|
+
s.rubyforge_project = 'merb-recaptcha'
|
19
|
+
s.name = GEM_NAME
|
20
|
+
s.version = GEM_VERSION
|
21
|
+
s.platform = Gem::Platform::RUBY
|
22
|
+
s.has_rdoc = true
|
23
|
+
s.extra_rdoc_files = ["README.textile", "LICENSE", 'TODO']
|
24
|
+
s.summary = SUMMARY
|
25
|
+
s.description = s.summary
|
26
|
+
s.author = AUTHOR
|
27
|
+
s.email = EMAIL
|
28
|
+
s.homepage = HOMEPAGE
|
29
|
+
s.require_path = 'lib'
|
30
|
+
s.files = %w(LICENSE README.textile Rakefile TODO merb-recaptcha.gemspec) + Dir["lib/**/*"].select { |f| File.file?(f) }
|
31
|
+
s.test_files = %w(spec/spec_helper.rb) + Dir["spec/*_spec.rb"] + Dir["spec/fixture/app/**/*"].select { |f| File.file?(f) }
|
32
|
+
|
33
|
+
s.add_runtime_dependency "merb-core", ">= 1.0.0"
|
34
|
+
s.add_runtime_dependency "builder", "~> 2.0"
|
35
|
+
s.add_development_dependency "rspec", ">= 1.1.0"
|
36
|
+
end
|
37
|
+
|
38
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
39
|
+
pkg.gem_spec = spec
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "install the plugin as a gem"
|
43
|
+
task :install do
|
44
|
+
Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Uninstall the gem"
|
48
|
+
task :uninstall do
|
49
|
+
Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Create a gemspec file"
|
53
|
+
task :gemspec do
|
54
|
+
File.open("#{GEM_NAME}.gemspec", "w") do |file|
|
55
|
+
file.puts spec.to_ruby
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
60
|
+
t.spec_opts << '--format' << 'specdoc' << '--colour'
|
61
|
+
t.spec_opts << '--loadby' << 'random'
|
62
|
+
t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb')
|
63
|
+
t.rcov = false
|
64
|
+
end
|
65
|
+
|
66
|
+
task :default => :spec
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module Merb
|
4
|
+
module RecaptchaMixin
|
5
|
+
def recaptcha_valid?
|
6
|
+
response = Net::HTTP.post_form(URI.parse("http://api-verify.recaptcha.net/verify"), {
|
7
|
+
:privatekey => Merb::Plugins.config[:merb_recaptcha][:private_key],
|
8
|
+
:remoteip => request.remote_ip,
|
9
|
+
:challenge => params[:recaptcha_challenge_field],
|
10
|
+
:response => params[:recaptcha_response_field]
|
11
|
+
})
|
12
|
+
answer, error = response.body.split.map { |s| s.chomp }
|
13
|
+
if answer == "true"
|
14
|
+
true
|
15
|
+
else
|
16
|
+
case error
|
17
|
+
when "incorrect-captcha-sol" then false
|
18
|
+
when "invalid-site-public-key" then raise Merb::Recaptcha::InvalidSitePublicKey
|
19
|
+
when "invalid-site-private-key" then raise Merb::Recaptcha::InvalidSitePrivateKey
|
20
|
+
when "invalid-request-cookie" then raise Merb::Recaptcha::InvalidRequestCookie
|
21
|
+
when "verify-params-incorrect" then raise Merb::Recaptcha::VerifyParamsIncorrect
|
22
|
+
when "invalid-referrer" then raise Merb::Recaptcha::InvalidReferrer
|
23
|
+
else
|
24
|
+
raise Merb::Recaptcha::GenericError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Merb
|
2
|
+
module Recaptcha
|
3
|
+
class GenericError < RuntimeError; end
|
4
|
+
class InvalidSitePublicKey < GenericError; end
|
5
|
+
class InvalidSitePrivateKey < GenericError; end
|
6
|
+
class InvalidRequestCookie < GenericError; end
|
7
|
+
class VerifyParamsIncorrect < GenericError; end
|
8
|
+
class InvalidReferrer < GenericError; end
|
9
|
+
end
|
10
|
+
end
|
File without changes
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'builder'
|
2
|
+
|
3
|
+
module Merb
|
4
|
+
module Helpers
|
5
|
+
module Recaptcha
|
6
|
+
API_SERVER = "http://api.recaptcha.net"
|
7
|
+
API_SECURE_SERVER = "https://api-secure.recaptcha.net"
|
8
|
+
|
9
|
+
def recaptcha_tags(options = {})
|
10
|
+
public_key = Merb::Plugins.config[:merb_recaptcha][:public_key]
|
11
|
+
|
12
|
+
ajax = options.delete(:ajax) || false # boolean or :jquery
|
13
|
+
element_id = options.delete(:element_id) || "recaptcha" # string, html element id, only if ajax == true
|
14
|
+
callback = options.delete(:callback) # string, javascript function name, only if ajax == true
|
15
|
+
noscript = options.delete(:noscript) || false # boolean
|
16
|
+
iframe_height = options.delete(:iframe_height) || 300 # integer, only if noscript == true
|
17
|
+
iframe_width = options.delete(:iframe_width) || 500 # integer, only if noscript == true
|
18
|
+
|
19
|
+
api_url = if request.ssl?
|
20
|
+
API_SECURE_SERVER
|
21
|
+
else
|
22
|
+
API_SERVER
|
23
|
+
end
|
24
|
+
|
25
|
+
result = ""
|
26
|
+
xhtml = Builder::XmlMarkup.new(:target => result, :indent => 2)
|
27
|
+
if ajax
|
28
|
+
xhtml.script(:type => "text/javascript", :src => "#{api_url}/js/recaptcha_ajax.js") {}
|
29
|
+
xhtml.script(:type => "text/javascript") do
|
30
|
+
options_and_callback = callback.nil? ? options : options.merge(:callback => callback)
|
31
|
+
xhtml.text!("var options = #{hash_to_json(options_and_callback)};\n")
|
32
|
+
if ajax == :jquery
|
33
|
+
xhtml.text!("$(document).ready(function() { Recaptcha.create('#{public_key}', document.getElementById('#{element_id}'), options); });\n")
|
34
|
+
else
|
35
|
+
xhtml.text!("window.onload = function() { Recaptcha.create('#{public_key}', document.getElementById('#{element_id}'), options); }\n")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
else
|
39
|
+
unless options.empty?
|
40
|
+
xhtml.script(:type => "text/javascript") do
|
41
|
+
xhtml.text!("var RecaptchaOptions = #{hash_to_json(options)};\n")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
xhtml.script(:type => "text/javascript", :src => "#{api_url}/challenge?k=#{public_key}") {}
|
45
|
+
if noscript
|
46
|
+
xhtml.noscript do
|
47
|
+
xhtml.iframe(:src => "#{api_url}/noscript?k=#{public_key}", :height => iframe_height, :width => iframe_width, :frameborder => 0) {}
|
48
|
+
xhtml.br
|
49
|
+
xhtml.textarea(:name => "recaptcha_challenge_field", :rows => 3, :cols => 40) {}
|
50
|
+
xhtml.input :name => "recaptcha_response_field", :type => "hidden", :value => "manual_challenge"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def hash_to_json(hash)
|
60
|
+
result = "{"
|
61
|
+
result << hash.map do |k, v|
|
62
|
+
if ! v.is_a?(String) || k.to_s == "callback"
|
63
|
+
"\"#{k}\": #{v}"
|
64
|
+
else
|
65
|
+
"\"#{k}\": \"#{v}\""
|
66
|
+
end
|
67
|
+
end.join(", ")
|
68
|
+
result << "}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# make sure we're running inside Merb
|
2
|
+
if defined?(Merb::Plugins)
|
3
|
+
|
4
|
+
# Merb gives you a Merb::Plugins.config hash...feel free to put your stuff in your piece of it
|
5
|
+
Merb::Plugins.config[:merb_recaptcha] = {
|
6
|
+
:public_key => "",
|
7
|
+
:private_key => ""
|
8
|
+
}
|
9
|
+
|
10
|
+
Merb::BootLoader.before_app_loads do
|
11
|
+
# require code that must be loaded before the application
|
12
|
+
require 'merb-recaptcha/view_helpers.rb'
|
13
|
+
require 'merb-recaptcha/exceptions.rb'
|
14
|
+
require 'merb-recaptcha/controller_mixin.rb'
|
15
|
+
module Merb::GlobalHelpers
|
16
|
+
include Merb::Helpers::Recaptcha
|
17
|
+
end
|
18
|
+
class Merb::Controller
|
19
|
+
include Merb::RecaptchaMixin
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Merb::BootLoader.after_app_loads do
|
24
|
+
# code that can be required after the application loads
|
25
|
+
end
|
26
|
+
|
27
|
+
Merb::Plugins.add_rakefiles "merb-recaptcha/merbtasks"
|
28
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = %q{merb-recaptcha}
|
3
|
+
s.version = "1.0.0"
|
4
|
+
|
5
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
|
+
s.authors = ["Anton Ageev"]
|
7
|
+
s.date = %q{2008-12-10}
|
8
|
+
s.description = %q{Merb plugin that provides helpers for recaptcha.net service}
|
9
|
+
s.email = %q{antage@gmail.com}
|
10
|
+
s.extra_rdoc_files = ["README.textile", "LICENSE", "TODO"]
|
11
|
+
s.files = ["LICENSE", "README.textile", "Rakefile", "TODO", "merb-recaptcha.gemspec", "lib/merb-recaptcha.rb", "lib/merb-recaptcha/exceptions.rb", "lib/merb-recaptcha/view_helpers.rb", "lib/merb-recaptcha/controller_mixin.rb", "lib/merb-recaptcha/merbtasks.rb", "spec/spec_helper.rb", "spec/recaptcha_ajax_with_callback_spec.rb", "spec/recaptcha_noajax_with_noscript_spec.rb", "spec/recaptcha_noajax_with_options_spec.rb", "spec/recaptcha_ajax_spec.rb", "spec/recaptcha_ajax_with_jquery_spec.rb", "spec/recaptcha_ajax_with_options_spec.rb", "spec/recaptcha_noajax_without_noscript_spec.rb", "spec/recaptcha_valid_spec.rb", "spec/fixture/app/views/layout/application.html.erb", "spec/fixture/app/views/recaptcha/ajax_with_callback.html.erb", "spec/fixture/app/views/recaptcha/noajax_with_noscript.html.erb", "spec/fixture/app/views/recaptcha/ajax.html.erb", "spec/fixture/app/views/recaptcha/ajax_with_jquery.html.erb", "spec/fixture/app/views/recaptcha/noajax_with_options.html.erb", "spec/fixture/app/views/recaptcha/noajax_without_noscript.html.erb", "spec/fixture/app/views/recaptcha/ajax_with_options.html.erb", "spec/fixture/app/views/exceptions/not_acceptable.html.erb", "spec/fixture/app/views/exceptions/not_found.html.erb", "spec/fixture/app/controllers/exceptions.rb", "spec/fixture/app/controllers/application.rb", "spec/fixture/app/controllers/recaptcha.rb", "spec/fixture/app/helpers/recaptcha_helpers.rb", "spec/fixture/app/helpers/global_helpers.rb"]
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.homepage = %q{http://github.com/antage/merb-recaptcha/}
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
s.rubyforge_project = %q{merb-recaptcha}
|
16
|
+
s.rubygems_version = %q{1.2.0}
|
17
|
+
s.summary = %q{Merb plugin that provides helpers for recaptcha.net service}
|
18
|
+
s.test_files = ["spec/spec_helper.rb", "spec/recaptcha_ajax_with_callback_spec.rb", "spec/recaptcha_noajax_with_noscript_spec.rb", "spec/recaptcha_noajax_with_options_spec.rb", "spec/recaptcha_ajax_spec.rb", "spec/recaptcha_ajax_with_jquery_spec.rb", "spec/recaptcha_ajax_with_options_spec.rb", "spec/recaptcha_noajax_without_noscript_spec.rb", "spec/recaptcha_valid_spec.rb", "spec/fixture/app/views/layout/application.html.erb", "spec/fixture/app/views/recaptcha/ajax_with_callback.html.erb", "spec/fixture/app/views/recaptcha/noajax_with_noscript.html.erb", "spec/fixture/app/views/recaptcha/ajax.html.erb", "spec/fixture/app/views/recaptcha/ajax_with_jquery.html.erb", "spec/fixture/app/views/recaptcha/noajax_with_options.html.erb", "spec/fixture/app/views/recaptcha/noajax_without_noscript.html.erb", "spec/fixture/app/views/recaptcha/ajax_with_options.html.erb", "spec/fixture/app/views/exceptions/not_acceptable.html.erb", "spec/fixture/app/views/exceptions/not_found.html.erb", "spec/fixture/app/controllers/exceptions.rb", "spec/fixture/app/controllers/application.rb", "spec/fixture/app/controllers/recaptcha.rb", "spec/fixture/app/helpers/recaptcha_helpers.rb", "spec/fixture/app/helpers/global_helpers.rb"]
|
19
|
+
|
20
|
+
if s.respond_to? :specification_version then
|
21
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
22
|
+
s.specification_version = 2
|
23
|
+
|
24
|
+
if current_version >= 3 then
|
25
|
+
s.add_runtime_dependency(%q<merb-core>, [">= 1.0.0"])
|
26
|
+
s.add_runtime_dependency(%q<builder>, ["~> 2.0"])
|
27
|
+
s.add_development_dependency(%q<rspec>, [">= 1.1.0"])
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<merb-core>, [">= 1.0.0"])
|
30
|
+
s.add_dependency(%q<builder>, ["~> 2.0"])
|
31
|
+
s.add_dependency(%q<rspec>, [">= 1.1.0"])
|
32
|
+
end
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<merb-core>, [">= 1.0.0"])
|
35
|
+
s.add_dependency(%q<builder>, ["~> 2.0"])
|
36
|
+
s.add_dependency(%q<rspec>, [">= 1.1.0"])
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Recaptcha < Application
|
2
|
+
def ajax
|
3
|
+
render
|
4
|
+
end
|
5
|
+
|
6
|
+
def ajax_with_jquery
|
7
|
+
render
|
8
|
+
end
|
9
|
+
|
10
|
+
def ajax_with_callback
|
11
|
+
render
|
12
|
+
end
|
13
|
+
|
14
|
+
def ajax_with_options
|
15
|
+
render
|
16
|
+
end
|
17
|
+
|
18
|
+
def noajax_without_noscript
|
19
|
+
render
|
20
|
+
end
|
21
|
+
|
22
|
+
def noajax_with_noscript
|
23
|
+
render
|
24
|
+
end
|
25
|
+
|
26
|
+
def noajax_with_options
|
27
|
+
render
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<div id="container">
|
2
|
+
<div id="header-container">
|
3
|
+
<img src="/images/merb.jpg" />
|
4
|
+
<!-- <h1>Mongrel + Erb</h1> -->
|
5
|
+
<h2>pocket rocket web framework</h2>
|
6
|
+
<hr />
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="left-container">
|
10
|
+
<h3>Exception:</h3>
|
11
|
+
<p><%= request.exceptions.first.message %></p>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div id="main-container">
|
15
|
+
<h3>Why am I seeing this page?</h3>
|
16
|
+
<p>Merb couldn't find an appropriate content_type to return,
|
17
|
+
based on what you said was available via provides() and
|
18
|
+
what the client requested.</p>
|
19
|
+
|
20
|
+
<h3>How to add a mime-type</h3>
|
21
|
+
<pre><code>
|
22
|
+
Merb.add_mime_type :pdf, :to_pdf, %w[application/pdf], "Content-Encoding" => "gzip"
|
23
|
+
</code></pre>
|
24
|
+
<h3>What this means is:</h3>
|
25
|
+
<ul>
|
26
|
+
<li>Add a mime-type for :pdf</li>
|
27
|
+
<li>Register the method for converting objects to PDF as <code>#to_pdf</code>.</li>
|
28
|
+
<li>Register the incoming mime-type "Accept" header as <code>application/pdf</code>.</li>
|
29
|
+
<li>Specify a new header for PDF types so it will set <code>Content-Encoding</code> to gzip.</li>
|
30
|
+
</ul>
|
31
|
+
|
32
|
+
<h3>You can then do:</h3>
|
33
|
+
<pre><code>
|
34
|
+
class Foo < Application
|
35
|
+
provides :pdf
|
36
|
+
end
|
37
|
+
</code></pre>
|
38
|
+
|
39
|
+
<h3>Where can I find help?</h3>
|
40
|
+
<p>If you have any questions or if you can't figure something out, please take a
|
41
|
+
look at our <a href="http://merbivore.com/"> project page</a>,
|
42
|
+
feel free to come chat at irc.freenode.net, channel #merb,
|
43
|
+
or post to <a href="http://groups.google.com/group/merb">merb mailing list</a>
|
44
|
+
on Google Groups.</p>
|
45
|
+
|
46
|
+
<h3>What if I've found a bug?</h3>
|
47
|
+
<p>If you want to file a bug or make your own contribution to Merb,
|
48
|
+
feel free to register and create a ticket at our
|
49
|
+
<a href="http://merb.lighthouseapp.com/">project development page</a>
|
50
|
+
on Lighthouse.</p>
|
51
|
+
|
52
|
+
<h3>How do I edit this page?</h3>
|
53
|
+
<p>You can change what people see when this happens by editing <tt>app/views/exceptions/not_acceptable.html.erb</tt>.</p>
|
54
|
+
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<div id="footer-container">
|
58
|
+
<hr />
|
59
|
+
<div class="left"></div>
|
60
|
+
<div class="right">© 2008 the merb dev team</div>
|
61
|
+
<p> </p>
|
62
|
+
</div>
|
63
|
+
</div>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<div id="container">
|
2
|
+
<div id="header-container">
|
3
|
+
<img src="/images/merb.jpg" />
|
4
|
+
<!-- <h1>Mongrel + Erb</h1> -->
|
5
|
+
<h2>pocket rocket web framework</h2>
|
6
|
+
<hr />
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="left-container">
|
10
|
+
<h3>Exception:</h3>
|
11
|
+
<p><%= request.exceptions.first.message %></p>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div id="main-container">
|
15
|
+
<h3>Welcome to Merb!</h3>
|
16
|
+
<p>Merb is a light-weight MVC framework written in Ruby. We hope you enjoy it.</p>
|
17
|
+
|
18
|
+
<h3>Where can I find help?</h3>
|
19
|
+
<p>If you have any questions or if you can't figure something out, please take a
|
20
|
+
look at our <a href="http://merbivore.com/"> project page</a>,
|
21
|
+
feel free to come chat at irc.freenode.net, channel #merb,
|
22
|
+
or post to <a href="http://groups.google.com/group/merb">merb mailing list</a>
|
23
|
+
on Google Groups.</p>
|
24
|
+
|
25
|
+
<h3>What if I've found a bug?</h3>
|
26
|
+
<p>If you want to file a bug or make your own contribution to Merb,
|
27
|
+
feel free to register and create a ticket at our
|
28
|
+
<a href="http://merb.lighthouseapp.com/">project development page</a>
|
29
|
+
on Lighthouse.</p>
|
30
|
+
|
31
|
+
<h3>How do I edit this page?</h3>
|
32
|
+
<p>You're seeing this page because you need to edit the following files:
|
33
|
+
<ul>
|
34
|
+
<li>config/router.rb <strong><em>(recommended)</em></strong></li>
|
35
|
+
<li>app/views/exceptions/not_found.html.erb <strong><em>(recommended)</em></strong></li>
|
36
|
+
<li>app/views/layout/application.html.erb <strong><em>(change this layout)</em></strong></li>
|
37
|
+
</ul>
|
38
|
+
</p>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<div id="footer-container">
|
42
|
+
<hr />
|
43
|
+
<div class="left"></div>
|
44
|
+
<div class="right">© 2008 the merb dev team</div>
|
45
|
+
<p> </p>
|
46
|
+
</div>
|
47
|
+
</div>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
|
3
|
+
<head>
|
4
|
+
<title>Fresh Merb App</title>
|
5
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<%= catch_content :for_layout %>
|
9
|
+
</body>
|
10
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= recaptcha_tags :ajax => false, :noscript => true, :iframe_height => 250, :iframe_width => 250 %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= recaptcha_tags :ajax => false, :noscript => false, :theme => "clean", :tabindex => 2 %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= recaptcha_tags :ajax => false, :noscript => false %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#ajax" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "ajax")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/js/recaptcha_ajax.js']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should invoke Recaptcha.create using onload event" do
|
14
|
+
@response.should have_xpath("//script[contains(., 'window.onload = function() { Recaptcha.create')]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should send element_id ('recaptcha_without_callback')" do
|
18
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., \"getElementById('recaptcha_without_callback')\")]")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should create empty options array" do
|
22
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., 'var options = {};')]")
|
23
|
+
end
|
24
|
+
|
25
|
+
it_should_behave_like "ajax recaptcha"
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "HTTPS" do
|
29
|
+
before(:each) do
|
30
|
+
@response = dispatch_to(Recaptcha, "ajax", {}, { "HTTPS" => "on" })
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should load script from secure api url" do
|
34
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/js/recaptcha_ajax.js']")
|
35
|
+
end
|
36
|
+
|
37
|
+
it_should_behave_like "ajax recaptcha"
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#ajax_with_callback" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "ajax_with_callback")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/js/recaptcha_ajax.js']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should send element_id ('recaptcha_with_callback')" do
|
14
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., \"getElementById('recaptcha_with_callback')\")]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should create options array containing callback value ('test_callback')" do
|
18
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., 'var options = {\"callback\": test_callback};')]")
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "ajax recaptcha"
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "HTTPS" do
|
25
|
+
before(:each) do
|
26
|
+
@response = dispatch_to(Recaptcha, "ajax_with_callback", {}, { "HTTPS" => "on" })
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should load script from secure api url" do
|
30
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/js/recaptcha_ajax.js']")
|
31
|
+
end
|
32
|
+
|
33
|
+
it_should_behave_like "ajax recaptcha"
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#ajax_with_jquery" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "ajax_with_jquery")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/js/recaptcha_ajax.js']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should invoke Recaptcha.create using onload event" do
|
14
|
+
@response.should have_xpath("//script[contains(., '$(document).ready(function() { Recaptcha.create')]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should send element_id ('recaptcha_without_callback')" do
|
18
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., \"getElementById('recaptcha_without_callback')\")]")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should create empty options array" do
|
22
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., 'var options = {};')]")
|
23
|
+
end
|
24
|
+
|
25
|
+
it_should_behave_like "ajax recaptcha"
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "HTTPS" do
|
29
|
+
before(:each) do
|
30
|
+
@response = dispatch_to(Recaptcha, "ajax_with_jquery", {}, { "HTTPS" => "on" })
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should load script from secure api url" do
|
34
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/js/recaptcha_ajax.js']")
|
35
|
+
end
|
36
|
+
|
37
|
+
it_should_behave_like "ajax recaptcha"
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#ajax_with_options" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "ajax_with_options")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/js/recaptcha_ajax.js']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should send element_id ('recaptcha_without_callback')" do
|
14
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., \"getElementById('recaptcha_without_callback')\")]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should create options array containing custom options (theme = 'clean', tabindex = 2)" do
|
18
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and (contains(., 'var options = {\"theme\": \"clean\", \"tabindex\": 2};') or contains(., 'var options = {\"tabindex\": 2, \"theme\": \"clean\"};'))]")
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "ajax recaptcha"
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "HTTPS" do
|
25
|
+
before(:each) do
|
26
|
+
@response = dispatch_to(Recaptcha, "ajax_with_options", {}, { "HTTPS" => "on" })
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should load script from secure api url" do
|
30
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/js/recaptcha_ajax.js']")
|
31
|
+
end
|
32
|
+
|
33
|
+
it_should_behave_like "ajax recaptcha"
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#noajax_with_noscript" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "noajax_with_noscript")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/challenge?k=#{Merb::Plugins.config[:merb_recaptcha][:public_key]}']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not send private key to anything" do
|
14
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should not have RecaptchaOptions array initialization" do
|
18
|
+
@response.should_not have_xpath("//script[contains(., 'var RecaptchaOptions')]")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should have noscript element" do
|
22
|
+
@response.should have_xpath("//noscript")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should have iframe in noscript element" do
|
26
|
+
@response.should have_xpath("//noscript/iframe")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should have iframe with specified height and width (250x250)" do
|
30
|
+
@response.should have_xpath("//noscript/iframe[@height=250 and @width=250]")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have br element in noscript element" do
|
34
|
+
@response.should have_xpath("//noscript/br")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should have textarea in noscript element" do
|
38
|
+
@response.should have_xpath("//noscript/textarea[@name='recaptcha_challenge_field']")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have hidden input element in noscript element" do
|
42
|
+
@response.should have_xpath("//noscript/input[@name='recaptcha_response_field' and @type='hidden' and @value='manual_challenge']")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "HTTPS" do
|
47
|
+
before(:each) do
|
48
|
+
@response = dispatch_to(Recaptcha, "noajax_with_noscript", {}, { "HTTPS" => "on" })
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should load script from secure api url" do
|
52
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/challenge?k=#{Merb::Plugins.config[:merb_recaptcha][:public_key]}']")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should not send private key to anything" do
|
56
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#noajax_with_options" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "noajax_with_options")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/challenge?k=#{Merb::Plugins.config[:merb_recaptcha][:public_key]}']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not send private key to anything" do
|
14
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should not have noscript element" do
|
18
|
+
@response.should_not have_xpath("//noscript")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should have RecaptchaOptions array intialization (theme = 'clean', tabindex = 2)" do
|
22
|
+
@response.should have_xpath("//script[contains(., 'var RecaptchaOptions = {\"theme\": \"clean\", \"tabindex\": 2};') or contains(., 'var RecaptchaOptions = {\"tabindex\": 2, \"theme\": \"clean\"};')]")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "HTTPS" do
|
27
|
+
before(:each) do
|
28
|
+
@response = dispatch_to(Recaptcha, "noajax_with_options", {}, { "HTTPS" => "on" })
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should load script from secure api url" do
|
32
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/challenge?k=#{Merb::Plugins.config[:merb_recaptcha][:public_key]}']")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should not send private key to anything" do
|
36
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "Recaptcha#noajax_without_noscript" do
|
4
|
+
describe "HTTP" do
|
5
|
+
before(:each) do
|
6
|
+
@response = dispatch_to(Recaptcha, "noajax_without_noscript")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should load script from api url" do
|
10
|
+
@response.should have_xpath("//script[@src='http://api.recaptcha.net/challenge?k=#{Merb::Plugins.config[:merb_recaptcha][:public_key]}']")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not send private key to anything" do
|
14
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should not have noscript element" do
|
18
|
+
@response.should_not have_xpath("//noscript")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should not have RecaptchaOptions array initialization" do
|
22
|
+
@response.should_not have_xpath("//script[contains(., 'var RecaptchaOptions')]")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "HTTPS" do
|
27
|
+
before(:each) do
|
28
|
+
@response = dispatch_to(Recaptcha, "noajax_without_noscript", {}, { "HTTPS" => "on" })
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should load script from secure api url" do
|
32
|
+
@response.should have_xpath("//script[@src='https://api-secure.recaptcha.net/challenge?k=#{Merb::Plugins.config[:merb_recaptcha][:public_key]}']")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should not send private key to anything" do
|
36
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "spec_helper")
|
2
|
+
|
3
|
+
class FakeController < Merb::Controller
|
4
|
+
def check_recaptcha
|
5
|
+
return recaptcha_valid?.to_s
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "FakeController#check_recaptcha" do
|
10
|
+
def do_request
|
11
|
+
@response = dispatch_to(FakeController, "check_recaptcha", { :recaptcha_challenge_field => "blabla", :recaptcha_response_field => "blabla" })
|
12
|
+
end
|
13
|
+
|
14
|
+
def stub_response(body)
|
15
|
+
Net::HTTP.stub!(:post_form).and_return mock("Net::HTTPResponse", :body => body)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "with correct response" do
|
19
|
+
before(:each) do
|
20
|
+
stub_response("true\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should render 'true'" do
|
24
|
+
do_request
|
25
|
+
@response.should have_selector("*:contains('true')")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should not raise any exception" do
|
29
|
+
lambda { do_request }.should_not raise_error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "with incorrect response" do
|
34
|
+
before(:each) do
|
35
|
+
stub_response("false\nincorrect-captcha-sol\n")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should render 'false'" do
|
39
|
+
do_request
|
40
|
+
@response.should have_selector("*:contains('false')")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not raise any exception" do
|
44
|
+
lambda { do_request }.should_not raise_error
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "with incorrect public key" do
|
49
|
+
before(:each) do
|
50
|
+
stub_response("false\ninvalid-site-public-key\n")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should raise Merb::Recaptcha::InvalidSitePublicKey" do
|
54
|
+
lambda { do_request }.should raise_error(Merb::Recaptcha::InvalidSitePublicKey)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "with incorrect private key" do
|
59
|
+
before(:each) do
|
60
|
+
stub_response("false\ninvalid-site-private-key\n")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should raise Merb::Recaptcha::InvalidSitePrivateKey" do
|
64
|
+
lambda { do_request }.should raise_error(Merb::Recaptcha::InvalidSitePrivateKey)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "with invalid request cookie" do
|
69
|
+
before(:each) do
|
70
|
+
stub_response("false\ninvalid-request-cookie\n")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should raise Merb::Recaptcha::InvalidRequestCookie" do
|
74
|
+
lambda { do_request }.should raise_error(Merb::Recaptcha::InvalidRequestCookie)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "with verify parameters incorrect" do
|
79
|
+
before(:each) do
|
80
|
+
stub_response("false\nverify-params-incorrect\n")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise Merb::Recaptcha::VerifyParamsIncorrect" do
|
84
|
+
lambda { do_request }.should raise_error(Merb::Recaptcha::VerifyParamsIncorrect)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "with invalid referrer" do
|
89
|
+
before(:each) do
|
90
|
+
stub_response("false\ninvalid-referrer\n")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should raise Merb::Recaptcha::IvalidReferrer" do
|
94
|
+
lambda { do_request }.should raise_error(Merb::Recaptcha::InvalidReferrer)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
require 'merb-core'
|
4
|
+
|
5
|
+
$:.push File.join(File.dirname(__FILE__), '..', 'lib')
|
6
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'merb-recaptcha')
|
7
|
+
|
8
|
+
default_options = {
|
9
|
+
:testing => true,
|
10
|
+
:adapter => 'runner',
|
11
|
+
:merb_root => File.dirname(__FILE__) / 'fixture',
|
12
|
+
:log_stream => STDOUT
|
13
|
+
}
|
14
|
+
options = default_options.merge($START_OPTIONS || {})
|
15
|
+
|
16
|
+
Merb.disable(:initfile)
|
17
|
+
Merb::BootLoader.after_app_loads do
|
18
|
+
Merb::Plugins.config[:merb_recaptcha][:public_key] = "QAAAAAA--public-key--AAAAAAQ"
|
19
|
+
Merb::Plugins.config[:merb_recaptcha][:private_key] = "QAAAAAA--private-key--AAAAAAAQ"
|
20
|
+
|
21
|
+
Merb::Router.prepare { default_routes }
|
22
|
+
end
|
23
|
+
Merb.start_environment(options)
|
24
|
+
|
25
|
+
Spec::Runner.configure do |config|
|
26
|
+
config.include Merb::Test::ViewHelper
|
27
|
+
config.include Merb::Test::RouteHelper
|
28
|
+
config.include Merb::Test::ControllerHelper
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "ajax recaptcha", :shared => true do
|
32
|
+
it "should invoke Recaptcha.create" do
|
33
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create')]")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should send public key to Recaptcha.create" do
|
37
|
+
@response.should have_xpath("//script[contains(., 'Recaptcha.create') and contains(., '#{Merb::Plugins.config[:merb_recaptcha][:public_key]}')]")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not send private key to anything" do
|
41
|
+
@response.should_not have_xpath("//*[contains(., '#{Merb::Plugins.config[:merb_recaptcha][:private_key]}')]")
|
42
|
+
end
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: antage-merb-recaptcha
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anton Ageev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-12-10 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: merb-core
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.0
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: builder
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "2.0"
|
32
|
+
version:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
version_requirement:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.1.0
|
41
|
+
version:
|
42
|
+
description: Merb plugin that provides helpers for recaptcha.net service
|
43
|
+
email: antage@gmail.com
|
44
|
+
executables: []
|
45
|
+
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README.textile
|
50
|
+
- LICENSE
|
51
|
+
- TODO
|
52
|
+
files:
|
53
|
+
- LICENSE
|
54
|
+
- README.textile
|
55
|
+
- Rakefile
|
56
|
+
- TODO
|
57
|
+
- merb-recaptcha.gemspec
|
58
|
+
- lib/merb-recaptcha.rb
|
59
|
+
- lib/merb-recaptcha/exceptions.rb
|
60
|
+
- lib/merb-recaptcha/view_helpers.rb
|
61
|
+
- lib/merb-recaptcha/controller_mixin.rb
|
62
|
+
- lib/merb-recaptcha/merbtasks.rb
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- spec/recaptcha_ajax_with_callback_spec.rb
|
65
|
+
- spec/recaptcha_noajax_with_noscript_spec.rb
|
66
|
+
- spec/recaptcha_noajax_with_options_spec.rb
|
67
|
+
- spec/recaptcha_ajax_spec.rb
|
68
|
+
- spec/recaptcha_ajax_with_jquery_spec.rb
|
69
|
+
- spec/recaptcha_ajax_with_options_spec.rb
|
70
|
+
- spec/recaptcha_noajax_without_noscript_spec.rb
|
71
|
+
- spec/recaptcha_valid_spec.rb
|
72
|
+
- spec/fixture/app/views/layout/application.html.erb
|
73
|
+
- spec/fixture/app/views/recaptcha/ajax_with_callback.html.erb
|
74
|
+
- spec/fixture/app/views/recaptcha/noajax_with_noscript.html.erb
|
75
|
+
- spec/fixture/app/views/recaptcha/ajax.html.erb
|
76
|
+
- spec/fixture/app/views/recaptcha/ajax_with_jquery.html.erb
|
77
|
+
- spec/fixture/app/views/recaptcha/noajax_with_options.html.erb
|
78
|
+
- spec/fixture/app/views/recaptcha/noajax_without_noscript.html.erb
|
79
|
+
- spec/fixture/app/views/recaptcha/ajax_with_options.html.erb
|
80
|
+
- spec/fixture/app/views/exceptions/not_acceptable.html.erb
|
81
|
+
- spec/fixture/app/views/exceptions/not_found.html.erb
|
82
|
+
- spec/fixture/app/controllers/exceptions.rb
|
83
|
+
- spec/fixture/app/controllers/application.rb
|
84
|
+
- spec/fixture/app/controllers/recaptcha.rb
|
85
|
+
- spec/fixture/app/helpers/recaptcha_helpers.rb
|
86
|
+
- spec/fixture/app/helpers/global_helpers.rb
|
87
|
+
has_rdoc: true
|
88
|
+
homepage: http://github.com/antage/merb-recaptcha/
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options: []
|
91
|
+
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: "0"
|
99
|
+
version:
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: "0"
|
105
|
+
version:
|
106
|
+
requirements: []
|
107
|
+
|
108
|
+
rubyforge_project: merb-recaptcha
|
109
|
+
rubygems_version: 1.2.0
|
110
|
+
signing_key:
|
111
|
+
specification_version: 2
|
112
|
+
summary: Merb plugin that provides helpers for recaptcha.net service
|
113
|
+
test_files:
|
114
|
+
- spec/spec_helper.rb
|
115
|
+
- spec/recaptcha_ajax_with_callback_spec.rb
|
116
|
+
- spec/recaptcha_noajax_with_noscript_spec.rb
|
117
|
+
- spec/recaptcha_noajax_with_options_spec.rb
|
118
|
+
- spec/recaptcha_ajax_spec.rb
|
119
|
+
- spec/recaptcha_ajax_with_jquery_spec.rb
|
120
|
+
- spec/recaptcha_ajax_with_options_spec.rb
|
121
|
+
- spec/recaptcha_noajax_without_noscript_spec.rb
|
122
|
+
- spec/recaptcha_valid_spec.rb
|
123
|
+
- spec/fixture/app/views/layout/application.html.erb
|
124
|
+
- spec/fixture/app/views/recaptcha/ajax_with_callback.html.erb
|
125
|
+
- spec/fixture/app/views/recaptcha/noajax_with_noscript.html.erb
|
126
|
+
- spec/fixture/app/views/recaptcha/ajax.html.erb
|
127
|
+
- spec/fixture/app/views/recaptcha/ajax_with_jquery.html.erb
|
128
|
+
- spec/fixture/app/views/recaptcha/noajax_with_options.html.erb
|
129
|
+
- spec/fixture/app/views/recaptcha/noajax_without_noscript.html.erb
|
130
|
+
- spec/fixture/app/views/recaptcha/ajax_with_options.html.erb
|
131
|
+
- spec/fixture/app/views/exceptions/not_acceptable.html.erb
|
132
|
+
- spec/fixture/app/views/exceptions/not_found.html.erb
|
133
|
+
- spec/fixture/app/controllers/exceptions.rb
|
134
|
+
- spec/fixture/app/controllers/application.rb
|
135
|
+
- spec/fixture/app/controllers/recaptcha.rb
|
136
|
+
- spec/fixture/app/helpers/recaptcha_helpers.rb
|
137
|
+
- spec/fixture/app/helpers/global_helpers.rb
|