From 5cf219f7c835e18c69225fa2ba458e6697e453a2 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 15 Dec 2005 18:24:28 +0000 Subject: [PATCH] 2005-12-15 Dan Williams * libnm-util/dbus-helpers.[ch] - Make this the one-stop-shop for serializing/deserializing AP & connection security settings over dbus. Both NM and applets should use this to ensure consistent dbus API going forwared. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1194 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 8 ++ libnm-util/dbus-helpers.c | 195 ++++++++++++++++++++++++++++++++------ libnm-util/dbus-helpers.h | 35 ++++++- 3 files changed, 206 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index e8b20739cb..936fd565b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-12-15 Dan Williams + + * libnm-util/dbus-helpers.[ch] + - Make this the one-stop-shop for serializing/deserializing + AP & connection security settings over dbus. Both NM + and applets should use this to ensure consistent dbus + API going forwared. + 2005-12-15 Robert Love Patch by Timo Hoenig : diff --git a/libnm-util/dbus-helpers.c b/libnm-util/dbus-helpers.c index 13ed240d24..63275f4a72 100644 --- a/libnm-util/dbus-helpers.c +++ b/libnm-util/dbus-helpers.c @@ -28,27 +28,100 @@ #include "cipher.h" -static void key_append_helper (DBusMessageIter *iter, const char *key) +static dbus_bool_t key_append_helper (DBusMessageIter *iter, const char *key) { DBusMessageIter subiter; int key_len; - g_return_if_fail (iter != NULL); - g_return_if_fail (key != NULL); + g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); key_len = strlen (key); - g_return_if_fail (key_len > 0); + g_return_val_if_fail (key_len > 0, FALSE); if (!dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &subiter)) - return; + return FALSE; dbus_message_iter_append_fixed_array (&subiter, DBUS_TYPE_BYTE, &key, key_len); dbus_message_iter_close_container (iter, &subiter); + + return TRUE; } -dbus_bool_t nmu_dbus_message_append_wep_args (DBusMessage *message, IEEE_802_11_Cipher *cipher, - const char *ssid, const char *input, int auth_alg) +static void we_cipher_append_helper (DBusMessageIter *iter, int we_cipher) +{ + dbus_int32_t dbus_we_cipher = (dbus_int32_t) we_cipher; + + g_return_if_fail (iter != NULL); + + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &dbus_we_cipher); +} + +dbus_bool_t +nmu_security_serialize_wep (DBusMessageIter *iter, + const char *key, + int auth_alg) +{ + g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail ((auth_alg == IW_AUTH_ALG_OPEN_SYSTEM) || (auth_alg == IW_AUTH_ALG_SHARED_KEY), FALSE); + + /* Second arg: hashed key (ARRAY, BYTE) */ + if (!key_append_helper (iter, key)) + return FALSE; + + /* Third arg: WEP authentication algorithm (INT32) */ + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &auth_alg); + + return TRUE; +} + +dbus_bool_t +nmu_security_deserialize_wep (DBusMessageIter *iter, + char **key, + int *key_len, + int *auth_alg) +{ + DBusMessageIter subiter; + char * dbus_key; + int dbus_key_len; + dbus_int32_t dbus_auth_alg; + + g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail (*key == NULL, FALSE); + g_return_val_if_fail (key_len != NULL, FALSE); + g_return_val_if_fail (auth_alg != NULL, FALSE); + + /* Next arg: key (ARRAY, BYTE) */ + g_return_val_if_fail ((dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY) + && (dbus_message_iter_get_element_type (iter) == DBUS_TYPE_BYTE), FALSE); + + dbus_message_iter_recurse (iter, &subiter); + dbus_message_iter_get_fixed_array (&subiter, &dbus_key, &dbus_key_len); + g_return_val_if_fail (dbus_key_len > 0, FALSE); + + /* Next arg: authentication algorithm (INT32) */ + g_return_val_if_fail (dbus_message_iter_next (iter), FALSE); + g_return_val_if_fail (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_INT32, FALSE); + + dbus_message_iter_get_basic (iter, &dbus_auth_alg); + g_return_val_if_fail ((dbus_auth_alg == IW_AUTH_ALG_OPEN_SYSTEM) + || (dbus_auth_alg == IW_AUTH_ALG_SHARED_KEY), FALSE); + + *key = dbus_key; + *key_len = dbus_key_len; + *auth_alg = dbus_auth_alg; + return TRUE; +} + + +dbus_bool_t +nmu_security_serialize_wep_with_cipher (DBusMessage *message, + IEEE_802_11_Cipher *cipher, + const char *ssid, + const char *input, + int auth_alg) { - int we_cipher = -1; char * key = NULL; dbus_bool_t result = TRUE; DBusMessageIter iter; @@ -60,25 +133,99 @@ dbus_bool_t nmu_dbus_message_append_wep_args (DBusMessage *message, IEEE_802_11_ dbus_message_iter_init_append (message, &iter); /* First arg: WE Cipher (INT32) */ - we_cipher = ieee_802_11_cipher_get_we_cipher (cipher); - dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &we_cipher); + we_cipher_append_helper (&iter, ieee_802_11_cipher_get_we_cipher (cipher)); - /* Second arg: hashed key (ARRAY, BYTE) */ key = ieee_802_11_cipher_hash (cipher, ssid, input); - key_append_helper (&iter, key); + result = nmu_security_serialize_wep (&iter, key, auth_alg); g_free (key); - /* Third arg: WEP authentication algorithm (INT32) */ - dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &auth_alg); - return result; } -dbus_bool_t nmu_dbus_message_append_wpa_psk_args (DBusMessage *message, IEEE_802_11_Cipher *cipher, - const char *ssid, const char *input, int wpa_version, int key_mgt) +dbus_bool_t +nmu_security_serialize_wpa_psk (DBusMessageIter *iter, + const char *key, + int wpa_version, + int key_mgt) +{ + g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (key != NULL, 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 ((key_mgt == IW_AUTH_KEY_MGMT_802_1X) || (key_mgt == IW_AUTH_KEY_MGMT_PSK), FALSE); + + /* Second arg: hashed key (ARRAY, BYTE) */ + if (!key_append_helper (iter, key)) + return FALSE; + + /* Third arg: WPA version (INT32) */ + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &wpa_version); + + /* Fourth arg: WPA key management (INT32) */ + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &key_mgt); + + return TRUE; +} + +dbus_bool_t +nmu_security_deserialize_wpa_psk (DBusMessageIter *iter, + char **key, + int *key_len, + int *wpa_version, + int *key_mgt) +{ + DBusMessageIter subiter; + char * dbus_key; + int dbus_key_len; + dbus_int32_t dbus_wpa_version; + dbus_int32_t dbus_key_mgt; + + g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail (*key == NULL, FALSE); + g_return_val_if_fail (key_len != NULL, FALSE); + g_return_val_if_fail (wpa_version != NULL, FALSE); + g_return_val_if_fail (key_mgt != NULL, FALSE); + + /* Next arg: key (ARRAY, BYTE) */ + g_return_val_if_fail ((dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY) + && (dbus_message_iter_get_element_type (iter) == DBUS_TYPE_BYTE), FALSE); + + dbus_message_iter_recurse (iter, &subiter); + dbus_message_iter_get_fixed_array (&subiter, &dbus_key, &dbus_key_len); + g_return_val_if_fail (dbus_key_len > 0, FALSE); + + /* Next arg: WPA version (INT32) */ + g_return_val_if_fail (dbus_message_iter_next (iter), FALSE); + g_return_val_if_fail (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_INT32, FALSE); + + dbus_message_iter_get_basic (iter, &dbus_wpa_version); + g_return_val_if_fail ((dbus_wpa_version == IW_AUTH_WPA_VERSION_WPA) + || (dbus_wpa_version == IW_AUTH_WPA_VERSION_WPA2), FALSE); + + /* Next arg: WPA key management (INT32) */ + g_return_val_if_fail (dbus_message_iter_next (iter), FALSE); + g_return_val_if_fail (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_INT32, FALSE); + + dbus_message_iter_get_basic (iter, &dbus_key_mgt); + g_return_val_if_fail ((dbus_key_mgt == IW_AUTH_KEY_MGMT_802_1X) + || (dbus_key_mgt == IW_AUTH_KEY_MGMT_PSK), FALSE); + + *key = dbus_key; + *key_len = dbus_key_len; + *wpa_version = dbus_wpa_version; + *key_mgt = dbus_key_mgt; + return TRUE; +} + +dbus_bool_t +nmu_security_serialize_wpa_psk_with_cipher (DBusMessage *message, + IEEE_802_11_Cipher *cipher, + const char *ssid, + const char *input, + int wpa_version, + int key_mgt) { - int we_cipher = -1; char * key = NULL; dbus_bool_t result = TRUE; DBusMessageIter iter; @@ -91,20 +238,12 @@ dbus_bool_t nmu_dbus_message_append_wpa_psk_args (DBusMessage *message, IEEE_802 dbus_message_iter_init_append (message, &iter); /* First arg: WE Cipher (INT32) */ - we_cipher = ieee_802_11_cipher_get_we_cipher (cipher); - dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &we_cipher); + we_cipher_append_helper (&iter, ieee_802_11_cipher_get_we_cipher (cipher)); - /* Second arg: hashed key (ARRAY, BYTE) */ key = ieee_802_11_cipher_hash (cipher, ssid, input); - key_append_helper (&iter, key); + result = nmu_security_serialize_wpa_psk (&iter, key, wpa_version, key_mgt); g_free (key); - /* Third arg: WPA version (INT32) */ - dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &wpa_version); - - /* Fourth arg: WPA key management (INT32) */ - dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &key_mgt); - return result; } diff --git a/libnm-util/dbus-helpers.h b/libnm-util/dbus-helpers.h index 917b7d357b..50b6e2fd3e 100644 --- a/libnm-util/dbus-helpers.h +++ b/libnm-util/dbus-helpers.h @@ -26,11 +26,38 @@ #include "cipher.h" -dbus_bool_t nmu_dbus_message_append_wep_args (DBusMessage *message, IEEE_802_11_Cipher *cipher, - const char *ssid, const char *input, int auth_alg); +dbus_bool_t nmu_security_serialize_wep (DBusMessageIter *iter, + const char *key, + int auth_alg); -dbus_bool_t nmu_dbus_message_append_wpa_psk_args (DBusMessage *message, IEEE_802_11_Cipher *cipher, - const char *ssid, const char *input, int wpa_version, int key_mgt); +dbus_bool_t nmu_security_deserialize_wep (DBusMessageIter *iter, + char **key, + int *key_len, + int *auth_alg); + +dbus_bool_t nmu_security_serialize_wep_with_cipher (DBusMessage *message, + IEEE_802_11_Cipher *cipher, + const char *ssid, + const char *input, + int auth_alg); + +dbus_bool_t nmu_security_serialize_wpa_psk (DBusMessageIter *iter, + const char *key, + int wpa_version, + int key_mgt); + +dbus_bool_t nmu_security_deserialize_wpa_psk (DBusMessageIter *iter, + char **key, + int *key_len, + int *wpa_version, + int *key_mgt); + +dbus_bool_t nmu_security_serialize_wpa_psk_with_cipher (DBusMessage *message, + IEEE_802_11_Cipher *cipher, + const char *ssid, + const char *input, + int wpa_version, + int key_mgt); #endif /* DBUS_HELPERS_H */