captchah 1.1.1 → 2.0.1
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.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/app/controllers/captchah/captchah_controller.rb +2 -0
- data/lib/captchah/generators/captcha.rb +9 -1
- data/lib/captchah/generators/html.rb +26 -12
- data/lib/captchah/generators/puzzle.rb +6 -9
- data/lib/captchah/version.rb +1 -1
- data/lib/captchah.rb +1 -0
- metadata +7 -36
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2f3926fc6264e56237671ce4eb5b8d5e22f1f2c06651ffcd1280476666c7278a
|
|
4
|
+
data.tar.gz: 9a95960a66fb60c5f3892b4af08644fecfa33280ef9e2da5f346986c2677ea85
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 54ac623eda86756c98bd106be582f3693e6c16fff821c407a225514c87cf39a63adac17f2740fe6f550db5cc4486fc3498a2532a406d30795b4e20bf74faa3c5
|
|
7
|
+
data.tar.gz: 7a9f81c829f33feeb6512544c6f5cee6df881a0fac7affed21ea310c1129b466d04ab0412958156980e868f61dcceedf6f8f74eb0098464873225f15f86fcc46
|
data/README.md
CHANGED
|
@@ -7,7 +7,7 @@ A Rails captcha gem that attempts to determine whether or not a user is human.
|
|
|
7
7
|
Add this line to your application's Gemfile:
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
gem 'captchah'
|
|
10
|
+
gem 'captchah'
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
And execute:
|
|
@@ -81,6 +81,8 @@ captchah_tag(
|
|
|
81
81
|
reload_max: 5, # Integer value Default: 5
|
|
82
82
|
reload: true, # Boolean value Default: true
|
|
83
83
|
css: true, # Boolean value Default: true
|
|
84
|
+
csp_nonce: 'csp-id', # String value Default: nil
|
|
85
|
+
required: true, # Boolean value Default: false
|
|
84
86
|
puzzle_font: 'Verdana' # String value Default: 'Verdana'
|
|
85
87
|
)
|
|
86
88
|
```
|
|
@@ -27,6 +27,8 @@ module Captchah
|
|
|
27
27
|
@reload_count = args[:reload_count] || DEFAULT_RELOAD_COUNT
|
|
28
28
|
@reload = args[:reload] == false ? false : allow_reload?
|
|
29
29
|
@css = (args[:css] != false)
|
|
30
|
+
@csp_nonce = args[:csp_nonce]
|
|
31
|
+
@required = !!args[:required] # rubocop:disable Style/DoubleNegation
|
|
30
32
|
@puzzle_font = args[:puzzle_font] || DEFAULT_PUZZLE_FONT
|
|
31
33
|
end
|
|
32
34
|
|
|
@@ -43,6 +45,8 @@ module Captchah
|
|
|
43
45
|
:reload_count,
|
|
44
46
|
:reload,
|
|
45
47
|
:css,
|
|
48
|
+
:csp_nonce,
|
|
49
|
+
:required,
|
|
46
50
|
:puzzle_font
|
|
47
51
|
)
|
|
48
52
|
|
|
@@ -58,7 +62,9 @@ module Captchah
|
|
|
58
62
|
reload_payload: reload_payload,
|
|
59
63
|
reload_label: reload_label,
|
|
60
64
|
reload: reload,
|
|
61
|
-
css: css
|
|
65
|
+
css: css,
|
|
66
|
+
csp_nonce: csp_nonce,
|
|
67
|
+
required: required
|
|
62
68
|
)
|
|
63
69
|
end
|
|
64
70
|
|
|
@@ -88,6 +94,8 @@ module Captchah
|
|
|
88
94
|
reload_count: reload_count,
|
|
89
95
|
reload: reload,
|
|
90
96
|
css: css,
|
|
97
|
+
csp_nonce: csp_nonce,
|
|
98
|
+
required: required,
|
|
91
99
|
puzzle_font: puzzle_font
|
|
92
100
|
)
|
|
93
101
|
end
|
|
@@ -13,6 +13,8 @@ module Captchah
|
|
|
13
13
|
reload_label
|
|
14
14
|
reload
|
|
15
15
|
css
|
|
16
|
+
csp_nonce
|
|
17
|
+
required
|
|
16
18
|
].freeze
|
|
17
19
|
|
|
18
20
|
def self.call(*args)
|
|
@@ -49,7 +51,7 @@ module Captchah
|
|
|
49
51
|
def style_tag
|
|
50
52
|
return unless css
|
|
51
53
|
|
|
52
|
-
"<style type='text/css'>
|
|
54
|
+
"<style type='text/css' nonce='#{csp_nonce}'>
|
|
53
55
|
##{container_id} {
|
|
54
56
|
background-color: #f9f9f9;
|
|
55
57
|
border-radius: 2px;
|
|
@@ -81,6 +83,9 @@ module Captchah
|
|
|
81
83
|
margin-top: 11px;
|
|
82
84
|
transform: translateY(-50%);
|
|
83
85
|
}
|
|
86
|
+
##{container_id} .hidden {
|
|
87
|
+
display: none;
|
|
88
|
+
}
|
|
84
89
|
|
|
85
90
|
##{container_id} .captchah-puzzle,
|
|
86
91
|
##{container_id} .captchah-guess {
|
|
@@ -129,6 +134,7 @@ module Captchah
|
|
|
129
134
|
def guess_tag
|
|
130
135
|
'<input ' \
|
|
131
136
|
"type='text' " \
|
|
137
|
+
"#{'required' if required} " \
|
|
132
138
|
"autocomplete='off' " \
|
|
133
139
|
"name='captchah[guess]' " \
|
|
134
140
|
"class='captchah-guess'>"
|
|
@@ -143,15 +149,13 @@ module Captchah
|
|
|
143
149
|
def reload_animation_tag
|
|
144
150
|
'<img ' \
|
|
145
151
|
"src='#{"data:image/gif;base64,#{Base64Images.loader}"}' " \
|
|
146
|
-
"
|
|
147
|
-
"class='captchah-reload-animation'>"
|
|
152
|
+
"class='captchah-reload-animation hidden'>"
|
|
148
153
|
end
|
|
149
154
|
|
|
150
155
|
def reload_tag
|
|
151
156
|
return unless reload
|
|
152
157
|
|
|
153
158
|
'<span ' \
|
|
154
|
-
"onclick='captchah(this)' " \
|
|
155
159
|
"data-payload='#{reload_payload}' " \
|
|
156
160
|
"class='captchah-reload'>" \
|
|
157
161
|
"#{reload_label}" \
|
|
@@ -161,14 +165,14 @@ module Captchah
|
|
|
161
165
|
def javascript_tag
|
|
162
166
|
return unless reload
|
|
163
167
|
|
|
164
|
-
"<script type='text/javascript'>
|
|
165
|
-
var captchah = function(
|
|
168
|
+
"<script type='text/javascript' nonce='#{csp_nonce}'>
|
|
169
|
+
var captchah = function(el) {
|
|
166
170
|
var captchahLoaderAnimation = function(el_show, el_hide){
|
|
167
|
-
|
|
168
|
-
|
|
171
|
+
el_show.classList.remove('hidden');
|
|
172
|
+
el_hide.classList.add('hidden');
|
|
169
173
|
};
|
|
170
174
|
|
|
171
|
-
captchahLoaderAnimation(
|
|
175
|
+
captchahLoaderAnimation(el.previousSibling, el);
|
|
172
176
|
|
|
173
177
|
var xhr = new XMLHttpRequest();
|
|
174
178
|
xhr.open('POST', '/captchah');
|
|
@@ -176,15 +180,25 @@ module Captchah
|
|
|
176
180
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
|
177
181
|
xhr.onload = function() {
|
|
178
182
|
if (xhr.status === 200) {
|
|
179
|
-
|
|
183
|
+
el.parentNode.outerHTML = xhr.responseText;
|
|
180
184
|
}
|
|
181
185
|
else if (xhr.status !== 200) {
|
|
182
186
|
console.log('Error: Unable to change captcha.');
|
|
183
|
-
captchahLoaderAnimation(
|
|
187
|
+
captchahLoaderAnimation(el, el.previousSibling);
|
|
184
188
|
}
|
|
185
189
|
};
|
|
186
|
-
xhr.send(JSON.stringify({captchah:
|
|
190
|
+
xhr.send(JSON.stringify({captchah: el.dataset.payload}));
|
|
187
191
|
};
|
|
192
|
+
|
|
193
|
+
var button = document.querySelector('##{container_id} .captchah-reload');
|
|
194
|
+
var container = document.getElementById('#{container_id}');
|
|
195
|
+
var containerParent = container.parentNode;
|
|
196
|
+
|
|
197
|
+
containerParent.addEventListener('click', function(e) {
|
|
198
|
+
console.log(e);
|
|
199
|
+
if([...e.target.classList].includes('captchah-reload'))
|
|
200
|
+
captchah(e.target);
|
|
201
|
+
});
|
|
188
202
|
</script>"
|
|
189
203
|
end
|
|
190
204
|
|
|
@@ -43,7 +43,7 @@ module Captchah
|
|
|
43
43
|
c.draw("line 0,#{rand(25..35)} 290,30") if difficulty > 1
|
|
44
44
|
c.fill(rgba(color1, opacity))
|
|
45
45
|
c.pointsize(26)
|
|
46
|
-
c.draw("text 82,#{rand(25..40)} '#{truth[3..-1]}'")
|
|
46
|
+
c.draw("text 82,#{rand(25..40)} '#{truth[3..-1]}'") # rubocop:disable Style/SlicingWithRange
|
|
47
47
|
c.draw("line 0,#{rand(10..20)} 400,20") if difficulty > 1
|
|
48
48
|
|
|
49
49
|
if difficulty < 3
|
|
@@ -83,14 +83,11 @@ module Captchah
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
def image
|
|
86
|
-
@image ||=
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
rescue NameError => e
|
|
92
|
-
raise Error, 'Missing MiniMagick.' if e.to_s.include?('MiniMagick')
|
|
93
|
-
end
|
|
86
|
+
@image ||= begin
|
|
87
|
+
base64_image = Base64Images.puzzle_background
|
|
88
|
+
decoded_image = Base64.strict_decode64(base64_image)
|
|
89
|
+
MiniMagick::Image.read(decoded_image)
|
|
90
|
+
end
|
|
94
91
|
end
|
|
95
92
|
|
|
96
93
|
def opacity
|
data/lib/captchah/version.rb
CHANGED
data/lib/captchah.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: captchah
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Evgeni Radev
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-12-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: mini_magick
|
|
@@ -38,35 +38,7 @@ dependencies:
|
|
|
38
38
|
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
|
-
|
|
42
|
-
name: rspec
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '3.8'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '3.8'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rubocop-rails
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '2.3'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '2.3'
|
|
69
|
-
description:
|
|
41
|
+
description:
|
|
70
42
|
email:
|
|
71
43
|
- evgeniradev@gmail.com
|
|
72
44
|
executables: []
|
|
@@ -90,7 +62,7 @@ licenses:
|
|
|
90
62
|
- MIT
|
|
91
63
|
metadata:
|
|
92
64
|
allowed_push_host: https://rubygems.org
|
|
93
|
-
post_install_message:
|
|
65
|
+
post_install_message:
|
|
94
66
|
rdoc_options: []
|
|
95
67
|
require_paths:
|
|
96
68
|
- lib
|
|
@@ -106,9 +78,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
106
78
|
version: '0'
|
|
107
79
|
requirements:
|
|
108
80
|
- You must have ImageMagick or GraphicsMagick installed.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
signing_key:
|
|
81
|
+
rubygems_version: 3.3.7
|
|
82
|
+
signing_key:
|
|
112
83
|
specification_version: 4
|
|
113
84
|
summary: A Rails captcha gem that attempts to determine whether or not a user is human.
|
|
114
85
|
test_files: []
|