Report abuse


			
require 'openid'
require 'openid/store/filesystem'
require 'openid/extensions/sreg'
require 'timeout'

class LoginsController < ApplicationController

  def show
    redirect_to new_login_url unless logged_in?
  end

  def new
    redirect_to login_url if logged_in?
  end


  def create
    Timeout.timeout(10) do
      res = openid_consumer.begin(params[:openid_url])
      #Only request additional data if new user
      unless User.find_by_openid_url(res.endpoint.claimed_id)
        sreg = OpenID::SReg::Request.new
        sreg.request_fields(['nickname', 'fullname', 'email'], false)
        res.add_extension(sreg)
      end
      redirect_to res.redirect_url(root_url, complete_login_url)
    end
  rescue OpenID::OpenIDError, Timeout::Error => e
    flash.now[:error] = 'Could not contact OpenID URL'
    render :action => 'new'
  end


  def complete
    res = openid_consumer.complete(params.reject{|k,v| request.path_parameters.include?(k) }, request.url)

    case res.status
    when OpenID::Consumer::SUCCESS
      self.current_user = User.find_by_openid_url(res.identity_url)
      if logged_in?
        flash[:notice] = 'Logged in'
        redirect_to user_posts_url(current_user)
      else
        sreg = OpenID::SReg::Response.from_success_response(res).data
        sreg_data = {:username => sreg['nickname'], :name => sreg['fullname'], :email => sreg['email']}
        user = User.new(sreg_data)
        user.openid_url = res.identity_url

        if user.save
          self.current_user = user
          redirect_to user_posts_url(user)
        else
          flash[:sreg_data] = {:username => sreg['nickname'], :name => sreg['fullname'], :email => sreg['email'], :openid_url => res.identity_url}
          redirect_to new_user_url
        end
      end
      return
    when OpenID::Consumer::CANCEL
      flash[:error] = 'Authentication was canceled'
    when OpenID::Consumer::FAILURE
      flash[:error] = "FAIL: #{res.message}"
    when OpendID::Consumer::SETUP_NEEDED
      flash[:error] = 'Setup needed'
    else
      flash[:error] = 'Unknown response'
    end

    redirect_to login_url
  end


  def destroy
    self.current_user = nil
    redirect_to :back
  end


private

  def openid_consumer
    @openid_consumer ||= OpenID::Consumer.new(session,      
      OpenID::Store::Filesystem.new(File.join(RAILS_ROOT, 'tmp', 'openid')))
  end

end