[libvirt] [PATCH v2 5/6] Add ability to get a virIdentity from a virNetServerClientPtr

Jiri Denemark jdenemar at redhat.com
Tue Mar 19 11:22:16 UTC 2013


On Wed, Mar 13, 2013 at 15:24:04 +0000, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Add APIs which allow creation of a virIdentity from the info
> associated with a virNetServerClientPtr instance. This is done
> based on the results of client authentication processes like
> TLS, x509, SASL, SO_PEERCRED
> 
...
> diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
> index 40c8173..850f388 100644
> --- a/src/rpc/virnetserverclient.c
> +++ b/src/rpc/virnetserverclient.c
...
> @@ -642,6 +645,113 @@ int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client,
>  }
>  
>  
> +static virIdentityPtr
> +virNetServerClientCreateIdentity(virNetServerClientPtr client)
> +{
> +    char *processid = NULL;
> +    char *username = NULL;
> +    char *groupname = NULL;
> +#if WITH_SASL
> +    char *saslname = NULL;
> +#endif
> +    char *x509dname = NULL;
> +    char *seccontext = NULL;
> +    virIdentityPtr ret = NULL;
> +
> +    if (client->sock && virNetSocketIsLocal(client->sock)) {
> +        gid_t gid;
> +        uid_t uid;
> +        pid_t pid;
> +        if (virNetSocketGetUNIXIdentity(client->sock, &uid, &gid, &pid) < 0)
> +            goto cleanup;
> +
> +        if (!(username = virGetUserName(uid)))
> +            goto cleanup;
> +        if (!(groupname = virGetGroupName(gid)))
> +            goto cleanup;
> +        if (virAsprintf(&processid, "%d", (int)pid) < 0)

This should use "%lld" and (long long)pid to be consistent with the way
we format PIDs in libvirt. Also you sould call virReportOOMError() here
since virAsprintf() won't do it for you.

> +            goto cleanup;
> +    }
> +
> +#if WITH_SASL
> +    if (client->sasl) {
> +        const char *identity = virNetSASLSessionGetIdentity(client->sasl);
> +        if (identity &&
> +            !(saslname = strdup(identity))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }
> +#endif
> +
> +    if (client->tls) {
> +        const char *identity = virNetTLSSessionGetX509DName(client->tls);
> +        if (identity &&
> +            !(x509dname = strdup(identity))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }
> +
> +    if (client->sock &&
> +        virNetSocketGetSecurityContext(client->sock, &seccontext) < 0)
> +        goto cleanup;
> +
> +    if (!(ret = virIdentityNew()))
> +        goto cleanup;
> +
> +    if (username &&
> +        virIdentitySetAttr(ret, VIR_IDENTITY_ATTR_UNIX_USER_NAME, username) < 0)
> +        goto error;
> +    if (groupname &&
> +        virIdentitySetAttr(ret, VIR_IDENTITY_ATTR_UNIX_GROUP_NAME, groupname) < 0)
> +        goto error;
> +    if (processid &&
> +        virIdentitySetAttr(ret, VIR_IDENTITY_ATTR_UNIX_PROCESS_ID, processid) < 0)
> +        goto error;
> +#if HAVE_SASL
> +    if (saslname &&
> +        virIdentitySetAttr(ret, VIR_IDENTITY_ATTR_SASL_USER_NAME, saslname) < 0)
> +        goto error;
> +#endif
> +    if (x509dname &&
> +        virIdentitySetAttr(ret, VIR_IDENTITY_ATTR_X509_DISTINGUISHED_NAME, x509dname) < 0)
> +        goto error;
> +    if (seccontext &&
> +        virIdentitySetAttr(ret, VIR_IDENTITY_ATTR_SECURITY_CONTEXT, seccontext) < 0)
> +        goto error;

Long lines again.

> +
> +cleanup:
> +    VIR_FREE(username);
> +    VIR_FREE(groupname);
> +    VIR_FREE(processid);
> +    VIR_FREE(seccontext);
> +#if HAVE_SASL
> +    VIR_FREE(saslname);
> +#endif
> +    VIR_FREE(x509dname);
> +    return ret;
> +
> +error:
> +    virObjectUnref(ret);
> +    ret = NULL;
> +    goto cleanup;
> +}
...

ACK

Jirka




More information about the libvir-list mailing list