Commit 640774fa7004c5823dc11f433e1cb2b02d012468

Authored by Rodrigo Souto
1 parent 9ec7a43a

[stoa] Stoa Plugin

plugins/stoa/README 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +Banco de Dados
  2 +==============
  3 +
  4 +É preciso adicionar uma seção definindo a conexão com o banco de usuários da USP, no arquivo config/database.yml com identificador stoa.
  5 +``
  6 +stoa:
  7 + adapter: mysql
  8 + host: db2.stoa.usp.br
  9 + database: usp
  10 + username: <usuario>
  11 + password: <senha>
  12 +``
... ...
plugins/stoa/controllers/stoa_plugin_controller.rb 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +class StoaPluginController < PublicController
  2 + append_view_path File.join(File.dirname(__FILE__) + '/../views')
  3 +
  4 + def authenticate
  5 + if request.ssl? && request.post?
  6 + user = User.authenticate(params[:login], params[:password], environment)
  7 + if user
  8 + result = {
  9 + :username => user.login,
  10 + :email => user.email,
  11 + :name => user.name,
  12 + :nusp => user.person.usp_id,
  13 + :first_name => user.name.split(' ').first,
  14 + :surname => user.name.split(' ',2).last,
  15 + :address => user.person.address,
  16 + :homepage => user.person.url,
  17 + }
  18 + else
  19 + result = { :error => _('Incorrect user/password pair.') }
  20 + end
  21 + render :text => result.to_json
  22 + else
  23 + render :text => { :error => _('Conection requires SSL certificate and post method.') }.to_json
  24 + end
  25 + end
  26 +
  27 + def check_usp_id
  28 + render :text => { :exists => StoaPlugin::UspUser.exists?(params[:usp_id]) }.to_json
  29 + end
  30 +
  31 +end
... ...
plugins/stoa/db/migrate/20120301212702_add_usp_id_to_profile.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class AddUspIdToProfile < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :profiles, :usp_id, :string
  4 + end
  5 +
  6 + def self.down
  7 + remove_column :profiles, :usp_id
  8 + end
  9 +end
... ...
plugins/stoa/lib/stoa_plugin.rb 0 → 100644
... ... @@ -0,0 +1,59 @@
  1 +require_dependency 'person'
  2 +
  3 +class StoaPlugin < Noosfero::Plugin
  4 +
  5 + Person.human_names[:usp_id] = _('USP number')
  6 +
  7 + def self.plugin_name
  8 + "Stoa"
  9 + end
  10 +
  11 + def self.plugin_description
  12 + _("Add Stoa features")
  13 + end
  14 +
  15 + def stylesheet?
  16 + true
  17 + end
  18 +
  19 + def signup_extra_contents
  20 + lambda {
  21 + required(labelled_form_field(_('USP number'), text_field_tag('profile_data[usp_id]', '', :id => 'usp_id_field'))) +
  22 + labelled_form_field(_('Select a confirmation data'), select_tag('confirmation_field',
  23 + options_for_select([['CPF','cpf'], [_('Mother\'s name'), 'mother'], [_('Birth date (yyyy-mm-dd)'), 'birth']])
  24 + )) +
  25 + required(labelled_form_field(_('Confirmation value'), text_field_tag('confirmation_value', '', :placeholder=>_('Confirmation value')))) +
  26 + javascript_tag(<<-EOF
  27 + jQuery("#usp_id_field").change(function(){
  28 + var me=this;
  29 + jQuery(this).addClass('checking').removeClass('validated');
  30 + jQuery.getJSON('#{url_for(:controller => 'stoa_plugin', :action => 'check_usp_id')}?usp_id='+this.value,
  31 + function(data){
  32 + if(data.exists) jQuery(me).removeClass('checking').addClass('validated');
  33 + else jQuery(me).removeClass('checking').addClass('invalid');
  34 + }
  35 + );
  36 + });
  37 + EOF
  38 + )
  39 + }
  40 + end
  41 +
  42 + def account_controller_filters
  43 + block = lambda do
  44 + if request.post?
  45 + if !StoaPlugin::UspUser.matches?(params[:profile_data][:usp_id], params[:confirmation_field], params[:confirmation_value])
  46 + @person = Person.new
  47 + @person.errors.add(:usp_id, _(' validation failed'))
  48 + render :action => :signup
  49 + end
  50 + end
  51 + end
  52 +
  53 + [{ :type => 'before_filter',
  54 + :method_name => 'validate_usp_id',
  55 + :options => {:only => 'signup'},
  56 + :block => block }]
  57 + end
  58 +
  59 +end
... ...
plugins/stoa/lib/stoa_plugin/usp_user.rb 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +class StoaPlugin::UspUser < ActiveRecord::Base
  2 +
  3 + establish_connection(:stoa)
  4 + set_table_name('pessoa')
  5 +
  6 + SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  7 +
  8 + alias_attribute :cpf, :numcpf
  9 + alias_attribute :rg, :numdocidf
  10 +
  11 + def self.exists?(usp_id)
  12 + !StoaPlugin::UspUser.find(:first, :conditions => {:codpes => usp_id}).nil?
  13 + end
  14 +
  15 + def self.matches?(usp_id, field, value)
  16 + user = StoaPlugin::UspUser.find(:first, :conditions => {:codpes => usp_id})
  17 + return false if user.nil? || !user.respond_to?(field) || value.blank?
  18 + user.send(field) == Digest::MD5.hexdigest(SALT+value.to_s)
  19 + end
  20 +
  21 +end
... ...
plugins/stoa/public/style.css 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +#signup-form label[for="usp_id_field"],
  2 +#signup-form label[for="confirmation_field"] {
  3 + display: block;
  4 +}
  5 +
... ...
plugins/stoa/test/functional/account_controller_test.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../../../../app/controllers/public/account_controller'
  3 +
  4 +# Re-raise errors caught by the controller.
  5 +class AccountController; def rescue_action(e) raise e end; end
  6 +
  7 +class AccountControllerTest < ActionController::TestCase
  8 +
  9 + def setup
  10 + @controller = AccountController.new
  11 + @request = ActionController::TestRequest.new
  12 + @response = ActionController::TestResponse.new
  13 + environment = Environment.default
  14 + environment.enabled_plugins = ['StoaPlugin']
  15 + environment.save!
  16 + @db = Tempfile.new('stoa-test')
  17 + configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  18 + end
  19 +
  20 + should 'fail if confirmation value doesn\'t match' do
  21 + StoaPlugin::UspUser.stubs(:matches?).returns(false)
  22 + post :signup, :profile_data => {:usp_id => '87654321'}, :confirmation_field => 'cpf', :confirmation_value => '00000000'
  23 + assert_not_nil assigns(:person).errors[:usp_id]
  24 + end
  25 +
  26 + should 'pass if confirmation value matches' do
  27 + StoaPlugin::UspUser.stubs(:matches?).returns(true)
  28 + post :signup, :profile_data => {:usp_id => '87654321'}, :confirmation_field => 'cpf', :confirmation_value => '12345678'
  29 + assert_nil assigns(:person).errors[:usp_id]
  30 + end
  31 +
  32 +end
... ...
plugins/stoa/test/functional/stoa_plugin_controller_test.rb 0 → 100644
... ... @@ -0,0 +1,74 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../../controllers/stoa_plugin_controller'
  3 +
  4 +# Re-raise errors caught by the controller.
  5 +class StoaPluginController; def rescue_action(e) raise e end; end
  6 +
  7 +class StoaPluginControllerTest < ActionController::TestCase
  8 +
  9 + def setup
  10 + @controller = StoaPluginController.new
  11 + @request = ActionController::TestRequest.new
  12 + @response = ActionController::TestResponse.new
  13 + @user = create_user('real_user', :password => '123456', :password_confirmation => '123456')
  14 + environment = Environment.default
  15 + environment.enabled_plugins = ['StoaPlugin']
  16 + environment.save!
  17 + @db = Tempfile.new('stoa-test')
  18 + configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  19 + end
  20 +
  21 + attr_accessor :user
  22 +
  23 + should 'not authenticate if method not post' do
  24 + @request.stubs(:ssl?).returns(true)
  25 + get :authenticate, :login => user.login, :password => '123456'
  26 +
  27 + assert_not_nil json_response['error']
  28 + assert_match /post method/,json_response['error']
  29 + end
  30 +
  31 + should 'not authenticate if request is not using ssl' do
  32 + @request.stubs(:ssl?).returns(false)
  33 + post :authenticate, :login => user.login, :password => '123456'
  34 +
  35 + assert_not_nil json_response['error']
  36 + assert_match /SSL/,json_response['error']
  37 + end
  38 +
  39 + should 'not authenticate if method password is wrong' do
  40 + @request.stubs(:ssl?).returns(true)
  41 + post :authenticate, :login => user.login, :password => 'wrong_password'
  42 +
  43 + assert_not_nil json_response['error']
  44 + assert_match /password/,json_response['error']
  45 + end
  46 +
  47 + should 'authenticate if everything is right' do
  48 + @request.stubs(:ssl?).returns(true)
  49 + post :authenticate, :login => user.login, :password => '123456'
  50 +
  51 + assert_nil json_response['error']
  52 + assert_equal user.login, json_response['username']
  53 + end
  54 +
  55 + should 'check invalid usp id' do
  56 + StoaPlugin::UspUser.stubs(:exists?).returns(false)
  57 + get :check_usp_id, :usp_id => '987654321'
  58 + assert !json_response['exists']
  59 + end
  60 +
  61 + should 'check valid usp id' do
  62 + StoaPlugin::UspUser.stubs(:exists?).returns(true)
  63 + get :check_usp_id, :usp_id => '987654321'
  64 + assert json_response['exists']
  65 + end
  66 +
  67 + private
  68 +
  69 + def json_response
  70 + ActiveSupport::JSON.decode @response.body
  71 + end
  72 +
  73 +end
  74 +
... ...
plugins/stoa/test/unit/usp_user.rb 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +
  3 +class StoaPlugin::UspUserTest < ActiveSupport::TestCase
  4 +
  5 + SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  6 +
  7 + def setup
  8 + @db = Tempfile.new('stoa-test')
  9 + configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  10 + ActiveRecord::Base.establish_connection(:stoa)
  11 + ActiveRecord::Schema.create_table "pessoa" do |t|
  12 + t.integer "codpes"
  13 + t.text "numcpf"
  14 + t.text "numdocidf"
  15 + end
  16 + ActiveRecord::Base.establish_connection(:test)
  17 + StoaPlugin::UspUser.create!(:codpes => 123456, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :rg => Digest::MD5.hexdigest(SALT+'87654321'))
  18 + end
  19 +
  20 + def teardown
  21 + @db.unlink
  22 + end
  23 +
  24 + should 'check existence of usp_id' do
  25 + assert StoaPlugin::UspUser.exists?(123456)
  26 + assert !StoaPlugin::UspUser.exists?(654321)
  27 + end
  28 +
  29 + should 'check if usp_id matches with a field' do
  30 + assert StoaPlugin::UspUser.matches?(123456, :cpf, 12345678)
  31 + assert !StoaPlugin::UspUser.matches?(123456, :cpf, 87654321)
  32 + assert !StoaPlugin::UspUser.matches?(654321, :cpf, 12345678)
  33 + end
  34 +end
  35 +
... ...