From 877cd358873982d4d6a36b7e65a8605c663e5765 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 9 Mar 2020 09:04:33 +0100 Subject: [PATCH] qemuDomainSecretStorageSourcePrepare: Setup secret for http cookies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QEMU's curl driver requires the cookies concatenated and allows themi to be passed in via a secret. Prepare the value for the secret and encrypt it. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_domain.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1be9b2c8ac..34eb094528 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1732,6 +1732,30 @@ qemuDomainDiskHasEncryptionSecret(virStorageSourcePtr src) } +static qemuDomainSecretInfoPtr +qemuDomainSecretStorageSourcePrepareCookies(qemuDomainObjPrivatePtr priv, + virStorageSourcePtr src, + const char *aliasprotocol) +{ + g_autofree char *secretalias = qemuAliasForSecret(aliasprotocol, "httpcookie"); + g_autofree char *cookies = NULL; + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + size_t i; + + for (i = 0; i < src->ncookies; i++) { + virStorageNetCookieDefPtr cookie = src->cookies[i]; + + virBufferAsprintf(&buf, "%s=%s; ", cookie->name, cookie->value); + } + + virBufferTrim(&buf, "; "); + cookies = virBufferContentAndReset(&buf); + + return qemuDomainSecretAESSetup(priv, secretalias, NULL, + (uint8_t *) cookies, strlen(cookies)); +} + + /** * qemuDomainSecretStorageSourcePrepare: * @priv: domain private object @@ -1757,7 +1781,7 @@ qemuDomainSecretStorageSourcePrepare(qemuDomainObjPrivatePtr priv, bool hasAuth = qemuDomainStorageSourceHasAuth(src); bool hasEnc = qemuDomainDiskHasEncryptionSecret(src); - if (!hasAuth && !hasEnc) + if (!hasAuth && !hasEnc && src->ncookies == 0) return 0; if (!(src->privateData = qemuDomainStorageSourcePrivateNew())) @@ -1797,6 +1821,13 @@ qemuDomainSecretStorageSourcePrepare(qemuDomainObjPrivatePtr priv, return -1; } + if (src->ncookies && + virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV) && + !(srcPriv->httpcookie = qemuDomainSecretStorageSourcePrepareCookies(priv, + src, + aliasprotocol))) + return -1; + return 0; }