nice_text_captcha 0.1.1 → 0.1.2
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.markdown +100 -0
- data/lib/nice_text_captcha.rb +4 -1
- data/lib/nice_text_captcha/captcha.rb +9 -6
- data/lib/nice_text_captcha/types/fixed_question.rb +25 -0
- metadata +9 -8
- data/README +0 -73
data/README.markdown
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
Nice Text Captcha
|
2
|
+
=================
|
3
|
+
|
4
|
+
by Neil Smith
|
5
|
+
|
6
|
+
About
|
7
|
+
-----
|
8
|
+
|
9
|
+
This generates text-based CATPCHAs that are "nice", by my own personal
|
10
|
+
subjective definition!
|
11
|
+
|
12
|
+
Questions are purposely simple, and examples would include:
|
13
|
+
|
14
|
+
* How many letters are there in the word 'White'?
|
15
|
+
* In the word "tiger", what is the letter in the 5th position?
|
16
|
+
* How many animals are in the words: "cat", 'Orange', and "dolphin"?
|
17
|
+
* What is 'four' + "nine"?
|
18
|
+
|
19
|
+
Why Another CAPTCHA Solution?
|
20
|
+
-----------------------------
|
21
|
+
|
22
|
+
There are plenty of choices out there, but none quite met my personal needs (or
|
23
|
+
some client's needs) for one reason or another:
|
24
|
+
|
25
|
+
* I wanted a self-contained solution that wasn't reliant on a 3rd party service
|
26
|
+
* Relatedly, I didn't want to have to muck around with API keys to get it working
|
27
|
+
* I wanted a few different question types, not just simple maths-based ones
|
28
|
+
* I didn't want long/odd words and case that make the question difficult to
|
29
|
+
understand at first glance (so no "What's the first adverb in the list
|
30
|
+
discombobulation, deFeNEStraTE, DiscOncErTinGly, DiSiNTEGRATing. Enter the
|
31
|
+
name of a good Jack Black film if you don't think there are any adverbs. Enter
|
32
|
+
a surprising fact about cheese if you don't think Jack Black has done any
|
33
|
+
good films.")
|
34
|
+
|
35
|
+
Implementation
|
36
|
+
--------------
|
37
|
+
|
38
|
+
You call a method in your view which both generates a random question, and places
|
39
|
+
the possible answers into a flash[] object, stored in a SHA2 hash.
|
40
|
+
|
41
|
+
(It's stored in a flash, as Rails handles ageing the data after a request - if we
|
42
|
+
used the session, it would hang around for the duration of the session.)
|
43
|
+
|
44
|
+
Then, in your controller action, you call a method which extracts the answers from
|
45
|
+
the flash, and injects them into your model.
|
46
|
+
|
47
|
+
A validation method on the model finally checks the answer against the hashed
|
48
|
+
possible answers, and pushes an error onto the base of your model if the answer
|
49
|
+
doesn't match.
|
50
|
+
|
51
|
+
For numerical answers ("What is 'two' plus 'three'?"), both numbers ("3") and
|
52
|
+
words ("three") are accepted.
|
53
|
+
|
54
|
+
Requirements
|
55
|
+
------------
|
56
|
+
|
57
|
+
* Tested against Rails 2.3 - currently untested against Rails 3.
|
58
|
+
* 'linguistics' gem for turning numbers into words and ordinals (gem install linguistics)
|
59
|
+
* 'Digest/SHA2' for hashing the possible answers.
|
60
|
+
|
61
|
+
Installation
|
62
|
+
------------
|
63
|
+
|
64
|
+
Simply add:
|
65
|
+
|
66
|
+
config.gem 'nice_text_captcha'
|
67
|
+
|
68
|
+
to your environment.rb file, and install the gem via your preferred method.
|
69
|
+
|
70
|
+
Usage Instructions
|
71
|
+
------------------
|
72
|
+
|
73
|
+
In your model, you need to add some validation:
|
74
|
+
|
75
|
+
class Thing < ActiveRecord::Base
|
76
|
+
validate :check_nice_text_captcha
|
77
|
+
end
|
78
|
+
|
79
|
+
In your controller, you need to add a call to populate the answers from the
|
80
|
+
data in the session:
|
81
|
+
|
82
|
+
class ThingsController < ActiveRecord::Base
|
83
|
+
def create
|
84
|
+
@thing = Thing.new(params[:thing]) # as normal
|
85
|
+
validate_nice_text_captcha_for(@thing)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
Finally, in your view, you need to render the question by calling nice_text_captcha,
|
90
|
+
and give the user a text box for their answer:
|
91
|
+
|
92
|
+
<% form_for(@thing) do |f| %>
|
93
|
+
<!-- normal form elements here -->
|
94
|
+
|
95
|
+
<%= f.nice_text_captcha %> <!-- this will generate a label with the catcha text inside -->
|
96
|
+
<%= f.text_field :nice_text_captcha %>
|
97
|
+
|
98
|
+
<!-- probably a submit button here -->
|
99
|
+
|
100
|
+
<% end %>
|
data/lib/nice_text_captcha.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
#config.gem "linguistics"
|
2
1
|
require 'linguistics'
|
3
2
|
Linguistics::use(:en)
|
4
3
|
|
@@ -9,13 +8,17 @@ require 'nice_text_captcha/action_controller_extensions'
|
|
9
8
|
require 'nice_text_captcha/form_builder_extensions'
|
10
9
|
|
11
10
|
require 'nice_text_captcha/types/default_question'
|
11
|
+
require 'nice_text_captcha/types/fixed_question'
|
12
12
|
require 'nice_text_captcha/types/letter_position_question'
|
13
13
|
require 'nice_text_captcha/types/maths_question'
|
14
14
|
require 'nice_text_captcha/types/word_length_question'
|
15
15
|
require 'nice_text_captcha/types/words_in_list_question'
|
16
16
|
|
17
|
+
# Mix in form builder helper
|
17
18
|
ActionView::Helpers::FormBuilder.send :include, NiceTextCaptcha::FormBuilderExtensions
|
18
19
|
|
20
|
+
# Mix in validation
|
19
21
|
ActiveRecord::Base.send :include, NiceTextCaptcha::ActiveRecordExtensions
|
20
22
|
|
23
|
+
# Mix in controller-controlled validation
|
21
24
|
ActionController::Base.send :include, NiceTextCaptcha::ActionControllerExtensions
|
@@ -5,13 +5,16 @@ module NiceTextCaptcha
|
|
5
5
|
attr_reader :question
|
6
6
|
attr_reader :answers
|
7
7
|
|
8
|
+
NICE_TEXT_CAPTCHA_TYPE_DEFAULTS = [
|
9
|
+
Types::FixedQuestion,
|
10
|
+
Types::MathsQuestion,
|
11
|
+
Types::LetterPositionQuestion,
|
12
|
+
Types::WordsInListQuestion,
|
13
|
+
Types::WordLengthQuestion,
|
14
|
+
]
|
15
|
+
|
8
16
|
def initialize
|
9
|
-
captcha =
|
10
|
-
Types::MathsQuestion,
|
11
|
-
Types::LetterPositionQuestion,
|
12
|
-
Types::WordsInListQuestion,
|
13
|
-
Types::WordLengthQuestion,
|
14
|
-
].rand.new
|
17
|
+
captcha = (NICE_TEXT_CAPTCHA_TYPES rescue NICE_TEXT_CAPTCHA_TYPE_DEFAULTS).rand.new
|
15
18
|
@question = captcha.question
|
16
19
|
@answers = captcha.answers
|
17
20
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class NiceTextCaptcha::Types::FixedQuestion < NiceTextCaptcha::Types::DefaultQuestion
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
question = random_question
|
5
|
+
@question = question.first
|
6
|
+
@answers = question.last
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def random_question
|
12
|
+
[
|
13
|
+
["Is water wet or dry?", ["wet"]],
|
14
|
+
["Is snow hot or cold?", ["cold"]],
|
15
|
+
["Do dogs have tails?", ["yes", "y"]],
|
16
|
+
["How many noses have you got?", ["1", "one"]],
|
17
|
+
["Are elephants big or small?", ["big"]],
|
18
|
+
["How many legs has a cat got?", ["4", "four"]],
|
19
|
+
["Do shoes go on your hands or your feet?", ["feet", "your feet"]],
|
20
|
+
].rand
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nice_text_captcha
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Neil Smith
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-12 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -26,27 +26,28 @@ executables: []
|
|
26
26
|
extensions: []
|
27
27
|
|
28
28
|
extra_rdoc_files:
|
29
|
-
- README
|
29
|
+
- README.markdown
|
30
30
|
files:
|
31
|
-
- README
|
31
|
+
- README.markdown
|
32
32
|
- lib/nice_text_captcha/action_controller_extensions.rb
|
33
33
|
- lib/nice_text_captcha/active_record_extensions.rb
|
34
34
|
- lib/nice_text_captcha/captcha.rb
|
35
35
|
- lib/nice_text_captcha/form_builder_extensions.rb
|
36
36
|
- lib/nice_text_captcha/types/default_question.rb
|
37
|
+
- lib/nice_text_captcha/types/fixed_question.rb
|
37
38
|
- lib/nice_text_captcha/types/letter_position_question.rb
|
38
39
|
- lib/nice_text_captcha/types/maths_question.rb
|
39
40
|
- lib/nice_text_captcha/types/word_length_question.rb
|
40
41
|
- lib/nice_text_captcha/types/words_in_list_question.rb
|
41
42
|
- lib/nice_text_captcha.rb
|
42
43
|
has_rdoc: true
|
43
|
-
homepage:
|
44
|
+
homepage: http://github.com/smugx/nice_text_captcha
|
44
45
|
licenses: []
|
45
46
|
|
46
47
|
post_install_message:
|
47
48
|
rdoc_options:
|
48
49
|
- --main
|
49
|
-
- README
|
50
|
+
- README.markdown
|
50
51
|
require_paths:
|
51
52
|
- lib
|
52
53
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/README
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
Nice Text Captcha
|
2
|
-
by Neil Smith
|
3
|
-
|
4
|
-
About
|
5
|
-
-----
|
6
|
-
|
7
|
-
This generates text-based CATPCHAs that are "nice", by my own personal
|
8
|
-
subjective definition!
|
9
|
-
|
10
|
-
Questions are purposely simple, and examples would include:
|
11
|
-
|
12
|
-
* How many letters are there in the word 'White'?
|
13
|
-
* In the word "tiger", what is the letter in the 5th position?
|
14
|
-
* How many animals are in the words: "cat", "orange", and "dolphin"?
|
15
|
-
* What is 'four' + "nine"?
|
16
|
-
|
17
|
-
Implementation
|
18
|
-
--------------
|
19
|
-
|
20
|
-
You call a method in your view which both generates a random question, and places
|
21
|
-
the possible answers into a flash[] object, stored in a SHA2 hash.
|
22
|
-
|
23
|
-
(It's stored in a flash, as Rails handles ageing the data after a request - if we
|
24
|
-
used the session, it would hang around for the duration of the session.)
|
25
|
-
|
26
|
-
Then, in your controller action, you call a method which extracts the answers from
|
27
|
-
the flash, and injects them into your model.
|
28
|
-
|
29
|
-
A validation method on the model finally checks the answer against the hashed
|
30
|
-
possible answers, and pushes an error onto the base of your model if the answer
|
31
|
-
doesn't match.
|
32
|
-
|
33
|
-
For numerical answers ("What is 'two' plus 'three'?"), both numbers ("3") and
|
34
|
-
words ("three") are accepted.
|
35
|
-
|
36
|
-
Requirements
|
37
|
-
------------
|
38
|
-
|
39
|
-
Tested against Rails 2.3 - currently untested against Rails 3.
|
40
|
-
'linguistics' gem for turning numbers into words and ordinals.
|
41
|
-
'Digest/SHA2' for hashing the possible answers.
|
42
|
-
|
43
|
-
Instructions
|
44
|
-
------------
|
45
|
-
|
46
|
-
In your model, you need to add some validation:
|
47
|
-
|
48
|
-
class Thing < ActiveRecord::Base
|
49
|
-
validate :check_nice_text_captcha
|
50
|
-
end
|
51
|
-
|
52
|
-
In your controller, you need to add a call to populate the answers from the
|
53
|
-
data in the session:
|
54
|
-
|
55
|
-
class ThingsController < ActiveRecord::Base
|
56
|
-
def create
|
57
|
-
@thing = Thing.new(params[:thing]) # as normal
|
58
|
-
validate_nice_text_captcha_for(@thing)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
Finally, in your view, you need to render the question by calling nice_text_captcha,
|
63
|
-
and give the user a text box for their answer:
|
64
|
-
|
65
|
-
<% form_for(@thing) do |f| %>
|
66
|
-
<!-- normal form elements here -->
|
67
|
-
|
68
|
-
<%= f.nice_text_captcha %><br />
|
69
|
-
<%= f.text_field :nice_text_captcha %><br />
|
70
|
-
|
71
|
-
<!-- probably a submit button here -->
|
72
|
-
|
73
|
-
<% end %>
|