17
Oct
2006
How to improve the image quality and generate random string image in the plugin validates_captcha
Validates captchais a good pluging to implement captcha in your rails application.
However i found that there is repetition of the string of the image and the quality of image is not that good. To get a good quality image and random string replace the code of the file /vendor/plugins/validates_captcha/lib/captcha_challenge.rb with the following code…
require 'digest/sha1'
module AngryMidgetPluginsInc #:nodoc:
# CaptchaChallenge
class CaptchaChallenge
include CaptchaConfig
extend CaptchaConfig
DEFAULT_TTL = 1200#Lifetime in seconds. Default is 20 minutes.
attr_reader :id, :created_at
attr_accessor :ttl
def initialize(options = {}) #:nodoc:
generate_id
options = {
:ttl => config['default_ttl'] || DEFAULT_TTL}.update(options)
self.ttl = options[:ttl]
@created_at = Time.now
self.class.prune
end
# Implement in subclasses.
def correct? #:nodoc:
raise NotImplementedError
end
private
def generate_id #:nodoc:
self.id = Digest::SHA1.hexdigest(Time.now.to_s+rand.to_s)
end
def id=(i) #:nodoc:
@id = i
end
def write_to_store #:nodoc:
store.transaction{
store[:captchas] = Array.new unless store.root?(:captchas)
store[:captchas] <<> c.created_at+c.ttl
store[:captchas].delete_at(i)
end
}
end
}
end#prune
end#class << words =" 'gorilla" default_dir =" 'captcha'#public/images/captcha" write_dir =" File.join(RAILS_ROOT," default_filetype =" 'jpg'" options =" {})" options =" {" string =""> config['words'] ? config['words'][rand(config['words'].size)] : WORDS[rand(WORDS.size)],
:dir => config['default_dir'] || DEFAULT_DIR,
:filetype => config['default_filetype'] || DEFAULT_FILETYPE
}.update(options)
#changed
self.string = Digest::SHA1.hexdigest(Time.now.to_s)[0..4] #options[:string]
self.dir = options[:dir]
self.filetype = options[:filetype]
self.filename = options[:filename] || generate_filename
write_to_store
end
# Generates the image.
def generate(options = {})
options = {
:fontsize => 50,
:padding => 20,
:color => '#000',
:background => '#fff',
:fontweight => 'bold',
:rotate => true
}.update(options)
options[:fontweight] = case options[:fontweight]
when 'bold' then 700
else 400
end
#added
text = Array.new
0.upto(4) do |i|
text[i] = Magick::Draw.new
text[i].pointsize = options[:fontsize]
text[i].font_weight = 300 #options[:fontweight]
text[i].fill = 'blue' #options[:color]
text[i].gravity = Magick::CenterGravity
text[i].rotation = (rand(2)==1 ? rand(30) : -rand(30)) if options[:rotate]
end
metric = text[2].get_type_metrics(self.string)
#add bg
canvas = Magick::ImageList.new
fill = Magick::HatchFill.new('white','lime')
x = metric.width+options[:padding]
y = metric.height+options[:padding]
#ADDING LINES
img1 = Magick::Image.new(x,y,fill)
gc = Magick::Draw.new
gc.stroke_linejoin('round')
gc.stroke('blue')
gc.stroke_width(2)
gc.line(rand(x),rand(y),rand(x),rand(y))
gc.line(rand(x),rand(y),rand(x),rand(y))
gc.line(rand(x),rand(y),rand(x),rand(y))
gc.draw(img1)
canvas << background_color =" '#000F'" y_loc =" rand(y)" p =" Magick::Pixel.from_color(options[:background])" opacity =" Magick::MaxRGB" background_color =" p" image =" canvas.flatten_images.blur_image(1)" dir =" self.dir," filename =" self.filename)" downcase ="=">public/images.
def file_path
File.join(dir,filename)
end
class <<> c.created_at+c.ttl
if File.exists?(File.join(WRITE_DIR, c.file_path))
begin
File.unlink(File.join(WRITE_DIR, c.file_path))
rescue Exception
end
end
end
}
end
}
super
end#prune
end#class << image="(i)" image =" i">
visit Here to view the customized use of the plugin validates_captcha in RoR.
-
kasper


Working with Vinsol has been one of the most rewarding and productive collaborations I've ever had in the technology industry. Manik is an intelligent and honest engineer with a great faculty for open and clear communication, and his team include some of the swiftest and keenest developers I've ever had the pleasure to work with. They're great value for money, excellent people who are a joy to know and interact with, and above all they really know their stuff