captchah 1.1.1 → 2.0.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.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/app/controllers/captchah/captchah_controller.rb +1 -0
- data/lib/captchah/generators/captcha.rb +5 -1
- data/lib/captchah/generators/html.rb +24 -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: c226ebf85cdcd6b908667693d90b47f9bb10949793f54bdad53e605f1a1af597
|
4
|
+
data.tar.gz: 127d0e0009c52ee2f485df8f37d0d17fcafc6576c7e465d651b974b93d5ab8e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd3c92604404846f968ea25b72c7f2521d452e0e2e1ebecb65d017c8d79d8cc291a0c278c6ed48d96ed9f7dde7808e31b41958701889d86d212c802db00fd654
|
7
|
+
data.tar.gz: bf23acc062ecebefb854abe0e3f54810227588f0edb4d1878dc0189b7449db7261c91228e195246c358dd9daf2e5624b6e72f1bfe7e02cb7ef02db484662d6ee
|
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,7 @@ 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
|
84
85
|
puzzle_font: 'Verdana' # String value Default: 'Verdana'
|
85
86
|
)
|
86
87
|
```
|
@@ -27,6 +27,7 @@ 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]
|
30
31
|
@puzzle_font = args[:puzzle_font] || DEFAULT_PUZZLE_FONT
|
31
32
|
end
|
32
33
|
|
@@ -43,6 +44,7 @@ module Captchah
|
|
43
44
|
:reload_count,
|
44
45
|
:reload,
|
45
46
|
:css,
|
47
|
+
:csp_nonce,
|
46
48
|
:puzzle_font
|
47
49
|
)
|
48
50
|
|
@@ -58,7 +60,8 @@ module Captchah
|
|
58
60
|
reload_payload: reload_payload,
|
59
61
|
reload_label: reload_label,
|
60
62
|
reload: reload,
|
61
|
-
css: css
|
63
|
+
css: css,
|
64
|
+
csp_nonce: csp_nonce
|
62
65
|
)
|
63
66
|
end
|
64
67
|
|
@@ -88,6 +91,7 @@ module Captchah
|
|
88
91
|
reload_count: reload_count,
|
89
92
|
reload: reload,
|
90
93
|
css: css,
|
94
|
+
csp_nonce: csp_nonce,
|
91
95
|
puzzle_font: puzzle_font
|
92
96
|
)
|
93
97
|
end
|
@@ -13,6 +13,7 @@ module Captchah
|
|
13
13
|
reload_label
|
14
14
|
reload
|
15
15
|
css
|
16
|
+
csp_nonce
|
16
17
|
].freeze
|
17
18
|
|
18
19
|
def self.call(*args)
|
@@ -49,7 +50,7 @@ module Captchah
|
|
49
50
|
def style_tag
|
50
51
|
return unless css
|
51
52
|
|
52
|
-
"<style type='text/css'>
|
53
|
+
"<style type='text/css' nonce='#{csp_nonce}'>
|
53
54
|
##{container_id} {
|
54
55
|
background-color: #f9f9f9;
|
55
56
|
border-radius: 2px;
|
@@ -81,6 +82,9 @@ module Captchah
|
|
81
82
|
margin-top: 11px;
|
82
83
|
transform: translateY(-50%);
|
83
84
|
}
|
85
|
+
##{container_id} .hidden {
|
86
|
+
display: none;
|
87
|
+
}
|
84
88
|
|
85
89
|
##{container_id} .captchah-puzzle,
|
86
90
|
##{container_id} .captchah-guess {
|
@@ -143,15 +147,13 @@ module Captchah
|
|
143
147
|
def reload_animation_tag
|
144
148
|
'<img ' \
|
145
149
|
"src='#{"data:image/gif;base64,#{Base64Images.loader}"}' " \
|
146
|
-
"
|
147
|
-
"class='captchah-reload-animation'>"
|
150
|
+
"class='captchah-reload-animation hidden'>"
|
148
151
|
end
|
149
152
|
|
150
153
|
def reload_tag
|
151
154
|
return unless reload
|
152
155
|
|
153
156
|
'<span ' \
|
154
|
-
"onclick='captchah(this)' " \
|
155
157
|
"data-payload='#{reload_payload}' " \
|
156
158
|
"class='captchah-reload'>" \
|
157
159
|
"#{reload_label}" \
|
@@ -161,14 +163,14 @@ module Captchah
|
|
161
163
|
def javascript_tag
|
162
164
|
return unless reload
|
163
165
|
|
164
|
-
"<script type='text/javascript'>
|
165
|
-
var captchah = function(
|
166
|
+
"<script type='text/javascript' nonce='#{csp_nonce}'>
|
167
|
+
var captchah = function(el) {
|
166
168
|
var captchahLoaderAnimation = function(el_show, el_hide){
|
167
|
-
|
168
|
-
|
169
|
+
el_show.classList.remove('hidden');
|
170
|
+
el_hide.classList.add('hidden');
|
169
171
|
};
|
170
172
|
|
171
|
-
captchahLoaderAnimation(
|
173
|
+
captchahLoaderAnimation(el.previousSibling, el);
|
172
174
|
|
173
175
|
var xhr = new XMLHttpRequest();
|
174
176
|
xhr.open('POST', '/captchah');
|
@@ -176,15 +178,25 @@ module Captchah
|
|
176
178
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
177
179
|
xhr.onload = function() {
|
178
180
|
if (xhr.status === 200) {
|
179
|
-
|
181
|
+
el.parentNode.outerHTML = xhr.responseText;
|
180
182
|
}
|
181
183
|
else if (xhr.status !== 200) {
|
182
184
|
console.log('Error: Unable to change captcha.');
|
183
|
-
captchahLoaderAnimation(
|
185
|
+
captchahLoaderAnimation(el, el.previousSibling);
|
184
186
|
}
|
185
187
|
};
|
186
|
-
xhr.send(JSON.stringify({captchah:
|
188
|
+
xhr.send(JSON.stringify({captchah: el.dataset.payload}));
|
187
189
|
};
|
190
|
+
|
191
|
+
var button = document.querySelector('##{container_id} .captchah-reload');
|
192
|
+
var container = document.getElementById('#{container_id}');
|
193
|
+
var containerParent = container.parentNode;
|
194
|
+
|
195
|
+
containerParent.addEventListener('click', function(e) {
|
196
|
+
console.log(e);
|
197
|
+
if([...e.target.classList].includes('captchah-reload'))
|
198
|
+
captchah(e.target);
|
199
|
+
});
|
188
200
|
</script>"
|
189
201
|
end
|
190
202
|
|
@@ -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.0
|
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-20 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: []
|