[libvirt] [PATCH] util: Create virsecret module adding virSecretGetSecretString

Ján Tomko jtomko at redhat.com
Mon Apr 4 14:33:08 UTC 2016


On Thu, Mar 31, 2016 at 11:05:07AM -0400, John Ferlan wrote:
> Commit id 'fb2bd208' essentially copied the qemuGetSecretString
> creating an libxlGetSecretString.  Rather than have multiple copies
> of the same code, create virsecret.{c,h} files and place the common
> function in there.
> 
> Usage is from both qemu_command.c and libxl_conf.c
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> Not for 1.3.3, but I may as well get it "out there" now...
> 
>  po/POTFILES.in           |   1 +
>  src/Makefile.am          |   1 +
>  src/libvirt_private.syms |   3 ++
>  src/libxl/libxl_conf.c   |  82 +++-----------------------------
>  src/qemu/qemu_command.c  |  87 ++++------------------------------
>  src/util/virsecret.c     | 120 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/util/virsecret.h     |  35 ++++++++++++++
>  7 files changed, 174 insertions(+), 155 deletions(-)
>  create mode 100644 src/util/virsecret.c
>  create mode 100644 src/util/virsecret.h
> 

> diff --git a/src/util/virsecret.c b/src/util/virsecret.c
> new file mode 100644
> index 0000000..07c052a
> --- /dev/null
> +++ b/src/util/virsecret.c
> @@ -0,0 +1,120 @@
> +/*
> + * virsecret.c: secret related utility functions
> + *
> + * Copyright (C) 2016 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library.  If not, see
> + * <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#include <config.h>
> +
> +#include "virsecret.h"
> +#include "viralloc.h"
> +#include "virerror.h"
> +#include "virlog.h"
> +#include "virobject.h"
> +#include "viruuid.h"

vir{error,object,uuid}.h are pulled in by datatypes.h

> +#include "base64.h"
> +#include "datatypes.h"
> +

datatypes.h contains internal definitions of public structs and should
not be included in src/util/

> +#define VIR_FROM_THIS VIR_FROM_SECRET
> +
> +VIR_LOG_INIT("util.secret");
> +
> +
> +/* virSecretGetSecretString:
> + * @conn: Pointer to the connection driver to make secret driver call
> + * @scheme: Unique enough string for error message to help determine cause
> + * @encoded: Whether the returned secret needs to be base64 encoded
> + * @authdef: Pointer to the disk storage authentication
> + * @secretUsageType: Type of secret usage for authdef lookup
> + *
> + * Lookup the secret for the authdef usage type and return it either as
> + * raw text or encoded based on the caller's need.
> + *
> + * Returns a pointer to memory that needs to be cleared and free'd after
> + * usage or NULL on error.
> + */
> +char *
> +virSecretGetSecretString(virConnectPtr conn,
> +                         const char *scheme,
> +                         bool encoded,
> +                         virStorageAuthDefPtr authdef,
> +                         virSecretUsageType secretUsageType)
> +{
> +    size_t secret_size;
> +    virSecretPtr sec = NULL;
> +    char *secret = NULL;
> +    char uuidStr[VIR_UUID_STRING_BUFLEN];
> +
> +    /* look up secret */
> +    switch (authdef->secretType) {
> +    case VIR_STORAGE_SECRET_TYPE_UUID:
> +        sec = virSecretLookupByUUID(conn, authdef->secret.uuid);
> +        virUUIDFormat(authdef->secret.uuid, uuidStr);
> +        break;
> +    case VIR_STORAGE_SECRET_TYPE_USAGE:
> +        sec = virSecretLookupByUsage(conn, secretUsageType,
> +                                     authdef->secret.usage);
> +        break;
> +    }
> +
> +    if (!sec) {
> +        if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
> +            virReportError(VIR_ERR_NO_SECRET,
> +                           _("%s no secret matches uuid '%s'"),
> +                           scheme, uuidStr);
> +        } else {
> +            virReportError(VIR_ERR_NO_SECRET,
> +                           _("%s no secret matches usage value '%s'"),
> +                           scheme, authdef->secret.usage);
> +        }
> +        goto cleanup;
> +    }
> +
> +    secret = (char *)conn->secretDriver->secretGetValue(sec, &secret_size, 0,
> +                                                        VIR_SECRET_GET_VALUE_INTERNAL_CALL);

The secret driver should be calling functions from src/util, not the
other way around.

Could this function be moved into src/secret?

> +    if (!secret) {
> +        if (authdef->secretType == VIR_STORAGE_SECRET_TYPE_UUID) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("could not get value of the secret for "
> +                             "username '%s' using uuid '%s'"),
> +                           authdef->username, uuidStr);
> +        } else {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("could not get value of the secret for "
> +                             "username '%s' using usage value '%s'"),
> +                           authdef->username, authdef->secret.usage);
> +        }
> +        goto cleanup;
> +    }
> +
> +    if (encoded) {
> +        char *base64 = NULL;
> +
> +        base64_encode_alloc(secret, secret_size, &base64);
> +        VIR_FREE(secret);
> +        if (!base64) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +        secret = base64;
> +    }
> +
> + cleanup:
> +    virObjectUnref(sec);
> +    return secret;
> +}
> diff --git a/src/util/virsecret.h b/src/util/virsecret.h
> new file mode 100644
> index 0000000..8ef0629
> --- /dev/null
> +++ b/src/util/virsecret.h
> @@ -0,0 +1,35 @@
> +/*
> + * virsecret.h: secret related utility functions
> + *
> + * Copyright (C) 2016 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library.  If not, see
> + * <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#ifndef __VIR_SECRET_H__
> +# define __VIR_SECRET_H__
> +
> +# include "internal.h"
> +# include "virstoragefile.h"
> +
> +char *virSecretGetSecretString(virConnectPtr conn,
> +                               const char *scheme,
> +                               bool encoded,
> +                               virStorageAuthDefPtr authdef,
> +                               virSecretUsageType secretUsageType)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)

s/3/4/

Jan




More information about the libvir-list mailing list