mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
virnetsocket: Provide socket address format in a more standard form
Our socket address format is in a rather non-standard format and that is because sasl library requires the IP address and service to be delimited by a semicolon. The string form is a completely internal matter, however once the admin interfaces to retrieve client identity information are merged, we should return the socket address string in a common format, e.g. format defined by URI rfc-3986, i.e. the IP address and service are delimited by a colon and in case of an IPv6 address, square brackets are added: Examples: 127.0.0.1:1234 [::1]:1234 This patch changes our default format to the one described above, while adding separate methods to request the non-standard SASL format using semicolon as a delimiter. Signed-off-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
f84a4c0a41
commit
9b45c9f049
@ -2937,6 +2937,8 @@ remoteDispatchAuthSaslInit(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|||||||
virNetSASLSessionPtr sasl = NULL;
|
virNetSASLSessionPtr sasl = NULL;
|
||||||
struct daemonClientPrivate *priv =
|
struct daemonClientPrivate *priv =
|
||||||
virNetServerClientGetPrivateData(client);
|
virNetServerClientGetPrivateData(client);
|
||||||
|
char *localAddr = NULL;
|
||||||
|
char *remoteAddr = NULL;
|
||||||
|
|
||||||
virMutexLock(&priv->lock);
|
virMutexLock(&priv->lock);
|
||||||
|
|
||||||
@ -2947,10 +2949,17 @@ remoteDispatchAuthSaslInit(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|||||||
goto authfail;
|
goto authfail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
localAddr = virNetServerClientLocalAddrFormatSASL(client);
|
||||||
|
remoteAddr = virNetServerClientRemoteAddrFormatSASL(client);
|
||||||
|
|
||||||
sasl = virNetSASLSessionNewServer(saslCtxt,
|
sasl = virNetSASLSessionNewServer(saslCtxt,
|
||||||
"libvirt",
|
"libvirt",
|
||||||
virNetServerClientLocalAddrString(client),
|
localAddr,
|
||||||
virNetServerClientRemoteAddrString(client));
|
remoteAddr);
|
||||||
|
|
||||||
|
VIR_FREE(localAddr);
|
||||||
|
VIR_FREE(remoteAddr);
|
||||||
|
|
||||||
if (!sasl)
|
if (!sasl)
|
||||||
goto authfail;
|
goto authfail;
|
||||||
|
|
||||||
|
@ -3684,6 +3684,8 @@ remoteAuthSASL(virConnectPtr conn, struct private_data *priv,
|
|||||||
sasl_callback_t *saslcb = NULL;
|
sasl_callback_t *saslcb = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
const char *mechlist;
|
const char *mechlist;
|
||||||
|
char *localAddr = NULL;
|
||||||
|
char *remoteAddr = NULL;
|
||||||
virNetSASLContextPtr saslCtxt;
|
virNetSASLContextPtr saslCtxt;
|
||||||
virNetSASLSessionPtr sasl = NULL;
|
virNetSASLSessionPtr sasl = NULL;
|
||||||
struct remoteAuthInteractState state;
|
struct remoteAuthInteractState state;
|
||||||
@ -3702,6 +3704,9 @@ remoteAuthSASL(virConnectPtr conn, struct private_data *priv,
|
|||||||
saslcb = NULL;
|
saslcb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
localAddr = virNetClientLocalAddrFormatSASL(priv->client);
|
||||||
|
remoteAddr = virNetClientRemoteAddrFormatSASL(priv->client);
|
||||||
|
|
||||||
/* Setup a handle for being a client */
|
/* Setup a handle for being a client */
|
||||||
if (!(sasl = virNetSASLSessionNewClient(saslCtxt,
|
if (!(sasl = virNetSASLSessionNewClient(saslCtxt,
|
||||||
"libvirt",
|
"libvirt",
|
||||||
@ -3889,6 +3894,8 @@ remoteAuthSASL(virConnectPtr conn, struct private_data *priv,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(serverin);
|
VIR_FREE(serverin);
|
||||||
|
VIR_FREE(localAddr);
|
||||||
|
VIR_FREE(remoteAddr);
|
||||||
|
|
||||||
remoteAuthInteractStateClear(&state, true);
|
remoteAuthInteractStateClear(&state, true);
|
||||||
VIR_FREE(saslcb);
|
VIR_FREE(saslcb);
|
||||||
|
@ -954,6 +954,16 @@ const char *virNetClientRemoteAddrString(virNetClientPtr client)
|
|||||||
return virNetSocketRemoteAddrString(client->sock);
|
return virNetSocketRemoteAddrString(client->sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *virNetClientLocalAddrFormatSASL(virNetClientPtr client)
|
||||||
|
{
|
||||||
|
return virNetSocketLocalAddrFormatSASL(client->sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *virNetClientRemoteAddrFormatSASL(virNetClientPtr client)
|
||||||
|
{
|
||||||
|
return virNetSocketRemoteAddrFormatSASL(client->sock);
|
||||||
|
}
|
||||||
|
|
||||||
#if WITH_GNUTLS
|
#if WITH_GNUTLS
|
||||||
int virNetClientGetTLSKeySize(virNetClientPtr client)
|
int virNetClientGetTLSKeySize(virNetClientPtr client)
|
||||||
{
|
{
|
||||||
|
@ -123,6 +123,8 @@ bool virNetClientIsOpen(virNetClientPtr client);
|
|||||||
|
|
||||||
const char *virNetClientLocalAddrString(virNetClientPtr client);
|
const char *virNetClientLocalAddrString(virNetClientPtr client);
|
||||||
const char *virNetClientRemoteAddrString(virNetClientPtr client);
|
const char *virNetClientRemoteAddrString(virNetClientPtr client);
|
||||||
|
char *virNetClientLocalAddrFormatSASL(virNetClientPtr client);
|
||||||
|
char *virNetClientRemoteAddrFormatSASL(virNetClientPtr client);
|
||||||
|
|
||||||
# ifdef WITH_GNUTLS
|
# ifdef WITH_GNUTLS
|
||||||
int virNetClientGetTLSKeySize(virNetClientPtr client);
|
int virNetClientGetTLSKeySize(virNetClientPtr client);
|
||||||
|
@ -911,6 +911,19 @@ const char *virNetServerClientRemoteAddrString(virNetServerClientPtr client)
|
|||||||
return virNetSocketRemoteAddrString(client->sock);
|
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)
|
void virNetServerClientDispose(void *obj)
|
||||||
{
|
{
|
||||||
|
@ -139,6 +139,8 @@ int virNetServerClientStartKeepAlive(virNetServerClientPtr client);
|
|||||||
|
|
||||||
const char *virNetServerClientLocalAddrString(virNetServerClientPtr client);
|
const char *virNetServerClientLocalAddrString(virNetServerClientPtr client);
|
||||||
const char *virNetServerClientRemoteAddrString(virNetServerClientPtr client);
|
const char *virNetServerClientRemoteAddrString(virNetServerClientPtr client);
|
||||||
|
char *virNetServerClientLocalAddrFormatSASL(virNetServerClientPtr client);
|
||||||
|
char *virNetServerClientRemoteAddrFormatSASL(virNetServerClientPtr client);
|
||||||
|
|
||||||
int virNetServerClientSendMessage(virNetServerClientPtr client,
|
int virNetServerClientSendMessage(virNetServerClientPtr client,
|
||||||
virNetMessagePtr msg);
|
virNetMessagePtr msg);
|
||||||
|
@ -262,11 +262,11 @@ static virNetSocketPtr virNetSocketNew(virSocketAddrPtr localAddr,
|
|||||||
|
|
||||||
|
|
||||||
if (localAddr &&
|
if (localAddr &&
|
||||||
!(sock->localAddrStr = virSocketAddrFormatFull(localAddr, true, ";")))
|
!(sock->localAddrStr = virSocketAddrFormatFull(localAddr, true, NULL)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (remoteAddr &&
|
if (remoteAddr &&
|
||||||
!(sock->remoteAddrStr = virSocketAddrFormatFull(remoteAddr, true, ";")))
|
!(sock->remoteAddrStr = virSocketAddrFormatFull(remoteAddr, true, NULL)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
sock->client = isClient;
|
sock->client = isClient;
|
||||||
@ -1465,6 +1465,19 @@ const char *virNetSocketRemoteAddrString(virNetSocketPtr sock)
|
|||||||
return sock->remoteAddrStr;
|
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
|
#if WITH_GNUTLS
|
||||||
static ssize_t virNetSocketTLSSessionWrite(const char *buf,
|
static ssize_t virNetSocketTLSSessionWrite(const char *buf,
|
||||||
|
@ -150,6 +150,8 @@ bool virNetSocketHasPendingData(virNetSocketPtr sock);
|
|||||||
|
|
||||||
const char *virNetSocketLocalAddrString(virNetSocketPtr sock);
|
const char *virNetSocketLocalAddrString(virNetSocketPtr sock);
|
||||||
const char *virNetSocketRemoteAddrString(virNetSocketPtr sock);
|
const char *virNetSocketRemoteAddrString(virNetSocketPtr sock);
|
||||||
|
char *virNetSocketLocalAddrFormatSASL(virNetSocketPtr sock);
|
||||||
|
char *virNetSocketRemoteAddrFormatSASL(virNetSocketPtr sock);
|
||||||
|
|
||||||
int virNetSocketListen(virNetSocketPtr sock, int backlog);
|
int virNetSocketListen(virNetSocketPtr sock, int backlog);
|
||||||
int virNetSocketAccept(virNetSocketPtr sock,
|
int virNetSocketAccept(virNetSocketPtr sock,
|
||||||
|
@ -339,9 +339,11 @@ virSocketAddrFormat(const virSocketAddr *addr)
|
|||||||
* @withService: if true, then service info is appended
|
* @withService: if true, then service info is appended
|
||||||
* @separator: separator between hostname & service.
|
* @separator: separator between hostname & service.
|
||||||
*
|
*
|
||||||
* Returns a string representation of the given address
|
* Returns a string representation of the given address. If a format conforming
|
||||||
* Returns NULL on any error
|
* to URI specification is required, NULL should be passed to separator.
|
||||||
* Caller must free the returned string
|
* 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 *
|
char *
|
||||||
virSocketAddrFormatFull(const virSocketAddr *addr,
|
virSocketAddrFormatFull(const virSocketAddr *addr,
|
||||||
@ -383,8 +385,22 @@ virSocketAddrFormatFull(const virSocketAddr *addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (withService) {
|
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;
|
goto error;
|
||||||
|
|
||||||
|
VIR_FREE(ipv6_host);
|
||||||
} else {
|
} else {
|
||||||
if (VIR_STRDUP(addrstr, host) < 0)
|
if (VIR_STRDUP(addrstr, host) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -249,7 +249,7 @@ static int testSocketUNIXAddrs(const void *data ATTRIBUTE_UNUSED)
|
|||||||
if (virNetSocketNewListenUNIX(path, 0700, -1, getegid(), &lsock) < 0)
|
if (virNetSocketNewListenUNIX(path, 0700, -1, getegid(), &lsock) < 0)
|
||||||
goto cleanup;
|
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");
|
VIR_DEBUG("Unexpected local address");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -265,12 +265,12 @@ static int testSocketUNIXAddrs(const void *data ATTRIBUTE_UNUSED)
|
|||||||
if (virNetSocketNewConnectUNIX(path, false, NULL, &csock) < 0)
|
if (virNetSocketNewConnectUNIX(path, false, NULL, &csock) < 0)
|
||||||
goto cleanup;
|
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");
|
VIR_DEBUG("Unexpected local address");
|
||||||
goto cleanup;
|
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");
|
VIR_DEBUG("Unexpected local address");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -282,12 +282,12 @@ static int testSocketUNIXAddrs(const void *data ATTRIBUTE_UNUSED)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (STRNEQ(virNetSocketLocalAddrString(ssock), "127.0.0.1;0")) {
|
if (STRNEQ(virNetSocketLocalAddrString(ssock), "127.0.0.1:0")) {
|
||||||
VIR_DEBUG("Unexpected local address");
|
VIR_DEBUG("Unexpected local address");
|
||||||
goto cleanup;
|
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");
|
VIR_DEBUG("Unexpected local address");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user