summaryrefslogtreecommitdiffstats
path: root/src/virt-viewer-session-spice.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2014-02-03 18:40:01 +0100
committerMarc-André Lureau <marcandre.lureau@gmail.com>2014-02-24 16:36:09 +0100
commitd1d53d0c8b5600f61e55e472c592ebc86a65ee6f (patch)
tree3ab5436d27a22ecf841b2f5f2740305f697537e7 /src/virt-viewer-session-spice.c
parent57d1175051d0702dbf8fbd68cad6ea34310fa401 (diff)
downloadvirt-viewer-d1d53d0c8b5600f61e55e472c592ebc86a65ee6f.tar.gz
virt-viewer-d1d53d0c8b5600f61e55e472c592ebc86a65ee6f.tar.xz
virt-viewer-d1d53d0c8b5600f61e55e472c592ebc86a65ee6f.zip
spice: ask credentials for proxy
If Spice proxy requires authentication, ask credentials and try connecting again.
Diffstat (limited to 'src/virt-viewer-session-spice.c')
-rw-r--r--src/virt-viewer-session-spice.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index de5edf7..1740ba3 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -29,6 +29,8 @@
#include <spice-option.h>
#include <spice-util.h>
+#include <spice-client.h>
+
#include <usb-device-widget.h>
#include "virt-viewer-file.h"
#include "virt-viewer-util.h"
@@ -471,8 +473,10 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED
SpiceChannelEvent event,
VirtViewerSession *session)
{
+ const GError *error;
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session);
- gchar *password = NULL;
+ gchar *password = NULL, *user = NULL;
+ int ret;
g_return_if_fail(self != NULL);
@@ -499,10 +503,10 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED
_("invalid password"));
self->priv->pass_try++;
- int ret = virt_viewer_auth_collect_credentials(self->priv->main_window,
- "SPICE",
- NULL,
- NULL, &password);
+ ret = virt_viewer_auth_collect_credentials(self->priv->main_window,
+ "SPICE",
+ NULL,
+ NULL, &password);
if (ret < 0) {
g_signal_emit_by_name(session, "session-cancelled");
} else {
@@ -518,8 +522,33 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED
}
break;
case SPICE_CHANNEL_ERROR_CONNECT:
+#if defined(SPICE_GTK_CHECK_VERSION) && SPICE_GTK_CHECK_VERSION(0, 23, 21)
+ error = spice_channel_get_error(channel);
+
+ DEBUG_LOG("main channel: failed to connect %s", error ? error->message : "");
+
+ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_PROXY_NEED_AUTH) ||
+ g_error_matches(error, G_IO_ERROR, G_IO_ERROR_PROXY_AUTH_FAILED)) {
+ SpiceURI *proxy = spice_session_get_proxy_uri(self->priv->session);
+ g_warn_if_fail(proxy != NULL);
+
+ ret = virt_viewer_auth_collect_credentials(self->priv->main_window,
+ "proxy", NULL,
+ &user, &password);
+ if (ret < 0) {
+ g_signal_emit_by_name(session, "session-cancelled");
+ } else {
+ spice_uri_set_user(proxy, user);
+ spice_uri_set_password(proxy, password);
+ spice_session_connect(self->priv->session);
+ }
+ } else {
+ g_signal_emit_by_name(session, "session-disconnected");
+ }
+#else
DEBUG_LOG("main channel: failed to connect");
g_signal_emit_by_name(session, "session-disconnected");
+#endif
break;
case SPICE_CHANNEL_ERROR_IO:
case SPICE_CHANNEL_ERROR_LINK:
@@ -532,6 +561,7 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED
}
g_free(password);
+ g_free(user);
}
static void remove_cb(GtkContainer *container G_GNUC_UNUSED,