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:
79
ChangeLog
79
ChangeLog
@@ -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,
|
||||
|
@@ -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
|
||||
|
@@ -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"/>
|
||||
|
@@ -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"/>
|
||||
|
@@ -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));
|
||||
|
@@ -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 *
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
@@ -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 \
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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")) {
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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 */
|
||||
|
@@ -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;
|
||||
}
|
@@ -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 */
|
@@ -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 */
|
@@ -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;
|
||||
}
|
@@ -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 */
|
@@ -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;
|
||||
}
|
@@ -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 */
|
@@ -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;
|
||||
}
|
@@ -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 */
|
@@ -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;
|
||||
}
|
@@ -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 */
|
@@ -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, ×tamp_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);
|
||||
}
|
||||
|
||||
|
@@ -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 */
|
@@ -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 */
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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) {
|
||||
|
127
utils/nm-utils.c
127
utils/nm-utils.c
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user