diff options
Diffstat (limited to 'src/libnma/nma-vpn-password-dialog.c')
-rw-r--r-- | src/libnma/nma-vpn-password-dialog.c | 186 |
1 files changed, 185 insertions, 1 deletions
diff --git a/src/libnma/nma-vpn-password-dialog.c b/src/libnma/nma-vpn-password-dialog.c index 58a183b0..068e5900 100644 --- a/src/libnma/nma-vpn-password-dialog.c +++ b/src/libnma/nma-vpn-password-dialog.c @@ -35,6 +35,9 @@ typedef struct { GtkEntry *password_entry; GtkEntry *password_entry_secondary; GtkEntry *password_entry_tertiary; + char *password_key; + char *password_key_secondary; + char *password_key_tertiary; GtkCheckButton *show_passwords_checkbox; } NMAVpnPasswordDialogPrivate; @@ -69,11 +72,27 @@ show_passwords_toggled_cb (GtkWidget *widget, gpointer user_data) } static void +dispose (GObject *object) +{ + NMAVpnPasswordDialogPrivate *priv = NMA_VPN_PASSWORD_DIALOG_GET_PRIVATE (object); + + g_clear_pointer (&priv->password_key, g_free); + g_clear_pointer (&priv->password_key_secondary, g_free); + g_clear_pointer (&priv->password_key_tertiary, g_free); + + G_OBJECT_CLASS (nma_vpn_password_dialog_parent_class)->dispose (object); +} + +static void nma_vpn_password_dialog_class_init (NMAVpnPasswordDialogClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); g_type_ensure (NM_TYPE_DEVICE); + + object_class->dispose = dispose; + gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/network-manager-applet/nma-vpn-password-dialog.ui"); @@ -139,7 +158,7 @@ nma_vpn_password_dialog_new (const char *title, } nma_vpn_password_dialog_set_password (NMA_VPN_PASSWORD_DIALOG (dialog), password); - + return GTK_WIDGET (dialog); } @@ -157,6 +176,126 @@ nma_vpn_password_dialog_run_and_block (NMAVpnPasswordDialog *dialog) return button_clicked == GTK_RESPONSE_OK; } +#define UI_KEYFILE_GROUP "VPN Plugin UI" + +static void +keyfile_add_entry_info (GKeyFile *keyfile, + const char *key, + const char *value, + const char *label, + gboolean is_secret, + gboolean should_ask) +{ + g_key_file_set_string (keyfile, key, "Value", value); + g_key_file_set_string (keyfile, key, "Label", label); + g_key_file_set_boolean (keyfile, key, "IsSecret", is_secret); + g_key_file_set_boolean (keyfile, key, "ShouldAsk", should_ask); +} + +static void +print_external_mode (NMAVpnPasswordDialog *dialog, + gboolean should_ask) +{ + NMAVpnPasswordDialogPrivate *priv; + GKeyFile *keyfile; + char *data; + + g_return_if_fail (NMA_VPN_IS_PASSWORD_DIALOG (dialog)); + + priv = NMA_VPN_PASSWORD_DIALOG_GET_PRIVATE (dialog); + + keyfile = g_key_file_new (); + + g_key_file_set_integer (keyfile, UI_KEYFILE_GROUP, "Version", 2); + g_key_file_set_string (keyfile, UI_KEYFILE_GROUP, "Description", gtk_label_get_text (priv->message_label)); + g_key_file_set_string (keyfile, UI_KEYFILE_GROUP, "Title", gtk_window_get_title (GTK_WINDOW (dialog))); + + if (gtk_widget_get_visible (GTK_WIDGET (priv->password_entry))) { + g_return_if_fail (priv->password_key); + keyfile_add_entry_info (keyfile, + priv->password_key, + gtk_entry_get_text (priv->password_entry), + gtk_label_get_text (priv->password_label), + TRUE, + should_ask); + } + + if (gtk_widget_get_visible (GTK_WIDGET (priv->password_entry_secondary))) { + g_return_if_fail (priv->password_key_secondary); + keyfile_add_entry_info (keyfile, + priv->password_key_secondary, + gtk_entry_get_text (priv->password_entry_secondary), + gtk_label_get_text (priv->password_label_secondary), + TRUE, + should_ask); + } + + if (gtk_widget_get_visible (GTK_WIDGET (priv->password_entry_tertiary))) { + g_return_if_fail (priv->password_key_tertiary); + keyfile_add_entry_info (keyfile, + priv->password_key_tertiary, + gtk_entry_get_text (priv->password_entry_tertiary), + gtk_label_get_text (priv->password_label_tertiary), + TRUE, + should_ask); + } + + data = g_key_file_to_data (keyfile, NULL, NULL); + fputs (data, stdout); + + g_key_file_unref (keyfile); + g_free (data); +} + +static void +print_secrets (NMAVpnPasswordDialog *dialog) +{ + NMAVpnPasswordDialogPrivate *priv; + + g_return_if_fail (NMA_VPN_IS_PASSWORD_DIALOG (dialog)); + + priv = NMA_VPN_PASSWORD_DIALOG_GET_PRIVATE (dialog); + + if (gtk_widget_get_visible (GTK_WIDGET (priv->password_entry))) { + g_return_if_fail (priv->password_key); + g_print ("%s\n", priv->password_key); + g_print ("%s\n", gtk_entry_get_text (priv->password_entry)); + } + + if (gtk_widget_get_visible (GTK_WIDGET (priv->password_entry_secondary))) { + g_return_if_fail (priv->password_key_secondary); + g_print ("%s\n", priv->password_key_secondary); + g_print ("%s\n", gtk_entry_get_text (priv->password_entry_secondary)); + } + + if (gtk_widget_get_visible (GTK_WIDGET (priv->password_entry_tertiary))) { + g_return_if_fail (priv->password_key_tertiary); + g_print ("%s\n", priv->password_key_tertiary); + g_print ("%s\n", gtk_entry_get_text (priv->password_entry_tertiary)); + } + + g_print ("\n\n"); +} + +gboolean +nma_vpn_password_dialog_run_and_print (NMAVpnPasswordDialog *dialog, + gboolean external_ui_mode, + gboolean should_ask) +{ + gboolean success = TRUE; + + if (external_ui_mode) { + print_external_mode (dialog, should_ask); + } else { + if (should_ask) + success = nma_vpn_password_dialog_run_and_block (dialog); + if (success) + print_secrets (dialog); + } + + return success; +} + void nma_vpn_password_dialog_set_password (NMAVpnPasswordDialog *dialog, const char *password) @@ -347,3 +486,48 @@ nma_vpn_password_dialog_set_password_ternary_label (NMAVpnPasswordDialog *dialog gtk_label_set_text_with_mnemonic (priv->password_label_tertiary, label); } + +void +nma_vpn_password_dialog_set_password_key (NMAVpnPasswordDialog *dialog, + const char *key) +{ + NMAVpnPasswordDialogPrivate *priv; + + g_return_if_fail (dialog != NULL); + g_return_if_fail (NMA_VPN_IS_PASSWORD_DIALOG (dialog)); + + priv = NMA_VPN_PASSWORD_DIALOG_GET_PRIVATE (dialog); + + g_clear_pointer (&priv->password_key, g_free); + priv->password_key = g_strdup (key); +} + +void +nma_vpn_password_dialog_set_password_secondary_key (NMAVpnPasswordDialog *dialog, + const char *key) +{ + NMAVpnPasswordDialogPrivate *priv; + + g_return_if_fail (dialog != NULL); + g_return_if_fail (NMA_VPN_IS_PASSWORD_DIALOG (dialog)); + + priv = NMA_VPN_PASSWORD_DIALOG_GET_PRIVATE (dialog); + + g_clear_pointer (&priv->password_key_secondary, g_free); + priv->password_key_secondary = g_strdup (key); +} + +void +nma_vpn_password_dialog_set_password_tertiary_key (NMAVpnPasswordDialog *dialog, + const char *key) +{ + NMAVpnPasswordDialogPrivate *priv; + + g_return_if_fail (dialog != NULL); + g_return_if_fail (NMA_VPN_IS_PASSWORD_DIALOG (dialog)); + + priv = NMA_VPN_PASSWORD_DIALOG_GET_PRIVATE (dialog); + + g_clear_pointer (&priv->password_key_tertiary, g_free); + priv->password_key_tertiary = g_strdup (key); +} |