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 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: []