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

Daniel P. Berrange berrange at redhat.com
Mon Mar 15 15:27:42 UTC 2010


On Sun, Mar 14, 2010 at 10:08:30PM +0100, Matthias Bolte wrote:
> 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;
>  }

ACK

Daniel
-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list