easy_captcha 0.1.9 → 0.2.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/README.rdoc CHANGED
@@ -11,12 +11,22 @@ Add following line to routes.rb
11
11
  Add following line to application_controller.rb
12
12
  after_filter lambda { session.delete(:captcha) }
13
13
 
14
- The last line is very important for security!!!
14
+ The last filter is a critical security measurement! Every request after displaying the captcha-image must prevent this filter from being executed.
15
15
 
16
16
  == Configuration
17
17
  You can write this in "config/initializers/easy_captcha.rb", if you want to customize the default configuration
18
18
 
19
19
  EasyCaptcha.setup do |config|
20
+
21
+ # Cache
22
+ # config.cache = true
23
+ # Cache temp dir
24
+ # config.temp_dir = Rails.root + 'tmp' + 'captchas'
25
+ # Cache size
26
+ # config.cache_size = 500
27
+ # Cache expire
28
+ # config.cache_expire = 1.days
29
+
20
30
  # Chars
21
31
  # config.chars = %w(2 3 4 5 6 7 9 A C D E F G H J K L M N P Q R S T U X Y Z)
22
32
  # Length
@@ -66,6 +76,10 @@ You can write this in "config/initializers/easy_captcha.rb", if you want to cust
66
76
  == Example
67
77
  You find an example app under: http://github.com/traxanos/easy_captcha_example
68
78
 
79
+ == History
80
+ * 0.1 Init
81
+ * 0.2 Cache support for high frequented sites
82
+
69
83
  == Maintainers
70
84
 
71
85
  * Marco Scholl (http://github.com/traxanos)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.9
1
+ 0.2.0
data/easy_captcha.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{easy_captcha}
8
- s.version = "0.1.9"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Marco Scholl"]
@@ -5,32 +5,32 @@ module EasyCaptcha
5
5
  attr_reader :code
6
6
  # blob of generated captcha image
7
7
  attr_reader :image
8
-
8
+
9
9
  # generate captcha by code
10
- def initialize(code)
10
+ def initialize(code, file)
11
11
  @code = code
12
- generate_captcha
12
+ generate_captcha(file)
13
13
  end
14
-
14
+
15
15
  def inspect #:nodoc:
16
16
  "<EasyCaptcha::Captcha @code=#{code}>"
17
17
  end
18
18
 
19
19
  private
20
-
21
- def generate_captcha #:nodoc:
20
+
21
+ def generate_captcha(file) #:nodoc:
22
22
  canvas = Magick::Image.new(EasyCaptcha.image_width, EasyCaptcha.image_height) do |variable|
23
23
  self.background_color = EasyCaptcha.image_background_color unless EasyCaptcha.image_background_color.nil?
24
24
  end
25
25
 
26
26
  # Render the text in the image
27
- canvas.annotate(Magick::Draw.new, 0,0,0,0, code) {
28
- self.gravity = Magick::CenterGravity
27
+ canvas.annotate(Magick::Draw.new, 0, 0, 0, 0, code) {
28
+ self.gravity = Magick::CenterGravity
29
29
  self.font_family = EasyCaptcha.font_family
30
30
  self.font_weight = Magick::LighterWeight
31
- self.fill = EasyCaptcha.font_fill_color
31
+ self.fill = EasyCaptcha.font_fill_color
32
32
  if EasyCaptcha.font_stroke.to_i > 0
33
- self.stroke = EasyCaptcha.font_stroke_color
33
+ self.stroke = EasyCaptcha.font_stroke_color
34
34
  self.stroke_width = EasyCaptcha.font_stroke
35
35
  end
36
36
  self.pointsize = EasyCaptcha.font_size
@@ -38,21 +38,24 @@ module EasyCaptcha
38
38
 
39
39
  # Blur
40
40
  canvas = canvas.blur_image(EasyCaptcha.blur_radius, EasyCaptcha.blur_sigma) if EasyCaptcha.blur?
41
-
41
+
42
42
  # Wave
43
43
  w = EasyCaptcha.wave_length
44
44
  a = EasyCaptcha.wave_amplitude
45
45
  canvas = canvas.wave(rand(a.last - a.first) + a.first, rand(w.last - w.first) + w.first) if EasyCaptcha.wave?
46
-
46
+
47
47
  # Sketch
48
48
  canvas = canvas.sketch(EasyCaptcha.sketch_radius, EasyCaptcha.sketch_sigma, rand(180)) if EasyCaptcha.sketch?
49
-
49
+
50
50
  # Implode
51
51
  canvas = canvas.implode(EasyCaptcha.implode.to_f) if EasyCaptcha.implode.is_a? Float
52
-
52
+
53
53
  # Crop image because to big after waveing
54
54
  canvas = canvas.crop(Magick::CenterGravity, EasyCaptcha.image_width, EasyCaptcha.image_height)
55
-
55
+
56
+ unless file.nil?
57
+ canvas.write(file) { self.format = 'PNG' }
58
+ end
56
59
  @image = canvas.to_blob { self.format = 'PNG' }
57
60
  canvas.destroy!
58
61
  end
@@ -1,7 +1,7 @@
1
1
  module EasyCaptcha
2
2
  # helper class for ActionController
3
3
  module ControllerHelpers
4
-
4
+
5
5
  def self.included(base) #:nodoc:
6
6
  base.class_eval do
7
7
  helper_method :valid_captcha?
@@ -10,7 +10,23 @@ module EasyCaptcha
10
10
 
11
11
  # generate captcha image and return it as blob
12
12
  def generate_captcha
13
- Captcha.new(generate_captcha_code).image
13
+ if EasyCaptcha.cache
14
+ FileUtils.mkdir_p(EasyCaptcha.cache_temp_dir)
15
+ files = Dir.glob(EasyCaptcha.cache_temp_dir + "*")
16
+ unless files.size < EasyCaptcha.cache_size
17
+ file = File.open(files.at(Kernel.rand(files.size)))
18
+
19
+ if file.mtime < EasyCaptcha.cache_expire.ago
20
+ File.unlink(file.path)
21
+ else
22
+ return file.readlines.join
23
+ end
24
+ end
25
+ generated_code = generate_captcha_code
26
+ Captcha.new(generated_code, EasyCaptcha.cache_temp_dir + "#{generated_code}").image
27
+ else
28
+ Captcha.new(generate_captcha_code).image
29
+ end
14
30
  end
15
31
 
16
32
  # generate captcha code, save in session and return
@@ -23,6 +39,6 @@ module EasyCaptcha
23
39
  return false if session[:captcha].blank? or code.blank?
24
40
  session[:captcha].to_s.upcase == code.to_s.upcase
25
41
  end
26
-
42
+
27
43
  end
28
44
  end
data/lib/easy_captcha.rb CHANGED
@@ -10,7 +10,23 @@ module EasyCaptcha
10
10
  autoload :ModelHelpers, 'easy_captcha/model_helpers'
11
11
  autoload :ViewHelpers, 'easy_captcha/view_helpers'
12
12
  autoload :ControllerHelpers, 'easy_captcha/controller_helpers'
13
-
13
+
14
+ # Cache
15
+ mattr_accessor :cache
16
+ @@cache = true
17
+
18
+ # Cache temp
19
+ mattr_accessor :cache_temp_dir
20
+ @@cache_temp_dir = Rails.root + 'tmp' + 'captchas'
21
+
22
+ # Cache size
23
+ mattr_accessor :cache_size
24
+ @@cache_size = 500
25
+
26
+ # Cache expire
27
+ mattr_accessor :cache_expire
28
+ @@cache_expire = 1.days
29
+
14
30
  # Chars
15
31
  mattr_accessor :chars
16
32
  @@chars = %w(2 3 4 5 6 7 9 A C D E F G H J K L M N P Q R S T U X Y Z)
@@ -62,11 +78,15 @@ module EasyCaptcha
62
78
  def wave? #:nodoc:
63
79
  wave
64
80
  end
65
-
81
+
66
82
  def blur? #:nodoc:
67
83
  blur
68
84
  end
69
-
85
+
86
+ def cache? #:nodoc:
87
+ cache
88
+ end
89
+
70
90
  # called by rails after initialize
71
91
  def init
72
92
  ActiveRecord::Base.send :include, ModelHelpers
@@ -78,5 +98,5 @@ end
78
98
 
79
99
  EasyCaptcha.init
80
100
 
81
-
101
+
82
102
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 9
9
- version: 0.1.9
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Marco Scholl