0.01
No commit activity in last 3 years
No release in over 3 years
A Google-style captcha for enterprise Rails apps
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies
 Project Readme

captcha

A Google-style captcha for enterprise Rails apps

Goals

  • Batch generate captchas
  • Use ciphered filenames (no need to store filename/captcha pairs)
  • Easy configuration
    • Number of captchas
    • Period for captcha refresh
    • Colors, wave, implode
  • Handle lots of users

Compatibility

Tested with Ruby 1.8.6, 1.8.7, and 1.9.1.

Install

script/plugin install git://github.com/winton/captcha.git

Create lib/captcha_config.rb (optional)

Captcha::Config.new(
  # Used for filename cipher
  :password => 'something-unique',
  # Captcha colors
  :colors => {
    :background => '#FFFFFF',
    :font => '#080288'
  },
  # Number of captcha images to generate
  :count => RAILS_ENV == 'production' ? 500 : 10,
  # Where to write captchas
  :destination => "#{RAILS_ROOT}/public/images/captchas",
  # Generate new batch every day
  :generate_every => 24 * 60 * 60
)

See lib/captcha/config.rb for more options.

application_controller.rb

class ApplicationController < ActionController::Base
  acts_as_captcha
end

You may now use the reset_captcha method in any controller.

user.rb

class User < ActiveRecord::Base
  acts_as_captcha :base => "base error when captcha fails", :field => "field error when captcha fails"
end

With no parameters, a default error is added to the "captcha" field (:field => true).

Specify :base => true to use a default error for base.

In your view

<img src="/images/captchas/<%= session[:captcha] %>.jpg" />
<%= text_field_tag(:captcha) %>

In your controller

user = User.new
user.known_captcha = session[:captcha]
user.captcha = params[:captcha]
user.save
reset_captcha

crontab

0 0 * * * cd /path/to/rails/app && /usr/bin/rake RAILS_ENV=production captcha:generate

Your config file sets the captcha refresh period. The rake task just checks if its time to repopulate, and does so if necessary.