galetahub-simple_captcha 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,218 @@
1
+ =SimpleCaptcha
2
+
3
+ SimpleCaptcha is the simplest and a robust captcha plugin. Its implementation requires
4
+ adding up a single line in views and in controllers/models.
5
+ SimpleCaptcha is available to be used with Rails 3 or above and also it provides the
6
+ backward compatibility with previous versions of Rails.
7
+
8
+ ==Features
9
+
10
+ * Zero FileSystem usage(secret code moved to db-store and image storage removed).
11
+ * Provides various image styles.
12
+ * Provides three level of complexity of images.
13
+ * Works absolutely fine in distributed environment(session and db based implementation works fine in distributed environment).
14
+ * Implementation is as easy as just writing a single line in your view. "<%= show_simple_captcha %>" within the 'form' tags.
15
+ * Flexible DOM and CSS handling(There is a separate view partial for rednering SimpleCaptcha DOM elements).
16
+ * Automated removal of 1 hour old unmatched simple_captcha data.
17
+
18
+ ==Requirements
19
+
20
+ * {Ruby}[http://ruby-lang.org/] >= 1.8.7
21
+ * {Rails}[http://github.com/rails/rails] >= 3
22
+ * ImageMagick should be installed on your machine to use this plugin.
23
+ visit http://www.imagemagick.org/script/index.php for more details.
24
+
25
+ ==Installation
26
+
27
+ gem 'simple_captcha', :git => 'git://github.com/galetahub/simple-captcha.git'
28
+
29
+ ==Setup
30
+
31
+ After installation, follow these simple steps to setup the plugin. The setup will depend
32
+ on the version of rails your application is using.
33
+
34
+ rails generate simple_captcha
35
+
36
+ rake db:migrate
37
+
38
+ ==Usage
39
+
40
+ ===Controller Based
41
+
42
+ Add the following line in the file "app/controllers/application.rb"
43
+
44
+ ApplicationController < ActionController::Base
45
+ include SimpleCaptcha::ControllerHelpers
46
+ end
47
+
48
+ In the view file within the form tags add this code
49
+
50
+ <%= show_simple_captcha %>
51
+
52
+ and in the controller's action authenticate it as
53
+
54
+ if simple_captcha_valid?
55
+ do this
56
+ else
57
+ do that
58
+ end
59
+
60
+ ===Model Based
61
+
62
+ In the view file within the form tags write this code
63
+
64
+ <%= show_simple_captcha(:object=>"user") %>
65
+
66
+ and in the model class add this code
67
+
68
+ class User < ActiveRecord::Basse
69
+ apply_simple_captcha
70
+ end
71
+
72
+ ====FormBuilder helper
73
+
74
+ <%= form_for @user do |form| -%>
75
+ ...
76
+ <%= form.simple_captcha :label => "Enter numbers.." %>
77
+ ...
78
+ <% end -%>
79
+
80
+ ====Validating with captcha
81
+ NOTE: @user.valid? will still work as it should, it will not validate the captcha code.
82
+
83
+ @user.valid_with_captcha?
84
+
85
+ ====Saving with captcha
86
+ NOTE: @user.save will still work as it should, it will not validate the captcha code.
87
+
88
+ @user.save_with_captcha
89
+
90
+ ===Formtastic integration
91
+ SimpleCaptcha detects if your use Formtastic and appends "SimpleCaptcha::CustomFormBuilder".
92
+
93
+ <%= form.input :captcha, :as => :simple_captcha %>
94
+
95
+ ==Options & Examples
96
+ ===View Options
97
+
98
+ * *label* - provides the custom text b/w the image and the text field, the default is "type the code from the image"
99
+
100
+ * *object* - the name of the object of the model class, to implement the model based captcha.
101
+
102
+ * *code_type* - return numeric only if set to 'numeric'
103
+
104
+ ===Global options
105
+
106
+ * *image_style* - provides the specific image style for the captcha image.
107
+ There are eight different styles available with the plugin as...
108
+ 1) simply_blue
109
+ 2) simply_red
110
+ 3) simply_green
111
+ 4) charcoal_grey
112
+ 5) embosed_silver
113
+ 6) all_black
114
+ 7) distorted_black
115
+ 8) almost_invisible
116
+ Default style is 'simply_blue'.
117
+ You can also specify 'random' to select the random image style.
118
+
119
+ * *distortion* - handles the complexity of the image. The :distortion can be set to 'low', 'medium' or 'high'. Default is 'low'.
120
+
121
+ Create "rails_root/config/initializers/simple_captcha.rb"
122
+
123
+ SimpleCaptcha.setup do |sc|
124
+ # default: 100x28
125
+ sc.image_size = '120x40'
126
+
127
+ # default: 5
128
+ sc.length = 6
129
+
130
+ # default: simply_blue
131
+ # possible values:
132
+ # 'embosed_silver',
133
+ # 'simply_red',
134
+ # 'simply_green',
135
+ # 'simply_blue',
136
+ # 'distorted_black',
137
+ # 'all_black',
138
+ # 'charcoal_grey',
139
+ # 'almost_invisible'
140
+ # 'random'
141
+ sc.image_style = 'simply_green'
142
+
143
+ # default: low
144
+ # possible values: 'low', 'medium', 'high', 'random'
145
+ sc.distortion = 'medium'
146
+ end
147
+
148
+ You can add your own style:
149
+
150
+ SimpleCaptcha.setup do |sc|
151
+ sc.image_style = 'mycaptha'
152
+ sc.add_image_style('mycaptha', [
153
+ "-background '#F4F7F8'",
154
+ "-fill '#86818B'",
155
+ "-border 1",
156
+ "-bordercolor '#E0E2E3'"])
157
+ end
158
+
159
+ You can provide the path where image_magick is installed as well:
160
+
161
+ SimpleCaptcha.setup do |sc|
162
+ sc.image_magick_path = '/usr/bin' # you can check this from console by running: which convert
163
+ end
164
+
165
+
166
+ ===How to change the CSS for SimpleCaptcha DOM elements?
167
+ You can change the CSS of the SimpleCaptcha DOM elements as per your need in this file.
168
+ /app/views/simple_captcha/_simple_captcha.erb
169
+
170
+ ===View's Examples
171
+ ====Controller Based Example
172
+
173
+ <%= show_simple_captcha %>
174
+
175
+ <%= show_simple_captcha(:label => "human authentication") %>
176
+
177
+ ====Model Based Example
178
+
179
+ <%= show_simple_captcha(:object => 'user', :label => "human authentication") %>
180
+
181
+ ====Model Options
182
+
183
+ * *message* - provides the custom message on failure of captcha authentication the default is "Secret Code did not match with the Image"
184
+
185
+ * *add_to_base* - if set to true, appends the error message to the base.
186
+
187
+ =====Model's Example
188
+
189
+ class User < ActiveRecord::Base
190
+ apply_simple_captcha
191
+ end
192
+
193
+ class User < ActiveRecord::Base
194
+ apply_simple_captcha :message => "The secret Image and code were different", :add_to_base => true
195
+ end
196
+
197
+ ==I18n
198
+
199
+ simple_captcha:
200
+ message:
201
+ default: "Secret Code did not match with the Image"
202
+ user: "The secret Image and code were different"
203
+
204
+ ==Who's who?
205
+
206
+ Enjoy the simplest captcha implementation.
207
+
208
+ Author: Sur
209
+
210
+ Blog: http://expressica.com
211
+
212
+ Contact: sur.max@gmail.com
213
+
214
+ Plugin Homepage: http://expressica.com/simple_captcha
215
+
216
+ Plugin update for rails 3: http://github.com/galetahub
217
+
218
+ Any feedback/comment/issue/donation is welcome!
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the simple_captcha plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation for the simple_captcha plugin.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'SimpleCaptcha'
19
+ rdoc.options << '--line-numbers' << '--inline-source'
20
+ rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
23
+
24
+ begin
25
+ require 'jeweler'
26
+ Jeweler::Tasks.new do |gemspec|
27
+ gemspec.name = "galetahub-simple_captcha"
28
+ gemspec.version = '0.1.1'
29
+ gemspec.summary = "SimpleCaptcha is the simplest and a robust captcha plugin."
30
+ gemspec.description = "SimpleCaptcha is available to be used with Rails 3 or above and also it provides the backward compatibility with previous versions of Rails."
31
+ gemspec.email = "superp1987@gmail.com"
32
+ gemspec.homepage = "http://github.com/galetahub/simple-captcha"
33
+ gemspec.authors = ["Pavlo Galeta", "Igor Galeta"]
34
+ gemspec.files = FileList["[A-Z]*", "{lib}/**/*", "{app}/**/*", "{config}/**/*", "{test}/**/*"]
35
+ gemspec.rubyforge_project = "simple_captcha"
36
+ end
37
+
38
+ Jeweler::GemcutterTasks.new
39
+ rescue LoadError
40
+ puts "Jeweler not available. Install it with: gem install jeweler"
41
+ end
@@ -0,0 +1,17 @@
1
+ class SimpleCaptchaController < ActionController::Metal
2
+ include ActionController::Streaming
3
+ include SimpleCaptcha::ImageHelpers
4
+
5
+ # GET /simple_captcha
6
+ def show
7
+ unless params[:id].blank?
8
+ send_file(
9
+ generate_simple_captcha_image(params[:id]),
10
+ :type => 'image/jpeg',
11
+ :disposition => 'inline',
12
+ :filename => 'simple_captcha.jpg')
13
+ else
14
+ self.response_body = [404, {"Content-Type" => "text/html"}, ["Not Found"]]
15
+ end
16
+ end
17
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ match '/simple_captcha/:id', :to => 'simple_captcha#show', :as => :simple_captcha
3
+ end
@@ -0,0 +1,4 @@
1
+ SimplaCaptcha
2
+ =============
3
+ # Generate migration and copy view partial
4
+ rails generate simple_captcha
@@ -0,0 +1,21 @@
1
+ require 'rails/generators'
2
+
3
+ class SimpleCaptchaGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+
6
+ def self.source_root
7
+ @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates/'))
8
+ end
9
+
10
+ def self.next_migration_number(dirname)
11
+ Time.now.strftime("%Y%m%d%H%M%S")
12
+ end
13
+
14
+ def create_partial
15
+ template "partial.erb", File.join('app/views', 'simple_captcha', "_simple_captcha.erb")
16
+ end
17
+
18
+ def create_migration
19
+ migration_template "migration.rb", File.join('db/migrate', "create_simple_captcha_data.rb")
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ class CreateSimpleCaptchaData < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :simple_captcha_data do |t|
4
+ t.string :key, :limit => 40
5
+ t.string :value, :limit => 6
6
+ t.timestamps
7
+ end
8
+
9
+ add_index :simple_captcha_data, :key, :name => "idx_key"
10
+ end
11
+
12
+ def self.down
13
+ drop_table :simple_captcha_data
14
+ end
15
+ end
@@ -0,0 +1,37 @@
1
+ <style type="text/CSS">
2
+ .simple_captcha{border: 1px solid #ccc; padding: 5px !important;}
3
+ .simple_captcha,
4
+ .simple_captcha div{display: table;}
5
+ .simple_captcha .simple_captcha_field,
6
+ .simple_captcha .simple_captcha_image{
7
+ border: 1px solid #ccc;
8
+ margin: 0px 0px 2px 0px !important;
9
+ padding: 0px !important;
10
+ }
11
+ .simple_captcha .simple_captcha_image img{
12
+ margin: 0px !important;
13
+ padding: 0px !important;
14
+ width: 110px !important;
15
+ }
16
+ .simple_captcha .simple_captcha_label{font-size: 12px;}
17
+ .simple_captcha .simple_captcha_field input{
18
+ width: 150px !important;
19
+ font-size: 16px;
20
+ border: none;
21
+ background-color: #efefef;
22
+ }
23
+ </style>
24
+
25
+ <div class='simple_captcha'>
26
+ <div class='simple_captcha_image'>
27
+ <%%= simple_captcha_options[:image] %>
28
+ </div>
29
+
30
+ <div class='simple_captcha_field'>
31
+ <%%= simple_captcha_options[:field] %>
32
+ </div>
33
+
34
+ <div class='simple_captcha_label'>
35
+ <%%= simple_captcha_options[:label] %>
36
+ </div>
37
+ </div>
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ module SimpleCaptcha
4
+ autoload :Utils, 'simple_captcha/utils'
5
+
6
+ autoload :ImageHelpers, 'simple_captcha/image'
7
+ autoload :ViewHelper, 'simple_captcha/view'
8
+ autoload :ControllerHelpers, 'simple_captcha/controller'
9
+ autoload :ModelHelpers, 'simple_captcha/active_record'
10
+
11
+ autoload :FormBuilder, 'simple_captcha/form_builder'
12
+ autoload :CustomFormBuilder, 'simple_captcha/formtastic'
13
+
14
+ autoload :SimpleCaptchaData, 'simple_captcha/simple_captcha_data'
15
+
16
+ mattr_accessor :image_size
17
+ @@image_size = "100x28"
18
+
19
+ mattr_accessor :length
20
+ @@length = 5
21
+
22
+ # 'embosed_silver',
23
+ # 'simply_red',
24
+ # 'simply_green',
25
+ # 'simply_blue',
26
+ # 'distorted_black',
27
+ # 'all_black',
28
+ # 'charcoal_grey',
29
+ # 'almost_invisible'
30
+ # 'random'
31
+ mattr_accessor :image_style
32
+ @@image_style = 'simply_blue'
33
+
34
+ # 'low', 'medium', 'high', 'random'
35
+ mattr_accessor :distortion
36
+ @@distortion = 'low'
37
+
38
+ # command path
39
+ mattr_accessor :image_magick_path
40
+ @@image_magick_path = ''
41
+
42
+ def self.add_image_style(name, params = [])
43
+ SimpleCaptcha::ImageHelpers.image_styles.update(name.to_s => params)
44
+ end
45
+
46
+ def self.setup
47
+ yield self
48
+ end
49
+ end
50
+
51
+ require 'simple_captcha/railtie'
@@ -0,0 +1,72 @@
1
+ module SimpleCaptcha #:nodoc
2
+ module ModelHelpers #:nodoc
3
+ def self.included(base)
4
+ base.extend(SingletonMethods)
5
+ end
6
+
7
+ # To implement model based simple captcha use this method in the model as...
8
+ #
9
+ # class User < ActiveRecord::Base
10
+ #
11
+ # apply_simple_captcha :message => "my customized message"
12
+ #
13
+ # end
14
+ #
15
+ # Customize the error message by using :message, the default message is "Captcha did not match".
16
+ # As in the applications captcha is needed with a very few cases like signing up the new user, but
17
+ # not every time you need to authenticate the captcha with @user.save. So as to maintain simplicity
18
+ # here we have the explicit method to save the instace with captcha validation as...
19
+ #
20
+ # * to validate the instance
21
+ #
22
+ # @user.valid_with_captcha? # whene captcha validation is required.
23
+ #
24
+ # @user.valid? # when captcha validation is not required.
25
+ #
26
+ # * to save the instance
27
+ #
28
+ # @user.save_with_captcha # whene captcha validation is required.
29
+ #
30
+ # @user.save # when captcha validation is not required.
31
+ module SingletonMethods
32
+ def apply_simple_captcha(options = {})
33
+ options = { :add_to_base => false }.merge(options)
34
+
35
+ write_inheritable_attribute :simple_captcha_options, options
36
+ class_inheritable_reader :simple_captcha_options
37
+
38
+ unless self.is_a?(ClassMethods)
39
+ include InstanceMethods
40
+ extend ClassMethods
41
+
42
+ attr_accessor :captcha, :captcha_key
43
+ end
44
+ end
45
+ end
46
+
47
+ module ClassMethods
48
+ end
49
+
50
+ module InstanceMethods
51
+
52
+ def valid_with_captcha?
53
+ [valid?, is_captcha_valid?].all?
54
+ end
55
+
56
+ def is_captcha_valid?
57
+ if captcha && captcha.upcase.delete(" ") == SimpleCaptcha::Utils::simple_captcha_value(captcha_key)
58
+ SimpleCaptcha::Utils::simple_captcha_passed!(captcha_key)
59
+ return true
60
+ else
61
+ message = simple_captcha_options[:message] || I18n.t(self.class.model_name.downcase, :scope => [:simple_captcha, :message], :default => :default)
62
+ simple_captcha_options[:add_to_base] ? errors.add_to_base(message) : errors.add(:captcha, message)
63
+ return false
64
+ end
65
+ end
66
+
67
+ def save_with_captcha
68
+ valid_with_captcha? && save(:validate => false)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,29 @@
1
+ module SimpleCaptcha #:nodoc
2
+ module ControllerHelpers #:nodoc
3
+ # This method is to validate the simple captcha in controller.
4
+ # It means when the captcha is controller based i.e. :object has not been passed to the method show_simple_captcha.
5
+ #
6
+ # *Example*
7
+ #
8
+ # If you want to save an object say @user only if the captcha is validated then do like this in action...
9
+ #
10
+ # if simple_captcha_valid?
11
+ # @user.save
12
+ # else
13
+ # flash[:notice] = "captcha did not match"
14
+ # redirect_to :action => "myaction"
15
+ # end
16
+ def simple_captcha_valid?
17
+ return true if Rails.env.test?
18
+
19
+ if params[:captcha]
20
+ data = SimpleCaptcha::Utils::simple_captcha_value(session[:captcha])
21
+ result = data == params[:captcha].delete(" ").upcase
22
+ SimpleCaptcha::Utils::simple_captcha_passed!(session[:captcha]) if result
23
+ return result
24
+ else
25
+ return false
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ module SimpleCaptcha
2
+ module FormBuilder
3
+ def self.included(base)
4
+ base.send(:include, SimpleCaptcha::ViewHelper)
5
+ base.send(:include, SimpleCaptcha::FormBuilder::ClassMethods)
6
+
7
+ base.delegate :render, :session, :to => :template
8
+ end
9
+
10
+ module ClassMethods
11
+ # Example:
12
+ # <% form_for :post, :url => posts_path do |form| %>
13
+ # ...
14
+ # <%= form.simple_captcha :label => "Enter numbers.." %>
15
+ # <% end %>
16
+ #
17
+ def simple_captcha(options = {})
18
+ options.update :object => @object_name
19
+ show_simple_captcha(objectify_options(options))
20
+ end
21
+
22
+ private
23
+
24
+ def template
25
+ @template
26
+ end
27
+
28
+ def simple_captcha_field(options={})
29
+ text_field(:captcha, :value => '', :autocomplete => 'off') +
30
+ hidden_field(:captcha_key, {:value => options[:field_value]})
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,11 @@
1
+ module SimpleCaptcha
2
+ class CustomFormBuilder < Formtastic::SemanticFormBuilder
3
+
4
+ private
5
+
6
+ def simple_captcha_input(method, options)
7
+ options.update :object => sanitized_object_name
8
+ self.send(:show_simple_captcha, options)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,82 @@
1
+ module SimpleCaptcha #:nodoc
2
+ module ImageHelpers #:nodoc
3
+
4
+ mattr_accessor :image_styles
5
+ @@image_styles = {
6
+ 'embosed_silver' => ['-fill darkblue', '-shade 20x60', '-background white'],
7
+ 'simply_red' => ['-fill darkred', '-background white'],
8
+ 'simply_green' => ['-fill darkgreen', '-background white'],
9
+ 'simply_blue' => ['-fill darkblue', '-background white'],
10
+ 'distorted_black' => ['-fill darkblue', '-edge 10', '-background white'],
11
+ 'all_black' => ['-fill darkblue', '-edge 2', '-background white'],
12
+ 'charcoal_grey' => ['-fill darkblue', '-charcoal 5', '-background white'],
13
+ 'almost_invisible' => ['-fill red', '-solarize 50', '-background white']
14
+ }
15
+
16
+ DISTORTIONS = ['low', 'medium', 'high']
17
+
18
+ class << self
19
+
20
+ def image_params(key = 'simply_blue')
21
+ image_keys = @@image_styles.keys
22
+
23
+ style = begin
24
+ if key == 'random'
25
+ image_keys[rand(image_keys.length)]
26
+ else
27
+ image_keys.include?(key) ? key : 'simply_blue'
28
+ end
29
+ end
30
+
31
+ @@image_styles[style]
32
+ end
33
+
34
+ def distortion(key='low')
35
+ key =
36
+ key == 'random' ?
37
+ DISTORTIONS[rand(DISTORTIONS.length)] :
38
+ DISTORTIONS.include?(key) ? key : 'low'
39
+ case key.to_s
40
+ when 'low' then return [0 + rand(2), 80 + rand(20)]
41
+ when 'medium' then return [2 + rand(2), 50 + rand(20)]
42
+ when 'high' then return [4 + rand(2), 30 + rand(20)]
43
+ end
44
+ end
45
+ end
46
+
47
+ if RUBY_VERSION < '1.9'
48
+ class Tempfile < ::Tempfile
49
+ # Replaces Tempfile's +make_tmpname+ with one that honors file extensions.
50
+ def make_tmpname(basename, n = 0)
51
+ extension = File.extname(basename)
52
+ sprintf("%s,%d,%d%s", File.basename(basename, extension), $$, n, extension)
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def generate_simple_captcha_image(simple_captcha_key) #:nodoc
60
+ amplitude, frequency = ImageHelpers.distortion(SimpleCaptcha.distortion)
61
+ text = Utils::simple_captcha_value(simple_captcha_key)
62
+
63
+ params = ImageHelpers.image_params(SimpleCaptcha.image_style).dup
64
+ params << "-size #{SimpleCaptcha.image_size}"
65
+ params << "-wave #{amplitude}x#{frequency}"
66
+ params << "-gravity 'Center'"
67
+ params << "-pointsize 22"
68
+ params << "-implode 0.2"
69
+
70
+ dst = RUBY_VERSION < '1.9' ? Tempfile.new('simple_captcha.jpg') : Tempfile.new(['simple_captcha', '.jpg'])
71
+ dst.binmode
72
+
73
+ params << "label:#{text} '#{File.expand_path(dst.path)}'"
74
+
75
+ SimpleCaptcha::Utils::run("convert", params.join(' '))
76
+
77
+ dst.close
78
+
79
+ File.expand_path(dst.path)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ require 'rails'
3
+ require 'simple_captcha'
4
+
5
+ module SimpleCaptcha
6
+ class Railtie < ::Rails::Engine
7
+ config.before_initialize do
8
+ ActiveSupport.on_load :active_record do
9
+ ActiveRecord::Base.send(:include, SimpleCaptcha::ModelHelpers)
10
+ end
11
+ end
12
+
13
+ config.after_initialize do
14
+ ActionView::Base.send(:include, SimpleCaptcha::ViewHelper)
15
+ ActionView::Helpers::FormBuilder.send(:include, SimpleCaptcha::FormBuilder)
16
+
17
+ if Object.const_defined?("Formtastic")
18
+ Formtastic::SemanticFormHelper.builder = SimpleCaptcha::CustomFormBuilder
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+
@@ -0,0 +1,23 @@
1
+ module SimpleCaptcha
2
+ class SimpleCaptchaData < ::ActiveRecord::Base
3
+ set_table_name "simple_captcha_data"
4
+
5
+ attr_accessible :key, :value
6
+
7
+ class << self
8
+ def get_data(key)
9
+ data = find_by_key(key) || new(:key => key)
10
+ end
11
+
12
+ def remove_data(key)
13
+ delete_all(["#{connection.quote_column_name(:key)} = ?", key])
14
+ clear_old_data(1.hour.ago)
15
+ end
16
+
17
+ def clear_old_data(time = 1.hour.ago)
18
+ return unless Time === time
19
+ delete_all(["#{connection.quote_column_name(:updated_at)} < ?", time])
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ require 'digest/sha1'
2
+
3
+ module SimpleCaptcha #:nodoc
4
+ module Utils #:nodoc
5
+ # Execute command with params and return output if exit status equal expected_outcodes
6
+ def self.run(cmd, params = "", expected_outcodes = 0)
7
+ command = %Q[#{cmd} #{params}].gsub(/\s+/, " ")
8
+ command = "#{command} 2>&1"
9
+
10
+ unless (image_magick_path = SimpleCaptcha.image_magick_path).blank?
11
+ command = File.join(image_magick_path, command)
12
+ end
13
+
14
+ output = `#{command}`
15
+
16
+ unless [expected_outcodes].flatten.include?($?.exitstatus)
17
+ raise ::StandardError, "Error while running #{cmd}: #{output}"
18
+ end
19
+
20
+ output
21
+ end
22
+
23
+ def self.simple_captcha_value(key) #:nodoc
24
+ SimpleCaptchaData.get_data(key).value rescue nil
25
+ end
26
+
27
+ def self.simple_captcha_passed!(key) #:nodoc
28
+ SimpleCaptchaData.remove_data(key)
29
+ end
30
+
31
+ def self.generate_key(*args)
32
+ args << Time.now.to_s
33
+ Digest::SHA1.hexdigest(args.join)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,110 @@
1
+ module SimpleCaptcha #:nodoc
2
+ module ViewHelper #:nodoc
3
+
4
+ # Simple Captcha is a very simplified captcha.
5
+ #
6
+ # It can be used as a *Model* or a *Controller* based Captcha depending on what options
7
+ # we are passing to the method show_simple_captcha.
8
+ #
9
+ # *show_simple_captcha* method will return the image, the label and the text box.
10
+ # This method should be called from the view within your form as...
11
+ #
12
+ # <%= show_simple_captcha %>
13
+ #
14
+ # The available options to pass to this method are
15
+ # * label
16
+ # * object
17
+ #
18
+ # <b>Label:</b>
19
+ #
20
+ # default label is "type the text from the image", it can be modified by passing :label as
21
+ #
22
+ # <%= show_simple_captcha(:label => "new captcha label") %>.
23
+ #
24
+ # *Object*
25
+ #
26
+ # This option is needed to create a model based captcha.
27
+ # If this option is not provided, the captcha will be controller based and
28
+ # should be checked in controller's action just by calling the method simple_captcha_valid?
29
+ #
30
+ # To make a model based captcha give this option as...
31
+ #
32
+ # <%= show_simple_captcha(:object => "user") %>
33
+ # and also call the method apply_simple_captcha in the model
34
+ # this will consider "user" as the object of the model class.
35
+ #
36
+ # *Examples*
37
+ # * controller based
38
+ # <%= show_simple_captcha(:label => "Human Authentication: type the text from image above") %>
39
+ # * model based
40
+ # <%= show_simple_captcha(:object => "person", :label => "Human Authentication: type the text from image above") %>
41
+ #
42
+ # Find more detailed examples with sample images here on my blog http://EXPRESSICA.com
43
+ #
44
+ # All Feedbacks/CommentS/Issues/Queries are welcome.
45
+ def show_simple_captcha(options={})
46
+ key = simple_captcha_key(options[:object])
47
+ options[:field_value] = set_simple_captcha_data(key, options)
48
+
49
+ defaults = {
50
+ :image => simple_captcha_image(key, options),
51
+ :label => options[:label] || I18n.t('simple_captcha.label'),
52
+ :field => simple_captcha_field(options)
53
+ }
54
+
55
+ render :partial => 'simple_captcha/simple_captcha', :locals => { :simple_captcha_options => defaults }
56
+ end
57
+
58
+ private
59
+
60
+ def simple_captcha_image(simple_captcha_key, options = {})
61
+ defaults = {}
62
+ defaults[:time] = options[:time] || Time.now.to_i
63
+
64
+ query = defaults.collect{ |key, value| "#{key}=#{value}" }.join('&')
65
+ url = "/simple_captcha/#{simple_captcha_key}?#{query}"
66
+
67
+ "<img src='#{url}' alt='captcha' />".html_safe
68
+ end
69
+
70
+ def simple_captcha_field(options={})
71
+ if options[:object]
72
+ text_field(options[:object], :captcha, :value => '', :autocomplete => 'off') +
73
+ hidden_field(options[:object], :captcha_key, {:value => options[:field_value]})
74
+ else
75
+ text_field_tag(:captcha, nil, :autocomplete => 'off')
76
+ end
77
+ end
78
+
79
+ def set_simple_captcha_data(key, options={})
80
+ code_type = options[:code_type]
81
+
82
+ value = generate_simple_captcha_data(code_type)
83
+ data = SimpleCaptcha::SimpleCaptchaData.get_data(key)
84
+ data.value = value
85
+ data.save
86
+ key
87
+ end
88
+
89
+ def generate_simple_captcha_data(code)
90
+ value = ''
91
+
92
+ case code
93
+ when 'numeric' then
94
+ SimpleCaptcha.length.times{value << (48 + rand(10)).chr}
95
+ else
96
+ SimpleCaptcha.length.times{value << (65 + rand(26)).chr}
97
+ end
98
+
99
+ return value
100
+ end
101
+
102
+ def simple_captcha_key(key_name = nil)
103
+ if key_name.nil?
104
+ session[:captcha] ||= SimpleCaptcha::Utils.generate_key(session[:id].to_s, 'captcha')
105
+ else
106
+ SimpleCaptcha::Utils.generate_key(session[:id].to_s, key_name)
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,8 @@
1
+ require 'test/unit'
2
+
3
+ class SimpleCaptchaTest < Test::Unit::TestCase
4
+ # Replace this with your real tests.
5
+ def test_this_plugin
6
+ flunk
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: galetahub-simple_captcha
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
+ platform: ruby
12
+ authors:
13
+ - Pavlo Galeta
14
+ - Igor Galeta
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2011-08-22 00:00:00 +03:00
20
+ default_executable:
21
+ dependencies: []
22
+
23
+ description: SimpleCaptcha is available to be used with Rails 3 or above and also it provides the backward compatibility with previous versions of Rails.
24
+ email: superp1987@gmail.com
25
+ executables: []
26
+
27
+ extensions: []
28
+
29
+ extra_rdoc_files:
30
+ - README.rdoc
31
+ files:
32
+ - README.rdoc
33
+ - Rakefile
34
+ - app/controllers/simple_captcha_controller.rb
35
+ - config/routes.rb
36
+ - lib/generators/USAGE
37
+ - lib/generators/simple_captcha_generator.rb
38
+ - lib/generators/templates/migration.rb
39
+ - lib/generators/templates/partial.erb
40
+ - lib/simple_captcha.rb
41
+ - lib/simple_captcha/active_record.rb
42
+ - lib/simple_captcha/controller.rb
43
+ - lib/simple_captcha/form_builder.rb
44
+ - lib/simple_captcha/formtastic.rb
45
+ - lib/simple_captcha/image.rb
46
+ - lib/simple_captcha/railtie.rb
47
+ - lib/simple_captcha/simple_captcha_data.rb
48
+ - lib/simple_captcha/utils.rb
49
+ - lib/simple_captcha/view.rb
50
+ - test/simple_captcha_test.rb
51
+ has_rdoc: true
52
+ homepage: http://github.com/galetahub/simple-captcha
53
+ licenses: []
54
+
55
+ post_install_message:
56
+ rdoc_options: []
57
+
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ requirements: []
79
+
80
+ rubyforge_project: simple_captcha
81
+ rubygems_version: 1.6.2
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: SimpleCaptcha is the simplest and a robust captcha plugin.
85
+ test_files: []
86
+