mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-06 04:28:29 +02:00
2005-12-15 Dan Williams <dcbw@redhat.com>
* Exorcise encryption key hashing on APs * Use libnm-util's serialization/deserialization in both the applet and NM * Random other stuff git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1198 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
parent
a5e6d64c1b
commit
7b37a13850
21 changed files with 417 additions and 553 deletions
|
|
@ -1,3 +1,10 @@
|
|||
2005-12-15 Dan Williams <dcbw@redhat.com>
|
||||
|
||||
* Exorcise encryption key hashing on APs
|
||||
* Use libnm-util's serialization/deserialization in both the
|
||||
applet and NM
|
||||
* Random other stuff
|
||||
|
||||
2005-12-15 Robert Love <rml@novell.com>
|
||||
|
||||
* gnome/applet/menu-items.c: A new icon, "network-wireless-encrypted"
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ static gboolean append_dbus_params_func (WirelessSecurityOption *opt, const char
|
|||
auth_combo = glade_xml_get_widget (opt->uixml, opt->data->auth_combo_name);
|
||||
auth_alg = wso_wep_auth_combo_get_auth_alg (opt, GTK_COMBO_BOX (auth_combo));
|
||||
|
||||
nmu_dbus_message_append_wep_args (message, cipher, ssid, input, auth_alg);
|
||||
nmu_security_serialize_wep_with_cipher (message, cipher, ssid, input, auth_alg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ static gboolean append_dbus_params_func (WirelessSecurityOption *opt, const char
|
|||
auth_combo = glade_xml_get_widget (opt->uixml, opt->data->auth_combo_name);
|
||||
auth_alg = wso_wep_auth_combo_get_auth_alg (opt, GTK_COMBO_BOX (auth_combo));
|
||||
|
||||
nmu_dbus_message_append_wep_args (message, cipher, ssid, input, auth_alg);
|
||||
nmu_security_serialize_wep_with_cipher (message, cipher, ssid, input, auth_alg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ static gboolean append_dbus_params_func (WirelessSecurityOption *opt, const char
|
|||
auth_combo = glade_xml_get_widget (opt->uixml, opt->data->auth_combo_name);
|
||||
auth_alg = wso_wep_auth_combo_get_auth_alg (opt, GTK_COMBO_BOX (auth_combo));
|
||||
|
||||
nmu_dbus_message_append_wep_args (message, cipher, ssid, input, auth_alg);
|
||||
nmu_security_serialize_wep_with_cipher (message, cipher, ssid, input, auth_alg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ static gboolean append_dbus_params_func (WirelessSecurityOption *opt, const char
|
|||
if (!wso_validate_helper (opt, ssid, input, &cipher) || !cipher)
|
||||
return FALSE;
|
||||
|
||||
nmu_dbus_message_append_wpa_psk_args (message, cipher, ssid, input,
|
||||
nmu_security_serialize_wpa_psk_with_cipher (message, cipher, ssid, input,
|
||||
IW_AUTH_WPA_VERSION_WPA, IW_AUTH_KEY_MGMT_PSK);
|
||||
|
||||
return TRUE;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ INCLUDES = -I${top_srcdir} \
|
|||
-I${top_srcdir}/src/named-manager \
|
||||
-I${top_srcdir}/src/vpn-manager \
|
||||
-I${top_srcdir}/src/dhcp-manager \
|
||||
-I${top_srcdir}/utils
|
||||
-I${top_srcdir}/utils \
|
||||
-I${top_srcdir}/libnm-util
|
||||
|
||||
bin_PROGRAMS = NetworkManager
|
||||
|
||||
|
|
@ -70,15 +71,8 @@ NetworkManager_CPPFLAGS = \
|
|||
-DDATADIR=\"$(datadir)\" \
|
||||
-DSYSCONFDIR=\"$(sysconfdir)\" \
|
||||
-DARP_DEBUG
|
||||
if WITH_GCRYPT
|
||||
NetworkManager_CPPFLAGS += $(LIBGCRYPT_CFLAGS)
|
||||
endif
|
||||
|
||||
|
||||
if !WITH_GCRYPT
|
||||
NetworkManager_SOURCES += gnome-keyring-md5.c gnome-keyring-md5.h
|
||||
endif
|
||||
|
||||
NetworkManager_LDADD = \
|
||||
$(DBUS_LIBS) \
|
||||
$(GTHREAD_LIBS) \
|
||||
|
|
@ -89,11 +83,8 @@ NetworkManager_LDADD = \
|
|||
./named-manager/libnamed-manager.la \
|
||||
./vpn-manager/libvpn-manager.la \
|
||||
./dhcp-manager/libdhcp-manager.la \
|
||||
./backends/libnmbackend.la
|
||||
|
||||
if WITH_GCRYPT
|
||||
NetworkManager_LDADD += $(LIBGCRYPT_LIBS)
|
||||
endif
|
||||
./backends/libnmbackend.la \
|
||||
$(top_builddir)/libnm-util/libnm-util.la
|
||||
|
||||
dbusservicedir = $(DBUS_SYS_DIR)
|
||||
dbusservice_DATA = NetworkManager.conf
|
||||
|
|
|
|||
|
|
@ -163,10 +163,14 @@ void nm_ap_unref (NMAccessPoint *ap)
|
|||
g_slist_foreach (ap->user_addresses, (GFunc)g_free, NULL);
|
||||
g_slist_free (ap->user_addresses);
|
||||
|
||||
if (ap->security)
|
||||
g_object_unref (G_OBJECT (ap->security));
|
||||
|
||||
ap->essid = NULL;
|
||||
ap->enc_key = NULL;
|
||||
|
||||
g_free (ap);
|
||||
memset (ap, 0, sizeof (NMAccessPoint));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -217,64 +221,6 @@ void nm_ap_set_essid (NMAccessPoint *ap, const char * essid)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get/set functions for encryption key
|
||||
*
|
||||
*/
|
||||
const char * nm_ap_get_enc_key_source (const NMAccessPoint *ap)
|
||||
{
|
||||
g_return_val_if_fail (ap != NULL, NULL);
|
||||
|
||||
return (ap->enc_key);
|
||||
}
|
||||
|
||||
void nm_ap_set_enc_key_source (NMAccessPoint *ap, const char * key, NMEncKeyType type)
|
||||
{
|
||||
g_return_if_fail (ap != NULL);
|
||||
|
||||
if (ap->enc_key)
|
||||
g_free (ap->enc_key);
|
||||
|
||||
ap->enc_key = g_strdup (key);
|
||||
ap->enc_type = type;
|
||||
}
|
||||
|
||||
char *nm_ap_get_enc_key_hashed (const NMAccessPoint *ap)
|
||||
{
|
||||
char * hashed = NULL;
|
||||
const char * source_key;
|
||||
|
||||
g_return_val_if_fail (ap != NULL, NULL);
|
||||
|
||||
source_key = nm_ap_get_enc_key_source (ap);
|
||||
switch (ap->enc_type)
|
||||
{
|
||||
case (NM_ENC_TYPE_128_BIT_PASSPHRASE):
|
||||
if (source_key)
|
||||
hashed = nm_wireless_128bit_key_from_passphrase (source_key);
|
||||
break;
|
||||
case (NM_ENC_TYPE_ASCII_KEY):
|
||||
if (source_key){
|
||||
if(strlen(source_key)<=5)
|
||||
hashed = nm_wireless_64bit_ascii_to_hex (source_key);
|
||||
else
|
||||
hashed = nm_wireless_128bit_ascii_to_hex (source_key);
|
||||
}
|
||||
break;
|
||||
case (NM_ENC_TYPE_HEX_KEY):
|
||||
case (NM_ENC_TYPE_UNKNOWN):
|
||||
if (source_key)
|
||||
hashed = g_strdup (source_key);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (hashed);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get/set functions for encrypted flag
|
||||
*
|
||||
|
|
@ -328,6 +274,35 @@ void nm_ap_set_auth_method (NMAccessPoint *ap, int auth_method)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Accessorts for AP security info
|
||||
*
|
||||
*/
|
||||
NMAPSecurity * nm_ap_get_security (const NMAccessPoint *ap)
|
||||
{
|
||||
g_return_val_if_fail (ap != NULL, NULL);
|
||||
|
||||
return ap->security;
|
||||
}
|
||||
|
||||
void nm_ap_set_security (NMAccessPoint *ap, NMAPSecurity *security)
|
||||
{
|
||||
g_return_if_fail (ap != NULL);
|
||||
|
||||
if (ap->security)
|
||||
{
|
||||
g_object_unref (G_OBJECT (ap->security));
|
||||
ap->security = NULL;
|
||||
}
|
||||
|
||||
if (security)
|
||||
{
|
||||
g_object_ref (G_OBJECT (security));
|
||||
ap->security = security;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get/set functions for address
|
||||
*
|
||||
|
|
@ -591,11 +566,7 @@ void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list)
|
|||
g_return_if_fail (ap != NULL);
|
||||
|
||||
/* Free existing list */
|
||||
for (elt = ap->user_addresses; elt; elt = g_slist_next (elt))
|
||||
{
|
||||
if (elt->data)
|
||||
g_free (elt->data);
|
||||
}
|
||||
g_slist_foreach (ap->user_addresses, (GFunc) g_free, NULL);
|
||||
|
||||
/* Copy new list and set as our own */
|
||||
for (elt = list; elt; elt = g_slist_next (elt))
|
||||
|
|
@ -608,33 +579,6 @@ void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list)
|
|||
}
|
||||
|
||||
|
||||
gboolean nm_ap_is_enc_key_valid (NMAccessPoint *ap)
|
||||
{
|
||||
const char *key;
|
||||
NMEncKeyType key_type;
|
||||
|
||||
g_return_val_if_fail (ap != NULL, FALSE);
|
||||
|
||||
key = nm_ap_get_enc_key_source (ap);
|
||||
key_type = nm_ap_get_enc_type (ap);
|
||||
|
||||
if (nm_is_enc_key_valid (key, key_type))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean nm_is_enc_key_valid (const char *key, NMEncKeyType key_type)
|
||||
{
|
||||
if ( key
|
||||
&& strlen (key)
|
||||
&& (key_type != NM_ENC_TYPE_UNKNOWN)
|
||||
&& (key_type != NM_ENC_TYPE_NONE))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean nm_ap_has_manufacturer_default_essid (NMAccessPoint *ap)
|
||||
{
|
||||
int i;
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <time.h>
|
||||
#include "NetworkManager.h"
|
||||
#include "wpa.h"
|
||||
#include "nm-ap-security.h"
|
||||
|
||||
typedef struct NMAccessPoint NMAccessPoint;
|
||||
|
||||
|
|
@ -42,9 +43,6 @@ void nm_ap_set_timestamp (NMAccessPoint *ap, const GTimeVal *timestamp);
|
|||
char * nm_ap_get_essid (const NMAccessPoint *ap);
|
||||
void nm_ap_set_essid (NMAccessPoint *ap, const char *essid);
|
||||
|
||||
const char * nm_ap_get_enc_key_source (const NMAccessPoint *ap);
|
||||
char * nm_ap_get_enc_key_hashed (const NMAccessPoint *ap);
|
||||
void nm_ap_set_enc_key_source (NMAccessPoint *ap, const char *key, NMEncKeyType type);
|
||||
NMEncKeyType nm_ap_get_enc_type (const NMAccessPoint *ap);
|
||||
|
||||
int nm_ap_get_auth_method (const NMAccessPoint *ap);
|
||||
|
|
@ -53,6 +51,9 @@ void nm_ap_set_auth_method (NMAccessPoint *ap, int auth_method);
|
|||
gboolean nm_ap_get_encrypted (const NMAccessPoint *ap);
|
||||
void nm_ap_set_encrypted (NMAccessPoint *ap, gboolean privacy);
|
||||
|
||||
NMAPSecurity * nm_ap_get_security (const NMAccessPoint *ap);
|
||||
void nm_ap_set_security (NMAccessPoint *ap, NMAPSecurity *security);
|
||||
|
||||
const struct ether_addr * nm_ap_get_address (const NMAccessPoint *ap);
|
||||
void nm_ap_set_address (NMAccessPoint *ap, const struct ether_addr *addr);
|
||||
|
||||
|
|
@ -89,10 +90,6 @@ void nm_ap_set_user_created (NMAccessPoint *ap, gboolean user_created);
|
|||
GSList * nm_ap_get_user_addresses (const NMAccessPoint *ap);
|
||||
void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list);
|
||||
|
||||
/* Helper */
|
||||
gboolean nm_ap_is_enc_key_valid (NMAccessPoint *ap);
|
||||
gboolean nm_is_enc_key_valid (const char *key, NMEncKeyType key_type);
|
||||
|
||||
void nm_ap_set_capabilities_from_wpa_ie (NMAccessPoint *ap, const guint8 *wpa_ie, guint32 length);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -528,17 +528,7 @@ void nm_ap_list_copy_properties (NMAccessPointList *dest, NMAccessPointList *sou
|
|||
if ((src_ap = nm_ap_list_get_ap_by_essid (source, nm_ap_get_essid (dest_ap))))
|
||||
{
|
||||
nm_ap_set_invalid (dest_ap, nm_ap_get_invalid (src_ap));
|
||||
nm_ap_set_enc_key_source (dest_ap, nm_ap_get_enc_key_source (src_ap), nm_ap_get_enc_type (src_ap));
|
||||
if (nm_ap_get_auth_method (src_ap) != -1)
|
||||
{
|
||||
/* Ensure that we don't set the NONE auth method from the src_ap
|
||||
* if the dest_ap has encryption enabled.
|
||||
*/
|
||||
if (nm_ap_get_encrypted (dest_ap) && (nm_ap_get_auth_method (src_ap) != 0))
|
||||
nm_ap_set_auth_method (dest_ap, nm_ap_get_auth_method (src_ap));
|
||||
else if (!nm_ap_get_encrypted (dest_ap))
|
||||
nm_ap_set_auth_method (dest_ap, 0);
|
||||
}
|
||||
nm_ap_set_security (dest_ap, nm_ap_get_security (src_ap));
|
||||
nm_ap_set_timestamp (dest_ap, nm_ap_get_timestamp (src_ap));
|
||||
}
|
||||
}
|
||||
|
|
@ -789,10 +779,11 @@ void nm_ap_list_print_members (NMAccessPointList *list, const char *name)
|
|||
nm_warning ("AP_LIST_PRINT: printing members of '%s'", name);
|
||||
while ((ap = nm_ap_list_iter_next (iter)))
|
||||
{
|
||||
const GTimeVal *timestamp = nm_ap_get_timestamp (ap);
|
||||
const GTimeVal *seen = nm_ap_get_last_seen (ap);
|
||||
const GTimeVal * timestamp = nm_ap_get_timestamp (ap);
|
||||
const GTimeVal * seen = nm_ap_get_last_seen (ap);
|
||||
NMAPSecurity * security = nm_ap_get_security (ap);
|
||||
nm_warning ("\t%d)\tobj=%p, essid='%s', timestamp=%ld, key='%s', enc=%d, addr=%p, strength=%d, %s=%f, rate=%d, inval=%d, mode=%d, seen=%ld",
|
||||
i, ap, nm_ap_get_essid (ap), timestamp->tv_sec, nm_ap_get_enc_key_source (ap), nm_ap_get_encrypted (ap),
|
||||
i, ap, nm_ap_get_essid (ap), timestamp->tv_sec, nm_ap_security_get_key (security), nm_ap_get_encrypted (ap),
|
||||
nm_ap_get_address (ap), nm_ap_get_strength (ap), (nm_ap_get_freq (ap) < 20) ? "channel" : "freq", nm_ap_get_freq (ap), nm_ap_get_rate (ap),
|
||||
nm_ap_get_invalid (ap), nm_ap_get_mode (ap), seen->tv_sec);
|
||||
i++;
|
||||
|
|
|
|||
|
|
@ -605,45 +605,48 @@ void nm_dbus_cancel_get_user_key_for_network (DBusConnection *connection, NMActR
|
|||
* Tell NetworkManagerInfo the updated info of the AP
|
||||
*
|
||||
*/
|
||||
gboolean nm_dbus_update_network_info (DBusConnection *connection, NMAccessPoint *ap, const gboolean user_requested)
|
||||
gboolean nm_dbus_update_network_info (DBusConnection *connection, NMAccessPoint *ap, const gboolean automatic)
|
||||
{
|
||||
DBusMessage * message;
|
||||
gboolean success = FALSE;
|
||||
dbus_int32_t auth_method;
|
||||
const char * essid;
|
||||
const char * enc_key_source;
|
||||
dbus_int32_t enc_key_type;
|
||||
DBusMessage * message;
|
||||
gboolean success = FALSE;
|
||||
const char * essid;
|
||||
NMAPSecurity * security;
|
||||
DBusMessageIter iter;
|
||||
|
||||
g_return_val_if_fail (connection != NULL, FALSE);
|
||||
g_return_val_if_fail (ap != NULL, FALSE);
|
||||
|
||||
auth_method = nm_ap_get_auth_method (ap);
|
||||
if (auth_method == -1)
|
||||
return FALSE;
|
||||
|
||||
essid = nm_ap_get_essid (ap);
|
||||
if (!(enc_key_source = nm_ap_get_enc_key_source (ap)))
|
||||
enc_key_source = "";
|
||||
enc_key_type = nm_ap_get_enc_type (ap);
|
||||
|
||||
if (!(message = dbus_message_new_method_call (NMI_DBUS_SERVICE, NMI_DBUS_PATH, NMI_DBUS_INTERFACE, "updateNetworkInfo")))
|
||||
{
|
||||
nm_warning ("nm_dbus_update_network_info(): Couldn't allocate the dbus message");
|
||||
return FALSE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dbus_message_append_args (message, DBUS_TYPE_STRING, &essid,
|
||||
DBUS_TYPE_STRING, &enc_key_source,
|
||||
DBUS_TYPE_INT32, &enc_key_type,
|
||||
DBUS_TYPE_INT32, &auth_method,
|
||||
DBUS_TYPE_BOOLEAN, &user_requested,
|
||||
DBUS_TYPE_INVALID);
|
||||
if (!dbus_connection_send (connection, message, NULL))
|
||||
nm_warning ("nm_dbus_update_network_info(): failed to send dbus message.");
|
||||
else
|
||||
success = TRUE;
|
||||
dbus_message_iter_init_append (message, &iter);
|
||||
|
||||
/* First argument: ESSID (STRING) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &essid);
|
||||
|
||||
/* Second argument: Automatic (BOOLEAN) */
|
||||
dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &automatic);
|
||||
|
||||
/* 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)
|
||||
goto unref;
|
||||
|
||||
if (dbus_connection_send (connection, message, NULL))
|
||||
success = TRUE;
|
||||
else
|
||||
nm_warning ("nm_dbus_update_network_info(): failed to send dbus message.");
|
||||
|
||||
unref:
|
||||
dbus_message_unref (message);
|
||||
|
||||
out:
|
||||
return success;
|
||||
}
|
||||
|
||||
|
|
@ -741,15 +744,17 @@ static void free_get_networks_cb_data (GetNetworksCBData *data)
|
|||
static void nm_dbus_get_network_data_cb (DBusPendingCall *pcall, void *user_data)
|
||||
{
|
||||
GetOneNetworkCBData * cb_data = (GetOneNetworkCBData *)user_data;
|
||||
DBusMessage * reply;
|
||||
DBusError error;
|
||||
DBusMessage * reply = NULL;
|
||||
DBusMessageIter iter;
|
||||
DBusMessageIter subiter;
|
||||
const char * essid = NULL;
|
||||
gint timestamp_secs = -1;
|
||||
NMEncKeyType key_type = -1;
|
||||
gboolean trusted = FALSE;
|
||||
int auth_method = -1;
|
||||
char ** addresses;
|
||||
int num_addresses;
|
||||
GSList * addr_list = NULL;
|
||||
NMAPSecurity * security;
|
||||
NMAccessPoint * ap;
|
||||
NMAccessPoint * list_ap;
|
||||
GTimeVal * timestamp;
|
||||
|
||||
g_return_if_fail (pcall != NULL);
|
||||
g_return_if_fail (cb_data != NULL);
|
||||
|
|
@ -759,79 +764,101 @@ static void nm_dbus_get_network_data_cb (DBusPendingCall *pcall, void *user_data
|
|||
|
||||
dbus_pending_call_ref (pcall);
|
||||
|
||||
if (!dbus_pending_call_get_completed (pcall))
|
||||
goto out;
|
||||
|
||||
if (!(reply = dbus_pending_call_steal_reply (pcall)))
|
||||
goto out;
|
||||
|
||||
if (dbus_message_is_error (reply, "BadNetworkData"))
|
||||
{
|
||||
dbus_message_unref (reply);
|
||||
nm_ap_list_remove_ap_by_essid (cb_data->list, cb_data->network);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dbus_error_init (&error);
|
||||
if (dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &essid,
|
||||
DBUS_TYPE_INT32, ×tamp_secs,
|
||||
DBUS_TYPE_INT32, &key_type,
|
||||
DBUS_TYPE_INT32, &auth_method,
|
||||
DBUS_TYPE_BOOLEAN, &trusted,
|
||||
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &addresses, &num_addresses,
|
||||
DBUS_TYPE_INVALID))
|
||||
if (message_is_error (reply))
|
||||
{
|
||||
if (timestamp_secs > 0)
|
||||
{
|
||||
NMAccessPoint * ap;
|
||||
NMAccessPoint * list_ap;
|
||||
GTimeVal * timestamp = g_new0 (GTimeVal, 1);
|
||||
GSList * addr_list = NULL;
|
||||
int i;
|
||||
DBusError err;
|
||||
|
||||
ap = nm_ap_new ();
|
||||
nm_ap_set_essid (ap, essid);
|
||||
|
||||
timestamp->tv_sec = timestamp_secs;
|
||||
timestamp->tv_usec = 0;
|
||||
nm_ap_set_timestamp (ap, timestamp);
|
||||
g_free (timestamp);
|
||||
|
||||
nm_ap_set_trusted (ap, trusted);
|
||||
nm_ap_set_auth_method (ap, auth_method);
|
||||
|
||||
/* We get the actual key when we try to connect, use NULL for now. */
|
||||
nm_ap_set_enc_key_source (ap, NULL, key_type);
|
||||
|
||||
for (i = 0; i < num_addresses; i++)
|
||||
if (strlen (addresses[i]) >= 11)
|
||||
addr_list = g_slist_append (addr_list, g_strdup (addresses[i]));
|
||||
nm_ap_set_user_addresses (ap, addr_list);
|
||||
|
||||
if ((list_ap = nm_ap_list_get_ap_by_essid (cb_data->list, essid)))
|
||||
{
|
||||
nm_ap_set_essid (list_ap, nm_ap_get_essid (ap));
|
||||
nm_ap_set_timestamp (list_ap, nm_ap_get_timestamp (ap));
|
||||
nm_ap_set_trusted (list_ap, nm_ap_get_trusted (ap));
|
||||
nm_ap_set_enc_key_source (list_ap, nm_ap_get_enc_key_source (ap), nm_ap_get_enc_type (ap));
|
||||
nm_ap_set_auth_method (list_ap, nm_ap_get_auth_method (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);
|
||||
}
|
||||
nm_ap_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);
|
||||
}
|
||||
dbus_free_string_array (addresses);
|
||||
dbus_error_init (&err);
|
||||
dbus_set_error_from_message (&err, reply);
|
||||
nm_warning ("nm_dbus_get_network_data_cb(): dbus returned an error.\n (%s) %s\n", err.name, err.message);
|
||||
dbus_error_free (&err);
|
||||
goto out;
|
||||
}
|
||||
dbus_message_unref (reply);
|
||||
|
||||
dbus_message_iter_init (reply, &iter);
|
||||
|
||||
/* First arg: ESSID (STRING) */
|
||||
if (!dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING)
|
||||
goto out;
|
||||
dbus_message_iter_get_basic (&iter, &essid);
|
||||
|
||||
/* Second arg: Timestamp (INT32) */
|
||||
if (!dbus_message_iter_next (&iter)
|
||||
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_INT32))
|
||||
goto out;
|
||||
dbus_message_iter_get_basic (&iter, ×tamp_secs);
|
||||
|
||||
/* Third arg: trusted (BOOLEAN) */
|
||||
if (!dbus_message_iter_next (&iter)
|
||||
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_BOOLEAN))
|
||||
goto out;
|
||||
dbus_message_iter_get_basic (&iter, &trusted);
|
||||
|
||||
/* 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))
|
||||
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 (!(security = nm_ap_security_new_deserialize (&iter)))
|
||||
goto out;
|
||||
|
||||
/* Construct the new access point */
|
||||
ap = nm_ap_new ();
|
||||
nm_ap_set_essid (ap, essid);
|
||||
nm_ap_set_security (ap, security);
|
||||
|
||||
timestamp = g_malloc0 (sizeof (GTimeVal));
|
||||
timestamp->tv_sec = timestamp_secs;
|
||||
timestamp->tv_usec = 0;
|
||||
nm_ap_set_timestamp (ap, timestamp);
|
||||
g_free (timestamp);
|
||||
|
||||
nm_ap_set_trusted (ap, trusted);
|
||||
nm_ap_set_user_addresses (ap, addr_list);
|
||||
|
||||
if ((list_ap = nm_ap_list_get_ap_by_essid (cb_data->list, essid)))
|
||||
{
|
||||
nm_ap_set_essid (list_ap, nm_ap_get_essid (ap));
|
||||
nm_ap_set_timestamp (list_ap, nm_ap_get_timestamp (ap));
|
||||
nm_ap_set_trusted (list_ap, nm_ap_get_trusted (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);
|
||||
}
|
||||
nm_ap_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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2124,37 +2124,6 @@ NMActRequest *nm_device_get_act_request (NMDevice *dev)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_initial_auth_method
|
||||
*
|
||||
* Update the auth method of the AP from the last-known-good one saved in the allowed list
|
||||
* (which is found from NMI) and ensure that its valid with the encryption status of the AP.
|
||||
*
|
||||
*/
|
||||
static int get_initial_auth_method (NMAccessPoint *ap, NMAccessPointList *allowed_list)
|
||||
{
|
||||
g_return_val_if_fail (ap != NULL, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
|
||||
if (nm_ap_get_encrypted (ap))
|
||||
{
|
||||
int auth = nm_ap_get_auth_method (ap);
|
||||
NMAccessPoint *allowed_ap = nm_ap_list_get_ap_by_essid (allowed_list, nm_ap_get_essid (ap));
|
||||
|
||||
/* Prefer default auth method if we found one for this AP in our allowed list. */
|
||||
if (allowed_ap)
|
||||
auth = nm_ap_get_auth_method (allowed_ap);
|
||||
|
||||
if ( (auth == IW_AUTH_ALG_OPEN_SYSTEM)
|
||||
|| (auth == IW_AUTH_ALG_SHARED_KEY))
|
||||
return (auth);
|
||||
else
|
||||
return (IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* nm_device_activate_stage1_device_prepare
|
||||
*
|
||||
|
|
@ -2163,9 +2132,10 @@ static int get_initial_auth_method (NMAccessPoint *ap, NMAccessPointList *allowe
|
|||
*/
|
||||
static gboolean nm_device_activate_stage1_device_prepare (NMActRequest *req)
|
||||
{
|
||||
NMDevice * dev;
|
||||
NMData * data;
|
||||
NMAccessPoint * ap;
|
||||
NMDevice * dev;
|
||||
NMData * data;
|
||||
NMAccessPoint *ap;
|
||||
NMAPSecurity * security;
|
||||
|
||||
g_return_val_if_fail (req != NULL, FALSE);
|
||||
|
||||
|
|
@ -2177,28 +2147,6 @@ static gboolean nm_device_activate_stage1_device_prepare (NMActRequest *req)
|
|||
|
||||
nm_info ("Activation (%s) Stage 1 (Device Prepare) started...", nm_device_get_iface (dev));
|
||||
|
||||
if (nm_device_is_802_11_wireless (dev))
|
||||
{
|
||||
ap = nm_act_request_get_ap (req);
|
||||
g_assert (ap);
|
||||
|
||||
if (nm_ap_get_artificial (ap))
|
||||
{
|
||||
/* Some Cisco cards (340/350 PCMCIA) don't return non-broadcasting APs
|
||||
* in their scan results, so we can't know beforehand whether or not the
|
||||
* AP was encrypted. We have to update their encryption status on the fly.
|
||||
*/
|
||||
if (nm_ap_get_encrypted (ap) || nm_ap_is_enc_key_valid (ap))
|
||||
{
|
||||
nm_ap_set_encrypted (ap, TRUE);
|
||||
nm_ap_set_auth_method (ap, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
}
|
||||
}
|
||||
|
||||
/* Initial authentication method */
|
||||
nm_ap_set_auth_method (ap, get_initial_auth_method (ap, data->allowed_ap_list));
|
||||
}
|
||||
|
||||
if (nm_device_activation_should_cancel (dev))
|
||||
nm_device_schedule_activation_handle_cancel (req);
|
||||
else
|
||||
|
|
@ -2279,14 +2227,17 @@ static gboolean nm_device_is_up_and_associated_wait (NMDevice *dev, int timeout,
|
|||
*/
|
||||
static gboolean nm_device_set_wireless_config (NMDevice *dev, NMAccessPoint *ap)
|
||||
{
|
||||
int auth;
|
||||
const char *essid = NULL;
|
||||
const char * essid = NULL;
|
||||
NMAPSecurity * security;
|
||||
int we_cipher;
|
||||
|
||||
g_return_val_if_fail (dev != NULL, FALSE);
|
||||
g_return_val_if_fail (nm_device_is_802_11_wireless (dev), FALSE);
|
||||
g_return_val_if_fail (ap != NULL, FALSE);
|
||||
g_return_val_if_fail (nm_ap_get_essid (ap) != NULL, FALSE);
|
||||
g_return_val_if_fail (nm_ap_get_auth_method (ap) != -1, FALSE);
|
||||
|
||||
security = nm_ap_get_security (ap);
|
||||
g_return_val_if_fail (security != NULL, FALSE);
|
||||
|
||||
dev->options.wireless.failed_link_count = 0;
|
||||
|
||||
|
|
@ -2297,7 +2248,6 @@ static gboolean nm_device_set_wireless_config (NMDevice *dev, NMAccessPoint *ap)
|
|||
nm_device_set_mode (dev, IW_MODE_INFRA);
|
||||
|
||||
essid = nm_ap_get_essid (ap);
|
||||
auth = nm_ap_get_auth_method (ap);
|
||||
|
||||
nm_device_set_mode (dev, nm_ap_get_mode (ap));
|
||||
nm_device_set_bitrate (dev, 0);
|
||||
|
|
@ -2307,29 +2257,13 @@ static gboolean nm_device_set_wireless_config (NMDevice *dev, NMAccessPoint *ap)
|
|||
else
|
||||
nm_device_set_frequency (dev, 0); /* auto */
|
||||
|
||||
if (nm_ap_get_encrypted (ap) && nm_ap_is_enc_key_valid (ap))
|
||||
{
|
||||
char * hashed_key = nm_ap_get_enc_key_hashed (ap);
|
||||
|
||||
if (auth == 0)
|
||||
{
|
||||
nm_ap_set_auth_method (ap, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
nm_warning ("Activation (%s/wireless): AP '%s' said it was encrypted, but had "
|
||||
"'none' for authentication method. Using Open System authentication method.",
|
||||
nm_device_get_iface (dev), nm_ap_get_essid (ap));
|
||||
}
|
||||
nm_device_set_enc_key (dev, hashed_key, auth);
|
||||
g_free (hashed_key);
|
||||
}
|
||||
else
|
||||
nm_device_set_enc_key (dev, NULL, 0);
|
||||
/* FIXME: set card's config using wpa_supplicant, not ourselves */
|
||||
nm_ap_security_device_setup (security, dev);
|
||||
|
||||
nm_device_set_essid (dev, essid);
|
||||
|
||||
nm_info ("Activation (%s/wireless): using essid '%s', with %s authentication.",
|
||||
nm_device_get_iface (dev), essid, (auth == 0) ? "no" :
|
||||
((auth == IW_AUTH_ALG_OPEN_SYSTEM) ? "Open System" :
|
||||
((auth == IW_AUTH_ALG_SHARED_KEY) ? "Shared Key" : "unknown")));
|
||||
nm_info ("Activation (%s/wireless): using essid '%s', with '%s' security.",
|
||||
nm_device_get_iface (dev), essid, nm_ap_security_get_description (security));
|
||||
|
||||
/* Bring the device up and pause to allow card to associate. After we set the ESSID
|
||||
* on the card, the card has to scan all channels to find our requested AP (which can
|
||||
|
|
@ -2557,6 +2491,7 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess
|
|||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static gboolean ap_need_key (NMDevice *dev, NMAccessPoint *ap)
|
||||
{
|
||||
char *essid;
|
||||
|
|
@ -2591,6 +2526,7 @@ static gboolean ap_need_key (NMDevice *dev, NMAccessPoint *ap)
|
|||
|
||||
return need_key;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
|
|
@ -2621,11 +2557,14 @@ static void nm_device_wireless_configure (NMActRequest *req)
|
|||
|
||||
nm_info ("Activation (%s/wireless) Stage 2 (Device Configure) will connect to access point '%s'.", nm_device_get_iface (dev), nm_ap_get_essid (ap));
|
||||
|
||||
#if 0
|
||||
// FIXME
|
||||
if (ap_need_key (dev, ap))
|
||||
{
|
||||
nm_dbus_get_user_key_for_network (data->dbus_connection, req, FALSE);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (success == FALSE)
|
||||
{
|
||||
|
|
@ -3461,16 +3400,7 @@ void nm_device_set_user_key_for_network (NMActRequest *req, const char *key, con
|
|||
}
|
||||
else
|
||||
{
|
||||
NMAccessPoint * allowed_ap;
|
||||
|
||||
/* Start off at Open System auth mode with the new key */
|
||||
nm_ap_set_auth_method (ap, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
nm_ap_set_enc_key_source (ap, key, enc_type);
|
||||
|
||||
/* Be sure to update NMI with the new auth mode */
|
||||
if ((allowed_ap = nm_ap_list_get_ap_by_essid (data->allowed_ap_list, nm_ap_get_essid (ap))))
|
||||
nm_ap_set_auth_method (allowed_ap, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
|
||||
/* nm_ap_set_security (ap, security) */
|
||||
nm_device_activate_schedule_stage1_device_prepare (req);
|
||||
}
|
||||
}
|
||||
|
|
@ -3718,6 +3648,9 @@ NMAccessPoint * nm_device_get_best_ap (NMDevice *dev)
|
|||
{
|
||||
const GTimeVal *curtime = nm_ap_get_timestamp (tmp_ap);
|
||||
|
||||
/* Only connect to a blacklisted AP if the user has connected
|
||||
* to this specific AP before.
|
||||
*/
|
||||
gboolean blacklisted = nm_ap_has_manufacturer_default_essid (scan_ap);
|
||||
if (blacklisted)
|
||||
{
|
||||
|
|
@ -3748,15 +3681,13 @@ NMAccessPoint * nm_device_get_best_ap (NMDevice *dev)
|
|||
{
|
||||
trusted_latest_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
||||
trusted_best_ap = scan_ap;
|
||||
/* Merge access point data (mainly to get updated WEP key) */
|
||||
nm_ap_set_enc_key_source (trusted_best_ap, nm_ap_get_enc_key_source (tmp_ap), nm_ap_get_enc_type (tmp_ap));
|
||||
nm_ap_set_security (trusted_best_ap, nm_ap_get_security (tmp_ap));
|
||||
}
|
||||
else if (!blacklisted && !nm_ap_get_trusted (tmp_ap) && (curtime->tv_sec > untrusted_latest_timestamp.tv_sec))
|
||||
{
|
||||
untrusted_latest_timestamp = *nm_ap_get_timestamp (tmp_ap);
|
||||
untrusted_best_ap = scan_ap;
|
||||
/* Merge access point data (mainly to get updated WEP key) */
|
||||
nm_ap_set_enc_key_source (untrusted_best_ap, nm_ap_get_enc_key_source (tmp_ap), nm_ap_get_enc_type (tmp_ap));
|
||||
nm_ap_set_security (untrusted_best_ap, nm_ap_get_security (tmp_ap));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3786,16 +3717,10 @@ NMAccessPoint * nm_device_wireless_get_activation_ap (NMDevice *dev, const char
|
|||
g_return_val_if_fail (dev != NULL, NULL);
|
||||
g_return_val_if_fail (dev->app_data != NULL, NULL);
|
||||
g_return_val_if_fail (essid != NULL, NULL);
|
||||
g_return_val_if_fail (security != NULL, NULL);
|
||||
|
||||
nm_debug ("Forcing AP '%s'", essid);
|
||||
|
||||
#if 0
|
||||
if ( key
|
||||
&& strlen (key)
|
||||
&& (key_type != NM_ENC_TYPE_UNKNOWN)
|
||||
&& (key_type != NM_ENC_TYPE_NONE))
|
||||
encrypted = TRUE;
|
||||
|
||||
/* Find the AP in our card's scan list first.
|
||||
* If its not there, create an entirely new AP.
|
||||
*/
|
||||
|
|
@ -3806,11 +3731,6 @@ NMAccessPoint * nm_device_wireless_get_activation_ap (NMDevice *dev, const char
|
|||
*/
|
||||
ap = nm_ap_new ();
|
||||
nm_ap_set_essid (ap, essid);
|
||||
nm_ap_set_encrypted (ap, encrypted);
|
||||
if (encrypted)
|
||||
nm_ap_set_auth_method (ap, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
else
|
||||
nm_ap_set_auth_method (ap, 0);
|
||||
nm_ap_set_artificial (ap, TRUE);
|
||||
nm_ap_list_append_ap (nm_device_ap_list_get (dev), ap);
|
||||
nm_ap_unref (ap);
|
||||
|
|
@ -3822,20 +3742,7 @@ NMAccessPoint * nm_device_wireless_get_activation_ap (NMDevice *dev, const char
|
|||
*/
|
||||
nm_ap_list_remove_ap_by_essid (dev->app_data->invalid_ap_list, nm_ap_get_essid (ap));
|
||||
}
|
||||
|
||||
/* Now that this AP has an essid, copy over encryption keys and whatnot */
|
||||
if ((tmp_ap = nm_ap_list_get_ap_by_essid (dev->app_data->allowed_ap_list, nm_ap_get_essid (ap))))
|
||||
{
|
||||
nm_ap_set_enc_key_source (ap, nm_ap_get_enc_key_source (tmp_ap), nm_ap_get_enc_type (tmp_ap));
|
||||
nm_ap_set_auth_method (ap, nm_ap_get_auth_method (tmp_ap));
|
||||
nm_ap_set_invalid (ap, nm_ap_get_invalid (tmp_ap));
|
||||
nm_ap_set_timestamp (ap, nm_ap_get_timestamp (tmp_ap));
|
||||
}
|
||||
|
||||
/* Use the encryption key and type the user sent us if its valid */
|
||||
if (encrypted)
|
||||
nm_ap_set_enc_key_source (ap, key, key_type);
|
||||
#endif
|
||||
nm_ap_set_security (ap, security);
|
||||
|
||||
return ap;
|
||||
}
|
||||
|
|
@ -3889,7 +3796,7 @@ static void nm_device_fake_ap_list (NMDevice *dev)
|
|||
if ((list_ap = nm_ap_list_get_ap_by_essid (dev->app_data->allowed_ap_list, nm_ap_get_essid (nm_ap))))
|
||||
{
|
||||
nm_ap_set_timestamp (nm_ap, nm_ap_get_timestamp (list_ap));
|
||||
nm_ap_set_enc_key_source (nm_ap, nm_ap_get_enc_key_source (list_ap), nm_ap_get_enc_type (list_ap));
|
||||
nm_ap_set_security (nm_ap, nm_ap_get_security (list_ap));
|
||||
}
|
||||
|
||||
/* Add the AP to the device's AP list */
|
||||
|
|
|
|||
|
|
@ -22,11 +22,6 @@
|
|||
#include <stdio.h>
|
||||
#include <iwlib.h>
|
||||
#include "config.h"
|
||||
#ifdef HAVE_GCRYPT
|
||||
#include <gcrypt.h>
|
||||
#else
|
||||
#include "gnome-keyring-md5.h"
|
||||
#endif
|
||||
#include "NetworkManager.h"
|
||||
#include "NetworkManagerDevice.h"
|
||||
#include "NetworkManagerWireless.h"
|
||||
|
|
@ -34,96 +29,6 @@
|
|||
#include "NetworkManagerUtils.h"
|
||||
#include "utils/nm-utils.h"
|
||||
|
||||
/*
|
||||
* nm_wireless_64bit_ascii_to_hex
|
||||
*
|
||||
* Convert an ASCII string into a suitable WEP key.
|
||||
*
|
||||
*/
|
||||
char *nm_wireless_64bit_ascii_to_hex (const char *ascii)
|
||||
{
|
||||
static char hex_digits[] = "0123456789abcdef";
|
||||
char *res;
|
||||
int i;
|
||||
|
||||
res = g_malloc (33);
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
res[2*i] = hex_digits[(ascii[i] >> 4) & 0xf];
|
||||
res[2*i+1] = hex_digits[ascii[i] & 0xf];
|
||||
}
|
||||
|
||||
/* We chomp it at byte 10, since WEP keys only use 40 bits */
|
||||
res[10] = 0;
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* nm_wireless_128bit_ascii_to_hex
|
||||
*
|
||||
* Convert an ascii string into a suitable string for use
|
||||
* as a WEP key.
|
||||
*
|
||||
* Code originally by Alex Larsson <alexl@redhat.com> and
|
||||
* copyright Red Hat, Inc. under terms of the LGPL.
|
||||
*
|
||||
*/
|
||||
char *nm_wireless_128bit_ascii_to_hex (const char *ascii)
|
||||
{
|
||||
static char hex_digits[] = "0123456789abcdef";
|
||||
char *res;
|
||||
int i;
|
||||
|
||||
res = g_malloc (33);
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
res[2*i] = hex_digits[(ascii[i] >> 4) & 0xf];
|
||||
res[2*i+1] = hex_digits[ascii[i] & 0xf];
|
||||
}
|
||||
/* We chomp it at byte 26, since WEP keys only use 104 bits */
|
||||
res[26] = 0;
|
||||
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* nm_wireless_128bit_key_from_passphrase
|
||||
*
|
||||
* From a passphrase, generate a standard 128-bit WEP key using
|
||||
* MD5 algorithm.
|
||||
*
|
||||
*/
|
||||
char *nm_wireless_128bit_key_from_passphrase (const char *passphrase)
|
||||
{
|
||||
char md5_data[65];
|
||||
char digest[16];
|
||||
int passphrase_len;
|
||||
int i;
|
||||
|
||||
g_return_val_if_fail (passphrase != NULL, NULL);
|
||||
|
||||
passphrase_len = strlen (passphrase);
|
||||
if (passphrase_len < 1)
|
||||
return (NULL);
|
||||
|
||||
/* Get at least 64 bits */
|
||||
for (i = 0; i < 64; i++)
|
||||
md5_data [i] = passphrase [i % passphrase_len];
|
||||
|
||||
/* Null terminate md5 data-to-hash and hash it */
|
||||
md5_data[64] = 0;
|
||||
#ifdef HAVE_GCRYPT
|
||||
gcry_md_hash_buffer (GCRY_MD_MD5, digest, md5_data, 64);
|
||||
#else
|
||||
gnome_keyring_md5_string (md5_data, digest);
|
||||
#endif
|
||||
|
||||
return (nm_wireless_128bit_ascii_to_hex (digest));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* nm_wireless_stats_to_percent
|
||||
*
|
||||
|
|
|
|||
|
|
@ -28,10 +28,6 @@
|
|||
#include "NetworkManagerAPList.h"
|
||||
|
||||
|
||||
char * nm_wireless_64bit_ascii_to_hex (const char *ascii);
|
||||
char * nm_wireless_128bit_ascii_to_hex (const char *ascii);
|
||||
char * nm_wireless_128bit_key_from_passphrase (const char *passphrase);
|
||||
|
||||
int nm_wireless_qual_to_percent (const struct iw_quality *qual,
|
||||
const struct iw_quality *max_qual,
|
||||
const struct iw_quality *avg_qual);
|
||||
|
|
|
|||
|
|
@ -28,5 +28,6 @@ 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);
|
||||
|
||||
#endif /* NM_AP_SECURITY_PRIVATE_H */
|
||||
|
|
|
|||
|
|
@ -20,12 +20,15 @@
|
|||
*/
|
||||
|
||||
#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 "NetworkManagerDevice.h"
|
||||
|
||||
#define NM_AP_SECURITY_WEP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY_WEP, NMAPSecurityWEPPrivate))
|
||||
|
||||
|
|
@ -37,10 +40,10 @@ struct _NMAPSecurityWEPPrivate
|
|||
};
|
||||
|
||||
NMAPSecurityWEP *
|
||||
nm_ap_security_wep_new_from_dbus_message (DBusMessageIter *iter, int we_cipher)
|
||||
nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher)
|
||||
{
|
||||
NMAPSecurityWEP * security = NULL;
|
||||
char * key;
|
||||
char * key = NULL;
|
||||
int key_len;
|
||||
int auth_algorithm;
|
||||
DBusMessageIter subiter;
|
||||
|
|
@ -48,24 +51,7 @@ nm_ap_security_wep_new_from_dbus_message (DBusMessageIter *iter, int we_cipher)
|
|||
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);
|
||||
|
||||
/* Next arg: key (DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE) */
|
||||
if ((dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_ARRAY)
|
||||
|| (dbus_message_iter_get_element_type (iter) != DBUS_TYPE_BYTE))
|
||||
goto out;
|
||||
|
||||
dbus_message_iter_recurse (iter, &subiter);
|
||||
dbus_message_iter_get_fixed_array (&subiter, &key, &key_len);
|
||||
if (key_len <= 0)
|
||||
goto out;
|
||||
|
||||
/* Next arg: authentication algorithm (DBUS_TYPE_INT32) */
|
||||
if (!dbus_message_iter_next (iter))
|
||||
goto out;
|
||||
if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INT32)
|
||||
goto out;
|
||||
|
||||
dbus_message_iter_get_basic (iter, &auth_algorithm);
|
||||
if ((auth_algorithm != IW_AUTH_ALG_OPEN_SYSTEM) && (auth_algorithm != IW_AUTH_ALG_SHARED_KEY))
|
||||
if (!nmu_security_deserialize_wep (iter, &key, &key_len, &auth_algorithm))
|
||||
goto out;
|
||||
|
||||
/* Success, build up our security object */
|
||||
|
|
@ -74,16 +60,43 @@ nm_ap_security_wep_new_from_dbus_message (DBusMessageIter *iter, int we_cipher)
|
|||
nm_ap_security_set_key (NM_AP_SECURITY (security), key, key_len);
|
||||
security->priv->auth_algorithm = auth_algorithm;
|
||||
|
||||
if (we_cipher == IW_AUTH_CIPHER_WEP40)
|
||||
nm_ap_security_set_description (NM_AP_SECURITY (security), _("40-bit WEP"));
|
||||
else
|
||||
nm_ap_security_set_description (NM_AP_SECURITY (security), _("104-bit WEP"));
|
||||
|
||||
out:
|
||||
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 void
|
||||
real_write_wpa_supplicant_config (NMAPSecurity *instance, int fd)
|
||||
{
|
||||
NMAPSecurityWEP * self = NM_AP_SECURITY_WEP (instance);
|
||||
}
|
||||
|
||||
static int
|
||||
real_device_setup (NMAPSecurity *instance, NMDevice * dev)
|
||||
{
|
||||
NMAPSecurityWEP * self = NM_AP_SECURITY_WEP (instance);
|
||||
|
||||
nm_device_set_enc_key (dev, nm_ap_security_get_key (instance),
|
||||
self->priv->auth_algorithm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
nm_ap_security_wep_init (NMAPSecurityWEP * self)
|
||||
{
|
||||
|
|
@ -98,7 +111,9 @@ 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->serialize_func = real_serialize;
|
||||
par_class->write_wpa_supplicant_config_func = real_write_wpa_supplicant_config;
|
||||
par_class->device_setup_func = real_device_setup;
|
||||
|
||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityWEPPrivate));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,6 @@ struct _NMAPSecurityWEPClass
|
|||
|
||||
GType nm_ap_security_wep_get_type (void);
|
||||
|
||||
NMAPSecurityWEP * nm_ap_security_wep_new_from_dbus_message (DBusMessageIter *iter, int we_cipher);
|
||||
NMAPSecurityWEP * nm_ap_security_wep_new_deserialize (DBusMessageIter *iter, int we_cipher);
|
||||
|
||||
#endif /* NM_AP_SECURITY_WEP_H */
|
||||
|
|
|
|||
|
|
@ -20,12 +20,15 @@
|
|||
*/
|
||||
|
||||
#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 "NetworkManagerDevice.h"
|
||||
|
||||
#define NM_AP_SECURITY_WPA_PSK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY_WPA_PSK, NMAPSecurityWPA_PSKPrivate))
|
||||
|
||||
|
|
@ -38,7 +41,7 @@ struct _NMAPSecurityWPA_PSKPrivate
|
|||
};
|
||||
|
||||
NMAPSecurityWPA_PSK *
|
||||
nm_ap_security_wpa_psk_new_from_dbus_message (DBusMessageIter *iter, int we_cipher)
|
||||
nm_ap_security_wpa_psk_new_deserialize (DBusMessageIter *iter, int we_cipher)
|
||||
{
|
||||
NMAPSecurityWPA_PSK * security = NULL;
|
||||
char * key;
|
||||
|
|
@ -49,33 +52,7 @@ nm_ap_security_wpa_psk_new_from_dbus_message (DBusMessageIter *iter, int we_ciph
|
|||
g_return_val_if_fail (iter != NULL, NULL);
|
||||
g_return_val_if_fail ((we_cipher == IW_AUTH_CIPHER_TKIP) || (we_cipher == IW_AUTH_CIPHER_CCMP), NULL);
|
||||
|
||||
/* Next arg: key (DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE) */
|
||||
if ((dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_ARRAY)
|
||||
|| (dbus_message_iter_get_element_type (iter) != DBUS_TYPE_BYTE))
|
||||
goto out;
|
||||
|
||||
dbus_message_iter_get_fixed_array (iter, &key, &key_len);
|
||||
if (key_len <= 0)
|
||||
goto out;
|
||||
|
||||
/* Next arg: WPA version (DBUS_TYPE_INT32) */
|
||||
if (!dbus_message_iter_next (iter))
|
||||
goto out;
|
||||
if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INT32)
|
||||
goto out;
|
||||
|
||||
dbus_message_iter_get_basic (iter, &wpa_version);
|
||||
if ((wpa_version != IW_AUTH_WPA_VERSION_WPA) && (wpa_version != IW_AUTH_WPA_VERSION_WPA2))
|
||||
goto out;
|
||||
|
||||
/* Next arg: WPA key management (DBUS_TYPE_INT32) */
|
||||
if (!dbus_message_iter_next (iter))
|
||||
goto out;
|
||||
if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INT32)
|
||||
goto out;
|
||||
|
||||
dbus_message_iter_get_basic (iter, &key_mgt);
|
||||
if ((key_mgt != IW_AUTH_KEY_MGMT_PSK) && (key_mgt != IW_AUTH_KEY_MGMT_802_1X))
|
||||
if (!nmu_security_deserialize_wpa_psk (iter, &key, &key_len, &wpa_version, &key_mgt))
|
||||
goto out;
|
||||
|
||||
/* Success, build up our security object */
|
||||
|
|
@ -85,16 +62,41 @@ nm_ap_security_wpa_psk_new_from_dbus_message (DBusMessageIter *iter, int we_ciph
|
|||
security->priv->wpa_version = wpa_version;
|
||||
security->priv->key_mgt = key_mgt;
|
||||
|
||||
if (we_cipher == IW_AUTH_CIPHER_TKIP)
|
||||
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA TKIP"));
|
||||
else
|
||||
nm_ap_security_set_description (NM_AP_SECURITY (security), _("WPA CCMP"));
|
||||
|
||||
out:
|
||||
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 void
|
||||
real_write_wpa_supplicant_config (NMAPSecurity *instance, int fd)
|
||||
{
|
||||
NMAPSecurityWPA_PSK * self = NM_AP_SECURITY_WPA_PSK (instance);
|
||||
}
|
||||
|
||||
static int
|
||||
real_device_setup (NMAPSecurity *self, NMDevice * dev)
|
||||
{
|
||||
/* Stub; should be farmed out to wpa_supplicant eventually */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
nm_ap_security_wpa_psk_init (NMAPSecurityWPA_PSK * self)
|
||||
{
|
||||
|
|
@ -111,6 +113,7 @@ nm_ap_security_wpa_psk_class_init (NMAPSecurityWPA_PSKClass *klass)
|
|||
NMAPSecurityClass *par_class = NM_AP_SECURITY_CLASS (klass);
|
||||
|
||||
par_class->write_wpa_supplicant_config_func = real_write_wpa_supplicant_config;
|
||||
par_class->device_setup_func = real_device_setup;
|
||||
|
||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityWPA_PSKPrivate));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,6 @@ struct _NMAPSecurityWPA_PSKClass
|
|||
|
||||
GType nm_ap_security_wpa_psk_get_type (void);
|
||||
|
||||
NMAPSecurityWPA_PSK * nm_ap_security_wpa_psk_new_from_dbus_message (DBusMessageIter *iter, int we_cipher);
|
||||
NMAPSecurityWPA_PSK * nm_ap_security_wpa_psk_new_deserialize (DBusMessageIter *iter, int we_cipher);
|
||||
|
||||
#endif /* NM_AP_SECURITY_WPA_PSK_H */
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <dbus/dbus.h>
|
||||
#include <iwlib.h>
|
||||
|
||||
|
|
@ -27,6 +28,7 @@
|
|||
#include "nm-ap-security-private.h"
|
||||
#include "nm-ap-security-wep.h"
|
||||
#include "nm-ap-security-wpa-psk.h"
|
||||
#include "NetworkManagerDevice.h"
|
||||
|
||||
#define NM_AP_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_AP_SECURITY, NMAPSecurityPrivate))
|
||||
|
||||
|
|
@ -34,6 +36,7 @@ struct _NMAPSecurityPrivate
|
|||
{
|
||||
int we_cipher;
|
||||
char * key;
|
||||
char * description;
|
||||
|
||||
gboolean dispose_has_run;
|
||||
};
|
||||
|
|
@ -47,12 +50,13 @@ nm_ap_security_new (int we_cipher)
|
|||
|
||||
security = g_object_new (NM_TYPE_AP_SECURITY, NULL);
|
||||
security->priv->we_cipher = we_cipher;
|
||||
security->priv->key = NULL;
|
||||
return security;
|
||||
}
|
||||
|
||||
|
||||
NMAPSecurity *
|
||||
nm_ap_security_new_from_dbus_message (DBusMessageIter *iter)
|
||||
nm_ap_security_new_deserialize (DBusMessageIter *iter)
|
||||
{
|
||||
NMAPSecurity * security = NULL;
|
||||
int we_cipher;
|
||||
|
|
@ -76,12 +80,12 @@ nm_ap_security_new_from_dbus_message (DBusMessageIter *iter)
|
|||
{
|
||||
case IW_AUTH_CIPHER_WEP40:
|
||||
case IW_AUTH_CIPHER_WEP104:
|
||||
security = NM_AP_SECURITY (nm_ap_security_wep_new_from_dbus_message (iter, we_cipher));
|
||||
security = NM_AP_SECURITY (nm_ap_security_wep_new_deserialize (iter, we_cipher));
|
||||
break;
|
||||
|
||||
case IW_AUTH_CIPHER_TKIP:
|
||||
case IW_AUTH_CIPHER_CCMP:
|
||||
security = NM_AP_SECURITY (nm_ap_security_wpa_psk_new_from_dbus_message (iter, we_cipher));
|
||||
security = NM_AP_SECURITY (nm_ap_security_wpa_psk_new_deserialize (iter, we_cipher));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -93,7 +97,8 @@ out:
|
|||
return security;
|
||||
}
|
||||
|
||||
void nm_ap_security_write_wpa_supplicant_config (NMAPSecurity *self, int fd)
|
||||
void
|
||||
nm_ap_security_write_wpa_supplicant_config (NMAPSecurity *self, int fd)
|
||||
{
|
||||
g_return_if_fail (self != NULL);
|
||||
g_return_if_fail (fd >= 0);
|
||||
|
|
@ -133,33 +138,90 @@ nm_ap_security_set_key (NMAPSecurity *self, const char *key, int key_len)
|
|||
memcpy (self->priv->key, key, key_len);
|
||||
}
|
||||
|
||||
static int
|
||||
real_serialize (NMAPSecurity *self, DBusMessageIter *iter)
|
||||
{
|
||||
/* Nothing to do */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
real_write_wpa_supplicant_config (NMAPSecurity *self, int fd)
|
||||
{
|
||||
}
|
||||
|
||||
int nm_ap_security_get_we_cipher (NMAPSecurity *self)
|
||||
static int
|
||||
real_device_setup (NMAPSecurity *self, NMDevice * dev)
|
||||
{
|
||||
NMAPSecurityPrivate *priv;
|
||||
/* unencrypted */
|
||||
nm_device_set_enc_key (dev, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
nm_ap_security_get_we_cipher (NMAPSecurity *self)
|
||||
{
|
||||
g_return_val_if_fail (self != NULL, -1);
|
||||
|
||||
priv = NM_AP_SECURITY_GET_PRIVATE (self);
|
||||
|
||||
return priv->we_cipher;
|
||||
return self->priv->we_cipher;
|
||||
}
|
||||
|
||||
const char * nm_ap_security_get_key (NMAPSecurity *self)
|
||||
const char *
|
||||
nm_ap_security_get_key (NMAPSecurity *self)
|
||||
{
|
||||
NMAPSecurityPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (self != NULL, NULL);
|
||||
|
||||
priv = NM_AP_SECURITY_GET_PRIVATE (self);
|
||||
|
||||
return priv->key;
|
||||
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_device_setup (NMAPSecurity *self, NMDevice *dev)
|
||||
{
|
||||
g_return_val_if_fail (self != NULL, -1);
|
||||
g_return_val_if_fail (dev != NULL, -1);
|
||||
|
||||
if (self->priv->dispose_has_run)
|
||||
return -1;
|
||||
|
||||
return NM_AP_SECURITY_GET_CLASS (self)->device_setup_func (self, dev);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nm_ap_security_init (NMAPSecurity * self)
|
||||
{
|
||||
|
|
@ -167,6 +229,7 @@ nm_ap_security_init (NMAPSecurity * 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
|
||||
|
|
@ -213,7 +276,9 @@ nm_ap_security_class_init (NMAPSecurityClass *klass)
|
|||
object_class->dispose = nm_ap_security_dispose;
|
||||
object_class->finalize = nm_ap_security_finalize;
|
||||
|
||||
klass->serialize_func = real_serialize;
|
||||
klass->write_wpa_supplicant_config_func = real_write_wpa_supplicant_config;
|
||||
klass->device_setup_func = real_device_setup;
|
||||
|
||||
g_type_class_add_private (object_class, sizeof (NMAPSecurityPrivate));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,23 +44,35 @@ struct _NMAPSecurity
|
|||
NMAPSecurityPrivate *priv;
|
||||
};
|
||||
|
||||
struct NMDevice;
|
||||
|
||||
struct _NMAPSecurityClass
|
||||
{
|
||||
GObjectClass parent;
|
||||
|
||||
/* class members */
|
||||
void (*write_wpa_supplicant_config_func) (NMAPSecurity *self, int fd);
|
||||
int (*serialize_func) (NMAPSecurity *self, DBusMessageIter *iter);
|
||||
|
||||
void (*write_wpa_supplicant_config_func)(NMAPSecurity *self, int fd);
|
||||
|
||||
int (*device_setup_func) (NMAPSecurity *self, struct NMDevice * dev);
|
||||
};
|
||||
|
||||
|
||||
GType nm_ap_security_get_type (void);
|
||||
|
||||
NMAPSecurity * nm_ap_security_new_from_dbus_message (DBusMessageIter *iter);
|
||||
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);
|
||||
|
||||
void nm_ap_security_write_wpa_supplicant_config (NMAPSecurity *self, int fd);
|
||||
|
||||
int nm_ap_security_device_setup (NMAPSecurity *self, struct NMDevice *dev);
|
||||
|
||||
const char *nm_ap_security_get_description (NMAPSecurity *self);
|
||||
|
||||
#endif /* NM_AP_SECURITY_H */
|
||||
|
|
|
|||
|
|
@ -184,8 +184,8 @@ out:
|
|||
*/
|
||||
static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
|
||||
{
|
||||
#define INVALID_ARGS_ERROR "InvalidArguments"
|
||||
#define INVALID_ARGS_MESSAGE "NetworkManager::setActiveDevice called with invalid arguments."
|
||||
const char * INVALID_ARGS_ERROR = "InvalidArguments";
|
||||
const char * INVALID_ARGS_MESSAGE = "NetworkManager::setActiveDevice called with invalid arguments.";
|
||||
NMDevice * dev = NULL;
|
||||
DBusMessage * reply = NULL;
|
||||
char * dev_path;
|
||||
|
|
@ -224,7 +224,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
|
|||
NMAPSecurity * security = NULL;
|
||||
char * essid = NULL;
|
||||
|
||||
if (!dbus_message_iter_next (&iter))
|
||||
if (!dbus_message_iter_next (&iter) || (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
|
|
@ -232,19 +232,13 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
|
|||
|
||||
/* grab ssid and ensure validity */
|
||||
dbus_message_iter_get_basic (&iter, &essid);
|
||||
if (!essid || (strlen (essid) <= 0))
|
||||
if (!essid || (strlen (essid) <= 0) || !dbus_message_iter_next (&iter))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!dbus_message_iter_next (&iter))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(security = nm_ap_security_new_from_dbus_message (&iter)))
|
||||
if (!(security = nm_ap_security_new_deserialize (&iter)))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
|
|
@ -252,6 +246,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
|
|||
|
||||
/* Set up the wireless-specific activation request properties */
|
||||
ap = nm_device_wireless_get_activation_ap (dev, essid, security);
|
||||
g_object_unref (G_OBJECT (security));
|
||||
|
||||
nm_info ("User Switch: %s / %s", dev_path, essid);
|
||||
}
|
||||
|
|
@ -276,68 +271,76 @@ out:
|
|||
*/
|
||||
static DBusMessage *nm_dbus_nm_create_wireless_network (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
|
||||
{
|
||||
const char * INVALID_ARGS_ERROR = "InvalidArguments";
|
||||
const char * INVALID_ARGS_MESSAGE = "NetworkManager::createWirelessNetwork called with invalid arguments.";
|
||||
NMDevice * dev = NULL;
|
||||
DBusMessage * reply = NULL;
|
||||
char * dev_path = NULL;
|
||||
char * unescaped_dev_path = NULL;
|
||||
NMAccessPoint * new_ap = NULL;
|
||||
char * network = NULL;
|
||||
char * key = NULL;
|
||||
int key_type = -1;
|
||||
DBusError error;
|
||||
NMAPSecurity * security = NULL;
|
||||
char * essid = NULL;
|
||||
DBusMessageIter iter;
|
||||
|
||||
g_return_val_if_fail (connection != NULL, NULL);
|
||||
g_return_val_if_fail (message != NULL, NULL);
|
||||
g_return_val_if_fail (data != NULL, NULL);
|
||||
g_return_val_if_fail (data->data != NULL, NULL);
|
||||
|
||||
/* Try to grab both device _and_ network first, and if that fails then just the device. */
|
||||
dbus_error_init (&error);
|
||||
if (!dbus_message_get_args (message, &error, DBUS_TYPE_OBJECT_PATH, &dev_path,
|
||||
DBUS_TYPE_STRING, &network,
|
||||
DBUS_TYPE_STRING, &key,
|
||||
DBUS_TYPE_INT32, &key_type, DBUS_TYPE_INVALID))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "InvalidArguments",
|
||||
"NetworkManager::createWirelessNetwork called with invalid arguments.");
|
||||
return reply;
|
||||
} else nm_info ("Creating network '%s' on device '%s'.", network, dev_path);
|
||||
dbus_message_iter_init (message, &iter);
|
||||
|
||||
dev_path = nm_dbus_unescape_object_path (dev_path);
|
||||
dev = nm_dbus_get_device_from_object_path (data->data, dev_path);
|
||||
g_free (dev_path);
|
||||
if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_OBJECT_PATH)
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dbus_message_iter_get_basic (&iter, &dev_path);
|
||||
unescaped_dev_path = nm_dbus_unescape_object_path (dev_path);
|
||||
dev = nm_dbus_get_device_from_object_path (data->data, unescaped_dev_path);
|
||||
g_free (unescaped_dev_path);
|
||||
|
||||
/* Ensure the device exists in our list and is supported */
|
||||
if (!dev || !(nm_device_get_capabilities (dev) & NM_DEVICE_CAP_NM_SUPPORTED))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "DeviceNotFound",
|
||||
"The requested network device does not exist.");
|
||||
return reply;
|
||||
}
|
||||
nm_device_ref (dev);
|
||||
|
||||
/* Make sure network is valid and device is wireless */
|
||||
if (!nm_device_is_802_11_wireless (dev) || !network)
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "InvalidArguments",
|
||||
"NetworkManager::createWirelessNetwork called with invalid arguments.");
|
||||
goto out;
|
||||
}
|
||||
|
||||
new_ap = nm_ap_new ();
|
||||
|
||||
/* Fill in the description of the network to create */
|
||||
nm_ap_set_essid (new_ap, network);
|
||||
if (nm_is_enc_key_valid (key, (NMEncKeyType)key_type))
|
||||
if ( !nm_device_is_802_11_wireless (dev)
|
||||
|| !dbus_message_iter_next (&iter)
|
||||
|| (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRING))
|
||||
{
|
||||
nm_ap_set_encrypted (new_ap, TRUE);
|
||||
nm_ap_set_enc_key_source (new_ap, key, (NMEncKeyType)key_type);
|
||||
nm_ap_set_auth_method (new_ap, IW_AUTH_ALG_OPEN_SYSTEM);
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
}
|
||||
nm_ap_set_mode (new_ap, IW_MODE_ADHOC);
|
||||
|
||||
/* grab ssid and ensure validity */
|
||||
dbus_message_iter_get_basic (&iter, &essid);
|
||||
if (!essid || (strlen (essid) <= 0) || !dbus_message_iter_next (&iter))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(security = nm_ap_security_new_deserialize (&iter)))
|
||||
{
|
||||
reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, INVALID_ARGS_ERROR, INVALID_ARGS_MESSAGE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
nm_info ("Creating network '%s' on device '%s'.", essid, dev_path);
|
||||
|
||||
new_ap = nm_ap_new ();
|
||||
nm_ap_set_essid (new_ap, essid);
|
||||
nm_ap_set_security (new_ap, security);
|
||||
g_object_unref (G_OBJECT (security));
|
||||
nm_ap_set_user_created (new_ap, TRUE);
|
||||
|
||||
nm_policy_schedule_device_activation (nm_act_request_new (data->data, dev, new_ap, TRUE));
|
||||
|
||||
out:
|
||||
nm_device_unref (dev);
|
||||
return reply;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue