Commit 0318fee8ec6b070e505aa51075ea1b42e97313fb

Authored by Evandro Junior
Committed by Rodrigo Souto
1 parent 4ddf407d

Support google recaptcha for the API

config/noosfero.yml.dist
... ... @@ -11,7 +11,14 @@ development:
11 11 max_upload_size: 5MB
12 12 hours_until_user_activation_check: 72
13 13 exclude_profile_identifier_pattern: index(\..*)?|home(\..*)?
  14 + api_recaptcha_site_key: '6LdsWAcTAAAAAChTUUD6yu9fCDhdIZzNd7F53zf-'
  15 + api_recaptcha_private_key: '6LdsWAcTAAAAAB6maB_HalVyCc4asDAxPxloIMvY'
  16 + api_recaptcha_verify_uri: 'https://www.google.com/recaptcha/api/siteverify'
14 17  
15 18 test:
16 19  
17 20 production:
  21 + api_recaptcha_site_key: '6LcLPAcTAAAAAKsd0bxY_TArhD_A7OL19SRCW7_i'
  22 + api_recaptcha_private_key: '6LcLPAcTAAAAAE36SN1M2w1I7Hn8upwXYZ_YQZ5-'
  23 + api_recaptcha_verify_uri: 'https://www.google.com/recaptcha/api/siteverify'
  24 +
18 25 \ No newline at end of file
... ...
lib/noosfero/api/api.rb
1 1 require 'grape'
2 2 #require 'rack/contrib'
  3 +
3 4 Dir["#{Rails.root}/lib/noosfero/api/*.rb"].each {|file| require file unless file =~ /api\.rb/}
4 5 module Noosfero
5 6 module API
6 7 class API < Grape::API
7 8 use Rack::JSONP
8   -
9   - logger = Logger.new(File.join(Rails.root, 'log', "#{ENV['RAILS_ENV'] || 'production'}_api.log"))
10   - logger.formatter = GrapeLogging::Formatters::Default.new
11   - use RequestLogger, { logger: logger }
12   -
13   - rescue_from :all do |e|
14   - logger.error e
  9 +
  10 + @@NOOSFERO_CONF = nil
  11 +
  12 + def self.NOOSFERO_CONF
  13 + if @@NOOSFERO_CONF
  14 + @@NOOSFERO_CONF
  15 + else
  16 + file = Rails.root.join('config', 'noosfero.yml')
  17 + @@NOOSFERO_CONF = File.exists?(file) ? YAML.load_file(file)[Rails.env] || {} : {}
  18 + end
15 19 end
16 20  
17 21 before { setup_multitenancy }
... ... @@ -22,9 +26,9 @@ module Noosfero
22 26 prefix "api"
23 27 format :json
24 28 content_type :txt, "text/plain"
25   -
  29 +
26 30 helpers APIHelpers
27   -
  31 +
28 32 mount V1::Articles
29 33 mount V1::Comments
30 34 mount V1::Users
... ... @@ -33,7 +37,7 @@ module Noosfero
33 37 mount V1::Enterprises
34 38 mount V1::Categories
35 39 mount Session
36   -
  40 +
37 41 # hook point which allow plugins to add Grape::API extensions to API::API
38 42 #finds for plugins which has api mount points classes defined (the class should extends Grape::API)
39 43 @plugins = Noosfero::Plugin.all.map { |p| p.constantize }
... ...
lib/noosfero/api/helpers.rb
... ... @@ -102,7 +102,21 @@ module Noosfero
102 102 end
103 103 attrs
104 104 end
105   -
  105 +
  106 + def verify_recaptcha_v2(remote_ip, g_recaptcha_response, private_key, api_recaptcha_verify_uri)
  107 + verify_hash = {
  108 + "secret" => private_key,
  109 + "remoteip" => remote_ip,
  110 + "response" => g_recaptcha_response
  111 + }
  112 + uri = URI(api_recaptcha_verify_uri)
  113 + https = Net::HTTP.new(uri.host, uri.port)
  114 + https.use_ssl = true
  115 + request = Net::HTTP::Post.new(uri.path)
  116 + request.set_form_data(verify_hash)
  117 + JSON.parse(https.request(request).body)
  118 + end
  119 +
106 120 ##########################################
107 121 # error helpers #
108 122 ##########################################
... ...
lib/noosfero/api/session.rb
  1 +require "uri"
  2 +
1 3 module Noosfero
2 4 module API
3   -
  5 +
4 6 class Session < Grape::API
5   -
  7 +
6 8 # Login to get token
7 9 #
8 10 # Parameters:
... ... @@ -13,13 +15,13 @@ module Noosfero
13 15 # POST http://localhost:3000/api/v1/login?login=adminuser&password=admin
14 16 post "/login" do
15 17 user ||= User.authenticate(params[:login], params[:password], environment)
16   -
  18 +
17 19 return unauthorized! unless user
18 20 user.generate_private_token!
19 21 @current_user = user
20 22 present user, :with => Entities::UserLogin
21 23 end
22   -
  24 +
23 25 # Create user.
24 26 #
25 27 # Parameters:
... ... @@ -37,16 +39,20 @@ module Noosfero
37 39 unique_attributes! User, [:email, :login]
38 40 attrs = attributes_for_keys [:email, :login, :password]
39 41 attrs[:password_confirmation] = attrs[:password]
40   - user = User.new(attrs)
41   - if user.save
  42 + remote_ip = (request.respond_to?(:remote_ip) && request.remote_ip) || (env && env['REMOTE_ADDR'])
  43 + private_key = API.NOOSFERO_CONF['api_recaptcha_private_key']
  44 + api_recaptcha_verify_uri = API.NOOSFERO_CONF['api_recaptcha_verify_uri']
  45 + captcha_result = verify_recaptcha_v2(remote_ip, params['g-recaptcha-response'], private_key, api_recaptcha_verify_uri)
  46 + user = User.new(attrs)
  47 + if captcha_result["success"] and user.save!
42 48 user.activate
43 49 user.generate_private_token!
44 50 present user, :with => Entities::UserLogin
45 51 else
46   - something_wrong!
  52 + message = user.errors.to_json
  53 + render_api_error!(message, 400)
47 54 end
48 55 end
49   -
50 56 end
51 57 end
52 58 end
... ...