[network-manager-applet/lr/pkcs11: 5/9] wireless-security: add password entries for certificates



commit a8784df322392b28fffa15a135e1432ed10be2cd
Author: Lubomir Rintel <lkundrak v3 sk>
Date:   Fri Feb 17 17:50:26 2017 +0000

    wireless-security: add password entries for certificates
    
    Grey them out unless the certificates are on PKCS#11 tokens (which may need PIN
    login).

 src/wireless-security/eap-method-tls.c  |   81 +++++++++++++++++----
 src/wireless-security/eap-method-tls.ui |  120 ++++++++++++++++++++++---------
 2 files changed, 154 insertions(+), 47 deletions(-)
---
diff --git a/src/wireless-security/eap-method-tls.c b/src/wireless-security/eap-method-tls.c
index f5cd474..3a711a0 100644
--- a/src/wireless-security/eap-method-tls.c
+++ b/src/wireless-security/eap-method-tls.c
@@ -276,6 +276,20 @@ fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFla
 }
 
 static void
+cert_picker_helper (EAPMethod *parent, const char *password_name, NMSetting8021xCKScheme scheme)
+{
+       GtkWidget *widget;
+
+       widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, password_name));
+       g_assert (widget);
+#ifdef NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PKCS11
+       gtk_widget_set_sensitive (widget, scheme == NM_SETTING_802_1X_CK_SCHEME_PKCS11);
+#else
+       gtk_widget_set_sensitive (widget, FALSE);
+#endif
+}
+
+static void
 private_key_picker_helper (EAPMethod *parent, const char *value, NMSetting8021xCKScheme scheme, gboolean 
changed)
 {
        NMSetting8021x *setting;
@@ -324,6 +338,32 @@ private_key_picker_helper (EAPMethod *parent, const char *value, NMSetting8021xC
 }
 
 static void
+cert_picker_file_set_cb (GtkWidget *chooser, const char *password_name, gpointer user_data)
+{
+       EAPMethod *parent = (EAPMethod *) user_data;
+       NMSetting8021xCKScheme scheme;
+       char *value;
+
+       value = eap_method_filepicker_get_value (GTK_FILE_CHOOSER (chooser), &scheme);
+       if (value)
+               cert_picker_helper (parent, password_name, scheme);
+
+       g_free (value);
+}
+
+static void
+client_cert_picker_file_set_cb (GtkWidget *chooser, gpointer user_data)
+{
+       cert_picker_file_set_cb (chooser, "eap_tls_user_cert_password_entry", user_data);
+}
+
+static void
+ca_cert_picker_file_set_cb (GtkWidget *chooser, gpointer user_data)
+{
+       cert_picker_file_set_cb (chooser, "eap_tls_ca_cert_password_entry", user_data);
+}
+
+static void
 private_key_picker_file_set_cb (GtkWidget *chooser, gpointer user_data)
 {
        EAPMethod *parent = (EAPMethod *) user_data;
@@ -353,6 +393,7 @@ typedef NMSetting8021xCKScheme (*SchemeFunc)  (NMSetting8021x *setting);
 static void
 setup_filepicker (GtkBuilder *builder,
                   const char *name,
+                  const char *password_name,
                   const char *title,
                   WirelessSecurity *ws_parent,
                   EAPMethod *parent,
@@ -360,8 +401,7 @@ setup_filepicker (GtkBuilder *builder,
                   SchemeFunc scheme_func,
                   PathFunc path_func,
                   UriFunc uri_func,
-                  gboolean privkey,
-                  gboolean client_cert)
+                  guint32 item_type)
 {
        GtkWidget *widget;
        GtkFileFilter *filter;
@@ -387,22 +427,35 @@ setup_filepicker (GtkBuilder *builder,
                }
        }
 
-       /* Connect a special handler for private keys to intercept PKCS#12 key types
-        * and desensitize the user cert button.
-        */
-       if (privkey) {
+       switch (item_type) {
+       case TYPE_CLIENT_CERT:
+               g_signal_connect (G_OBJECT (widget), "selection-changed",
+                                 (GCallback) client_cert_picker_file_set_cb,
+                                 parent);
+               if (value)
+                       cert_picker_helper (parent, password_name, scheme);
+               break;
+       case TYPE_CA_CERT:
+               g_signal_connect (G_OBJECT (widget), "selection-changed",
+                                 (GCallback) ca_cert_picker_file_set_cb,
+                                 parent);
+               if (value)
+                       cert_picker_helper (parent, password_name, scheme);
+               break;
+       case TYPE_PRIVATE_KEY:
                g_signal_connect (G_OBJECT (widget), "selection-changed",
                                  (GCallback) private_key_picker_file_set_cb,
                                  parent);
                if (value)
                        private_key_picker_helper (parent, value, scheme, FALSE);
+               break;
        }
 
        g_signal_connect (G_OBJECT (widget), "selection-changed",
                          (GCallback) wireless_security_changed_cb,
                          ws_parent);
 
-       filter = eap_method_default_file_chooser_filter_new (privkey);
+       filter = eap_method_default_file_chooser_filter_new (item_type == TYPE_PRIVATE_KEY);
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (widget), filter);
 
        /* For some reason, GTK+ calls set_current_filter (..., NULL) from 
@@ -410,7 +463,7 @@ setup_filepicker (GtkBuilder *builder,
         * dialog; so force-reset the filter to what we want it to be whenever
         * it gets cleared.
         */
-       if (client_cert)
+       if (item_type == TYPE_CLIENT_CERT)
                g_signal_connect (G_OBJECT (widget), "notify::filter", (GCallback) reset_filter, filter);
 }
 
@@ -513,27 +566,27 @@ eap_method_tls_new (WirelessSecurity *ws_parent,
        if (s_8021x && nm_setting_802_1x_get_identity (s_8021x))
                gtk_entry_set_text (GTK_ENTRY (widget), nm_setting_802_1x_get_identity (s_8021x));
 
-       setup_filepicker (parent->builder, "eap_tls_user_cert_button",
+       setup_filepicker (parent->builder, "eap_tls_user_cert_button", "eap_tls_user_cert_password_entry",
                          _("Choose your personal certificate"),
                          ws_parent, parent, s_8021x,
                          phase2 ? nm_setting_802_1x_get_phase2_client_cert_scheme : 
nm_setting_802_1x_get_client_cert_scheme,
                          phase2 ? nm_setting_802_1x_get_phase2_client_cert_path : 
nm_setting_802_1x_get_client_cert_path,
                          phase2 ? nm_setting_802_1x_get_phase2_client_cert_uri : 
nm_setting_802_1x_get_client_cert_uri,
-                         FALSE, TRUE);
-       setup_filepicker (parent->builder, "eap_tls_ca_cert_button",
+                         TYPE_CLIENT_CERT);
+       setup_filepicker (parent->builder, "eap_tls_ca_cert_button", "eap_tls_ca_cert_password_entry",
                          _("Choose a Certificate Authority certificate"),
                          ws_parent, parent, s_8021x,
                          phase2 ? nm_setting_802_1x_get_phase2_ca_cert_scheme : 
nm_setting_802_1x_get_ca_cert_scheme,
                          phase2 ? nm_setting_802_1x_get_phase2_ca_cert_path : 
nm_setting_802_1x_get_ca_cert_path,
                          phase2 ? nm_setting_802_1x_get_phase2_ca_cert_uri : 
nm_setting_802_1x_get_ca_cert_uri,
-                         FALSE, FALSE);
-       setup_filepicker (parent->builder, "eap_tls_private_key_button",
+                         TYPE_CA_CERT);
+       setup_filepicker (parent->builder, "eap_tls_private_key_button", "eap_tls_private_key_password_entry",
                          _("Choose your private key"),
                          ws_parent, parent, s_8021x,
                          phase2 ? nm_setting_802_1x_get_phase2_private_key_scheme : 
nm_setting_802_1x_get_private_key_scheme,
                          phase2 ? nm_setting_802_1x_get_phase2_private_key_path : 
nm_setting_802_1x_get_private_key_path,
                          phase2 ? nm_setting_802_1x_get_phase2_private_key_uri : 
nm_setting_802_1x_get_private_key_uri,
-                         TRUE, FALSE);
+                         TYPE_PRIVATE_KEY);
 
        if (connection && eap_method_ca_cert_ignore_get (parent, connection)) {
                widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_ca_cert_button"));
diff --git a/src/wireless-security/eap-method-tls.ui b/src/wireless-security/eap-method-tls.ui
index 94bad98..559b4cf 100644
--- a/src/wireless-security/eap-method-tls.ui
+++ b/src/wireless-security/eap-method-tls.ui
@@ -40,41 +40,73 @@
           </packing>
         </child>
         <child>
-          <object class="GtkFileChooserButton" id="eap_tls_ca_cert_button">
+          <object class="GtkFileChooserButton" id="eap_tls_user_cert_button">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="hexpand">True</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="top_attach">2</property>
+            <property name="top_attach">1</property>
           </packing>
         </child>
         <child>
-          <object class="GtkCheckButton" id="eap_tls_ca_cert_not_required_checkbox">
-            <property name="label" translatable="yes">No CA certificate is _required</property>
+          <object class="GtkLabel" id="eap_tls_user_cert_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">_User certificate:</property>
+            <property name="use_underline">True</property>
+            <property name="mnemonic_widget">eap_tls_user_cert_button</property>
+            <property name="xalign">0</property>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkCheckButton" id="show_checkbutton_eaptls">
+            <property name="label" translatable="yes">Sho_w passwords</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">False</property>
             <property name="halign">start</property>
+            <property name="valign">end</property>
             <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
             <property name="use_underline">True</property>
             <property name="draw_indicator">True</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="top_attach">3</property>
+            <property name="top_attach">8</property>
           </packing>
         </child>
         <child>
-          <object class="GtkFileChooserButton" id="eap_tls_private_key_button">
+          <object class="GtkLabel" id="eap_tls_private_key_password_label">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="hexpand">True</property>
+            <property name="label" translatable="yes">_Private key password:</property>
+            <property name="use_underline">True</property>
+            <property name="mnemonic_widget">eap_tls_private_key_password_entry</property>
+            <property name="xalign">0</property>
           </object>
           <packing>
-            <property name="left_attach">1</property>
-            <property name="top_attach">4</property>
+            <property name="left_attach">0</property>
+            <property name="top_attach">7</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="eap_tls_private_key_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Private _key:</property>
+            <property name="use_underline">True</property>
+            <property name="xalign">0</property>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">6</property>
           </packing>
         </child>
         <child>
@@ -87,12 +119,23 @@
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="top_attach">5</property>
+            <property name="top_attach">7</property>
           </packing>
         </child>
         <child>
-          <object class="GtkCheckButton" id="show_checkbutton_eaptls">
-            <property name="label" translatable="yes">Sho_w password</property>
+          <object class="GtkFileChooserButton" id="eap_tls_private_key_button">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="top_attach">6</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkCheckButton" id="eap_tls_ca_cert_not_required_checkbox">
+            <property name="label" translatable="yes">No CA certificate is _required</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">False</property>
@@ -103,55 +146,66 @@
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="top_attach">6</property>
+            <property name="top_attach">5</property>
           </packing>
         </child>
         <child>
-          <object class="GtkFileChooserButton" id="eap_tls_user_cert_button">
+          <object class="GtkFileChooserButton" id="eap_tls_ca_cert_button">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="hexpand">True</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
-            <property name="top_attach">1</property>
+            <property name="top_attach">3</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="eap_tls_user_cert_label">
+          <object class="GtkLabel" id="eap_tls_ca_cert_label">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">_User certificate:</property>
+            <property name="label" translatable="yes">C_A certificate:</property>
             <property name="use_underline">True</property>
-            <property name="mnemonic_widget">eap_tls_user_cert_button</property>
             <property name="xalign">0</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
+            <property name="top_attach">3</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="eap_tls_ca_cert_label">
+          <object class="GtkEntry" id="eap_tls_ca_cert_password_entry">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">C_A certificate:</property>
-            <property name="use_underline">True</property>
-            <property name="mnemonic_widget">eap_tls_ca_cert_button</property>
-            <property name="xalign">0</property>
+            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
+            <property name="visibility">False</property>
+            <property name="activates_default">True</property>
           </object>
           <packing>
-            <property name="left_attach">0</property>
+            <property name="left_attach">1</property>
+            <property name="top_attach">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkEntry" id="eap_tls_user_cert_password_entry">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
+            <property name="visibility">False</property>
+            <property name="activates_default">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
             <property name="top_attach">2</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="eap_tls_private_key_label">
+          <object class="GtkLabel" id="eap_tls_ca_cert_password_label">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">Private _key:</property>
+            <property name="label" translatable="yes">CA c_ertificate password:</property>
             <property name="use_underline">True</property>
-            <property name="mnemonic_widget">eap_tls_private_key_button</property>
+            <property name="mnemonic_widget">eap_tls_ca_cert_password_entry</property>
             <property name="xalign">0</property>
           </object>
           <packing>
@@ -160,17 +214,17 @@
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="eap_tls_private_key_password_label">
+          <object class="GtkLabel" id="eap_tls_user_cert_password_label">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">_Private key password:</property>
+            <property name="label" translatable="yes">U_ser certificate password:</property>
             <property name="use_underline">True</property>
-            <property name="mnemonic_widget">eap_tls_private_key_password_entry</property>
+            <property name="mnemonic_widget">eap_tls_user_cert_password_entry</property>
             <property name="xalign">0</property>
           </object>
           <packing>
             <property name="left_attach">0</property>
-            <property name="top_attach">5</property>
+            <property name="top_attach">2</property>
           </packing>
         </child>
         <child>


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