virt-viewer: Don't connect to localhost displays with qemu+tcp://

When connecting to a remote libvirt instance, a VM may only be listening
on localhost for SPICE/VNC connections. In such a situation, virt-viewer
then tries to connect to localhost, which is not correct as this
'localhost' referred to the remote libvirt host it connected to.
This commit adds a couple of tests on the libvirt URI used and the
<graphics> listen address to error out in this situation.

Resolves: rhbz#1108523
This commit is contained in:
Christophe Fergeau 2014-06-19 18:32:40 +02:00 committed by Jonathon Jongsma
parent c2eb85c712
commit 5a07c59e8f

View File

@ -334,6 +334,55 @@ virt_viewer_replace_host(const gchar *host)
return ret;
}
static gboolean
virt_viewer_is_loopback(const char *host)
{
GInetAddress *addr = NULL;
gboolean is_loopback = FALSE;
g_return_val_if_fail(host != NULL, FALSE);
addr = g_inet_address_new_from_string(host);
if (!addr) /* Parsing error means it was probably a hostname */
return (strcmp(host, "localhost") == 0);
is_loopback = g_inet_address_get_is_loopback(addr);
g_object_unref(addr);
return is_loopback;
}
static gboolean
virt_viewer_is_reachable(const gchar *host, const char *transport,
const char *transport_host)
{
gboolean host_is_loopback;
gboolean transport_is_loopback;
if (!host)
return FALSE;
if (!transport)
return TRUE;
if (strcmp(transport, "ssh") == 0)
return TRUE;
if (strcmp(transport, "unix") == 0)
return TRUE;
host_is_loopback = virt_viewer_is_loopback(host);
transport_is_loopback = virt_viewer_is_loopback(transport_host);
if (transport_is_loopback && host_is_loopback)
return TRUE;
else
return !host_is_loopback;
}
static gboolean
virt_viewer_extract_connect_info(VirtViewer *self,
virDomainPtr dom)
@ -420,6 +469,14 @@ virt_viewer_extract_connect_info(VirtViewer *self,
ghost = replacement_host;
}
if (!virt_viewer_is_reachable(ghost, transport, host)) {
g_debug("graphics listen '%s' is not reachable from this machine",
ghost ? ghost : "");
virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"),
priv->domkey);
goto cleanup;
}
virt_viewer_app_set_connect_info(app, host, ghost, gport, gtlsport,transport, unixsock, user, port, NULL);
retval = TRUE;