captchah 1.1.0 → 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: e32ca320385d97c027168d4b8d6bb9ef7a7467fa6c904c0a6c6bcf5d291c1ea8
4
- data.tar.gz: 85d5bc27cb10e3851d321654287732eb9187d4a9f1092366517d7a1f502118b3
3
+ metadata.gz: c226ebf85cdcd6b908667693d90b47f9bb10949793f54bdad53e605f1a1af597
4
+ data.tar.gz: 127d0e0009c52ee2f485df8f37d0d17fcafc6576c7e465d651b974b93d5ab8e6
5
5
  SHA512:
6
- metadata.gz: d8fc2e383e99d1b52ca20b737d7c93a1b59ce6bc07ead0e43840b457edc283907a8bd45552cbe5c3fa568c2d63a1d1130a6a58feedc3159ca6aa397ee14bb598
7
- data.tar.gz: 610f90f9fd59f29ca1e60c1a20e19fac67de9c9adba2e33ee4b71e7ff1865bcf4254fbea236a1b72fe6f254c9e75c8a375823e30a67c4fb454664fd894e708ce
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.0'
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,72 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: captchah
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
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-03-30 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
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '5'
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '5'
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:
40
+ version: '0'
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: []