virNetSASLSessionPtr sasl = NULL;
struct daemonClientPrivate *priv =
virNetServerClientGetPrivateData(client);
+ char *localAddr = NULL;
+ char *remoteAddr = NULL;
virMutexLock(&priv->lock);
goto authfail;
}
+ localAddr = virNetServerClientLocalAddrFormatSASL(client);
+ remoteAddr = virNetServerClientRemoteAddrFormatSASL(client);
+
sasl = virNetSASLSessionNewServer(saslCtxt,
"libvirt",
- virNetServerClientLocalAddrString(client),
- virNetServerClientRemoteAddrString(client));
+ localAddr,
+ remoteAddr);
+
+ VIR_FREE(localAddr);
+ VIR_FREE(remoteAddr);
+
if (!sasl)
goto authfail;
sasl_callback_t *saslcb = NULL;
int ret = -1;
const char *mechlist;
+ char *localAddr = NULL;
+ char *remoteAddr = NULL;
virNetSASLContextPtr saslCtxt;
virNetSASLSessionPtr sasl = NULL;
struct remoteAuthInteractState state;
saslcb = NULL;
}
+ localAddr = virNetClientLocalAddrFormatSASL(priv->client);
+ remoteAddr = virNetClientRemoteAddrFormatSASL(priv->client);
+
/* Setup a handle for being a client */
if (!(sasl = virNetSASLSessionNewClient(saslCtxt,
"libvirt",
cleanup:
VIR_FREE(serverin);
+ VIR_FREE(localAddr);
+ VIR_FREE(remoteAddr);
remoteAuthInteractStateClear(&state, true);
VIR_FREE(saslcb);
return virNetSocketRemoteAddrString(client->sock);
}
+char *virNetClientLocalAddrFormatSASL(virNetClientPtr client)
+{
+ return virNetSocketLocalAddrFormatSASL(client->sock);
+}
+
+char *virNetClientRemoteAddrFormatSASL(virNetClientPtr client)
+{
+ return virNetSocketRemoteAddrFormatSASL(client->sock);
+}
+
#if WITH_GNUTLS
int virNetClientGetTLSKeySize(virNetClientPtr client)
{
const char *virNetClientLocalAddrString(virNetClientPtr client);
const char *virNetClientRemoteAddrString(virNetClientPtr client);
+char *virNetClientLocalAddrFormatSASL(virNetClientPtr client);
+char *virNetClientRemoteAddrFormatSASL(virNetClientPtr client);
# ifdef WITH_GNUTLS
int virNetClientGetTLSKeySize(virNetClientPtr client);
return virNetSocketRemoteAddrString(client->sock);
}
+char *virNetServerClientLocalAddrFormatSASL(virNetServerClientPtr client)
+{
+ if (!client->sock)
+ return NULL;
+ return virNetSocketLocalAddrFormatSASL(client->sock);
+}
+
+char *virNetServerClientRemoteAddrFormatSASL(virNetServerClientPtr client)
+{
+ if (!client->sock)
+ return NULL;
+ return virNetSocketRemoteAddrFormatSASL(client->sock);
+}
void virNetServerClientDispose(void *obj)
{
const char *virNetServerClientLocalAddrString(virNetServerClientPtr client);
const char *virNetServerClientRemoteAddrString(virNetServerClientPtr client);
+char *virNetServerClientLocalAddrFormatSASL(virNetServerClientPtr client);
+char *virNetServerClientRemoteAddrFormatSASL(virNetServerClientPtr client);
int virNetServerClientSendMessage(virNetServerClientPtr client,
virNetMessagePtr msg);
if (localAddr &&
- !(sock->localAddrStr = virSocketAddrFormatFull(localAddr, true, ";")))
+ !(sock->localAddrStr = virSocketAddrFormatFull(localAddr, true, NULL)))
goto error;
if (remoteAddr &&
- !(sock->remoteAddrStr = virSocketAddrFormatFull(remoteAddr, true, ";")))
+ !(sock->remoteAddrStr = virSocketAddrFormatFull(remoteAddr, true, NULL)))
goto error;
sock->client = isClient;
return sock->remoteAddrStr;
}
+/* These helper functions return a SASL-formatted socket addr string,
+ * caller is responsible for freeing the string.
+ */
+char *virNetSocketLocalAddrFormatSASL(virNetSocketPtr sock)
+{
+ return virSocketAddrFormatFull(&sock->localAddr, true, ";");
+}
+
+char *virNetSocketRemoteAddrFormatSASL(virNetSocketPtr sock)
+{
+ return virSocketAddrFormatFull(&sock->remoteAddr, true, ";");
+}
+
#if WITH_GNUTLS
static ssize_t virNetSocketTLSSessionWrite(const char *buf,
const char *virNetSocketLocalAddrString(virNetSocketPtr sock);
const char *virNetSocketRemoteAddrString(virNetSocketPtr sock);
+char *virNetSocketLocalAddrFormatSASL(virNetSocketPtr sock);
+char *virNetSocketRemoteAddrFormatSASL(virNetSocketPtr sock);
int virNetSocketListen(virNetSocketPtr sock, int backlog);
int virNetSocketAccept(virNetSocketPtr sock,
* @withService: if true, then service info is appended
* @separator: separator between hostname & service.
*
- * Returns a string representation of the given address
- * Returns NULL on any error
- * Caller must free the returned string
+ * Returns a string representation of the given address. If a format conforming
+ * to URI specification is required, NULL should be passed to separator.
+ * Set @separator only if non-URI format is required, e.g. passing ';' for
+ * @separator if the address should be used with SASL.
+ * Caller must free the returned string.
*/
char *
virSocketAddrFormatFull(const virSocketAddr *addr,
}
if (withService) {
- if (virAsprintf(&addrstr, "%s%s%s", host, separator, port) == -1)
+ char *ipv6_host = NULL;
+ /* sasl_new_client demands the socket address to be in an odd format:
+ * a.b.c.d;port or e:f:g:h:i:j:k:l;port, so use square brackets for
+ * IPv6 only if no separator is passed to the function
+ */
+ if (!separator && VIR_SOCKET_ADDR_FAMILY(addr) == AF_INET6) {
+ if (virAsprintf(&ipv6_host, "[%s]", host) < 0)
+ goto error;
+ }
+
+ if (virAsprintf(&addrstr, "%s%s%s",
+ ipv6_host ? ipv6_host : host,
+ separator ? separator : ":", port) == -1)
goto error;
+
+ VIR_FREE(ipv6_host);
} else {
if (VIR_STRDUP(addrstr, host) < 0)
goto error;
if (virNetSocketNewListenUNIX(path, 0700, -1, getegid(), &lsock) < 0)
goto cleanup;
- if (STRNEQ(virNetSocketLocalAddrString(lsock), "127.0.0.1;0")) {
+ if (STRNEQ(virNetSocketLocalAddrString(lsock), "127.0.0.1:0")) {
VIR_DEBUG("Unexpected local address");
goto cleanup;
}
if (virNetSocketNewConnectUNIX(path, false, NULL, &csock) < 0)
goto cleanup;
- if (STRNEQ(virNetSocketLocalAddrString(csock), "127.0.0.1;0")) {
+ if (STRNEQ(virNetSocketLocalAddrString(csock), "127.0.0.1:0")) {
VIR_DEBUG("Unexpected local address");
goto cleanup;
}
- if (STRNEQ(virNetSocketRemoteAddrString(csock), "127.0.0.1;0")) {
+ if (STRNEQ(virNetSocketRemoteAddrString(csock), "127.0.0.1:0")) {
VIR_DEBUG("Unexpected local address");
goto cleanup;
}
}
- if (STRNEQ(virNetSocketLocalAddrString(ssock), "127.0.0.1;0")) {
+ if (STRNEQ(virNetSocketLocalAddrString(ssock), "127.0.0.1:0")) {
VIR_DEBUG("Unexpected local address");
goto cleanup;
}
- if (STRNEQ(virNetSocketRemoteAddrString(ssock), "127.0.0.1;0")) {
+ if (STRNEQ(virNetSocketRemoteAddrString(ssock), "127.0.0.1:0")) {
VIR_DEBUG("Unexpected local address");
goto cleanup;
}