captchah 1.1.1 → 2.0.0

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