Sisyphus repositório
Última atualização: 1 outubro 2023 | SRPMs: 18631 | Visitas: 37856247
en ru br
ALT Linux repositórios
5.0: 0.7.1-alt0.M50.2
4.1: 0.7.1-alt0.M41.3

Group :: Desktop gráfico/GNOME
RPM: NetworkManager-gnome

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs e FR  Repocop 

Patch: nm-applet-0.7.1-alt0.M50.2.patch
Download


 configure.ac                               |   10 +
 src/applet-device-gsm.c                    |  267 ++++++++++++++++++++++++-
 src/applet-device-wired.c                  |   79 +++++++
 src/applet.c                               |   67 ++++++-
 src/applet.h                               |   30 +++
 src/connection-editor/nm-connection-list.c |  303 +++++++++++++++++++++++----
 src/connection-editor/nm-connection-list.h |   14 ++
 src/wireless-security/eap-method-peap.c    |   24 ++-
 src/wireless-security/eap-method-ttls.c    |    2 +-
 9 files changed, 744 insertions(+), 52 deletions(-)
diff --git a/configure.ac b/configure.ac
index 293de81..1527352 100644
--- a/configure.ac
+++ b/configure.ac
@@ -219,6 +219,16 @@ else
 	AC_MSG_RESULT(no)
 fi
 
+AC_ARG_WITH(mbca, AC_HELP_STRING([--with-mbca], [use Mobile Broadband Configuration Assistant]))
+
+if ! test -z "$with_mbca" ; then
+    CFLAGS="$CFLAGS -DWITH_MBCA"
+    PKG_CHECK_MODULES(MBCA, libmbca)
+    NMA_CFLAGS="$NMA_CFLAGS $MBCA_CFLAGS"
+    #NMA_LIBS="$NMA_LIBS $MBCA_LIBS"
+fi
+
+
 AC_OUTPUT([
 Makefile
 src/Makefile
diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c
index a01d57c..5b2680b 100644
--- a/src/applet-device-gsm.c
+++ b/src/applet-device-gsm.c
@@ -40,6 +40,13 @@
 #include "applet-device-gsm.h"
 #include "utils.h"
 
+#ifdef WITH_MBCA
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <nm-setting-ip4-config.h>
+#include <nm-utils.h>
+#endif
+
 typedef struct {
 	NMApplet *applet;
 	NMDevice *device;
@@ -52,6 +59,157 @@ gsm_menu_item_info_destroy (gpointer data)
 	g_slice_free (GSMMenuItemInfo, data);
 }
 
+#ifdef WITH_MBCA
+static void
+assistant_state_changed_cb (MBCAAssistant* assistant,
+					   MBCAAssistantState state,
+					   gpointer data)
+{
+	NMApplet *applet = data;
+	GSList* iter;
+
+	NMAGConfConnection *exported;
+
+	NMConnection *connection;
+	NMSettingGsm *s_gsm;
+	NMSettingSerial *s_serial;
+	NMSettingPPP *s_ppp;
+	NMSettingConnection *s_con;
+
+	NMSettingIP4Config* ipv4conf;
+	gboolean ignore_auto_dns = FALSE;
+	GArray *dns_servers = FALSE;
+	const char *method;
+
+	MBCAConfiguration* conf;
+
+	if (!applet_open_mbca (applet))
+		g_return_if_reached (); /* this cb should not be called without
+							* libmbca */
+
+	switch (state)
+	{
+		case MBCA_STATE_READY:
+		case MBCA_STATE_RUNNING:
+		{
+			break;
+		}
+		case MBCA_STATE_DONE:
+		{
+			char *uuid;
+			conf = applet->mbca_assistant_get_configuration_func (assistant);
+			connection = nm_connection_new ();
+
+			s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+			nm_connection_add_setting (connection, NM_SETTING (s_con));
+
+			ipv4conf = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new ());
+			nm_connection_add_setting (connection, NM_SETTING (ipv4conf));
+
+			uuid = nm_utils_uuid_generate ();
+	
+			g_object_set (s_con,
+					NM_SETTING_CONNECTION_ID, conf->name,
+					NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME,
+					NM_SETTING_CONNECTION_UUID, uuid,
+					NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+					NULL);
+	
+			g_free(uuid);
+
+			/* Serial setting */
+			s_serial = (NMSettingSerial *) nm_setting_serial_new ();
+			g_object_set (s_con,
+					NM_SETTING_SERIAL_BAUD, 115200,
+					NM_SETTING_SERIAL_BITS, 8,
+					NM_SETTING_SERIAL_PARITY, 'n',
+					NM_SETTING_SERIAL_STOPBITS, 1,
+					NULL);
+
+			nm_connection_add_setting (connection, NM_SETTING (s_serial));
+
+			method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
+
+			s_gsm = NM_SETTING_GSM (nm_setting_gsm_new ());
+
+			g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#",	/* De-facto standard for GSM */
+					NM_SETTING_GSM_APN, conf->provider->gsm.apn,
+					NM_SETTING_GSM_USERNAME, conf->provider->username,
+					NM_SETTING_GSM_PASSWORD, conf->provider->password,
+					NULL);
+
+			if (conf->provider->dns1) {
+				struct in_addr tmp_addr;
+				ignore_auto_dns = TRUE;
+				dns_servers = g_array_new (FALSE, FALSE, sizeof (guint));
+
+				inet_aton (conf->provider->dns1, &tmp_addr);
+				g_array_append_val (dns_servers, tmp_addr.s_addr);
+
+				if (conf->provider->dns2) {
+					inet_aton (conf->provider->dns2, &tmp_addr);
+					g_array_append_val (dns_servers, tmp_addr.s_addr);
+				}
+			}
+
+			/* TODO: gateway */
+
+			g_object_set (ipv4conf,
+					    NM_SETTING_IP4_CONFIG_METHOD, method,
+					    NM_SETTING_IP4_CONFIG_DNS, dns_servers,
+					    NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns,
+					    NULL);
+
+			nm_connection_add_setting (connection, NM_SETTING (s_gsm));
+
+			s_ppp = (NMSettingPPP *) nm_setting_ppp_new ();
+			nm_connection_add_setting (connection, NM_SETTING (s_ppp));
+
+
+			applet->mbca_free_configuration_func (conf);
+			if (dns_servers)
+				g_array_free (dns_servers, TRUE);
+
+			exported = nma_gconf_settings_add_connection (applet->gconf_settings, connection);
+ 			if (!exported) {
+				g_object_unref (connection);
+				g_return_if_reached ();
+			}
+			g_object_unref (connection);
+
+			applet_do_notify (applet, NOTIFY_URGENCY_LOW,
+						   _("New Configuration Created"),
+						   _("You can activate the connection by clicking this icon.\n"
+							"\n"
+							"Use connection editor to add new and to change settings if necessary"),
+						   "nm-device-wwan", NULL, NULL, NULL, NULL);
+
+			/* FALLTHROUGH */
+		}
+		case MBCA_STATE_ABORTED:
+		{
+			for (iter = applet->mbca_assistants; iter; iter = iter->next){
+				if ((MBCAAssistant*)(iter->data) == assistant) {
+					UdiAssistant* ua = iter->data;
+					g_object_unref (G_OBJECT (ua->assistant));
+					g_free (ua->udi);
+					applet->mbca_assistants = g_slist_remove_all (applet->mbca_assistants,
+														 ua);
+
+					g_free (ua);
+
+				}
+			}
+			break;
+		}
+		default:
+		{
+			g_return_if_reached ();
+		}
+	}
+}
+#endif
+
 #define DEFAULT_GSM_NAME _("Auto Mobile Broadband (GSM) connection")
 
 static NMConnection *
@@ -66,6 +224,49 @@ gsm_new_auto_connection (NMDevice *device,
 	NMSettingConnection *s_con;
 	char *uuid;
 
+#ifdef WITH_MBCA
+      UdiAssistant* ua;
+      const gchar* udi;
+      GSList* iter;
+
+      if (applet_open_mbca (applet))
+      {
+              udi = nm_device_get_udi (device);
+
+              for (iter = applet->mbca_assistants; iter; iter = iter->next) {
+                      UdiAssistant* tmp = iter->data;
+                      if (!strcmp (tmp->udi, udi))
+                      {
+                              applet->mbca_assistant_present_func (tmp->assistant);
+                              break;
+                      }
+              }
+              if (!iter)
+              {
+                      /* not found */
+                      ua = g_malloc (sizeof (UdiAssistant));
+                      ua->udi = g_strdup (udi);
+                      ua->assistant = applet->mbca_assistant_new_func ();
+                      g_signal_connect (G_OBJECT (ua->assistant), "state-changed",
+                                                 G_CALLBACK (assistant_state_changed_cb), applet);
+                      applet->mbca_assistants = g_slist_prepend (applet->mbca_assistants, ua);
+                      applet->mbca_assistant_run_for_device_func (ua->assistant,
+                                                                                          MBCA_DEVICE_PSEUDO,
+                                                                                          NULL, NULL);
+              }
+
+              nm_warning ("There's a new GSM modem being configured and no "
+                                "configuration is yet available. You can safely ignore the "
+                                "next warninig, if any, about missing default configuration."
+                                );
+              return NULL;
+      }
+      else
+      {
+              /* continue to default code */
+      }
+#endif
+
 	connection = nm_connection_new ();
 
 	s_gsm = NM_SETTING_GSM (nm_setting_gsm_new ());
@@ -155,9 +356,15 @@ add_default_connection_item (NMDevice *device,
                              NMApplet *applet)
 {
 	GSMMenuItemInfo *info;
-	GtkWidget *item;
+	GtkWidget *item = NULL;
+
+#ifdef WITH_MBCA
+	if (applet_open_mbca (applet))
+		item = gtk_check_menu_item_new_with_label (_("Configure..."));
+#endif
+	if (!item)
+		item = gtk_check_menu_item_new_with_label (DEFAULT_GSM_NAME);
 	
-	item = gtk_check_menu_item_new_with_label (DEFAULT_GSM_NAME);
 	gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (item), TRUE);
 
 	info = g_slice_new0 (GSMMenuItemInfo);
@@ -308,6 +515,58 @@ gsm_device_state_changed (NMDevice *device,
 	}
 }
 
+#ifdef WITH_MBCA
+typedef struct {
+	NMDevice* device;
+	NMApplet* applet;
+} NotifyConfigureNewDeviceCbData;
+
+static void
+notify_configure_new_device_cb (NotifyNotification* notification, gchar* foo, gpointer data)
+{
+	NotifyConfigureNewDeviceCbData* d = data;
+	gsm_new_auto_connection (d->device, d->applet, NULL);
+	g_free (d);
+}
+
+static void
+gsm_device_added (NMDevice *device, NMApplet *applet)
+{
+	GSList *connections, *all;
+
+	if (!applet_open_mbca (applet))
+		return;
+
+	all = applet_get_all_connections (applet);
+	connections = utils_filter_connections_for_device (device, all);
+	g_slist_free (all);
+
+	if (g_slist_length (connections) == 0)
+	{
+		gchar* summary;
+		NotifyConfigureNewDeviceCbData* d = g_malloc (sizeof (NotifyConfigureNewDeviceCbData));
+		d->device = device;
+		d->applet = applet;
+
+		summary = g_strdup_printf ("%s:\n - %s",
+							  utils_get_device_description (device),
+							  _("Click here to configure the device...")
+							  );
+
+		applet_do_notify (applet, NOTIFY_URGENCY_LOW,
+					   _("New Mobile Broadband Device Detected"),
+					   summary,
+					   "nm-device-wwan",
+					   "configure",
+					   "Configure",
+					   notify_configure_new_device_cb,
+					   d);
+		g_free (summary);
+	}
+
+}
+#endif
+
 static GdkPixbuf *
 gsm_get_icon (NMDevice *device,
               NMDeviceState state,
@@ -654,6 +913,10 @@ applet_device_gsm_get_class (NMApplet *applet)
 	dclass->get_icon = gsm_get_icon;
 	dclass->get_secrets = gsm_get_secrets;
 
+#ifdef WITH_MBCA
+	dclass->device_added = gsm_device_added;
+#endif
+
 	return dclass;
 }
 
diff --git a/src/applet-device-wired.c b/src/applet-device-wired.c
index 09ca5e2..945ff44 100644
--- a/src/applet-device-wired.c
+++ b/src/applet-device-wired.c
@@ -240,6 +240,70 @@ out:
 	g_slist_free (connections);
 }
 
+static gboolean
+connections_present(NMDevice *device, NMApplet *applet)
+{
+	GSList *connections, *all;
+
+	all = applet_get_all_connections (applet);
+	connections = utils_filter_connections_for_device (device, all);
+	g_slist_free (all);
+
+	if(g_slist_length(connections))
+	{
+		g_slist_free(connections);
+		return TRUE;
+	}
+	
+	return FALSE;
+}
+
+typedef struct create_auto_connection_data
+{
+	NMDevice *device;
+	NMApplet *applet;
+}create_auto_connection_data;
+
+#define CREATE_AUTO_CONNECT_TIMEOUT (1500)
+
+static gboolean
+create_auto_connection(gpointer data)
+{
+	create_auto_connection_data *info = (create_auto_connection_data *)data;
+	NMConnection *connection;
+	NMAGConfConnection *exported;
+	NMDevice *device;
+	NMApplet *applet;
+
+	g_return_val_if_fail(info != NULL, FALSE);
+
+	device = info->device;
+	applet = info->applet;
+
+	g_free(info);
+
+	if(connections_present(device, applet))
+	{
+		return FALSE;
+	}
+
+	connection = wired_new_auto_connection (device, applet, NULL);
+
+	if (!connection) {
+		nm_warning ("Couldn't create default connection.");
+		return FALSE;
+	}
+	g_message("Default auto connection created");
+	exported = nma_gconf_settings_add_connection (applet->gconf_settings, connection);
+	if (!exported) 
+	{
+		nm_warning ("Invalid default connection.");
+	}
+	g_object_unref (connection);
+
+	return FALSE;
+}
+
 static void
 wired_device_state_changed (NMDevice *device,
                             NMDeviceState new_state,
@@ -247,6 +311,21 @@ wired_device_state_changed (NMDevice *device,
                             NMDeviceStateReason reason,
                             NMApplet *applet)
 {
+
+	if(new_state == NM_DEVICE_STATE_DISCONNECTED)
+	{
+		if(!connections_present(device, applet))
+		{
+			create_auto_connection_data *info;
+
+			info = g_malloc(sizeof(create_auto_connection_data));
+			g_return_if_fail(info != NULL);
+			info->device = device;
+			info->applet = applet;
+			g_timeout_add (CREATE_AUTO_CONNECT_TIMEOUT, create_auto_connection, info);
+		}
+	}
+
 	if (new_state == NM_DEVICE_STATE_ACTIVATED) {
 		NMConnection *connection;
 		NMSettingConnection *s_con = NULL;
diff --git a/src/applet.c b/src/applet.c
index 82472c1..9d77915 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -995,6 +995,51 @@ applet_find_active_connection_for_device (NMDevice *device,
 	return connection;
 }
 
+#ifdef WITH_MBCA
+gboolean
+applet_open_mbca (NMApplet *applet)
+{
+	if (applet->mbca_module)
+		return TRUE;
+
+	applet->mbca_module = g_module_open ("libmbca.so.0", G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+	if (!applet->mbca_module)
+		return FALSE;
+
+	if (!g_module_symbol (applet->mbca_module,
+						  "mbca_assistant_abort",
+						  ((gpointer)(&applet->mbca_assistant_abort_func))));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (applet->mbca_module,
+						  "mbca_assistant_present",
+						  (gpointer)(&applet->mbca_assistant_present_func)) );
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (applet->mbca_module,
+						  "mbca_assistant_new",
+						  (gpointer)(&applet->mbca_assistant_new_func)));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (applet->mbca_module,
+						  "mbca_assistant_run_for_device",
+						  (gpointer)(&applet->mbca_assistant_run_for_device_func)));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (applet->mbca_module,
+						  "mbca_assistant_get_configuration",
+						  (gpointer)(&applet->mbca_assistant_get_configuration_func)));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (applet->mbca_module,
+						  "mbca_free_configuration",
+						  (gpointer)(&applet->mbca_free_configuration_func)));
+		g_warn_if_reached ();
+
+	return TRUE;
+}
+#endif
+
 GtkWidget *
 nma_menu_device_check_unusable (NMDevice *device,
                                 const char *unavailable_msg)
@@ -1776,7 +1821,7 @@ foo_client_setup (NMApplet *applet)
 static GdkPixbuf *
 applet_common_get_device_icon (NMDeviceState state, NMApplet *applet)
 {
-	GdkPixbuf *pixbuf = NULL;
+	GdkPixbuf *pixbuf = applet->no_connection_icon;
 	int stage = -1;
 
 	switch (state) {
@@ -2574,6 +2619,21 @@ static void finalize (GObject *object)
 {
 	NMApplet *applet = NM_APPLET (object);
 
+#ifdef WITH_MBCA
+	GSList* iter = NULL;
+
+	for (iter = applet->mbca_assistants; iter; iter = iter->next) {
+		UdiAssistant* ua = iter->data;
+		if (!applet_open_mbca (applet))
+			g_return_if_reached (); /* no assistants without libmbca */
+		applet->mbca_assistant_abort_func (ua->assistant);
+		/* let the cb handle freeing of resources */
+	}
+
+	if (applet->mbca_module)
+		g_module_close (applet->mbca_module);
+#endif
+
 	nm_gconf_set_pre_keyring_callback (NULL, NULL);
 
 	if (applet->update_timestamps_id)
@@ -2631,6 +2691,11 @@ static void nma_init (NMApplet *applet)
 	applet->icon_theme = NULL;
 	applet->notification = NULL;
 	applet->size = -1;
+
+#ifdef WITH_MBCA
+	applet->mbca_assistants = NULL;
+	applet->mbca_module = NULL;
+#endif
 }
 
 enum {
diff --git a/src/applet.h b/src/applet.h
index f333447..0280680 100644
--- a/src/applet.h
+++ b/src/applet.h
@@ -47,6 +47,10 @@
 #include <nm-active-connection.h>
 #include <nm-dbus-settings.h>
 
+#ifdef WITH_MBCA
+#include <mbca_assistant.h>
+#endif
+
 #include "applet-dbus-manager.h"
 #include "nma-gconf-settings.h"
 
@@ -57,6 +61,14 @@
 #define NM_IS_APPLET_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_APPLET))
 #define NM_APPLET_GET_CLASS(object)(G_TYPE_INSTANCE_GET_CLASS((object), NM_TYPE_APPLET, NMAppletClass))
 
+#ifdef WITH_MBCA
+typedef struct
+{
+	char* udi;
+	MBCAAssistant* assistant;
+} UdiAssistant;
+#endif
+
 typedef struct
 {
 	GObjectClass	parent_class;
@@ -144,6 +156,20 @@ typedef struct
 	GladeXML *		info_dialog_xml;
 	NotifyNotification*	notification;
 	gboolean		notify_with_actions;
+
+#ifdef WITH_MBCA
+	GSList *mbca_assistants; /* list of UdiAssistant */
+	GModule *mbca_module;
+	void (*mbca_assistant_abort_func) (MBCAAssistant*);
+	void (*mbca_assistant_present_func) (MBCAAssistant*);
+	MBCAAssistant* (*mbca_assistant_new_func) ();
+	gint (*mbca_assistant_run_for_device_func) (MBCAAssistant*,
+									    MBCADeviceType,
+									    const gchar*,
+									    const gchar*);
+	MBCAConfiguration* (*mbca_assistant_get_configuration_func) (MBCAAssistant*);
+	void (*mbca_free_configuration_func) (MBCAConfiguration*);
+#endif
 } NMApplet;
 
 
@@ -228,4 +254,8 @@ NMConnection * applet_find_active_connection_for_device (NMDevice *device,
                                                          NMApplet *applet,
                                                          NMActiveConnection **out_active);
 
+#ifdef WITH_MBCA
+gboolean applet_open_mbca (NMApplet *applet);
+#endif
+
 #endif
diff --git a/src/connection-editor/nm-connection-list.c b/src/connection-editor/nm-connection-list.c
index 70557fb..2732642 100644
--- a/src/connection-editor/nm-connection-list.c
+++ b/src/connection-editor/nm-connection-list.c
@@ -51,6 +51,13 @@
 #include <nm-vpn-plugin-ui-interface.h>
 #include <nm-utils.h>
 
+#ifdef WITH_MBCA
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <nm-setting-ip4-config.h>
+#include <nm-utils.h>
+#endif
+
 #include "nm-connection-editor.h"
 #include "nm-connection-list.h"
 #include "gconf-helpers.h"
@@ -108,6 +115,42 @@ error_dialog (GtkWindow *parent, const char *heading, const char *format, ...)
 	gtk_widget_destroy (dialog);
 }
 
+#ifdef WITH_MBCA
+static gboolean
+open_mbca (NMConnectionList *list)
+{
+	if (list->mbca_module)
+		return TRUE;
+
+	list->mbca_module = g_module_open ("libmbca.so.0", G_MODULE_BIND_LAZY |
+											 G_MODULE_BIND_LOCAL);
+	if (!list->mbca_module)
+		return FALSE;
+
+	if (!g_module_symbol (list->mbca_module,
+					  "mbca_assistant_new",
+					  (gpointer)(&list->mbca_assistant_new_func)));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (list->mbca_module,
+					  "mbca_assistant_run_for_device",
+					  (gpointer)(&list->mbca_assistant_run_for_device_func)));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (list->mbca_module,
+					  "mbca_assistant_get_configuration",
+					  (gpointer)(&list->mbca_assistant_get_configuration_func)));
+		g_warn_if_reached ();
+
+	if (!g_module_symbol (list->mbca_module,
+					  "mbca_free_configuration",
+					  (gpointer)(&list->mbca_free_configuration_func)));
+		g_warn_if_reached ();
+
+	return TRUE;
+}
+#endif
+
 static NMExportedConnection *
 get_active_connection (GtkTreeView *treeview)
 {
@@ -819,6 +862,141 @@ add_default_serial_setting (NMConnection *connection)
 	nm_connection_add_setting (connection, NM_SETTING (s_serial));
 }
 
+#ifdef WITH_MBCA
+static void
+mbca_assistant_state_changed_cb (MBCAAssistant* assistant,
+						   MBCAAssistantState state,
+						   gpointer user_data)
+{
+	NMConnection *connection = NULL;
+	NMSettingConnection *s_con;
+	NMSetting *type_setting = NULL;
+	MBCAConfiguration* conf;
+
+	NMConnectionList *list = user_data;
+
+	NMSettingIP4Config* ipv4conf;
+	gboolean ignore_auto_dns = FALSE;
+	GArray *dns_servers = FALSE;
+	const char *method;
+	char *uuid;
+
+	switch (state) {
+	case MBCA_STATE_READY:
+	case MBCA_STATE_RUNNING:
+		return;
+	case MBCA_STATE_DONE:
+
+		/* this function should never get called without a prior usage of
+		 * libmbca in create_new_connection_for_type
+		 */
+		g_return_if_fail (open_mbca (list));
+
+		connection = nm_connection_new ();
+		nm_connection_set_scope (connection, NM_CONNECTION_SCOPE_USER);
+
+		s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+		nm_connection_add_setting (connection, NM_SETTING (s_con));
+
+		ipv4conf = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new ());
+		nm_connection_add_setting (connection, NM_SETTING (ipv4conf));
+
+		conf = list->mbca_assistant_get_configuration_func (assistant);
+
+		uuid = nm_utils_uuid_generate ();
+
+		g_object_set (s_con,
+				NM_SETTING_CONNECTION_ID, conf->name,
+				NM_SETTING_CONNECTION_UUID, uuid,
+				NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+				NULL);
+
+		g_free(uuid);
+
+		add_default_serial_setting (connection);
+
+		method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
+
+		if (conf->provider->type == MBCA_NETWORK_GSM) {
+			NMSettingGsm *s_gsm;
+
+			g_object_set (s_con,
+					NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME,
+					NULL);
+
+			type_setting = nm_setting_gsm_new ();
+			s_gsm = NM_SETTING_GSM (type_setting);
+
+			g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#",	/* De-facto standard for GSM */
+					NM_SETTING_GSM_APN, conf->provider->gsm.apn,
+					NM_SETTING_GSM_USERNAME, conf->provider->username,
+					NM_SETTING_GSM_PASSWORD, conf->provider->password,
+					NULL);
+
+			if (conf->provider->dns1) {
+				struct in_addr tmp_addr;
+				ignore_auto_dns = TRUE;
+				dns_servers = g_array_new (FALSE, FALSE, sizeof (guint));
+
+				inet_aton (conf->provider->dns1, &tmp_addr);
+				g_array_append_val (dns_servers, tmp_addr.s_addr);
+
+				if (conf->provider->dns2) {
+					inet_aton (conf->provider->dns2, &tmp_addr);
+					g_array_append_val (dns_servers, tmp_addr.s_addr);
+				}
+			}
+
+			/* TODO: gateway */
+
+		} else if (conf->provider->type == MBCA_NETWORK_CDMA) {
+			NMSettingCdma *s_cdma;
+
+			g_object_set (s_con,
+					NM_SETTING_CONNECTION_TYPE, NM_SETTING_CDMA_SETTING_NAME,
+					NULL);
+
+			type_setting = nm_setting_cdma_new ();
+			s_cdma = NM_SETTING_CDMA (type_setting);
+
+			g_object_set (s_cdma, NM_SETTING_CDMA_NUMBER, "#777",	/* De-facto standard for CDMA */
+					NM_SETTING_CDMA_USERNAME, conf->provider->username,
+					NM_SETTING_CDMA_PASSWORD, conf->provider->password,
+					NULL);
+
+		}
+		nm_connection_add_setting (connection, nm_setting_ppp_new ());
+
+		g_object_set (ipv4conf,
+				    NM_SETTING_IP4_CONFIG_METHOD, method,
+				    NM_SETTING_IP4_CONFIG_DNS, dns_servers,
+				    NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns,
+				    NULL);
+
+		if (type_setting) {
+			nm_connection_add_setting (connection, type_setting);
+		} else {
+			g_object_unref (connection);
+			connection = NULL;
+		}
+
+		add_connection (list, NULL, connection, NULL, NULL);
+		g_hash_table_remove (list->editors, connection);
+
+		list->mbca_free_configuration_func (conf);
+		if (dns_servers)
+			g_array_free (dns_servers, TRUE);
+		/* FALLTHROUGH */
+
+	case MBCA_STATE_ABORTED:
+		g_object_unref (assistant);
+		break;
+	default:
+		g_warn_if_reached ();
+	}
+}
+#endif
+
 static NMConnection *
 create_new_connection_for_type (NMConnectionList *list, const char *connection_type)
 {
@@ -828,6 +1006,10 @@ create_new_connection_for_type (NMConnectionList *list, const char *connection_t
 	NMSetting *type_setting = NULL;
 	char *id, *uuid;
 	GType mb_type;
+#ifdef WITH_MBCA
+	MBCAAssistant *assistant = NULL;
+#endif
+	gboolean use_mbca = FALSE;
 
 	ctype = nm_connection_lookup_setting_type (connection_type);
 
@@ -864,51 +1046,74 @@ create_new_connection_for_type (NMConnectionList *list, const char *connection_t
 		s_wireless = NM_SETTING_WIRELESS (type_setting);
 		g_object_set (s_wireless, NM_SETTING_WIRELESS_MODE, "infrastructure", NULL);
 	} else if ((ctype == NM_TYPE_SETTING_GSM) || (ctype == NM_TYPE_SETTING_CDMA)) {
-		/* Since GSM is a placeholder for both GSM and CDMA; ask the user which
-		 * one they really want.
-		 */
-		mb_type = mobile_wizard_ask_connection_type ();
-		if (mb_type == NM_TYPE_SETTING_GSM) {
-			NMSettingGsm *s_gsm;
-
-			id = get_next_available_name (list, _("GSM connection %d"));
-			g_object_set (s_con,
-					    NM_SETTING_CONNECTION_ID, id,
-					    NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME,
-					    NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
-					    NULL);
-			g_free (id);
-
-			add_default_serial_setting (connection);
-
-			type_setting = nm_setting_gsm_new ();
-			s_gsm = NM_SETTING_GSM (type_setting);
-			/* De-facto standard for GSM */
-			g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#", NULL);
-
-			nm_connection_add_setting (connection, nm_setting_ppp_new ());
-		} else if (mb_type == NM_TYPE_SETTING_CDMA) {
-			NMSettingCdma *s_cdma;
-
-			id = get_next_available_name (list, _("CDMA connection %d"));
-			g_object_set (s_con,
-					    NM_SETTING_CONNECTION_ID, id,
-					    NM_SETTING_CONNECTION_TYPE, NM_SETTING_CDMA_SETTING_NAME,
-					    NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
-					    NULL);
-			g_free (id);
-
-			add_default_serial_setting (connection);
-
-			type_setting = nm_setting_cdma_new ();
-			s_cdma = NM_SETTING_CDMA (type_setting);
-
-			/* De-facto standard for CDMA */
-			g_object_set (s_cdma, NM_SETTING_CDMA_NUMBER, "#777", NULL);
-
-			nm_connection_add_setting (connection, nm_setting_ppp_new ());
-		} else {
-			/* user canceled; do nothing */
+#ifdef WITH_MBCA
+	use_mbca = open_mbca (list);
+#endif
+	if (use_mbca)
+		{
+#ifdef WITH_MBCA
+
+			assistant = list->mbca_assistant_new_func ();
+			g_signal_connect (G_OBJECT (assistant), "state-changed",
+						   G_CALLBACK (mbca_assistant_state_changed_cb), list);
+			list->mbca_assistant_run_for_device_func (assistant,
+											  MBCA_DEVICE_PSEUDO,
+											  NULL, NULL);
+
+			mb_type = NM_TYPE_SETTING_GSM; /* get rid of compiler warning about
+									  * unused variable */
+#endif
+		}
+		else
+		{
+			/* MBCA support not compiled in or libmbca is missing */
+
+			/* Since GSM is a placeholder for both GSM and CDMA; ask the user which
+			* one they really want.
+			*/
+			mb_type = mobile_wizard_ask_connection_type ();
+			if (mb_type == NM_TYPE_SETTING_GSM) {
+				NMSettingGsm *s_gsm;
+	
+				id = get_next_available_name (list, _("GSM connection %d"));
+				g_object_set (s_con,
+						NM_SETTING_CONNECTION_ID, id,
+						NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME,
+						NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+						NULL);
+				g_free (id);
+	
+				add_default_serial_setting (connection);
+	
+				type_setting = nm_setting_gsm_new ();
+				s_gsm = NM_SETTING_GSM (type_setting);
+				/* De-facto standard for GSM */
+				g_object_set (s_gsm, NM_SETTING_GSM_NUMBER, "*99#", NULL);
+	
+				nm_connection_add_setting (connection, nm_setting_ppp_new ());
+			} else if (mb_type == NM_TYPE_SETTING_CDMA) {
+				NMSettingCdma *s_cdma;
+	
+				id = get_next_available_name (list, _("CDMA connection %d"));
+				g_object_set (s_con,
+						NM_SETTING_CONNECTION_ID, id,
+						NM_SETTING_CONNECTION_TYPE, NM_SETTING_CDMA_SETTING_NAME,
+						NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+						NULL);
+				g_free (id);
+	
+				add_default_serial_setting (connection);
+	
+				type_setting = nm_setting_cdma_new ();
+				s_cdma = NM_SETTING_CDMA (type_setting);
+	
+				/* De-facto standard for CDMA */
+				g_object_set (s_cdma, NM_SETTING_CDMA_NUMBER, "#777", NULL);
+	
+				nm_connection_add_setting (connection, nm_setting_ppp_new ());
+			} else {
+				/* user canceled; do nothing */
+			}
 		}
 	} else if (ctype == NM_TYPE_SETTING_VPN) {
 		char *service = NULL;
@@ -1420,6 +1625,9 @@ nm_connection_list_init (NMConnectionList *list)
 
 	list->system_action = polkit_action_new ();
 	polkit_action_set_action_id (list->system_action, "org.freedesktop.network-manager-settings.system.modify");
+#ifdef WITH_MBCA
+	list->mbca_module = NULL;
+#endif
 }
 
 static void
@@ -1461,6 +1669,11 @@ dispose (GObject *object)
 	if (list->system_settings)
 		g_object_unref (list->system_settings);
 
+#if WITH_MBCA
+	if (list->mbca_module)
+		g_module_close (list->mbca_module);
+#endif
+
 	G_OBJECT_CLASS (nm_connection_list_parent_class)->dispose (object);
 }
 
diff --git a/src/connection-editor/nm-connection-list.h b/src/connection-editor/nm-connection-list.h
index 800873a..74351fe 100644
--- a/src/connection-editor/nm-connection-list.h
+++ b/src/connection-editor/nm-connection-list.h
@@ -36,6 +36,10 @@
 #endif
 #include "nma-gconf-settings.h"
 
+#ifdef WITH_MBCA
+#include <mbca_assistant.h>
+#endif
+
 #define NM_TYPE_CONNECTION_LIST    (nm_connection_list_get_type ())
 #define NM_IS_CONNECTION_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CONNECTION_LIST))
 #define NM_CONNECTION_LIST(obj)    (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONNECTION_LIST, NMConnectionList))
@@ -62,6 +66,16 @@ typedef struct {
 	GdkPixbuf *vpn_icon;
 	GdkPixbuf *unknown_icon;
 	GtkIconTheme *icon_theme;
+#ifdef WITH_MBCA
+	GModule *mbca_module;
+	MBCAAssistant* (*mbca_assistant_new_func) ();
+	gint (*mbca_assistant_run_for_device_func) (MBCAAssistant*,
+									    MBCADeviceType,
+									    const gchar*,
+									    const gchar*);
+	MBCAConfiguration* (*mbca_assistant_get_configuration_func) (MBCAAssistant*);
+	void (*mbca_free_configuration_func) (MBCAConfiguration*);
+#endif
 } NMConnectionList;
 
 typedef struct {
diff --git a/src/wireless-security/eap-method-peap.c b/src/wireless-security/eap-method-peap.c
index 8d82fee..f3e34b8 100644
--- a/src/wireless-security/eap-method-peap.c
+++ b/src/wireless-security/eap-method-peap.c
@@ -209,7 +209,8 @@ inner_auth_combo_changed_cb (GtkWidget *combo, gpointer user_data)
 static GtkWidget *
 inner_auth_combo_init (EAPMethodPEAP *method,
                        const char *glade_file,
-                       NMConnection *connection)
+                       NMConnection *connection,
+                       NMSetting8021x *s_8021x)
 {
 	GladeXML *xml = EAP_METHOD (method)->xml;
 	GtkWidget *combo;
@@ -217,9 +218,18 @@ inner_auth_combo_init (EAPMethodPEAP *method,
 	GtkTreeIter iter;
 	EAPMethodSimple *em_mschap_v2;
 	EAPMethodSimple *em_md5;
+	guint32 active = 0;
+	const char *phase2_auth = NULL;
 
 	auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_g_type ());
 
+	if (s_8021x) {
+		if (nm_setting_802_1x_get_phase2_auth (s_8021x))
+			phase2_auth = nm_setting_802_1x_get_phase2_auth (s_8021x);
+		else if (nm_setting_802_1x_get_phase2_autheap (s_8021x))
+			phase2_auth = nm_setting_802_1x_get_phase2_autheap (s_8021x);
+	}
+
 	em_mschap_v2 = eap_method_simple_new (glade_file,
 	                                      method->sec_parent,
 	                                      connection,
@@ -231,6 +241,10 @@ inner_auth_combo_init (EAPMethodPEAP *method,
 	                    -1);
 	eap_method_unref (EAP_METHOD (em_mschap_v2));
 
+	/* Check for defaulting to MSCHAPv2 */
+	if (phase2_auth && !strcasecmp (phase2_auth, "mschapv2"))
+		active = 0;
+
 	em_md5 = eap_method_simple_new (glade_file,
 	                                 method->sec_parent,
 	                                 connection,
@@ -242,12 +256,16 @@ inner_auth_combo_init (EAPMethodPEAP *method,
 	                    -1);
 	eap_method_unref (EAP_METHOD (em_md5));
 
+	/* Check for defaulting to MD5 */
+	if (phase2_auth && !strcasecmp (phase2_auth, "md5"))
+		active = 1;
+
 	combo = glade_xml_get_widget (xml, "eap_peap_inner_auth_combo");
 	g_assert (combo);
 
 	gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (auth_model));
 	g_object_unref (G_OBJECT (auth_model));
-	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), active);
 
 	g_signal_connect (G_OBJECT (combo), "changed",
 	                  (GCallback) inner_auth_combo_changed_cb,
@@ -320,7 +338,7 @@ eap_method_peap_new (const char *glade_file,
 			gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), filename);
 	}
 
-	widget = inner_auth_combo_init (method, glade_file, connection);
+	widget = inner_auth_combo_init (method, glade_file, connection, s_8021x);
 	inner_auth_combo_changed_cb (widget, (gpointer) method);
 
 	widget = glade_xml_get_widget (xml, "eap_peap_version_combo");
diff --git a/src/wireless-security/eap-method-ttls.c b/src/wireless-security/eap-method-ttls.c
index b455fc8..4fe51f0 100644
--- a/src/wireless-security/eap-method-ttls.c
+++ b/src/wireless-security/eap-method-ttls.c
@@ -272,7 +272,7 @@ inner_auth_combo_init (EAPMethodTTLS *method,
 
 	/* Check for defaulting to CHAP */
 	if (phase2_auth && !strcasecmp (phase2_auth, "chap"))
-		active = 4;
+		active = 3;
 
 	combo = glade_xml_get_widget (xml, "eap_ttls_inner_auth_combo");
 	g_assert (combo);
 
projeto & código: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
mantenedor atual: Michael Shigorin
mantenedor da tradução: Fernando Martini aka fmartini © 2009