Commit 640774fa7004c5823dc11f433e1cb2b02d012468
1 parent
9ec7a43a
Exists in
master
and in
28 other branches
[stoa] Stoa Plugin
Showing
9 changed files
with
278 additions
and
0 deletions
Show diff stats
| @@ -0,0 +1,12 @@ | @@ -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 | +`` |
| @@ -0,0 +1,31 @@ | @@ -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,59 @@ | @@ -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 |
| @@ -0,0 +1,21 @@ | @@ -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 |
| @@ -0,0 +1,32 @@ | @@ -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 @@ | @@ -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 | + |
| @@ -0,0 +1,35 @@ | @@ -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 | + |