[network-manager-openvpn/jk/bgo731891-gui-password-types: 1/2] properties/ui: add password storage combo for certpass (bgo #731891)



commit 5b8039c43381e2bd315e2795cdfe9f9a2bea9bd9
Author: Jiří Klimeš <jklimes redhat com>
Date:   Tue Jul 22 16:56:44 2014 +0200

    properties/ui: add password storage combo for certpass (bgo #731891)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=731891

 properties/auth-helpers.c       |  257 +++++++++++++++++++++------------------
 properties/nm-openvpn-dialog.ui |   52 +++++++-
 2 files changed, 187 insertions(+), 122 deletions(-)
---
diff --git a/properties/auth-helpers.c b/properties/auth-helpers.c
index 4a29dbb..0c1499d 100644
--- a/properties/auth-helpers.c
+++ b/properties/auth-helpers.c
@@ -153,6 +153,89 @@ tls_cert_changed_cb (GtkWidget *widget, gpointer data)
 }
 
 static void
+pw_tls_type_combo_changed_cb (GtkWidget *combo, gpointer user_data)
+{
+       GtkWidget *entry = user_data;
+
+       /* If the user chose "Not required", desensitize and clear the correct
+        * password entry.
+        */
+       switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combo))) {
+       case PW_TYPE_ASK:
+       case PW_TYPE_UNUSED:
+               gtk_entry_set_text (GTK_ENTRY (entry), "");
+               gtk_widget_set_sensitive (entry, FALSE);
+               break;
+       default:
+               gtk_widget_set_sensitive (entry, TRUE);
+               break;
+       }
+}
+
+static void
+init_one_pw_tls_combo (GtkBuilder *builder,
+                       NMSettingVPN *s_vpn,
+                       gboolean pw_only,
+                       const char *prefix,
+                       const char *secret_key,
+                       GtkWidget *entry_widget,
+                       ChangedCallback changed_cb,
+                       gpointer user_data)
+{
+       int active = -1;
+       GtkWidget *widget;
+       GtkListStore *store;
+       GtkTreeIter iter;
+       const char *value = NULL;
+       char *tmp;
+       guint32 default_idx = 1;
+       NMSettingSecretFlags pw_flags = NM_SETTING_SECRET_FLAG_NONE;
+
+       /* If there's already a password and the password type can't be found in
+        * the VPN settings, default to saving it.  Otherwise, always ask for it.
+        */
+       value = gtk_entry_get_text (GTK_ENTRY (entry_widget));
+       if (value && strlen (value))
+               default_idx = 0;
+
+       store = gtk_list_store_new (1, G_TYPE_STRING);
+       if (s_vpn)
+               nm_setting_get_secret_flags (NM_SETTING (s_vpn), secret_key, &pw_flags, NULL);
+
+       gtk_list_store_append (store, &iter);
+       gtk_list_store_set (store, &iter, 0, _("Saved"), -1);
+       if (   (active < 0)
+           && !(pw_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)
+           && !(pw_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) {
+               active = PW_TYPE_SAVE;
+       }
+
+       gtk_list_store_append (store, &iter);
+       gtk_list_store_set (store, &iter, 0, _("Always Ask"), -1);
+       if ((active < 0) && (pw_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED))
+               active = PW_TYPE_ASK;
+
+       gtk_list_store_append (store, &iter);
+       gtk_list_store_set (store, &iter, 0, _("Not Required"), -1);
+       if ((active < 0) && (pw_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED))
+               active = PW_TYPE_UNUSED;
+
+       tmp = g_strdup_printf ("%s_%s",
+                              prefix, pw_only? "pass_type_combo" : "private_key_pass_type_combo");
+       widget = GTK_WIDGET (gtk_builder_get_object (builder, tmp));
+       g_assert (widget);
+       g_free (tmp);
+
+       gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store));
+       g_object_unref (store);
+       gtk_combo_box_set_active (GTK_COMBO_BOX (widget), active < 0 ? default_idx : active);
+       pw_tls_type_combo_changed_cb (widget, entry_widget);
+
+       g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (pw_tls_type_combo_changed_cb), 
entry_widget);
+       g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (changed_cb), user_data);
+}
+
+static void
 tls_setup (GtkBuilder *builder,
            GtkSizeGroup *group,
            NMSettingVPN *s_vpn,
@@ -233,92 +316,13 @@ tls_setup (GtkBuilder *builder,
        g_free (tmp);
        gtk_size_group_add_widget (group, widget);
        g_signal_connect (widget, "changed", G_CALLBACK (changed_cb), user_data);
-}
-
-static void
-pw_type_combo_changed_cb (GtkWidget *combo, gpointer user_data)
-{
-       GtkWidget *entry = user_data;
-
-       /* If the user chose "Not required", desensitize and clear the correct
-        * password entry.
-        */
-       switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combo))) {
-       case PW_TYPE_ASK:
-       case PW_TYPE_UNUSED:
-               gtk_entry_set_text (GTK_ENTRY (entry), "");
-               gtk_widget_set_sensitive (entry, FALSE);
-               break;
-       default:
-               gtk_widget_set_sensitive (entry, TRUE);
-               break;
-       }
-}
-
-static void
-init_one_pw_combo (GtkBuilder *builder,
-                   NMSettingVPN *s_vpn,
-                   const char *prefix,
-                   const char *secret_key,
-                   GtkWidget *entry_widget,
-                   ChangedCallback changed_cb,
-                   gpointer user_data)
-{
-       int active = -1;
-       GtkWidget *widget;
-       GtkListStore *store;
-       GtkTreeIter iter;
-       const char *value = NULL;
-       char *tmp;
-       guint32 default_idx = 1;
-       NMSettingSecretFlags pw_flags = NM_SETTING_SECRET_FLAG_NONE;
-
-       /* If there's already a password and the password type can't be found in
-        * the VPN settings, default to saving it.  Otherwise, always ask for it.
-        */
-       value = gtk_entry_get_text (GTK_ENTRY (entry_widget));
-       if (value && strlen (value))
-               default_idx = 0;
-
-       store = gtk_list_store_new (1, G_TYPE_STRING);
-       if (s_vpn)
-               nm_setting_get_secret_flags (NM_SETTING (s_vpn), secret_key, &pw_flags, NULL);
-
-       gtk_list_store_append (store, &iter);
-       gtk_list_store_set (store, &iter, 0, _("Saved"), -1);
-       if (   (active < 0)
-           && !(pw_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)
-           && !(pw_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) {
-               active = PW_TYPE_SAVE;
-       }
-
-       gtk_list_store_append (store, &iter);
-       gtk_list_store_set (store, &iter, 0, _("Always Ask"), -1);
-       if ((active < 0) && (pw_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED))
-               active = PW_TYPE_ASK;
-
-       gtk_list_store_append (store, &iter);
-       gtk_list_store_set (store, &iter, 0, _("Not Required"), -1);
-       if ((active < 0) && (pw_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED))
-               active = PW_TYPE_UNUSED;
-
-       tmp = g_strdup_printf ("%s_pass_type_combo", prefix);
-       widget = GTK_WIDGET (gtk_builder_get_object (builder, tmp));
-       g_assert (widget);
-       g_free (tmp);
-
-       gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store));
-       g_object_unref (store);
-       gtk_combo_box_set_active (GTK_COMBO_BOX (widget), active < 0 ? default_idx : active);
-       pw_type_combo_changed_cb (widget, entry_widget);
 
-       g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (pw_type_combo_changed_cb), entry_widget);
-       g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (changed_cb), user_data);
+       init_one_pw_tls_combo (builder, s_vpn, FALSE, prefix, NM_OPENVPN_KEY_CERTPASS, widget, changed_cb, 
user_data);
 }
 
 static void
 pw_setup (GtkBuilder *builder,
-          GtkSizeGroup *group, 
+          GtkSizeGroup *group,
           NMSettingVPN *s_vpn,
           const char *prefix,
           ChangedCallback changed_cb,
@@ -347,7 +351,7 @@ pw_setup (GtkBuilder *builder,
        gtk_size_group_add_widget (group, widget);
        g_signal_connect (widget, "changed", G_CALLBACK (changed_cb), user_data);
 
-       init_one_pw_combo (builder, s_vpn, prefix, NM_OPENVPN_KEY_PASSWORD, widget, changed_cb, user_data);
+       init_one_pw_tls_combo (builder, s_vpn, TRUE, prefix, NM_OPENVPN_KEY_PASSWORD, widget, changed_cb, 
user_data);
 }
 
 void
@@ -559,16 +563,20 @@ validate_tls (GtkBuilder *builder, const char *prefix, GError **error)
        encrypted = is_encrypted (str);
        g_free (str);
        if (encrypted) {
-               tmp = g_strdup_printf ("%s_private_key_password_entry", prefix);
+               tmp = g_strdup_printf ("%s_private_key_pass_type_combo", prefix);
                widget = GTK_WIDGET (gtk_builder_get_object (builder, tmp));
                g_free (tmp);
-
-               if (!gtk_entry_get_text_length (GTK_ENTRY (widget))) {
-                       g_set_error (error,
-                                    OPENVPN_PLUGIN_UI_ERROR,
-                                    OPENVPN_PLUGIN_UI_ERROR_INVALID_PROPERTY,
-                                    NM_OPENVPN_KEY_CERTPASS);
-                       return FALSE;
+               if (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) != PW_TYPE_ASK) {
+                       tmp = g_strdup_printf ("%s_private_key_password_entry", prefix);
+                       widget = GTK_WIDGET (gtk_builder_get_object (builder, tmp));
+                       g_free (tmp);
+                       if (!gtk_entry_get_text_length (GTK_ENTRY (widget))) {
+                               g_set_error (error,
+                                            OPENVPN_PLUGIN_UI_ERROR,
+                                            OPENVPN_PLUGIN_UI_ERROR_INVALID_PROPERTY,
+                                            NM_OPENVPN_KEY_CERTPASS);
+                               return FALSE;
+                       }
                }
        }
 
@@ -675,10 +683,45 @@ update_from_filechooser (GtkBuilder *builder,
 }
 
 static void
+_update_password_flags (GtkBuilder *builder,
+                        GtkWidget *pw_widget,
+                        const char *prefix,
+                        const char *pw_key,
+                        NMSettingVPN *s_vpn)
+{
+       NMSettingSecretFlags pw_flags;
+       GtkWidget *combo_widget;
+       char *tmp;
+
+       pw_flags = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (pw_widget), "flags"));
+       pw_flags &= ~(NM_SETTING_SECRET_FLAG_NOT_SAVED | NM_SETTING_SECRET_FLAG_NOT_REQUIRED);
+
+       if (strcmp (pw_key, NM_OPENVPN_KEY_PASSWORD) == 0)
+               tmp = g_strdup_printf ("%s_pass_type_combo", prefix);
+       else
+               tmp = g_strdup_printf ("%s_private_key_pass_type_combo", prefix);
+       combo_widget = GTK_WIDGET (gtk_builder_get_object (builder, tmp));
+       g_free (tmp);
+
+       switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combo_widget))) {
+       case PW_TYPE_SAVE:
+               break;
+       case PW_TYPE_UNUSED:
+               pw_flags |= NM_SETTING_SECRET_FLAG_NOT_REQUIRED;
+               break;
+       case PW_TYPE_ASK:
+       default:
+               pw_flags |= NM_SETTING_SECRET_FLAG_NOT_SAVED;
+               break;
+       }
+
+       nm_setting_set_secret_flags (NM_SETTING (s_vpn), pw_key, pw_flags, NULL);
+}
+
+static void
 update_tls (GtkBuilder *builder, const char *prefix, NMSettingVPN *s_vpn)
 {
        GtkWidget *widget;
-       NMSettingSecretFlags pw_flags;
        char *tmp;
        const char *str;
 
@@ -693,18 +736,17 @@ update_tls (GtkBuilder *builder, const char *prefix, NMSettingVPN *s_vpn)
        g_free (tmp);
 
        str = gtk_entry_get_text (GTK_ENTRY (widget));
-       if (str && strlen (str))
+       if (str && *str)
                nm_setting_vpn_add_secret (s_vpn, NM_OPENVPN_KEY_CERTPASS, str);
 
-       pw_flags = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "flags"));
-       nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENVPN_KEY_CERTPASS, pw_flags, NULL);
+       /* Update password flags */
+       _update_password_flags (builder, widget, prefix, NM_OPENVPN_KEY_CERTPASS, s_vpn);
 }
 
 static void
 update_pw (GtkBuilder *builder, const char *prefix, NMSettingVPN *s_vpn)
 {
        GtkWidget *widget;
-       NMSettingSecretFlags pw_flags;
        char *tmp;
        const char *str;
 
@@ -717,7 +759,7 @@ update_pw (GtkBuilder *builder, const char *prefix, NMSettingVPN *s_vpn)
        g_free (tmp);
 
        str = gtk_entry_get_text (GTK_ENTRY (widget));
-       if (str && strlen (str))
+       if (str && *str)
                nm_setting_vpn_add_data_item (s_vpn, NM_OPENVPN_KEY_USERNAME, str);
 
        /* Password */
@@ -727,30 +769,11 @@ update_pw (GtkBuilder *builder, const char *prefix, NMSettingVPN *s_vpn)
        g_free (tmp);
 
        str = gtk_entry_get_text (GTK_ENTRY (widget));
-       if (str && strlen (str))
+       if (str && *str)
                nm_setting_vpn_add_secret (s_vpn, NM_OPENVPN_KEY_PASSWORD, str);
 
        /* Update password flags */
-       pw_flags = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "flags"));
-       pw_flags &= ~(NM_SETTING_SECRET_FLAG_NOT_SAVED | NM_SETTING_SECRET_FLAG_NOT_REQUIRED);
-
-       tmp = g_strdup_printf ("%s_pass_type_combo", prefix);
-       widget = GTK_WIDGET (gtk_builder_get_object (builder, tmp));
-       g_free (tmp);
-
-       switch (gtk_combo_box_get_active (GTK_COMBO_BOX (widget))) {
-       case PW_TYPE_SAVE:
-               break;
-       case PW_TYPE_UNUSED:
-               pw_flags |= NM_SETTING_SECRET_FLAG_NOT_REQUIRED;
-               break;
-       case PW_TYPE_ASK:
-       default:
-               pw_flags |= NM_SETTING_SECRET_FLAG_NOT_SAVED;
-               break;
-       }
-
-       nm_setting_set_secret_flags (NM_SETTING (s_vpn), NM_OPENVPN_KEY_PASSWORD, pw_flags, NULL);
+       _update_password_flags (builder, widget, prefix, NM_OPENVPN_KEY_PASSWORD, s_vpn);
 }
 
 gboolean
diff --git a/properties/nm-openvpn-dialog.ui b/properties/nm-openvpn-dialog.ui
index 6dfda15..aa5b06e 100644
--- a/properties/nm-openvpn-dialog.ui
+++ b/properties/nm-openvpn-dialog.ui
@@ -41,6 +41,8 @@
   </object>
   <object class="GtkListStore" id="liststore1"/>
   <object class="GtkListStore" id="liststore2"/>
+  <object class="GtkListStore" id="liststore3"/>
+  <object class="GtkListStore" id="liststore4"/>
   <object class="GtkListStore" id="model1">
     <columns>
       <!-- column-name gchararray -->
@@ -1005,7 +1007,7 @@ config: tls-auth &lt;file&gt; [direction]</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="n_rows">6</property>
-                    <property name="n_columns">2</property>
+                    <property name="n_columns">3</property>
                     <property name="column_spacing">6</property>
                     <property name="row_spacing">6</property>
                     <child>
@@ -1483,7 +1485,7 @@ config: key</property>
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
+                            <property name="right_attach">3</property>
                             <property name="top_attach">2</property>
                             <property name="bottom_attach">3</property>
                             <property name="y_options"></property>
@@ -1519,7 +1521,7 @@ config: ca</property>
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
+                            <property name="right_attach">3</property>
                             <property name="top_attach">1</property>
                             <property name="bottom_attach">2</property>
                             <property name="y_options"></property>
@@ -1566,7 +1568,27 @@ config: cert</property>
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
+                            <property name="right_attach">3</property>
+                            <property name="y_options"></property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkComboBox" id="tls_private_key_pass_type_combo">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="model">liststore3</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer11"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="left_attach">2</property>
+                            <property name="right_attach">3</property>
+                            <property name="top_attach">3</property>
+                            <property name="bottom_attach">4</property>
                             <property name="y_options"></property>
                           </packing>
                         </child>
@@ -1756,7 +1778,7 @@ config: auth-user-pass</property>
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
-                            <property name="right_attach">3</property>
+                            <property name="right_attach">2</property>
                             <property name="top_attach">5</property>
                             <property name="bottom_attach">6</property>
                             <property name="y_options"></property>
@@ -1972,6 +1994,26 @@ config: auth-user-pass</property>
                             <property name="y_options"></property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkComboBox" id="pw_tls_private_key_pass_type_combo">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="model">liststore4</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="renderer12"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="left_attach">2</property>
+                            <property name="right_attach">3</property>
+                            <property name="top_attach">5</property>
+                            <property name="bottom_attach">6</property>
+                            <property name="y_options"></property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="position">2</property>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]