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>
|
2007-08-27 Tambet Ingo <tambet@gmail.com>
|
||||||
|
|
||||||
* src/nm-manager.c (impl_manager_get_devices): Duplicate the device path,
|
* 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
|
#define NM_DEVICE_CAP_CARRIER_DETECT 0x00000002
|
||||||
|
|
||||||
|
|
||||||
/* 802.11 wireless-specific device capability bits */
|
/* 802.11 wireless device-specific capabilities */
|
||||||
#define NM_802_11_CAP_NONE 0x00000000
|
#define NM_802_11_DEVICE_CAP_NONE 0x00000000
|
||||||
#define NM_802_11_CAP_PROTO_NONE 0x00000001
|
#define NM_802_11_DEVICE_CAP_CIPHER_WEP40 0x00000001
|
||||||
#define NM_802_11_CAP_PROTO_WEP 0x00000002
|
#define NM_802_11_DEVICE_CAP_CIPHER_WEP104 0x00000002
|
||||||
#define NM_802_11_CAP_PROTO_WPA 0x00000004
|
#define NM_802_11_DEVICE_CAP_CIPHER_TKIP 0x00000004
|
||||||
#define NM_802_11_CAP_PROTO_WPA2 0x00000008
|
#define NM_802_11_DEVICE_CAP_CIPHER_CCMP 0x00000008
|
||||||
#define NM_802_11_CAP_RESERVED1 0x00000010
|
#define NM_802_11_DEVICE_CAP_WPA 0x00000010
|
||||||
#define NM_802_11_CAP_RESERVED2 0x00000020
|
#define NM_802_11_DEVICE_CAP_RSN 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
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NM-supported Authentication Methods
|
* 802.11 Access Point flags
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#define NM_AUTH_TYPE_WPA_PSK_AUTO 0x00000000
|
#define NM_802_11_AP_FLAGS_NONE 0x00000000
|
||||||
#define NM_AUTH_TYPE_NONE 0x00000001
|
#define NM_802_11_AP_FLAGS_PRIVACY 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
|
* 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_802_11_AP_SEC_NONE 0x00000000
|
||||||
#define NM_EAP_METHOD_MSCHAP 0x00000002 /* EAP-MSCHAPv2 */
|
#define NM_802_11_AP_SEC_PAIR_WEP40 0x00000001
|
||||||
#define NM_EAP_METHOD_OTP 0x00000004 /* EAP-OTP */
|
#define NM_802_11_AP_SEC_PAIR_WEP104 0x00000002
|
||||||
#define NM_EAP_METHOD_GTC 0x00000008 /* EAP-GTC */
|
#define NM_802_11_AP_SEC_PAIR_TKIP 0x00000004
|
||||||
#define NM_EAP_METHOD_PEAP 0x00000010 /* EAP-PEAP */
|
#define NM_802_11_AP_SEC_PAIR_CCMP 0x00000008
|
||||||
#define NM_EAP_METHOD_TLS 0x00000020 /* EAP-TLS */
|
#define NM_802_11_AP_SEC_GROUP_WEP40 0x00000010
|
||||||
#define NM_EAP_METHOD_TTLS 0x00000040 /* EAP-TTLS */
|
#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
|
* Wireless network types
|
||||||
|
@@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
<node name="/">
|
<node name="/">
|
||||||
<interface name="org.freedesktop.NetworkManager.AccessPoint">
|
<interface name="org.freedesktop.NetworkManager.AccessPoint">
|
||||||
<property name="Capabilities" type="u" access="read"/>
|
<property name="Flags" type="u" access="read"/>
|
||||||
<property name="Encrypted" type="b" 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="Ssid" type="ay" access="read"/>
|
||||||
<property name="Frequency" type="d" access="read"/>
|
<property name="Frequency" type="d" access="read"/>
|
||||||
<property name="HwAddress" type="s" access="read"/>
|
<property name="HwAddress" type="s" access="read"/>
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<interface name="org.freedesktop.NetworkManager.Device">
|
<interface name="org.freedesktop.NetworkManager.Device">
|
||||||
<method name="Activate">
|
<method name="Activate">
|
||||||
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_device_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>
|
||||||
<method name="Deactivate">
|
<method name="Deactivate">
|
||||||
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_device_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_print ("\tMAC Address: %s\n", str);
|
||||||
g_free (str);
|
g_free (str);
|
||||||
|
|
||||||
g_print ("\tCapabilities: %d\n", nm_access_point_get_capabilities (ap));
|
g_print ("\tFlags: 0x%X\n", nm_access_point_get_flags (ap));
|
||||||
g_print ("\tEncrypted: %d\n", nm_access_point_is_encrypted (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 ("\tFrequency: %f\n", nm_access_point_get_frequency (ap));
|
||||||
|
|
||||||
g_print ("\tMode: %d\n", nm_access_point_get_mode (ap));
|
g_print ("\tMode: %d\n", nm_access_point_get_mode (ap));
|
||||||
|
@@ -102,19 +102,27 @@ strength_changed_proxy (NMAccessPoint *ap, guchar strength)
|
|||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
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
|
guint32
|
||||||
nm_access_point_is_encrypted (NMAccessPoint *ap)
|
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 *
|
GByteArray *
|
||||||
|
@@ -29,8 +29,9 @@ GType nm_access_point_get_type (void);
|
|||||||
|
|
||||||
NMAccessPoint *nm_access_point_new (DBusGConnection *connection, const char *path);
|
NMAccessPoint *nm_access_point_new (DBusGConnection *connection, const char *path);
|
||||||
|
|
||||||
guint32 nm_access_point_get_capabilities (NMAccessPoint *ap);
|
guint32 nm_access_point_get_flags (NMAccessPoint *ap);
|
||||||
gboolean nm_access_point_is_encrypted (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);
|
GByteArray * nm_access_point_get_ssid (NMAccessPoint *ap);
|
||||||
gdouble nm_access_point_get_frequency (NMAccessPoint *ap);
|
gdouble nm_access_point_get_frequency (NMAccessPoint *ap);
|
||||||
char * nm_access_point_get_hw_address (NMAccessPoint *ap);
|
char * nm_access_point_get_hw_address (NMAccessPoint *ap);
|
||||||
|
@@ -28,6 +28,30 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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;
|
typedef struct IEEE_802_11_Cipher IEEE_802_11_Cipher;
|
||||||
|
|
||||||
void ieee_802_11_cipher_ref (IEEE_802_11_Cipher *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;
|
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
|
static void
|
||||||
add_one_setting_to_hash (gpointer key, gpointer data, gpointer user_data)
|
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,
|
gboolean nm_connection_compare (NMConnection *connection,
|
||||||
NMConnection *other);
|
NMConnection *other);
|
||||||
|
|
||||||
|
gboolean nm_connection_have_secrets (NMConnection *connection);
|
||||||
|
|
||||||
GHashTable *nm_connection_to_hash (NMConnection *connection);
|
GHashTable *nm_connection_to_hash (NMConnection *connection);
|
||||||
void nm_connection_dump (NMConnection *connection);
|
void nm_connection_dump (NMConnection *connection);
|
||||||
void nm_connection_destroy (NMConnection *connection);
|
void nm_connection_destroy (NMConnection *connection);
|
||||||
|
@@ -34,8 +34,6 @@ NetworkManager_SOURCES = \
|
|||||||
NetworkManagerDbusUtils.h \
|
NetworkManagerDbusUtils.h \
|
||||||
nm-dbus-manager.h \
|
nm-dbus-manager.h \
|
||||||
nm-dbus-manager.c \
|
nm-dbus-manager.c \
|
||||||
nm-dbus-nmi.c \
|
|
||||||
nm-dbus-nmi.h \
|
|
||||||
nm-hal-manager.c \
|
nm-hal-manager.c \
|
||||||
nm-hal-manager.h \
|
nm-hal-manager.h \
|
||||||
nm-ip4-config.c \
|
nm-ip4-config.c \
|
||||||
@@ -58,17 +56,6 @@ NetworkManager_SOURCES = \
|
|||||||
nm-activation-request.h \
|
nm-activation-request.h \
|
||||||
autoip.c \
|
autoip.c \
|
||||||
autoip.h \
|
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 \
|
nm-marshal-main.c \
|
||||||
kernel-types.h \
|
kernel-types.h \
|
||||||
wpa.c \
|
wpa.c \
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
#include "NetworkManagerAP.h"
|
#include "NetworkManagerAP.h"
|
||||||
#include "NetworkManagerUtils.h"
|
#include "NetworkManagerUtils.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "nm-ap-security.h"
|
|
||||||
#include "nm-dbus-manager.h"
|
#include "nm-dbus-manager.h"
|
||||||
#include <wireless.h>
|
#include <wireless.h>
|
||||||
#include "wpa.h"
|
#include "wpa.h"
|
||||||
@@ -55,7 +54,10 @@ typedef struct
|
|||||||
gint8 strength;
|
gint8 strength;
|
||||||
double freq;
|
double freq;
|
||||||
guint16 rate;
|
guint16 rate;
|
||||||
guint32 capabilities;
|
|
||||||
|
guint32 flags; /* General flags */
|
||||||
|
guint32 wpa_flags; /* WPA-related flags */
|
||||||
|
guint32 rsn_flags; /* RSN (WPA2) -related flags */
|
||||||
|
|
||||||
/* Non-scanned attributes */
|
/* Non-scanned attributes */
|
||||||
gboolean invalid;
|
gboolean invalid;
|
||||||
@@ -71,7 +73,6 @@ typedef struct
|
|||||||
|
|
||||||
/* Things from user prefs/NetworkManagerInfo */
|
/* Things from user prefs/NetworkManagerInfo */
|
||||||
gboolean fallback;
|
gboolean fallback;
|
||||||
NMAPSecurity * security;
|
|
||||||
GTimeVal timestamp;
|
GTimeVal timestamp;
|
||||||
GSList * user_addresses;
|
GSList * user_addresses;
|
||||||
} NMAccessPointPrivate;
|
} NMAccessPointPrivate;
|
||||||
@@ -90,8 +91,9 @@ static guint signals[LAST_SIGNAL] = { 0 };
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_CAPABILITIES,
|
PROP_FLAGS,
|
||||||
PROP_ENCRYPTED,
|
PROP_WPA_FLAGS,
|
||||||
|
PROP_RSN_FLAGS,
|
||||||
PROP_SSID,
|
PROP_SSID,
|
||||||
PROP_FREQUENCY,
|
PROP_FREQUENCY,
|
||||||
PROP_HW_ADDRESS,
|
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->dbus_path = g_strdup_printf (NM_DBUS_PATH_ACCESS_POINT "/%d", counter++);
|
||||||
priv->mode = IW_MODE_INFRA;
|
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;
|
priv->broadcast = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,9 +129,6 @@ finalize (GObject *object)
|
|||||||
g_slist_foreach (priv->user_addresses, (GFunc)g_free, NULL);
|
g_slist_foreach (priv->user_addresses, (GFunc)g_free, NULL);
|
||||||
g_slist_free (priv->user_addresses);
|
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);
|
G_OBJECT_CLASS (nm_ap_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,8 +141,14 @@ set_property (GObject *object, guint prop_id,
|
|||||||
int mode;
|
int mode;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CAPABILITIES:
|
case PROP_FLAGS:
|
||||||
priv->capabilities = g_value_get_uint (value);
|
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;
|
break;
|
||||||
case PROP_SSID:
|
case PROP_SSID:
|
||||||
ssid = g_value_get_boxed (value);
|
ssid = g_value_get_boxed (value);
|
||||||
@@ -193,11 +200,14 @@ get_property (GObject *object, guint prop_id,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CAPABILITIES:
|
case PROP_FLAGS:
|
||||||
g_value_set_uint (value, priv->capabilities);
|
g_value_set_uint (value, priv->flags);
|
||||||
break;
|
break;
|
||||||
case PROP_ENCRYPTED:
|
case PROP_WPA_FLAGS:
|
||||||
g_value_set_boolean (value, !(priv->capabilities & NM_802_11_CAP_PROTO_NONE));
|
g_value_set_uint (value, priv->wpa_flags);
|
||||||
|
break;
|
||||||
|
case PROP_RSN_FLAGS:
|
||||||
|
g_value_set_uint (value, priv->rsn_flags);
|
||||||
break;
|
break;
|
||||||
case PROP_SSID:
|
case PROP_SSID:
|
||||||
len = priv->ssid ? priv->ssid->len : 0;
|
len = priv->ssid ? priv->ssid->len : 0;
|
||||||
@@ -234,7 +244,7 @@ static void
|
|||||||
nm_ap_class_init (NMAccessPointClass *ap_class)
|
nm_ap_class_init (NMAccessPointClass *ap_class)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (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));
|
g_type_class_add_private (ap_class, sizeof (NMAccessPointPrivate));
|
||||||
|
|
||||||
@@ -245,39 +255,47 @@ nm_ap_class_init (NMAccessPointClass *ap_class)
|
|||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
|
|
||||||
all_caps = NM_802_11_CAP_NONE
|
all_sec_flags = NM_802_11_AP_SEC_NONE
|
||||||
| NM_802_11_CAP_PROTO_NONE
|
| NM_802_11_AP_SEC_PAIR_WEP40
|
||||||
| NM_802_11_CAP_PROTO_WEP
|
| NM_802_11_AP_SEC_PAIR_WEP104
|
||||||
| NM_802_11_CAP_PROTO_WPA
|
| NM_802_11_AP_SEC_PAIR_TKIP
|
||||||
| NM_802_11_CAP_PROTO_WPA2
|
| NM_802_11_AP_SEC_PAIR_CCMP
|
||||||
| NM_802_11_CAP_RESERVED1
|
| NM_802_11_AP_SEC_GROUP_WEP40
|
||||||
| NM_802_11_CAP_RESERVED2
|
| NM_802_11_AP_SEC_GROUP_WEP104
|
||||||
| NM_802_11_CAP_KEY_MGMT_PSK
|
| NM_802_11_AP_SEC_GROUP_TKIP
|
||||||
| NM_802_11_CAP_KEY_MGMT_802_1X
|
| NM_802_11_AP_SEC_GROUP_CCMP
|
||||||
| NM_802_11_CAP_RESERVED3
|
| NM_802_11_AP_SEC_KEY_MGMT_PSK
|
||||||
| NM_802_11_CAP_RESERVED4
|
| NM_802_11_AP_SEC_KEY_MGMT_802_1X;
|
||||||
| 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;
|
|
||||||
|
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class, PROP_CAPABILITIES,
|
(object_class, PROP_FLAGS,
|
||||||
g_param_spec_uint (NM_AP_CAPABILITIES,
|
g_param_spec_uint (NM_AP_FLAGS,
|
||||||
"Capabilities",
|
"Flags",
|
||||||
"Capabilities",
|
"Flags",
|
||||||
NM_802_11_CAP_NONE, all_caps, NM_802_11_CAP_PROTO_NONE,
|
NM_802_11_AP_FLAGS_NONE,
|
||||||
|
NM_802_11_AP_FLAGS_PRIVACY,
|
||||||
|
NM_802_11_AP_FLAGS_NONE,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class, PROP_ENCRYPTED,
|
(object_class, PROP_WPA_FLAGS,
|
||||||
g_param_spec_boolean (NM_AP_ENCRYPTED,
|
g_param_spec_uint (NM_AP_WPA_FLAGS,
|
||||||
"Encrypted",
|
"WPA Flags",
|
||||||
"Is encrypted",
|
"WPA Flags",
|
||||||
FALSE,
|
NM_802_11_AP_SEC_NONE,
|
||||||
G_PARAM_READABLE));
|
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
|
g_object_class_install_property
|
||||||
(object_class, PROP_SSID,
|
(object_class, PROP_SSID,
|
||||||
@@ -399,12 +417,11 @@ nm_ap_new_from_ap (NMAccessPoint *src_ap)
|
|||||||
new_priv->strength = src_priv->strength;
|
new_priv->strength = src_priv->strength;
|
||||||
new_priv->freq = src_priv->freq;
|
new_priv->freq = src_priv->freq;
|
||||||
new_priv->rate = src_priv->rate;
|
new_priv->rate = src_priv->rate;
|
||||||
new_priv->capabilities = src_priv->capabilities;
|
|
||||||
new_priv->artificial = src_priv->artificial;
|
new_priv->artificial = src_priv->artificial;
|
||||||
new_priv->broadcast = src_priv->broadcast;
|
new_priv->broadcast = src_priv->broadcast;
|
||||||
|
new_priv->flags = src_priv->flags;
|
||||||
if (src_priv->security)
|
new_priv->wpa_flags = src_priv->wpa_flags;
|
||||||
new_priv->security = nm_ap_security_new_copy (src_priv->security);
|
new_priv->rsn_flags = src_priv->rsn_flags;
|
||||||
|
|
||||||
return new_ap;
|
return new_ap;
|
||||||
}
|
}
|
||||||
@@ -446,14 +463,20 @@ foreach_property_cb (gpointer key, gpointer value, gpointer user_data)
|
|||||||
nm_ap_set_address (ap, &addr);
|
nm_ap_set_address (ap, &addr);
|
||||||
} else if (!strcmp (key, "wpaie")) {
|
} else if (!strcmp (key, "wpaie")) {
|
||||||
guint8 * ie = (guint8 *) array->data;
|
guint8 * ie = (guint8 *) array->data;
|
||||||
|
guint32 flags = nm_ap_get_wpa_flags (ap);
|
||||||
|
|
||||||
if (array->len <= 0 || array->len > WPA_MAX_IE_LEN)
|
if (array->len <= 0 || array->len > WPA_MAX_IE_LEN)
|
||||||
return;
|
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")) {
|
} else if (!strcmp (key, "rsnie")) {
|
||||||
guint8 * ie = (guint8 *) array->data;
|
guint8 * ie = (guint8 *) array->data;
|
||||||
|
guint32 flags = nm_ap_get_rsn_flags (ap);
|
||||||
|
|
||||||
if (array->len <= 0 || array->len > WPA_MAX_IE_LEN)
|
if (array->len <= 0 || array->len > WPA_MAX_IE_LEN)
|
||||||
return;
|
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)) {
|
} else if (G_VALUE_HOLDS_INT (variant)) {
|
||||||
gint32 int_val = g_value_get_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) {
|
if (val & IEEE80211_CAP_PRIVACY) {
|
||||||
guint cur_caps;
|
guint32 flags = nm_ap_get_flags (ap);
|
||||||
|
nm_ap_set_flags (ap, flags | NM_802_11_AP_FLAGS_PRIVACY);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -531,13 +551,16 @@ nm_ap_print_self (NMAccessPoint *ap,
|
|||||||
|
|
||||||
priv = NM_AP_GET_PRIVATE (ap);
|
priv = NM_AP_GET_PRIVATE (ap);
|
||||||
|
|
||||||
nm_info ("%s'%s' (%p) stamp=%ld caps=0x%X bssid=" MAC_FMT " strength=%d "
|
nm_info ("%s'%s' (%p) stamp=%ld flags=0x%X wpa-flags=0x%X rsn-flags=0x%x "
|
||||||
"freq=[%f/%d] rate=%d inval=%d mode=%d seen=%ld",
|
"bssid=" MAC_FMT " strength=%d freq=[%f/%d] rate=%d inval=%d "
|
||||||
|
"mode=%d seen=%ld",
|
||||||
prefix,
|
prefix,
|
||||||
priv->ssid ? nm_utils_escape_ssid (priv->ssid->data, priv->ssid->len) : "(none)",
|
priv->ssid ? nm_utils_escape_ssid (priv->ssid->data, priv->ssid->len) : "(none)",
|
||||||
ap,
|
ap,
|
||||||
priv->timestamp.tv_sec,
|
priv->timestamp.tv_sec,
|
||||||
priv->capabilities,
|
priv->flags,
|
||||||
|
priv->wpa_flags,
|
||||||
|
priv->rsn_flags,
|
||||||
MAC_ARG (priv->address.ether_addr_octet),
|
MAC_ARG (priv->address.ether_addr_octet),
|
||||||
priv->strength,
|
priv->strength,
|
||||||
(priv->freq > 20) ? priv->freq : 0,
|
(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_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
void
|
||||||
* Accessor function for encrypted flag
|
nm_ap_set_wpa_flags (NMAccessPoint *ap, guint32 flags)
|
||||||
*
|
|
||||||
*/
|
|
||||||
gboolean nm_ap_get_encrypted (NMAccessPoint *ap)
|
|
||||||
{
|
{
|
||||||
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));
|
g_return_if_fail (NM_IS_AP (ap));
|
||||||
|
|
||||||
priv = NM_AP_GET_PRIVATE (ap);
|
g_object_set (ap, NM_AP_WPA_FLAGS, flags, NULL);
|
||||||
|
|
||||||
if (priv->security)
|
|
||||||
{
|
|
||||||
g_object_unref (G_OBJECT (priv->security));
|
|
||||||
priv->security = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (security)
|
|
||||||
priv->security = nm_ap_security_new_copy (security);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
* Get/set functions for address
|
||||||
@@ -984,117 +1004,42 @@ gboolean nm_ap_has_manufacturer_default_ssid (NMAccessPoint *ap)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
guint32
|
||||||
static guint32 add_capabilities_from_cipher (guint32 caps, int cipher)
|
nm_ap_add_security_from_ie (guint32 flags,
|
||||||
|
const guint8 *wpa_ie,
|
||||||
|
guint32 length)
|
||||||
{
|
{
|
||||||
if (cipher & IW_AUTH_CIPHER_WEP40)
|
wpa_ie_data * cap_data;
|
||||||
{
|
|
||||||
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));
|
|
||||||
|
|
||||||
if (!(cap_data = wpa_parse_wpa_ie (wpa_ie, length)))
|
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 */
|
/* Group cipher flags */
|
||||||
caps &= ~NM_802_11_CAP_PROTO_WEP;
|
if (cap_data->group_cipher & IW_AUTH_CIPHER_WEP40)
|
||||||
|
flags |= NM_802_11_AP_SEC_GROUP_WEP40;
|
||||||
if (cap_data->proto & IW_AUTH_WPA_VERSION_WPA)
|
if (cap_data->group_cipher & IW_AUTH_CIPHER_WEP104)
|
||||||
{
|
flags |= NM_802_11_AP_SEC_GROUP_WEP104;
|
||||||
caps |= NM_802_11_CAP_PROTO_WPA;
|
if (cap_data->group_cipher & IW_AUTH_CIPHER_TKIP)
|
||||||
caps &= ~NM_802_11_CAP_PROTO_NONE;
|
flags |= NM_802_11_AP_SEC_GROUP_TKIP;
|
||||||
}
|
if (cap_data->group_cipher & IW_AUTH_CIPHER_CCMP)
|
||||||
if (cap_data->proto & IW_AUTH_WPA_VERSION_WPA2)
|
flags |= NM_802_11_AP_SEC_GROUP_CCMP;
|
||||||
{
|
|
||||||
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);
|
|
||||||
|
|
||||||
if (cap_data->key_mgmt & IW_AUTH_KEY_MGMT_802_1X)
|
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)
|
if (cap_data->key_mgmt & IW_AUTH_KEY_MGMT_PSK)
|
||||||
caps |= NM_802_11_CAP_KEY_MGMT_PSK;
|
flags |= NM_802_11_AP_SEC_KEY_MGMT_PSK;
|
||||||
|
|
||||||
nm_ap_set_capabilities (ap, caps);
|
|
||||||
|
|
||||||
g_slice_free (wpa_ie_data, cap_data);
|
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 <glib-object.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "NetworkManager.h"
|
#include "NetworkManager.h"
|
||||||
#include "nm-ap-security.h"
|
|
||||||
|
|
||||||
#define NM_TYPE_AP (nm_ap_get_type ())
|
#define NM_TYPE_AP (nm_ap_get_type ())
|
||||||
#define NM_AP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AP, NMAccessPoint))
|
#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_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_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AP, NMAccessPointClass))
|
||||||
|
|
||||||
#define NM_AP_CAPABILITIES "capabilities"
|
#define NM_AP_FLAGS "flags"
|
||||||
#define NM_AP_ENCRYPTED "encrypted"
|
#define NM_AP_WPA_FLAGS "wpa-flags"
|
||||||
|
#define NM_AP_RSN_FLAGS "rsn-flags"
|
||||||
#define NM_AP_SSID "ssid"
|
#define NM_AP_SSID "ssid"
|
||||||
#define NM_AP_FREQUENCY "frequency"
|
#define NM_AP_FREQUENCY "frequency"
|
||||||
#define NM_AP_HW_ADDRESS "hw-address"
|
#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);
|
const GByteArray * nm_ap_get_ssid (const NMAccessPoint * ap);
|
||||||
void nm_ap_set_ssid (NMAccessPoint * ap, const GByteArray * ssid);
|
void nm_ap_set_ssid (NMAccessPoint * ap, const GByteArray * ssid);
|
||||||
|
|
||||||
guint32 nm_ap_get_capabilities (NMAccessPoint *ap);
|
guint32 nm_ap_get_flags (NMAccessPoint *ap);
|
||||||
void nm_ap_set_capabilities (NMAccessPoint *ap, guint32 capabilities);
|
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);
|
guint32 nm_ap_get_rsn_flags (NMAccessPoint *ap);
|
||||||
void nm_ap_set_security (NMAccessPoint *ap, NMAPSecurity *security);
|
void nm_ap_set_rsn_flags (NMAccessPoint *ap, guint32 flags);
|
||||||
|
|
||||||
const struct ether_addr * nm_ap_get_address (const NMAccessPoint *ap);
|
const struct ether_addr * nm_ap_get_address (const NMAccessPoint *ap);
|
||||||
void nm_ap_set_address (NMAccessPoint *ap, const struct ether_addr *addr);
|
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);
|
GSList * nm_ap_get_user_addresses (const NMAccessPoint *ap);
|
||||||
void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list);
|
void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list);
|
||||||
|
|
||||||
void nm_ap_add_capabilities_from_security (NMAccessPoint *ap, NMAPSecurity *security);
|
guint32 nm_ap_add_security_from_ie (guint32 flags,
|
||||||
void nm_ap_add_capabilities_from_ie (NMAccessPoint *ap, const guint8 *wpa_ie, guint32 length);
|
const guint8 *wpa_ie,
|
||||||
void nm_ap_add_capabilities_for_wep (NMAccessPoint *ap);
|
guint32 length);
|
||||||
|
|
||||||
void nm_ap_print_self (NMAccessPoint *ap, const char * prefix);
|
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))))
|
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_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));
|
nm_ap_set_timestamp_via_timestamp (dest_ap, nm_ap_get_timestamp (src_ap));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -36,7 +36,6 @@
|
|||||||
#include "NetworkManagerAP.h"
|
#include "NetworkManagerAP.h"
|
||||||
#include "NetworkManagerAPList.h"
|
#include "NetworkManagerAPList.h"
|
||||||
#include "NetworkManagerPolicy.h"
|
#include "NetworkManagerPolicy.h"
|
||||||
#include "nm-dbus-nmi.h"
|
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "nm-dhcp-manager.h"
|
#include "nm-dhcp-manager.h"
|
||||||
#include "nm-dbus-manager.h"
|
#include "nm-dbus-manager.h"
|
||||||
@@ -111,8 +110,7 @@ nm_dbus_nmi_signal_handler (DBusConnection *connection,
|
|||||||
DBUS_TYPE_INVALID)) {
|
DBUS_TYPE_INVALID)) {
|
||||||
/* Update a single wireless network's data */
|
/* Update a single wireless network's data */
|
||||||
nm_debug ("NetworkManagerInfo triggered update of wireless network '%s'", network);
|
nm_debug ("NetworkManagerInfo triggered update of wireless network '%s'", network);
|
||||||
nm_dbus_update_one_allowed_network (network,
|
// FIXME: convert to connection update signal
|
||||||
(NMData *) g_object_get_data (G_OBJECT (manager), "NM_DATA_HACK"));
|
|
||||||
handled = TRUE;
|
handled = TRUE;
|
||||||
}
|
}
|
||||||
} else if (dbus_message_is_signal (message, NMI_DBUS_INTERFACE, "UserInterfaceActivated")) {
|
} else if (dbus_message_is_signal (message, NMI_DBUS_INTERFACE, "UserInterfaceActivated")) {
|
||||||
|
@@ -35,11 +35,11 @@
|
|||||||
#include "NetworkManagerDbus.h"
|
#include "NetworkManagerDbus.h"
|
||||||
#include "nm-activation-request.h"
|
#include "nm-activation-request.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "nm-dbus-nmi.h"
|
|
||||||
#include "nm-device-interface.h"
|
#include "nm-device-interface.h"
|
||||||
#include "nm-device-802-11-wireless.h"
|
#include "nm-device-802-11-wireless.h"
|
||||||
#include "nm-device-802-3-ethernet.h"
|
#include "nm-device-802-3-ethernet.h"
|
||||||
#include "nm-dbus-manager.h"
|
#include "nm-dbus-manager.h"
|
||||||
|
#include "nm-setting.h"
|
||||||
|
|
||||||
struct NMPolicy {
|
struct NMPolicy {
|
||||||
NMManager *manager;
|
NMManager *manager;
|
||||||
@@ -367,7 +367,7 @@ nm_policy_device_change_check (gpointer user_data)
|
|||||||
connection = create_connection (new_dev, ap);
|
connection = create_connection (new_dev, ap);
|
||||||
if (connection)
|
if (connection)
|
||||||
nm_device_interface_activate (NM_DEVICE_INTERFACE (new_dev),
|
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.");
|
nm_info ("Updating allowed wireless network lists.");
|
||||||
|
|
||||||
/* Query info daemon for network lists if its now running */
|
// FIXME: convert to getting connections instead
|
||||||
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);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -38,17 +38,8 @@
|
|||||||
#include "NetworkManagerUtils.h"
|
#include "NetworkManagerUtils.h"
|
||||||
#include "NetworkManagerMain.h"
|
#include "NetworkManagerMain.h"
|
||||||
#include "nm-device.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 "NetworkManagerAPList.h"
|
||||||
#include "NetworkManagerPolicy.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-3-ethernet.h"
|
||||||
#include "nm-device-802-11-wireless.h"
|
#include "nm-device-802-11-wireless.h"
|
||||||
#include "NetworkManagerDialup.h"
|
#include "NetworkManagerDialup.h"
|
||||||
@@ -387,144 +378,6 @@ found:
|
|||||||
free (buf);
|
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 ();
|
sys_data->config = nm_ip4_config_new ();
|
||||||
|
|
||||||
if (!sys_data->use_dhcp || sys_data->system_disabled)
|
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 {
|
typedef struct {
|
||||||
NMConnection *connection;
|
NMConnection *connection;
|
||||||
|
char *specific_object;
|
||||||
gboolean user_requested;
|
gboolean user_requested;
|
||||||
} NMActRequestPrivate;
|
} NMActRequestPrivate;
|
||||||
|
|
||||||
@@ -43,6 +44,8 @@ finalize (GObject *object)
|
|||||||
|
|
||||||
nm_connection_destroy (priv->connection);
|
nm_connection_destroy (priv->connection);
|
||||||
|
|
||||||
|
g_free (priv->specific_object);
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_act_request_parent_class)->finalize (object);
|
G_OBJECT_CLASS (nm_act_request_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +60,9 @@ nm_act_request_class_init (NMActRequestClass *req_class)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NMActRequest *
|
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;
|
GObject *obj;
|
||||||
NMActRequestPrivate *priv;
|
NMActRequestPrivate *priv;
|
||||||
@@ -72,6 +77,8 @@ nm_act_request_new (NMConnection *connection, gboolean user_requested)
|
|||||||
|
|
||||||
priv->connection = connection;
|
priv->connection = connection;
|
||||||
priv->user_requested = user_requested;
|
priv->user_requested = user_requested;
|
||||||
|
if (specific_object)
|
||||||
|
priv->specific_object = g_strdup (specific_object);
|
||||||
|
|
||||||
return NM_ACT_REQUEST (obj);
|
return NM_ACT_REQUEST (obj);
|
||||||
}
|
}
|
||||||
@@ -84,6 +91,14 @@ nm_act_request_get_connection (NMActRequest *req)
|
|||||||
return NM_ACT_REQUEST_GET_PRIVATE (req)->connection;
|
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
|
gboolean
|
||||||
nm_act_request_get_user_requested (NMActRequest *req)
|
nm_act_request_get_user_requested (NMActRequest *req)
|
||||||
{
|
{
|
||||||
|
@@ -44,9 +44,11 @@ typedef struct {
|
|||||||
GType nm_act_request_get_type (void);
|
GType nm_act_request_get_type (void);
|
||||||
|
|
||||||
NMActRequest *nm_act_request_new (NMConnection *connection,
|
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);
|
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);
|
gboolean nm_act_request_get_user_requested (NMActRequest *req);
|
||||||
|
|
||||||
#endif /* NM_ACTIVATION_REQUEST_H */
|
#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 "NetworkManagerUtils.h"
|
||||||
#include "NetworkManagerPolicy.h"
|
#include "NetworkManagerPolicy.h"
|
||||||
#include "nm-activation-request.h"
|
#include "nm-activation-request.h"
|
||||||
#include "nm-dbus-nmi.h"
|
|
||||||
#include "nm-supplicant-manager.h"
|
#include "nm-supplicant-manager.h"
|
||||||
#include "nm-supplicant-interface.h"
|
#include "nm-supplicant-interface.h"
|
||||||
#include "nm-supplicant-config.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);
|
nm_ap_set_address (ap, &new_bssid);
|
||||||
|
|
||||||
automatic = !nm_act_request_get_user_requested (nm_device_get_act_request (NM_DEVICE (self)));
|
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;
|
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
|
static guint32
|
||||||
get_wireless_capabilities (NMDevice80211Wireless *self,
|
get_wireless_capabilities (NMDevice80211Wireless *self,
|
||||||
iwrange * range,
|
iwrange * range,
|
||||||
guint32 data_len)
|
guint32 data_len)
|
||||||
{
|
{
|
||||||
guint32 minlen;
|
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 (self != NULL, NM_802_11_DEVICE_CAP_NONE);
|
||||||
g_return_val_if_fail (range != NULL, NM_802_11_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);
|
minlen = ((char *) &range->enc_capa) - (char *) range + sizeof (range->enc_capa);
|
||||||
|
|
||||||
/* All drivers should support WEP by default */
|
/* All drivers should support WEP by default */
|
||||||
caps |= (NM_802_11_CAP_CIPHER_WEP40 | NM_802_11_CAP_CIPHER_WEP104);
|
caps |= NM_802_11_DEVICE_CAP_CIPHER_WEP40 | NM_802_11_DEVICE_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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ((data_len >= minlen) && range->we_version_compiled >= 18) {
|
||||||
if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)
|
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)
|
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;
|
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)) {
|
if (!blacklisted && (curtime->tv_sec > best_timestamp.tv_sec)) {
|
||||||
best_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
best_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
||||||
best_ap = scan_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;
|
return best_ap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static gboolean
|
static gboolean
|
||||||
nm_device_802_11_wireless_set_activation_ap (NMDevice80211Wireless *self,
|
nm_device_802_11_wireless_set_activation_ap (NMDevice80211Wireless *self,
|
||||||
GByteArray *ssid,
|
GByteArray *ssid,
|
||||||
@@ -1009,7 +1019,7 @@ nm_device_802_11_wireless_set_activation_ap (NMDevice80211Wireless *self,
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nm_device_802_11_wireless_ap_list_clear
|
* nm_device_802_11_wireless_ap_list_clear
|
||||||
@@ -1757,66 +1767,50 @@ out:
|
|||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
ap_need_key (NMDevice80211Wireless *self,
|
ap_need_secrets (NMDevice80211Wireless *self,
|
||||||
NMAccessPoint *ap,
|
NMAccessPoint *ap,
|
||||||
gboolean *ask_user)
|
NMConnection *connection,
|
||||||
|
gboolean *ask_user)
|
||||||
{
|
{
|
||||||
const GByteArray * ssid;
|
const GByteArray * ssid;
|
||||||
gboolean need_key = FALSE;
|
gboolean need_key = FALSE;
|
||||||
NMAPSecurity * security;
|
const char * iface;
|
||||||
const char * iface;
|
const char * esc_ssid;
|
||||||
int we_cipher;
|
guint32 flags, wpa_flags, rsn_flags;
|
||||||
const char * esc_ssid = NULL;
|
|
||||||
|
|
||||||
|
g_return_val_if_fail (self != NULL, FALSE);
|
||||||
g_return_val_if_fail (ap != 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);
|
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));
|
iface = nm_device_get_iface (NM_DEVICE (self));
|
||||||
|
|
||||||
if (!nm_ap_get_encrypted (ap))
|
ssid = nm_ap_get_ssid (ap);
|
||||||
{
|
esc_ssid = ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(null)";
|
||||||
nm_info ("Activation (%s/wireless): access point '%s' is unencrypted, no key needed.",
|
|
||||||
iface, esc_ssid ? esc_ssid : "(null)");
|
|
||||||
|
|
||||||
/* If the user-specified security info doesn't overlap the
|
flags = nm_ap_get_flags (ap);
|
||||||
* scanned access point's info, create new info from the scanned
|
wpa_flags = nm_ap_get_wpa_flags (ap);
|
||||||
* characteristics of the access point. Can happen if the AP's
|
rsn_flags = nm_ap_get_rsn_flags (ap);
|
||||||
* settings were changed.
|
if ( !(flags & NM_802_11_AP_FLAGS_PRIVACY)
|
||||||
*/
|
&& (wpa_flags == NM_802_11_AP_SEC_NONE)
|
||||||
if (we_cipher != IW_AUTH_CIPHER_NONE)
|
&& (rsn_flags == NM_802_11_AP_SEC_NONE)) {
|
||||||
nm_ap_set_security (ap, nm_ap_security_new (nm_ap_get_capabilities (ap),
|
nm_info ("Activation (%s/wireless): access point '%s' has no security, "
|
||||||
nm_ap_get_encrypted (ap)));
|
"no key needed.",
|
||||||
}
|
iface, esc_ssid);
|
||||||
else
|
} else {
|
||||||
{
|
if (nm_connection_have_secrets (connection)) {
|
||||||
if ( !nm_ap_security_get_key (security)
|
nm_info ("Activation (%s/wireless): access point '%s' has security"
|
||||||
|| (we_cipher == IW_AUTH_CIPHER_NONE))
|
", and secrets exist. No new secrets needed.",
|
||||||
{
|
iface, esc_ssid ? esc_ssid : "(null)");
|
||||||
nm_info ("Activation (%s/wireless): access point '%s' "
|
} else {
|
||||||
"is encrypted, but NO valid key exists. New key needed.",
|
nm_info ("Activation (%s/wireless): access point '%s' has security,"
|
||||||
iface, esc_ssid ? esc_ssid : "(null)");
|
" but secrets are required.",
|
||||||
|
iface, esc_ssid);
|
||||||
need_key = TRUE;
|
need_key = TRUE;
|
||||||
|
|
||||||
/* If the user-specified security info doesn't overlap the
|
/* FIXME: how to determine when to explicitly ask the user for
|
||||||
* scanned access point's info, ask the user for a completely
|
* secrets...
|
||||||
* new key.
|
|
||||||
*/
|
*/
|
||||||
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
|
* Checks whether or not there is an encryption key present for
|
||||||
* this connection, and whether or not the authentication method
|
* 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
|
* Similarly, Open System WEP access points don't reject a station
|
||||||
* when the key is wrong. Shared Key WEP access points will.
|
* 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
|
static gboolean
|
||||||
ap_is_auth_required (NMAccessPoint *ap, gboolean *has_key)
|
ap_auth_enforced (NMAccessPoint *ap)
|
||||||
{
|
{
|
||||||
NMAPSecurity *security;
|
guint32 flags, wpa_flags, rsn_flags;
|
||||||
int we_cipher;
|
|
||||||
gboolean auth_required = FALSE;
|
|
||||||
|
|
||||||
g_return_val_if_fail (ap != NULL, FALSE);
|
g_return_val_if_fail (ap != NULL, FALSE);
|
||||||
g_return_val_if_fail (has_key != NULL, FALSE);
|
|
||||||
|
|
||||||
*has_key = FALSE;
|
if (nm_ap_get_mode (ap) == IW_MODE_ADHOC)
|
||||||
|
|
||||||
/* 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)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* No encryption obviously means no possiblity of auth
|
flags = nm_ap_get_flags (ap);
|
||||||
* rejection due to a wrong encryption key.
|
wpa_flags = nm_ap_get_wpa_flags (ap);
|
||||||
*/
|
rsn_flags = nm_ap_get_rsn_flags (ap);
|
||||||
security = nm_ap_get_security (ap);
|
|
||||||
we_cipher = nm_ap_security_get_we_cipher (security);
|
|
||||||
if (we_cipher == IW_AUTH_CIPHER_NONE)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
auth_required = nm_ap_security_get_authentication_required (security);
|
if (flags & NM_802_11_AP_FLAGS_PRIVACY)
|
||||||
*has_key = TRUE;
|
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);
|
nm_ap_list_iter_free (iter);
|
||||||
|
|
||||||
if (found_ap) {
|
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_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_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_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
|
/* If the AP is noticed in a scan, it's automatically no longer
|
||||||
* artificial, since it clearly exists somewhere.
|
* artificial, since it clearly exists somewhere.
|
||||||
@@ -2178,13 +2156,13 @@ link_timeout_cb (gpointer user_data)
|
|||||||
* another one.
|
* another one.
|
||||||
*/
|
*/
|
||||||
if ((nm_device_get_state (dev) == NM_DEVICE_STATE_CONFIG)
|
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 */
|
/* Association/authentication failed, we must have bad encryption key */
|
||||||
nm_info ("Activation (%s/wireless): disconnected during association,"
|
nm_info ("Activation (%s/wireless): disconnected during association,"
|
||||||
" asking for new key.", nm_device_get_iface (dev));
|
" asking for new key.", nm_device_get_iface (dev));
|
||||||
cleanup_association_attempt (self, TRUE);
|
cleanup_association_attempt (self, TRUE);
|
||||||
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
|
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 {
|
} else {
|
||||||
nm_info ("%s: link timed out.", nm_device_get_iface (dev));
|
nm_info ("%s: link timed out.", nm_device_get_iface (dev));
|
||||||
nm_device_set_active_link (dev, FALSE);
|
nm_device_set_active_link (dev, FALSE);
|
||||||
@@ -2546,27 +2524,28 @@ supplicant_connection_timeout_cb (gpointer user_data)
|
|||||||
|
|
||||||
cleanup_association_attempt (self, TRUE);
|
cleanup_association_attempt (self, TRUE);
|
||||||
|
|
||||||
/* Timed out waiting for authentication success; if the security method
|
/* Timed out waiting for authentication success; if the security in use
|
||||||
* in use does not require access point side authentication (Open System
|
* does not require access point side authentication (Open System
|
||||||
* WEP, for example) then we are likely using the wrong authentication
|
* WEP, for example) then we are likely using the wrong authentication
|
||||||
* algorithm or key. Request new one from the user.
|
* algorithm or key. Request new one from the user.
|
||||||
*/
|
*/
|
||||||
if (!ap_is_auth_required (ap, &has_key) && has_key) {
|
if (ap_auth_enforced (ap)) {
|
||||||
/* 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 (nm_device_is_activating (dev)) {
|
if (nm_device_is_activating (dev)) {
|
||||||
|
/* Kicked off by the authenticator most likely */
|
||||||
nm_info ("Activation (%s/wireless): association took too long, "
|
nm_info ("Activation (%s/wireless): association took too long, "
|
||||||
"failing activation.",
|
"failing activation.",
|
||||||
nm_device_get_iface (dev));
|
nm_device_get_iface (dev));
|
||||||
|
|
||||||
nm_device_state_changed (dev, NM_DEVICE_STATE_FAILED);
|
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;
|
return FALSE;
|
||||||
@@ -2650,10 +2629,14 @@ build_supplicant_config (NMDevice80211Wireless *self)
|
|||||||
goto error;
|
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),
|
if (!nm_ap_security_write_supplicant_config (nm_ap_get_security (ap),
|
||||||
config,
|
config,
|
||||||
is_adhoc))
|
is_adhoc))
|
||||||
goto error;
|
goto error;
|
||||||
|
#endif
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return config;
|
return config;
|
||||||
@@ -2700,7 +2683,11 @@ real_act_stage1_prepare (NMDevice *dev)
|
|||||||
setting = (NMSettingWireless *) nm_connection_get_setting (nm_act_request_get_connection (req),
|
setting = (NMSettingWireless *) nm_connection_get_setting (nm_act_request_get_connection (req),
|
||||||
"802-11-wireless");
|
"802-11-wireless");
|
||||||
g_assert (setting);
|
g_assert (setting);
|
||||||
|
#if 0
|
||||||
success = nm_device_802_11_wireless_set_activation_ap (self, setting->ssid, NULL);
|
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;
|
return success ? NM_ACT_STAGE_RETURN_SUCCESS : NM_ACT_STAGE_RETURN_FAILURE;
|
||||||
}
|
}
|
||||||
@@ -2710,21 +2697,30 @@ static NMActStageReturn
|
|||||||
real_act_stage2_config (NMDevice *dev)
|
real_act_stage2_config (NMDevice *dev)
|
||||||
{
|
{
|
||||||
NMDevice80211Wireless * self = NM_DEVICE_802_11_WIRELESS (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;
|
NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
|
||||||
const char * iface = nm_device_get_iface (dev);
|
const char * iface = nm_device_get_iface (dev);
|
||||||
gboolean ask_user = FALSE;
|
gboolean ask_user = FALSE;
|
||||||
|
NMAccessPoint * ap;
|
||||||
NMSupplicantConfig * config = NULL;
|
NMSupplicantConfig * config = NULL;
|
||||||
gulong id = 0;
|
gulong id = 0;
|
||||||
|
NMActRequest * req;
|
||||||
g_assert (ap);
|
NMConnection * connection;
|
||||||
|
|
||||||
remove_supplicant_timeouts (self);
|
remove_supplicant_timeouts (self);
|
||||||
|
|
||||||
/* If we need an encryption key, get one */
|
ap = nm_device_802_11_wireless_get_activation_ap (self);
|
||||||
if (ap_need_key (self, ap, &ask_user)) {
|
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_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;
|
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);
|
NMAccessPoint * ap = nm_device_802_11_wireless_get_activation_ap (self);
|
||||||
NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
|
NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
|
||||||
NMIP4Config * real_config = NULL;
|
NMIP4Config * real_config = NULL;
|
||||||
NMAPSecurity * security;
|
|
||||||
gboolean has_key;
|
gboolean has_key;
|
||||||
|
|
||||||
g_return_val_if_fail (config != NULL, NM_ACT_STAGE_RETURN_FAILURE);
|
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);
|
g_assert (ap);
|
||||||
|
|
||||||
security = nm_ap_get_security (ap);
|
/* If nothing checks the security authentication information (as in
|
||||||
g_assert (security);
|
* Open System WEP for example), and DHCP times out, then
|
||||||
|
|
||||||
/* If the security credentials' validity was not checked by any
|
|
||||||
* peer during authentication process, and DHCP times out, then
|
|
||||||
* the encryption key is likely wrong. Ask the user for a new one.
|
* 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);
|
const GByteArray * ssid = nm_ap_get_ssid (ap);
|
||||||
|
|
||||||
/* Activation failed, we must have bad encryption key */
|
/* 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),
|
nm_device_get_iface (dev),
|
||||||
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)");
|
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)");
|
||||||
nm_device_state_changed (dev, NM_DEVICE_STATE_NEED_AUTH);
|
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;
|
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;
|
NMDevice80211WirelessClass * klass;
|
||||||
NMDeviceClass * parent_class;
|
NMDeviceClass * parent_class;
|
||||||
|
|
||||||
@@ -2876,9 +2865,7 @@ real_act_stage4_ip_config_timeout (NMDevice *dev,
|
|||||||
klass = NM_DEVICE_802_11_WIRELESS_GET_CLASS (self);
|
klass = NM_DEVICE_802_11_WIRELESS_GET_CLASS (self);
|
||||||
parent_class = NM_DEVICE_CLASS (g_type_class_peek_parent (klass));
|
parent_class = NM_DEVICE_CLASS (g_type_class_peek_parent (klass));
|
||||||
ret = parent_class->act_stage4_ip_config_timeout (dev, &real_config);
|
ret = parent_class->act_stage4_ip_config_timeout (dev, &real_config);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Non-encrypted network and IP configure failed. Alert the user. */
|
/* Non-encrypted network and IP configure failed. Alert the user. */
|
||||||
ret = NM_ACT_STAGE_RETURN_FAILURE;
|
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)))
|
if (!nm_ap_get_address (ap) || !nm_ethernet_address_is_valid (nm_ap_get_address (ap)))
|
||||||
nm_ap_set_address (ap, &addr);
|
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 = NM_DEVICE_CLASS (g_type_class_peek_parent (klass));
|
||||||
parent_class->activation_cancel_handler (dev);
|
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);
|
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,
|
g_param_spec_uint (NM_DEVICE_802_11_WIRELESS_CAPABILITIES,
|
||||||
"Wireless Capabilities",
|
"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));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/* Signals */
|
/* Signals */
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
static gboolean impl_device_activate (NMDeviceInterface *device,
|
static gboolean impl_device_activate (NMDeviceInterface *device,
|
||||||
GHashTable *connection_hash,
|
GHashTable *connection_hash,
|
||||||
|
const char *specific_object,
|
||||||
GError **err);
|
GError **err);
|
||||||
|
|
||||||
static gboolean impl_device_deactivate (NMDeviceInterface *device, GError **err);
|
static gboolean impl_device_deactivate (NMDeviceInterface *device, GError **err);
|
||||||
@@ -156,17 +157,22 @@ nm_device_interface_get_type (void)
|
|||||||
void
|
void
|
||||||
nm_device_interface_activate (NMDeviceInterface *device,
|
nm_device_interface_activate (NMDeviceInterface *device,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
const char *specific_object,
|
||||||
gboolean user_requested)
|
gboolean user_requested)
|
||||||
{
|
{
|
||||||
g_return_if_fail (NM_IS_DEVICE_INTERFACE (device));
|
g_return_if_fail (NM_IS_DEVICE_INTERFACE (device));
|
||||||
g_return_if_fail (connection != NULL);
|
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
|
static gboolean
|
||||||
impl_device_activate (NMDeviceInterface *device,
|
impl_device_activate (NMDeviceInterface *device,
|
||||||
GHashTable *connection_hash,
|
GHashTable *connection_hash,
|
||||||
|
const char *specific_object,
|
||||||
GError **err)
|
GError **err)
|
||||||
{
|
{
|
||||||
NMConnection *connection;
|
NMConnection *connection;
|
||||||
@@ -174,7 +180,7 @@ impl_device_activate (NMDeviceInterface *device,
|
|||||||
connection = nm_connection_new_from_hash (connection_hash);
|
connection = nm_connection_new_from_hash (connection_hash);
|
||||||
nm_connection_dump (connection);
|
nm_connection_dump (connection);
|
||||||
|
|
||||||
nm_device_interface_activate (device, connection, TRUE);
|
nm_device_interface_activate (device, connection, specific_object, TRUE);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -45,7 +45,10 @@ struct _NMDeviceInterface {
|
|||||||
GTypeInterface g_iface;
|
GTypeInterface g_iface;
|
||||||
|
|
||||||
/* Methods */
|
/* 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);
|
void (*deactivate) (NMDeviceInterface *device);
|
||||||
|
|
||||||
/* Signals */
|
/* Signals */
|
||||||
@@ -57,6 +60,7 @@ GType nm_device_interface_get_type (void);
|
|||||||
|
|
||||||
void nm_device_interface_activate (NMDeviceInterface *device,
|
void nm_device_interface_activate (NMDeviceInterface *device,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
const char *specific_object,
|
||||||
gboolean user_requested);
|
gboolean user_requested);
|
||||||
|
|
||||||
void nm_device_interface_deactivate (NMDeviceInterface *device);
|
void nm_device_interface_deactivate (NMDeviceInterface *device);
|
||||||
|
@@ -34,7 +34,6 @@
|
|||||||
#include "NetworkManagerSystem.h"
|
#include "NetworkManagerSystem.h"
|
||||||
#include "nm-dhcp-manager.h"
|
#include "nm-dhcp-manager.h"
|
||||||
#include "nm-dbus-manager.h"
|
#include "nm-dbus-manager.h"
|
||||||
#include "nm-dbus-nmi.h"
|
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "autoip.h"
|
#include "autoip.h"
|
||||||
#include "nm-netlink.h"
|
#include "nm-netlink.h"
|
||||||
@@ -83,6 +82,7 @@ struct _NMDevicePrivate
|
|||||||
|
|
||||||
static void nm_device_activate (NMDeviceInterface *device,
|
static void nm_device_activate (NMDeviceInterface *device,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
const char *specific_object,
|
||||||
gboolean user_requested);
|
gboolean user_requested);
|
||||||
|
|
||||||
static void nm_device_activate_schedule_stage5_ip_config_commit (NMDevice *self);
|
static void nm_device_activate_schedule_stage5_ip_config_commit (NMDevice *self);
|
||||||
@@ -1059,6 +1059,7 @@ nm_device_deactivate (NMDeviceInterface *device)
|
|||||||
static void
|
static void
|
||||||
nm_device_activate (NMDeviceInterface *device,
|
nm_device_activate (NMDeviceInterface *device,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
const char *specific_object,
|
||||||
gboolean user_requested)
|
gboolean user_requested)
|
||||||
{
|
{
|
||||||
NMDevice *self = NM_DEVICE (device);
|
NMDevice *self = NM_DEVICE (device);
|
||||||
@@ -1081,7 +1082,7 @@ nm_device_activate (NMDeviceInterface *device,
|
|||||||
}
|
}
|
||||||
|
|
||||||
nm_info ("Activating device %s", nm_device_get_iface (self));
|
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);
|
nm_device_activate_schedule_stage1_device_prepare (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,6 +34,133 @@
|
|||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "nm-dbus-manager.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 *
|
static DBusMessage *
|
||||||
new_invalid_vpn_connection_error (DBusMessage *replyto)
|
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;
|
const char *active_bssid = (const char *) user_data;
|
||||||
GString *str;
|
GString *str;
|
||||||
gboolean active = FALSE;
|
gboolean active = FALSE;
|
||||||
guint32 capabilities;
|
guint32 flags, wpa_flags, rsn_flags;
|
||||||
GByteArray * ssid;
|
GByteArray * ssid;
|
||||||
char *tmp;
|
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) {
|
if (active_bssid) {
|
||||||
char *current_bssid = nm_access_point_get_hw_address (ap);
|
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_rate (ap) / 1024,
|
||||||
nm_access_point_get_strength (ap));
|
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: ");
|
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");
|
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");
|
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");
|
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");
|
g_string_append (str, " Enterprise");
|
||||||
|
|
||||||
/* FIXME: broadcast/hidden */
|
/* FIXME: broadcast/hidden */
|
||||||
@@ -277,20 +284,20 @@ detail_device (gpointer data, gpointer user_data)
|
|||||||
|
|
||||||
/* Wireless specific information */
|
/* Wireless specific information */
|
||||||
if ((NM_IS_DEVICE_802_11_WIRELESS (device))) {
|
if ((NM_IS_DEVICE_802_11_WIRELESS (device))) {
|
||||||
guint32 wireless_caps;
|
guint32 wcaps;
|
||||||
NMAccessPoint *active_ap = NULL;
|
NMAccessPoint *active_ap = NULL;
|
||||||
char *active_bssid = NULL;
|
char *active_bssid = NULL;
|
||||||
GSList *networks;
|
GSList *networks;
|
||||||
|
|
||||||
printf ("\n Wireless Settings\n");
|
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");
|
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");
|
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");
|
print_string (" WPA2 Encryption", "yes");
|
||||||
|
|
||||||
if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) {
|
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);
|
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 */
|
#endif /* NM_UTILS_H */
|
||||||
|
Reference in New Issue
Block a user