[libvirt] [PATCH] xenapi: Request a username if there is non in the URI

Matthias Bolte matthias.bolte at googlemail.com
Sun Mar 14 21:08:30 UTC 2010


Use virRequestUsername and virRequestPassword.
---
 src/xenapi/xenapi_driver.c |  119 +++++++++++++++++++++++++++++++-------------
 1 files changed, 84 insertions(+), 35 deletions(-)

diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index 8d5c8bb..00b62b3 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -83,62 +83,101 @@ getCapsObject (void)
 static virDrvOpenStatus
 xenapiOpen (virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED)
 {
-    char *passwd = NULL;
-    xen_session *session;
-    struct _xenapiPrivate *privP;
+    char *username = NULL;
+    char *password = NULL;
+    struct _xenapiPrivate *privP = NULL;
 
     if (STRCASENEQ(conn->uri->scheme, "XenAPI")) {
         return VIR_DRV_OPEN_DECLINED;
     }
+
     if (conn->uri->server == NULL) {
-        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED, "Server name not in URI");
-        return VIR_DRV_OPEN_ERROR;
+        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED,
+                                  "Server name not in URI");
+        goto error;
+    }
+
+    if (auth == NULL) {
+        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED,
+                                  "Authentication Credentials not found");
+        goto error;
     }
-    if (auth) {
-        passwd = xenapiUtil_RequestPassword(auth, conn->uri->user, conn->uri->server);
+
+    if (conn->uri->user != NULL) {
+        username = strdup(conn->uri->user);
+
+        if (username == NULL) {
+            virReportOOMError();
+            goto error;
+        }
     } else {
-        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED, "Authentication Credentials not found");
-        return VIR_DRV_OPEN_ERROR;
+        username = virRequestUsername(auth, NULL, conn->uri->server);
+
+        if (username == NULL) {
+            xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED,
+                                      "Username request failed");
+            goto error;
+        }
     }
-    if (!passwd || !conn->uri->user) {
-        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED, "Username/Password not valid");
-        if (passwd) VIR_FREE(passwd);
-        return VIR_DRV_OPEN_ERROR;
+
+    password = virRequestPassword(auth, username, conn->uri->server);
+
+    if (password == NULL) {
+        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED,
+                                  "Password request failed");
+        goto error;
     }
+
     if (VIR_ALLOC(privP) < 0) {
         virReportOOMError();
-        return VIR_DRV_OPEN_ERROR;
+        goto error;
     }
+
     if (virAsprintf(&privP->url, "https://%s", conn->uri->server) < 0) {
         virReportOOMError();
-        VIR_FREE(passwd);
-        return VIR_DRV_OPEN_ERROR;
+        goto error;
     }
-    xenapiUtil_ParseQuery(conn, conn->uri, &privP->noVerify);
+
+    if (xenapiUtil_ParseQuery(conn, conn->uri, &privP->noVerify) < 0)
+        goto error;
+
+    if (!(privP->caps = getCapsObject())) {
+        xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR,
+                                  "Capabilities not found");
+        goto error;
+    }
+
     xmlInitParser();
     xmlKeepBlanksDefault(0);
     xen_init();
     curl_global_init(CURL_GLOBAL_ALL);
 
-    session = xen_session_login_with_password(call_func, privP, conn->uri->user, passwd, xen_api_latest_version);
+    privP->session = xen_session_login_with_password(call_func, privP, username,
+                                                     password, xen_api_latest_version);
 
-    if (session && session->ok) {
-        privP->session = session;
-        if (!(privP->caps = getCapsObject())) {
-            xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, "Capabilities not found");
-            VIR_FREE(passwd);
-            return VIR_DRV_OPEN_ERROR;
-        }
+    if (privP->session != NULL && privP->session->ok) {
         conn->privateData = privP;
-        VIR_FREE(passwd);
+
+        VIR_FREE(username);
+        VIR_FREE(password);
+
         return VIR_DRV_OPEN_SUCCESS;
-    } else {
-        xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED, "");
-        if (session) xenSessionFree(session);
+    }
+
+    xenapiSessionErrorHandler(conn, VIR_ERR_AUTH_FAILED, "");
+
+  error:
+    VIR_FREE(username);
+    VIR_FREE(password);
+
+    if (privP != NULL) {
+        if (privP->session != NULL)
+            xenSessionFree(privP->session);
+
         VIR_FREE(privP);
-        VIR_FREE(passwd);
-        return VIR_DRV_OPEN_ERROR;
     }
+
+    return VIR_DRV_OPEN_ERROR;
 }
 
 /*
@@ -150,10 +189,20 @@ xenapiOpen (virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUS
 static int
 xenapiClose (virConnectPtr conn)
 {
-    xen_session_logout(((struct _xenapiPrivate *)(conn->privateData))->session);
-    virCapabilitiesFree(((struct _xenapiPrivate *)(conn->privateData))->caps);
-    VIR_FREE(((struct _xenapiPrivate *)(conn->privateData))->url);
-    VIR_FREE(conn->privateData);
+    struct _xenapiPrivate *priv = conn->privateData;
+
+    virCapabilitiesFree(priv->caps);
+
+    if (priv->session != NULL) {
+        xen_session_logout(priv->session);
+        xenSessionFree(priv->session);
+    }
+
+    VIR_FREE(priv->url);
+    VIR_FREE(priv);
+
+    conn->privateData = NULL;
+
     return 0;
 }
 
-- 
1.6.3.3




More information about the libvir-list mailing list