Class: OpenidConsumer

Inherits:
Application show all
Defined in:
app/controllers/openid_consumer.rb

Instance Method Summary collapse

Methods inherited from Application

#access_denied, #append_tree, #bad_request?, #binary?, #build_tree, #can_edit_admin?, #cleanup_session, #conflict?, #convert_newline_to_br, #determine_name, #forbidden?, #format_exception, #is_admin?, #is_last_admin?, #list_available_recipes_for, #load_cookbook_segment, #load_environments, #load_session_user, #login_required, #logout_and_redirect_to_login, #not_found?, #redirect_back_or_default, #require_admin, #segment_files, #show_plain_file, #store_location, #str_to_bool, #syntax_highlight

Instance Method Details

#completeObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'app/controllers/openid_consumer.rb', line 67

def complete
  # FIXME - url_for some action is not necessarily the current URL.
  current_url = absolute_url(:openid_consumer_complete)
  parameters = params.reject{|k,v| k == "controller" || k == "action"}
  oidresp = consumer.complete(parameters, current_url)
  case oidresp.status
    when OpenID::Consumer::FAILURE
      raise BadRequest, "Verification failed: #{oidresp.message}" + (oidresp.display_identifier ? " for identifier '#{oidresp.display_identifier}'" : "")
    when OpenID::Consumer::SUCCESS
      #session[:openid] = oidresp.identity_url
      # The "if" condition no longer seems need to/can be reached, so I took it out. [nuo] 
      #
      # if oidresp.display_identifier =~ /openid\/server\/node\/(.+)$/
      #   reg_name = $1
      #   reg = Chef::OpenIDRegistration.load(reg_name)
      #   Chef::Log.error("#{reg_name} is an admin #{reg.admin}")
      #   session[:level] = reg.admin ? :admin : :node
      #   session[:node_name] = $1
      #else
      users = Chef::WebUIUser.list
      #TODO: This is expensive. Should think of a better way [nuo]
      # Go through each user object and check if the current OpenID associates with the user
      users.each do |u, url|
        user = Chef::WebUIUser.load(u)
        if user.openid == oidresp.identity_url
          session[:user] = user.name
          if user.admin
            session[:level] = :admin
          else
            session[:level] = :user
          end
          break
        end
      end        
      if session[:user].nil?
        redirect(url(:openid_consumer),  :message => { :error => "No user is associated with this OpenID." })
        return "No user is associated with this OpenID."
      end 
      #end
      redirect_back_or_default(absolute_url(:nodes))
      return "Verification of #{oidresp.display_identifier} succeeded."
    when OpenID::Consumer::SETUP_NEEDED
      return "Immediate request failed - Setup Needed"
    when OpenID::Consumer::CANCEL
      return "OpenID transaction cancelled."
    else
  end
  redirect absolute_url(:openid_consumer)
end

#indexObject



29
30
31
32
33
34
35
# File 'app/controllers/openid_consumer.rb', line 29

def index
  if request.xhr?
    render :layout => false
  else
    render :layout => 'login'
  end
end

#loginObject



56
57
58
59
60
61
62
63
64
65
# File 'app/controllers/openid_consumer.rb', line 56

def 
  if session[:user] 
    redirect(url(:nodes), :message => { :warning => "You've already logged in with user #{session[:user]}"  })
  else
    oid = params[:openid_identifier]
    raise(Unauthorized, "Sorry, #{oid} is not an authorized OpenID.") unless is_authorized_openid_identifier?(oid, Chef::Config[:authorized_openid_identifiers])
    raise(Unauthorized, "Sorry, #{oid} is not an authorized OpenID Provider.") unless is_authorized_openid_provider?(oid, Chef::Config[:authorized_openid_providers])
    start
  end
end

#logoutObject



117
118
119
120
# File 'app/controllers/openid_consumer.rb', line 117

def logout
  cleanup_session
  redirect url(:top)
end

#startObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/controllers/openid_consumer.rb', line 37

def start
  oid = params[:openid_identifier]
  begin
    oidreq = consumer.begin(oid)
  rescue OpenID::OpenIDError => e
    raise BadRequest, "Discovery failed for #{oid}: #{e}"
  end

  return_to = absolute_url(:openid_consumer_complete)
  realm = absolute_url(:openid_consumer)

  if oidreq.send_redirect?(realm, return_to, params[:immediate])
    return redirect(oidreq.redirect_url(realm, return_to, params[:immediate]))
  else
    @form_text = oidreq.form_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'})
    render
  end
end