DBus: Publish provisioned keys in network properties
authorJohannes Berg <johannes.berg@intel.com>
Wed, 2 Feb 2011 15:00:12 +0000 (17:00 +0200)
committerJouni Malinen <j@w1.fi>
Wed, 2 Feb 2011 15:00:12 +0000 (17:00 +0200)
When the network was provisioned, we need to get the keys to be able to
reconnect without new provisioning. To be able to publish those keys but
not normally configured ones, add a new attribute to struct wpa_ssid
indicating whether or not keys may be exported.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
wpa_supplicant/config.c
wpa_supplicant/config_ssid.h
wpa_supplicant/dbus/dbus_new_handlers.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/wps_supplicant.c

index 1ea37d4..d732f54 100644 (file)
@@ -1892,6 +1892,7 @@ int wpa_config_set(struct wpa_ssid *ssid, const char *var, const char *value,
  * wpa_config_get_all - Get all options from network configuration
  * @ssid: Pointer to network configuration data
  * @get_keys: Determines if keys/passwords will be included in returned list
+ *     (if they may be exported)
  * Returns: %NULL terminated list of all set keys and their values in the form
  * of [key1, val1, key2, val2, ... , NULL]
  *
@@ -1907,6 +1908,8 @@ char ** wpa_config_get_all(struct wpa_ssid *ssid, int get_keys)
        char **props;
        int fields_num;
 
+       get_keys = get_keys && ssid->export_keys;
+
        props = os_zalloc(sizeof(char *) * ((2 * NUM_SSID_FIELDS) + 1));
        if (!props)
                return NULL;
index 38da3fc..8419f43 100644 (file)
@@ -400,6 +400,14 @@ struct wpa_ssid {
         * temporary - Whether this network is temporary and not to be saved
         */
        int temporary;
+
+       /**
+        * export_keys - Whether keys may be exported
+        *
+        * This attribute will be set when keys are determined through
+        * WPS or similar so that they may be exported.
+        */
+       int export_keys;
 };
 
 #endif /* CONFIG_SSID_H */
index 08cdd72..5402bff 100644 (file)
@@ -2882,7 +2882,7 @@ DBusMessage * wpas_dbus_getter_network_properties(
        DBusMessage *reply = NULL;
        DBusMessageIter iter, variant_iter, dict_iter;
        char **iterator;
-       char **props = wpa_config_get_all(net->ssid, 0);
+       char **props = wpa_config_get_all(net->ssid, 1);
        if (!props)
                return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
                                              NULL);
index 13f9b4a..81d37e5 100644 (file)
@@ -403,6 +403,7 @@ static void wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s,
        s->key_mgmt = WPA_KEY_MGMT_PSK;
        s->proto = WPA_PROTO_RSN;
        s->pairwise_cipher = WPA_CIPHER_CCMP;
+       s->export_keys = 1;
        if (ssid->passphrase) {
                os_free(s->passphrase);
                s->passphrase = os_strdup(ssid->passphrase);
@@ -3241,6 +3242,7 @@ static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
        os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
        ssid->ssid_len = params->ssid_len;
        ssid->p2p_group = 1;
+       ssid->export_keys = 1;
        if (params->psk_set) {
                os_memcpy(ssid->psk, params->psk, 32);
                ssid->psk_set = 1;
index d93db46..8100f1c 100644 (file)
@@ -372,6 +372,7 @@ static int wpa_supplicant_wps_cred(void *ctx,
                                return -1;
                        }
                        ssid->psk_set = 1;
+                       ssid->export_keys = 1;
                } else if (cred->key_len >= 8 && cred->key_len < 2 * PMK_LEN) {
                        os_free(ssid->passphrase);
                        ssid->passphrase = os_malloc(cred->key_len + 1);
@@ -380,6 +381,7 @@ static int wpa_supplicant_wps_cred(void *ctx,
                        os_memcpy(ssid->passphrase, cred->key, cred->key_len);
                        ssid->passphrase[cred->key_len] = '\0';
                        wpa_config_update_psk(ssid);
+                       ssid->export_keys = 1;
                } else {
                        wpa_printf(MSG_ERROR, "WPS: Invalid Network Key "
                                   "length %lu",