remote_user_plugin.rb 2.11 KB
class RemoteUserPlugin < Noosfero::Plugin

  def self.plugin_name
    "Remote User Plugin"
  end

  def self.plugin_description
    _("A plugin that add remote user support.")
  end

  def application_controller_filters
    block = proc do

      begin
        remote_user = request.headers["HTTP_REMOTE_USER"]
        user_data = request.env['HTTP_REMOTE_USER_DATA']

        if remote_user.blank?
          self.current_user = nil
        else
          if user_data.blank?
            remote_user_email = remote_user + '@remote.user'
            remote_user_name = remote_user
          else
            user_data = JSON.parse(user_data)
            remote_user_email = user_data['email']
            remote_user_name = user_data['name']
          end

          if !logged_in?
            self.current_user = User.find_by_login(remote_user)
            unless self.current_user
              self.current_user = User.create!(:login => remote_user, :email => remote_user_email, :name => remote_user_name, :password => ('pw4'+remote_user), :password_confirmation => ('pw4'+remote_user))
              self.current_user.activate
            end
            self.current_user.save!
          else
            if remote_user != self.current_user.login
              self.current_user.forget_me
              reset_session

              self.current_user = User.find_by_login(remote_user)
              unless self.current_user
                self.current_user = User.create!(:login => remote_user, :email => remote_user_email, :name => remote_user_name, :password => ('pw4'+remote_user), :password_confirmation => ('pw4'+remote_user))
                self.current_user.activate
              end
              self.current_user.save!
            end
          end
        end
      rescue ::ActiveRecord::RecordInvalid
        session[:notice] = _('Could not create the remote user.')
        render_404
      rescue
        session[:notice] = _("Could not log in.")
        render_404
      end
    end

    [{
      :type => "before_filter",
      :method_name => "remote_user_authentication",
      :options => { },
      :block => block
    }]
  end
end