diff --git a/app/controllers/concerns/recaptcha_verifiable.rb b/app/controllers/concerns/recaptcha_verifiable.rb new file mode 100644 index 0000000..eccd0a9 --- /dev/null +++ b/app/controllers/concerns/recaptcha_verifiable.rb @@ -0,0 +1,19 @@ +require 'active_support/concern' + +module RecaptchaVerifiable + extend ActiveSupport::Concern + + included do + before_action :recaptcha, only: [:create] + end + + def recaptcha + reroute_failed_recaptcha && return unless RecaptchaVerifier.verify(params["recaptcha-response"], request.ip) + end + + def reroute_failed_recaptcha + @person = Person.new + flash.now[:error] = "Please verify you are not a robot." + render action: "new" + end +end \ No newline at end of file diff --git a/app/controllers/recaptcha_controller.rb b/app/controllers/recaptcha_controller.rb new file mode 100644 index 0000000..56a2329 --- /dev/null +++ b/app/controllers/recaptcha_controller.rb @@ -0,0 +1,25 @@ +class RecaptchaController < ApplicationController + include RecaptchaVerifiable + + skip_before_action :verify_authenticity_token + + def index + #render json: {name: "donut", description: "delicious!"} + ver = RecaptchaVerifier.verify(params['recaptcha_response'].chomp, request.ip) + testv = 'test' + render json: {verify: ver, test: testv} + + end + + #RecaptchaVerifier.verify(recaptcha_response, ip_address) + + #skip_before_action :check_xhr +# + #def index + # Rails.logger.info 'Method called' + #end +# + #def verify + # Rails.logger.info 'Called RecaptchaController#verify' + #end +end \ No newline at end of file diff --git a/assets/javascripts/discourse/controllers/recaptcha.js.es6 b/assets/javascripts/discourse/controllers/recaptcha.js.es6 new file mode 100644 index 0000000..0d8ff76 --- /dev/null +++ b/assets/javascripts/discourse/controllers/recaptcha.js.es6 @@ -0,0 +1,19 @@ +/*export default Ember.Controller.extend({ + actions: { + grVerify(){ + $.ajax({ + type: 'POST', + contentType: 'application/json; charset=utf-8', + url: "/grverify", + data: JSON.stringify({recaptcha_response: g-recaptcha_response}), + dataType: 'json', + success: function (res) { + console.log(res); + }, + error: function () { + console.log('failure'); + } + }); + }, + } +});*/ \ No newline at end of file diff --git a/assets/javascripts/discourse/routes/gr-verify.js.es6 b/assets/javascripts/discourse/routes/gr-verify.js.es6 new file mode 100644 index 0000000..b971b98 --- /dev/null +++ b/assets/javascripts/discourse/routes/gr-verify.js.es6 @@ -0,0 +1,49 @@ +/*import { ajax } from 'discourse/lib/ajax'; + +/*export default Ember.Route.extend({ + model() { + //console.log(ajax('/grverify/response.json')); + Discourse.ajax('/grverify', { + type: 'POST', + data: {recaptcha_response: g-recaptcha_response} + }).then(function(res) { + if (res.verify) { + console.log('dada'); + } + console.log(res); + }); + + //return ajax('/grverify/response.json'); + } +});*/ +/* +App.grVerifyService = Ember.Service.extend({ + function grVerify() { + Discourse.ajax('/grverify', { + type: 'POST', + data: {recaptcha_response: g-recaptcha-response} + }).then(function(res) { + if (res.verify) { + console.log('dada'); + } + console.log(res); + }); + } +}); +*/ +/* +function formGRSubmit() { + $.ajax({ + type: 'POST', + contentType: 'application/json; charset=utf-8', + url: "/grverify", + data: JSON.stringify({recaptcha_response: g-recaptcha_response}), + dataType: 'json', + success: function (res) { + console.log(res); + }, + error: function () { + console.log('failure'); + } + }); +}*/ \ No newline at end of file diff --git a/assets/javascripts/discourse/templates/123123modal/create-account.hbs b/assets/javascripts/discourse/templates/123123modal/create-account.hbs new file mode 100644 index 0000000..0e4e01c --- /dev/null +++ b/assets/javascripts/discourse/templates/123123modal/create-account.hbs @@ -0,0 +1,128 @@ + + + \ No newline at end of file diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml new file mode 100644 index 0000000..0cbe75a --- /dev/null +++ b/config/locales/server.en.yml @@ -0,0 +1,5 @@ +en: + site_settings: + recaptcha_enabled: 'Enable Recaptcha' + recaptcha_public_key: 'Recaptcha Public Key' + recaptcha_secret_key: 'Recaptcha Secret Key' \ No newline at end of file diff --git a/config/settings.yml b/config/settings.yml new file mode 100644 index 0000000..437e660 --- /dev/null +++ b/config/settings.yml @@ -0,0 +1,7 @@ +plugins: + recaptcha_enabled: + default: false + recaptcha_public_key: + default: "" + recaptcha_secret_key: + default: "" \ No newline at end of file diff --git a/lib/google_recaptcha.rb b/lib/google_recaptcha.rb new file mode 100644 index 0000000..24ae803 --- /dev/null +++ b/lib/google_recaptcha.rb @@ -0,0 +1,27 @@ +class GoogleRecaptcha + BASE_URL = "https://www.google.com/".freeze + VERIFY_URL = "recaptcha/api/siteverify".freeze + + def initialize + @client = Faraday.new(BASE_URL) + end + + def verify_recaptcha(params) + response = perform_verify_request(params) + return success?(response) + end + + def success?(response) + JSON.parse(response.body)["success"] + end + + private + + attr_reader :client + + def perform_verify_request(params) + client.post(VERIFY_URL) do |req| + req.params = params.merge({secret: SiteSetting.recaptcha_secret_key}) + end + end +end \ No newline at end of file diff --git a/plugin.rb b/plugin.rb new file mode 100644 index 0000000..28b1004 --- /dev/null +++ b/plugin.rb @@ -0,0 +1,24 @@ +# name: recaptcha +# about: add Google Recaptcha to Sign Up form +# version: 0.1 +# authors: klaudgrave +# url: https://github.com/klaudgrave + +#gem 'recaptcha', '5.1.0' + +enabled_site_setting :recaptcha_enabled + load File.expand_path('../lib/google_recaptcha.rb', __FILE__) + load File.expand_path('../services/recaptcha_verifier.rb', __FILE__) + load File.expand_path('../app/controllers/concerns/recaptcha_verifiable.rb', __FILE__) + +after_initialize do + load File.expand_path('../app/controllers/recaptcha_controller.rb', __FILE__) + + + Discourse::Application.routes.append do + #put '/grverify' => 'recaptcha#verify' + #mount ::RecaptchaVerifiable::recaptcha, at: "/grverify" + match '/grverify' => 'recaptcha#index', :via => :post + end +end + diff --git a/services/recaptcha_verifier.rb b/services/recaptcha_verifier.rb new file mode 100644 index 0000000..49cb7f6 --- /dev/null +++ b/services/recaptcha_verifier.rb @@ -0,0 +1,25 @@ +class RecaptchaVerifier + #def self.verify(response, remote_ip, recaptcha_client=GoogleRecaptcha) + #new(response, remote_ip, recaptcha_client).verify + #return false unless recaptcha_response + #recaptcha_client.verify_recaptcha(response: recaptcha_response, remoteip: remote_ip) + #end + + def initialiaze(response, remote_ip, recaptcha_client) + @recaptcha_response = response + @remote_ip = remote_ip + @recaptcha_client = GoogleRecaptcha.new + end + + def self.verify(response, remoteip) + #return false unless response + recaptcha_client = GoogleRecaptcha.new + recaptcha_client.verify_recaptcha(response: response, remoteip: remoteip) + #rescue + #false + end + + private + + attr_reader :recaptcha_client, :recaptcha_response, :remote_ip +end \ No newline at end of file