2007-08-28 Dan Williams <dcbw@redhat.com>

Remove NMAPSecurity objects, they are replaced with flags on the APs for
	each AP's capabilities, and by NMConnection/NMSettings objects for user
	defined connections.

	* include/NetworkManager.h
		- Redefine 802.11 security properties.  There are now device capabilities
			and AP flags and AP security flags.  It was way to unclear before.

	* src/Makefile.am
	  src/nm-ap-security-leap.h
	  src/nm-ap-security-leap.c
	  src/nm-ap-security-wpa-eap.c
	  src/nm-ap-security-wpa-eap.h
	  src/nm-ap-security-private.h
	  src/nm-ap-security-wpa-psk.c
	  src/nm-ap-security-wpa-psk.h
	  src/nm-ap-security-wep.c
	  src/nm-ap-security-wep.h
	  src/nm-ap-security.c
	  src/nm-ap-security.h
		- Removed, to be replaced with NMConnection/NMSettings objects

	* src/nm-dbus-nmi.c
	  src/nm-dbus-nmi.h
		- Removed, to be replaced by code that talks to the new info daemon
			interface and gets NMConnection/NMSettings objects

	* src/backends/NetworkManagerSuSE.c
		- Remove usage of NMAPSecurity; should be replaced by a system-level
			info-daemon that does the same thing but talks the new info-daemon
			D-Bus interface

	* src/NetworkManagerAP.h
	  src/NetworkManagerAP.c
	  src/NetworkManagerAPList.c
	  libnm-glib/libnm-glib-test.c
		- Remove usage of NMAPSecurity objects and adjust to new flags for
			WPA/RSN

	* libnm-glib/nm-access-point.c
	  libnm-glib/nm-access-point.h
	  introspection/nm-access-point.xml
	  test/nm-tool.c
		- Adjust to new flags for AP security

	* utils/nm-utils.c
	  utils/nm-utils.h
	  src/vpn-manager/nm-dbus-vpn.c
		- Remove D-Bus pending call stuff from nm-utils and put it in the VPN
			stuff which is the only place it's used

	* src/nm-device-interface.c
	  src/nm-device-interface.h
	  introspection/nm-device.xml
	  src/nm-activation-request.c
	  src/nm-activation-request.h
	  src/nm-device.c
		- Add a new 'specific_object' argument that hints to NM what actual
			AP or other device-specific thing the connection should apply to.
			NMConnection objects can apply to more than one actual device/AP.

	* libnm-util/nm-connection.c
	* libnm-util/nm-connection.h
		- Add 'have_secrets" call stubs

	* libnm-util/cipher.h
		- Move NM_AUTH_TYPE_* defines here for now

	* src/nm-device-802-11-wireless.c
		- Remove usage of NMAPSecurity, to be replaced with NMConnection/
			NMSettings objects

	* src/NetworkManagerDbus.c
	* src/NetworkManagerPolicy.c
		- Remove usage of update_allowed_networks, should be pushing data in
			a different manner



git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2738 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2007-08-28 14:47:31 +00:00
parent 478aa57fab
commit 7a8f33aa3d
40 changed files with 656 additions and 3463 deletions

View File

@@ -1,3 +1,82 @@
2007-08-28 Dan Williams <dcbw@redhat.com>
Remove NMAPSecurity objects, they are replaced with flags on the APs for
each AP's capabilities, and by NMConnection/NMSettings objects for user
defined connections.
* include/NetworkManager.h
- Redefine 802.11 security properties. There are now device capabilities
and AP flags and AP security flags. It was way to unclear before.
* src/Makefile.am
src/nm-ap-security-leap.h
src/nm-ap-security-leap.c
src/nm-ap-security-wpa-eap.c
src/nm-ap-security-wpa-eap.h
src/nm-ap-security-private.h
src/nm-ap-security-wpa-psk.c
src/nm-ap-security-wpa-psk.h
src/nm-ap-security-wep.c
src/nm-ap-security-wep.h
src/nm-ap-security.c
src/nm-ap-security.h
- Removed, to be replaced with NMConnection/NMSettings objects
* src/nm-dbus-nmi.c
src/nm-dbus-nmi.h
- Removed, to be replaced by code that talks to the new info daemon
interface and gets NMConnection/NMSettings objects
* src/backends/NetworkManagerSuSE.c
- Remove usage of NMAPSecurity; should be replaced by a system-level
info-daemon that does the same thing but talks the new info-daemon
D-Bus interface
* src/NetworkManagerAP.h
src/NetworkManagerAP.c
src/NetworkManagerAPList.c
libnm-glib/libnm-glib-test.c
- Remove usage of NMAPSecurity objects and adjust to new flags for
WPA/RSN
* libnm-glib/nm-access-point.c
libnm-glib/nm-access-point.h
introspection/nm-access-point.xml
test/nm-tool.c
- Adjust to new flags for AP security
* utils/nm-utils.c
utils/nm-utils.h
src/vpn-manager/nm-dbus-vpn.c
- Remove D-Bus pending call stuff from nm-utils and put it in the VPN
stuff which is the only place it's used
* src/nm-device-interface.c
src/nm-device-interface.h
introspection/nm-device.xml
src/nm-activation-request.c
src/nm-activation-request.h
src/nm-device.c
- Add a new 'specific_object' argument that hints to NM what actual
AP or other device-specific thing the connection should apply to.
NMConnection objects can apply to more than one actual device/AP.
* libnm-util/nm-connection.c
* libnm-util/nm-connection.h
- Add 'have_secrets" call stubs
* libnm-util/cipher.h
- Move NM_AUTH_TYPE_* defines here for now
* src/nm-device-802-11-wireless.c
- Remove usage of NMAPSecurity, to be replaced with NMConnection/
NMSettings objects
* src/NetworkManagerDbus.c
* src/NetworkManagerPolicy.c
- Remove usage of update_allowed_networks, should be pushing data in
a different manner
2007-08-27 Tambet Ingo <tambet@gmail.com>
* src/nm-manager.c (impl_manager_get_devices): Duplicate the device path,

View File

@@ -79,47 +79,42 @@ typedef enum NMDeviceType
#define NM_DEVICE_CAP_CARRIER_DETECT 0x00000002
/* 802.11 wireless-specific device capability bits */
#define NM_802_11_CAP_NONE 0x00000000
#define NM_802_11_CAP_PROTO_NONE 0x00000001
#define NM_802_11_CAP_PROTO_WEP 0x00000002
#define NM_802_11_CAP_PROTO_WPA 0x00000004
#define NM_802_11_CAP_PROTO_WPA2 0x00000008
#define NM_802_11_CAP_RESERVED1 0x00000010
#define NM_802_11_CAP_RESERVED2 0x00000020
#define NM_802_11_CAP_KEY_MGMT_PSK 0x00000040
#define NM_802_11_CAP_KEY_MGMT_802_1X 0x00000080
#define NM_802_11_CAP_RESERVED3 0x00000100
#define NM_802_11_CAP_RESERVED4 0x00000200
#define NM_802_11_CAP_RESERVED5 0x00000400
#define NM_802_11_CAP_RESERVED6 0x00000800
#define NM_802_11_CAP_CIPHER_WEP40 0x00001000
#define NM_802_11_CAP_CIPHER_WEP104 0x00002000
#define NM_802_11_CAP_CIPHER_TKIP 0x00004000
#define NM_802_11_CAP_CIPHER_CCMP 0x00008000
/* 802.11 wireless device-specific capabilities */
#define NM_802_11_DEVICE_CAP_NONE 0x00000000
#define NM_802_11_DEVICE_CAP_CIPHER_WEP40 0x00000001
#define NM_802_11_DEVICE_CAP_CIPHER_WEP104 0x00000002
#define NM_802_11_DEVICE_CAP_CIPHER_TKIP 0x00000004
#define NM_802_11_DEVICE_CAP_CIPHER_CCMP 0x00000008
#define NM_802_11_DEVICE_CAP_WPA 0x00000010
#define NM_802_11_DEVICE_CAP_RSN 0x00000020
/*
* NM-supported Authentication Methods
* 802.11 Access Point flags
*
*/
#define NM_AUTH_TYPE_WPA_PSK_AUTO 0x00000000
#define NM_AUTH_TYPE_NONE 0x00000001
#define NM_AUTH_TYPE_WEP40 0x00000002
#define NM_AUTH_TYPE_WPA_PSK_TKIP 0x00000004
#define NM_AUTH_TYPE_WPA_PSK_CCMP 0x00000008
#define NM_AUTH_TYPE_WEP104 0x00000010
#define NM_AUTH_TYPE_WPA_EAP 0x00000020
#define NM_AUTH_TYPE_LEAP 0x00000040
#define NM_802_11_AP_FLAGS_NONE 0x00000000
#define NM_802_11_AP_FLAGS_PRIVACY 0x00000001
/*
* EAP Methods
* 802.11 Access Point security flags
*
* These describe the current security requirements of the BSSID as extracted
* from various pieces of beacon information, like beacon flags and various
* information elements.
*/
#define NM_EAP_METHOD_MD5 0x00000001 /* EAP-MD5 */
#define NM_EAP_METHOD_MSCHAP 0x00000002 /* EAP-MSCHAPv2 */
#define NM_EAP_METHOD_OTP 0x00000004 /* EAP-OTP */
#define NM_EAP_METHOD_GTC 0x00000008 /* EAP-GTC */
#define NM_EAP_METHOD_PEAP 0x00000010 /* EAP-PEAP */
#define NM_EAP_METHOD_TLS 0x00000020 /* EAP-TLS */
#define NM_EAP_METHOD_TTLS 0x00000040 /* EAP-TTLS */
#define NM_802_11_AP_SEC_NONE 0x00000000
#define NM_802_11_AP_SEC_PAIR_WEP40 0x00000001
#define NM_802_11_AP_SEC_PAIR_WEP104 0x00000002
#define NM_802_11_AP_SEC_PAIR_TKIP 0x00000004
#define NM_802_11_AP_SEC_PAIR_CCMP 0x00000008
#define NM_802_11_AP_SEC_GROUP_WEP40 0x00000010
#define NM_802_11_AP_SEC_GROUP_WEP104 0x00000020
#define NM_802_11_AP_SEC_GROUP_TKIP 0x00000040
#define NM_802_11_AP_SEC_GROUP_CCMP 0x00000080
#define NM_802_11_AP_SEC_KEY_MGMT_PSK 0x00000100
#define NM_802_11_AP_SEC_KEY_MGMT_802_1X 0x00000200
/*
* Wireless network types

View File

@@ -2,8 +2,9 @@
<node name="/">
<interface name="org.freedesktop.NetworkManager.AccessPoint">
<property name="Capabilities" type="u" access="read"/>
<property name="Encrypted" type="b" access="read"/>
<property name="Flags" type="u" access="read"/>
<property name="WPAFlags" type="u" access="read"/>
<property name="RSNFlags" type="u" access="read"/>
<property name="Ssid" type="ay" access="read"/>
<property name="Frequency" type="d" access="read"/>
<property name="HwAddress" type="s" access="read"/>

View File

@@ -4,7 +4,7 @@
<interface name="org.freedesktop.NetworkManager.Device">
<method name="Activate">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_device_activate"/>
<arg name="connection" type="a{sa{sv}}" direction="in"/>
<arg name="connection" type="a{sa{sv}}o" direction="in"/>
</method>
<method name="Deactivate">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_device_deactivate"/>

View File

@@ -177,8 +177,9 @@ dump_access_point (NMAccessPoint *ap)
g_print ("\tMAC Address: %s\n", str);
g_free (str);
g_print ("\tCapabilities: %d\n", nm_access_point_get_capabilities (ap));
g_print ("\tEncrypted: %d\n", nm_access_point_is_encrypted (ap));
g_print ("\tFlags: 0x%X\n", nm_access_point_get_flags (ap));
g_print ("\tWPA Flags: 0x%X\n", nm_access_point_get_wpa_flags (ap));
g_print ("\tRSN Flags: 0x%X\n", nm_access_point_get_rsn_flags (ap));
g_print ("\tFrequency: %f\n", nm_access_point_get_frequency (ap));
g_print ("\tMode: %d\n", nm_access_point_get_mode (ap));

View File

@@ -102,19 +102,27 @@ strength_changed_proxy (NMAccessPoint *ap, guchar strength)
}
guint32
nm_access_point_get_capabilities (NMAccessPoint *ap)
nm_access_point_get_flags (NMAccessPoint *ap)
{
g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0);
g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_FLAGS_NONE);
return nm_object_get_uint_property (NM_OBJECT (ap), NM_DBUS_INTERFACE_ACCESS_POINT, "Capabilities");
return nm_object_get_uint_property (NM_OBJECT (ap), NM_DBUS_INTERFACE_ACCESS_POINT, "Flags");
}
gboolean
nm_access_point_is_encrypted (NMAccessPoint *ap)
guint32
nm_access_point_get_wpa_flags (NMAccessPoint *ap)
{
g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), FALSE);
g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_SEC_NONE);
return nm_object_get_boolean_property (NM_OBJECT (ap), NM_DBUS_INTERFACE_ACCESS_POINT, "Encrypted");
return nm_object_get_uint_property (NM_OBJECT (ap), NM_DBUS_INTERFACE_ACCESS_POINT, "WPAFlags");
}
guint32
nm_access_point_get_rsn_flags (NMAccessPoint *ap)
{
g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_SEC_NONE);
return nm_object_get_uint_property (NM_OBJECT (ap), NM_DBUS_INTERFACE_ACCESS_POINT, "RSNFlags");
}
GByteArray *

View File

@@ -29,8 +29,9 @@ GType nm_access_point_get_type (void);
NMAccessPoint *nm_access_point_new (DBusGConnection *connection, const char *path);
guint32 nm_access_point_get_capabilities (NMAccessPoint *ap);
gboolean nm_access_point_is_encrypted (NMAccessPoint *ap);
guint32 nm_access_point_get_flags (NMAccessPoint *ap);
guint32 nm_access_point_get_wpa_flags (NMAccessPoint *ap);
guint32 nm_access_point_get_rsn_flags (NMAccessPoint *ap);
GByteArray * nm_access_point_get_ssid (NMAccessPoint *ap);
gdouble nm_access_point_get_frequency (NMAccessPoint *ap);
char * nm_access_point_get_hw_address (NMAccessPoint *ap);

View File

@@ -28,6 +28,30 @@
extern "C" {
#endif
/*
* NM-supported Authentication Methods
*/
#define NM_AUTH_TYPE_WPA_PSK_AUTO 0x00000000
#define NM_AUTH_TYPE_NONE 0x00000001
#define NM_AUTH_TYPE_WEP40 0x00000002
#define NM_AUTH_TYPE_WPA_PSK_TKIP 0x00000004
#define NM_AUTH_TYPE_WPA_PSK_CCMP 0x00000008
#define NM_AUTH_TYPE_WEP104 0x00000010
#define NM_AUTH_TYPE_WPA_EAP 0x00000020
#define NM_AUTH_TYPE_LEAP 0x00000040
/*
* EAP Methods
*/
#define NM_EAP_METHOD_MD5 0x00000001 /* EAP-MD5 */
#define NM_EAP_METHOD_MSCHAP 0x00000002 /* EAP-MSCHAPv2 */
#define NM_EAP_METHOD_OTP 0x00000004 /* EAP-OTP */
#define NM_EAP_METHOD_GTC 0x00000008 /* EAP-GTC */
#define NM_EAP_METHOD_PEAP 0x00000010 /* EAP-PEAP */
#define NM_EAP_METHOD_TLS 0x00000020 /* EAP-TLS */
#define NM_EAP_METHOD_TTLS 0x00000040 /* EAP-TTLS */
typedef struct IEEE_802_11_Cipher IEEE_802_11_Cipher;
void ieee_802_11_cipher_ref (IEEE_802_11_Cipher *cipher);

View File

@@ -137,6 +137,15 @@ nm_connection_compare (NMConnection *connection, NMConnection *other)
return FALSE;
}
gboolean
nm_connection_have_secrets (NMConnection *connection)
{
/* FIXME: go through Settings objects and determine if there are any
* secrets required.
*/
return FALSE;
}
static void
add_one_setting_to_hash (gpointer key, gpointer data, gpointer user_data)
{

View File

@@ -21,6 +21,8 @@ NMSetting *nm_connection_get_setting (NMConnection *connection,
gboolean nm_connection_compare (NMConnection *connection,
NMConnection *other);
gboolean nm_connection_have_secrets (NMConnection *connection);
GHashTable *nm_connection_to_hash (NMConnection *connection);
void nm_connection_dump (NMConnection *connection);
void nm_connection_destroy (NMConnection *connection);

View File

@@ -34,8 +34,6 @@ NetworkManager_SOURCES = \
NetworkManagerDbusUtils.h \
nm-dbus-manager.h \
nm-dbus-manager.c \
nm-dbus-nmi.c \
nm-dbus-nmi.h \
nm-hal-manager.c \
nm-hal-manager.h \
nm-ip4-config.c \
@@ -58,17 +56,6 @@ NetworkManager_SOURCES = \
nm-activation-request.h \
autoip.c \
autoip.h \
nm-ap-security.c \
nm-ap-security.h \
nm-ap-security-private.h \
nm-ap-security-wep.c \
nm-ap-security-wep.h \
nm-ap-security-wpa-eap.c \
nm-ap-security-wpa-eap.h \
nm-ap-security-wpa-psk.c \
nm-ap-security-wpa-psk.h \
nm-ap-security-leap.c \
nm-ap-security-leap.h \
nm-marshal-main.c \
kernel-types.h \
wpa.c \

View File

@@ -22,7 +22,6 @@
#include "NetworkManagerAP.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
#include "nm-ap-security.h"
#include "nm-dbus-manager.h"
#include <wireless.h>
#include "wpa.h"
@@ -55,7 +54,10 @@ typedef struct
gint8 strength;
double freq;
guint16 rate;
guint32 capabilities;
guint32 flags; /* General flags */
guint32 wpa_flags; /* WPA-related flags */
guint32 rsn_flags; /* RSN (WPA2) -related flags */
/* Non-scanned attributes */
gboolean invalid;
@@ -71,7 +73,6 @@ typedef struct
/* Things from user prefs/NetworkManagerInfo */
gboolean fallback;
NMAPSecurity * security;
GTimeVal timestamp;
GSList * user_addresses;
} NMAccessPointPrivate;
@@ -90,8 +91,9 @@ static guint signals[LAST_SIGNAL] = { 0 };
enum {
PROP_0,
PROP_CAPABILITIES,
PROP_ENCRYPTED,
PROP_FLAGS,
PROP_WPA_FLAGS,
PROP_RSN_FLAGS,
PROP_SSID,
PROP_FREQUENCY,
PROP_HW_ADDRESS,
@@ -110,7 +112,9 @@ nm_ap_init (NMAccessPoint *ap)
priv->dbus_path = g_strdup_printf (NM_DBUS_PATH_ACCESS_POINT "/%d", counter++);
priv->mode = IW_MODE_INFRA;
priv->capabilities = NM_802_11_CAP_PROTO_NONE;
priv->flags = NM_802_11_AP_FLAGS_NONE;
priv->wpa_flags = NM_802_11_AP_SEC_NONE;
priv->rsn_flags = NM_802_11_AP_SEC_NONE;
priv->broadcast = TRUE;
}
@@ -125,9 +129,6 @@ finalize (GObject *object)
g_slist_foreach (priv->user_addresses, (GFunc)g_free, NULL);
g_slist_free (priv->user_addresses);
if (priv->security)
g_object_unref (G_OBJECT (priv->security));
G_OBJECT_CLASS (nm_ap_parent_class)->finalize (object);
}
@@ -140,8 +141,14 @@ set_property (GObject *object, guint prop_id,
int mode;
switch (prop_id) {
case PROP_CAPABILITIES:
priv->capabilities = g_value_get_uint (value);
case PROP_FLAGS:
priv->flags = g_value_get_uint (value);
break;
case PROP_WPA_FLAGS:
priv->wpa_flags = g_value_get_uint (value);
break;
case PROP_RSN_FLAGS:
priv->rsn_flags = g_value_get_uint (value);
break;
case PROP_SSID:
ssid = g_value_get_boxed (value);
@@ -193,11 +200,14 @@ get_property (GObject *object, guint prop_id,
int i;
switch (prop_id) {
case PROP_CAPABILITIES:
g_value_set_uint (value, priv->capabilities);
case PROP_FLAGS:
g_value_set_uint (value, priv->flags);
break;
case PROP_ENCRYPTED:
g_value_set_boolean (value, !(priv->capabilities & NM_802_11_CAP_PROTO_NONE));
case PROP_WPA_FLAGS:
g_value_set_uint (value, priv->wpa_flags);
break;
case PROP_RSN_FLAGS:
g_value_set_uint (value, priv->rsn_flags);
break;
case PROP_SSID:
len = priv->ssid ? priv->ssid->len : 0;
@@ -234,7 +244,7 @@ static void
nm_ap_class_init (NMAccessPointClass *ap_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (ap_class);
guint32 all_caps;
guint32 all_sec_flags;
g_type_class_add_private (ap_class, sizeof (NMAccessPointPrivate));
@@ -245,39 +255,47 @@ nm_ap_class_init (NMAccessPointClass *ap_class)
/* properties */
all_caps = NM_802_11_CAP_NONE
| NM_802_11_CAP_PROTO_NONE
| NM_802_11_CAP_PROTO_WEP
| NM_802_11_CAP_PROTO_WPA
| NM_802_11_CAP_PROTO_WPA2
| NM_802_11_CAP_RESERVED1
| NM_802_11_CAP_RESERVED2
| NM_802_11_CAP_KEY_MGMT_PSK
| NM_802_11_CAP_KEY_MGMT_802_1X
| NM_802_11_CAP_RESERVED3
| NM_802_11_CAP_RESERVED4
| NM_802_11_CAP_RESERVED5
| NM_802_11_CAP_RESERVED6
| NM_802_11_CAP_CIPHER_WEP40
| NM_802_11_CAP_CIPHER_WEP104
| NM_802_11_CAP_CIPHER_TKIP
| NM_802_11_CAP_CIPHER_CCMP;
all_sec_flags = NM_802_11_AP_SEC_NONE
| NM_802_11_AP_SEC_PAIR_WEP40
| NM_802_11_AP_SEC_PAIR_WEP104
| NM_802_11_AP_SEC_PAIR_TKIP
| NM_802_11_AP_SEC_PAIR_CCMP
| NM_802_11_AP_SEC_GROUP_WEP40
| NM_802_11_AP_SEC_GROUP_WEP104
| NM_802_11_AP_SEC_GROUP_TKIP
| NM_802_11_AP_SEC_GROUP_CCMP
| NM_802_11_AP_SEC_KEY_MGMT_PSK
| NM_802_11_AP_SEC_KEY_MGMT_802_1X;
g_object_class_install_property
(object_class, PROP_CAPABILITIES,
g_param_spec_uint (NM_AP_CAPABILITIES,
"Capabilities",
"Capabilities",
NM_802_11_CAP_NONE, all_caps, NM_802_11_CAP_PROTO_NONE,
(object_class, PROP_FLAGS,
g_param_spec_uint (NM_AP_FLAGS,
"Flags",
"Flags",
NM_802_11_AP_FLAGS_NONE,
NM_802_11_AP_FLAGS_PRIVACY,
NM_802_11_AP_FLAGS_NONE,
G_PARAM_READWRITE));
g_object_class_install_property
(object_class, PROP_ENCRYPTED,
g_param_spec_boolean (NM_AP_ENCRYPTED,
"Encrypted",
"Is encrypted",
FALSE,
G_PARAM_READABLE));
(object_class, PROP_WPA_FLAGS,
g_param_spec_uint (NM_AP_WPA_FLAGS,
"WPA Flags",
"WPA Flags",
NM_802_11_AP_SEC_NONE,
all_sec_flags,
NM_802_11_AP_SEC_NONE,
G_PARAM_READWRITE));
g_object_class_install_property
(object_class, PROP_RSN_FLAGS,
g_param_spec_uint (NM_AP_RSN_FLAGS,
"RSN Flags",
"RSN Flags",
NM_802_11_AP_SEC_NONE,
all_sec_flags,
NM_802_11_AP_SEC_NONE,
G_PARAM_READWRITE));
g_object_class_install_property
(object_class, PROP_SSID,
@@ -399,12 +417,11 @@ nm_ap_new_from_ap (NMAccessPoint *src_ap)
new_priv->strength = src_priv->strength;
new_priv->freq = src_priv->freq;
new_priv->rate = src_priv->rate;
new_priv->capabilities = src_priv->capabilities;
new_priv->artificial = src_priv->artificial;
new_priv->broadcast = src_priv->broadcast;
if (src_priv->security)
new_priv->security = nm_ap_security_new_copy (src_priv->security);
new_priv->flags = src_priv->flags;
new_priv->wpa_flags = src_priv->wpa_flags;
new_priv->rsn_flags = src_priv->rsn_flags;
return new_ap;
}
@@ -446,14 +463,20 @@ foreach_property_cb (gpointer key, gpointer value, gpointer user_data)
nm_ap_set_address (ap, &addr);
} else if (!strcmp (key, "wpaie")) {
guint8 * ie = (guint8 *) array->data;
guint32 flags = nm_ap_get_wpa_flags (ap);
if (array->len <= 0 || array->len > WPA_MAX_IE_LEN)
return;
nm_ap_add_capabilities_from_ie (ap, ie, array->len);
flags = nm_ap_add_security_from_ie (flags, ie, array->len);
nm_ap_set_wpa_flags (ap, flags);
} else if (!strcmp (key, "rsnie")) {
guint8 * ie = (guint8 *) array->data;
guint32 flags = nm_ap_get_rsn_flags (ap);
if (array->len <= 0 || array->len > WPA_MAX_IE_LEN)
return;
nm_ap_add_capabilities_from_ie (ap, ie, array->len);
flags = nm_ap_add_security_from_ie (flags, ie, array->len);
nm_ap_set_rsn_flags (ap, flags);
}
} else if (G_VALUE_HOLDS_INT (variant)) {
gint32 int_val = g_value_get_int (variant);
@@ -475,11 +498,8 @@ foreach_property_cb (gpointer key, gpointer value, gpointer user_data)
}
if (val & IEEE80211_CAP_PRIVACY) {
guint cur_caps;
cur_caps = nm_ap_get_capabilities (ap);
if (cur_caps == NM_802_11_CAP_NONE || cur_caps & NM_802_11_CAP_PROTO_NONE)
nm_ap_add_capabilities_for_wep (ap);
guint32 flags = nm_ap_get_flags (ap);
nm_ap_set_flags (ap, flags | NM_802_11_AP_FLAGS_PRIVACY);
}
}
}
@@ -531,13 +551,16 @@ nm_ap_print_self (NMAccessPoint *ap,
priv = NM_AP_GET_PRIVATE (ap);
nm_info ("%s'%s' (%p) stamp=%ld caps=0x%X bssid=" MAC_FMT " strength=%d "
"freq=[%f/%d] rate=%d inval=%d mode=%d seen=%ld",
nm_info ("%s'%s' (%p) stamp=%ld flags=0x%X wpa-flags=0x%X rsn-flags=0x%x "
"bssid=" MAC_FMT " strength=%d freq=[%f/%d] rate=%d inval=%d "
"mode=%d seen=%ld",
prefix,
priv->ssid ? nm_utils_escape_ssid (priv->ssid->data, priv->ssid->len) : "(none)",
ap,
priv->timestamp.tv_sec,
priv->capabilities,
priv->flags,
priv->wpa_flags,
priv->rsn_flags,
MAC_ARG (priv->address.ether_addr_octet),
priv->strength,
(priv->freq > 20) ? priv->freq : 0,
@@ -606,71 +629,68 @@ void nm_ap_set_ssid (NMAccessPoint *ap, const GByteArray * ssid)
}
guint32 nm_ap_get_capabilities (NMAccessPoint *ap)
guint32
nm_ap_get_flags (NMAccessPoint *ap)
{
guint32 caps;
guint32 flags;
g_return_val_if_fail (NM_IS_AP (ap), NM_802_11_CAP_NONE);
g_return_val_if_fail (NM_IS_AP (ap), NM_802_11_AP_FLAGS_NONE);
g_object_get (ap, NM_AP_CAPABILITIES, &caps, NULL);
g_object_get (ap, NM_AP_FLAGS, &flags, NULL);
return caps;
return flags;
}
void nm_ap_set_capabilities (NMAccessPoint *ap, guint32 capabilities)
void
nm_ap_set_flags (NMAccessPoint *ap, guint32 flags)
{
g_return_if_fail (NM_IS_AP (ap));
g_object_set (ap, NM_AP_CAPABILITIES, capabilities, NULL);
g_object_set (ap, NM_AP_FLAGS, flags, NULL);
}
guint32
nm_ap_get_wpa_flags (NMAccessPoint *ap)
{
guint32 flags;
g_return_val_if_fail (NM_IS_AP (ap), NM_802_11_AP_SEC_NONE);
g_object_get (ap, NM_AP_WPA_FLAGS, &flags, NULL);
return flags;
}
/*
* Accessor function for encrypted flag
*
*/
gboolean nm_ap_get_encrypted (NMAccessPoint *ap)
void
nm_ap_set_wpa_flags (NMAccessPoint *ap, guint32 flags)
{
gboolean encrypted;
g_return_val_if_fail (NM_IS_AP (ap), FALSE);
g_object_get (ap, NM_AP_ENCRYPTED, &encrypted, NULL);
return encrypted;
}
/*
* Accessors for AP security info
*
*/
NMAPSecurity * nm_ap_get_security (const NMAccessPoint *ap)
{
g_return_val_if_fail (NM_IS_AP (ap), NULL);
return NM_AP_GET_PRIVATE (ap)->security;
}
void nm_ap_set_security (NMAccessPoint *ap, NMAPSecurity *security)
{
NMAccessPointPrivate *priv;
g_return_if_fail (NM_IS_AP (ap));
priv = NM_AP_GET_PRIVATE (ap);
if (priv->security)
{
g_object_unref (G_OBJECT (priv->security));
priv->security = NULL;
}
if (security)
priv->security = nm_ap_security_new_copy (security);
g_object_set (ap, NM_AP_WPA_FLAGS, flags, NULL);
}
guint32
nm_ap_get_rsn_flags (NMAccessPoint *ap)
{
guint32 flags;
g_return_val_if_fail (NM_IS_AP (ap), NM_802_11_AP_SEC_NONE);
g_object_get (ap, NM_AP_RSN_FLAGS, &flags, NULL);
return flags;
}
void
nm_ap_set_rsn_flags (NMAccessPoint *ap, guint32 flags)
{
g_return_if_fail (NM_IS_AP (ap));
g_object_set (ap, NM_AP_RSN_FLAGS, flags, NULL);
}
/*
* Get/set functions for address
@@ -984,117 +1004,42 @@ gboolean nm_ap_has_manufacturer_default_ssid (NMAccessPoint *ap)
return FALSE;
}
static guint32 add_capabilities_from_cipher (guint32 caps, int cipher)
guint32
nm_ap_add_security_from_ie (guint32 flags,
const guint8 *wpa_ie,
guint32 length)
{
if (cipher & IW_AUTH_CIPHER_WEP40)
{
caps |= NM_802_11_CAP_PROTO_WEP;
caps |= NM_802_11_CAP_CIPHER_WEP40;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cipher & IW_AUTH_CIPHER_WEP104)
{
caps |= NM_802_11_CAP_PROTO_WEP;
caps |= NM_802_11_CAP_CIPHER_WEP104;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cipher & IW_AUTH_CIPHER_TKIP)
{
caps |= NM_802_11_CAP_CIPHER_TKIP;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cipher & IW_AUTH_CIPHER_CCMP)
{
caps |= NM_802_11_CAP_CIPHER_CCMP;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cipher == NM_AUTH_TYPE_WPA_PSK_AUTO)
{
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cipher == NM_AUTH_TYPE_WPA_EAP)
{
caps |= NM_802_11_CAP_KEY_MGMT_802_1X;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cipher == NM_AUTH_TYPE_LEAP)
{
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
return caps;
}
/*
* nm_ap_add_capabilities_from_cipher
*
* Update a given AP's capabilities via a wireless extension cipher integer
*
*/
void nm_ap_add_capabilities_from_security (NMAccessPoint *ap, NMAPSecurity *security)
{
guint32 caps;
int cipher;
g_return_if_fail (NM_IS_AP (ap));
g_return_if_fail (security != NULL);
cipher = nm_ap_security_get_we_cipher (security);
caps = nm_ap_get_capabilities (ap);
caps = add_capabilities_from_cipher (caps, cipher);
nm_ap_set_capabilities (ap, caps);
}
void nm_ap_add_capabilities_from_ie (NMAccessPoint *ap, const guint8 *wpa_ie, guint32 length)
{
wpa_ie_data * cap_data;
guint32 caps;
g_return_if_fail (NM_IS_AP (ap));
wpa_ie_data * cap_data;
if (!(cap_data = wpa_parse_wpa_ie (wpa_ie, length)))
return;
return NM_802_11_AP_SEC_NONE;
caps = nm_ap_get_capabilities (ap);
/* Pairwise cipher flags */
if (cap_data->pairwise_cipher & IW_AUTH_CIPHER_WEP40)
flags |= NM_802_11_AP_SEC_PAIR_WEP40;
if (cap_data->pairwise_cipher & IW_AUTH_CIPHER_WEP104)
flags |= NM_802_11_AP_SEC_PAIR_WEP104;
if (cap_data->pairwise_cipher & IW_AUTH_CIPHER_TKIP)
flags |= NM_802_11_AP_SEC_PAIR_TKIP;
if (cap_data->pairwise_cipher & IW_AUTH_CIPHER_CCMP)
flags |= NM_802_11_AP_SEC_PAIR_CCMP;
/* Mark WEP as unsupported, if it's supported it will be added below */
caps &= ~NM_802_11_CAP_PROTO_WEP;
if (cap_data->proto & IW_AUTH_WPA_VERSION_WPA)
{
caps |= NM_802_11_CAP_PROTO_WPA;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
if (cap_data->proto & IW_AUTH_WPA_VERSION_WPA2)
{
caps |= NM_802_11_CAP_PROTO_WPA2;
caps &= ~NM_802_11_CAP_PROTO_NONE;
}
caps = add_capabilities_from_cipher (caps, cap_data->pairwise_cipher);
caps = add_capabilities_from_cipher (caps, cap_data->group_cipher);
/* Group cipher flags */
if (cap_data->group_cipher & IW_AUTH_CIPHER_WEP40)
flags |= NM_802_11_AP_SEC_GROUP_WEP40;
if (cap_data->group_cipher & IW_AUTH_CIPHER_WEP104)
flags |= NM_802_11_AP_SEC_GROUP_WEP104;
if (cap_data->group_cipher & IW_AUTH_CIPHER_TKIP)
flags |= NM_802_11_AP_SEC_GROUP_TKIP;
if (cap_data->group_cipher & IW_AUTH_CIPHER_CCMP)
flags |= NM_802_11_AP_SEC_GROUP_CCMP;
if (cap_data->key_mgmt & IW_AUTH_KEY_MGMT_802_1X)
caps |= NM_802_11_CAP_KEY_MGMT_802_1X;
flags |= NM_802_11_AP_SEC_KEY_MGMT_802_1X;
if (cap_data->key_mgmt & IW_AUTH_KEY_MGMT_PSK)
caps |= NM_802_11_CAP_KEY_MGMT_PSK;
nm_ap_set_capabilities (ap, caps);
flags |= NM_802_11_AP_SEC_KEY_MGMT_PSK;
g_slice_free (wpa_ie_data, cap_data);
return flags;
}
void nm_ap_add_capabilities_for_wep (NMAccessPoint *ap)
{
NMAccessPointPrivate *priv;
g_return_if_fail (NM_IS_AP (ap));
priv = NM_AP_GET_PRIVATE (ap);
priv->capabilities |= (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP40 | NM_802_11_CAP_CIPHER_WEP104);
priv->capabilities &= ~NM_802_11_CAP_PROTO_NONE;
}

View File

@@ -27,7 +27,6 @@
#include <glib-object.h>
#include <time.h>
#include "NetworkManager.h"
#include "nm-ap-security.h"
#define NM_TYPE_AP (nm_ap_get_type ())
#define NM_AP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP, NMAccessPoint))
@@ -36,8 +35,9 @@
#define NM_IS_AP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_AP))
#define NM_AP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP, NMAccessPointClass))
#define NM_AP_CAPABILITIES "capabilities"
#define NM_AP_ENCRYPTED "encrypted"
#define NM_AP_FLAGS "flags"
#define NM_AP_WPA_FLAGS "wpa-flags"
#define NM_AP_RSN_FLAGS "rsn-flags"
#define NM_AP_SSID "ssid"
#define NM_AP_FREQUENCY "frequency"
#define NM_AP_HW_ADDRESS "hw-address"
@@ -70,13 +70,14 @@ void nm_ap_set_timestamp_via_timestamp (NMAccessPoint *ap, const GTimeVal *ti
const GByteArray * nm_ap_get_ssid (const NMAccessPoint * ap);
void nm_ap_set_ssid (NMAccessPoint * ap, const GByteArray * ssid);
guint32 nm_ap_get_capabilities (NMAccessPoint *ap);
void nm_ap_set_capabilities (NMAccessPoint *ap, guint32 capabilities);
guint32 nm_ap_get_flags (NMAccessPoint *ap);
void nm_ap_set_flags (NMAccessPoint *ap, guint32 flags);
gboolean nm_ap_get_encrypted (NMAccessPoint *ap);
guint32 nm_ap_get_wpa_flags (NMAccessPoint *ap);
void nm_ap_set_wpa_flags (NMAccessPoint *ap, guint32 flags);
NMAPSecurity * nm_ap_get_security (const NMAccessPoint *ap);
void nm_ap_set_security (NMAccessPoint *ap, NMAPSecurity *security);
guint32 nm_ap_get_rsn_flags (NMAccessPoint *ap);
void nm_ap_set_rsn_flags (NMAccessPoint *ap, guint32 flags);
const struct ether_addr * nm_ap_get_address (const NMAccessPoint *ap);
void nm_ap_set_address (NMAccessPoint *ap, const struct ether_addr *addr);
@@ -114,9 +115,9 @@ void nm_ap_set_user_created (NMAccessPoint *ap, gboolean user_created);
GSList * nm_ap_get_user_addresses (const NMAccessPoint *ap);
void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list);
void nm_ap_add_capabilities_from_security (NMAccessPoint *ap, NMAPSecurity *security);
void nm_ap_add_capabilities_from_ie (NMAccessPoint *ap, const guint8 *wpa_ie, guint32 length);
void nm_ap_add_capabilities_for_wep (NMAccessPoint *ap);
guint32 nm_ap_add_security_from_ie (guint32 flags,
const guint8 *wpa_ie,
guint32 length);
void nm_ap_print_self (NMAccessPoint *ap, const char * prefix);

View File

@@ -366,7 +366,9 @@ void nm_ap_list_copy_properties (NMAccessPointList *dest, NMAccessPointList *sou
if ((src_ap = nm_ap_list_get_ap_by_ssid (source, nm_ap_get_ssid (dest_ap))))
{
nm_ap_set_invalid (dest_ap, nm_ap_get_invalid (src_ap));
nm_ap_set_security (dest_ap, nm_ap_get_security (src_ap));
nm_ap_set_flags (dest_ap, nm_ap_get_flags (src_ap));
nm_ap_set_wpa_flags (dest_ap, nm_ap_get_wpa_flags (src_ap));
nm_ap_set_rsn_flags (dest_ap, nm_ap_get_rsn_flags (src_ap));
nm_ap_set_timestamp_via_timestamp (dest_ap, nm_ap_get_timestamp (src_ap));
}
}

View File

@@ -36,7 +36,6 @@
#include "NetworkManagerAP.h"
#include "NetworkManagerAPList.h"
#include "NetworkManagerPolicy.h"
#include "nm-dbus-nmi.h"
#include "nm-utils.h"
#include "nm-dhcp-manager.h"
#include "nm-dbus-manager.h"
@@ -111,8 +110,7 @@ nm_dbus_nmi_signal_handler (DBusConnection *connection,
DBUS_TYPE_INVALID)) {
/* Update a single wireless network's data */
nm_debug ("NetworkManagerInfo triggered update of wireless network '%s'", network);
nm_dbus_update_one_allowed_network (network,
(NMData *) g_object_get_data (G_OBJECT (manager), "NM_DATA_HACK"));
// FIXME: convert to connection update signal
handled = TRUE;
}
} else if (dbus_message_is_signal (message, NMI_DBUS_INTERFACE, "UserInterfaceActivated")) {

View File

@@ -35,11 +35,11 @@
#include "NetworkManagerDbus.h"
#include "nm-activation-request.h"
#include "nm-utils.h"
#include "nm-dbus-nmi.h"
#include "nm-device-interface.h"
#include "nm-device-802-11-wireless.h"
#include "nm-device-802-3-ethernet.h"
#include "nm-dbus-manager.h"
#include "nm-setting.h"
struct NMPolicy {
NMManager *manager;
@@ -367,7 +367,7 @@ nm_policy_device_change_check (gpointer user_data)
connection = create_connection (new_dev, ap);
if (connection)
nm_device_interface_activate (NM_DEVICE_INTERFACE (new_dev),
connection, FALSE);
connection, NULL, FALSE);
}
}
@@ -399,11 +399,8 @@ nm_policy_allowed_ap_list_update (gpointer user_data)
nm_info ("Updating allowed wireless network lists.");
/* Query info daemon for network lists if its now running */
if (data->allowed_ap_list)
nm_ap_list_unref (data->allowed_ap_list);
if ((data->allowed_ap_list = nm_ap_list_new (NETWORK_TYPE_ALLOWED)))
nm_dbus_update_allowed_networks (data->allowed_ap_list, data);
// FIXME: convert to getting connections instead
return FALSE;
}

View File

@@ -38,17 +38,8 @@
#include "NetworkManagerUtils.h"
#include "NetworkManagerMain.h"
#include "nm-device.h"
#include "nm-ap-security.h"
#include "nm-ap-security-private.h"
#include "nm-ap-security-wep.h"
#include "nm-ap-security-wpa-psk.h"
#include "NetworkManagerAPList.h"
#include "NetworkManagerPolicy.h"
#include "cipher.h"
#include "cipher-wep-ascii.h"
#include "cipher-wep-hex.h"
#include "cipher-wep-passphrase.h"
#include "cipher-wpa-psk-passphrase.h"
#include "nm-device-802-3-ethernet.h"
#include "nm-device-802-11-wireless.h"
#include "NetworkManagerDialup.h"
@@ -387,144 +378,6 @@ found:
free (buf);
}
if ((buf = svGetValue (file, "WIRELESS_ESSID")) && strlen (buf) > 1)
{
NMAccessPoint * ap;
NMAccessPoint * list_ap;
char * key;
char * mode;
GByteArray * ssid;
ap = nm_ap_new ();
ssid = g_byte_array_sized_new (strlen (buf));
g_byte_array_append (ssid, buf, strlen (buf));
nm_ap_set_ssid (ap, ssid);
nm_ap_set_timestamp (ap, time (NULL), 0);
nm_ap_set_fallback (ap, TRUE);
if ((mode = svGetValue (file, "WIRELESS_AUTH_MODE")) && !strcmp (mode, "psk"))
{
if ((key = svGetValue (file, "WIRELESS_WPA_PSK")))
{
IEEE_802_11_Cipher * cipher;
NMAPSecurityWPA_PSK * security;
char * hash;
cipher = cipher_wpa_psk_passphrase_new ();
nm_ap_set_capabilities (ap, NM_802_11_CAP_PROTO_WPA);
security = nm_ap_security_wpa_psk_new (NM_802_11_CAP_PROTO_WPA,
NM_AUTH_TYPE_WPA_PSK_AUTO);
hash = ieee_802_11_cipher_hash (cipher, buf, key);
if (hash)
{
nm_ap_security_set_key (NM_AP_SECURITY (security), hash, strlen (hash));
nm_ap_set_security (ap, NM_AP_SECURITY (security));
}
ieee_802_11_cipher_unref (cipher);
g_object_unref (G_OBJECT (security));
}
}
else if ((key = svGetValue (file, "WIRELESS_KEY_0")) && strlen (key) > 3)
{
IEEE_802_11_Cipher * cipher;
NMAPSecurityWEP * security;
char * key_type;
char * hash;
char * real_key;
key_type = svGetValue (file, "WIRELESS_KEY_LENGTH");
if (key_type && strcmp (key_type, "128") != 0)
{
if (key[0] == 'h' && key[1] == ':')
{
cipher = cipher_wep64_passphrase_new ();
real_key = key + 2;
}
else if (key[0] == 's' && key[1] == ':')
{
cipher = cipher_wep64_ascii_new ();
real_key = key + 2;
}
else
{
cipher = cipher_wep64_hex_new ();
real_key = key;
}
security = nm_ap_security_wep_new (IW_AUTH_CIPHER_WEP40);
}
else
{
if (key[0] == 'h' && key[1] == ':')
{
cipher = cipher_wep128_passphrase_new ();
real_key = key + 2;
}
else if (key[0] == 's' && key[1] == ':')
{
cipher = cipher_wep128_ascii_new ();
real_key = key + 2;
}
else
{
char **keyv;
cipher = cipher_wep128_hex_new ();
keyv = g_strsplit (key, "-", 0);
real_key = g_strjoinv (NULL, keyv);
g_strfreev (keyv);
}
security = nm_ap_security_wep_new (IW_AUTH_CIPHER_WEP104);
}
hash = ieee_802_11_cipher_hash (cipher, buf, real_key);
if (hash)
{
nm_ap_security_set_key (NM_AP_SECURITY (security), hash, strlen (hash));
nm_ap_set_security (ap, NM_AP_SECURITY (security));
}
ieee_802_11_cipher_unref (cipher);
g_object_unref (G_OBJECT (security));
free (key_type);
}
else
{
NMAPSecurity * security;
security = nm_ap_security_new (NM_DEVICE_CAP_NONE, FALSE);
nm_ap_set_security (ap, security);
g_object_unref (G_OBJECT (security));
}
if ((list_ap = nm_ap_list_get_ap_by_ssid (app_data->allowed_ap_list, ssid)))
{
nm_ap_set_ssid (list_ap, nm_ap_get_ssid (ap));
nm_ap_set_timestamp_via_timestamp (list_ap, nm_ap_get_timestamp (ap));
nm_ap_set_fallback (list_ap, TRUE);
nm_ap_set_security (list_ap, nm_ap_get_security (ap));
}
else
{
/* New AP, just add it to the list */
nm_ap_list_append_ap (app_data->allowed_ap_list, ap);
}
g_byte_array_free (ssid, TRUE);
g_object_unref (ap);
nm_debug ("Adding '%s' to the list of trusted networks", buf);
/* Ensure all devices get new information copied into their device lists */
nm_policy_schedule_device_ap_lists_update_from_allowed (app_data);
free (key);
free (mode);
free (buf);
}
sys_data->config = nm_ip4_config_new ();
if (!sys_data->use_dhcp || sys_data->system_disabled)

View File

@@ -28,6 +28,7 @@ G_DEFINE_TYPE (NMActRequest, nm_act_request, G_TYPE_OBJECT)
typedef struct {
NMConnection *connection;
char *specific_object;
gboolean user_requested;
} NMActRequestPrivate;
@@ -43,6 +44,8 @@ finalize (GObject *object)
nm_connection_destroy (priv->connection);
g_free (priv->specific_object);
G_OBJECT_CLASS (nm_act_request_parent_class)->finalize (object);
}
@@ -57,7 +60,9 @@ nm_act_request_class_init (NMActRequestClass *req_class)
}
NMActRequest *
nm_act_request_new (NMConnection *connection, gboolean user_requested)
nm_act_request_new (NMConnection *connection,
const char *specific_object,
gboolean user_requested)
{
GObject *obj;
NMActRequestPrivate *priv;
@@ -72,6 +77,8 @@ nm_act_request_new (NMConnection *connection, gboolean user_requested)
priv->connection = connection;
priv->user_requested = user_requested;
if (specific_object)
priv->specific_object = g_strdup (specific_object);
return NM_ACT_REQUEST (obj);
}
@@ -84,6 +91,14 @@ nm_act_request_get_connection (NMActRequest *req)
return NM_ACT_REQUEST_GET_PRIVATE (req)->connection;
}
const char *
nm_act_request_get_specific_object (NMActRequest *req)
{
g_return_val_if_fail (NM_IS_ACT_REQUEST (req), NULL);
return NM_ACT_REQUEST_GET_PRIVATE (req)->specific_object;
}
gboolean
nm_act_request_get_user_requested (NMActRequest *req)
{

View File

@@ -44,9 +44,11 @@ typedef struct {
GType nm_act_request_get_type (void);
NMActRequest *nm_act_request_new (NMConnection *connection,
gboolean user_requested);
const char *specific_object,
gboolean user_requested);
NMConnection *nm_act_request_get_connection (NMActRequest *req);
const char * nm_act_request_get_specific_object(NMActRequest *req);
gboolean nm_act_request_get_user_requested (NMActRequest *req);
#endif /* NM_ACTIVATION_REQUEST_H */

View File

@@ -1,212 +0,0 @@
/* NetworkManager -- Network link manager
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2006 Thiago Jung Bauermann <thiago.bauermann@gmail.com>
*/
/* This file is heavily based on nm-ap-security-wpa-eap.c */
#include <glib.h>
#include <glib/gi18n.h>
#include <dbus/dbus.h>
#include <iwlib.h>
#include "nm-ap-security.h"
#include "nm-ap-security-leap.h"
#include "nm-ap-security-private.h"
#include "dbus-helpers.h"
#include "nm-device-802-11-wireless.h"
#include "nm-supplicant-config.h"
#define NM_AP_SECURITY_LEAP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY_LEAP, NMAPSecurityLEAPPrivate))
struct _NMAPSecurityLEAPPrivate
{
char * username;
char * key_mgmt;
};
NMAPSecurityLEAP *
nm_ap_security_leap_new_deserialize (DBusMessageIter *iter)
{
NMAPSecurityLEAP * security = NULL;
char * username = NULL;
char * password = NULL;
char * key_mgmt = NULL;
g_return_val_if_fail (iter != NULL, NULL);
if (!nmu_security_deserialize_leap (iter, &username, &password, &key_mgmt))
goto out;
/* Success, build up our security object */
security = g_object_new (NM_TYPE_AP_SECURITY_LEAP, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), NM_AUTH_TYPE_LEAP);
if (password)
nm_ap_security_set_key (NM_AP_SECURITY (security), password, strlen(password));
if (username)
security->priv->username = g_strdup (username);
if (key_mgmt)
security->priv->key_mgmt = g_strdup (key_mgmt);
nm_ap_security_set_description (NM_AP_SECURITY (security), _("LEAP"));
out:
return security;
}
NMAPSecurityLEAP *
nm_ap_security_leap_new (void)
{
NMAPSecurityLEAP *security;
security = g_object_new (NM_TYPE_AP_SECURITY_LEAP, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), NM_AUTH_TYPE_LEAP);
nm_ap_security_set_description (NM_AP_SECURITY (security), _("LEAP"));
return security;
}
static int
real_serialize (NMAPSecurity *instance, DBusMessageIter *iter)
{
NMAPSecurityLEAP * self = NM_AP_SECURITY_LEAP (instance);
if (!nmu_security_serialize_leap (iter, self->priv->username,
nm_ap_security_get_key(instance), self->priv->key_mgmt))
return -1;
return 0;
}
static gboolean
real_write_supplicant_config (NMAPSecurity *instance,
NMSupplicantConfig * config,
gboolean user_created)
{
NMAPSecurityLEAP * self = NM_AP_SECURITY_LEAP (instance);
gboolean success = FALSE;
const char * password = nm_ap_security_get_key (instance);
g_return_val_if_fail (nm_ap_security_get_we_cipher (instance) == NM_AUTH_TYPE_LEAP, FALSE);
if (!nm_supplicant_config_add_option (config, "proto", "WPA", -1))
goto out;
if (!nm_supplicant_config_add_option (config, "key_mgmt", self->priv->key_mgmt, -1))
goto out;
if (!nm_supplicant_config_add_option (config, "eap", "LEAP", -1))
goto out;
if (self->priv->username && strlen (self->priv->username) > 0) {
if (!nm_supplicant_config_add_option (config, "identity", self->priv->username, -1))
goto out;
}
if (password && strlen (password) > 0) {
if (!nm_supplicant_config_add_option (config, "password", password, -1))
goto out;
}
success = TRUE;
out:
return success;
}
static guint32
real_get_default_capabilities (NMAPSecurity *instance)
{
guint32 caps = NM_802_11_CAP_NONE;
caps |= NM_802_11_CAP_KEY_MGMT_802_1X;
return caps;
}
static gboolean
real_get_authentication_required (NMAPSecurity *instance)
{
/* LEAP always requires authentication. */
return TRUE;
}
static NMAPSecurity *
real_copy_constructor (NMAPSecurity *instance)
{
NMAPSecurityLEAP * dst = g_object_new (NM_TYPE_AP_SECURITY_LEAP, NULL);
NMAPSecurityLEAP * self = NM_AP_SECURITY_LEAP (instance);
dst->priv->username = self->priv->username;
dst->priv->key_mgmt = self->priv->key_mgmt;
nm_ap_security_copy_properties (NM_AP_SECURITY (self), NM_AP_SECURITY (dst));
return NM_AP_SECURITY (dst);
}
static void
nm_ap_security_leap_init (NMAPSecurityLEAP * self)
{
self->priv = NM_AP_SECURITY_LEAP_GET_PRIVATE (self);
self->priv->username = NULL;
self->priv->key_mgmt = NULL;
}
static void
nm_ap_security_leap_class_init (NMAPSecurityLEAPClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMAPSecurityClass *par_class = NM_AP_SECURITY_CLASS (klass);
par_class->copy_constructor_func = real_copy_constructor;
par_class->serialize_func = real_serialize;
par_class->write_supplicant_config_func = real_write_supplicant_config;
par_class->get_default_capabilities_func = real_get_default_capabilities;
par_class->get_authentication_required_func = real_get_authentication_required;
g_type_class_add_private (object_class, sizeof (NMAPSecurityLEAPPrivate));
}
GType
nm_ap_security_leap_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo info = {
sizeof (NMAPSecurityLEAPClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) nm_ap_security_leap_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (NMAPSecurityLEAP),
0, /* n_preallocs */
(GInstanceInitFunc) nm_ap_security_leap_init,
NULL /* value_table */
};
type = g_type_register_static (NM_TYPE_AP_SECURITY,
"NMAPSecurityLEAP",
&info, 0);
}
return type;
}

View File

@@ -1,59 +0,0 @@
/* NetworkManager -- Network link manager
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2006 Thiago Jung Bauermann <thiago.bauermann@gmail.com>
*/
/* This file is heavily based on nm-ap-security-wpa-eap.h */
#ifndef NM_AP_SECURITY_LEAP_H
#define NM_AP_SECURITY_LEAP_H
#include <glib-object.h>
#include <dbus/dbus.h>
#include "nm-ap-security.h"
#define NM_TYPE_AP_SECURITY_LEAP (nm_ap_security_leap_get_type ())
#define NM_AP_SECURITY_LEAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP_SECURITY_LEAP, NMAPSecurityLEAP))
#define NM_AP_SECURITY_LEAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_AP_SECURITY_LEAP, NMAPSecurityLEAPClass))
#define NM_IS_AP_SECURITY_LEAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_AP_SECURITY_LEAP))
#define NM_IS_AP_SECURITY_LEAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_AP_SECURITY_LEAP))
#define NM_AP_SECURITY_LEAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP_SECURITY_LEAP, NMAPSecurityLEAPClass))
typedef struct _NMAPSecurityLEAP NMAPSecurityLEAP;
typedef struct _NMAPSecurityLEAPClass NMAPSecurityLEAPClass;
typedef struct _NMAPSecurityLEAPPrivate NMAPSecurityLEAPPrivate;
struct _NMAPSecurityLEAP
{
NMAPSecurity parent;
/*< private >*/
NMAPSecurityLEAPPrivate *priv;
};
struct _NMAPSecurityLEAPClass
{
NMAPSecurityClass parent;
};
GType nm_ap_security_leap_get_type (void);
NMAPSecurityLEAP * nm_ap_security_leap_new_deserialize (DBusMessageIter *iter);
NMAPSecurityLEAP * nm_ap_security_leap_new (void);
#endif /* NM_AP_SECURITY_LEAP_H */

View File

@@ -1,35 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#ifndef NM_AP_SECURITY_PRIVATE_H
#define NM_AP_SECURITY_PRIVATE_H
#include "nm-ap-security.h"
void nm_ap_security_set_we_cipher (NMAPSecurity *self, int we_cipher);
void nm_ap_security_set_key (NMAPSecurity *self, const char *key, int key_len);
void nm_ap_security_set_description (NMAPSecurity *self, const char *desc);
void nm_ap_security_copy_properties (NMAPSecurity *self, NMAPSecurity *dst);
#endif /* NM_AP_SECURITY_PRIVATE_H */

View File

@@ -1,237 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#include <glib.h>
#include <glib/gi18n.h>
#include <dbus/dbus.h>
#include <iwlib.h>
#include "nm-ap-security.h"
#include "nm-ap-security-wep.h"
#include "nm-ap-security-private.h"
#include "dbus-helpers.h"
#include "nm-device-802-11-wireless.h"
#include "nm-utils.h"
#include "nm-supplicant-config.h"
#define NM_AP_SECURITY_WEP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY_WEP, NMAPSecurityWEPPrivate))
struct _NMAPSecurityWEPPrivate
{
int auth_algorithm;
};
static int get_auth_algorithm (NMAPSecurityWEP *security)
{
return security->priv->auth_algorithm;
}
static void set_description (NMAPSecurityWEP *security)
{
NMAPSecurity * parent = NM_AP_SECURITY (security);
if (nm_ap_security_get_we_cipher (parent) == IW_AUTH_CIPHER_WEP40)
nm_ap_security_set_description (parent, _("40-bit WEP"));
else
nm_ap_security_set_description (parent, _("104-bit WEP"));
}
NMAPSecurityWEP *
nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher)
{
NMAPSecurityWEP * security = NULL;
char * key = NULL;
int key_len;
int auth_algorithm;
g_return_val_if_fail (iter != NULL, NULL);
g_return_val_if_fail ((we_cipher == IW_AUTH_CIPHER_WEP40) || (we_cipher == IW_AUTH_CIPHER_WEP104), NULL);
if (!nmu_security_deserialize_wep (iter, &key, &key_len, &auth_algorithm))
goto out;
/* Success, build up our security object */
security = g_object_new (NM_TYPE_AP_SECURITY_WEP, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), we_cipher);
if (key)
nm_ap_security_set_key (NM_AP_SECURITY (security), key, key_len);
security->priv->auth_algorithm = auth_algorithm;
set_description (security);
out:
return security;
}
NMAPSecurityWEP *
nm_ap_security_wep_new (int we_cipher)
{
NMAPSecurityWEP *security;
g_return_val_if_fail ((we_cipher == IW_AUTH_CIPHER_WEP40) || (we_cipher == IW_AUTH_CIPHER_WEP104), NULL);
security = g_object_new (NM_TYPE_AP_SECURITY_WEP, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), we_cipher);
security->priv->auth_algorithm = IW_AUTH_ALG_OPEN_SYSTEM;
set_description (security);
return security;
}
static int
real_serialize (NMAPSecurity *instance, DBusMessageIter *iter)
{
NMAPSecurityWEP * self = NM_AP_SECURITY_WEP (instance);
if (!nmu_security_serialize_wep (iter,
nm_ap_security_get_key (instance),
self->priv->auth_algorithm))
return -1;
return 0;
}
static gboolean
real_write_supplicant_config (NMAPSecurity *instance,
NMSupplicantConfig * config,
gboolean adhoc)
{
gboolean success = FALSE;
const char * key = nm_ap_security_get_key (instance);
char * bin_key = NULL;
/* WEP network setup */
if (!nm_supplicant_config_add_option (config, "key_mgmt", "NONE", -1))
goto out;
/*
* If the user selected "Shared" (aka restricted) key, set it explicitly. Otherwise,
* let wpa_supplicant default to the right thing, which is an open key.
*/
if (get_auth_algorithm (NM_AP_SECURITY_WEP (instance)) == IW_AUTH_ALG_SHARED_KEY) {
if (!nm_supplicant_config_add_option (config, "auth_alg", "SHARED", -1))
goto out;
}
bin_key = cipher_hexstr2bin(key, strlen (key));
if (bin_key == NULL) {
nm_warning ("Not enough memory to convert key.");
goto out;
}
if (!nm_supplicant_config_add_option (config, "wep_key0", bin_key, -1)) {
g_free (bin_key);
goto out;
}
g_free (bin_key);
if (!nm_supplicant_config_add_option (config, "wep_tx_keyidx", "0", -1))
goto out;
success = TRUE;
out:
return success;
}
static guint32
real_get_default_capabilities (NMAPSecurity *instance)
{
guint32 caps = NM_802_11_CAP_NONE;
switch (nm_ap_security_get_we_cipher (instance))
{
case IW_AUTH_CIPHER_WEP40:
caps |= (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP40);
break;
case IW_AUTH_CIPHER_WEP104:
caps |= (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP104);
break;
default:
break;
}
return caps;
}
static gboolean
real_get_authentication_required (NMAPSecurity *instance)
{
/* WEP really requires authentication in Shared mode only */
return (get_auth_algorithm (NM_AP_SECURITY_WEP (instance)) == IW_AUTH_ALG_SHARED_KEY);
}
static NMAPSecurity *
real_copy_constructor (NMAPSecurity *instance)
{
NMAPSecurityWEP * dst = g_object_new (NM_TYPE_AP_SECURITY_WEP, NULL);
NMAPSecurityWEP * self = NM_AP_SECURITY_WEP (instance);
dst->priv->auth_algorithm = self->priv->auth_algorithm;
nm_ap_security_copy_properties (NM_AP_SECURITY (self), NM_AP_SECURITY (dst));
return NM_AP_SECURITY (dst);
}
static void
nm_ap_security_wep_init (NMAPSecurityWEP * self)
{
self->priv = NM_AP_SECURITY_WEP_GET_PRIVATE (self);
self->priv->auth_algorithm = IW_AUTH_ALG_OPEN_SYSTEM;
}
static void
nm_ap_security_wep_class_init (NMAPSecurityWEPClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMAPSecurityClass *par_class = NM_AP_SECURITY_CLASS (klass);
par_class->copy_constructor_func = real_copy_constructor;
par_class->serialize_func = real_serialize;
par_class->write_supplicant_config_func = real_write_supplicant_config;
par_class->get_default_capabilities_func = real_get_default_capabilities;
par_class->get_authentication_required_func = real_get_authentication_required;
g_type_class_add_private (object_class, sizeof (NMAPSecurityWEPPrivate));
}
GType
nm_ap_security_wep_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo info = {
sizeof (NMAPSecurityWEPClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) nm_ap_security_wep_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (NMAPSecurityWEP),
0, /* n_preallocs */
(GInstanceInitFunc) nm_ap_security_wep_init,
NULL /* value_table */
};
type = g_type_register_static (NM_TYPE_AP_SECURITY,
"NMAPSecurityWEP",
&info, 0);
}
return type;
}

View File

@@ -1,59 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#ifndef NM_AP_SECURITY_WEP_H
#define NM_AP_SECURITY_WEP_H
#include <glib-object.h>
#include <dbus/dbus.h>
#include "nm-ap-security.h"
#define NM_TYPE_AP_SECURITY_WEP (nm_ap_security_wep_get_type ())
#define NM_AP_SECURITY_WEP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP_SECURITY_WEP, NMAPSecurityWEP))
#define NM_AP_SECURITY_WEP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_AP_SECURITY_WEP, NMAPSecurityWEPClass))
#define NM_IS_AP_SECURITY_WEP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_AP_SECURITY_WEP))
#define NM_IS_AP_SECURITY_WEP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_AP_SECURITY_WEP))
#define NM_AP_SECURITY_WEP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP_SECURITY_WEP, NMAPSecurityWEPClass))
typedef struct _NMAPSecurityWEP NMAPSecurityWEP;
typedef struct _NMAPSecurityWEPClass NMAPSecurityWEPClass;
typedef struct _NMAPSecurityWEPPrivate NMAPSecurityWEPPrivate;
struct _NMAPSecurityWEP
{
NMAPSecurity parent;
/*< private >*/
NMAPSecurityWEPPrivate *priv;
};
struct _NMAPSecurityWEPClass
{
NMAPSecurityClass parent;
};
GType nm_ap_security_wep_get_type (void);
NMAPSecurityWEP * nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher);
NMAPSecurityWEP * nm_ap_security_wep_new (int we_cipher);
#endif /* NM_AP_SECURITY_WEP_H */

View File

@@ -1,385 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
* (C) Copyright 2006 Novell, Inc.
*/
#include <glib.h>
#include <glib/gi18n.h>
#include <dbus/dbus.h>
#include <iwlib.h>
#include "nm-ap-security.h"
#include "nm-ap-security-wpa-eap.h"
#include "nm-ap-security-private.h"
#include "dbus-helpers.h"
#include "nm-device-802-11-wireless.h"
#include "nm-supplicant-config.h"
#define NM_AP_SECURITY_WPA_EAP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY_WPA_EAP, NMAPSecurityWPA_EAPPrivate))
struct _NMAPSecurityWPA_EAPPrivate
{
int eap_method;
int key_type;
int wpa_version;
int key_mgmt;
char * identity;
char * passwd;
char * anon_identity;
char * private_key_passwd;
char * private_key_file;
char * client_cert_file;
char * ca_cert_file;
};
NMAPSecurityWPA_EAP *
nm_ap_security_wpa_eap_new_deserialize (DBusMessageIter *iter)
{
NMAPSecurityWPA_EAP * security = NULL;
int eap_method;
int key_type;
int wpa_version;
char * identity = NULL;
char * passwd = NULL;
char * anon_identity = NULL;
char * private_key_passwd = NULL;
char * private_key_file = NULL;
char * client_cert_file = NULL;
char * ca_cert_file = NULL;
g_return_val_if_fail (iter != NULL, NULL);
if (!nmu_security_deserialize_wpa_eap (iter, &eap_method, &key_type, &identity, &passwd,
&anon_identity, &private_key_passwd, &private_key_file,
&client_cert_file, &ca_cert_file, &wpa_version))
goto out;
/* Success, build up our security object */
security = g_object_new (NM_TYPE_AP_SECURITY_WPA_EAP, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), NM_AUTH_TYPE_WPA_EAP);
if ((private_key_passwd && strlen (private_key_passwd) > 0) || (passwd && strlen (passwd) > 0))
nm_ap_security_set_key (NM_AP_SECURITY (security), "FIXME", 5);
security->priv->eap_method = eap_method;
security->priv->key_type = key_type;
security->priv->wpa_version = wpa_version;
security->priv->key_mgmt = IW_AUTH_KEY_MGMT_802_1X;
security->priv->identity = g_strdup (identity);
security->priv->passwd = g_strdup (passwd);
security->priv->anon_identity = g_strdup (anon_identity);
security->priv->private_key_passwd = g_strdup (private_key_passwd);
security->priv->private_key_file = g_strdup (private_key_file);
security->priv->client_cert_file = g_strdup (client_cert_file);
security->priv->ca_cert_file = g_strdup (ca_cert_file);
if (wpa_version == IW_AUTH_WPA_VERSION_WPA2)
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA2 Enterprise"));
else
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA Enterprise"));
out:
return security;
}
NMAPSecurityWPA_EAP *
nm_ap_security_wpa_eap_new (guint32 capabilities)
{
NMAPSecurityWPA_EAP *security;
security = g_object_new (NM_TYPE_AP_SECURITY_WPA_EAP, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), NM_AUTH_TYPE_WPA_EAP);
if (capabilities & NM_802_11_CAP_PROTO_WPA2) {
security->priv->wpa_version = IW_AUTH_WPA_VERSION_WPA2;
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA2 Enterprise"));
} else {
security->priv->wpa_version = IW_AUTH_WPA_VERSION_WPA;
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA Enterprise"));
}
return security;
}
static int
real_serialize (NMAPSecurity *instance, DBusMessageIter *iter)
{
NMAPSecurityWPA_EAP * self = NM_AP_SECURITY_WPA_EAP (instance);
if (!nmu_security_serialize_wpa_eap (iter,
self->priv->eap_method,
self->priv->key_type,
self->priv->identity ? : "",
self->priv->passwd ? : "",
self->priv->anon_identity ? : "",
self->priv->private_key_passwd ? : "",
self->priv->private_key_file ? : "",
self->priv->client_cert_file ? : "",
self->priv->ca_cert_file ? : "",
self->priv->wpa_version))
return -1;
return 0;
}
static const char *
get_eap_method (int eap_method)
{
switch (eap_method)
{
case NM_EAP_METHOD_PEAP:
return "PEAP";
case NM_EAP_METHOD_TLS:
return "TLS";
case NM_EAP_METHOD_TTLS:
return "TTLS";
default:
g_warning ("Unmatched eap_method=%d!", eap_method);
return "TLS";
}
}
static gboolean
real_write_supplicant_config (NMAPSecurity *instance,
NMSupplicantConfig * config,
gboolean adhoc)
{
NMAPSecurityWPA_EAP * self = NM_AP_SECURITY_WPA_EAP (instance);
gboolean success = FALSE;
const char * identity = self->priv->identity;
const char * anon_identity = self->priv->anon_identity;
const char * passwd = self->priv->passwd;
const char * private_key_passwd = self->priv->private_key_passwd;
const char * private_key_file = self->priv->private_key_file;
const char * ca_cert_file = self->priv->ca_cert_file;
const char * client_cert_file = self->priv->client_cert_file;
int wpa_version = self->priv->wpa_version;
int key_mgmt = self->priv->key_mgmt;
int eap_method = self->priv->eap_method;
int key_type = self->priv->key_type;
g_return_val_if_fail (nm_ap_security_get_we_cipher (instance) == NM_AUTH_TYPE_WPA_EAP, FALSE);
g_return_val_if_fail (key_mgmt == IW_AUTH_KEY_MGMT_802_1X, FALSE);
g_return_val_if_fail (wpa_version == IW_AUTH_WPA_VERSION_WPA
|| wpa_version == IW_AUTH_WPA_VERSION_WPA2, FALSE);
g_return_val_if_fail (eap_method == NM_EAP_METHOD_MD5
|| eap_method == NM_EAP_METHOD_MSCHAP
|| eap_method == NM_EAP_METHOD_OTP
|| eap_method == NM_EAP_METHOD_GTC
|| eap_method == NM_EAP_METHOD_PEAP
|| eap_method == NM_EAP_METHOD_TLS
|| eap_method == NM_EAP_METHOD_TTLS, FALSE);
g_return_val_if_fail ((key_type == NM_AUTH_TYPE_WPA_PSK_AUTO)
|| (key_type == IW_AUTH_CIPHER_CCMP)
|| (key_type == IW_AUTH_CIPHER_TKIP)
|| (key_type == IW_AUTH_CIPHER_WEP104), FALSE);
/* WPA-EAP network setup */
if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA) {
if (!nm_supplicant_config_add_option (config, "proto", "WPA", -1))
goto out;
} else {
if (!nm_supplicant_config_add_option (config, "proto", "WPA2", -1))
goto out;
}
if (key_type != IW_AUTH_CIPHER_WEP104) {
if (!nm_supplicant_config_add_option (config, "key_mgmt", "WPA-EAP", -1))
goto out;
} else {
/* So-called Dynamic WEP */
if (!nm_supplicant_config_add_option (config, "key_mgmt", "IEEE8021X", -1))
goto out;
}
if (!nm_supplicant_config_add_option (config, "eap", get_eap_method (eap_method), -1))
goto out;
if (identity && strlen (identity) > 0) {
if (!nm_supplicant_config_add_option (config, "identity", identity, -1))
goto out;
}
if (passwd && strlen (passwd) > 0) {
if (!nm_supplicant_config_add_option (config, "password", passwd, -1))
goto out;
}
if (anon_identity && strlen (anon_identity) > 0) {
if (!nm_supplicant_config_add_option (config, "anonymous_identity", anon_identity, -1))
goto out;
}
if (private_key_file && strlen (private_key_file) > 0) {
if (!nm_supplicant_config_add_option (config, "private_key", private_key_file, -1))
goto out;
}
if (private_key_passwd && strlen (private_key_passwd) > 0) {
if (!nm_supplicant_config_add_option (config, "private_key_passwd", private_key_passwd, -1))
goto out;
}
if (client_cert_file && strlen (client_cert_file) > 0) {
if (!nm_supplicant_config_add_option (config, "client_cert", client_cert_file, -1))
goto out;
}
if (ca_cert_file && strlen (ca_cert_file) > 0) {
if (!nm_supplicant_config_add_option (config, "ca_cert", ca_cert_file, -1))
goto out;
}
/*
* Set the pairwise and group cipher, if the user provided one. If user selected "Automatic", we
* let wpa_supplicant sort it out. Likewise, if the user selected "Dynamic WEP", we do nothing.
*/
if (key_type != NM_AUTH_TYPE_WPA_PSK_AUTO && key_type != IW_AUTH_CIPHER_WEP104) {
const char *cipher;
/*
* FIXME: Technically, the pairwise cipher does not need to be the same as
* the group cipher. Fixing this requires changes in the UI.
*/
if (key_type == IW_AUTH_CIPHER_TKIP)
cipher = "TKIP";
else /* IW_AUTH_CIPHER_CCMP */
cipher = "CCMP";
if (!nm_supplicant_config_add_option (config, "pairwise", cipher, -1))
goto out;
if (!nm_supplicant_config_add_option (config, "group", cipher, -1))
goto out;
}
success = TRUE;
out:
return success;
}
static guint32
real_get_default_capabilities (NMAPSecurity *instance)
{
NMAPSecurityWPA_EAP *self = NM_AP_SECURITY_WPA_EAP (instance);
guint32 caps = NM_802_11_CAP_NONE;
if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA)
caps |= NM_802_11_CAP_PROTO_WPA | NM_802_11_CAP_CIPHER_TKIP;
else if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA2)
caps |= NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_CIPHER_CCMP;
if (self->priv->key_mgmt == IW_AUTH_KEY_MGMT_802_1X)
caps |= NM_802_11_CAP_KEY_MGMT_802_1X;
return caps;
}
static gboolean
real_get_authentication_required (NMAPSecurity *instance)
{
/* WPA Enterprise is all about strong security */
return TRUE;
}
static NMAPSecurity *
real_copy_constructor (NMAPSecurity *instance)
{
NMAPSecurityWPA_EAP * dst = g_object_new (NM_TYPE_AP_SECURITY_WPA_EAP, NULL);
NMAPSecurityWPA_EAP * self = NM_AP_SECURITY_WPA_EAP (instance);
dst->priv->eap_method = self->priv->eap_method;
dst->priv->key_type = self->priv->key_type;
dst->priv->wpa_version = self->priv->wpa_version;
dst->priv->key_mgmt = self->priv->key_mgmt;
dst->priv->identity = g_strdup (self->priv->identity);
dst->priv->passwd = g_strdup (self->priv->passwd);
dst->priv->anon_identity = g_strdup (self->priv->anon_identity);
dst->priv->private_key_passwd = g_strdup (self->priv->private_key_passwd);
dst->priv->private_key_file = g_strdup (self->priv->private_key_file);
dst->priv->client_cert_file = g_strdup (self->priv->client_cert_file);
dst->priv->ca_cert_file = g_strdup (self->priv->ca_cert_file);
nm_ap_security_copy_properties (NM_AP_SECURITY (self), NM_AP_SECURITY (dst));
return NM_AP_SECURITY (dst);
}
static void
nm_ap_security_wpa_eap_init (NMAPSecurityWPA_EAP * self)
{
self->priv = NM_AP_SECURITY_WPA_EAP_GET_PRIVATE (self);
self->priv->eap_method = NM_EAP_METHOD_TLS;
self->priv->wpa_version = IW_AUTH_WPA_VERSION_WPA;
self->priv->key_mgmt = IW_AUTH_KEY_MGMT_802_1X;
self->priv->identity = NULL;
self->priv->passwd = NULL;
self->priv->anon_identity = NULL;
self->priv->private_key_passwd = NULL;
self->priv->private_key_file = NULL;
self->priv->client_cert_file = NULL;
self->priv->ca_cert_file = NULL;
}
static void
nm_ap_security_wpa_eap_class_init (NMAPSecurityWPA_EAPClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMAPSecurityClass *par_class = NM_AP_SECURITY_CLASS (klass);
par_class->copy_constructor_func = real_copy_constructor;
par_class->serialize_func = real_serialize;
par_class->write_supplicant_config_func = real_write_supplicant_config;
par_class->get_default_capabilities_func = real_get_default_capabilities;
par_class->get_authentication_required_func = real_get_authentication_required;
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_EAPPrivate));
}
GType
nm_ap_security_wpa_eap_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo info = {
sizeof (NMAPSecurityWPA_EAPClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) nm_ap_security_wpa_eap_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (NMAPSecurityWPA_EAP),
0, /* n_preallocs */
(GInstanceInitFunc) nm_ap_security_wpa_eap_init,
NULL /* value_table */
};
type = g_type_register_static (NM_TYPE_AP_SECURITY,
"NMAPSecurityWPA_EAP",
&info, 0);
}
return type;
}

View File

@@ -1,60 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
* (C) Copyright 2006 Novell, Inc.
*/
#ifndef NM_AP_SECURITY_WPA_EAP_H
#define NM_AP_SECURITY_WPA_EAP_H
#include <glib-object.h>
#include <dbus/dbus.h>
#include "nm-ap-security.h"
#define NM_TYPE_AP_SECURITY_WPA_EAP (nm_ap_security_wpa_eap_get_type ())
#define NM_AP_SECURITY_WPA_EAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP_SECURITY_WPA_EAP, NMAPSecurityWPA_EAP))
#define NM_AP_SECURITY_WPA_EAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_AP_SECURITY_WPA_EAP, NMAPSecurityWPA_EAPClass))
#define NM_IS_AP_SECURITY_WPA_EAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_AP_SECURITY_WPA_EAP))
#define NM_IS_AP_SECURITY_WPA_EAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_AP_SECURITY_WPA_EAP))
#define NM_AP_SECURITY_WPA_EAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP_SECURITY_WPA_EAP, NMAPSecurityWPA_EAPClass))
typedef struct _NMAPSecurityWPA_EAP NMAPSecurityWPA_EAP;
typedef struct _NMAPSecurityWPA_EAPClass NMAPSecurityWPA_EAPClass;
typedef struct _NMAPSecurityWPA_EAPPrivate NMAPSecurityWPA_EAPPrivate;
struct _NMAPSecurityWPA_EAP
{
NMAPSecurity parent;
/*< private >*/
NMAPSecurityWPA_EAPPrivate *priv;
};
struct _NMAPSecurityWPA_EAPClass
{
NMAPSecurityClass parent;
};
GType nm_ap_security_wpa_eap_get_type (void);
NMAPSecurityWPA_EAP * nm_ap_security_wpa_eap_new_deserialize (DBusMessageIter *iter);
NMAPSecurityWPA_EAP * nm_ap_security_wpa_eap_new (guint32 capabilities);
#endif /* NM_AP_SECURITY_WPA_EAP_H */

View File

@@ -1,292 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#include <glib.h>
#include <glib/gi18n.h>
#include <dbus/dbus.h>
#include <iwlib.h>
#include "nm-ap-security.h"
#include "nm-ap-security-wpa-psk.h"
#include "nm-ap-security-private.h"
#include "dbus-helpers.h"
#include "nm-device-802-11-wireless.h"
#include "nm-supplicant-config.h"
#include "nm-utils.h"
#define NM_AP_SECURITY_WPA_PSK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY_WPA_PSK, NMAPSecurityWPA_PSKPrivate))
struct _NMAPSecurityWPA_PSKPrivate
{
int wpa_version;
int key_mgt;
};
static void set_description (NMAPSecurityWPA_PSK *security)
{
NMAPSecurity * parent = NM_AP_SECURITY (security);
int we_cipher = nm_ap_security_get_we_cipher (parent);
if (security->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA)
{
if (we_cipher == IW_AUTH_CIPHER_TKIP)
nm_ap_security_set_description (parent, _("WPA TKIP"));
else if (we_cipher == IW_AUTH_CIPHER_CCMP)
nm_ap_security_set_description (parent, _("WPA CCMP"));
else
nm_ap_security_set_description (parent, _("WPA Automatic"));
}
else if (security->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA2)
{
if (we_cipher == IW_AUTH_CIPHER_TKIP)
nm_ap_security_set_description (parent, _("WPA2 TKIP"));
else if (we_cipher == IW_AUTH_CIPHER_CCMP)
nm_ap_security_set_description (parent, _("WPA2 CCMP"));
else
nm_ap_security_set_description (parent, _("WPA2 Automatic"));
}
}
NMAPSecurityWPA_PSK *
nm_ap_security_wpa_psk_new_deserialize (DBusMessageIter *iter, int we_cipher)
{
NMAPSecurityWPA_PSK * security = NULL;
char * key = NULL;
int key_len;
int wpa_version;
int key_mgt;
g_return_val_if_fail (iter != NULL, NULL);
g_return_val_if_fail (we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO || we_cipher == IW_AUTH_CIPHER_TKIP || we_cipher == IW_AUTH_CIPHER_CCMP, NULL);
if (!nmu_security_deserialize_wpa_psk (iter, &key, &key_len, &wpa_version, &key_mgt))
goto out;
/* Success, build up our security object */
security = g_object_new (NM_TYPE_AP_SECURITY_WPA_PSK, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), we_cipher);
if (key)
nm_ap_security_set_key (NM_AP_SECURITY (security), key, key_len);
security->priv->wpa_version = wpa_version;
security->priv->key_mgt = key_mgt;
set_description (security);
out:
return security;
}
NMAPSecurityWPA_PSK *
nm_ap_security_wpa_psk_new (guint32 capabilities, int we_cipher)
{
NMAPSecurityWPA_PSK *security;
g_return_val_if_fail (we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO || we_cipher == IW_AUTH_CIPHER_TKIP || (we_cipher == IW_AUTH_CIPHER_CCMP), NULL);
security = g_object_new (NM_TYPE_AP_SECURITY_WPA_PSK, NULL);
nm_ap_security_set_we_cipher (NM_AP_SECURITY (security), we_cipher);
if (capabilities & NM_802_11_CAP_PROTO_WPA2)
security->priv->wpa_version = IW_AUTH_WPA_VERSION_WPA2;
else if (capabilities & NM_802_11_CAP_PROTO_WPA)
security->priv->wpa_version = IW_AUTH_WPA_VERSION_WPA;
security->priv->key_mgt = IW_AUTH_KEY_MGMT_PSK;
set_description (security);
return security;
}
static int
real_serialize (NMAPSecurity *instance, DBusMessageIter *iter)
{
NMAPSecurityWPA_PSK * self = NM_AP_SECURITY_WPA_PSK (instance);
if (!nmu_security_serialize_wpa_psk (iter,
nm_ap_security_get_key (instance),
self->priv->wpa_version,
self->priv->key_mgt))
return -1;
return 0;
}
static gboolean
real_write_supplicant_config (NMAPSecurity *instance,
NMSupplicantConfig * config,
gboolean adhoc)
{
NMAPSecurityWPA_PSK * self = NM_AP_SECURITY_WPA_PSK (instance);
gboolean success = FALSE;
const char * key = nm_ap_security_get_key (instance);
int cipher = nm_ap_security_get_we_cipher (instance);
char * key_mgmt = "WPA-PSK";
char * pairwise_cipher = NULL;
char * group_cipher = NULL;
char * bin_key = NULL;
/* WPA-PSK network setup */
if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA) {
if (!nm_supplicant_config_add_option (config, "proto", "WPA", -1))
goto out;
} else if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA2) {
if (!nm_supplicant_config_add_option (config, "proto", "WPA2", -1))
goto out;
}
/* Ad-Hoc has to be WPA-NONE */
if (adhoc)
key_mgmt = "WPA-NONE";
if (!nm_supplicant_config_add_option (config, "key_mgmt", key_mgmt, -1))
goto out;
bin_key = cipher_hexstr2bin(key, strlen (key));
if (bin_key == NULL) {
nm_warning ("Not enough memory to convert key.");
goto out;
}
if (!nm_supplicant_config_add_option (config, "psk", bin_key, strlen (key) / 2)) {
g_free (bin_key);
goto out;
}
g_free (bin_key);
/*
* FIXME: Technically, the pairwise cipher does not need to be the same as
* the group cipher. Fixing this requires changes in the UI.
*/
if (cipher == IW_AUTH_CIPHER_TKIP)
pairwise_cipher = group_cipher = "TKIP";
else if (cipher == IW_AUTH_CIPHER_CCMP)
pairwise_cipher = group_cipher = "CCMP";
else if (cipher == IW_AUTH_CIPHER_NONE)
pairwise_cipher = group_cipher = "NONE";
/* Ad-Hoc requires pairwise cipher of NONE */
if (adhoc)
pairwise_cipher = "NONE";
/* If user selected "Automatic", we let wpa_supplicant sort it out */
if (cipher != NM_AUTH_TYPE_WPA_PSK_AUTO) {
if (!nm_supplicant_config_add_option (config, "pairwise", pairwise_cipher, -1))
goto out;
if (!nm_supplicant_config_add_option (config, "group", group_cipher, -1))
goto out;
}
success = TRUE;
out:
return success;
}
static guint32
real_get_default_capabilities (NMAPSecurity *instance)
{
NMAPSecurityWPA_PSK * self = NM_AP_SECURITY_WPA_PSK (instance);
guint32 caps = NM_802_11_CAP_NONE;
int we_cipher = nm_ap_security_get_we_cipher (instance);
if (we_cipher == IW_AUTH_CIPHER_TKIP)
caps |= NM_802_11_CAP_CIPHER_TKIP;
else if (we_cipher == IW_AUTH_CIPHER_CCMP)
caps |= NM_802_11_CAP_CIPHER_CCMP;
else if (we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO)
caps |= (NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_CIPHER_CCMP);
if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA)
caps |= NM_802_11_CAP_PROTO_WPA;
else if (self->priv->wpa_version == IW_AUTH_WPA_VERSION_WPA2)
caps |= NM_802_11_CAP_PROTO_WPA2;
if (self->priv->key_mgt == IW_AUTH_KEY_MGMT_PSK)
caps |= NM_802_11_CAP_KEY_MGMT_PSK;
return caps;
}
static gboolean
real_get_authentication_required (NMAPSecurity *instance)
{
/* WPA Personal always requires authentication in the infrastructure mode. */
return TRUE;
}
static NMAPSecurity *
real_copy_constructor (NMAPSecurity *instance)
{
NMAPSecurityWPA_PSK * dst = g_object_new (NM_TYPE_AP_SECURITY_WPA_PSK, NULL);
NMAPSecurityWPA_PSK * self = NM_AP_SECURITY_WPA_PSK (instance);
dst->priv->wpa_version = self->priv->wpa_version;
dst->priv->key_mgt = self->priv->key_mgt;
nm_ap_security_copy_properties (NM_AP_SECURITY (self), NM_AP_SECURITY (dst));
return NM_AP_SECURITY (dst);
}
static void
nm_ap_security_wpa_psk_init (NMAPSecurityWPA_PSK * self)
{
self->priv = NM_AP_SECURITY_WPA_PSK_GET_PRIVATE (self);
self->priv->wpa_version = IW_AUTH_WPA_VERSION_WPA;
self->priv->key_mgt = IW_AUTH_KEY_MGMT_PSK;
}
static void
nm_ap_security_wpa_psk_class_init (NMAPSecurityWPA_PSKClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
NMAPSecurityClass *par_class = NM_AP_SECURITY_CLASS (klass);
par_class->copy_constructor_func = real_copy_constructor;
par_class->serialize_func = real_serialize;
par_class->write_supplicant_config_func = real_write_supplicant_config;
par_class->get_default_capabilities_func = real_get_default_capabilities;
par_class->get_authentication_required_func = real_get_authentication_required;
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_PSKPrivate));
}
GType
nm_ap_security_wpa_psk_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo info = {
sizeof (NMAPSecurityWPA_PSKClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) nm_ap_security_wpa_psk_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (NMAPSecurityWPA_PSK),
0, /* n_preallocs */
(GInstanceInitFunc) nm_ap_security_wpa_psk_init,
NULL /* value_table */
};
type = g_type_register_static (NM_TYPE_AP_SECURITY,
"NMAPSecurityWPA_PSK",
&info, 0);
}
return type;
}

View File

@@ -1,59 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#ifndef NM_AP_SECURITY_WPA_PSK_H
#define NM_AP_SECURITY_WPA_PSK_H
#include <glib-object.h>
#include <dbus/dbus.h>
#include "nm-ap-security.h"
#define NM_TYPE_AP_SECURITY_WPA_PSK (nm_ap_security_wpa_psk_get_type ())
#define NM_AP_SECURITY_WPA_PSK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP_SECURITY_WPA_PSK, NMAPSecurityWPA_PSK))
#define NM_AP_SECURITY_WPA_PSK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_AP_SECURITY_WPA_PSK, NMAPSecurityWPA_PSKClass))
#define NM_IS_AP_SECURITY_WPA_PSK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_AP_SECURITY_WPA_PSK))
#define NM_IS_AP_SECURITY_WPA_PSK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_AP_SECURITY_WPA_PSK))
#define NM_AP_SECURITY_WPA_PSK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP_SECURITY_WPA_PSK, NMAPSecurityWPA_PSKClass))
typedef struct _NMAPSecurityWPA_PSK NMAPSecurityWPA_PSK;
typedef struct _NMAPSecurityWPA_PSKClass NMAPSecurityWPA_PSKClass;
typedef struct _NMAPSecurityWPA_PSKPrivate NMAPSecurityWPA_PSKPrivate;
struct _NMAPSecurityWPA_PSK
{
NMAPSecurity parent;
/*< private >*/
NMAPSecurityWPA_PSKPrivate *priv;
};
struct _NMAPSecurityWPA_PSKClass
{
NMAPSecurityClass parent;
};
GType nm_ap_security_wpa_psk_get_type (void);
NMAPSecurityWPA_PSK * nm_ap_security_wpa_psk_new_deserialize (DBusMessageIter *iter, int we_cipher);
NMAPSecurityWPA_PSK * nm_ap_security_wpa_psk_new (guint32 capabilities, int we_cipher);
#endif /* NM_AP_SECURITY_WPA_PSK_H */

View File

@@ -1,412 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#include <glib.h>
#include <glib/gi18n.h>
#include <dbus/dbus.h>
#include <iwlib.h>
#include "nm-ap-security.h"
#include "nm-ap-security-private.h"
#include "nm-ap-security-wep.h"
#include "nm-ap-security-wpa-psk.h"
#include "nm-ap-security-wpa-eap.h"
#include "nm-ap-security-leap.h"
#include "nm-device-802-11-wireless.h"
#include "nm-supplicant-config.h"
#include "nm-utils.h"
#define NM_AP_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY, NMAPSecurityPrivate))
struct _NMAPSecurityPrivate
{
int we_cipher;
char * key;
char * description;
gboolean dispose_has_run;
};
#define WPA2_CCMP_PSK (NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_CIPHER_CCMP | NM_802_11_CAP_KEY_MGMT_PSK)
#define WPA2_TKIP_PSK (NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_KEY_MGMT_PSK)
#define WPA2_EAP (NM_802_11_CAP_PROTO_WPA2 | NM_802_11_CAP_KEY_MGMT_802_1X)
#define WPA_CCMP_PSK (NM_802_11_CAP_PROTO_WPA | NM_802_11_CAP_CIPHER_CCMP | NM_802_11_CAP_KEY_MGMT_PSK)
#define WPA_TKIP_PSK (NM_802_11_CAP_PROTO_WPA | NM_802_11_CAP_CIPHER_TKIP | NM_802_11_CAP_KEY_MGMT_PSK)
#define WPA_EAP (NM_802_11_CAP_PROTO_WPA | NM_802_11_CAP_KEY_MGMT_802_1X)
#define WEP_WEP104 (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP104)
#define WEP_WEP40 (NM_802_11_CAP_PROTO_WEP | NM_802_11_CAP_CIPHER_WEP40)
#define LEAP (NM_802_11_CAP_KEY_MGMT_802_1X)
NMAPSecurity *
nm_ap_security_new (guint32 capabilities, gboolean encrypted)
{
NMAPSecurity *security;
/* Deteremine best encryption algorithm to use */
if (((capabilities & WPA_CCMP_PSK) == WPA_CCMP_PSK) || ((capabilities & WPA2_CCMP_PSK) == WPA2_CCMP_PSK))
security = NM_AP_SECURITY (nm_ap_security_wpa_psk_new (capabilities, IW_AUTH_CIPHER_CCMP));
else if (((capabilities & WPA_TKIP_PSK) == WPA_TKIP_PSK) || ((capabilities & WPA2_TKIP_PSK) == WPA2_TKIP_PSK))
security = NM_AP_SECURITY (nm_ap_security_wpa_psk_new (capabilities, IW_AUTH_CIPHER_TKIP));
else if (((capabilities & WPA_EAP) == WPA_EAP) || ((capabilities & WPA2_EAP) == WPA2_EAP))
security = NM_AP_SECURITY (nm_ap_security_wpa_eap_new (capabilities));
else if ((capabilities & WEP_WEP104) == WEP_WEP104)
security = NM_AP_SECURITY (nm_ap_security_wep_new (IW_AUTH_CIPHER_WEP104));
else if ((capabilities & WEP_WEP40) == WEP_WEP40)
security = NM_AP_SECURITY (nm_ap_security_wep_new (IW_AUTH_CIPHER_WEP40));
else if ((capabilities & LEAP) == LEAP)
security = NM_AP_SECURITY (nm_ap_security_leap_new ());
else if (!encrypted) {
security = g_object_new (NM_TYPE_AP_SECURITY, NULL);
security->priv->we_cipher = IW_AUTH_CIPHER_NONE;
security->priv->key = NULL;
}
return security;
}
NMAPSecurity *
nm_ap_security_new_deserialize (DBusMessageIter *iter)
{
NMAPSecurity * security = NULL;
int we_cipher;
g_return_val_if_fail (iter != NULL, NULL);
/* We require the WE cipher (an INT32) first */
g_return_val_if_fail (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_INT32, NULL);
/* Get and validate WE cipher */
dbus_message_iter_get_basic (iter, &we_cipher);
if (we_cipher == IW_AUTH_CIPHER_NONE)
security = nm_ap_security_new (NM_DEVICE_CAP_NONE, FALSE);
else
{
/* Advance to start of cipher-dependent options */
if (!dbus_message_iter_next (iter))
goto out;
switch (we_cipher)
{
case IW_AUTH_CIPHER_WEP40:
case IW_AUTH_CIPHER_WEP104:
security = NM_AP_SECURITY (nm_ap_security_wep_new_deserialize (iter, we_cipher));
break;
case NM_AUTH_TYPE_WPA_PSK_AUTO:
case IW_AUTH_CIPHER_TKIP:
case IW_AUTH_CIPHER_CCMP:
security = NM_AP_SECURITY (nm_ap_security_wpa_psk_new_deserialize (iter, we_cipher));
break;
case NM_AUTH_TYPE_WPA_EAP:
security = NM_AP_SECURITY (nm_ap_security_wpa_eap_new_deserialize (iter));
break;
case NM_AUTH_TYPE_LEAP:
security = NM_AP_SECURITY (nm_ap_security_leap_new_deserialize (iter));
break;
default:
nm_warning ("Unmatched cipher %d", we_cipher);
break;
}
}
out:
return security;
}
guint32
nm_ap_security_get_default_capabilities (NMAPSecurity *self)
{
g_return_val_if_fail (self != NULL, NM_802_11_CAP_PROTO_NONE);
return NM_AP_SECURITY_GET_CLASS (self)->get_default_capabilities_func (self);
}
gboolean
nm_ap_security_get_authentication_required (NMAPSecurity *self)
{
g_return_val_if_fail (self != NULL, FALSE);
return NM_AP_SECURITY_GET_CLASS (self)->get_authentication_required_func (self);
}
gboolean
nm_ap_security_write_supplicant_config (NMAPSecurity *self,
NMSupplicantConfig * config,
gboolean adhoc)
{
NMAPSecurityClass * class = NM_AP_SECURITY_GET_CLASS (self);
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (config != NULL, FALSE);
if (self->priv->dispose_has_run)
return FALSE;
return class->write_supplicant_config_func (self, config, adhoc);
}
void
nm_ap_security_set_we_cipher (NMAPSecurity *self, int we_cipher)
{
g_return_if_fail (self != NULL);
/* Ensure that the cipher is valid */
g_return_if_fail (
(we_cipher == NM_AUTH_TYPE_WPA_PSK_AUTO)
|| (we_cipher == IW_AUTH_CIPHER_NONE)
|| (we_cipher == IW_AUTH_CIPHER_WEP40)
|| (we_cipher == IW_AUTH_CIPHER_WEP104)
|| (we_cipher == IW_AUTH_CIPHER_TKIP)
|| (we_cipher == IW_AUTH_CIPHER_CCMP)
|| (we_cipher == NM_AUTH_TYPE_WPA_EAP)
|| (we_cipher == NM_AUTH_TYPE_LEAP));
self->priv->we_cipher = we_cipher;
}
/*
* nm_ap_security_set_key - set the encryption key for a given AP
*
*/
void
nm_ap_security_set_key (NMAPSecurity *self, const char *key, int key_len)
{
g_return_if_fail (self != NULL);
g_return_if_fail (key != NULL);
g_return_if_fail (key_len > 0);
if (self->priv->key)
g_free (self->priv->key);
self->priv->key = g_malloc0 (key_len + 1);
memcpy (self->priv->key, key, key_len);
}
static NMAPSecurity *
real_copy_constructor (NMAPSecurity *self)
{
NMAPSecurity *dst;
dst = g_object_new (NM_TYPE_AP_SECURITY, NULL);
dst->priv->we_cipher = self->priv->we_cipher;
dst->priv->key = NULL;
nm_ap_security_copy_properties (self, dst);
return dst;
}
static int
real_serialize (NMAPSecurity *self, DBusMessageIter *iter)
{
/* Nothing to do */
return 0;
}
static gboolean
real_write_supplicant_config (NMAPSecurity *self,
NMSupplicantConfig * config,
gboolean adhoc)
{
/* Unencrypted network */
if (!nm_supplicant_config_add_option (config, "key_mgmt", "NONE", -1))
return FALSE;
return TRUE;
}
static guint32
real_get_default_capabilities (NMAPSecurity *self)
{
return NM_802_11_CAP_PROTO_NONE;
}
int
nm_ap_security_get_we_cipher (NMAPSecurity *self)
{
g_return_val_if_fail (self != NULL, NM_AUTH_TYPE_WPA_PSK_AUTO);
return self->priv->we_cipher;
}
const char *
nm_ap_security_get_key (NMAPSecurity *self)
{
g_return_val_if_fail (self != NULL, NULL);
return self->priv->key;
}
const char *
nm_ap_security_get_description (NMAPSecurity *self)
{
g_return_val_if_fail (self != NULL, NULL);
return self->priv->description;
}
void
nm_ap_security_set_description (NMAPSecurity *self, const char *desc)
{
g_return_if_fail (self != NULL);
g_return_if_fail (desc != NULL);
self->priv->description = (char *) desc;
}
int
nm_ap_security_serialize (NMAPSecurity *self, DBusMessageIter *iter)
{
dbus_int32_t dbus_we_cipher;
g_return_val_if_fail (self != NULL, -1);
g_return_val_if_fail (iter != NULL, -1);
if (self->priv->dispose_has_run)
return -1;
/* First arg: WE cipher (INT32) */
dbus_we_cipher = (dbus_int32_t) self->priv->we_cipher;
dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &dbus_we_cipher);
return NM_AP_SECURITY_GET_CLASS (self)->serialize_func (self, iter);
}
NMAPSecurity *
nm_ap_security_new_copy (NMAPSecurity *self)
{
g_return_val_if_fail (self != NULL, NULL);
return NM_AP_SECURITY_GET_CLASS (self)->copy_constructor_func (self);
}
void
nm_ap_security_copy_properties (NMAPSecurity *self, NMAPSecurity *dst)
{
g_return_if_fail (self != NULL);
g_return_if_fail (dst != NULL);
g_return_if_fail (self != dst);
nm_ap_security_set_we_cipher (dst, self->priv->we_cipher);
if (self->priv->key)
nm_ap_security_set_key (dst, self->priv->key, strlen (self->priv->key));
nm_ap_security_set_description (dst, self->priv->description);
}
static void
nm_ap_security_init (NMAPSecurity * self)
{
self->priv = NM_AP_SECURITY_GET_PRIVATE (self);
self->priv->dispose_has_run = FALSE;
self->priv->we_cipher = IW_AUTH_CIPHER_NONE;
self->priv->key = NULL;
self->priv->description = _("none");
}
static void
nm_ap_security_dispose (GObject *object)
{
NMAPSecurity * self = NM_AP_SECURITY (object);
NMAPSecurityClass * klass;
GObjectClass * parent_class;
if (self->priv->dispose_has_run)
/* If dispose did already run, return. */
return;
/* Make sure dispose does not run twice. */
self->priv->dispose_has_run = TRUE;
/*
* In dispose, you are supposed to free all types referenced from this
* object which might themselves hold a reference to self. Generally,
* the most simple solution is to unref all members on which you own a
* reference.
*/
/* Chain up to the parent class */
klass = NM_AP_SECURITY_CLASS (g_type_class_peek (NM_TYPE_AP_SECURITY));
parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
parent_class->dispose (object);
}
static void
nm_ap_security_finalize (GObject *object)
{
NMAPSecurity * self = NM_AP_SECURITY (object);
NMAPSecurityClass * klass;
GObjectClass * parent_class;
/* Complete object destruction */
g_free (self->priv->key);
/* Chain up to the parent class */
klass = NM_AP_SECURITY_CLASS (g_type_class_peek (NM_TYPE_AP_SECURITY));
parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
parent_class->finalize (object);
}
static void
nm_ap_security_class_init (NMAPSecurityClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = nm_ap_security_dispose;
object_class->finalize = nm_ap_security_finalize;
klass->copy_constructor_func = real_copy_constructor;
klass->serialize_func = real_serialize;
klass->write_supplicant_config_func = real_write_supplicant_config;
klass->get_default_capabilities_func = real_get_default_capabilities;
g_type_class_add_private (object_class, sizeof (NMAPSecurityPrivate));
}
GType
nm_ap_security_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo info = {
sizeof (NMAPSecurityClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) nm_ap_security_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (NMAPSecurity),
0, /* n_preallocs */
(GInstanceInitFunc) nm_ap_security_init,
NULL /* value_table */
};
type = g_type_register_static (G_TYPE_OBJECT,
"NMAPSecurity",
&info, 0);
}
return type;
}

View File

@@ -1,103 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#ifndef NM_AP_SECURITY_H
#define NM_AP_SECURITY_H
#include <glib-object.h>
#include <dbus/dbus.h>
#include "supplicant-manager/nm-supplicant-types.h"
/* Grr */
#ifndef NM_DEVICE_802_11_WIRELESS_DEFINED
#define NM_DEVICE_802_11_WIRELESS_DEFINED
typedef struct _NMDevice80211Wireless NMDevice80211Wireless;
#endif
G_BEGIN_DECLS
#define NM_TYPE_AP_SECURITY (nm_ap_security_get_type ())
#define NM_AP_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP_SECURITY, NMAPSecurity))
#define NM_AP_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_AP_SECURITY, NMAPSecurityClass))
#define NM_IS_AP_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_AP_SECURITY))
#define NM_IS_AP_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_AP_SECURITY))
#define NM_AP_SECURITY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP_SECURITY, NMAPSecurityClass))
typedef struct _NMAPSecurity NMAPSecurity;
typedef struct _NMAPSecurityClass NMAPSecurityClass;
typedef struct _NMAPSecurityPrivate NMAPSecurityPrivate;
struct _NMAPSecurity
{
GObject parent;
/*< private >*/
NMAPSecurityPrivate *priv;
};
struct _NMAPSecurityClass
{
GObjectClass parent;
/* class members */
NMAPSecurity * (*copy_constructor_func) (NMAPSecurity *self);
int (*serialize_func) (NMAPSecurity *self,
DBusMessageIter *iter);
gboolean (*write_supplicant_config_func) (NMAPSecurity *self,
NMSupplicantConfig * config,
gboolean adhoc);
guint32 (*get_default_capabilities_func) (NMAPSecurity *self);
gboolean (*get_authentication_required_func) (NMAPSecurity *self);
};
GType nm_ap_security_get_type (void);
NMAPSecurity * nm_ap_security_new_copy (NMAPSecurity *self);
NMAPSecurity * nm_ap_security_new (guint32 capabilities, gboolean encrypted);
NMAPSecurity * nm_ap_security_new_deserialize (DBusMessageIter *iter);
int nm_ap_security_get_we_cipher (NMAPSecurity *self);
const char * nm_ap_security_get_key (NMAPSecurity *self);
int nm_ap_security_serialize (NMAPSecurity *self,
DBusMessageIter *iter);
gboolean nm_ap_security_write_supplicant_config (NMAPSecurity *self,
NMSupplicantConfig * config,
gboolean adhoc);
const char * nm_ap_security_get_description (NMAPSecurity *self);
guint32 nm_ap_security_get_default_capabilities (NMAPSecurity *self);
gboolean nm_ap_security_get_authentication_required (NMAPSecurity *self);
G_END_DECLS
#endif /* NM_AP_SECURITY_H */

View File

@@ -1,764 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#include "NetworkManager.h"
#include "nm-device-interface.h"
#include "nm-device.h"
#include "nm-activation-request.h"
#include "NetworkManagerAPList.h"
#include "NetworkManagerPolicy.h"
#include "NetworkManagerUtils.h"
#include "nm-dbus-nmi.h"
#include "nm-utils.h"
#include "nm-dbus-manager.h"
#define NM_ACT_REQUEST_PENDING_CALL "nm-act-request-pending-call"
typedef struct {
NMDevice *device;
NMActRequest *req;
} UserKeyInfo;
static void
user_key_info_destroy (gpointer data)
{
UserKeyInfo *info = (UserKeyInfo *) data;
g_object_set_data (G_OBJECT (info->req), NM_ACT_REQUEST_PENDING_CALL, NULL);
g_object_unref (info->device);
g_object_unref (info->req);
g_slice_free (UserKeyInfo, info);
}
/*
* nm_dbus_get_user_key_for_network_cb
*
* Callback from nm_dbus_get_user_key_for_network when NetworkManagerInfo returns
* the new user key.
*
*/
static void
nm_dbus_get_user_key_for_network_cb (DBusPendingCall *pcall,
UserKeyInfo *info)
{
DBusMessage * reply = NULL;
NMData * data;
NMDevice * dev;
NMActRequest *req;
NMAccessPoint * ap;
NMAPSecurity * security;
DBusMessageIter iter;
const GByteArray * ssid;
g_return_if_fail (pcall != NULL);
g_return_if_fail (info != NULL);
dev = info->device;
req = info->req;
data = nm_device_get_app_data (dev);
g_assert (data);
ap = nm_device_802_11_wireless_get_activation_ap (NM_DEVICE_802_11_WIRELESS (dev));
g_assert (ap);
ssid = nm_ap_get_ssid (ap);
nm_dbus_send_with_callback_replied (pcall, __func__);
if (!(reply = dbus_pending_call_steal_reply (pcall)))
goto out;
if (message_is_error (reply)) {
DBusError err;
dbus_error_init (&err);
dbus_set_error_from_message (&err, reply);
/* Check for cancelled error */
if (strcmp (err.name, NMI_DBUS_USER_KEY_CANCELED_ERROR) == 0) {
nm_info ("Activation (%s) New wireless user key request for network"
" '%s' was canceled.",
nm_device_get_iface (dev),
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)");
} else {
nm_warning ("dbus returned an error.\n (%s) %s\n",
err.name,
err.message);
}
dbus_error_free (&err);
/* FIXME: since we're not marking the device as invalid, its a fair bet
* that NM will just try to reactivate the device again, and may fail
* to get the user key in exactly the same way, which ends up right back
* here... ad nauseum. Figure out how to deal with a failure here.
*/
nm_ap_list_append_ap (data->invalid_ap_list, ap);
nm_device_interface_deactivate (NM_DEVICE_INTERFACE (dev));
goto out;
}
nm_info ("Activation (%s) New wireless user key for network '%s' received.",
nm_device_get_iface (dev),
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)");
dbus_message_iter_init (reply, &iter);
if ((security = nm_ap_security_new_deserialize (&iter))) {
nm_ap_set_security (ap, security);
nm_device_activate_schedule_stage2_device_config (dev);
}
out:
if (reply)
dbus_message_unref (reply);
dbus_pending_call_unref (pcall);
}
/*
* nm_dbus_get_user_key_for_network
*
* Asks the info-daemon for a user-entered WEP key.
*
*/
void
nm_dbus_get_user_key_for_network (NMDevice *dev,
NMActRequest *req,
const gboolean new_key)
{
NMDBusManager * dbus_mgr = NULL;
DBusConnection *dbus_connection;
DBusMessage * message;
DBusPendingCall * pcall;
UserKeyInfo *info;
NMAccessPoint * ap;
gint32 attempt = 1;
const char * dev_path;
const char * net_path;
const GByteArray * ssid;
g_return_if_fail (NM_IS_DEVICE (dev));
g_return_if_fail (req != NULL);
dbus_mgr = nm_dbus_manager_get ();
dbus_connection = nm_dbus_manager_get_dbus_connection (dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get the dbus connection.");
goto out;
}
ap = nm_device_802_11_wireless_get_activation_ap (NM_DEVICE_802_11_WIRELESS (dev));
g_assert (ap);
ssid = nm_ap_get_ssid (ap);
nm_info ("Activation (%s) New wireless user key requested for network '%s'.",
nm_device_get_iface (dev),
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)");
message = dbus_message_new_method_call (NMI_DBUS_SERVICE,
NMI_DBUS_PATH,
NMI_DBUS_INTERFACE,
"getKeyForNetwork");
if (!message) {
nm_warning ("couldn't allocate the dbus message");
goto out;
}
dev_path = nm_device_get_dbus_path (dev);
net_path = nm_ap_get_dbus_path (ap);
if (dev_path && strlen (dev_path) && net_path && strlen (net_path)) {
char buf[IW_ESSID_MAX_SIZE + 1];
char * ptr = &buf[0];
memset (buf, 0, sizeof (buf));
memcpy (buf, ssid->data, MIN (ssid->len, sizeof (buf) - 1));
dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path,
DBUS_TYPE_OBJECT_PATH, &net_path,
DBUS_TYPE_STRING, &ptr,
DBUS_TYPE_INT32, &attempt,
DBUS_TYPE_BOOLEAN, &new_key,
DBUS_TYPE_INVALID);
info = g_slice_new (UserKeyInfo);
info->device = g_object_ref (dev);
info->req = g_object_ref (req);
pcall = nm_dbus_send_with_callback (dbus_connection,
message,
(DBusPendingCallNotifyFunction) nm_dbus_get_user_key_for_network_cb,
info,
user_key_info_destroy,
__func__);
if (pcall)
g_object_set_data (G_OBJECT (req), NM_ACT_REQUEST_PENDING_CALL, pcall);
} else {
nm_warning ("bad object path data");
}
/* FIXME: figure out how to deal with a failure here, otherwise
* we just hang in the activation process and nothing happens
* until the user cancels stuff.
*/
dbus_message_unref (message);
out:
g_object_unref (dbus_mgr);
}
/*
* nm_dbus_cancel_get_user_key_for_network
*
* Sends a user-key cancellation message to NetworkManagerInfo
*
*/
void
nm_dbus_cancel_get_user_key_for_network (NMActRequest *req)
{
DBusMessage * message;
DBusPendingCall * pcall;
NMDBusManager * dbus_mgr;
DBusConnection * dbus_connection;
g_return_if_fail (req != NULL);
dbus_mgr = nm_dbus_manager_get ();
dbus_connection = nm_dbus_manager_get_dbus_connection (dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get the dbus connection.");
goto out;
}
pcall = (DBusPendingCall *) g_object_get_data (G_OBJECT (req), NM_ACT_REQUEST_PENDING_CALL);
if (pcall)
dbus_pending_call_cancel (pcall);
message = dbus_message_new_method_call (NMI_DBUS_SERVICE,
NMI_DBUS_PATH,
NMI_DBUS_INTERFACE,
"cancelGetKeyForNetwork");
if (!message) {
nm_warning ("couldn't allocate the dbus message");
goto out;
}
dbus_connection_send (dbus_connection, message, NULL);
dbus_message_unref (message);
out:
g_object_unref (dbus_mgr);
}
/*
* nm_dbus_update_network_info
*
* Tell NetworkManagerInfo the updated info of the AP
*
*/
void
nm_dbus_update_network_info (NMAccessPoint *ap,
const gboolean automatic)
{
NMDBusManager * dbus_mgr = NULL;
DBusConnection * dbus_connection;
DBusMessage * message;
gboolean fallback;
const GByteArray * ssid;
gchar * char_bssid;
NMAPSecurity * security;
const struct ether_addr *addr;
DBusMessageIter iter;
char buf[IW_ESSID_MAX_SIZE + 1];
char * ptr = &buf[0];
g_return_if_fail (ap != NULL);
dbus_mgr = nm_dbus_manager_get ();
dbus_connection = nm_dbus_manager_get_dbus_connection (dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get the dbus connection.");
goto out;
}
message = dbus_message_new_method_call (NMI_DBUS_SERVICE,
NMI_DBUS_PATH,
NMI_DBUS_INTERFACE,
"updateNetworkInfo");
if (!message) {
nm_warning ("couldn't allocate the dbus message");
goto out;
}
dbus_message_iter_init_append (message, &iter);
/* First argument: ESSID (STRING) */
ssid = nm_ap_get_ssid (ap);
memset (buf, 0, sizeof (buf));
memcpy (buf, ssid->data, MIN (ssid->len, IW_ESSID_MAX_SIZE));
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &ptr);
/* Second argument: Automatic or user-driven connection? (BOOLEAN) */
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &automatic);
/* Third argument: Fallback? (BOOLEAN) */
fallback = nm_ap_get_fallback (ap);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &fallback);
/* Fourth argument: Access point's BSSID */
addr = nm_ap_get_address (ap);
if ((nm_ap_get_mode (ap) == IW_MODE_INFRA) && nm_ethernet_address_is_valid (addr))
{
char_bssid = g_new0 (gchar, 20);
iw_ether_ntop (addr, char_bssid);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &char_bssid);
g_free (char_bssid);
}
else
{
/* Use an invalid BSSID for non-infrastructure networks, since
* the BSSID is usually randomly constructed by the driver and
* changed every time you activate the network.
*/
char_bssid = " ";
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &char_bssid);
}
/* Serialize the AP's security info into the message */
security = nm_ap_get_security (ap);
g_assert (security);
if (nm_ap_security_serialize (security, &iter) == 0)
dbus_connection_send (dbus_connection, message, NULL);
dbus_message_unref (message);
out:
g_object_unref (dbus_mgr);
return;
}
typedef struct GetOneNetworkCBData
{
NMData * data;
char * network;
NMAccessPointList * list;
} GetOneNetworkCBData;
static void free_get_one_network_cb_data (GetOneNetworkCBData *data)
{
if (data)
{
nm_ap_list_unref (data->list);
g_free (data->network);
data->list = NULL;
data->network = NULL;
data->data = NULL;
g_slice_free (GetOneNetworkCBData, data);
}
}
typedef struct GetNetworksCBData
{
NMData * data;
NMAccessPointList * list;
} GetNetworksCBData;
static void free_get_networks_cb_data (GetNetworksCBData *data)
{
if (data)
{
nm_ap_list_unref (data->list);
data->data = NULL;
data->list = NULL;
g_slice_free (GetNetworksCBData, data);
}
}
/*
* nm_dbus_get_network_data_cb
*
* Add a new NMAccessPoint to the allowed list with the correct properties
*
*/
static void nm_dbus_get_network_data_cb (DBusPendingCall *pcall, void *user_data)
{
GetOneNetworkCBData * cb_data = (GetOneNetworkCBData *)user_data;
DBusMessage * reply = NULL;
DBusMessageIter iter;
DBusMessageIter subiter;
const char * tmp_ssid = NULL;
guint32 tmp_ssid_len;
gint timestamp_secs = -1;
gboolean fallback = FALSE;
GSList * addr_list = NULL;
NMAPSecurity * security;
NMAccessPoint * ap;
NMAccessPoint * list_ap;
GByteArray * ssid;
g_return_if_fail (pcall != NULL);
g_return_if_fail (cb_data != NULL);
g_return_if_fail (cb_data->data != NULL);
g_return_if_fail (cb_data->network != NULL);
g_return_if_fail (cb_data->list != NULL);
nm_dbus_send_with_callback_replied (pcall, __func__);
dbus_pending_call_ref (pcall);
if (!(reply = dbus_pending_call_steal_reply (pcall)))
goto out;
if (dbus_message_is_error (reply, "BadNetworkData")) {
guint32 rmv_len = strlen (cb_data->network);
GByteArray * rmv_ssid;
rmv_ssid = g_byte_array_sized_new (rmv_len);
g_byte_array_append (rmv_ssid, cb_data->network, rmv_len);
nm_ap_list_remove_ap_by_ssid (cb_data->list, rmv_ssid);
g_byte_array_free (rmv_ssid, TRUE);
goto out;
}
if (message_is_error (reply)) {
DBusError err;
dbus_error_init (&err);
dbus_set_error_from_message (&err, reply);
nm_warning ("dbus returned an error.\n (%s) %s\n", err.name, err.message);
dbus_error_free (&err);
goto out;
}
dbus_message_iter_init (reply, &iter);
/* First arg: ESSID (STRING) */
if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING)
{
nm_warning ("a message argument (SSID) was invalid.");
goto out;
}
dbus_message_iter_get_basic (&iter, &tmp_ssid);
/* Second arg: Timestamp (INT32) */
if (!dbus_message_iter_next (&iter)
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_INT32))
{
nm_warning ("a message argument (timestamp) was invalid.");
goto out;
}
dbus_message_iter_get_basic (&iter, &timestamp_secs);
/* Third arg: Fallback? (BOOLEAN) */
if (!dbus_message_iter_next (&iter)
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN))
{
nm_warning ("a message argument (fallback) was invalid.");
goto out;
}
dbus_message_iter_get_basic (&iter, &fallback);
/* Fourth arg: BSSID addresses (ARRAY, STRING) */
if (!dbus_message_iter_next (&iter)
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_ARRAY)
|| (dbus_message_iter_get_element_type (&iter) != DBUS_TYPE_STRING))
{
nm_warning ("a message argument (addresses) was invalid.");
goto out;
}
dbus_message_iter_recurse (&iter, &subiter);
while (dbus_message_iter_get_arg_type (&subiter) == DBUS_TYPE_STRING)
{
char *address;
dbus_message_iter_get_basic (&subiter, &address);
if (address && strlen (address) >= 11)
addr_list = g_slist_append (addr_list, address);
dbus_message_iter_next (&subiter);
}
/* Unserialize access point security info */
if (!dbus_message_iter_has_next (&iter))
{
nm_warning ("a message argument (security info) was invalid.");
goto out;
}
dbus_message_iter_next (&iter);
if (!(security = nm_ap_security_new_deserialize (&iter)))
{
nm_warning ("message arguments were invalid (could not deserialize "
"wireless network security information.");
goto out;
}
/* Construct the new access point */
ap = nm_ap_new ();
tmp_ssid_len = MIN (strlen (tmp_ssid), IW_ESSID_MAX_SIZE);
ssid = g_byte_array_sized_new (tmp_ssid_len);
g_byte_array_append (ssid, tmp_ssid, tmp_ssid_len);
nm_ap_set_ssid (ap, ssid);
nm_ap_set_security (ap, security);
nm_ap_add_capabilities_from_security (ap, security);
g_object_unref (G_OBJECT (security)); /* set_security copies the object */
nm_ap_set_timestamp (ap, timestamp_secs, 0);
nm_ap_set_fallback (ap, fallback);
nm_ap_set_user_addresses (ap, addr_list);
if ((list_ap = nm_ap_list_get_ap_by_ssid (cb_data->list, ssid)))
{
nm_ap_set_ssid (list_ap, nm_ap_get_ssid (ap));
nm_ap_set_timestamp_via_timestamp (list_ap, nm_ap_get_timestamp (ap));
nm_ap_set_fallback (list_ap, nm_ap_get_fallback (ap));
nm_ap_set_security (list_ap, nm_ap_get_security (ap));
nm_ap_set_user_addresses (list_ap, nm_ap_get_user_addresses (ap));
}
else
{
/* New AP, just add it to the list */
nm_ap_list_append_ap (cb_data->list, ap);
}
g_byte_array_free (ssid, TRUE);
g_object_unref (ap);
/* Ensure all devices get new information copied into their device lists */
nm_policy_schedule_device_ap_lists_update_from_allowed (cb_data->data);
out:
if (addr_list)
g_slist_free (addr_list);
if (reply)
dbus_message_unref (reply);
dbus_pending_call_unref (pcall);
}
/*
* nm_dbus_get_networks_cb
*
* Async callback from nm_dbus_get_networks
*
*/
static void
nm_dbus_get_networks_cb (DBusPendingCall *pcall,
void *user_data)
{
DBusMessage * reply;
DBusMessageIter iter, array_iter;
GetNetworksCBData * cb_data = (GetNetworksCBData *)user_data;
NMDBusManager * dbus_mgr = NULL;
DBusConnection *dbus_connection;
g_return_if_fail (pcall);
g_return_if_fail (cb_data != NULL);
g_return_if_fail (cb_data->list != NULL);
g_return_if_fail (cb_data->data != NULL);
nm_dbus_send_with_callback_replied (pcall, __func__);
dbus_pending_call_ref (pcall);
if (!(reply = dbus_pending_call_steal_reply (pcall)))
goto out;
if (message_is_error (reply)) {
DBusError err;
dbus_error_init (&err);
dbus_set_error_from_message (&err, reply);
nm_warning ("error received: %s - %s.", err.name, err.message);
goto out;
}
dbus_mgr = nm_dbus_manager_get ();
dbus_connection = nm_dbus_manager_get_dbus_connection (dbus_mgr);
if (!dbus_connection) {
nm_warning ("couldn't get dbus connection.");
goto out;
}
dbus_message_iter_init (reply, &iter);
dbus_message_iter_recurse (&iter, &array_iter);
while (dbus_message_iter_get_arg_type (&array_iter) == DBUS_TYPE_STRING) {
const char * value;
DBusMessage * message;
dbus_message_iter_get_basic (&array_iter, &value);
/* Get properties on each network */
message = dbus_message_new_method_call (NMI_DBUS_SERVICE,
NMI_DBUS_PATH,
NMI_DBUS_INTERFACE,
"getNetworkProperties");
if (message) {
dbus_int32_t type_as_int32 = nm_ap_list_get_type (cb_data->list);
GetOneNetworkCBData * net_cb_data = g_slice_new0 (GetOneNetworkCBData);
net_cb_data->data = cb_data->data;
net_cb_data->network = g_strdup (value);
nm_ap_list_ref (cb_data->list);
net_cb_data->list = cb_data->list;
dbus_message_append_args (message,
DBUS_TYPE_STRING, &value,
DBUS_TYPE_INT32, &type_as_int32,
DBUS_TYPE_INVALID);
nm_dbus_send_with_callback (dbus_connection,
message,
(DBusPendingCallNotifyFunction) nm_dbus_get_network_data_cb,
net_cb_data,
(DBusFreeFunction) free_get_one_network_cb_data,
__func__);
dbus_message_unref (message);
}
dbus_message_iter_next(&array_iter);
}
dbus_message_unref (reply);
out:
if (dbus_mgr)
g_object_unref (dbus_mgr);
dbus_pending_call_unref (pcall);
}
/*
* nm_dbus_update_allowed_networks
*
* Update all allowed networks from NetworkManagerInfo
*
*/
void
nm_dbus_update_allowed_networks (NMAccessPointList *list,
NMData *data)
{
NMDBusManager * dbus_mgr = NULL;
DBusConnection * dbus_connection;
DBusMessage * message;
dbus_int32_t type_as_int32 = nm_ap_list_get_type (list);
GetNetworksCBData * cb_data;
g_return_if_fail (list != NULL);
g_return_if_fail (data != NULL);
dbus_mgr = nm_dbus_manager_get ();
dbus_connection = nm_dbus_manager_get_dbus_connection (dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get the dbus connection.");
goto out;
}
message = dbus_message_new_method_call (NMI_DBUS_SERVICE,
NMI_DBUS_PATH,
NMI_DBUS_INTERFACE,
"getNetworks");
if (!message) {
nm_warning ("could not allocate the dbus message.");
goto out;
}
dbus_message_append_args (message,
DBUS_TYPE_INT32, &type_as_int32,
DBUS_TYPE_INVALID);
cb_data = g_slice_new0 (GetNetworksCBData);
cb_data->data = data;
nm_ap_list_ref (list);
cb_data->list = list;
nm_dbus_send_with_callback (dbus_connection,
message,
(DBusPendingCallNotifyFunction) nm_dbus_get_networks_cb,
cb_data,
(DBusFreeFunction) free_get_networks_cb_data,
__func__);
dbus_message_unref (message);
out:
g_object_unref (dbus_mgr);
}
/*
* nm_dbus_update_one_allowed_network
*
* Update all networks of a specific type from NetworkManagerInfo
*
*/
void
nm_dbus_update_one_allowed_network (const char *network,
NMData *data)
{
NMDBusManager * dbus_mgr = NULL;
DBusConnection * dbus_connection;
DBusMessage * message;
dbus_int32_t type_as_int32 = NETWORK_TYPE_ALLOWED;
GetOneNetworkCBData * cb_data = NULL;
g_return_if_fail (data != NULL);
dbus_mgr = nm_dbus_manager_get ();
dbus_connection = nm_dbus_manager_get_dbus_connection (dbus_mgr);
if (!dbus_connection) {
nm_warning ("could not get the dbus connection.");
goto out;
}
message = dbus_message_new_method_call (NMI_DBUS_SERVICE,
NMI_DBUS_PATH,
NMI_DBUS_INTERFACE,
"getNetworkProperties");
if (!message) {
nm_warning ("couldn't allocate the dbus message.");
goto out;
}
cb_data = g_slice_new0 (GetOneNetworkCBData);
cb_data->data = data;
cb_data->network = g_strdup (network);
cb_data->list = data->allowed_ap_list;
dbus_message_append_args (message,
DBUS_TYPE_STRING, &network,
DBUS_TYPE_INT32, &type_as_int32,
DBUS_TYPE_INVALID);
nm_dbus_send_with_callback (dbus_connection,
message,
(DBusPendingCallNotifyFunction) nm_dbus_get_network_data_cb,
cb_data,
(DBusFreeFunction) free_get_one_network_cb_data,
__func__);
dbus_message_unref (message);
out:
g_object_unref (dbus_mgr);
}

View File

@@ -1,41 +0,0 @@
/* NetworkManager -- Network link manager
*
* Dan Williams <dcbw@redhat.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2005 Red Hat, Inc.
*/
#ifndef NM_DBUS_NMI_H
#define NM_DBUS_NMI_H
#include "NetworkManager.h"
#include "NetworkManagerAP.h"
void nm_dbus_get_user_key_for_network (NMDevice *dev,
NMActRequest *req,
const gboolean new_key);
void nm_dbus_cancel_get_user_key_for_network (NMActRequest *req);
void nm_dbus_update_network_info (NMAccessPoint *ap, const gboolean user_requested);
void nm_dbus_update_one_allowed_network (const char *network, NMData *data);
void nm_dbus_update_allowed_networks (NMAccessPointList *list, NMData *data);
#endif /* NM_DBUS_NMI_H */

View File

@@ -41,7 +41,6 @@
#include "NetworkManagerUtils.h"
#include "NetworkManagerPolicy.h"
#include "nm-activation-request.h"
#include "nm-dbus-nmi.h"
#include "nm-supplicant-manager.h"
#include "nm-supplicant-interface.h"
#include "nm-supplicant-config.h"
@@ -244,7 +243,7 @@ nm_device_802_11_wireless_update_bssid (NMDevice80211Wireless *self,
nm_ap_set_address (ap, &new_bssid);
automatic = !nm_act_request_get_user_requested (nm_device_get_act_request (NM_DEVICE (self)));
nm_dbus_update_network_info (ap, automatic);
// FIXME: push new BSSID to the info-daemon
}
}
@@ -333,43 +332,54 @@ out:
return caps;
}
#define WPA_CAPS (NM_802_11_DEVICE_CAP_CIPHER_TKIP | \
NM_802_11_DEVICE_CAP_CIPHER_CCMP | \
NM_802_11_DEVICE_CAP_WPA | \
NM_802_11_DEVICE_CAP_RSN)
static guint32
get_wireless_capabilities (NMDevice80211Wireless *self,
iwrange * range,
guint32 data_len)
{
guint32 minlen;
guint32 caps = NM_802_11_CAP_NONE;
guint32 caps = NM_802_11_DEVICE_CAP_NONE;
g_return_val_if_fail (self != NULL, NM_802_11_CAP_NONE);
g_return_val_if_fail (range != NULL, NM_802_11_CAP_NONE);
g_return_val_if_fail (self != NULL, NM_802_11_DEVICE_CAP_NONE);
g_return_val_if_fail (range != NULL, NM_802_11_DEVICE_CAP_NONE);
minlen = ((char *) &range->enc_capa) - (char *) range + sizeof (range->enc_capa);
/* All drivers should support WEP by default */
caps |= (NM_802_11_CAP_CIPHER_WEP40 | NM_802_11_CAP_CIPHER_WEP104);
/* All drivers should support no encryption by default */
caps |= (NM_802_11_CAP_PROTO_NONE | NM_802_11_CAP_PROTO_WEP);
if ((data_len >= minlen) && range->we_version_compiled >= 18)
{
if (range->enc_capa & IW_ENC_CAPA_WPA)
{
caps |= (NM_802_11_CAP_PROTO_WPA
| NM_802_11_CAP_KEY_MGMT_PSK
| NM_802_11_CAP_KEY_MGMT_802_1X);
}
if (range->enc_capa & IW_ENC_CAPA_WPA2)
{
caps |= (NM_802_11_CAP_PROTO_WPA2
| NM_802_11_CAP_KEY_MGMT_PSK
| NM_802_11_CAP_KEY_MGMT_802_1X);
}
caps |= NM_802_11_DEVICE_CAP_CIPHER_WEP40 | NM_802_11_DEVICE_CAP_CIPHER_WEP104;
if ((data_len >= minlen) && range->we_version_compiled >= 18) {
if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)
caps |= NM_802_11_CAP_CIPHER_TKIP;
caps |= NM_802_11_DEVICE_CAP_CIPHER_TKIP;
if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)
caps |= NM_802_11_CAP_CIPHER_CCMP;
caps |= NM_802_11_DEVICE_CAP_CIPHER_CCMP;
if (range->enc_capa & IW_ENC_CAPA_WPA)
caps |= NM_802_11_DEVICE_CAP_WPA;
if (range->enc_capa & IW_ENC_CAPA_WPA2)
caps |= NM_802_11_DEVICE_CAP_RSN;
/* Check for cipher support but not WPA support */
if ( (caps & (NM_802_11_DEVICE_CAP_CIPHER_TKIP | NM_802_11_DEVICE_CAP_CIPHER_CCMP))
&& !(caps & (NM_802_11_DEVICE_CAP_WPA | NM_802_11_DEVICE_CAP_RSN))) {
nm_warning ("%s: device supports WPA ciphers but not WPA protocol; "
"WPA unavailable.");
caps &= ~WPA_CAPS;
}
/* Check for WPA support but not cipher support */
if ( (caps & (NM_802_11_DEVICE_CAP_WPA | NM_802_11_DEVICE_CAP_RSN))
&& !(caps & (NM_802_11_DEVICE_CAP_CIPHER_TKIP | NM_802_11_DEVICE_CAP_CIPHER_CCMP)))
nm_warning ("%s: device supports WPA protocol but not WPA ciphers; "
"WPA unavailable.");
caps &= ~WPA_CAPS;
}
return caps;
@@ -923,7 +933,6 @@ nm_device_802_11_wireless_get_best_ap (NMDevice80211Wireless *self)
if (!blacklisted && (curtime->tv_sec > best_timestamp.tv_sec)) {
best_timestamp = *nm_ap_get_timestamp (tmp_ap);
best_ap = scan_ap;
nm_ap_set_security (best_ap, nm_ap_get_security (tmp_ap));
}
}
}
@@ -937,6 +946,7 @@ nm_device_802_11_wireless_get_best_ap (NMDevice80211Wireless *self)
return best_ap;
}
#if 0
static gboolean
nm_device_802_11_wireless_set_activation_ap (NMDevice80211Wireless *self,
GByteArray *ssid,
@@ -1009,7 +1019,7 @@ nm_device_802_11_wireless_set_activation_ap (NMDevice80211Wireless *self,
return TRUE;
}
#endif
/*
* nm_device_802_11_wireless_ap_list_clear
@@ -1757,66 +1767,50 @@ out:
static gboolean
ap_need_key (NMDevice80211Wireless *self,
NMAccessPoint *ap,
gboolean *ask_user)
ap_need_secrets (NMDevice80211Wireless *self,
NMAccessPoint *ap,
NMConnection *connection,
gboolean *ask_user)
{
const GByteArray * ssid;
gboolean need_key = FALSE;
NMAPSecurity * security;
const char * iface;
int we_cipher;
const char * esc_ssid = NULL;
const GByteArray * ssid;
gboolean need_key = FALSE;
const char * iface;
const char * esc_ssid;
guint32 flags, wpa_flags, rsn_flags;
g_return_val_if_fail (self != NULL, FALSE);
g_return_val_if_fail (ap != NULL, FALSE);
g_return_val_if_fail (connection != NULL, FALSE);
g_return_val_if_fail (ask_user != NULL, FALSE);
ssid = nm_ap_get_ssid (ap);
if (ssid)
esc_ssid = nm_utils_escape_ssid (ssid->data, ssid->len);
security = nm_ap_get_security (ap);
g_assert (security);
we_cipher = nm_ap_security_get_we_cipher (security);
iface = nm_device_get_iface (NM_DEVICE (self));
if (!nm_ap_get_encrypted (ap))
{
nm_info ("Activation (%s/wireless): access point '%s' is unencrypted, no key needed.",
iface, esc_ssid ? esc_ssid : "(null)");
ssid = nm_ap_get_ssid (ap);
esc_ssid = ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(null)";
/* If the user-specified security info doesn't overlap the
* scanned access point's info, create new info from the scanned
* characteristics of the access point. Can happen if the AP's
* settings were changed.
*/
if (we_cipher != IW_AUTH_CIPHER_NONE)
nm_ap_set_security (ap, nm_ap_security_new (nm_ap_get_capabilities (ap),
nm_ap_get_encrypted (ap)));
}
else
{
if ( !nm_ap_security_get_key (security)
|| (we_cipher == IW_AUTH_CIPHER_NONE))
{
nm_info ("Activation (%s/wireless): access point '%s' "
"is encrypted, but NO valid key exists. New key needed.",
iface, esc_ssid ? esc_ssid : "(null)");
flags = nm_ap_get_flags (ap);
wpa_flags = nm_ap_get_wpa_flags (ap);
rsn_flags = nm_ap_get_rsn_flags (ap);
if ( !(flags & NM_802_11_AP_FLAGS_PRIVACY)
&& (wpa_flags == NM_802_11_AP_SEC_NONE)
&& (rsn_flags == NM_802_11_AP_SEC_NONE)) {
nm_info ("Activation (%s/wireless): access point '%s' has no security, "
"no key needed.",
iface, esc_ssid);
} else {
if (nm_connection_have_secrets (connection)) {
nm_info ("Activation (%s/wireless): access point '%s' has security"
", and secrets exist. No new secrets needed.",
iface, esc_ssid ? esc_ssid : "(null)");
} else {
nm_info ("Activation (%s/wireless): access point '%s' has security,"
" but secrets are required.",
iface, esc_ssid);
need_key = TRUE;
/* If the user-specified security info doesn't overlap the
* scanned access point's info, ask the user for a completely
* new key.
/* FIXME: how to determine when to explicitly ask the user for
* secrets...
*/
if (we_cipher == IW_AUTH_CIPHER_NONE)
*ask_user = TRUE;
}
else
{
nm_info ("Activation (%s/wireless): access point '%s' "
"is encrypted, and a key exists. No new key needed.",
iface, esc_ssid ? esc_ssid : "(null)");
}
}
@@ -1825,7 +1819,7 @@ ap_need_key (NMDevice80211Wireless *self,
/*
* ap_is_auth_required
* ap_auth_enforced
*
* Checks whether or not there is an encryption key present for
* this connection, and whether or not the authentication method
@@ -1835,48 +1829,31 @@ ap_need_key (NMDevice80211Wireless *self,
* Similarly, Open System WEP access points don't reject a station
* when the key is wrong. Shared Key WEP access points will.
*
* Theory of operation here is that if:
* (a) the NMAPSecurity object specifies that authentication is
* required, and the AP rejects our authentication attempt during
* connection (which shows up as a wpa_supplicant disconnection
* event); or
* (b) the NMAPSecurity object specifies that no authentiation is
* required, and either DHCP times out or wpa_supplicant times out;
*
* then we need a new key from the user because our currenty key
* and/or authentication method is likely wrong.
*
*/
static gboolean
ap_is_auth_required (NMAccessPoint *ap, gboolean *has_key)
ap_auth_enforced (NMAccessPoint *ap)
{
NMAPSecurity *security;
int we_cipher;
gboolean auth_required = FALSE;
guint32 flags, wpa_flags, rsn_flags;
g_return_val_if_fail (ap != NULL, FALSE);
g_return_val_if_fail (has_key != NULL, FALSE);
*has_key = FALSE;
/* Ad Hoc mode doesn't have any master station to validate
* security credentials, so no auth can possibly be required.
*/
if (nm_ap_get_mode(ap) == IW_MODE_ADHOC)
if (nm_ap_get_mode (ap) == IW_MODE_ADHOC)
return FALSE;
/* No encryption obviously means no possiblity of auth
* rejection due to a wrong encryption key.
*/
security = nm_ap_get_security (ap);
we_cipher = nm_ap_security_get_we_cipher (security);
if (we_cipher == IW_AUTH_CIPHER_NONE)
return FALSE;
flags = nm_ap_get_flags (ap);
wpa_flags = nm_ap_get_wpa_flags (ap);
rsn_flags = nm_ap_get_rsn_flags (ap);
auth_required = nm_ap_security_get_authentication_required (security);
*has_key = TRUE;
if (flags & NM_802_11_AP_FLAGS_PRIVACY)
return TRUE;
return auth_required;
if (wpa_flags != NM_802_11_AP_SEC_NONE)
return TRUE;
if (rsn_flags != NM_802_11_AP_SEC_NONE)
return TRUE;
return FALSE;
}
@@ -1952,11 +1929,12 @@ merge_scanned_ap (NMDevice80211Wireless *dev,
nm_ap_list_iter_free (iter);
if (found_ap) {
nm_ap_set_capabilities (found_ap, nm_ap_get_capabilities (merge_ap));
nm_ap_set_flags (found_ap, nm_ap_get_flags (merge_ap));
nm_ap_set_wpa_flags (found_ap, nm_ap_get_wpa_flags (merge_ap));
nm_ap_set_rsn_flags (found_ap, nm_ap_get_rsn_flags (merge_ap));
nm_ap_set_strength (found_ap, nm_ap_get_strength (merge_ap));
nm_ap_set_last_seen (found_ap, nm_ap_get_last_seen (merge_ap));
nm_ap_set_broadcast (found_ap, nm_ap_get_broadcast (merge_ap));
nm_ap_set_capabilities (found_ap, nm_ap_get_capabilities (merge_ap));
/* If the AP is noticed in a scan, it's automatically no longer
* artificial, since it clearly exists somewhere.
@@ -2178,13 +2156,13 @@ link_timeout_cb (gpointer user_data)
* another one.
*/
if ((nm_device_get_state (dev) == NM_DEVICE_STATE_CONFIG)
&& (ap_is_auth_required (ap, &has_key) && has_key)) {
&& ap_auth_enforced (ap)) {
/* Association/authentication failed, we must have bad encryption key */
nm_info ("Activation (%s/wireless): disconnected during association,"
" asking for new key.", nm_device_get_iface (dev));
cleanup_association_attempt (self, TRUE);
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
nm_dbus_get_user_key_for_network (dev, req, TRUE);
// FIXME: get secrets from the info-daemon
} else {
nm_info ("%s: link timed out.", nm_device_get_iface (dev));
nm_device_set_active_link (dev, FALSE);
@@ -2546,27 +2524,28 @@ supplicant_connection_timeout_cb (gpointer user_data)
cleanup_association_attempt (self, TRUE);
/* Timed out waiting for authentication success; if the security method
* in use does not require access point side authentication (Open System
/* Timed out waiting for authentication success; if the security in use
* does not require access point side authentication (Open System
* WEP, for example) then we are likely using the wrong authentication
* algorithm or key. Request new one from the user.
*/
if (!ap_is_auth_required (ap, &has_key) && has_key) {
/* Activation failed, we must have bad encryption key */
nm_info ("Activation (%s/wireless): association took too long, "
"asking for new key.",
nm_device_get_iface (dev));
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
nm_dbus_get_user_key_for_network (dev, nm_device_get_act_request (dev), TRUE);
} else {
if (ap_auth_enforced (ap)) {
if (nm_device_is_activating (dev)) {
/* Kicked off by the authenticator most likely */
nm_info ("Activation (%s/wireless): association took too long, "
"failing activation.",
nm_device_get_iface (dev));
nm_device_state_changed (dev, NM_DEVICE_STATE_FAILED);
}
} else {
/* Activation failed, encryption key is probably bad */
nm_info ("Activation (%s/wireless): association took too long, "
"asking for new key.",
nm_device_get_iface (dev));
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
// FIXME: get secrets from the info-daemon
}
return FALSE;
@@ -2650,10 +2629,14 @@ build_supplicant_config (NMDevice80211Wireless *self)
goto error;
}
#if 0
// FIXME: send nm-802-11-wireless & nm-802-11-wireless-security
// settings objects to the supplicant
if (!nm_ap_security_write_supplicant_config (nm_ap_get_security (ap),
config,
is_adhoc))
goto error;
#endif
out:
return config;
@@ -2700,7 +2683,11 @@ real_act_stage1_prepare (NMDevice *dev)
setting = (NMSettingWireless *) nm_connection_get_setting (nm_act_request_get_connection (req),
"802-11-wireless");
g_assert (setting);
#if 0
success = nm_device_802_11_wireless_set_activation_ap (self, setting->ssid, NULL);
#endif
/* FIXME: match up 802-11-wireless and 802-11-wireless-security to an AP */
success = NM_ACT_STAGE_RETURN_SUCCESS;
return success ? NM_ACT_STAGE_RETURN_SUCCESS : NM_ACT_STAGE_RETURN_FAILURE;
}
@@ -2710,21 +2697,30 @@ static NMActStageReturn
real_act_stage2_config (NMDevice *dev)
{
NMDevice80211Wireless * self = NM_DEVICE_802_11_WIRELESS (dev);
NMAccessPoint * ap = nm_device_802_11_wireless_get_activation_ap (self);
NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
const char * iface = nm_device_get_iface (dev);
gboolean ask_user = FALSE;
NMAccessPoint * ap;
NMSupplicantConfig * config = NULL;
gulong id = 0;
g_assert (ap);
NMActRequest * req;
NMConnection * connection;
remove_supplicant_timeouts (self);
/* If we need an encryption key, get one */
if (ap_need_key (self, ap, &ask_user)) {
ap = nm_device_802_11_wireless_get_activation_ap (self);
g_assert (ap);
req = nm_device_get_act_request (dev);
g_assert (req);
connection = nm_act_request_get_connection (req);
g_assert (connection);
/* If we need secrets, get them */
if (ap_need_secrets (self, ap, connection, &ask_user)) {
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
nm_dbus_get_user_key_for_network (dev, nm_device_get_act_request (dev), ask_user);
// FIXME: get secrets from info-daemon
return NM_ACT_STAGE_RETURN_POSTPONE;
}
@@ -2840,7 +2836,6 @@ real_act_stage4_ip_config_timeout (NMDevice *dev,
NMAccessPoint * ap = nm_device_802_11_wireless_get_activation_ap (self);
NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
NMIP4Config * real_config = NULL;
NMAPSecurity * security;
gboolean has_key;
g_return_val_if_fail (config != NULL, NM_ACT_STAGE_RETURN_FAILURE);
@@ -2848,15 +2843,11 @@ real_act_stage4_ip_config_timeout (NMDevice *dev,
g_assert (ap);
security = nm_ap_get_security (ap);
g_assert (security);
/* If the security credentials' validity was not checked by any
* peer during authentication process, and DHCP times out, then
/* If nothing checks the security authentication information (as in
* Open System WEP for example), and DHCP times out, then
* the encryption key is likely wrong. Ask the user for a new one.
*/
if (!ap_is_auth_required (ap, &has_key) && has_key)
{
if (!ap_auth_enforced (ap)) {
const GByteArray * ssid = nm_ap_get_ssid (ap);
/* Activation failed, we must have bad encryption key */
@@ -2864,11 +2855,9 @@ real_act_stage4_ip_config_timeout (NMDevice *dev,
nm_device_get_iface (dev),
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)");
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
nm_dbus_get_user_key_for_network (dev, nm_device_get_act_request (dev), TRUE);
// FIXME: request new secrets from info-daemon
ret = NM_ACT_STAGE_RETURN_POSTPONE;
}
else if (nm_ap_get_mode (ap) == IW_MODE_ADHOC)
{
} else if (nm_ap_get_mode (ap) == IW_MODE_ADHOC) {
NMDevice80211WirelessClass * klass;
NMDeviceClass * parent_class;
@@ -2876,9 +2865,7 @@ real_act_stage4_ip_config_timeout (NMDevice *dev,
klass = NM_DEVICE_802_11_WIRELESS_GET_CLASS (self);
parent_class = NM_DEVICE_CLASS (g_type_class_peek_parent (klass));
ret = parent_class->act_stage4_ip_config_timeout (dev, &real_config);
}
else
{
} else {
/* Non-encrypted network and IP configure failed. Alert the user. */
ret = NM_ACT_STAGE_RETURN_FAILURE;
}
@@ -2914,7 +2901,7 @@ activation_success_handler (NMDevice *dev)
if (!nm_ap_get_address (ap) || !nm_ethernet_address_is_valid (nm_ap_get_address (ap)))
nm_ap_set_address (ap, &addr);
nm_dbus_update_network_info (ap, automatic);
// FIXME: send connection + new BSSID to info-daemon
}
@@ -2970,9 +2957,6 @@ real_activation_cancel_handler (NMDevice *dev)
parent_class = NM_DEVICE_CLASS (g_type_class_peek_parent (klass));
parent_class->activation_cancel_handler (dev);
if (nm_device_get_state (dev) == NM_DEVICE_STATE_NEED_AUTH)
nm_dbus_cancel_get_user_key_for_network (nm_device_get_act_request (dev));
cleanup_association_attempt (self, TRUE);
}
@@ -3119,7 +3103,7 @@ nm_device_802_11_wireless_class_init (NMDevice80211WirelessClass *klass)
g_param_spec_uint (NM_DEVICE_802_11_WIRELESS_CAPABILITIES,
"Wireless Capabilities",
"Wireless Capabilities",
0, G_MAXUINT32, NM_802_11_CAP_NONE,
0, G_MAXUINT32, NM_802_11_DEVICE_CAP_NONE,
G_PARAM_READABLE));
/* Signals */

View File

@@ -4,6 +4,7 @@
static gboolean impl_device_activate (NMDeviceInterface *device,
GHashTable *connection_hash,
const char *specific_object,
GError **err);
static gboolean impl_device_deactivate (NMDeviceInterface *device, GError **err);
@@ -156,17 +157,22 @@ nm_device_interface_get_type (void)
void
nm_device_interface_activate (NMDeviceInterface *device,
NMConnection *connection,
const char *specific_object,
gboolean user_requested)
{
g_return_if_fail (NM_IS_DEVICE_INTERFACE (device));
g_return_if_fail (connection != NULL);
NM_DEVICE_INTERFACE_GET_INTERFACE (device)->activate (device, connection, user_requested);
NM_DEVICE_INTERFACE_GET_INTERFACE (device)->activate (device,
connection,
specific_object,
user_requested);
}
static gboolean
impl_device_activate (NMDeviceInterface *device,
GHashTable *connection_hash,
const char *specific_object,
GError **err)
{
NMConnection *connection;
@@ -174,7 +180,7 @@ impl_device_activate (NMDeviceInterface *device,
connection = nm_connection_new_from_hash (connection_hash);
nm_connection_dump (connection);
nm_device_interface_activate (device, connection, TRUE);
nm_device_interface_activate (device, connection, specific_object, TRUE);
return TRUE;
}

View File

@@ -45,7 +45,10 @@ struct _NMDeviceInterface {
GTypeInterface g_iface;
/* Methods */
void (*activate) (NMDeviceInterface *device, NMConnection *connection, gboolean user_requested);
void (*activate) (NMDeviceInterface *device,
NMConnection *connection,
const char *specific_object,
gboolean user_requested);
void (*deactivate) (NMDeviceInterface *device);
/* Signals */
@@ -57,6 +60,7 @@ GType nm_device_interface_get_type (void);
void nm_device_interface_activate (NMDeviceInterface *device,
NMConnection *connection,
const char *specific_object,
gboolean user_requested);
void nm_device_interface_deactivate (NMDeviceInterface *device);

View File

@@ -34,7 +34,6 @@
#include "NetworkManagerSystem.h"
#include "nm-dhcp-manager.h"
#include "nm-dbus-manager.h"
#include "nm-dbus-nmi.h"
#include "nm-utils.h"
#include "autoip.h"
#include "nm-netlink.h"
@@ -83,6 +82,7 @@ struct _NMDevicePrivate
static void nm_device_activate (NMDeviceInterface *device,
NMConnection *connection,
const char *specific_object,
gboolean user_requested);
static void nm_device_activate_schedule_stage5_ip_config_commit (NMDevice *self);
@@ -1059,6 +1059,7 @@ nm_device_deactivate (NMDeviceInterface *device)
static void
nm_device_activate (NMDeviceInterface *device,
NMConnection *connection,
const char *specific_object,
gboolean user_requested)
{
NMDevice *self = NM_DEVICE (device);
@@ -1081,7 +1082,7 @@ nm_device_activate (NMDeviceInterface *device,
}
nm_info ("Activating device %s", nm_device_get_iface (self));
priv->act_request = nm_act_request_new (connection, user_requested);
priv->act_request = nm_act_request_new (connection, specific_object, user_requested);
nm_device_activate_schedule_stage1_device_prepare (self);
}

View File

@@ -34,6 +34,133 @@
#include "nm-utils.h"
#include "nm-dbus-manager.h"
/*
* Pending Call Debug stuff
*
*/
typedef struct PCallInfo
{
DBusPendingCall * pcall;
char * caller;
guint32 id;
GTimeVal start;
} PCallInfo;
static GStaticMutex pcall_mutex = G_STATIC_MUTEX_INIT;
static GHashTable * pcall_table = NULL;
static guint32 pcall_gid = 0;
static guint32 pcall_pending = 0;
DBusPendingCall *
nm_dbus_send_with_callback (DBusConnection *connection,
DBusMessage *msg,
DBusPendingCallNotifyFunction func,
gpointer data,
DBusFreeFunction free_func,
const char *caller)
{
PCallInfo * info = NULL;
DBusPendingCall * pcall = NULL;
g_return_val_if_fail (connection != NULL, NULL);
g_return_val_if_fail (msg != NULL, NULL);
g_return_val_if_fail (func != NULL, NULL);
g_return_val_if_fail (caller != NULL, NULL);
if (!(info = g_malloc0 (sizeof (PCallInfo))))
{
g_warning ("Error: '%s' couldn't allocate memory for tracking PCall.", caller);
if (free_func)
(*free_func)(data);
return NULL;
}
dbus_connection_send_with_reply (connection, msg, &pcall, -1);
if (!pcall)
{
g_warning ("Error: '%s' couldn't send dbus message.", caller);
if (free_func)
(*free_func)(data);
g_free (info);
return NULL;
}
dbus_pending_call_set_notify (pcall, func, data, free_func);
info->caller = g_strdup (caller);
info->pcall = pcall;
g_get_current_time (&info->start);
dbus_pending_call_ref (pcall);
g_static_mutex_lock (&pcall_mutex);
info->id = pcall_gid++;
pcall_pending++;
if (!pcall_table)
pcall_table = g_hash_table_new (g_direct_hash, g_direct_equal);
g_hash_table_insert (pcall_table, pcall, info);
#ifdef DBUS_PENDING_CALL_DEBUG
nm_info ("PCall Debug: new id %d (%p), from '%s' (%s), "
"%d pending.", info->id, pcall, info->caller,
dbus_message_get_member (msg), pcall_pending);
#endif
g_static_mutex_unlock (&pcall_mutex);
return pcall;
}
void
nm_dbus_send_with_callback_replied (DBusPendingCall *pcall,
const char *caller)
{
PCallInfo * info;
#ifdef DBUS_PENDING_CALL_DEBUG
GTimeVal now;
long elapsed_ms = 0;
#endif
g_return_if_fail (pcall != NULL);
g_return_if_fail (caller != NULL);
g_static_mutex_lock (&pcall_mutex);
if (!(info = g_hash_table_lookup (pcall_table, pcall)))
{
nm_warning ("Error: couldn't find pending call %p in tracking"
" table.", pcall);
goto out;
}
pcall_pending--;
#ifdef DBUS_PENDING_CALL_DEBUG
g_get_current_time (&now);
if (info->start.tv_usec > now.tv_usec)
{
now.tv_sec--;
now.tv_usec = G_USEC_PER_SEC - (info->start.tv_usec - now.tv_usec);
}
else
now.tv_usec -= info->start.tv_usec;
now.tv_sec -= info->start.tv_sec;
elapsed_ms = now.tv_sec * G_USEC_PER_SEC + now.tv_usec;
elapsed_ms /= 1000;
nm_info ("PCall Debug: unregistered ID %d (%p), %s -> %s,"
" %lums elapsed. Total pending: %d", info->id, info->pcall, info->caller,
caller, elapsed_ms, pcall_pending);
#endif
g_hash_table_remove (pcall_table, pcall);
g_free (info->caller);
dbus_pending_call_unref (info->pcall);
g_free (info);
out:
g_static_mutex_unlock (&pcall_mutex);
}
static DBusMessage *
new_invalid_vpn_connection_error (DBusMessage *replyto)

View File

@@ -147,11 +147,13 @@ detail_network (gpointer data, gpointer user_data)
const char *active_bssid = (const char *) user_data;
GString *str;
gboolean active = FALSE;
guint32 capabilities;
guint32 flags, wpa_flags, rsn_flags;
GByteArray * ssid;
char *tmp;
capabilities = nm_access_point_get_capabilities (ap);
flags = nm_access_point_get_flags (ap);
wpa_flags = nm_access_point_get_wpa_flags (ap);
rsn_flags = nm_access_point_get_rsn_flags (ap);
if (active_bssid) {
char *current_bssid = nm_access_point_get_hw_address (ap);
@@ -169,16 +171,21 @@ detail_network (gpointer data, gpointer user_data)
nm_access_point_get_rate (ap) / 1024,
nm_access_point_get_strength (ap));
if (nm_access_point_is_encrypted (ap))
if ( !(flags & NM_802_11_AP_FLAGS_PRIVACY)
&& (wpa_flags != NM_802_11_AP_SEC_NONE)
&& (rsn_flags != NM_802_11_AP_SEC_NONE))
g_string_append (str, ", Encrypted: ");
if (capabilities & NM_802_11_CAP_PROTO_WEP)
if ( (flags & NM_802_11_AP_FLAGS_PRIVACY)
&& (wpa_flags == NM_802_11_AP_SEC_NONE)
&& (rsn_flags == NM_802_11_AP_SEC_NONE))
g_string_append (str, " WEP");
if (capabilities & NM_802_11_CAP_PROTO_WPA)
if (wpa_flags != NM_802_11_AP_SEC_NONE)
g_string_append (str, " WPA");
if (capabilities & NM_802_11_CAP_PROTO_WPA2)
if (rsn_flags != NM_802_11_AP_SEC_NONE)
g_string_append (str, " WPA2");
if (capabilities & NM_802_11_CAP_KEY_MGMT_802_1X)
if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)
|| (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X))
g_string_append (str, " Enterprise");
/* FIXME: broadcast/hidden */
@@ -277,20 +284,20 @@ detail_device (gpointer data, gpointer user_data)
/* Wireless specific information */
if ((NM_IS_DEVICE_802_11_WIRELESS (device))) {
guint32 wireless_caps;
guint32 wcaps;
NMAccessPoint *active_ap = NULL;
char *active_bssid = NULL;
GSList *networks;
printf ("\n Wireless Settings\n");
wireless_caps = nm_device_802_11_wireless_get_capabilities (NM_DEVICE_802_11_WIRELESS (device));
wcaps = nm_device_802_11_wireless_get_capabilities (NM_DEVICE_802_11_WIRELESS (device));
if (wireless_caps & NM_802_11_CAP_PROTO_WEP)
if (wcaps & (NM_802_11_DEVICE_CAP_CIPHER_WEP40 | NM_802_11_DEVICE_CAP_CIPHER_WEP104))
print_string (" WEP Encryption", "yes");
if (wireless_caps & NM_802_11_CAP_PROTO_WPA)
if (wcaps & NM_802_11_DEVICE_CAP_WPA)
print_string (" WPA Encryption", "yes");
if (wireless_caps & NM_802_11_CAP_PROTO_WPA2)
if (wcaps & NM_802_11_DEVICE_CAP_RSN)
print_string (" WPA2 Encryption", "yes");
if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) {

View File

@@ -351,130 +351,3 @@ out:
}
/*
* Pending Call Debug stuff
*
*/
typedef struct PCallInfo
{
DBusPendingCall * pcall;
char * caller;
guint32 id;
GTimeVal start;
} PCallInfo;
static GStaticMutex pcall_mutex = G_STATIC_MUTEX_INIT;
static GHashTable * pcall_table = NULL;
static guint32 pcall_gid = 0;
static guint32 pcall_pending = 0;
DBusPendingCall *
nm_dbus_send_with_callback (DBusConnection *connection,
DBusMessage *msg,
DBusPendingCallNotifyFunction func,
gpointer data,
DBusFreeFunction free_func,
const char *caller)
{
PCallInfo * info = NULL;
DBusPendingCall * pcall = NULL;
g_return_val_if_fail (connection != NULL, NULL);
g_return_val_if_fail (msg != NULL, NULL);
g_return_val_if_fail (func != NULL, NULL);
g_return_val_if_fail (caller != NULL, NULL);
if (!(info = g_malloc0 (sizeof (PCallInfo))))
{
g_warning ("Error: '%s' couldn't allocate memory for tracking PCall.", caller);
if (free_func)
(*free_func)(data);
return NULL;
}
dbus_connection_send_with_reply (connection, msg, &pcall, -1);
if (!pcall)
{
g_warning ("Error: '%s' couldn't send dbus message.", caller);
if (free_func)
(*free_func)(data);
g_free (info);
return NULL;
}
dbus_pending_call_set_notify (pcall, func, data, free_func);
info->caller = g_strdup (caller);
info->pcall = pcall;
g_get_current_time (&info->start);
dbus_pending_call_ref (pcall);
g_static_mutex_lock (&pcall_mutex);
info->id = pcall_gid++;
pcall_pending++;
if (!pcall_table)
pcall_table = g_hash_table_new (g_direct_hash, g_direct_equal);
g_hash_table_insert (pcall_table, pcall, info);
#ifdef DBUS_PENDING_CALL_DEBUG
nm_info ("PCall Debug: new id %d (%p), from '%s' (%s), "
"%d pending.", info->id, pcall, info->caller,
dbus_message_get_member (msg), pcall_pending);
#endif
g_static_mutex_unlock (&pcall_mutex);
return pcall;
}
void
nm_dbus_send_with_callback_replied (DBusPendingCall *pcall,
const char *caller)
{
PCallInfo * info;
#ifdef DBUS_PENDING_CALL_DEBUG
GTimeVal now;
long elapsed_ms = 0;
#endif
g_return_if_fail (pcall != NULL);
g_return_if_fail (caller != NULL);
g_static_mutex_lock (&pcall_mutex);
if (!(info = g_hash_table_lookup (pcall_table, pcall)))
{
nm_warning ("Error: couldn't find pending call %p in tracking"
" table.", pcall);
goto out;
}
pcall_pending--;
#ifdef DBUS_PENDING_CALL_DEBUG
g_get_current_time (&now);
if (info->start.tv_usec > now.tv_usec)
{
now.tv_sec--;
now.tv_usec = G_USEC_PER_SEC - (info->start.tv_usec - now.tv_usec);
}
else
now.tv_usec -= info->start.tv_usec;
now.tv_sec -= info->start.tv_sec;
elapsed_ms = now.tv_sec * G_USEC_PER_SEC + now.tv_usec;
elapsed_ms /= 1000;
nm_info ("PCall Debug: unregistered ID %d (%p), %s -> %s,"
" %lums elapsed. Total pending: %d", info->id, info->pcall, info->caller,
caller, elapsed_ms, pcall_pending);
#endif
g_hash_table_remove (pcall_table, pcall);
g_free (info->caller);
dbus_pending_call_unref (info->pcall);
g_free (info);
out:
g_static_mutex_unlock (&pcall_mutex);
}

View File

@@ -131,15 +131,4 @@ gchar *nm_dbus_unescape_object_path (const gchar *object_path);
char *nm_utils_ssid_to_utf8 (const char *ssid, guint32 len);
/* #define DBUS_PENDING_CALL_DEBUG */
DBusPendingCall * nm_dbus_send_with_callback (DBusConnection *connection,
DBusMessage *msg,
DBusPendingCallNotifyFunction func,
gpointer data,
DBusFreeFunction free_func,
const char *caller);
void nm_dbus_send_with_callback_replied (DBusPendingCall *pcall,
const char *caller);
#endif /* NM_UTILS_H */