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

John Ferlan jferlan at redhat.com
Thu Mar 31 15:05:07 UTC 2016


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/po/POTFILES.in b/po/POTFILES.in
index 0d7f9f9..e3b8468 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -229,6 +229,7 @@ src/util/virportallocator.c
 src/util/virprocess.c
 src/util/virrandom.c
 src/util/virrotatingfile.c
+src/util/virsecret.c
 src/util/virsexpr.c
 src/util/virscsi.c
 src/util/virsocketaddr.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 1726d06..4783f40 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -156,6 +156,7 @@ UTIL_SOURCES =							\
 		util/virrotatingfile.h util/virrotatingfile.c   \
 		util/virscsi.c util/virscsi.h			\
 		util/virseclabel.c util/virseclabel.h		\
+		util/virsecret.c util/virsecret.h               \
 		util/virsexpr.c util/virsexpr.h			\
 		util/virsocketaddr.h util/virsocketaddr.c	\
 		util/virstats.c util/virstats.h	\
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 684f06c..fe3d132 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2142,6 +2142,9 @@ virSecurityLabelDefFree;
 virSecurityLabelDefNew;
 
 
+# util/virsecret.h
+virSecretGetSecretString;
+
 # util/virsexpr.h
 sexpr2string;
 sexpr_append;
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 82ba417..db26511 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -46,7 +46,7 @@
 #include "libxl_conf.h"
 #include "libxl_utils.h"
 #include "virstoragefile.h"
-#include "base64.h"
+#include "virsecret.h"
 
 
 #define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -935,76 +935,6 @@ libxlDomainGetEmulatorType(const virDomainDef *def)
     return ret;
 }
 
-static char *
-libxlGetSecretString(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);
-    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;
-}
 
 static char *
 libxlMakeNetworkDiskSrcStr(virStorageSourcePtr src,
@@ -1100,11 +1030,11 @@ libxlMakeNetworkDiskSrc(virStorageSourcePtr src, char **srcstr)
         if (!(conn = virConnectOpen("xen:///system")))
             goto cleanup;
 
-        if (!(secret = libxlGetSecretString(conn,
-                                            protocol,
-                                            true,
-                                            src->auth,
-                                            VIR_SECRET_USAGE_TYPE_CEPH)))
+        if (!(secret = virSecretGetSecretString(conn,
+                                                protocol,
+                                                true,
+                                                src->auth,
+                                                VIR_SECRET_USAGE_TYPE_CEPH)))
             goto cleanup;
     }
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 2d0ca97..20a5ea4 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -50,7 +50,7 @@
 #include "secret_conf.h"
 #include "network/bridge_driver.h"
 #include "virnetdevtap.h"
-#include "base64.h"
+#include "virsecret.h"
 #include "device_conf.h"
 #include "virstoragefile.h"
 #include "virtpm.h"
@@ -487,77 +487,6 @@ qemuSafeSerialParamValue(const char *value)
     return 0;
 }
 
-static char *
-qemuGetSecretString(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);
-    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;
-}
-
 
 static int
 qemuNetworkDriveGetPort(int protocol,
@@ -868,11 +797,11 @@ qemuGetDriveSourceString(virStorageSourcePtr src,
                 secretType = VIR_SECRET_USAGE_TYPE_CEPH;
             }
 
-            if (!(secret = qemuGetSecretString(conn,
-                                               protocol,
-                                               encode,
-                                               src->auth,
-                                               secretType)))
+            if (!(secret = virSecretGetSecretString(conn,
+                                                    protocol,
+                                                    encode,
+                                                    src->auth,
+                                                    secretType)))
                 goto cleanup;
         }
     }
@@ -4458,8 +4387,8 @@ qemuBuildSCSIiSCSIHostdevDrvStr(virConnectPtr conn,
         int secretType = VIR_SECRET_USAGE_TYPE_ISCSI;
 
         username = iscsisrc->auth->username;
-        if (!(secret = qemuGetSecretString(conn, protocol, encode,
-                                           iscsisrc->auth, secretType)))
+        if (!(secret = virSecretGetSecretString(conn, protocol, encode,
+                                                iscsisrc->auth, secretType)))
             goto cleanup;
     }
 
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"
+#include "base64.h"
+#include "datatypes.h"
+
+#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);
+    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)
+    ATTRIBUTE_RETURN_CHECK;
+#endif /* __VIR_SECRET_H__ */
-- 
2.5.5




More information about the libvir-list mailing list