recaptcha 5.0.0 → 5.3.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 +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +12 -12
- data/lib/recaptcha.rb +2 -1
- data/lib/recaptcha/helpers.rb +30 -6
- data/lib/recaptcha/railtie.rb +22 -0
- data/lib/recaptcha/version.rb +1 -1
- data/rails/locales/en.yml +5 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adcc7a846c1b2cbac386af0946cd3c810803860f85ca363e5453582354c618b0
|
4
|
+
data.tar.gz: b1ac10dd569bc7220b81505c9c6565d3db900a3c737ed1c184dcd1c96a12c963
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f9f6271ee715f1fbe543ed1b27cc8088678f5da8326718ad60587128e550fbb9073558fa147a4b608469da82af4cfd86ee255c39a7f69e0bd6b1d590ac109d8
|
7
|
+
data.tar.gz: 94fbd105e5b6f1cf23fd23cb5dac6040d9e642d5110beae4b9982c6a232f24323ed9ab145b3aa9ef7f6d5786537a20ea03dfacde5638c5f82d5921999c398bd7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
## Next
|
2
2
|
|
3
|
+
## 5.3.0
|
4
|
+
* turbolinks support
|
5
|
+
|
6
|
+
## 5.2.0
|
7
|
+
* remove dependency on rails methods
|
8
|
+
|
9
|
+
## 5.1.0
|
10
|
+
* Added default translations for rails/i18n
|
11
|
+
* use recaptcha.net for the script tag
|
12
|
+
|
3
13
|
## 5.0.0
|
4
14
|
* Changed host to Recaptcha.net
|
5
15
|
* Add v3 API support
|
data/README.md
CHANGED
@@ -270,7 +270,8 @@ For more information, refer to the [v3 documentation](https://developers.google.
|
|
270
270
|
### Examples
|
271
271
|
|
272
272
|
With v3, you can let all users log in without any intervention at all if their score is above some
|
273
|
-
threshold, and only show a v2 checkbox recaptcha challenge if it is below the
|
273
|
+
threshold, and only show a v2 checkbox recaptcha challenge (fall back to v2) if it is below the
|
274
|
+
threshold:
|
274
275
|
|
275
276
|
```erb
|
276
277
|
…
|
@@ -286,7 +287,7 @@ threshold, and only show a v2 checkbox recaptcha challenge if it is below the th
|
|
286
287
|
# app/controllers/sessions_controller.rb
|
287
288
|
def create
|
288
289
|
success = verify_recaptcha(action: 'login', minimum_score: 0.5)
|
289
|
-
checkbox_success =
|
290
|
+
checkbox_success = verify_recaptcha unless success
|
290
291
|
if success || checkbox_success
|
291
292
|
# Perform action
|
292
293
|
else
|
@@ -298,6 +299,8 @@ def create
|
|
298
299
|
end
|
299
300
|
```
|
300
301
|
|
302
|
+
(You can also find this [example](demo/rails/app/controllers/v3_captchas_controller.rb) in the demo app.)
|
303
|
+
|
301
304
|
Another example:
|
302
305
|
|
303
306
|
```erb
|
@@ -332,7 +335,7 @@ end
|
|
332
335
|
|
333
336
|
Adds an inline script tag that calls `grecaptcha.execute` for the given `site_key` and `action` and
|
334
337
|
calls the `callback` with the resulting response token. You need to verify this token with
|
335
|
-
[`verify_recaptcha`](#
|
338
|
+
[`verify_recaptcha`](#verify_recaptcha-use-with-v3) in your controller in order to get the
|
336
339
|
[score](https://developers.google.com/recaptcha/docs/v3#score).
|
337
340
|
|
338
341
|
By default, this inserts a hidden `<input type="hidden" class="g-recaptcha-response">` tag. The
|
@@ -390,6 +393,7 @@ but only accepts the following options:
|
|
390
393
|
| `:script` | Same as setting both `:inline_script` and `:external_script`. (default: `true`). |
|
391
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`) |
|
392
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. |
|
393
397
|
|
394
398
|
[JavaScript resource (api.js) parameters](https://developers.google.com/recaptcha/docs/invisible#js_param):
|
395
399
|
|
@@ -437,20 +441,17 @@ It is recommended to pass `external_script: false` on all but one of the calls t
|
|
437
441
|
`recaptcha` since you only need to include the script tag once for a given `site_key`.
|
438
442
|
|
439
443
|
## I18n support
|
440
|
-
reCAPTCHA passes two types of error explanation to a linked model. It will use the I18n gem
|
441
|
-
to translate the default error message if I18n is available. To customize the messages to your locale,
|
442
|
-
add these keys to your I18n backend:
|
443
|
-
|
444
|
-
`recaptcha.errors.verification_failed` error message displayed if the captcha words didn't match
|
445
|
-
`recaptcha.errors.recaptcha_unreachable` displayed if a timeout error occured while attempting to verify the captcha
|
446
444
|
|
447
|
-
|
445
|
+
reCAPTCHA supports the I18n gem (it comes with English translations)
|
446
|
+
To override or add new languages, add to `config/locales/*.yml`
|
448
447
|
|
449
448
|
```yaml
|
449
|
+
# config/locales/en.yml
|
450
450
|
en:
|
451
451
|
recaptcha:
|
452
452
|
errors:
|
453
|
-
verification_failed: '
|
453
|
+
verification_failed: 'reCAPTCHA was incorrect, please try again.'
|
454
|
+
recaptcha_unreachable: 'reCAPTCHA verification server error, please try again.'
|
454
455
|
```
|
455
456
|
|
456
457
|
## Testing
|
@@ -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
|
-
|
data/lib/recaptcha.rb
CHANGED
@@ -99,7 +99,8 @@ module Recaptcha
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
def self.api_verification(verify_hash, 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)
|
data/lib/recaptcha/helpers.rb
CHANGED
@@ -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
|
13
|
+
id = options.delete(:id) || "g-recaptcha-response-" + dasherize_action(action)
|
14
14
|
name = options.delete(:name) || "g-recaptcha-response[#{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
|
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
|
@@ -177,10 +183,10 @@ module Recaptcha
|
|
177
183
|
<<-HTML
|
178
184
|
<script#{nonce_attr}>
|
179
185
|
// Define function so that we can call it again later if we need to reset it
|
186
|
+
// This executes reCAPTCHA and then calls our callback.
|
180
187
|
function #{recaptcha_v3_execute_function_name(action)}() {
|
181
188
|
grecaptcha.ready(function() {
|
182
189
|
grecaptcha.execute('#{site_key}', {action: '#{action}'}).then(function(token) {
|
183
|
-
//console.log('#{id}', token)
|
184
190
|
#{callback}('#{id}', token)
|
185
191
|
});
|
186
192
|
});
|
@@ -190,6 +196,7 @@ module Recaptcha
|
|
190
196
|
|
191
197
|
// Async variant so you can await this function from another async function (no need for
|
192
198
|
// an explicit callback function then!)
|
199
|
+
// Returns a Promise that resolves with the response token.
|
193
200
|
async function #{recaptcha_v3_async_execute_function_name(action)}() {
|
194
201
|
return new Promise((resolve, reject) => {
|
195
202
|
grecaptcha.ready(async function() {
|
@@ -203,6 +210,24 @@ module Recaptcha
|
|
203
210
|
HTML
|
204
211
|
end
|
205
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
|
+
|
206
231
|
private_class_method def self.recaptcha_v3_inline_script?(options)
|
207
232
|
!Recaptcha.skip_env?(options[:env]) &&
|
208
233
|
options[:script] != false &&
|
@@ -215,7 +240,6 @@ module Recaptcha
|
|
215
240
|
var element = document.getElementById(id);
|
216
241
|
element.value = token;
|
217
242
|
}
|
218
|
-
</script>
|
219
243
|
HTML
|
220
244
|
end
|
221
245
|
|
@@ -281,13 +305,13 @@ module Recaptcha
|
|
281
305
|
# Returns a camelized string that is safe for use in a JavaScript variable/function name.
|
282
306
|
# sanitize_action_for_js('my/action') => 'MyAction'
|
283
307
|
private_class_method def self.sanitize_action_for_js(action)
|
284
|
-
action.to_s.gsub(/\W/, '_').
|
308
|
+
action.to_s.gsub(/\W/, '_').split(/\/|_/).map(&:capitalize).join
|
285
309
|
end
|
286
310
|
|
287
311
|
# Returns a dasherized string that is safe for use as an HTML ID
|
288
312
|
# dasherize_action('my/action') => 'my-action'
|
289
313
|
private_class_method def self.dasherize_action(action)
|
290
|
-
action.to_s.gsub(/\W/, '-').
|
314
|
+
action.to_s.gsub(/\W/, '-').tr('_', '-')
|
291
315
|
end
|
292
316
|
|
293
317
|
private_class_method def self.hash_to_query(hash)
|
data/lib/recaptcha/railtie.rb
CHANGED
@@ -9,5 +9,27 @@ module Recaptcha
|
|
9
9
|
ActiveSupport.on_load(:action_controller) do
|
10
10
|
include Recaptcha::Adapters::ControllerMethods
|
11
11
|
end
|
12
|
+
|
13
|
+
initializer 'recaptcha' do |app|
|
14
|
+
Recaptcha::Railtie.instance_eval do
|
15
|
+
pattern = pattern_from app.config.i18n.available_locales
|
16
|
+
|
17
|
+
add("rails/locales/#{pattern}.yml")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
protected
|
23
|
+
|
24
|
+
def add(pattern)
|
25
|
+
files = Dir[File.join(File.dirname(__FILE__), '../..', pattern)]
|
26
|
+
I18n.load_path.concat(files)
|
27
|
+
end
|
28
|
+
|
29
|
+
def pattern_from(args)
|
30
|
+
array = Array(args || [])
|
31
|
+
array.blank? ? '*' : "{#{array.join ','}}"
|
32
|
+
end
|
33
|
+
end
|
12
34
|
end
|
13
35
|
end
|
data/lib/recaptcha/version.rb
CHANGED
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.3.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:
|
11
|
+
date: 2020-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/recaptcha/rails.rb
|
155
155
|
- lib/recaptcha/railtie.rb
|
156
156
|
- lib/recaptcha/version.rb
|
157
|
+
- rails/locales/en.yml
|
157
158
|
homepage: http://github.com/ambethia/recaptcha
|
158
159
|
licenses:
|
159
160
|
- MIT
|