Skip to content

Commit

Permalink
Add invisible reCAPTCHA support
Browse files Browse the repository at this point in the history
  • Loading branch information
Juan Pablo Rinaldi committed Feb 3, 2017
1 parent 34d2870 commit e85fbde
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 7 deletions.
6 changes: 3 additions & 3 deletions demo/rails/.env
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# these will only work on localhost (registered on mg@z) ... make your own at https://www.google.com/recaptcha
RECAPTCHA_PUBLIC_KEY=6Le7oRETAAAAAETt105rjswZ15EuVJiF7BxPROkY
RECAPTCHA_PRIVATE_KEY=6Le7oRETAAAAAL5a8yOmEdmDi3b2pH7mq5iH1bYK
# reCAPTCHA keys for testing purposes (https://developers.google.com/recaptcha/docs/faq)
RECAPTCHA_SITE_KEY = 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
RECAPTCHA_SECRET_KEY = 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
14 changes: 12 additions & 2 deletions demo/rails/app/views/captcha/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,21 @@
<%= submit_tag %>
<% end %>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
<%= link_to 'Single ?', '?' %>
<% elsif params[:invisible] %>
<script>
function onSubmitCallback() {
document.getElementById("invisible-recaptcha-form").submit();
}
</script>
<%= form_tag "/captchas", id: "invisible-recaptcha-form" do %>
<%= invisible_recaptcha_tags callback: 'onSubmitCallback' %>
<% end %>
<% else %>
<%= form_tag "/captchas" do %>
<%= recaptcha_tags %>
<%= submit_tag %>
<% end %>
<%= link_to 'Multi ?', '?multi=1' %>
<% end %>
<%= link_to 'Single ?', '?' if params[:multi] or params[:invisible] %>
<%= link_to 'Multi ?', '?multi=1' unless params[:multi] %>
<%= link_to 'Invisible ?', '?invisible=1' unless params[:invisible] %>
20 changes: 20 additions & 0 deletions lib/recaptcha/client_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,25 @@ def recaptcha_tags(options = {})

html.respond_to?(:html_safe) ? html.html_safe : html
end

# Invisible reCAPTCHA implementation
def invisible_recaptcha_tags(options = {})
site_key = options[:site_key] || Recaptcha.configuration.site_key!
script_url = Recaptcha.configuration.api_server_url
data_attributes = [:badge, :theme, :type, :callback, :expired_callback, :size, :tabindex]
data_attributes = options.each_with_object({}) do |(k, v), a|
a[k] = v if data_attributes.include?(k)
end
data_attributes[:sitekey] = site_key
tag_attributes = data_attributes.map { |k, v| %(data-#{k.to_s.tr('_', '-')}="#{v}") }.join(" ")
if id = options[:id]
tag_attributes << %( id="#{id}")
end
class_ = options[:class]
html = ""
html << %(<script src="#{script_url}" async defer></script>\n) if options.fetch(:script, true)
html << %(<button type="submit" class="g-recaptcha #{class_}" #{tag_attributes}>Submit</button>\n)
html.respond_to?(:html_safe) ? html.html_safe : html
end
end
end
31 changes: 29 additions & 2 deletions test/client_helper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
end

describe "noscript" do
it "does not adds noscript tags when noscript is given" do
it "does not add noscript tags when noscript is given" do
recaptcha_tags(noscript: false).wont_include "noscript"
end

Expand All @@ -26,7 +26,7 @@
)
end

it "raises withut site key" do
it "raises without site key" do
Recaptcha.configuration.site_key = nil
assert_raises Recaptcha::RecaptchaError do
recaptcha_tags
Expand All @@ -46,4 +46,31 @@
"<script"
)
end

describe "invisible recatpcha" do
it "uses ssl" do
invisible_recaptcha_tags.must_include "\"#{Recaptcha.configuration.api_server_url}\""
end

it "raises without site key" do
Recaptcha.configuration.site_key = nil
assert_raises Recaptcha::RecaptchaError do
invisible_recaptcha_tags
end
end

it "includes id as button attribute" do
html = invisible_recaptcha_tags(id: 'my_id')
html.must_include(
" id=\"my_id\""
)
end

it "does not include <script> tag when setting script: false" do
html = invisible_recaptcha_tags(script: false)
html.wont_include(
"<script"
)
end
end
end

0 comments on commit e85fbde

Please sign in to comment.