recaptcha 5.17.1 → 5.19.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: 0cd4e9e48bb155611d906ffd22546fc3e25feb07db13ed55a7c3209b53249cd4
4
- data.tar.gz: 9417568b47cb0db8d1b8a87b6de59e9df9043c948acc662824e22b16c25bf3f5
3
+ metadata.gz: 61fa7316f287cfcec8e2b06d36481f1fa596d1b629810a784fae509c55255b2f
4
+ data.tar.gz: 7cf82254973204d7ac47b6bba428ff394e24c9ec5dbbb5669657b4c10b30c16b
5
5
  SHA512:
6
- metadata.gz: 2c3a5765b93cc36d87a91249a880a7d81f5a7c864295572e378f0f6c7e21624250f297b9ce139fa68f019e6ddb390f62f8c1615f8a69a8aacf8aae3587e2f0b6
7
- data.tar.gz: 863775382a5b6c8f767ca09af046e94abbe697eb25201087c5ceb2a37e16a57c1ad56d2f8ae00f3bd79d0d686b656dd9eece95fc46b8c5d9a22403026da282f5
6
+ metadata.gz: 572402b7af72a67f76a1952cb7e5739a7cf4073ba0b510f55f8f74bc59a6e6116bad1be5ece41e20a43cb2d3c36c7ab2bca072b8a4c27b5a1db16d1007846284
7
+ data.tar.gz: 021a0fa67e25aee448c66c43ae5fd3295d1472329bccdcfe4a5acf2c6fe90fd83c9cdcf8963db29816919fb6383d49c8303d41032e1af8abde3dcafbdeacc36a
data/CHANGELOG.md CHANGED
@@ -1,9 +1,17 @@
1
1
  ## Next
2
+
3
+
4
+
5
+ ## 5.19.0
6
+ * require a minimum lenght of 100 for responses, configured via response_minimum
7
+
8
+ ## 5.18.0
2
9
  * Add key setup to v3 example in README
3
10
  * 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
11
  * Update to latest version of rubocop
5
12
  * Drop support for Ruby 2.7; add Ruby 3.3
6
13
  * Add i18n: de, es, it, pt, pt-BR
14
+ * Added recaptcha_failure_reason
7
15
 
8
16
  ## 5.16.0
9
17
  * Allow usage of `options[:turbo]` as well as `options[:turbolinks]` for `recaptcha_v3`
data/README.md CHANGED
@@ -78,9 +78,9 @@ 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.
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
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.
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
84
 
85
85
  Add `recaptcha_tags` to the forms you want to protect:
86
86
 
@@ -488,7 +488,7 @@ are passed as a hash under `params['g-recaptcha-response-data']` with the action
488
488
  It is recommended to pass `external_script: false` on all but one of the calls to
489
489
  `recaptcha` since you only need to include the script tag once for a given `site_key`.
490
490
 
491
- ## `recaptcha_reply`
491
+ ## `recaptcha_reply` and `recaptcha_failure_reason`
492
492
 
493
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.
494
494
 
@@ -504,6 +504,8 @@ end
504
504
 
505
505
  `recaptcha_reply` will return `nil` if the the reply was not yet fetched.
506
506
 
507
+ `recaptcha_failure_reason` will return information if verification failed. E.g. if params was wrong or api resulted some error-codes.
508
+
507
509
  ## I18n support
508
510
 
509
511
  reCAPTCHA supports the I18n gem (it comes with English translations)
@@ -587,6 +589,7 @@ Recaptcha.configure do |config|
587
589
  config.verify_url = 'https://hcaptcha.com/siteverify'
588
590
  config.api_server_url = 'https://hcaptcha.com/1/api.js'
589
591
  config.response_limit = 100000
592
+ config.response_minimum = 100
590
593
  end
591
594
  ```
592
595
 
@@ -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)
@@ -37,8 +37,10 @@ module Recaptcha
37
37
  'enterprise_verify_url' => 'https://recaptchaenterprise.googleapis.com/v1/projects'
38
38
  }.freeze
39
39
 
40
- attr_accessor :default_env, :skip_verify_env, :proxy, :secret_key, :site_key, :handle_timeouts_gracefully,
41
- :hostname, :enterprise, :enterprise_api_key, :enterprise_project_id, :response_limit
40
+ attr_accessor(
41
+ :default_env, :skip_verify_env, :proxy, :secret_key, :site_key, :handle_timeouts_gracefully,
42
+ :hostname, :enterprise, :enterprise_api_key, :enterprise_project_id, :response_limit, :response_minimum
43
+ )
42
44
  attr_writer :api_server_url, :verify_url
43
45
 
44
46
  def initialize # :nodoc:
@@ -57,6 +59,7 @@ module Recaptcha
57
59
  @api_server_url = nil
58
60
 
59
61
  @response_limit = 4000
62
+ @response_minimum = 100
60
63
  end
61
64
 
62
65
  def secret_key!
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Recaptcha
4
- VERSION = '5.17.1'
4
+ VERSION = '5.19.0'
5
5
  end
data/lib/recaptcha.rb CHANGED
@@ -55,7 +55,7 @@ module Recaptcha
55
55
  end
56
56
 
57
57
  def self.invalid_response?(resp)
58
- resp.empty? || resp.length > configuration.response_limit
58
+ resp.empty? || resp.length > configuration.response_limit || resp.length < configuration.response_minimum
59
59
  end
60
60
 
61
61
  def self.verify_via_api_call(response, options)
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.17.1
4
+ version: 5.19.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: 2024-11-27 00:00:00.000000000 Z
11
+ date: 2025-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mocha