Noosfero/noosfero

View on GitHub
plugins/remote_user/lib/remote_user_plugin.rb

Summary

Maintainability
A
2 hrs
Test Coverage
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 api_custom_login(request)
    RemoteUserPlugin::current_user request, environment
  end

  def self.current_user(request, environment)
    remote_user = request.env["HTTP_REMOTE_USER"]
    user_data = request.env["HTTP_REMOTE_USER_DATA"]

    remote_user_email = user_data.blank? ? (remote_user + "@remote.user") : JSON.parse(user_data)["email"]
    remote_user_name = user_data.blank? ? remote_user : JSON.parse(user_data)["name"]

    user = User.where(environment_id: environment, login: remote_user).first
    unless user
      user = User.create!(environment: environment, login: remote_user, email: remote_user_email, name: remote_user_name, password: ("pw4" + remote_user), password_confirmation: ("pw4" + remote_user))
      user.activate!
      user.save!
    end
    user
  end

  def application_controller_filters
    block = proc do
      begin
        remote_user = request.headers["HTTP_REMOTE_USER"]

        if remote_user.blank?
          self.current_user = nil
        else
          if !logged_in?
            self.current_user = RemoteUserPlugin::current_user request, environment
          else
            if remote_user != self.current_user.login
              self.current_user.forget_me
              reset_session
              self.current_user = RemoteUserPlugin::current_user request, environment
            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_action",
      method_name: "remote_user_authentication",
      options: {},
      block: block
    }]
  end
end