David Lutterkort
2008-Aug-15 23:53 UTC
[Ovirt-devel] [PATCH] Add a method to log into the OVirt server
Before we can do anything else, we need to go to the login controller and get a session cookie. Unfortunatly, this code requires some monkey-patching of ActiveResource::Connection to store the session cookie in the connection's headers. This patch should be applied after the series of patches I sent yesterday. Signed-off-by: David Lutterkort <lutter at redhat.com> --- wui/client/README | 7 ++++- wui/client/examples/script.rb | 2 + wui/client/lib/ovirt.rb | 47 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/wui/client/README b/wui/client/README index 4bdce27..ee1db15 100644 --- a/wui/client/README +++ b/wui/client/README @@ -10,5 +10,8 @@ The server is specified with a URL of the form http://USER:PASSWORD at HOST/ovirt This requires that the server is configured to allow HTTP authentication, -since there are no mechanisms in the API to forward krb5 tickets. You can -also try and connect to Mongrel running on HOST:3000 directly. +since there are no mechanisms in the API to forward krb5 tickets. + +Before calling any other method on the API, you need to call + OVirt::Base::site = "http://USER:PASSWORD at HOST/ovirt" + OVirt::Base::login diff --git a/wui/client/examples/script.rb b/wui/client/examples/script.rb index 2103ad7..1485535 100755 --- a/wui/client/examples/script.rb +++ b/wui/client/examples/script.rb @@ -58,6 +58,8 @@ EOF exit 1 end +OVirt::Base.login + # Get a single host by name host = OVirt::Host.find_by_hostname("node3.priv.ovirt.org") puts "#{host.uuid} has id #{host.id}" diff --git a/wui/client/lib/ovirt.rb b/wui/client/lib/ovirt.rb index 48739f4..ce8c310 100644 --- a/wui/client/lib/ovirt.rb +++ b/wui/client/lib/ovirt.rb @@ -2,8 +2,53 @@ require 'pp' require 'rubygems' require 'activeresource' +class ActiveResource::Connection + attr_accessor :session + + alias_method :old_default_header, :default_header + + def default_header + old_default_header + @default_header ||= {} + if session + @default_header["Cookie"] = session + end + @default_header + end +end + module OVirt - class Base < ActiveResource::Base ; end + class Base < ActiveResource::Base + def self.login + # Do the double-redirect handshake. We don't go directly + # to the login page, since we don't want to hardcode + # its location + response = get_redirected(prefix) + uri = URI::parse(response["Location"]) + response = get_redirected(uri.path) + unless connection.session = session_cookie(response) + raise "Authentication failed" + end + end + + private + def self.session_cookie(response) + if cookies = response.get_fields("Set-Cookie") + cookies.find { |cookie| + cookie.split(";")[0].split("=")[0] == "_ovirt_session_id" + } + end + end + + def self.get_redirected(path) + begin + # We can't use HEAD since it's not in Rails 2.0.2 + connection.get(path) + rescue ActiveResource::Redirection => e + return e.response + end + end + end class HardwarePool < Base def self.find_by_path(path) -- 1.5.5.1