[libvirt] [PATCH] test driver: Add authentication to test driver.

Eric Blake eblake at redhat.com
Wed Jan 8 19:33:20 UTC 2014


On 01/08/2014 11:39 AM, Richard W.M. Jones wrote:
> There is no easy way to test authentication against libvirt.  This
> commit modifies the test driver to allow simple username/password
> authentication.
> 
> You modify the test XML by adding:
> 
>  <node>
>    ...
>    <auth>
>      <user password="123456">rich</user>
>      <user>jane</user>
>    </auth>
>  </node>
> 
> If there are any /node/auth/user elements, then authentication is
> required by the test driver (if none are present, then the test driver
> will work as before and not require authentication).

Cool - just the sort of thing the test:/// URI is intended for :)


> @@ -99,6 +107,8 @@ struct _testConn {
>      virNodeDeviceObjList devs;
>      int numCells;
>      testCell cells[MAX_CELLS];
> +    int numAuths;

size_t

> +    testAuthPtr auths;
>  

> +testParseAuthUsers(testConnPtr privconn,
> +                   xmlXPathContextPtr ctxt)
> +{
> +    int num, ret = -1;
> +    size_t i;
> +    xmlNodePtr *nodes = NULL;
> +
> +    num = virXPathNodeSet("/node/auth/user", ctxt, &nodes);
> +    if (num < 0)
> +        goto error;
> +
> +    privconn->numAuths = num;
> +    if (num && VIR_ALLOC_N(privconn->auths, num) < 0)
> +        goto error;
> +
> +    for (i = 0; i < num; i++) {
> +        char *username, *password;
> +
> +        ctxt->node = nodes[i];
> +        username = virXPathString("string(.)", ctxt);
> +        if (!username || STREQ(username, "")) {
> +            virReportError(VIR_ERR_XML_ERROR, "%s",
> +                           _("missing username in /node/auth/user field"));
> +            goto error;
> +        }

If username is "",...

> +        /* This field is optional. */
> +        password = virXMLPropString(nodes[i], "password");
> +
> +        privconn->auths[i].username = username;
> +        privconn->auths[i].password = password;
> +    }
> +
> +    ret = 0;
> +error:
> +    VIR_FREE(nodes);
> +    return ret;

...then you just leaked malloc'd memory.

> +    /* Authentication is required because the test XML contains a
> +     * non-empty <auth/> section.  First we must ask for a username.
> +     */
> +    username = virAuthGetUsername(conn, auth, "test", NULL, "localhost"/*?*/);

Is the /*?*/ intentional?


> +
> +found_user:
> +    /* Even if we didn't find the user, we still ask for a password. */
> +    if (i == -1 || privconn->auths[i].password != NULL) {

Nice - matches good security practice of not hinting to the user which
usernames are valid.  (Not that any user/pw pair in the text XML can be
considered secure so much as a way to test the code base... Anyone
sticking a password they value in the test XML deserves what they get)

This is probably worth having in 1.2.1, if you clean up the problems in
time.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140108/d6397879/attachment-0001.sig>


More information about the libvir-list mailing list