authpds 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +1 -1
- data/README.rdoc +28 -7
- data/Rakefile +1 -6
- data/lib/authpds.rb +0 -2
- data/lib/authpds/acts_as_authentic.rb +19 -17
- data/lib/authpds/controllers/authpds_controller.rb +51 -54
- data/lib/authpds/controllers/authpds_sessions_controller.rb +20 -20
- data/lib/authpds/exlibris/pds.rb +1 -7
- data/lib/authpds/session.rb +29 -28
- data/lib/authpds/version.rb +1 -1
- data/test/support/user.rb +6 -6
- data/test/test_helper.rb +1 -1
- data/test/unit/authpds_controller_test.rb +9 -10
- data/test/unit/authpds_user_sessions_controller_test.rb +2 -2
- data/test/unit/pds_test.rb +8 -21
- data/test/unit/user_session_test.rb +20 -22
- data/test/unit/user_test.rb +21 -15
- metadata +28 -14
- data/lib/authpds/institution.rb +0 -44
- data/lib/authpds/institution_list.rb +0 -75
- data/test/support/config/institutions2.yml +0 -352
- data/test/unit/institution_list_test.rb +0 -63
- data/test/unit/institution_test.rb +0 -17
    
        data/MIT-LICENSE
    CHANGED
    
    
    
        data/README.rdoc
    CHANGED
    
    | @@ -1,14 +1,17 @@ | |
| 1 1 | 
             
            = Authpds
         | 
| 2 | 
            +
            {<img src="https://secure.travis-ci.org/scotdalton/authpds.png?branch=master" alt="Build Status" />}[https://travis-ci.org/scotdalton/authpds]
         | 
| 3 | 
            +
            {<img src="https://gemnasium.com/scotdalton/authpds.png" alt="Dependency Status" />}[https://gemnasium.com/scotdalton/authpds]
         | 
| 4 | 
            +
            {<img src="https://codeclimate.com/badge.png" alt="Code Climage" />}[https://codeclimate.com/github/scotdalton/authpds]
         | 
| 2 5 |  | 
| 3 6 | 
             
            This gem provides a mechanism for authenticating via Ex Libris' Patron Directory Services (PDS) and provides hooks for making authorization decisions based on the user information provided by PDS.  It leverages the authlogic gem and depends on a User-like model.
         | 
| 4 7 |  | 
| 5 8 | 
             
            == Basics
         | 
| 6 9 | 
             
            === Generate User-like model
         | 
| 7 10 | 
             
              $ rails generate model User username:string email:string firstname:string \
         | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 11 | 
            +
                lastname:string mobile_phone:string crypted_password:string password_salt:string \
         | 
| 12 | 
            +
                session_id:string persistence_token:string login_count:integer last_request_at:string \
         | 
| 13 | 
            +
                current_login_at:string last_login_at:string last_login_ip:string current_login_ip:string \
         | 
| 14 | 
            +
                user_attributes:text refreshed_at:datetime
         | 
| 12 15 |  | 
| 13 16 | 
             
            === Configure User-like model
         | 
| 14 17 | 
             
              class User < ActiveRecord::Base
         | 
| @@ -72,11 +75,27 @@ You can create multiple institution listings as follows: | |
| 72 75 |  | 
| 73 76 | 
             
            The two separate institutions above share a link_code in this example. The link_code attribute determines the institute parameter in the PDS url.
         | 
| 74 77 |  | 
| 78 | 
            +
            ==== Institution fields
         | 
| 79 | 
            +
            :name:: Institution name
         | 
| 80 | 
            +
            :display_name:: Name to display to users.
         | 
| 81 | 
            +
            :default:: Boolean indicating whether this is a default Institution.  Alternatively, an Institution can be named 'default'.
         | 
| 82 | 
            +
            :parent_institution:: A parent Institution from which this child will inherit fields.
         | 
| 83 | 
            +
            :ip_addresses:: IP addresses associated with the Institution.
         | 
| 84 | 
            +
            :login:: Login configurations associated with the Institution.
         | 
| 85 | 
            +
            :layouts:: Layout configurations associated with the Institution.
         | 
| 86 | 
            +
            :views:: View configurations associated with the Institution.
         | 
| 87 | 
            +
            :controllers:: Controller configurations associated with the Institution.
         | 
| 88 | 
            +
            :models:: Model configurations associated with the Institution.
         | 
| 89 | 
            +
              
         | 
| 90 | 
            +
             | 
| 75 91 | 
             
            ==== Create institution initializer
         | 
| 76 92 |  | 
| 77 | 
            -
             | 
| 93 | 
            +
            Most likely it will just work if you put the config file in 
         | 
| 94 | 
            +
              "#{Rails.root}/config/institutions.yml"
         | 
| 78 95 |  | 
| 79 | 
            -
             | 
| 96 | 
            +
            If you have your institutions config file in another location make sure to change the line below accordingly.
         | 
| 97 | 
            +
              Institutions.loadpaths << File.join("other", "path")
         | 
| 98 | 
            +
              Institutions.filenames << "other_file.yml"
         | 
| 80 99 |  | 
| 81 100 | 
             
            === Mixin authpds methods into UserSessionsController
         | 
| 82 101 | 
             
              class UserSessionsController < ApplicationController
         | 
| @@ -126,4 +145,6 @@ method, e.g. :before_persisting, :persist, :after_persisting.  We're using the : | |
| 126 145 | 
             
            === Access to the controller in Session
         | 
| 127 146 | 
             
            The class that Session extends, Authologic::Session::Base, has an explicit handle to the current controller via the instance method 
         | 
| 128 147 | 
             
            :controller.  This gives our custom instance methods access to cookies, session information, loggers, etc. and also allows them to 
         | 
| 129 | 
            -
            perform redirects and renders.
         | 
| 148 | 
            +
            perform redirects and renders.
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            == Build Status {<img src="https://secure.travis-ci.org/scotdalton/authpds.png"/>}[http://travis-ci.org/scotdalton/authpds]
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -20,13 +20,9 @@ RDoc::Task.new(:rdoc) do |rdoc| | |
| 20 20 | 
             
              rdoc.rdoc_files.include('lib/**/*.rb')
         | 
| 21 21 | 
             
            end
         | 
| 22 22 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 23 | 
             
            Bundler::GemHelper.install_tasks
         | 
| 27 24 |  | 
| 28 25 | 
             
            require 'rake/testtask'
         | 
| 29 | 
            -
             | 
| 30 26 | 
             
            Rake::TestTask.new(:test) do |t|
         | 
| 31 27 | 
             
              t.libs << 'lib'
         | 
| 32 28 | 
             
              t.libs << 'test'
         | 
| @@ -34,5 +30,4 @@ Rake::TestTask.new(:test) do |t| | |
| 34 30 | 
             
              t.verbose = false
         | 
| 35 31 | 
             
            end
         | 
| 36 32 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
            task :default => :test
         | 
| 33 | 
            +
            task :default => :test
         | 
    
        data/lib/authpds.rb
    CHANGED
    
    
| @@ -2,6 +2,7 @@ module Authpds | |
| 2 2 | 
             
              module ActsAsAuthentic
         | 
| 3 3 | 
             
                def self.included(klass)
         | 
| 4 4 | 
             
                  klass.class_eval do
         | 
| 5 | 
            +
                    require 'institutions'
         | 
| 5 6 | 
             
                    add_acts_as_authentic_module(InstanceMethods, :prepend)
         | 
| 6 7 | 
             
                  end
         | 
| 7 8 | 
             
                end
         | 
| @@ -14,7 +15,6 @@ module Authpds | |
| 14 15 | 
             
                    end
         | 
| 15 16 | 
             
                  end
         | 
| 16 17 |  | 
| 17 | 
            -
                  public
         | 
| 18 18 | 
             
                  # Setting the username field also resets the persistence_token if the value changes.
         | 
| 19 19 | 
             
                  def username=(value)
         | 
| 20 20 | 
             
                    write_attribute(:username, value)
         | 
| @@ -22,29 +22,26 @@ module Authpds | |
| 22 22 | 
             
                  end
         | 
| 23 23 |  | 
| 24 24 | 
             
                  def primary_institution
         | 
| 25 | 
            -
                     | 
| 26 | 
            -
                    InstitutionList.instance.get(user_attributes[:primary_institution]) unless user_attributes.nil?
         | 
| 25 | 
            +
                    all_institutions[user_attributes[:primary_institution]] unless user_attributes.nil?
         | 
| 27 26 | 
             
                  end
         | 
| 28 27 |  | 
| 29 | 
            -
                  def primary_institution=( | 
| 30 | 
            -
                     | 
| 31 | 
            -
                    self.user_attributes=({:primary_institution =>  | 
| 28 | 
            +
                  def primary_institution=(new_primary_institution)
         | 
| 29 | 
            +
                    new_primary_institution = new_primary_institution.code if new_primary_institution.is_a?(Institutions::Institution)
         | 
| 30 | 
            +
                    self.user_attributes=({:primary_institution => new_primary_institution.to_sym})
         | 
| 32 31 | 
             
                  end
         | 
| 33 32 |  | 
| 34 33 | 
             
                  def institutions
         | 
| 35 | 
            -
                    return nil unless InstitutionList.institutions_defined?
         | 
| 36 34 | 
             
                    user_attributes[:institutions].collect { |institution|
         | 
| 37 | 
            -
                       | 
| 35 | 
            +
                      all_institutions[institution] } unless user_attributes.nil?
         | 
| 38 36 | 
             
                  end
         | 
| 39 37 |  | 
| 40 | 
            -
                  def institutions=( | 
| 41 | 
            -
                    raise ArgumentError.new(
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                     | 
| 44 | 
            -
                       | 
| 45 | 
            -
                      institution unless InstitutionList.instance.get(institution).nil?
         | 
| 38 | 
            +
                  def institutions=(new_institutions)
         | 
| 39 | 
            +
                    raise ArgumentError.new("Institutions input should be an array.") unless new_institutions.is_a?(Array)
         | 
| 40 | 
            +
                    new_institutions.collect! { |institution| institution.to_sym }
         | 
| 41 | 
            +
                    new_institutions.select! { |institution|
         | 
| 42 | 
            +
                      all_institutions[ new_institutions.is_a?(Institutions::Institution) ? institution.code : institution.to_sym]
         | 
| 46 43 | 
             
                    }
         | 
| 47 | 
            -
                    self.user_attributes=({:institutions =>  | 
| 44 | 
            +
                    self.user_attributes=({:institutions => new_institutions}) unless new_institutions.empty?
         | 
| 48 45 | 
             
                  end
         | 
| 49 46 |  | 
| 50 47 | 
             
                  # "Smart" updating of user_attributes.  Maintains user_attributes that are not explicity overwritten.
         | 
| @@ -54,13 +51,18 @@ module Authpds | |
| 54 51 | 
             
                    write_attribute(:user_attributes, (user_attributes || {}).merge(new_attributes))
         | 
| 55 52 | 
             
                  end
         | 
| 56 53 |  | 
| 57 | 
            -
                  # Returns a boolean based on whether the User has been refreshed recently. | 
| 54 | 
            +
                  # Returns a boolean based on whether the User has been refreshed recently.
         | 
| 58 55 | 
             
                  # If User#refreshed_at is older than User#expiration_date, the User is expired and the data
         | 
| 59 56 | 
             
                  # may need to be refreshed.
         | 
| 60 57 | 
             
                  def expired?
         | 
| 61 58 | 
             
                    # If the record is older than the expiration date, it is expired.
         | 
| 62 | 
            -
                    (refreshed_at.nil?) ? true : refreshed_at < expiration_date | 
| 59 | 
            +
                    (refreshed_at.nil?) ? true : refreshed_at < expiration_date
         | 
| 63 60 | 
             
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def all_institutions
         | 
| 63 | 
            +
                    Institutions.institutions
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                  private :all_institutions
         | 
| 64 66 | 
             
                end
         | 
| 65 67 | 
             
              end
         | 
| 66 68 | 
             
            end
         | 
| @@ -2,73 +2,70 @@ module Authpds | |
| 2 2 | 
             
              module Controllers
         | 
| 3 3 | 
             
                module AuthpdsController
         | 
| 4 4 |  | 
| 5 | 
            +
                  # Set helper methods when this module is included.
         | 
| 5 6 | 
             
                  def self.included(klass)
         | 
| 6 7 | 
             
                    klass.class_eval do
         | 
| 7 | 
            -
                      include InstanceMethods
         | 
| 8 8 | 
             
                      helper_method :current_user_session, :current_user, :current_primary_institution
         | 
| 9 9 | 
             
                    end
         | 
| 10 10 | 
             
                  end
         | 
| 11 | 
            -
                
         | 
| 12 | 
            -
                  module InstanceMethods
         | 
| 13 11 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 12 | 
            +
                  # Get the current UserSession if it exists
         | 
| 13 | 
            +
                  def current_user_session
         | 
| 14 | 
            +
                    @current_user_session ||= UserSession.find
         | 
| 15 | 
            +
                  end
         | 
| 18 16 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 17 | 
            +
                  # Get the current User if there is a UserSession
         | 
| 18 | 
            +
                  def current_user
         | 
| 19 | 
            +
                    @current_user ||= current_user_session.record unless current_user_session.nil?
         | 
| 20 | 
            +
                  end
         | 
| 23 21 |  | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
                                          nil
         | 
| 41 | 
            -
                    end
         | 
| 22 | 
            +
                  # Determine current primary institution based on:
         | 
| 23 | 
            +
                  #   0. institutions are not being used (returns nil)
         | 
| 24 | 
            +
                  #   1. institution query string parameter in URL
         | 
| 25 | 
            +
                  #   2. institution associated with the client IP
         | 
| 26 | 
            +
                  #   3. primary institution for the current user
         | 
| 27 | 
            +
                  #   4. first default institution
         | 
| 28 | 
            +
                  def current_primary_institution
         | 
| 29 | 
            +
                    @current_primary_institution ||=
         | 
| 30 | 
            +
                      (institution_param.nil? or all_institutions[institution_param].nil?) ?
         | 
| 31 | 
            +
                        (primary_institution_from_ip.nil?) ?
         | 
| 32 | 
            +
                          (current_user.nil? or current_user.primary_institution.nil?) ?
         | 
| 33 | 
            +
                            Institutions.defaults.first :
         | 
| 34 | 
            +
                              current_user.primary_institution :
         | 
| 35 | 
            +
                                primary_institution_from_ip :
         | 
| 36 | 
            +
                                  all_institutions[institution_param]
         | 
| 37 | 
            +
                  end
         | 
| 42 38 |  | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                     | 
| 39 | 
            +
                  # Override to add institution.
         | 
| 40 | 
            +
                  def url_for(options={})
         | 
| 41 | 
            +
                    options[institution_param_key] ||= institution_param unless institution_param.nil?
         | 
| 42 | 
            +
                    super options
         | 
| 43 | 
            +
                  end
         | 
| 47 44 |  | 
| 48 | 
            -
             | 
| 49 | 
            -
                     | 
| 50 | 
            -
             | 
| 51 | 
            -
                    def institution_layout
         | 
| 52 | 
            -
                      (current_primary_institution.nil? or current_primary_institution.application_layout.nil?) ? 
         | 
| 53 | 
            -
                        :application : current_primary_institution.application_layout
         | 
| 54 | 
            -
                    end
         | 
| 45 | 
            +
                  def user_session_redirect_url(url)
         | 
| 46 | 
            +
                    (url.nil?) ? (request.referer.nil?) ? root_url : request.referer : url
         | 
| 47 | 
            +
                  end
         | 
| 55 48 |  | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
                      super(options)          
         | 
| 62 | 
            -
                    end
         | 
| 49 | 
            +
                  # Grab the first institution that matches the client IP
         | 
| 50 | 
            +
                  def primary_institution_from_ip
         | 
| 51 | 
            +
                    Institutions.with_ip(request.remote_ip).first unless request.nil?
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                  private :primary_institution_from_ip
         | 
| 63 54 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
                     | 
| 55 | 
            +
                  def institution_param_key
         | 
| 56 | 
            +
                    @institution_param_key ||= UserSession.institution_param_key
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                  private :institution_param_key
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  def institution_param
         | 
| 61 | 
            +
                    params["#{institution_param_key}"].to_sym unless params["#{institution_param_key}"].nil?
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                  private :institution_param
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  def all_institutions
         | 
| 66 | 
            +
                    Institutions.institutions
         | 
| 71 67 | 
             
                  end
         | 
| 68 | 
            +
                  private :all_institutions
         | 
| 72 69 | 
             
                end
         | 
| 73 70 | 
             
              end
         | 
| 74 71 | 
             
            end
         | 
| @@ -2,28 +2,28 @@ module Authpds | |
| 2 2 | 
             
              module Controllers
         | 
| 3 3 | 
             
                module AuthpdsSessionsController
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 5 | 
            +
                  # GET /user_sessions/new
         | 
| 6 | 
            +
                  # GET /login
         | 
| 7 | 
            +
                  def new
         | 
| 8 | 
            +
                    @user_session = UserSession.new(params)
         | 
| 9 | 
            +
                    redirect_to @user_session.login_url(params) unless @user_session.login_url.nil?
         | 
| 10 | 
            +
                    raise RuntimeError.new( "Error in #{self.class}.\nNo login url defined") if @user_session.login_url.nil?
         | 
| 11 | 
            +
                  end
         | 
| 12 12 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 13 | 
            +
                  # GET /validate
         | 
| 14 | 
            +
                  def validate
         | 
| 15 | 
            +
                    @user_session = UserSession.create(params[:user_session])
         | 
| 16 | 
            +
                    redirect_to (params[:return_url].nil?) ? root_url : params[:return_url]
         | 
| 17 | 
            +
                  end
         | 
| 18 18 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 19 | 
            +
                  # DELETE /user_sessions/1
         | 
| 20 | 
            +
                  # GET /logout
         | 
| 21 | 
            +
                  def destroy
         | 
| 22 | 
            +
                    user_session = UserSession.find
         | 
| 23 | 
            +
                    logout_url = user_session.logout_url(params) unless user_session.nil?
         | 
| 24 | 
            +
                    user_session.destroy unless user_session.nil?
         | 
| 25 | 
            +
                    redirect_to user_session_redirect_url(logout_url)
         | 
| 26 | 
            +
                  end
         | 
| 27 27 | 
             
                end
         | 
| 28 28 | 
             
              end
         | 
| 29 29 | 
             
            end
         | 
    
        data/lib/authpds/exlibris/pds.rb
    CHANGED
    
    | @@ -4,6 +4,7 @@ module Authpds | |
| 4 4 | 
             
                  require 'nokogiri'
         | 
| 5 5 | 
             
                  require 'uri'
         | 
| 6 6 | 
             
                  require 'net/http'
         | 
| 7 | 
            +
                  require 'net/https'
         | 
| 7 8 |  | 
| 8 9 | 
             
                  # Makes a call to the PDS get-attribute API.
         | 
| 9 10 | 
             
                  # Defaults attribute equal to "bor_info".
         | 
| @@ -40,7 +41,6 @@ module Authpds | |
| 40 41 | 
             
                  # Makes a call get-attribute with attribute "bor_info".
         | 
| 41 42 | 
             
                  # Raises an exception if there is an unexpected response.
         | 
| 42 43 | 
             
                  class BorInfo < GetAttribute
         | 
| 43 | 
            -
             | 
| 44 44 | 
             
                    protected
         | 
| 45 45 | 
             
                    def initialize(pds_url, calling_system, pds_handle)
         | 
| 46 46 | 
             
                      super(pds_url, calling_system, pds_handle, "bor_info")
         | 
| @@ -53,12 +53,6 @@ module Authpds | |
| 53 53 | 
             
                        self.class.send(:attr_reader, pds_attr)
         | 
| 54 54 | 
             
                        instance_variable_set("@#{pds_attr}".to_sym, xml_element.inner_text) unless xml_element.inner_text.nil?
         | 
| 55 55 | 
             
                      }
         | 
| 56 | 
            -
                      # bor_info_attributes.each_value { |xml_element|
         | 
| 57 | 
            -
                      #   pds_attr = xml_element.gsub("-", "_")
         | 
| 58 | 
            -
                      #   self.class.send(:attr_reader, pds_attr)
         | 
| 59 | 
            -
                      #   instance_variable_set("@#{pds_attr}".to_sym, 
         | 
| 60 | 
            -
                      #     @response.at("#{xml_element}").inner_text) unless @response.at("//bor-info/#{xml_element}").nil?
         | 
| 61 | 
            -
                      # }
         | 
| 62 56 | 
             
                    end
         | 
| 63 57 | 
             
                  end
         | 
| 64 58 | 
             
                end
         | 
    
        data/lib/authpds/session.rb
    CHANGED
    
    | @@ -1,12 +1,12 @@ | |
| 1 1 | 
             
            module Authpds
         | 
| 2 2 | 
             
              # == Overview
         | 
| 3 3 | 
             
              # The Authpds gem mixes in callbacks to Authlogic for persisting
         | 
| 4 | 
            -
              # sessions based on a valid PDS handle. | 
| 4 | 
            +
              # sessions based on a valid PDS handle.
         | 
| 5 5 | 
             
              # The module extends Authlogic and should be compatible with Authlogic configuation.
         | 
| 6 6 | 
             
              # It also provides hooks for custom functionality.
         | 
| 7 7 | 
             
              # The documentation below describes the hooks available, PDS config methods
         | 
| 8 8 | 
             
              # and further details about the module.
         | 
| 9 | 
            -
              # | 
| 9 | 
            +
              #
         | 
| 10 10 | 
             
              # == Config Options Available
         | 
| 11 11 | 
             
              # :pds_url:: Base pds url
         | 
| 12 12 | 
             
              # :calling_system:: Name of the system (authpds)
         | 
| @@ -17,7 +17,7 @@ module Authpds | |
| 17 17 | 
             
              # :pds_record_identifier:: PDS user method to call to identify record
         | 
| 18 18 | 
             
              # :institution_param_key:: Querystring parameter key for the institution value in this system
         | 
| 19 19 | 
             
              # :validate_url_name:: URL name for validation action in routes (validate_url)
         | 
| 20 | 
            -
              # | 
| 20 | 
            +
              #
         | 
| 21 21 | 
             
              # == Hooks Available
         | 
| 22 22 | 
             
              # :pds_record_identifier:: Allows for more complex logic in determining what should be used as the record identifier. Defaults to what was set in the pds_record_identifier config.  Returns a Symbol.
         | 
| 23 23 | 
             
              # :valid_sso_session?:: If there is no PDS handle, can we redirect to PDS to establish a SSO session based on some other information?  Returns a Boolean.
         | 
| @@ -25,15 +25,15 @@ module Authpds | |
| 25 25 | 
             
              # :additional_attributes:: Allows for additional attributes to be stored in the record.  Returns a Hash.
         | 
| 26 26 | 
             
              # :expiration_date:: Indicates when the record information should be refreshed.  Defaults to one week ago.  Returns a Date or Time.
         | 
| 27 27 | 
             
              #
         | 
| 28 | 
            -
              # == Further Implementation Details | 
| 28 | 
            +
              # == Further Implementation Details
         | 
| 29 29 | 
             
              # === Persisting a Session in AuthLogic
         | 
| 30 | 
            -
              # When persisting a Session, Authlogic attempts to create the Session based on information available | 
| 30 | 
            +
              # When persisting a Session, Authlogic attempts to create the Session based on information available
         | 
| 31 31 | 
             
              # without having to perform an actual login by calling the :persisting? method. Authologic provides several callbacks from the :persisting?
         | 
| 32 32 | 
             
              # method, e.g. :before_persisting, :persist, :after_persisting.  We're using the :persist callback and setting it to :persist_session.
         | 
| 33 | 
            -
              # | 
| 33 | 
            +
              #
         | 
| 34 34 | 
             
              # === Access to the controller in Session
         | 
| 35 | 
            -
              # The class that Session extends, Authologic::Session::Base, has an explicit handle to the current controller via the instance method | 
| 36 | 
            -
              # :controller.  This gives our custom instance methods access to cookies, session information, loggers, etc. and also allows them to | 
| 35 | 
            +
              # The class that Session extends, Authologic::Session::Base, has an explicit handle to the current controller via the instance method
         | 
| 36 | 
            +
              # :controller.  This gives our custom instance methods access to cookies, session information, loggers, etc. and also allows them to
         | 
| 37 37 | 
             
              # perform redirects and renders.
         | 
| 38 38 | 
             
              #
         | 
| 39 39 | 
             
              # === :before_login vs. :login_url
         | 
| @@ -43,6 +43,7 @@ module Authpds | |
| 43 43 | 
             
              module Session
         | 
| 44 44 | 
             
                def self.included(klass)
         | 
| 45 45 | 
             
                  klass.class_eval do
         | 
| 46 | 
            +
                    require 'institutions'
         | 
| 46 47 | 
             
                    extend Config
         | 
| 47 48 | 
             
                    include AuthpdsCallbackMethods
         | 
| 48 49 | 
             
                    include InstanceMethods
         | 
| @@ -50,7 +51,7 @@ module Authpds | |
| 50 51 | 
             
                    persist :persist_session
         | 
| 51 52 | 
             
                  end
         | 
| 52 53 | 
             
                end
         | 
| 53 | 
            -
             | 
| 54 | 
            +
             | 
| 54 55 | 
             
                module Config
         | 
| 55 56 | 
             
                  # Base pds url
         | 
| 56 57 | 
             
                  def pds_url(value = nil)
         | 
| @@ -106,8 +107,8 @@ module Authpds | |
| 106 107 | 
             
                    rw_config(:validate_url_name, value, "validate_url")
         | 
| 107 108 | 
             
                  end
         | 
| 108 109 | 
             
                  alias_method :validate_url_name=, :validate_url_name
         | 
| 109 | 
            -
                end | 
| 110 | 
            -
             | 
| 110 | 
            +
                end
         | 
| 111 | 
            +
             | 
| 111 112 | 
             
                module AuthpdsCallbackMethods
         | 
| 112 113 | 
             
                  # Hook for more complicated logic to determine PDS user record identifier
         | 
| 113 114 | 
             
                  def pds_record_identifier
         | 
| @@ -118,7 +119,7 @@ module Authpds | |
| 118 119 | 
             
                  def valid_sso_session?
         | 
| 119 120 | 
             
                    return false
         | 
| 120 121 | 
             
                  end
         | 
| 121 | 
            -
             | 
| 122 | 
            +
             | 
| 122 123 | 
             
                  # Hook to provide additional authorization requirements
         | 
| 123 124 | 
             
                  def additional_authorization
         | 
| 124 125 | 
             
                    return true
         | 
| @@ -128,13 +129,13 @@ module Authpds | |
| 128 129 | 
             
                  def additional_attributes
         | 
| 129 130 | 
             
                    {}
         | 
| 130 131 | 
             
                  end
         | 
| 131 | 
            -
             | 
| 132 | 
            +
             | 
| 132 133 | 
             
                  # Hook to update expiration date if necessary
         | 
| 133 134 | 
             
                  def expiration_date
         | 
| 134 135 | 
             
                    1.week.ago
         | 
| 135 136 | 
             
                  end
         | 
| 136 | 
            -
                end | 
| 137 | 
            -
             | 
| 137 | 
            +
                end
         | 
| 138 | 
            +
             | 
| 138 139 | 
             
                module InstanceMethods
         | 
| 139 140 | 
             
                  require "cgi"
         | 
| 140 141 |  | 
| @@ -154,7 +155,7 @@ module Authpds | |
| 154 155 | 
             
                  def logout_url(params={})
         | 
| 155 156 | 
             
                    return "#{self.class.pds_url}/pds?func=logout&url=#{CGI::escape(controller.user_session_redirect_url(self.class.redirect_logout_url))}"
         | 
| 156 157 | 
             
                  end
         | 
| 157 | 
            -
             | 
| 158 | 
            +
             | 
| 158 159 | 
             
                  # URL to redirect to in the case of establishing a SSO session.
         | 
| 159 160 | 
             
                  def sso_url(params={})
         | 
| 160 161 | 
             
                    return "#{self.class.pds_url}/pds?func=sso&institute=#{institution_attributes["link_code"]}&calling_system=#{self.class.calling_system}&url=#{CGI::escape(validate_url(params))}"
         | 
| @@ -171,7 +172,7 @@ module Authpds | |
| 171 172 | 
             
                      return nil
         | 
| 172 173 | 
             
                    end
         | 
| 173 174 | 
             
                  end
         | 
| 174 | 
            -
             | 
| 175 | 
            +
             | 
| 175 176 | 
             
                  private
         | 
| 176 177 | 
             
                  def authenticated?
         | 
| 177 178 | 
             
                    authenticate
         | 
| @@ -199,10 +200,10 @@ module Authpds | |
| 199 200 | 
             
                    # If PDS user is not nil (PDS session already established), authorize
         | 
| 200 201 | 
             
                    !pds_user.nil? && additional_authorization
         | 
| 201 202 | 
             
                  end
         | 
| 202 | 
            -
             | 
| 203 | 
            +
             | 
| 203 204 | 
             
                  # Get the record associated with this PDS user.
         | 
| 204 205 | 
             
                  def get_record(login)
         | 
| 205 | 
            -
             | 
| 206 | 
            +
                    record = klass.find_by_smart_case_login_field(login)
         | 
| 206 207 | 
             
                    record = klass.new login_field => login if record.nil?
         | 
| 207 208 | 
             
                    return record
         | 
| 208 209 | 
             
                  end
         | 
| @@ -214,7 +215,7 @@ module Authpds | |
| 214 215 | 
             
                    # Do this part only if user data has expired.
         | 
| 215 216 | 
             
                    if self.attempted_record.expired?
         | 
| 216 217 | 
             
                      pds_attributes.each do |record_attr, pds_attr|
         | 
| 217 | 
            -
                        self.attempted_record.send("#{record_attr}=".to_sym, | 
| 218 | 
            +
                        self.attempted_record.send("#{record_attr}=".to_sym,
         | 
| 218 219 | 
             
                          pds_user.send(pds_attr.to_sym)) if self.attempted_record.respond_to?("#{record_attr}=".to_sym)
         | 
| 219 220 | 
             
                      end
         | 
| 220 221 | 
             
                      pds_user.class.public_instance_methods(false).each do |pds_attr_reader|
         | 
| @@ -224,10 +225,10 @@ module Authpds | |
| 224 225 | 
             
                    end
         | 
| 225 226 | 
             
                    self.attempted_record.user_attributes= additional_attributes
         | 
| 226 227 | 
             
                  end
         | 
| 227 | 
            -
             | 
| 228 | 
            -
             | 
| 229 | 
            -
             | 
| 230 | 
            -
             | 
| 228 | 
            +
             | 
| 229 | 
            +
                  # Returns the URL for validating a UserSession on return from a remote login system.
         | 
| 230 | 
            +
                  def validate_url(params={})
         | 
| 231 | 
            +
                    url = controller.send(validate_url_name, :return_url => controller.user_session_redirect_url(params[:return_url]))
         | 
| 231 232 | 
             
                    return url if params.nil? or params.empty?
         | 
| 232 233 | 
             
                    url << "?" if url.match('\?').nil?
         | 
| 233 234 | 
             
                    params.each do |key, value|
         | 
| @@ -235,18 +236,18 @@ module Authpds | |
| 235 236 | 
             
                      url << "&#{self.class.calling_system}_#{key}=#{value}"
         | 
| 236 237 | 
             
                    end
         | 
| 237 238 | 
             
                    return url
         | 
| 238 | 
            -
             | 
| 239 | 
            -
             | 
| 239 | 
            +
                  end
         | 
| 240 | 
            +
             | 
| 240 241 | 
             
                  def validate_url_name
         | 
| 241 242 | 
             
                    @validate_url_name ||= self.class.validate_url_name
         | 
| 242 243 | 
             
                  end
         | 
| 243 244 |  | 
| 244 245 | 
             
                  def institution_attributes
         | 
| 245 | 
            -
                    @institution_attributes = | 
| 246 | 
            +
                    @institution_attributes =
         | 
| 246 247 | 
             
                      (controller.current_primary_institution.nil? or controller.current_primary_institution.login.nil?) ?
         | 
| 247 248 | 
             
                        {} : controller.current_primary_institution.login
         | 
| 248 249 | 
             
                  end
         | 
| 249 | 
            -
             | 
| 250 | 
            +
             | 
| 250 251 | 
             
                  def pds_attributes
         | 
| 251 252 | 
             
                    @pds_attributes ||= self.class.pds_attributes
         | 
| 252 253 | 
             
                  end
         |