karsthammer-validates_captcha 0.9.5a

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/CHANGELOG.rdoc ADDED
@@ -0,0 +1,22 @@
1
+ == 0.9.5 (October 9, 2009)
2
+
3
+ * API change: renamed Provider::Image to Provider::DynamicImage in order to guard against confusion
4
+
5
+ * API change: renamed ReversibleEncrypter to SymmetricEncryptor
6
+
7
+ * ReversibleEncrypter::Simple class now uses ActiveSupport's MessageEncryptor instead of custom implementation
8
+
9
+
10
+ == 0.9.4 (October 7, 2009)
11
+
12
+ * Include new StaticImage provider
13
+
14
+
15
+ == 0.9.3 (September 29, 2009)
16
+
17
+ * Change API, include new Question provider, make it the default one
18
+
19
+
20
+ == 0.9.2 (September 27, 2009)
21
+
22
+ * Initial version
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2009 Martin Andert
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README.rdoc ADDED
@@ -0,0 +1,320 @@
1
+ = Validates Captcha
2
+
3
+ A captcha verification approach for Rails apps, directly integrated into
4
+ ActiveRecord's validation mechanism and providing helpers for ActionController
5
+ and ActionView.
6
+
7
+ RDoc documentation (including this README as start page) can be found at
8
+ http://m4n.github.com/validates_captcha. Validates Captcha was first
9
+ announced {here}[http://m4n.github.com/2009/09/28/introducing-validates-captcha.html].
10
+
11
+ By default, question/answer captcha challenges are used, but you can also switch
12
+ to the built-in image captcha providers. If you stick to ValidatesCaptcha’s API,
13
+ you can even implement your own captcha challenge provider.
14
+
15
+
16
+
17
+ == Basic Usage
18
+
19
+ Validates Captcha extends ActiveRecord, ActionController and ActionView with
20
+ helper methods that make it a snap to integrate captcha verification in your
21
+ Rails application.
22
+
23
+ <b>Step #1:</b> Extend your view’s form with the necessary captcha display and
24
+ input logic.
25
+
26
+ # app/views/comments/new.html.erb
27
+ <% form_for @comment do |f| %>
28
+ <%= f.error_messages %>
29
+
30
+ <!-- standard input fields: -->
31
+ <p>
32
+ <%= f.label :name %><br />
33
+ <%= f.text_field :name %>
34
+ </p>
35
+ <!-- ... -->
36
+
37
+ <!-- now something new: -->
38
+ <p>
39
+ <%= f.label :captcha %><br />
40
+ <%= f.captcha_challenge # displays the question or image %>
41
+ <%= f.captcha_field # displays the input field %>
42
+ </p>
43
+
44
+ <p>
45
+ <%= f.submit 'Create' %>
46
+ </p>
47
+ <% end %>
48
+
49
+ <b>Step #2:</b> Tell the controller that you want to validate
50
+ captchas.
51
+
52
+ class CommentsController < ApplicationController
53
+ validates_captcha
54
+
55
+ def create
56
+ # scaffold comment creation code ...
57
+ end
58
+
59
+ # more actions here ...
60
+ end
61
+
62
+ This activates captcha validation in every action of the controller
63
+ whenever an instance of class +Comment+ is saved.
64
+
65
+ <b>Step #3:</b> There's no step three!
66
+
67
+ To summarize: Put the following in your view.
68
+
69
+ <%= f.captcha_challenge %>
70
+ <%= f.captcha_field %>
71
+
72
+ And what you see below in the corresponding controller.
73
+
74
+ validates_captcha
75
+
76
+ Done.
77
+
78
+ == Customization
79
+
80
+ Because the +validates_captcha+ controller method internally creates an
81
+ around filter, you can (de)activate captcha validation for specific actions.
82
+
83
+ validates_captcha :only => [:create, :update]
84
+ validates_captcha :except => :reset
85
+
86
+ The class for which captcha validation is activated is derived from
87
+ the name of the controller. So putting +validates_captcha+ in a
88
+ +UsersController+ validates instances of the +User+ class.
89
+
90
+ You can customize the validated class using the +validates_captcha_of+ method.
91
+
92
+ class ArticlesController < ApplicationController
93
+ validates_captcha_of Post
94
+ validates_captcha_of :blog_entries, :except => :persist
95
+ validates_captcha_of 'users', :only => :store
96
+ end
97
+
98
+ Two kinds of errors are added to the model if captcha validation fails:
99
+ +:blank+ if no captcha solution is submitted and +:invalid+ if a captcha
100
+ solution is submitted but does not solve the captcha's challenge. You can
101
+ localize the error messages for the captcha as you usually do for the
102
+ other attributes.
103
+
104
+ models:
105
+ comment:
106
+ attributes:
107
+ captcha_solution:
108
+ blank: 'must not be empty'
109
+ invalid: 'does not match the code displayed on the image'
110
+
111
+ What if the image captcha's text is unreadable or a user does not know the
112
+ correct answer to the captcha question? There's also a form helper method
113
+ for captcha regeneration available. You can call it like this.
114
+
115
+ <p>
116
+ Don't know the answer? <%= f.regenerate_captcha_challenge_link %>
117
+ </p>
118
+
119
+ This generates an anchor tag that, when clicked, generates a new captcha
120
+ challenge and updates the display. It makes an AJAX request to fetch a
121
+ new challenge and updates the question/image after the request is complete.
122
+
123
+ +regenerate_captcha_challenge_link+ internally calls Rails' +link_to_remote+
124
+ helper method. So it relies on the Prototype javascript framework to be
125
+ available on the page.
126
+
127
+ The anchor's text defaults to 'New question' (question challenge) and
128
+ 'Regenerate Captcha' (image challenge) respectively. You can set this to
129
+ a custom value by providing a +:text+ key in the options hash.
130
+
131
+ <%= f.regenerate_captcha_challenge_link :text => 'Another captcha, please' %>
132
+
133
+ Apart from controllers, you can activate captcha validation for a model
134
+ using the class level +with_captcha_validation+ method added to
135
+ ActiveRecord::Base.
136
+
137
+ Comment.with_captcha_validation do
138
+ @comment = Comment.new(...)
139
+ @comment.save
140
+ end
141
+
142
+ This activates captcha validation on entering the block and deactivates it
143
+ on leaving the block.
144
+
145
+ Two new attribute-like methods are added to ActiveRecord: +captcha_challenge+
146
+ and +captcha_solution+. Those are made +attr_accessible+. The former is
147
+ initialized to a randomly generated captcha challenge on instantiation.
148
+
149
+ For a record to be valid, the value assigned to +captcha_solution=+ must
150
+ solve the return value of +captcha_challenge+. Within a +with_captcha_validation+
151
+ block, calling +valid?+ (as is done by +save+, +update_attributes+, etc.)
152
+ will also validate the value of +captcha_solution+ against +captcha_challenge+.
153
+ Outside +with_captcha_validation+, no captcha validation is performed.
154
+
155
+
156
+
157
+ == Question/answer challenge captchas (default provider)
158
+
159
+ You can set the captcha provider to use question/answer challenges with
160
+ the code below. It is best to put this in a Rails initializer.
161
+
162
+ ValidatesCaptcha.provider = ValidatesCaptcha::Provider::Question.new # this is the default
163
+
164
+ If you want to replace the few default questions and answers, here's how
165
+ to do it.
166
+
167
+ ValidatesCaptcha::Provider::Question.questions_and_answers = {
168
+ "What's the opposite of bad?" => "good",
169
+ "What are the initials of the creator of Rails?" => "DHH",
170
+ "What's the sum of 3 and four?" => ["7", "seven"],
171
+ ... }
172
+
173
+
174
+
175
+ == Dynamic image challenge captchas
176
+
177
+ You can set the captcha provider to use dynamically created image challenges
178
+ with the code below. Dynamic means that the captcha image is created on invocation.
179
+ If you want to utilize this provider, it is best to put this in a Rails initializer.
180
+
181
+ ValidatesCaptcha.provider = ValidatesCaptcha::Provider::DynamicImage.new
182
+
183
+ By default, image captchas have a length of 6 characters and the text displayed
184
+ on the captcha image is created by randomly selecting characters from a
185
+ predefined alphabet constisting of visually distinguishable letters and digits.
186
+
187
+ The number of characters and the alphabet used when generating strings can
188
+ be customized. Just put the following in a Rails initializer and adjust the
189
+ values to your needs.
190
+
191
+ ValidatesCaptcha::StringGenerator::Simple.alphabet = '01'
192
+ ValidatesCaptcha::StringGenerator::Simple.length = 8
193
+
194
+
195
+
196
+ == Static image challenge captchas
197
+
198
+ You can set the captcha provider to use static image challenges with
199
+ the code below. Static means that there exist some pre-created images
200
+ in a folder accessible by the web application. If you want to utilize
201
+ this provider, it is best to put this in a Rails initializer.
202
+
203
+ ValidatesCaptcha.provider = ValidatesCaptcha::Provider::StaticImage.new
204
+
205
+ There is a Rake tast for creating the static captcha images:
206
+
207
+ rake validates_captcha:create_static_images
208
+
209
+ This will create 3 images for you. To create a different number of images,
210
+ provide a COUNT argument:
211
+
212
+ rake validates_captcha:create_static_images COUNT=50
213
+
214
+ If you want to customize the path the images get saved to (or other stuff),
215
+ please see the documentation for ValidatesCaptcha::Provider::StaticImage.
216
+
217
+
218
+
219
+ == Extensibility
220
+
221
+ Don't like the built-in challenges? It's easy to extend them or to implement
222
+ your own.
223
+
224
+ Validates Captcha delegates tasks like string and image generation,
225
+ encryption/decryption of captcha codes, and responding to captcha requests
226
+ to dedicated backend classes.
227
+
228
+ Those classes can easily be replaced with your custom implementations. So
229
+ you can achieve stronger encryption, can use a word list as image captcha text
230
+ generation source, or can replace the captcha image generator with one
231
+ that creates images that are harder to crack.
232
+
233
+ Please see the documentation of the following classes for further information.
234
+
235
+ * ValidatesCaptcha::StringGenerator::Simple
236
+ * ValidatesCaptcha::SymmetricEncryptor::Simple
237
+ * ValidatesCaptcha::ImageGenerator::Simple
238
+
239
+ Or you can implement a custom captcha challenge provider and assign it to
240
+ ValidatesCaptcha#provider=. See the documentation on ValidatesCaptcha::Provider
241
+ for an example.
242
+
243
+
244
+
245
+ == Dependencies
246
+
247
+ Using a Rack middleware to speed up the request/response cycle when fetching
248
+ captcha images, Validates Captcha requires Rails version 2.3 or greater.
249
+
250
+ The image captcha provider uses ImageMagick's +convert+ command to create
251
+ the captcha. So a recent and properly configured version of ImageMagick
252
+ must be installed on the system. The version used while developing was 6.4.5.
253
+ But you are not bound to ImageMagick. If you want to provide a custom image
254
+ generator, take a look at the documentation for
255
+ ValidatesCaptcha::ImageGenerator::Simple on how to create your own.
256
+
257
+
258
+
259
+ == Installation
260
+
261
+ You can install Validates Captcha as a Gem with
262
+
263
+ % [sudo] gem install validates_captcha
264
+
265
+ and then configure it in your +environment.rb+ file as shown below.
266
+
267
+ Rails::Initializer.run do |config|
268
+ # ...
269
+ config.gem 'validates_captcha'
270
+ # ...
271
+ end
272
+
273
+ Or you can install it as a Rails plugin (discouraged) with the
274
+ following command.
275
+
276
+ % ./script/plugin install git://github.com/m4n/validates_captcha.git
277
+
278
+
279
+
280
+ == Download
281
+
282
+ The latest version of Validates Captcha can be found at
283
+ http://github.com/m4n/validates_captcha
284
+
285
+ Documentation can be generated from its distribution directory with the
286
+ following command.
287
+
288
+ % [sudo] rake rdoc
289
+
290
+ Tests can be executed from its distribution directory with the
291
+ following command.
292
+
293
+ % [sudo] rake test
294
+
295
+
296
+
297
+ == Hacking
298
+
299
+ Validates Captcha is {hosted on Github}[http://github.com/m4n/validates_captcha].
300
+ Pull requests are welcome.
301
+
302
+
303
+
304
+ == Bugs
305
+
306
+ Please report bugs on the {Github issue tracker}[http://github.com/m4n/validates_captcha/issues]
307
+ for this project.
308
+
309
+
310
+
311
+ == License
312
+
313
+ Validates Captcha is released under the MIT license.
314
+
315
+
316
+
317
+ == Copyright
318
+
319
+ Copyright (c) 2009 Martin Andert
320
+
data/Rakefile ADDED
@@ -0,0 +1,102 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/packagetask'
5
+ require 'rake/gempackagetask'
6
+
7
+ require File.join(File.dirname(__FILE__), 'lib', 'validates_captcha', 'version')
8
+
9
+
10
+
11
+ PKG_NAME = 'validates_captcha'
12
+ PKG_VERSION = ValidatesCaptcha::VERSION::STRING
13
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
+
15
+ RELEASE_NAME = "REL #{PKG_VERSION}"
16
+
17
+ RUBY_FORGE_PROJECT = 'validatecaptcha'
18
+
19
+
20
+
21
+ begin
22
+ require 'hanna/rdoctask'
23
+ rescue LoadError
24
+ require 'rake/rdoctask'
25
+ end
26
+
27
+ desc 'Generate documentation'
28
+ Rake::RDocTask.new do |rdoc|
29
+ rdoc.rdoc_dir = 'doc'
30
+ rdoc.title = "Validates Captcha"
31
+ rdoc.main = "README.rdoc"
32
+
33
+ rdoc.options << '--line-numbers' << '--inline-source'
34
+ rdoc.options << '--charset' << 'utf-8'
35
+
36
+ rdoc.rdoc_files.include 'README.rdoc'
37
+ rdoc.rdoc_files.include 'MIT-LICENSE'
38
+ rdoc.rdoc_files.include 'CHANGELOG.rdoc'
39
+ rdoc.rdoc_files.include 'lib/**/*.rb'
40
+ rdoc.rdoc_files.exclude 'lib/validates_captcha/test_case.rb'
41
+ rdoc.rdoc_files.exclude 'lib/validates_captcha/version.rb'
42
+ end
43
+
44
+ namespace :rdoc do
45
+ desc 'Show documentation in Firefox'
46
+ task :show do
47
+ sh 'firefox doc/index.html'
48
+ end
49
+ end
50
+
51
+
52
+
53
+ desc 'Run tests by default'
54
+ task :default => :test
55
+
56
+ Rake::TestTask.new do |t|
57
+ t.libs << 'test'
58
+ t.test_files = FileList['test/**/*_test.rb']
59
+ #t.verbose = true
60
+ #t.warning = true
61
+ end
62
+
63
+
64
+
65
+ spec = eval(File.read('validates_captcha.gemspec'))
66
+
67
+ Rake::GemPackageTask.new(spec) do |pkg|
68
+ pkg.gem_spec = spec
69
+ pkg.need_tar = true
70
+ pkg.need_zip = true
71
+ end
72
+
73
+
74
+
75
+ desc 'Publish the release files to RubyForge'
76
+ task :release => [:package] do
77
+ require 'rubyforge'
78
+ require 'rake/contrib/rubyforgepublisher'
79
+
80
+ packages = %w(gem tgz zip).collect { |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
81
+
82
+ rubyforge = RubyForge.new
83
+ rubyforge.configure
84
+ rubyforge.add_release RUBY_FORGE_PROJECT, RUBY_FORGE_PROJECT, RELEASE_NAME, *packages
85
+ end
86
+
87
+
88
+
89
+ desc 'Uninstall local gem'
90
+ task :uninstall do
91
+ system "sudo gem uninstall #{PKG_NAME}"
92
+ end
93
+
94
+ desc 'Install local gem'
95
+ task :install => [:uninstall, :gem] do
96
+ system "sudo gem install pkg/#{PKG_NAME}-#{PKG_VERSION}.gem --no-ri --no-rdoc"
97
+ end
98
+
99
+
100
+
101
+ Dir['tasks/**/*.rake'].each { |tasks_file| load tasks_file }
102
+