mirror of
https://gitlab.com/virt-viewer/virt-viewer.git
synced 2025-02-01 05:47:06 +03:00
src: switch auth dialog to use a GTK UI template
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
d59f550d21
commit
247d91d889
@ -312,7 +312,7 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth,
|
authenticate_cb(RestProxy *proxy, RestProxyAuth *rstauth,
|
||||||
G_GNUC_UNUSED gboolean retrying, gpointer user_data)
|
G_GNUC_UNUSED gboolean retrying, gpointer user_data)
|
||||||
{
|
{
|
||||||
gchar *username = NULL;
|
gchar *username = NULL;
|
||||||
@ -320,6 +320,7 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth,
|
|||||||
VirtViewerWindow *window;
|
VirtViewerWindow *window;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
gboolean kiosk = FALSE;
|
gboolean kiosk = FALSE;
|
||||||
|
VirtViewerAuth *auth;
|
||||||
|
|
||||||
g_object_get(proxy,
|
g_object_get(proxy,
|
||||||
"username", &username,
|
"username", &username,
|
||||||
@ -331,8 +332,10 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth,
|
|||||||
username = g_strdup(g_get_user_name());
|
username = g_strdup(g_get_user_name());
|
||||||
|
|
||||||
window = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(user_data));
|
window = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(user_data));
|
||||||
|
auth = virt_viewer_auth_new(virt_viewer_window_get_window(window));
|
||||||
do {
|
do {
|
||||||
success = virt_viewer_auth_collect_credentials(virt_viewer_window_get_window(window),
|
|
||||||
|
success = virt_viewer_auth_collect_credentials(auth,
|
||||||
"oVirt",
|
"oVirt",
|
||||||
NULL,
|
NULL,
|
||||||
&username, &password);
|
&username, &password);
|
||||||
@ -344,9 +347,10 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth,
|
|||||||
"password", password,
|
"password", password,
|
||||||
NULL);
|
NULL);
|
||||||
} else {
|
} else {
|
||||||
rest_proxy_auth_cancel(auth);
|
rest_proxy_auth_cancel(rstauth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gtk_widget_destroy(GTK_WIDGET(auth));
|
||||||
g_free(username);
|
g_free(username);
|
||||||
g_free(password);
|
g_free(password);
|
||||||
return success;
|
return success;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<!-- Generated with glade 3.38.2 -->
|
<!-- Generated with glade 3.38.2 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.18"/>
|
<requires lib="gtk+" version="3.18"/>
|
||||||
<object class="GtkDialog" id="auth">
|
<template class="VirtViewerAuth" parent="GtkDialog">
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="border-width">5</property>
|
<property name="border-width">5</property>
|
||||||
<property name="title" translatable="yes">Authentication required</property>
|
<property name="title" translatable="yes">Authentication required</property>
|
||||||
@ -87,7 +87,7 @@
|
|||||||
<property name="column-spacing">6</property>
|
<property name="column-spacing">6</property>
|
||||||
<property name="row-spacing">6</property>
|
<property name="row-spacing">6</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="prompt-password">
|
<object class="GtkLabel" id="promptPassword">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="label" translatable="yes">Password:</property>
|
<property name="label" translatable="yes">Password:</property>
|
||||||
@ -99,7 +99,7 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="prompt-username">
|
<object class="GtkLabel" id="promptUsername">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="label" translatable="yes">Username:</property>
|
<property name="label" translatable="yes">Username:</property>
|
||||||
@ -107,7 +107,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkEntry" id="cred-username">
|
<object class="GtkEntry" id="credUsername">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
</object>
|
</object>
|
||||||
@ -117,7 +117,7 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkEntry" id="cred-password">
|
<object class="GtkEntry" id="credPassword">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="visibility">False</property>
|
<property name="visibility">False</property>
|
||||||
@ -143,5 +143,5 @@
|
|||||||
<action-widget response="-6">button-cancel</action-widget>
|
<action-widget response="-6">button-cancel</action-widget>
|
||||||
<action-widget response="-5">button-ok</action-widget>
|
<action-widget response="-5">button-ok</action-widget>
|
||||||
</action-widgets>
|
</action-widgets>
|
||||||
</object>
|
</template>
|
||||||
</interface>
|
</interface>
|
||||||
|
@ -33,6 +33,59 @@
|
|||||||
#include "virt-viewer-auth.h"
|
#include "virt-viewer-auth.h"
|
||||||
#include "virt-viewer-util.h"
|
#include "virt-viewer-util.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct _VirtViewerAuth
|
||||||
|
{
|
||||||
|
GtkDialog parent;
|
||||||
|
GtkWidget *credUsername;
|
||||||
|
GtkWidget *credPassword;
|
||||||
|
GtkWidget *promptUsername;
|
||||||
|
GtkWidget *promptPassword;
|
||||||
|
GtkWidget *message;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE(VirtViewerAuth, virt_viewer_auth, GTK_TYPE_DIALOG)
|
||||||
|
|
||||||
|
static void
|
||||||
|
virt_viewer_auth_class_init(VirtViewerAuthClass *klass)
|
||||||
|
{
|
||||||
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
|
||||||
|
|
||||||
|
gtk_widget_class_set_template_from_resource(widget_class,
|
||||||
|
VIRT_VIEWER_RESOURCE_PREFIX "/ui/virt-viewer-auth.ui");
|
||||||
|
|
||||||
|
gtk_widget_class_bind_template_child(widget_class,
|
||||||
|
VirtViewerAuth,
|
||||||
|
message);
|
||||||
|
gtk_widget_class_bind_template_child(widget_class,
|
||||||
|
VirtViewerAuth,
|
||||||
|
credUsername);
|
||||||
|
gtk_widget_class_bind_template_child(widget_class,
|
||||||
|
VirtViewerAuth,
|
||||||
|
credPassword);
|
||||||
|
gtk_widget_class_bind_template_child(widget_class,
|
||||||
|
VirtViewerAuth,
|
||||||
|
promptUsername);
|
||||||
|
gtk_widget_class_bind_template_child(widget_class,
|
||||||
|
VirtViewerAuth,
|
||||||
|
promptPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
virt_viewer_auth_init(VirtViewerAuth *self)
|
||||||
|
{
|
||||||
|
gtk_widget_init_template(GTK_WIDGET(self));
|
||||||
|
|
||||||
|
gtk_dialog_set_default_response(GTK_DIALOG(self), GTK_RESPONSE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtViewerAuth *virt_viewer_auth_new(GtkWindow *parent)
|
||||||
|
{
|
||||||
|
return g_object_new(VIRT_VIEWER_TYPE_AUTH,
|
||||||
|
"transient-for", parent,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_password(GtkEntry *entry,
|
show_password(GtkEntry *entry,
|
||||||
GtkEntryIconPosition pos G_GNUC_UNUSED,
|
GtkEntryIconPosition pos G_GNUC_UNUSED,
|
||||||
@ -52,56 +105,40 @@ show_password(GtkEntry *entry,
|
|||||||
* before setting the output parameter to the user-entered value.
|
* before setting the output parameter to the user-entered value.
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
virt_viewer_auth_collect_credentials(GtkWindow *window,
|
virt_viewer_auth_collect_credentials(VirtViewerAuth *self,
|
||||||
const char *type,
|
const char *type,
|
||||||
const char *address,
|
const char *address,
|
||||||
char **username,
|
char **username,
|
||||||
char **password)
|
char **password)
|
||||||
{
|
{
|
||||||
GtkWidget *dialog = NULL;
|
|
||||||
GtkBuilder *creds = virt_viewer_util_load_ui("virt-viewer-auth.ui");
|
|
||||||
GtkWidget *credUsername;
|
|
||||||
GtkWidget *credPassword;
|
|
||||||
GtkWidget *promptUsername;
|
|
||||||
GtkWidget *promptPassword;
|
|
||||||
GtkWidget *labelMessage;
|
|
||||||
int response;
|
int response;
|
||||||
char *message;
|
char *message;
|
||||||
|
|
||||||
dialog = GTK_WIDGET(gtk_builder_get_object(creds, "auth"));
|
gtk_widget_set_sensitive(self->credUsername, username != NULL);
|
||||||
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
|
|
||||||
gtk_window_set_transient_for(GTK_WINDOW(dialog), window);
|
|
||||||
|
|
||||||
labelMessage = GTK_WIDGET(gtk_builder_get_object(creds, "message"));
|
|
||||||
credUsername = GTK_WIDGET(gtk_builder_get_object(creds, "cred-username"));
|
|
||||||
promptUsername = GTK_WIDGET(gtk_builder_get_object(creds, "prompt-username"));
|
|
||||||
credPassword = GTK_WIDGET(gtk_builder_get_object(creds, "cred-password"));
|
|
||||||
promptPassword = GTK_WIDGET(gtk_builder_get_object(creds, "prompt-password"));
|
|
||||||
|
|
||||||
gtk_widget_set_sensitive(credUsername, username != NULL);
|
|
||||||
if (username && *username) {
|
if (username && *username) {
|
||||||
gtk_entry_set_text(GTK_ENTRY(credUsername), *username);
|
gtk_entry_set_text(GTK_ENTRY(self->credUsername), *username);
|
||||||
/* if username is pre-filled, move focus to password field */
|
/* if username is pre-filled, move focus to password field */
|
||||||
gtk_widget_grab_focus(credPassword);
|
gtk_widget_grab_focus(self->credPassword);
|
||||||
}
|
}
|
||||||
gtk_widget_set_sensitive(promptUsername, username != NULL);
|
gtk_widget_set_sensitive(self->promptUsername, username != NULL);
|
||||||
gtk_widget_set_sensitive(credPassword, password != NULL);
|
gtk_widget_set_sensitive(self->credPassword, password != NULL);
|
||||||
gtk_widget_set_sensitive(promptPassword, password != NULL);
|
gtk_widget_set_sensitive(self->promptPassword, password != NULL);
|
||||||
|
|
||||||
gtk_entry_set_icon_from_icon_name(GTK_ENTRY(credPassword),
|
gtk_entry_set_icon_from_icon_name(GTK_ENTRY(self->credPassword),
|
||||||
GTK_ENTRY_ICON_SECONDARY,
|
GTK_ENTRY_ICON_SECONDARY,
|
||||||
"eye-not-looking-symbolic");
|
"eye-not-looking-symbolic");
|
||||||
gtk_entry_set_icon_sensitive(GTK_ENTRY(credPassword),
|
gtk_entry_set_icon_sensitive(GTK_ENTRY(self->credPassword),
|
||||||
GTK_ENTRY_ICON_SECONDARY,
|
GTK_ENTRY_ICON_SECONDARY,
|
||||||
TRUE);
|
TRUE);
|
||||||
gtk_entry_set_icon_activatable(GTK_ENTRY(credPassword),
|
gtk_entry_set_icon_activatable(GTK_ENTRY(self->credPassword),
|
||||||
GTK_ENTRY_ICON_SECONDARY,
|
GTK_ENTRY_ICON_SECONDARY,
|
||||||
TRUE);
|
TRUE);
|
||||||
gtk_entry_set_icon_tooltip_text(GTK_ENTRY(credPassword),
|
gtk_entry_set_icon_tooltip_text(GTK_ENTRY(self->credPassword),
|
||||||
GTK_ENTRY_ICON_SECONDARY,
|
GTK_ENTRY_ICON_SECONDARY,
|
||||||
_("Show / hide password text"));
|
_("Show / hide password text"));
|
||||||
|
|
||||||
g_signal_connect(credPassword, "icon-press", G_CALLBACK(show_password), credPassword);
|
g_signal_connect(self->credPassword, "icon-press",
|
||||||
|
G_CALLBACK(show_password), NULL);
|
||||||
|
|
||||||
if (address) {
|
if (address) {
|
||||||
message = g_strdup_printf(_("Authentication is required for the %s connection to:\n\n<b>%s</b>\n\n"),
|
message = g_strdup_printf(_("Authentication is required for the %s connection to:\n\n<b>%s</b>\n\n"),
|
||||||
@ -112,24 +149,21 @@ virt_viewer_auth_collect_credentials(GtkWindow *window,
|
|||||||
type);
|
type);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_label_set_markup(GTK_LABEL(labelMessage), message);
|
gtk_label_set_markup(GTK_LABEL(self->message), message);
|
||||||
g_free(message);
|
g_free(message);
|
||||||
|
|
||||||
gtk_widget_show_all(dialog);
|
gtk_widget_show_all(GTK_WIDGET(self));
|
||||||
response = gtk_dialog_run(GTK_DIALOG(dialog));
|
response = gtk_dialog_run(GTK_DIALOG(self));
|
||||||
gtk_widget_hide(dialog);
|
gtk_widget_hide(GTK_WIDGET(self));
|
||||||
|
|
||||||
if (response == GTK_RESPONSE_OK) {
|
if (response == GTK_RESPONSE_OK) {
|
||||||
if (username) {
|
if (username) {
|
||||||
g_free(*username);
|
g_free(*username);
|
||||||
*username = g_strdup(gtk_entry_get_text(GTK_ENTRY(credUsername)));
|
*username = g_strdup(gtk_entry_get_text(GTK_ENTRY(self->credUsername)));
|
||||||
}
|
}
|
||||||
if (password)
|
if (password)
|
||||||
*password = g_strdup(gtk_entry_get_text(GTK_ENTRY(credPassword)));
|
*password = g_strdup(gtk_entry_get_text(GTK_ENTRY(self->credPassword)));
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_widget_destroy(GTK_WIDGET(dialog));
|
|
||||||
g_object_unref(G_OBJECT(creds));
|
|
||||||
|
|
||||||
return response == GTK_RESPONSE_OK;
|
return response == GTK_RESPONSE_OK;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,18 @@
|
|||||||
|
|
||||||
#include "virt-viewer-session.h"
|
#include "virt-viewer-session.h"
|
||||||
|
|
||||||
gboolean virt_viewer_auth_collect_credentials(GtkWindow *window,
|
#define VIRT_VIEWER_TYPE_AUTH virt_viewer_auth_get_type()
|
||||||
|
G_DECLARE_FINAL_TYPE(VirtViewerAuth,
|
||||||
|
virt_viewer_auth,
|
||||||
|
VIRT_VIEWER,
|
||||||
|
AUTH,
|
||||||
|
GtkDialog)
|
||||||
|
|
||||||
|
GType virt_viewer_auth_get_type(void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
VirtViewerAuth *virt_viewer_auth_new(GtkWindow *parent);
|
||||||
|
|
||||||
|
gboolean virt_viewer_auth_collect_credentials(VirtViewerAuth *auth,
|
||||||
const char *type,
|
const char *type,
|
||||||
const char *address,
|
const char *address,
|
||||||
char **username,
|
char **username,
|
||||||
|
@ -720,6 +720,7 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel,
|
|||||||
{
|
{
|
||||||
const GError *error = NULL;
|
const GError *error = NULL;
|
||||||
gchar *host = NULL;
|
gchar *host = NULL;
|
||||||
|
VirtViewerAuth *auth = virt_viewer_auth_new(self->main_window);
|
||||||
g_debug("main channel: auth failure (wrong username/password?)");
|
g_debug("main channel: auth failure (wrong username/password?)");
|
||||||
|
|
||||||
error = spice_channel_get_error(channel);
|
error = spice_channel_get_error(channel);
|
||||||
@ -745,11 +746,12 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel,
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_object_get(self->session, "host", &host, NULL);
|
g_object_get(self->session, "host", &host, NULL);
|
||||||
ret = virt_viewer_auth_collect_credentials(self->main_window,
|
ret = virt_viewer_auth_collect_credentials(auth,
|
||||||
"SPICE",
|
"SPICE",
|
||||||
host,
|
host,
|
||||||
username_required ? &user : NULL,
|
username_required ? &user : NULL,
|
||||||
&password);
|
&password);
|
||||||
|
gtk_widget_destroy(GTK_WIDGET(auth));
|
||||||
g_free(host);
|
g_free(host);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
/* ret is false when dialog did not return GTK_RESPONSE_OK. We
|
/* ret is false when dialog did not return GTK_RESPONSE_OK. We
|
||||||
@ -780,9 +782,10 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel,
|
|||||||
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_PROXY_NEED_AUTH) ||
|
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)) {
|
g_error_matches(error, G_IO_ERROR, G_IO_ERROR_PROXY_AUTH_FAILED)) {
|
||||||
SpiceURI *proxy = spice_session_get_proxy_uri(self->session);
|
SpiceURI *proxy = spice_session_get_proxy_uri(self->session);
|
||||||
|
VirtViewerAuth *auth = virt_viewer_auth_new(self->main_window);
|
||||||
g_warn_if_fail(proxy != NULL);
|
g_warn_if_fail(proxy != NULL);
|
||||||
|
|
||||||
ret = virt_viewer_auth_collect_credentials(self->main_window,
|
ret = virt_viewer_auth_collect_credentials(auth,
|
||||||
"proxy", spice_uri_get_hostname(proxy),
|
"proxy", spice_uri_get_hostname(proxy),
|
||||||
&user, &password);
|
&user, &password);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
|
@ -324,10 +324,12 @@ virt_viewer_session_vnc_auth_credential(GtkWidget *src G_GNUC_UNUSED,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (wantUsername || wantPassword) {
|
if (wantUsername || wantPassword) {
|
||||||
gboolean ret = virt_viewer_auth_collect_credentials(self->main_window,
|
VirtViewerAuth *auth = virt_viewer_auth_new(self->main_window);
|
||||||
|
gboolean ret = virt_viewer_auth_collect_credentials(auth,
|
||||||
"VNC", NULL,
|
"VNC", NULL,
|
||||||
wantUsername ? &username : NULL,
|
wantUsername ? &username : NULL,
|
||||||
wantPassword ? &password : NULL);
|
wantPassword ? &password : NULL);
|
||||||
|
gtk_widget_destroy(GTK_WIDGET(auth));
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
vnc_display_close(self->vnc);
|
vnc_display_close(self->vnc);
|
||||||
|
@ -984,14 +984,16 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred,
|
|||||||
if (username || password) {
|
if (username || password) {
|
||||||
VirtViewerWindow *vwin = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(self));
|
VirtViewerWindow *vwin = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(self));
|
||||||
GtkWindow *win = virt_viewer_window_get_window(vwin);
|
GtkWindow *win = virt_viewer_window_get_window(vwin);
|
||||||
|
VirtViewerAuth *auth = virt_viewer_auth_new(win);
|
||||||
|
|
||||||
if (username && (*username == NULL || **username == '\0'))
|
if (username && (*username == NULL || **username == '\0'))
|
||||||
*username = g_strdup(g_get_user_name());
|
*username = g_strdup(g_get_user_name());
|
||||||
|
|
||||||
self->auth_cancelled = !virt_viewer_auth_collect_credentials(win,
|
self->auth_cancelled = !virt_viewer_auth_collect_credentials(auth,
|
||||||
"libvirt",
|
"libvirt",
|
||||||
self->uri,
|
self->uri,
|
||||||
username, password);
|
username, password);
|
||||||
|
gtk_widget_destroy(GTK_WIDGET(auth));
|
||||||
if (self->auth_cancelled) {
|
if (self->auth_cancelled) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user