tetromino    14/03/12 04:40:46

  Added:               
                        
networkmanager-openconnect-0.9.8.4-auth-dialog-newgroup.patch
                        
networkmanager-openconnect-0.9.8.4-auth-dialog-formchoice.patch
                        
networkmanager-openconnect-0.9.8.4-auth-dialog-ignore.patch
  Log:
  Fix support for >=openconnect-4.99 (bug #504192, thanks to Kobboi and Pacho 
Ramos).
  
  (Portage version: 2.2.8-r1/cvs/Linux x86_64, signed Manifest commit with key 
CF0ADD61)

Revision  Changes    Path
1.1                  
net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-newgroup.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-newgroup.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-newgroup.patch?rev=1.1&content-type=text/plain

Index: networkmanager-openconnect-0.9.8.4-auth-dialog-newgroup.patch
===================================================================
>From 944389128a6cd95b7e6a3e9e4c7700528e6c14b0 Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <[email protected]>
Date: Mon, 30 Dec 2013 17:49:36 -0800
Subject: [PATCH] auth-dialog: Add support for NEWGROUP

When the user selects a different authgroup, return NEWGROUP to
libopenconnect to allow it to refresh the form.  Different groups may
require different prompts.

Also, if secondary_username is provided by the server, prepopulate the
form field.

[dwmw2: Update to use form->authgrop_opt and fix crash due to calling
        gtk_dialog_response() from combo_changed callback.]


diff --git a/auth-dialog/main.c b/auth-dialog/main.c
index 9b32f61..4ab28cb 100644
--- a/auth-dialog/main.c
+++ b/auth-dialog/main.c
@@ -70,7 +70,21 @@
 #define __openconnect_set_token_mode openconnect_set_token_mode
 #endif
 
+#if OPENCONNECT_CHECK_VER(3,0)
+#define NEWGROUP_SUPPORTED             1
+#define AUTHGROUP_OPT(form)            (void *)(form)->authgroup_opt
+#define AUTHGROUP_SELECTION(form)      (form)->authgroup_selection
+#define FORMCHOICE(sopt, i)            ((sopt)->choices[i])
+#else
+#define NEWGROUP_SUPPORTED             0
+#define AUTHGROUP_OPT(form)            NULL
+#define AUTHGROUP_SELECTION(form)      0
 #define FORMCHOICE(sopt, i)            (&(sopt)->choices[i])
+#define OC_FORM_RESULT_ERR             -1
+#define OC_FORM_RESULT_OK              0
+#define OC_FORM_RESULT_CANCELLED       1
+#define OC_FORM_RESULT_NEWGROUP                2
+#endif
 
 #ifdef OPENCONNECT_OPENSSL
 #include <openssl/ssl.h>
@@ -185,6 +199,9 @@ typedef struct auth_ui_data {
        GCond *form_shown_changed;
        gboolean form_shown;
 
+       gboolean newgroup;
+       gboolean group_set;
+
        GCond *cert_response_changed;
        enum certificate_response cert_response;
 
@@ -291,6 +308,7 @@ typedef struct ui_fragment_data {
 #endif
        struct oc_form_opt *opt;
        char *entry_text;
+       int initial_selection;
        int grab_focus;
 } ui_fragment_data;
 
@@ -345,6 +363,13 @@ static void do_override_label(ui_fragment_data *data, 
struct oc_choice *choice)
        gtk_label_set_text(GTK_LABEL(data->widget), new_label);
 
 }
+
+static gboolean do_newgroup(GtkDialog *dialog)
+{
+       gtk_dialog_response(dialog, AUTH_DIALOG_RESPONSE_LOGIN);
+       return FALSE;
+}
+
 static void combo_changed(GtkComboBox *combo, ui_fragment_data *data)
 {
        struct oc_form_opt_select *sopt = (void *)data->opt;
@@ -354,6 +379,12 @@ static void combo_changed(GtkComboBox *combo, 
ui_fragment_data *data)
 
        data->entry_text = FORMCHOICE(sopt, entry)->name;
 
+       if (NEWGROUP_SUPPORTED && entry != data->initial_selection) {
+               data->ui_data->newgroup = TRUE;
+               g_idle_add ((GSourceFunc)do_newgroup, data->ui_data->dialog);
+               return;
+       }
+
        g_queue_foreach(data->ui_data->form_entries, (GFunc)do_override_label,
                        FORMCHOICE(sopt, entry));
 }
@@ -436,7 +467,7 @@ static gboolean ui_add_select (ui_fragment_data *data)
        auth_ui_data *ui_data = _ui_data; /* FIXME global */
        GtkWidget *hbox, *text, *combo;
        struct oc_form_opt_select *sopt = (void *)data->opt;
-       int i;
+       int i, user_selection = -1;
 
 #if GTK_CHECK_VERSION(3,1,6)
        hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
@@ -450,20 +481,21 @@ static gboolean ui_add_select (ui_fragment_data *data)
 
        combo = gtk_combo_box_text_new();
        gtk_box_pack_end(GTK_BOX(hbox), combo, FALSE, FALSE, 0);
+
        for (i = 0; i < sopt->nr_choices; i++) {
                gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), 
FORMCHOICE(sopt, i)->label);
                if (data->entry_text &&
-                   !strcmp(data->entry_text, FORMCHOICE(sopt, i)->name)) {
-                       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i);
-                       g_free(data->entry_text);
-                       data->entry_text = FORMCHOICE(sopt, i)->name;
-               }
-       }
-       if (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) < 0) {
-               gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); 
-               data->entry_text = FORMCHOICE(sopt, 0)->name;
+                   !strcmp(data->entry_text, FORMCHOICE(sopt, i)->name))
+                       user_selection = i;
        }
 
+       i = data->initial_selection != -1 ? data->initial_selection :
+           user_selection != -1 ? user_selection : 0;
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i);
+       g_free(data->entry_text);
+       data->entry_text = FORMCHOICE(sopt, i)->name;
+       data->initial_selection = i;
+
        if (g_queue_peek_tail(ui_data->form_entries) == data)
                gtk_widget_grab_focus (combo);
        g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_changed), 
data);
@@ -684,10 +716,12 @@ static gboolean ui_form (struct oc_auth_form *form)
                        g_mutex_lock (ui_data->form_mutex);
                        g_queue_push_head(ui_data->form_entries, data);
                        g_mutex_unlock (ui_data->form_mutex);
-                       if (opt->type != OC_FORM_OPT_PASSWORD)
+                       if (opt->type != OC_FORM_OPT_PASSWORD) {
                                data->entry_text = g_strdup 
(find_form_answer(ui_data->secrets,
                                                                              
form, opt));
-                       else {
+                               if (!data->entry_text)
+                                       data->entry_text = g_strdup 
(opt->value);
+                       } else {
                                data->find_request = 
gnome_keyring_find_password(
                                                OPENCONNECT_SCHEMA,
                                                got_keyring_pw,
@@ -709,6 +743,11 @@ static gboolean ui_form (struct oc_auth_form *form)
                        data->entry_text = g_strdup 
(find_form_answer(ui_data->secrets,
                                                                      form, 
opt));
 
+                       if (opt == AUTHGROUP_OPT(form))
+                               data->initial_selection = 
AUTHGROUP_SELECTION(form);
+                       else
+                               data->initial_selection = -1;
+
                        ui_add_select(data);
                } else
                        g_slice_free (ui_fragment_data, data);
@@ -717,11 +756,51 @@ static gboolean ui_form (struct oc_auth_form *form)
        return ui_show(ui_data);
 }
 
+/* If our stored group_list selection differs from the server default, send a
+   NEWGROUP request to try to change it before rendering the form */
+
+static gboolean set_initial_authgroup (auth_ui_data *ui_data, struct 
oc_auth_form *form)
+{
+       struct oc_form_opt *opt;
+
+       if (!NEWGROUP_SUPPORTED || ui_data->group_set || !AUTHGROUP_OPT(form))
+               return FALSE;
+       ui_data->group_set = TRUE;
+
+       for (opt = form->opts; opt; opt = opt->next) {
+               int i;
+               char *saved_group;
+               struct oc_form_opt_select *sopt;
+
+               if (opt != AUTHGROUP_OPT(form))
+                       continue;
+
+               saved_group = find_form_answer(ui_data->secrets, form, opt);
+               if (!saved_group)
+                       return FALSE;
+
+               sopt = (struct oc_form_opt_select *)opt;
+               for (i = 0; i < sopt->nr_choices; i++) {
+                       struct oc_choice *ch = FORMCHOICE(sopt, i);
+                       if (!strcmp(saved_group, ch->name) && i != 
AUTHGROUP_SELECTION(form)) {
+                               free(opt->value);
+                               opt->value = g_strdup(saved_group);
+                               return TRUE;
+                       }
+               }
+       }
+       return FALSE;
+}
+
 static int nm_process_auth_form (void *cbdata, struct oc_auth_form *form)
 {
        auth_ui_data *ui_data = cbdata;
        int response;
 
+       if (set_initial_authgroup(ui_data, form))
+               return OC_FORM_RESULT_NEWGROUP;
+
+       ui_data->newgroup = FALSE;
        g_idle_add((GSourceFunc)ui_form, form);
 
        g_mutex_lock(ui_data->form_mutex);
@@ -782,10 +861,13 @@ static int nm_process_auth_form (void *cbdata, struct 
oc_auth_form *form)
        ui_data->form_grabbed = 0;
        g_mutex_unlock(ui_data->form_mutex);
        
-       /* -1 = cancel,
-        *  0 = failure,
-        *  1 = success */
-       return (response == AUTH_DIALOG_RESPONSE_LOGIN ? 0 : 1);
+       if (response == AUTH_DIALOG_RESPONSE_LOGIN) {
+               if (ui_data->newgroup)
+                       return OC_FORM_RESULT_NEWGROUP;
+               else
+                       return OC_FORM_RESULT_OK;
+       } else
+               return OC_FORM_RESULT_CANCELLED;
 
 }
 
--
Gitg




1.1                  
net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-formchoice.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-formchoice.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-formchoice.patch?rev=1.1&content-type=text/plain

Index: networkmanager-openconnect-0.9.8.4-auth-dialog-formchoice.patch
===================================================================
>From d846b4e5bb9b89c1110d8ae38fd06021f3e4a9f2 Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <[email protected]>
Date: Mon, 30 Dec 2013 17:49:35 -0800
Subject: [PATCH] auth-dialog: Introduce FORMCHOICE helper macro

libopenconnect >= 3.0 uses a pointer array so we need to change the way
the "choices" field is accessed.


diff --git a/auth-dialog/main.c b/auth-dialog/main.c
index 2d8c830..9b32f61 100644
--- a/auth-dialog/main.c
+++ b/auth-dialog/main.c
@@ -70,6 +70,8 @@
 #define __openconnect_set_token_mode openconnect_set_token_mode
 #endif
 
+#define FORMCHOICE(sopt, i)            (&(sopt)->choices[i])
+
 #ifdef OPENCONNECT_OPENSSL
 #include <openssl/ssl.h>
 #include <openssl/bio.h>
@@ -350,10 +352,10 @@ static void combo_changed(GtkComboBox *combo, 
ui_fragment_data *data)
        if (entry < 0)
                return;
 
-       data->entry_text = sopt->choices[entry].name;
+       data->entry_text = FORMCHOICE(sopt, entry)->name;
 
        g_queue_foreach(data->ui_data->form_entries, (GFunc)do_override_label,
-                       &sopt->choices[entry]);
+                       FORMCHOICE(sopt, entry));
 }
 
 #ifdef OPENCONNECT_OPENSSL
@@ -449,17 +451,17 @@ static gboolean ui_add_select (ui_fragment_data *data)
        combo = gtk_combo_box_text_new();
        gtk_box_pack_end(GTK_BOX(hbox), combo, FALSE, FALSE, 0);
        for (i = 0; i < sopt->nr_choices; i++) {
-               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), 
sopt->choices[i].label);
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), 
FORMCHOICE(sopt, i)->label);
                if (data->entry_text &&
-                   !strcmp(data->entry_text, sopt->choices[i].name)) {
+                   !strcmp(data->entry_text, FORMCHOICE(sopt, i)->name)) {
                        gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i);
                        g_free(data->entry_text);
-                       data->entry_text = sopt->choices[i].name;
+                       data->entry_text = FORMCHOICE(sopt, i)->name;
                }
        }
        if (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) < 0) {
                gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); 
-               data->entry_text = sopt->choices[0].name;
+               data->entry_text = FORMCHOICE(sopt, 0)->name;
        }
 
        if (g_queue_peek_tail(ui_data->form_entries) == data)
--
Gitg




1.1                  
net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-ignore.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-ignore.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager-openconnect/files/networkmanager-openconnect-0.9.8.4-auth-dialog-ignore.patch?rev=1.1&content-type=text/plain

Index: networkmanager-openconnect-0.9.8.4-auth-dialog-ignore.patch
===================================================================
>From e2144cbd1b7f71c2fc57264f125ef298c60f22b7 Mon Sep 17 00:00:00 2001
From: Kevin Cernekee <[email protected]>
Date: Mon, 30 Dec 2013 17:49:37 -0800
Subject: [PATCH] auth-dialog: Add support for OC_FORM_OPT_IGNORE

Hide any options that libopenconnect doesn't want us to display.


diff --git a/auth-dialog/main.c b/auth-dialog/main.c
index 4ab28cb..2174ea8 100644
--- a/auth-dialog/main.c
+++ b/auth-dialog/main.c
@@ -75,11 +75,13 @@
 #define AUTHGROUP_OPT(form)            (void *)(form)->authgroup_opt
 #define AUTHGROUP_SELECTION(form)      (form)->authgroup_selection
 #define FORMCHOICE(sopt, i)            ((sopt)->choices[i])
+#define IGNORE_OPT(opt)                        ((opt)->flags & 
OC_FORM_OPT_IGNORE)
 #else
 #define NEWGROUP_SUPPORTED             0
 #define AUTHGROUP_OPT(form)            NULL
 #define AUTHGROUP_SELECTION(form)      0
 #define FORMCHOICE(sopt, i)            (&(sopt)->choices[i])
+#define IGNORE_OPT(opt)                        0
 #define OC_FORM_RESULT_ERR             -1
 #define OC_FORM_RESULT_OK              0
 #define OC_FORM_RESULT_CANCELLED       1
@@ -704,7 +706,8 @@ static gboolean ui_form (struct oc_auth_form *form)
        for (opt = form->opts; opt; opt = opt->next) {
                ui_fragment_data *data;
 
-               if (opt->type == OC_FORM_OPT_HIDDEN)
+               if (opt->type == OC_FORM_OPT_HIDDEN ||
+                   IGNORE_OPT(opt))
                        continue;
 
                data = g_slice_new0 (ui_fragment_data);
--
Gitg





Reply via email to