captchah 1.1.1 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4aa5d76a22024f7579a41b99405e9766371aba269edcfebf1e34fc4a7bf880db
4
- data.tar.gz: 74e1151d527a58884f3f9190c9156913a7d54c4b70ce4615963a4a1b3db20f4c
3
+ metadata.gz: 2f3926fc6264e56237671ce4eb5b8d5e22f1f2c06651ffcd1280476666c7278a
4
+ data.tar.gz: 9a95960a66fb60c5f3892b4af08644fecfa33280ef9e2da5f346986c2677ea85
5
5
  SHA512:
6
- metadata.gz: d9cc0121f8f4a7004ec5873e5f4b2e2d1fc290d26ded59f325df3f91bd18aced57e69552034c8390ec2ca0b918a67d7dcec1bb3e6bc154ed7dbd8e24f030e21a
7
- data.tar.gz: b0d3ccd6a1960e6b232b90341a76098493381458fffe804e3ce177e37ccc99b92ea36f2a00d754e5791f81a33accd1cfc5aa28ab3b6886933b80cd60df54d00c
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', '~> 1.1'
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
  ```
@@ -37,6 +37,8 @@ module Captchah
37
37
  reload_count: payload[:reload_count] + 1,
38
38
  reload: payload[:reload],
39
39
  css: payload[:css],
40
+ csp_nonce: payload[:csp_nonce],
41
+ required: payload[:required],
40
42
  puzzle_font: payload[:puzzle_font]
41
43
  }
42
44
  end
@@ -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
- "style='display: none;' " \
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(reload) {
168
+ "<script type='text/javascript' nonce='#{csp_nonce}'>
169
+ var captchah = function(el) {
166
170
  var captchahLoaderAnimation = function(el_show, el_hide){
167
- el_hide.style.display='none';
168
- el_show.style.display='inline-block';
171
+ el_show.classList.remove('hidden');
172
+ el_hide.classList.add('hidden');
169
173
  };
170
174
 
171
- captchahLoaderAnimation(reload.previousSibling, reload);
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
- reload.parentNode.outerHTML = xhr.responseText;
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(reload, reload.previousSibling);
187
+ captchahLoaderAnimation(el, el.previousSibling);
184
188
  }
185
189
  };
186
- xhr.send(JSON.stringify({captchah: reload.dataset.payload}));
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
- begin
88
- base64_image = Base64Images.puzzle_background
89
- decoded_image = Base64.strict_decode64(base64_image)
90
- MiniMagick::Image.read(decoded_image)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Captchah
4
- VERSION = '1.1.1'
4
+ VERSION = '2.0.1'
5
5
  end
data/lib/captchah.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'mini_magick'
3
4
  require 'captchah/version'
4
5
  require 'captchah/generators/html'
5
6
  require 'captchah/generators/puzzle'
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: 1.1.1
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: 2020-08-24 00:00:00.000000000 Z
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
- - !ruby/object:Gem::Dependency
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
- rubyforge_project:
110
- rubygems_version: 2.7.9
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: []