DBus: Publish provisioned keys in network properties

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>
This commit is contained in:
Johannes Berg 2011-02-02 17:00:12 +02:00 committed by Jouni Malinen
parent 0661eed204
commit d1c8ac88b9
5 changed files with 16 additions and 1 deletions

View 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;

View 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 */

View 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);

View 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;

View 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",