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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4aa5d76a22024f7579a41b99405e9766371aba269edcfebf1e34fc4a7bf880db
4
- data.tar.gz: 74e1151d527a58884f3f9190c9156913a7d54c4b70ce4615963a4a1b3db20f4c
3
+ metadata.gz: c226ebf85cdcd6b908667693d90b47f9bb10949793f54bdad53e605f1a1af597
4
+ data.tar.gz: 127d0e0009c52ee2f485df8f37d0d17fcafc6576c7e465d651b974b93d5ab8e6
5
5
  SHA512:
6
- metadata.gz: d9cc0121f8f4a7004ec5873e5f4b2e2d1fc290d26ded59f325df3f91bd18aced57e69552034c8390ec2ca0b918a67d7dcec1bb3e6bc154ed7dbd8e24f030e21a
7
- data.tar.gz: b0d3ccd6a1960e6b232b90341a76098493381458fffe804e3ce177e37ccc99b92ea36f2a00d754e5791f81a33accd1cfc5aa28ab3b6886933b80cd60df54d00c
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', '~> 1.1'
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
  ```
@@ -37,6 +37,7 @@ 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],
40
41
  puzzle_font: payload[:puzzle_font]
41
42
  }
42
43
  end
@@ -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
- "style='display: none;' " \
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(reload) {
166
+ "<script type='text/javascript' nonce='#{csp_nonce}'>
167
+ var captchah = function(el) {
166
168
  var captchahLoaderAnimation = function(el_show, el_hide){
167
- el_hide.style.display='none';
168
- el_show.style.display='inline-block';
169
+ el_show.classList.remove('hidden');
170
+ el_hide.classList.add('hidden');
169
171
  };
170
172
 
171
- captchahLoaderAnimation(reload.previousSibling, reload);
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
- reload.parentNode.outerHTML = xhr.responseText;
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(reload, reload.previousSibling);
185
+ captchahLoaderAnimation(el, el.previousSibling);
184
186
  }
185
187
  };
186
- xhr.send(JSON.stringify({captchah: reload.dataset.payload}));
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
- 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.0'
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.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: 2020-08-24 00:00:00.000000000 Z
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
- - !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: []