[network-manager-openconnect] Dynamically remove unsupported token_mode entries



commit 8a6b29c4a0a5959686ea72bec597e5f8620ae2f5
Author: Kevin Cernekee <cernekee gmail com>
Date:   Sat Jun 8 15:01:30 2013 -0700

    Dynamically remove unsupported token_mode entries
    
    Depending on which software token libraries are installed, this could
    include stoken options, TOTP options, both, or neither.  Only show the
    user the options that are available on his system.

 properties/nm-openconnect-dialog.ui |   18 ++++++
 properties/nm-openconnect.c         |   99 ++++++++++++++++++++++-------------
 2 files changed, 80 insertions(+), 37 deletions(-)
---
diff --git a/properties/nm-openconnect-dialog.ui b/properties/nm-openconnect-dialog.ui
index bc38374..b3401db 100644
--- a/properties/nm-openconnect-dialog.ui
+++ b/properties/nm-openconnect-dialog.ui
@@ -734,19 +734,37 @@
         <columns>
           <!-- column-name legible -->
           <column type="gchararray"/>
+          <!-- column-name pref_value -->
+          <column type="gchararray"/>
+          <!-- column-name token_type -->
+          <column type="gchararray"/>
+          <!-- column-name token_secret_editable -->
+          <column type="gboolean"/>
         </columns>
         <data>
           <row>
             <col id="0" translatable="yes">Disabled</col>
+            <col id="1" translatable="no">disabled</col>
+            <col id="2" translatable="no">any</col>
+            <col id="3" translatable="no">False</col>
           </row>
           <row>
             <col id="0" translatable="yes">RSA SecurID - read from ~/.stokenrc</col>
+            <col id="1" translatable="no">stokenrc</col>
+            <col id="2" translatable="no">stoken</col>
+            <col id="3" translatable="no">False</col>
           </row>
           <row>
             <col id="0" translatable="yes">RSA SecurID - manually entered</col>
+            <col id="1" translatable="no">manual</col>
+            <col id="2" translatable="no">stoken</col>
+            <col id="3" translatable="no">True</col>
           </row>
           <row>
             <col id="0" translatable="yes">TOTP - manually entered</col>
+            <col id="1" translatable="no">totp</col>
+            <col id="2" translatable="no">totp</col>
+            <col id="3" translatable="no">True</col>
           </row>
         </data>
       </object>
diff --git a/properties/nm-openconnect.c b/properties/nm-openconnect.c
index 7a60937..9e6d0e7 100644
--- a/properties/nm-openconnect.c
+++ b/properties/nm-openconnect.c
@@ -375,19 +375,49 @@ stuff_changed_cb (GtkWidget *widget, gpointer user_data)
 }
 
 static gboolean
+init_token_mode_options (GtkComboBox *token_mode)
+{
+       GtkListStore *token_mode_list = GTK_LIST_STORE (gtk_combo_box_get_model (token_mode));
+       GtkTreeModel *model = GTK_TREE_MODEL (token_mode_list);
+       GtkTreeIter iter;
+       gboolean iter_valid;
+       int valid_rows = 0;
+
+       if (!gtk_tree_model_get_iter_first (model, &iter))
+               return FALSE;
+       do {
+               char *token_type;
+
+               gtk_tree_model_get (model, &iter, 2, &token_type, -1);
+               if (!strcmp (token_type, "stoken") && !openconnect_has_stoken_support ())
+                       iter_valid = gtk_list_store_remove (token_mode_list, &iter);
+               else if (!strcmp (token_type, "totp") && !openconnect_has_oath_support ())
+                       iter_valid = gtk_list_store_remove (token_mode_list, &iter);
+               else {
+                       iter_valid = gtk_tree_model_iter_next (model, &iter);
+                       valid_rows++;
+               }
+               g_free (token_type);
+       } while (iter_valid);
+
+       /* if the only option is "Disabled", don't show the token section at all */
+       return valid_rows > 1;
+}
+
+static gboolean
 init_token_ui (OpenconnectPluginUiWidget *self,
                                OpenconnectPluginUiWidgetPrivate *priv,
                                NMSettingVPN *s_vpn)
 {
        GtkWidget *widget;
+       GtkComboBox *token_mode;
        GtkTextBuffer *buffer;
        const char *value;
 
-       /*
-        * don't advertise software token properties if we can't use them anyway
-        * TODO: Fix up the dialog accordingly if e.g. stoken is present but oath is missing
-        */
-       if (!openconnect_has_stoken_support () && !openconnect_has_oath_support ())
+       token_mode = GTK_COMBO_BOX (gtk_builder_get_object (priv->builder, "token_mode"));
+       if (!token_mode)
+               return FALSE;
+       if (!init_token_mode_options (token_mode))
                return TRUE;
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_vbox"));
@@ -395,23 +425,31 @@ init_token_ui (OpenconnectPluginUiWidget *self,
                return FALSE;
        gtk_box_pack_start (GTK_BOX (priv->widget), widget, FALSE, FALSE, 0);
 
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_mode"));
-       if (!widget)
-               return FALSE;
        if (s_vpn) {
+               GtkTreeModel *model = gtk_combo_box_get_model (token_mode);
+               int active_option = 0;
+
                value = nm_setting_vpn_get_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_MODE);
                if (value) {
-                       if (!strcmp (value, "stokenrc"))
-                               gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 1);
-                       else if (!strcmp (value, "manual"))
-                               gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 2);
-                       else if (!strcmp (value, "totp"))
-                               gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 3);
-                       else
-                               gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
+                       int i;
+                       GtkTreeIter iter;
+
+                       if (!gtk_tree_model_get_iter_first (model, &iter))
+                               return FALSE;
+                       for (i = 0; ; i++) {
+                               char *pref_value;
+
+                               gtk_tree_model_get (model, &iter, 1, &pref_value, -1);
+                               if (!strcmp (value, pref_value))
+                                       active_option = i;
+                               g_free (pref_value);
+                               if (!gtk_tree_model_iter_next (model, &iter))
+                                       break;
+                       }
                }
+               gtk_combo_box_set_active (token_mode, active_option);
        }
-       g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (stuff_changed_cb), self);
+       g_signal_connect (G_OBJECT (token_mode), "changed", G_CALLBACK (stuff_changed_cb), self);
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_secret"));
        if (!widget)
@@ -520,7 +558,8 @@ update_connection (NMVpnPluginUiWidgetInterface *iface,
        NMSettingVPN *s_vpn;
        GtkWidget *widget;
        char *str;
-       gint idx;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
        gboolean token_secret_editable = FALSE;
        GtkTextIter iter_start, iter_end;
        GtkTextBuffer *buffer;
@@ -553,26 +592,12 @@ update_connection (NMVpnPluginUiWidgetInterface *iface,
                nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_CSD_WRAPPER, str);
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_mode"));
-       idx = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
-       str = NULL;
-       switch (idx) {
-       case 0:
-               str = "disabled";
-               break;
-       case 1:
-               str = "stokenrc";
-               break;
-       case 2:
-               str = "manual";
-               token_secret_editable = TRUE;
-               break;
-       case 3:
-               str = "totp";
-               token_secret_editable = TRUE;
-               break;
-       }
-       if (str)
+       model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+       if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter)) {
+               gtk_tree_model_get (model, &iter, 1, &str, 3, &token_secret_editable, -1);
                nm_setting_vpn_add_data_item (s_vpn, NM_OPENCONNECT_KEY_TOKEN_MODE, str);
+               g_free(str);
+       }
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "token_secret_label"));
        gtk_widget_set_sensitive (widget, token_secret_editable);


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