
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@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