recaptcha 5.16.0 → 5.18.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: 66a204367215f4ea083958e3f322fc7f2955e7481c09a5cadb1f57cf3acd187e
4
- data.tar.gz: b6e7c0417b4d81bd0e7f15f7837968fbf65096e5d4a6286e297f1bbc030b7744
3
+ metadata.gz: 41990aba0d4786ebf87da392ac025d8725d5ca5f30c9e1018b0cf2197f8efada
4
+ data.tar.gz: 34b8d6b1dc5e34d9349c64f3a2d2c77f0cc67b2570077788e9e128d2a855a927
5
5
  SHA512:
6
- metadata.gz: 2c9162ae165cfb00d6ed03f91ef832e90e6bc357cfc31ee71a1a52311910fb183eb40a50967fa04f729243924c1fc9defad7d2030353ccc895b31e7bdb28e210
7
- data.tar.gz: 8da70c71cb13ce29d7ddfa956795dc2bdcff53ea8aeaa64ad6495e5b4cfa40d82bfd90d9870220173a955e095346ba8f6e451364278af5887e4360b6d5601e07
6
+ metadata.gz: b3d440a27b41351c81ca9ad94368ea5485d1a1bed05092c011bbfe358cb8c829e89bc295a52a0e323333fc1a3135384149bd3ec13f0cd4c6a8fcc09184a3d4d4
7
+ data.tar.gz: f176ce1beb9764f342dedc8c36cbc40b248ae230c758f2df3053c891c5616b4898e435fde8251da03ff5e690b535bef64bdc7e2257aadc8755f7f0e4efbddbfd
data/CHANGELOG.md CHANGED
@@ -1,4 +1,10 @@
1
1
  ## Next
2
+ * Add key setup to v3 example in README
3
+ * Remove unnecessary id from textarea - This was unused and may cause accessability concerns if there is more than one recaptcha on the page due to multiple elements with the same id
4
+ * Update to latest version of rubocop
5
+ * Drop support for Ruby 2.7; add Ruby 3.3
6
+ * Add i18n: de, es, it, pt, pt-BR
7
+ * Added recaptcha_failure_reason
2
8
 
3
9
  ## 5.16.0
4
10
  * Allow usage of `options[:turbo]` as well as `options[:turbolinks]` for `recaptcha_v3`
data/README.md CHANGED
@@ -78,6 +78,10 @@ export RECAPTCHA_ENTERPRISE_API_KEY = 'AIzvFyE3TU-g4K_Kozr9F1smEzZSGBVOfLKyup
78
78
  export RECAPTCHA_ENTERPRISE_PROJECT_ID = 'my-project'
79
79
  ```
80
80
 
81
+ _note:_ you'll still have to provide `RECAPTCHA_SITE_KEY`, which will hold the value of your enterprise recaptcha key id. You will not need to provide a `RECAPTCHA_SECRET_KEY`, however.
82
+
83
+ `RECAPTCHA_ENTERPRISE_API_KEY` is the enterprise key of your Google Cloud Project, which you can generate here: https://console.cloud.google.com/apis/credentials.
84
+
81
85
  Add `recaptcha_tags` to the forms you want to protect:
82
86
 
83
87
  ```erb
@@ -126,7 +130,7 @@ The following options are available:
126
130
  | `:site_key` | Override site API key from configuration |
127
131
  | `:error` | Override the error code returned from the reCAPTCHA API (default: `nil`) |
128
132
  | `:size` | Specify a size (default: `nil`) |
129
- | `:nonce` | Optional. Sets nonce attribute for script. Can be generated via `SecureRandom.base64(32)`. (default: `nil`) |
133
+ | `:nonce` | Optional. Sets nonce attribute for script. Can be generated via `SecureRandom.base64(32)`. Use `content_security_policy_nonce` if you have `config.content_security_policy_nonce_generator` set in Rails. (default: `nil`) |
130
134
  | `:id` | Specify an html id attribute (default: `nil`) |
131
135
  | `:callback` | Optional. Name of success callback function, executed when the user submits a successful response |
132
136
  | `:expired_callback` | Optional. Name of expiration callback function, executed when the reCAPTCHA response expires and the user needs to re-verify. |
@@ -204,7 +208,7 @@ It also accepts most of the options that `recaptcha_tags` accepts, including the
204
208
  | Option | Description |
205
209
  |---------------------|-------------|
206
210
  | `:site_key` | Override site API key from configuration |
207
- | `:nonce` | Optional. Sets nonce attribute for script tag. Can be generated via `SecureRandom.base64(32)`. (default: `nil`) |
211
+ | `:nonce` | Optional. Sets nonce attribute for script tag. Can be generated via `SecureRandom.base64(32)`. Use `content_security_policy_nonce` if you have `config.content_security_policy_nonce_generator` set in Rails. (default: `nil`) |
208
212
  | `:id` | Specify an html id attribute (default: `nil`) |
209
213
  | `:script` | Same as setting both `:inline_script` and `:external_script`. If you only need one or the other, use `:inline_script` and `:external_script` instead. |
210
214
  | `:callback` | Optional. Name of success callback function, executed when the user submits a successful response |
@@ -305,6 +309,14 @@ With v3, you can let all users log in without any intervention at all if their s
305
309
  threshold, and only show a v2 checkbox recaptcha challenge (fall back to v2) if it is below the
306
310
  threshold:
307
311
 
312
+ This example sets v2 keys through environment variables. For more information on how to set up keys, please refer to the [documentation here](#alternative-api-key-setup).
313
+
314
+ ```bash
315
+ # .env
316
+ RECAPTCHA_SITE_KEY=6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy
317
+ RECAPTCHA_SECRET_KEY=6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx
318
+ ```
319
+
308
320
  ```erb
309
321
 
310
322
  <% if @show_checkbox_recaptcha %>
@@ -420,7 +432,7 @@ but only accepts the following options:
420
432
  |---------------------|-------------|
421
433
  | `:site_key` | Override site API key |
422
434
  | `:action` | The name of the [reCAPTCHA action](https://developers.google.com/recaptcha/docs/v3#actions). Actions are not case-sensitive and may only contain alphanumeric characters, slashes, and underscores, and must not be user-specific. |
423
- | `:nonce` | Optional. Sets nonce attribute for script. Can be generated via `SecureRandom.base64(32)`. (default: `nil`) |
435
+ | `:nonce` | Optional. Sets nonce attribute for script. Can be generated via `SecureRandom.base64(32)`. Use `content_security_policy_nonce` if you have `config.content_security_policy_nonce_generator` set in Rails. (default: `nil`) |
424
436
  | `: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. |
425
437
  | `:id` | Specify a unique `id` attribute for the `<input>` element if using `element: :input`. (default: `"g-recaptcha-response-data-"` + `action`) |
426
438
  | `:name` | Specify a unique `name` attribute for the `<input>` element if using `element: :input`. (default: `g-recaptcha-response-data[action]`) |
@@ -476,7 +488,7 @@ are passed as a hash under `params['g-recaptcha-response-data']` with the action
476
488
  It is recommended to pass `external_script: false` on all but one of the calls to
477
489
  `recaptcha` since you only need to include the script tag once for a given `site_key`.
478
490
 
479
- ## `recaptcha_reply`
491
+ ## `recaptcha_reply` and `recaptcha_failure_reason`
480
492
 
481
493
  After `verify_recaptcha` has been called, you can call `recaptcha_reply` to get the raw reply from recaptcha. This can allow you to get the exact score returned by recaptcha should you need it.
482
494
 
@@ -492,6 +504,8 @@ end
492
504
 
493
505
  `recaptcha_reply` will return `nil` if the the reply was not yet fetched.
494
506
 
507
+ `recaptcha_failure_reason` will return information if verification failed. E.g. if params was wrong or api resulted some error-codes.
508
+
495
509
  ## I18n support
496
510
 
497
511
  reCAPTCHA supports the I18n gem (it comes with English translations)
@@ -17,6 +17,11 @@ module Recaptcha
17
17
 
18
18
  begin
19
19
  verified = if Recaptcha.invalid_response?(recaptcha_response)
20
+ @_recaptcha_failure_reason = if recaptcha_response.nil?
21
+ "No recaptcha response/param(:action) found."
22
+ else
23
+ "Recaptcha response/param(:action) was invalid."
24
+ end
20
25
  false
21
26
  else
22
27
  unless options[:skip_remote_ip]
@@ -26,10 +31,21 @@ module Recaptcha
26
31
 
27
32
  success, @_recaptcha_reply =
28
33
  Recaptcha.verify_via_api_call(recaptcha_response, options.merge(with_reply: true))
34
+ unless success
35
+ @_recaptcha_failure_reason = if @_recaptcha_reply["score"] &&
36
+ @_recaptcha_reply["score"].to_f < options[:minimum_score].to_f
37
+ "Recaptcha score didn't exceed the minimum: #{@_recaptcha_reply["score"]} < #{options[:minimum_score]}."
38
+ elsif @_recaptcha_reply['error-codes']
39
+ "Recaptcha api call returned with error-codes: #{@_recaptcha_reply['error-codes']}."
40
+ else
41
+ "Recaptcha failure after api call. Api reply: #{@_recaptcha_reply}."
42
+ end
43
+ end
29
44
  success
30
45
  end
31
46
 
32
47
  if verified
48
+ @_recaptcha_failure_reason = nil
33
49
  flash.delete(:recaptcha_error) if recaptcha_flash_supported? && !model
34
50
  true
35
51
  else
@@ -41,6 +57,7 @@ module Recaptcha
41
57
  false
42
58
  end
43
59
  rescue Timeout::Error
60
+ @_recaptcha_failure_reason = "Recaptcha server unreachable."
44
61
  if Recaptcha.configuration.handle_timeouts_gracefully
45
62
  recaptcha_error(
46
63
  model,
@@ -57,13 +74,17 @@ module Recaptcha
57
74
  end
58
75
 
59
76
  def verify_recaptcha!(options = {})
60
- verify_recaptcha(options) || raise(VerifyError)
77
+ verify_recaptcha(options) || raise(VerifyError, @_recaptcha_failure_reason)
61
78
  end
62
79
 
63
80
  def recaptcha_reply
64
81
  @_recaptcha_reply if defined?(@_recaptcha_reply)
65
82
  end
66
83
 
84
+ def recaptcha_failure_reason
85
+ @_recaptcha_failure_reason
86
+ end
87
+
67
88
  def recaptcha_error(model, attribute, message)
68
89
  if model
69
90
  model.errors.add(attribute, message)
@@ -74,7 +74,7 @@ module Recaptcha
74
74
  <div style="width: 300px; height: 60px; border-style: none;
75
75
  bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px;
76
76
  background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
77
- <textarea id="g-recaptcha-response" name="g-recaptcha-response"
77
+ <textarea name="g-recaptcha-response"
78
78
  class="g-recaptcha-response"
79
79
  style="width: 250px; height: 40px; border: 1px solid #c1c1c1;
80
80
  margin: 10px 25px; padding: 0px; resize: none;">
@@ -140,6 +140,7 @@ module Recaptcha
140
140
  skip_script = (options.delete(:script) == false) || (options.delete(:external_script) == false)
141
141
  ui = options.delete(:ui)
142
142
  options.delete(:ignore_no_element)
143
+ options.delete(:inline_script)
143
144
 
144
145
  data_attribute_keys = [:badge, :theme, :type, :callback, :expired_callback, :error_callback, :size]
145
146
  data_attribute_keys << :tabindex unless ui == :button
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Recaptcha
4
- VERSION = '5.16.0'
4
+ VERSION = '5.18.0'
5
5
  end
@@ -0,0 +1,5 @@
1
+ de:
2
+ recaptcha:
3
+ errors:
4
+ verification_failed: Die reCAPTCHA-Überprüfung ist fehlgeschlagen, bitte versuchen Sie es erneut.
5
+ recaptcha_unreachable: Oops, wir konnten Ihre reCAPTCHA-Antwort nicht validieren. Bitte versuchen Sie es erneut.
@@ -0,0 +1,5 @@
1
+ es:
2
+ recaptcha:
3
+ errors:
4
+ verification_failed: La verificación de reCAPTCHA falló, por favor intente de nuevo.
5
+ recaptcha_unreachable: Ups, no pudimos validar su respuesta de reCAPTCHA. Por favor intente de nuevo.
@@ -0,0 +1,5 @@
1
+ it:
2
+ recaptcha:
3
+ errors:
4
+ verification_failed: La verifica reCAPTCHA non è riuscita, si prega di riprovare.
5
+ recaptcha_unreachable: Ops, non siamo riusciti a convalidare la tua risposta reCAPTCHA. Per favore riprova.
@@ -0,0 +1,5 @@
1
+ pt-BR:
2
+ recaptcha:
3
+ errors:
4
+ verification_failed: A verificação do reCAPTCHA falhou, por favor, tente novamente.
5
+ recaptcha_unreachable: Oops, não conseguimos validar sua resposta do reCAPTCHA. Por favor, tente novamente.
@@ -0,0 +1,5 @@
1
+ pt:
2
+ recaptcha:
3
+ errors:
4
+ verification_failed: A verificação do reCAPTCHA falhou, por favor, tente novamente.
5
+ recaptcha_unreachable: Oops, não conseguimos validar sua resposta do reCAPTCHA. Por favor, tente novamente.
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.16.0
4
+ version: 5.18.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: 2023-10-24 00:00:00.000000000 Z
11
+ date: 2024-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mocha
@@ -140,10 +140,15 @@ files:
140
140
  - lib/recaptcha/rails.rb
141
141
  - lib/recaptcha/railtie.rb
142
142
  - lib/recaptcha/version.rb
143
+ - rails/locales/de.yml
143
144
  - rails/locales/en.yml
145
+ - rails/locales/es.yml
144
146
  - rails/locales/fr.yml
147
+ - rails/locales/it.yml
145
148
  - rails/locales/ja.yml
146
149
  - rails/locales/nl.yml
150
+ - rails/locales/pt-BR.yml
151
+ - rails/locales/pt.yml
147
152
  homepage: http://github.com/ambethia/recaptcha
148
153
  licenses:
149
154
  - MIT
@@ -157,14 +162,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
162
  requirements:
158
163
  - - ">="
159
164
  - !ruby/object:Gem::Version
160
- version: 2.7.0
165
+ version: 3.0.0
161
166
  required_rubygems_version: !ruby/object:Gem::Requirement
162
167
  requirements:
163
168
  - - ">="
164
169
  - !ruby/object:Gem::Version
165
170
  version: '0'
166
171
  requirements: []
167
- rubygems_version: 3.3.3
172
+ rubygems_version: 3.4.10
168
173
  signing_key:
169
174
  specification_version: 4
170
175
  summary: Helpers for the reCAPTCHA API