recaptcha 5.8.1 → 5.12.3
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 +4 -4
- data/CHANGELOG.md +28 -0
- data/README.md +34 -0
- data/lib/recaptcha/configuration.rb +6 -4
- data/lib/recaptcha/helpers.rb +1 -1
- data/lib/recaptcha/version.rb +1 -1
- data/lib/recaptcha.rb +16 -17
- data/rails/locales/ja.yml +5 -0
- data/rails/locales/nl.yml +5 -0
- metadata +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4052ca42cf536d84329b553a058de58f2c3579e0ac2ad1e08ba42fed8ce974b4
|
4
|
+
data.tar.gz: 90c873c15d0772690ca3da6cf2588669a05c159e4fbaa1d6bdf5d809ad05dfd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 403d9de96d890bb3f75cfb83c5907f01944d8e88233248ec199fe014e04f7f1386c13cd867c9020a232cd5501faada986f6d3413d3a2369e5d38d9c56a0704b9
|
7
|
+
data.tar.gz: ce0d965054455acff094e60ccad808fbf836992666f9bd1233684b172e766440ba922a0f8d030803575b3a538945e3273d0ae237ce2527f9e0983b7b76671328
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,34 @@
|
|
1
1
|
## Next
|
2
|
+
|
3
|
+
## 5.12.3
|
4
|
+
* Remove score fallback for enterprise
|
5
|
+
* Update enterprise tests to v1 assessment schema
|
6
|
+
|
7
|
+
## 5.12.2
|
8
|
+
* Fix minimum score for enterprise
|
9
|
+
|
10
|
+
## 5.12.1
|
11
|
+
* Fix Japanese locale
|
12
|
+
|
13
|
+
## 5.12.0
|
14
|
+
* Added Japanese locale
|
15
|
+
|
16
|
+
## 5.11.0
|
17
|
+
* Added Dutch locale
|
18
|
+
|
19
|
+
## 5.10.1
|
20
|
+
* Fix enterprise_verify_url #415
|
21
|
+
|
22
|
+
## 5.10.0
|
23
|
+
* Drop ruby 2.4 2.5 2.6
|
24
|
+
* Add maxiumm score support for hcaptcha
|
25
|
+
|
26
|
+
## 5.9.0
|
2
27
|
* Gracefully handle invalid params
|
3
28
|
|
29
|
+
## 5.8.1
|
30
|
+
* Allow configuring response limit
|
31
|
+
|
4
32
|
## 5.8.0
|
5
33
|
* Add support for the enterprise API
|
6
34
|
|
data/README.md
CHANGED
@@ -50,6 +50,8 @@ Note: Enter `localhost` or `127.0.0.1` as the domain if using in development wit
|
|
50
50
|
|
51
51
|
## Rails Installation
|
52
52
|
|
53
|
+
**If you are having issues with Rails 7, Turbo, and Stimulus, make sure to check [this Wiki page](https://github.com/ambethia/recaptcha/wiki/Recaptcha-with-Turbo-and-Stimulus)!**
|
54
|
+
|
53
55
|
```ruby
|
54
56
|
gem "recaptcha"
|
55
57
|
```
|
@@ -551,6 +553,38 @@ recaptcha_tags site_key: '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
|
|
551
553
|
verify_recaptcha secret_key: '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
|
552
554
|
```
|
553
555
|
|
556
|
+
|
557
|
+
## hCaptcha support
|
558
|
+
|
559
|
+
[hCaptcha](https://hcaptcha.com) is an alternative service providing reCAPTCHA API.
|
560
|
+
|
561
|
+
To use hCaptcha:
|
562
|
+
1. Set a site and a secret key as usual
|
563
|
+
2. Set two options in `verify_url` and `api_service_url` pointing to hCaptcha API endpoints.
|
564
|
+
3. Disable a response limit check by setting a `response_limit` to the large enough value (reCAPTCHA is limited by 4000 characters).
|
565
|
+
4. It is not required to change a parameter name as [official docs suggest](https://docs.hcaptcha.com/switch) because API handles standard `g-recaptcha` for compatibility.
|
566
|
+
|
567
|
+
```ruby
|
568
|
+
# config/initializers/recaptcha.rb
|
569
|
+
Recaptcha.configure do |config|
|
570
|
+
config.site_key = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
|
571
|
+
config.secret_key = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'
|
572
|
+
config.verify_url = 'https://hcaptcha.com/siteverify'
|
573
|
+
config.api_server_url = 'https://hcaptcha.com/1/api.js'
|
574
|
+
config.response_limit = 100000
|
575
|
+
end
|
576
|
+
```
|
577
|
+
|
578
|
+
hCaptcha uses a scoring system (higher number more likely to be a bot) which is inverse of the reCaptcha scoring system (lower number more likely to be a bot). As such, a `maximum_score` attribute is provided for use with hCaptcha.
|
579
|
+
|
580
|
+
```ruby
|
581
|
+
result = verify_recaptcha(maximum_score: 0.7)
|
582
|
+
```
|
583
|
+
|
584
|
+
| Option | Description |
|
585
|
+
|------------------|-------------|
|
586
|
+
| `:maximum_score` | Provide a threshold to meet or fall below. Threshold should be a float between 0 and 1 which will be tested as `score <= maximum_score`. (Default: `nil`) |
|
587
|
+
|
554
588
|
## Misc
|
555
589
|
- Check out the [wiki](https://github.com/ambethia/recaptcha/wiki) and leave whatever you found valuable there.
|
556
590
|
- [Add multiple widgets to the same page](https://github.com/ambethia/recaptcha/wiki/Add-multiple-widgets-to-the-same-page)
|
@@ -34,14 +34,14 @@ module Recaptcha
|
|
34
34
|
'free_server_url' => 'https://www.recaptcha.net/recaptcha/api.js',
|
35
35
|
'enterprise_server_url' => 'https://www.recaptcha.net/recaptcha/enterprise.js',
|
36
36
|
'free_verify_url' => 'https://www.recaptcha.net/recaptcha/api/siteverify',
|
37
|
-
'enterprise_verify_url' => 'https://recaptchaenterprise.googleapis.com/
|
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
|
-
|
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
|
42
42
|
attr_writer :api_server_url, :verify_url
|
43
43
|
|
44
|
-
def initialize
|
44
|
+
def initialize # :nodoc:
|
45
45
|
@default_env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || (Rails.env if defined? Rails.env)
|
46
46
|
@skip_verify_env = %w[test cucumber]
|
47
47
|
@handle_timeouts_gracefully = true
|
@@ -55,6 +55,8 @@ module Recaptcha
|
|
55
55
|
|
56
56
|
@verify_url = nil
|
57
57
|
@api_server_url = nil
|
58
|
+
|
59
|
+
@response_limit = 4000
|
58
60
|
end
|
59
61
|
|
60
62
|
def secret_key!
|
data/lib/recaptcha/helpers.rb
CHANGED
@@ -10,7 +10,7 @@ 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-data
|
13
|
+
id = options.delete(:id) || "g-recaptcha-response-data-#{dasherize_action(action)}"
|
14
14
|
name = options.delete(:name) || "g-recaptcha-response-data[#{action}]"
|
15
15
|
turbolinks = options.delete(:turbolinks)
|
16
16
|
options[:render] = site_key
|
data/lib/recaptcha/version.rb
CHANGED
data/lib/recaptcha.rb
CHANGED
@@ -14,7 +14,6 @@ end
|
|
14
14
|
|
15
15
|
module Recaptcha
|
16
16
|
DEFAULT_TIMEOUT = 3
|
17
|
-
RESPONSE_LIMIT = 4000
|
18
17
|
|
19
18
|
class RecaptchaError < StandardError
|
20
19
|
end
|
@@ -56,7 +55,7 @@ module Recaptcha
|
|
56
55
|
end
|
57
56
|
|
58
57
|
def self.invalid_response?(resp)
|
59
|
-
resp.empty? || resp.length >
|
58
|
+
resp.empty? || resp.length > configuration.response_limit
|
60
59
|
end
|
61
60
|
|
62
61
|
def self.verify_via_api_call(response, options)
|
@@ -78,17 +77,19 @@ module Recaptcha
|
|
78
77
|
body['event']['userIpAddress'] = options[:remote_ip] if options.key?(:remote_ip)
|
79
78
|
|
80
79
|
reply = api_verification_enterprise(query_params, body, project_id, timeout: options[:timeout])
|
80
|
+
score = reply.dig('riskAnalysis', 'score')
|
81
81
|
token_properties = reply['tokenProperties']
|
82
82
|
success = !token_properties.nil? &&
|
83
83
|
token_properties['valid'].to_s == 'true' &&
|
84
84
|
hostname_valid?(token_properties['hostname'], options[:hostname]) &&
|
85
85
|
action_valid?(token_properties['action'], options[:action]) &&
|
86
|
-
score_above_threshold?(
|
86
|
+
score_above_threshold?(score, options[:minimum_score]) &&
|
87
|
+
score_below_threshold?(score, options[:maximum_score])
|
87
88
|
|
88
89
|
if options[:with_reply] == true
|
89
|
-
|
90
|
+
[success, reply]
|
90
91
|
else
|
91
|
-
|
92
|
+
success
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
@@ -101,12 +102,13 @@ module Recaptcha
|
|
101
102
|
success = reply['success'].to_s == 'true' &&
|
102
103
|
hostname_valid?(reply['hostname'], options[:hostname]) &&
|
103
104
|
action_valid?(reply['action'], options[:action]) &&
|
104
|
-
score_above_threshold?(reply['score'], options[:minimum_score])
|
105
|
+
score_above_threshold?(reply['score'], options[:minimum_score]) &&
|
106
|
+
score_below_threshold?(reply['score'], options[:maximum_score])
|
105
107
|
|
106
108
|
if options[:with_reply] == true
|
107
|
-
|
109
|
+
[success, reply]
|
108
110
|
else
|
109
|
-
|
111
|
+
success
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
@@ -127,15 +129,12 @@ module Recaptcha
|
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
130
|
-
# Returns true iff score is greater or equal to (>=) minimum_score, or if no minimum_score was specified
|
131
132
|
def self.score_above_threshold?(score, minimum_score)
|
132
|
-
|
133
|
-
|
133
|
+
!minimum_score || (score && score >= minimum_score)
|
134
|
+
end
|
134
135
|
|
135
|
-
|
136
|
-
|
137
|
-
else score >= minimum_score
|
138
|
-
end
|
136
|
+
def self.score_below_threshold?(score, maximum_score)
|
137
|
+
!maximum_score || (score && score <= maximum_score)
|
139
138
|
end
|
140
139
|
|
141
140
|
def self.http_client_for(uri:, timeout: nil)
|
@@ -155,7 +154,7 @@ module Recaptcha
|
|
155
154
|
|
156
155
|
def self.api_verification_free(verify_hash, timeout: nil)
|
157
156
|
query = URI.encode_www_form(verify_hash)
|
158
|
-
uri = URI.parse(configuration.verify_url
|
157
|
+
uri = URI.parse("#{configuration.verify_url}?#{query}")
|
159
158
|
http_instance = http_client_for(uri: uri, timeout: timeout)
|
160
159
|
request = Net::HTTP::Get.new(uri.request_uri)
|
161
160
|
JSON.parse(http_instance.request(request).body)
|
@@ -163,7 +162,7 @@ module Recaptcha
|
|
163
162
|
|
164
163
|
def self.api_verification_enterprise(query_params, body, project_id, timeout: nil)
|
165
164
|
query = URI.encode_www_form(query_params)
|
166
|
-
uri = URI.parse(configuration.verify_url
|
165
|
+
uri = URI.parse("#{configuration.verify_url}/#{project_id}/assessments?#{query}")
|
167
166
|
http_instance = http_client_for(uri: uri, timeout: timeout)
|
168
167
|
request = Net::HTTP::Post.new(uri.request_uri)
|
169
168
|
request['Content-Type'] = 'application/json; charset=utf-8'
|
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.
|
4
|
+
version: 5.12.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason L Perry
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -156,12 +156,14 @@ files:
|
|
156
156
|
- lib/recaptcha/version.rb
|
157
157
|
- rails/locales/en.yml
|
158
158
|
- rails/locales/fr.yml
|
159
|
+
- rails/locales/ja.yml
|
160
|
+
- rails/locales/nl.yml
|
159
161
|
homepage: http://github.com/ambethia/recaptcha
|
160
162
|
licenses:
|
161
163
|
- MIT
|
162
164
|
metadata:
|
163
165
|
source_code_uri: https://github.com/ambethia/recaptcha
|
164
|
-
post_install_message:
|
166
|
+
post_install_message:
|
165
167
|
rdoc_options: []
|
166
168
|
require_paths:
|
167
169
|
- lib
|
@@ -169,15 +171,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
171
|
requirements:
|
170
172
|
- - ">="
|
171
173
|
- !ruby/object:Gem::Version
|
172
|
-
version: 2.
|
174
|
+
version: 2.7.0
|
173
175
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
176
|
requirements:
|
175
177
|
- - ">="
|
176
178
|
- !ruby/object:Gem::Version
|
177
179
|
version: '0'
|
178
180
|
requirements: []
|
179
|
-
rubygems_version: 3.
|
180
|
-
signing_key:
|
181
|
+
rubygems_version: 3.3.3
|
182
|
+
signing_key:
|
181
183
|
specification_version: 4
|
182
184
|
summary: Helpers for the reCAPTCHA API
|
183
185
|
test_files: []
|