Skip to content

Commit

Permalink
Gemified for version 0.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
mwhuss authored and Jason L Perry committed Sep 12, 2009
1 parent 6362397 commit 3e35542
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 93 deletions.
3 changes: 2 additions & 1 deletion .gitignore
@@ -1,2 +1,3 @@
html
doc
doc
pkg
4 changes: 4 additions & 0 deletions CHANGELOG
@@ -0,0 +1,4 @@
== 0.1.0 / 2008-2-8

* 1 major enhancement
* Initial Gem Release
12 changes: 12 additions & 0 deletions Manifest
@@ -0,0 +1,12 @@
init.rb
install.rb
lib/recaptcha/recaptcha.rb
lib/recaptcha.rb
LICENSE
Manifest
Rakefile
README.rdoc
tasks/recaptcha_tasks.rake
test/recaptcha_test.rb
test/verify_recaptcha_test.rb
uninstall.rb
6 changes: 6 additions & 0 deletions README.rdoc
@@ -1,12 +1,18 @@
= ReCAPTCHA

Author:: Jason L Perry (http://ambethia.com)

Copyright:: Copyright (c) 2007 Jason L Perry

License:: MIT

RDOC:: http://ambethia.com/recaptcha/

Git:: http://github.com/ambethia/recaptcha/tree/master

Bugs:: http://ambethia.lighthouseapp.com/projects/11072-recaptcha/overview


This plugin adds helpers for the ReCAPTCHA API (http://recaptcha.net/). In your views you can use
the +recaptcha_tags+ method to embed the needed javascript, and you can validate in your controllers
with +verify_recaptcha+.
Expand Down
11 changes: 11 additions & 0 deletions Rakefile
@@ -1,6 +1,17 @@
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'
require 'echoe'

Echoe.new('recaptcha', '0.1.0') do |p|
p.description = "This plugin adds helpers for the ReCAPTCHA API "
p.url = "http://github.com/ambethia/recaptcha/tree/master"
p.author = "Jason L. Perry"
p.email = "jasper@ambethia.com"
p.ignore_pattern = ["pkg/**/*"]
p.development_dependencies = []
end


desc 'Default: run unit tests.'
task :default => :test
Expand Down
1 change: 0 additions & 1 deletion install.rb

This file was deleted.

93 changes: 3 additions & 90 deletions lib/recaptcha.rb
@@ -1,90 +1,3 @@
# ReCAPTCHA
module Ambethia
module ReCaptcha
RECAPTCHA_API_SERVER = 'http://api.recaptcha.net';
RECAPTCHA_API_SECURE_SERVER = 'https://api-secure.recaptcha.net';
RECAPTCHA_VERIFY_SERVER = 'api-verify.recaptcha.net';

SKIP_VERIFY_ENV = ['test', 'cucumber']

module Helper
# Your public API can be specified in the +options+ hash or preferably the environment
# variable +RECAPTCHA_PUBLIC_KEY+.
def recaptcha_tags(options = {})
# Default options
key = options[:public_key] ||= ENV['RECAPTCHA_PUBLIC_KEY']
error = options[:error] ||= session[:recaptcha_error]
uri = options[:ssl] ? RECAPTCHA_API_SECURE_SERVER : RECAPTCHA_API_SERVER
xhtml = Builder::XmlMarkup.new :target => out=(''), :indent => 2 # Because I can.
if options[:display]
xhtml.script(:type => "text/javascript"){ |x| x << "var RecaptchaOptions = #{options[:display].to_json};\n"}
end
if options[:ajax]
xhtml.div(:id => 'dynamic_recaptcha') {}
xhtml.script(:type => "text/javascript", :src => "#{uri}/js/recaptcha_ajax.js") {}
xhtml.script(:type => "text/javascript") do |x|
x << "Recaptcha.create('#{key}', document.getElementById('dynamic_recaptcha')#{(options[:display].blank?)? '' : ',RecaptchaOptions'});"
end
else
xhtml.script(:type => "text/javascript", :src => CGI::escapeHTML("#{uri}/challenge?k=#{key}&error=#{error}")) {}
unless options[:noscript] == false
xhtml.noscript do
xhtml.iframe(:src => "#{uri}/noscript?k=#{key}",
:height => options[:iframe_height] ||= 300,
:width => options[:iframe_width] ||= 500,
:frameborder => 0) {}; xhtml.br
xhtml.textarea nil, :name => "recaptcha_challenge_field",
:rows => options[:textarea_rows] ||= 3,
:cols => options[:textarea_cols] ||= 40
xhtml.input :name => "recaptcha_response_field",
:type => "hidden", :value => "manual_challenge"
end
end
end
raise ReCaptchaError, "No public key specified." unless key
return out
end # recaptcha_tags
end # Helpers

module Controller
# Your private API can be specified in the +options+ hash or preferably the environment
# variable +RECAPTCHA_PUBLIC_KEY+.
def verify_recaptcha(options = {})
return true if SKIP_VERIFY_ENV.include? ENV['RAILS_ENV']
model = options.is_a?(Hash)? options[:model] : options
private_key = options[:private_key] if options.is_a?(Hash)
private_key ||= ENV['RECAPTCHA_PRIVATE_KEY']
raise ReCaptchaError, "No private key specified." unless private_key
begin
recaptcha = Net::HTTP.post_form URI.parse("http://#{RECAPTCHA_VERIFY_SERVER}/verify"), {
"privatekey" => private_key,
"remoteip" => request.remote_ip,
"challenge" => params[:recaptcha_challenge_field],
"response" => params[:recaptcha_response_field]
}
answer, error = recaptcha.body.split.map { |s| s.chomp }
unless answer == 'true'
session[:recaptcha_error] = error
if model
model.valid?
if Rails::VERSION::MAJOR == 2 and Rails::VERSION::MINOR >= 2
model.errors.add :base, I18n.translate("#{model.class.name.underscore}.captcha", :scope => %w(errors models), :default => (options[:message] || "Captcha response is incorrect, please try again."))
else
model.errors.add :base, options[:message] || "Captcha response is incorrect, please try again."
end
end
return false
else
session[:recaptcha_error] = nil
return true
end
rescue Exception => e
raise ReCaptchaError, e
end
end # verify_recaptcha
end # ControllerHelpers

class ReCaptchaError < StandardError; end

end # ReCaptcha
end # Ambethia
require 'recaptcha/recaptcha'
ActionView::Base.send :include, Ambethia::ReCaptcha::Helper
ActionController::Base.send :include, Ambethia::ReCaptcha::Controller
90 changes: 90 additions & 0 deletions lib/recaptcha/recaptcha.rb
@@ -0,0 +1,90 @@
# ReCAPTCHA
module Ambethia
module ReCaptcha
RECAPTCHA_API_SERVER = 'http://api.recaptcha.net';
RECAPTCHA_API_SECURE_SERVER = 'https://api-secure.recaptcha.net';
RECAPTCHA_VERIFY_SERVER = 'api-verify.recaptcha.net';

SKIP_VERIFY_ENV = ['test', 'cucumber']

module Helper
# Your public API can be specified in the +options+ hash or preferably the environment
# variable +RECAPTCHA_PUBLIC_KEY+.
def recaptcha_tags(options = {})
# Default options
key = options[:public_key] ||= ENV['RECAPTCHA_PUBLIC_KEY']
error = options[:error] ||= session[:recaptcha_error]
uri = options[:ssl] ? RECAPTCHA_API_SECURE_SERVER : RECAPTCHA_API_SERVER
xhtml = Builder::XmlMarkup.new :target => out=(''), :indent => 2 # Because I can.
if options[:display]
xhtml.script(:type => "text/javascript"){ |x| x << "var RecaptchaOptions = #{options[:display].to_json};\n"}
end
if options[:ajax]
xhtml.div(:id => 'dynamic_recaptcha') {}
xhtml.script(:type => "text/javascript", :src => "#{uri}/js/recaptcha_ajax.js") {}
xhtml.script(:type => "text/javascript") do |x|
x << "Recaptcha.create('#{key}', document.getElementById('dynamic_recaptcha')#{(options[:display].blank?)? '' : ',RecaptchaOptions'});"
end
else
xhtml.script(:type => "text/javascript", :src => CGI::escapeHTML("#{uri}/challenge?k=#{key}&error=#{error}")) {}
unless options[:noscript] == false
xhtml.noscript do
xhtml.iframe(:src => "#{uri}/noscript?k=#{key}",
:height => options[:iframe_height] ||= 300,
:width => options[:iframe_width] ||= 500,
:frameborder => 0) {}; xhtml.br
xhtml.textarea nil, :name => "recaptcha_challenge_field",
:rows => options[:textarea_rows] ||= 3,
:cols => options[:textarea_cols] ||= 40
xhtml.input :name => "recaptcha_response_field",
:type => "hidden", :value => "manual_challenge"
end
end
end
raise ReCaptchaError, "No public key specified." unless key
return out
end # recaptcha_tags
end # Helpers

module Controller
# Your private API can be specified in the +options+ hash or preferably the environment
# variable +RECAPTCHA_PUBLIC_KEY+.
def verify_recaptcha(options = {})
return true if SKIP_VERIFY_ENV.include? ENV['RAILS_ENV']
model = options.is_a?(Hash)? options[:model] : options
private_key = options[:private_key] if options.is_a?(Hash)
private_key ||= ENV['RECAPTCHA_PRIVATE_KEY']
raise ReCaptchaError, "No private key specified." unless private_key
begin
recaptcha = Net::HTTP.post_form URI.parse("http://#{RECAPTCHA_VERIFY_SERVER}/verify"), {
"privatekey" => private_key,
"remoteip" => request.remote_ip,
"challenge" => params[:recaptcha_challenge_field],
"response" => params[:recaptcha_response_field]
}
answer, error = recaptcha.body.split.map { |s| s.chomp }
unless answer == 'true'
session[:recaptcha_error] = error
if model
model.valid?
if Rails::VERSION::MAJOR == 2 and Rails::VERSION::MINOR >= 2
model.errors.add :base, I18n.translate("#{model.class.name.underscore}.captcha", :scope => %w(errors models), :default => (options[:message] || "Captcha response is incorrect, please try again."))
else
model.errors.add :base, options[:message] || "Captcha response is incorrect, please try again."
end
end
return false
else
session[:recaptcha_error] = nil
return true
end
rescue Exception => e
raise ReCaptchaError, e
end
end # verify_recaptcha
end # ControllerHelpers

class ReCaptchaError < StandardError; end

end # ReCaptcha
end # Ambethia
1 change: 0 additions & 1 deletion uninstall.rb

This file was deleted.

0 comments on commit 3e35542

Please sign in to comment.