recaptcha 5.1.0 → 5.4.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: 424f86ca2326f83ccc3a2210b5c23a3341a16109a8297aa11dafc4aca051c21e
4
- data.tar.gz: 2d6d8dbc65ba54bc3289e15d2f7635c90b521f2d3e3c04d04a673c3f65a14547
3
+ metadata.gz: d2f048639c2186d2b96ee2ee90a94b928443be2d068e9a4cb5fc3c840f0b2673
4
+ data.tar.gz: 35215a7a9ebdceba2512c01c5d52a19cdf0afb1763045222a81e1a7203771793
5
5
  SHA512:
6
- metadata.gz: fb30c399fb7b38fa0e0f3a8f59b146cdc7da3632f9e1d1a2716db5c1939c288e7993902f1c8f4c9a2ad41c4e8284c508d2e6b253da4a77366cd119a545f5b92f
7
- data.tar.gz: 553c4b1672b8c60d42d0774397d4ade4dc5e33cb574bb8b113ffa4573a0e08af38e3bcee5808e7f326f8179496e18c9e6facc828f46b7e242ec8fd16435cfa5c
6
+ metadata.gz: fc3b564d5f7825ee75f1c5cad3df00f7712b7076a2616f4f8b4bd7ca14ee33d0fa7063555a0544773bf4796922a3a9672ab14b1fc53e29920ff5bfeb956f9f57
7
+ data.tar.gz: e2c2a17557f57ac6343cce586e002647c8e70136786fd3660f60ed4dba6f689761935c883ea37b9adbae1829d4187c28fe7e3467bebc35670e27ee371aecad0b
@@ -1,5 +1,11 @@
1
1
  ## Next
2
2
 
3
+ ## 5.3.0
4
+ * turbolinks support
5
+
6
+ ## 5.2.0
7
+ * remove dependency on rails methods
8
+
3
9
  ## 5.1.0
4
10
  * Added default translations for rails/i18n
5
11
  * use recaptcha.net for the script tag
data/README.md CHANGED
@@ -147,7 +147,7 @@ Some of the options available:
147
147
  | `:message` | Custom error message.
148
148
  | `:secret_key` | Override the secret API key from the configuration.
149
149
  | `:timeout` | The number of seconds to wait for reCAPTCHA servers before give up. (default: `3`)
150
- | `:response` | Custom response parameter. (default: `params['g-recaptcha-response']`)
150
+ | `:response` | Custom response parameter. (default: `params['g-recaptcha-response-data']`)
151
151
  | `:hostname` | Expected hostname or a callable that validates the hostname, see [domain validation](https://developers.google.com/recaptcha/docs/domain_validation) and [hostname](https://developers.google.com/recaptcha/docs/verify#api-response) docs. (default: `nil`, but can be changed by setting `config.hostname`)
152
152
  | `:env` | Current environment. The request to verify will be skipped if the environment is specified in configuration under `skip_verify_env`
153
153
 
@@ -344,7 +344,7 @@ function). This lets you include `recaptcha_v3` within a `<form>` tag and have i
344
344
  submit the token as part of the form submission.
345
345
 
346
346
  Note: reCAPTCHA actually already adds its own hidden tag, like `<textarea
347
- id="g-recaptcha-response-100000" name="g-recaptcha-response" class="g-recaptcha-response">`,
347
+ id="g-recaptcha-response-data-100000" name="g-recaptcha-response-data" class="g-recaptcha-response">`,
348
348
  immediately ater the reCAPTCHA badge in the bottom right of the page — but since it is not inside of
349
349
  any `<form>` element, and since it already passes the token to the callback, this hidden `textarea`
350
350
  isn't helpful to us.
@@ -353,7 +353,7 @@ If you need to submit the response token to the server in a different way than v
353
353
  submit, such as via [Ajax](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) or [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API),
354
354
  then you can either:
355
355
  1. just extract the token out of the hidden `<input>` or `<textarea>` (both of which will have a
356
- predictable name/id), like `document.getElementById('g-recaptcha-response-my-action').value`, or
356
+ predictable name/id), like `document.getElementById('g-recaptcha-response-data-my-action').value`, or
357
357
  2. write and specify a custom `callback` function. You may also want to pass `element: false` if you
358
358
  don't have a use for the hidden input element.
359
359
 
@@ -388,11 +388,12 @@ but only accepts the following options:
388
388
  | `:action` | The name of the [reCAPTCHA action](https://developers.google.com/recaptcha/docs/v3#actions). Actions may only contain alphanumeric characters and slashes, and must not be user-specific. |
389
389
  | `:nonce` | Optional. Sets nonce attribute for script. Can be generated via `SecureRandom.base64(32)`. (default: `nil`) |
390
390
  | `:callback` | Name of callback function to call with the token. When `element` is `:input`, this defaults to a function named `setInputWithRecaptchaResponseTokenFor#{sanitize_action(action)}` that sets the value of the hidden input to the token. |
391
- | `:id` | Specify a unique `id` attribute for the `<input>` element if using `element: :input`. (default: `"g-recaptcha-response-"` + `action`) |
392
- | `:name` | Specify a unique `name` attribute for the `<input>` element if using `element: :input`. (default: `g-recaptcha-response[action]`) |
391
+ | `:id` | Specify a unique `id` attribute for the `<input>` element if using `element: :input`. (default: `"g-recaptcha-response-data-"` + `action`) |
392
+ | `:name` | Specify a unique `name` attribute for the `<input>` element if using `element: :input`. (default: `g-recaptcha-response-data[action]`) |
393
393
  | `:script` | Same as setting both `:inline_script` and `:external_script`. (default: `true`). |
394
394
  | `:inline_script` | If `true`, adds an inline script tag that calls `grecaptcha.execute` for the given `site_key` and `action` and calls the `callback` with the resulting response token. Pass `false` if you want to handle calling `grecaptcha.execute` yourself. (default: `true`) |
395
395
  | `:element` | The element to render, if any (default: `:input`)<br/>`:input`: Renders a hidden `<input type="hidden">` tag. The value of this will be set to the response token by the default `setInputWithRecaptchaResponseTokenFor{action}` callback.<br/>`false`: Doesn't render any tag. You'll have to add a custom callback that does something with the token. |
396
+ | `:turbolinks` | If `true`, calls the js function which executes reCAPTCHA after all the dependencies have been loaded. This cannot be used with the js param `:onload`. This makes reCAPTCHAv3 usable with turbolinks. |
396
397
 
397
398
  [JavaScript resource (api.js) parameters](https://developers.google.com/recaptcha/docs/invisible#js_param):
398
399
 
@@ -434,7 +435,7 @@ result_b = verify_recaptcha(action: 'b')
434
435
  ```
435
436
 
436
437
  Because the response tokens for multiple actions may be submitted together in the same request, they
437
- are passed as a hash under `params['g-recaptcha-response']` with the action as the key.
438
+ are passed as a hash under `params['g-recaptcha-response-data']` with the action as the key.
438
439
 
439
440
  It is recommended to pass `external_script: false` on all but one of the calls to
440
441
  `recaptcha` since you only need to include the script tag once for a given `site_key`.
@@ -501,4 +502,3 @@ verify_recaptcha secret_key: '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
501
502
  - Check out the [wiki](https://github.com/ambethia/recaptcha/wiki) and leave whatever you found valuable there.
502
503
  - [Add multiple widgets to the same page](https://github.com/ambethia/recaptcha/wiki/Add-multiple-widgets-to-the-same-page)
503
504
  - [Use Recaptcha with Devise](https://github.com/plataformatec/devise/wiki/How-To:-Use-Recaptcha-with-Devise)
504
-
@@ -99,7 +99,8 @@ module Recaptcha
99
99
  end
100
100
  end
101
101
 
102
- def self.api_verification(verify_hash, timeout: DEFAULT_TIMEOUT)
102
+ def self.api_verification(verify_hash, timeout: nil)
103
+ timeout ||= DEFAULT_TIMEOUT
103
104
  http = if configuration.proxy
104
105
  proxy_server = URI.parse(configuration.proxy)
105
106
  Net::HTTP::Proxy(proxy_server.host, proxy_server.port, proxy_server.user, proxy_server.password)
@@ -75,7 +75,7 @@ module Recaptcha
75
75
  # the key.
76
76
  # @return [String] A response token if one was passed in the params; otherwise, `''`
77
77
  def recaptcha_response_token(action = nil)
78
- response_param = params['g-recaptcha-response']
78
+ response_param = params['g-recaptcha-response-data']
79
79
  if response_param&.respond_to?(:to_h) # Includes ActionController::Parameters
80
80
  response_param[action].to_s
81
81
  else
@@ -10,8 +10,9 @@ module Recaptcha
10
10
  def self.recaptcha_v3(options = {})
11
11
  site_key = options[:site_key] ||= Recaptcha.configuration.site_key!
12
12
  action = options.delete(:action) || raise(Recaptcha::RecaptchaError, 'action is required')
13
- id = options.delete(:id) || "g-recaptcha-response-" + dasherize_action(action)
14
- name = options.delete(:name) || "g-recaptcha-response[#{action}]"
13
+ id = options.delete(:id) || "g-recaptcha-response-data-" + dasherize_action(action)
14
+ name = options.delete(:name) || "g-recaptcha-response-data[#{action}]"
15
+ turbolinks = options.delete(:turbolinks)
15
16
  options[:render] = site_key
16
17
  options[:script_async] ||= false
17
18
  options[:script_defer] ||= false
@@ -22,8 +23,13 @@ module Recaptcha
22
23
  end
23
24
  options[:class] = "g-recaptcha-response #{options[:class]}"
24
25
 
26
+ if turbolinks
27
+ options[:onload] = recaptcha_v3_execute_function_name(action)
28
+ end
25
29
  html, tag_attributes = components(options)
26
- if recaptcha_v3_inline_script?(options)
30
+ if turbolinks
31
+ html << recaptcha_v3_onload_script(site_key, action, callback, id, options)
32
+ elsif recaptcha_v3_inline_script?(options)
27
33
  html << recaptcha_v3_inline_script(site_key, action, callback, id, options)
28
34
  end
29
35
  case element
@@ -181,7 +187,6 @@ module Recaptcha
181
187
  function #{recaptcha_v3_execute_function_name(action)}() {
182
188
  grecaptcha.ready(function() {
183
189
  grecaptcha.execute('#{site_key}', {action: '#{action}'}).then(function(token) {
184
- //console.log('#{id}', token)
185
190
  #{callback}('#{id}', token)
186
191
  });
187
192
  });
@@ -205,6 +210,24 @@ module Recaptcha
205
210
  HTML
206
211
  end
207
212
 
213
+ private_class_method def self.recaptcha_v3_onload_script(site_key, action, callback, id, options = {})
214
+ nonce = options[:nonce]
215
+ nonce_attr = " nonce='#{nonce}'" if nonce
216
+
217
+ <<-HTML
218
+ <script#{nonce_attr}>
219
+ function #{recaptcha_v3_execute_function_name(action)}() {
220
+ grecaptcha.ready(function() {
221
+ grecaptcha.execute('#{site_key}', {action: '#{action}'}).then(function(token) {
222
+ #{callback}('#{id}', token)
223
+ });
224
+ });
225
+ };
226
+ #{recaptcha_v3_define_default_callback(callback) if recaptcha_v3_define_default_callback?(callback, action, options)}
227
+ </script>
228
+ HTML
229
+ end
230
+
208
231
  private_class_method def self.recaptcha_v3_inline_script?(options)
209
232
  !Recaptcha.skip_env?(options[:env]) &&
210
233
  options[:script] != false &&
@@ -217,7 +240,6 @@ module Recaptcha
217
240
  var element = document.getElementById(id);
218
241
  element.value = token;
219
242
  }
220
- </script>
221
243
  HTML
222
244
  end
223
245
 
@@ -283,13 +305,13 @@ module Recaptcha
283
305
  # Returns a camelized string that is safe for use in a JavaScript variable/function name.
284
306
  # sanitize_action_for_js('my/action') => 'MyAction'
285
307
  private_class_method def self.sanitize_action_for_js(action)
286
- action.to_s.gsub(/\W/, '_').camelize
308
+ action.to_s.gsub(/\W/, '_').split(/\/|_/).map(&:capitalize).join
287
309
  end
288
310
 
289
311
  # Returns a dasherized string that is safe for use as an HTML ID
290
312
  # dasherize_action('my/action') => 'my-action'
291
313
  private_class_method def self.dasherize_action(action)
292
- action.to_s.gsub(/\W/, '-').dasherize
314
+ action.to_s.gsub(/\W/, '-').tr('_', '-')
293
315
  end
294
316
 
295
317
  private_class_method def self.hash_to_query(hash)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Recaptcha
4
- VERSION = '5.1.0'
4
+ VERSION = '5.4.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recaptcha
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason L Perry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-06 00:00:00.000000000 Z
11
+ date: 2020-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json