2 * Network Configuration Module
4 * Copyright (c) 2019 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include <vconf-keys.h>
28 #include "netsupplicant.h"
30 #include "wifi-config.h"
32 #include "wifi-key-encryption.h"
34 #define DEFAULT_BOOTSTRAP_TYPE "qrcode"
35 #define DEFAULT_DPP_CHANNEL "81/6"
36 #define DEFAULT_DPP_FREQ 2437
38 #define DEFAULT_DPP_CONFIG_PROCESSING_TYPE "0"
42 #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
43 #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
54 WIFI_DPP_STATE_AWAITING,
55 WIFI_DPP_STATE_PEER_QR_REQUESTED,
56 WIFI_DPP_STATE_BOOTSTRAPPED,
57 WIFI_DPP_STATE_AUTHENTICATING,
58 WIFI_DPP_STATE_AUTHENTICATED,
59 WIFI_DPP_STATE_CONFIGURED,
60 WIFI_DPP_STATE_CONNECTING,
61 WIFI_DPP_STATE_CONNECTED,
70 gchar *net_access_key;
76 guint32 configurator_id;
77 gboolean is_initiator;
78 wifi_dpp_state_e state;
81 gboolean g_in_progress = FALSE;
82 static GSList *dpp_info_list = NULL;
84 static wifi_dpp_s *_get_dpp_info(guint32 peer_id, guint32 own_id)
86 wifi_dpp_s *ret = NULL;
89 for (list = dpp_info_list; list; list = list->next) {
91 if (ret->own_id == own_id && ret->peer_id == peer_id)
98 static wifi_dpp_s *_get_dpp_in_progress()
100 wifi_dpp_s *ret = NULL;
103 for (list = dpp_info_list; list; list = list->next) {
105 if (ret->state > WIFI_DPP_STATE_NONE)
112 static wifi_dpp_s *__create_dpp_info(gboolean is_initiator)
114 wifi_dpp_s *ret = g_try_malloc0(sizeof(wifi_dpp_s));
116 ret->is_initiator = is_initiator;
121 static void __add_to_dpp_info_list(wifi_dpp_s * p_dpp)
123 dpp_info_list = g_slist_prepend(dpp_info_list, p_dpp);
126 static void __remove_from_dpp_info_list(wifi_dpp_s * p_dpp)
128 dpp_info_list = g_slist_remove(dpp_info_list, p_dpp);
131 static void __destroy_dpp_info(wifi_dpp_s *p_dpp)
137 static void __free_critical(char *critical)
143 length = strlen(critical);
144 memset((void *)critical, 0x0, length);
148 static void __netconfig_wifi_notify_dpp_uri_generated(guint32 own_id, const gchar *own_uri)
150 GVariantBuilder *builder = NULL;
152 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
153 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
154 g_variant_builder_add(builder, "{sv}", "own_uri", g_variant_new_string(own_uri));
156 wifi_emit_dpp_uri_generated((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
157 g_variant_builder_unref(builder);
162 static void __netconfig_wifi_notify_dpp_bootstrapped(guint32 peer_id)
164 GVariantBuilder *builder = NULL;
166 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
167 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(peer_id));
169 wifi_emit_dpp_bootstrapped((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
170 g_variant_builder_unref(builder);
175 static void __netconfig_wifi_notify_dpp_awaiting(guint32 own_id)
177 GVariantBuilder *builder = NULL;
179 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
180 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
182 wifi_emit_dpp_awaiting((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
183 g_variant_builder_unref(builder);
188 static void __netconfig_wifi_notify_dpp_authenticating(guint32 peer_id, guint32 own_id)
190 GVariantBuilder *builder = NULL;
192 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
193 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(peer_id));
194 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
196 wifi_emit_dpp_authenticating((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
197 g_variant_builder_unref(builder);
202 static void __netconfig_wifi_notify_dpp_failed()
204 wifi_emit_dpp_failed((Wifi *)get_wifi_object());
209 static void __netconfig_wifi_notify_dpp_removed(guint32 peer_id, guint32 own_id)
211 GVariantBuilder *builder = NULL;
213 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
214 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(peer_id));
215 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
217 wifi_emit_dpp_removed((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
218 g_variant_builder_unref(builder);
223 static char *__netconfig_dpp_get_supplicant_interface()
225 char *if_path = NULL;
227 if_path = netconfig_wifi_get_supplicant_p2p_interface();
231 if_path = netconfig_wifi_get_supplicant_interface();
236 static gboolean __netconfig_wifi_invoke_dpp_set_dpp_config_processing()
238 char *if_path = NULL;
239 GVariant *message = NULL;
240 GVariant *params = NULL;
242 DBG("[TizenMW-->WPAS]: DPP Set config processing Request: ");
244 if_path = __netconfig_dpp_get_supplicant_interface();
245 if (if_path == NULL) {
246 ERR("Fail to get wpa_supplicant DBus interface path");
250 params = g_variant_new("(ssv)", SUPPLICANT_INTERFACE ".Interface",
251 "DppConfigProcessing", g_variant_new_string(DEFAULT_DPP_CONFIG_PROCESSING_TYPE));
253 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
254 if_path, DBUS_INTERFACE_PROPERTIES, "Set", params);
256 if (message == NULL) {
257 ERR(" DPP : Failed to set DPP config processing !!!");
261 g_variant_unref(message);
265 static gboolean __netconfig_wifi_invoke_dpp_qr_code(const char *peer_uri, guint32 *peer_id)
267 char *if_path = NULL;
268 GVariant *message = NULL;
269 GVariant *params = NULL;
271 DBG("[TizenMW-->WPAS]: DPP QrCode Request: ");
273 if_path = __netconfig_dpp_get_supplicant_interface();
274 if (if_path == NULL) {
275 ERR("Fail to get wpa_supplicant DBus interface path");
279 params = g_variant_new("(s)", peer_uri);
280 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
281 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "QrCode", params);
283 if (message == NULL) {
284 ERR(" DPP : Failed to set peer URI !!!");
288 g_variant_get(message, "(u)", peer_id);
289 INFO("DPP reply: [%u]", *peer_id);
291 g_variant_unref(message);
294 #define DEBUG_G_VARIANT(str, parameters)\
296 gchar *parameters_debug_str = NULL;\
298 parameters_debug_str = g_variant_print(parameters, TRUE);\
299 DBG("%s[%s]", str, parameters_debug_str ? parameters_debug_str : "NULL");\
300 g_free(parameters_debug_str);\
304 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
306 GVariantIter *iter = NULL;
309 if (!dst || !src || size == 0) {
310 DBG("Invalid parameter");
313 g_variant_get(src, "ay", &iter);
315 DBG("failed to get iterator");
319 while (g_variant_iter_loop(iter, "y", &dst[length])) {
324 g_variant_iter_free(iter);
329 static gchar *__netconfig_get_p2p_address(const char *if_path)
331 GVariant *params = NULL;
332 GVariant *message = NULL;
333 GVariant *temp = NULL;
334 guchar p2p_addr[MACADDR_LEN] = {0,};
335 gchar address_str[MACSTR_LEN] = {0,};
337 params = g_variant_new("(ss)", SUPPLICANT_INTERFACE ".Interface", "P2PAddress");
339 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
341 DBUS_INTERFACE_PROPERTIES,
345 if (message == NULL) {
346 ERR("netconfig_supplicant_invoke_dbus_method() failed.");
349 DEBUG_G_VARIANT("reply:", message);
351 temp = g_variant_get_child_value(message, 0);
352 temp = g_variant_get_child_value(temp, 0);
353 DEBUG_G_VARIANT("temp:", temp);
354 __ws_unpack_ay(p2p_addr, temp, MACADDR_LEN);
355 g_snprintf(address_str, MACSTR_LEN, MACSTR, MAC2STR(p2p_addr));
357 DBG("P2P address %s", address_str);
359 return g_strdup(address_str);
362 static gboolean __netconfig_wifi_invoke_dpp_add_bootstrap(const char *key, guint32 *id)
364 char *if_path = NULL;
365 GVariantBuilder *builder = NULL;
366 GVariant *params = NULL;
367 GVariant *message = NULL;
368 gchar *current_mac_addr = NULL;
370 DBG("[TizenMW-->WPAS]: DPP AddBootstrap Request: ");
372 if_path = __netconfig_dpp_get_supplicant_interface();
373 if (if_path == NULL) {
374 ERR("Fail to get wpa_supplicant DBus interface path");
377 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
378 g_variant_builder_add(builder, "{sv}", "type", g_variant_new_string("qrcode"));
379 g_variant_builder_add(builder, "{sv}", "channels", g_variant_new_string(DEFAULT_DPP_CHANNEL));
380 /* TODO: find more comfortable way */
381 current_mac_addr = __netconfig_get_p2p_address(if_path);
382 if (current_mac_addr)
383 g_variant_builder_add(builder, "{sv}", "mac", g_variant_new_string(current_mac_addr));
385 g_variant_builder_add(builder, "{sv}", "key", g_variant_new_string(key));
386 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
387 g_variant_builder_unref(builder);
389 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
390 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AddBootstrap", params);
392 g_free(current_mac_addr);
393 if (message == NULL) {
394 ERR(" DPP : Failed to add bootstrap !!!");
398 g_variant_get(message, "(u)", id);
399 INFO("DPP reply: [%u]", *id);
401 g_variant_unref(message);
405 static gboolean __netconfig_wifi_invoke_dpp_get_bootstrap_uri(guint32 id, gchar **uri)
407 char *if_path = NULL;
408 GVariant *message = NULL;
409 GVariant *params = NULL;
416 DBG("[TizenMW-->WPAS]: DPP GetBootstrapUri Request: ");
418 if_path = __netconfig_dpp_get_supplicant_interface();
419 if (if_path == NULL) {
420 ERR("Fail to get wpa_supplicant DBus interface path");
424 params = g_variant_new("(u)", id);
425 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
426 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "GetBootstrapUri", params);
428 if (message == NULL) {
429 ERR(" DPP : Failed to get URI !!!");
433 g_variant_get(message, "(s)", uri);
434 INFO("DPP reply: [%s]", *uri);
436 g_variant_unref(message);
440 static gboolean __netconfig_wifi_invoke_dpp_add_configurator(const char *key, guint32 *id)
442 char *if_path = NULL;
443 GVariantBuilder *builder = NULL;
444 GVariant *params = NULL;
445 GVariant *message = NULL;
447 DBG("[TizenMW-->WPAS]: DPP AddConfigurator Request: ");
449 if_path = __netconfig_dpp_get_supplicant_interface();
450 if (if_path == NULL) {
451 ERR("Fail to get wpa_supplicant DBus interface path");
454 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
456 g_variant_builder_add(builder, "{sv}", "key", g_variant_new_string(key));
457 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
458 g_variant_builder_unref(builder);
460 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
461 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AddConfigurator", params);
463 if (message == NULL) {
464 ERR(" DPP : Failed to add configurator !!!");
468 g_variant_get(message, "(u)", id);
469 INFO("DPP reply: [%u]", *id);
471 g_variant_unref(message);
475 static gchar *__generate_configurator_params(guint32 configurator_id, const char *ssid,
476 const char *net_role, const char *akm, const char *pass)
478 gchar ssid_hex[65] = {0,};
479 gchar pass_hex[129] = {0,};
482 gchar *conf_str = NULL;
484 netconfig_convert_bytes_to_hexstr(ssid, strlen(ssid), ssid_hex);
485 conf_str = g_strdup_printf(" ssid=%s conf=%s-%s", ssid_hex, net_role, akm);
488 netconfig_convert_bytes_to_hexstr(pass, strlen(pass), pass_hex);
489 ret = g_strdup_printf("%s pass=%s", conf_str, pass_hex);
491 ret = g_strdup_printf(" configurator=%u%s", configurator_id, conf_str);
498 static gboolean __netconfig_wifi_invoke_dpp_set_configurator_params(guint configurator_id,
499 const char *ssid, const char *net_role, const char *akm, const char *pass)
501 char *if_path = NULL;
502 GVariant *message = NULL;
503 GVariant *params = NULL;
504 gchar *configurator_param_str = NULL;
506 DBG("[TizenMW-->WPAS]: DPP Set configurator params Request: ");
508 if_path = __netconfig_dpp_get_supplicant_interface();
509 if (if_path == NULL) {
510 ERR("Fail to get wpa_supplicant DBus interface path");
514 configurator_param_str = __generate_configurator_params(
515 configurator_id, ssid, net_role, akm, pass);
516 if (!configurator_param_str) {
517 ERR(" DPP : Failed to gen conf params");
521 params = g_variant_new("(ssv)", SUPPLICANT_INTERFACE ".Interface",
522 "DPPConfiguratorParams", g_variant_new_string(configurator_param_str));
524 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
525 if_path, DBUS_INTERFACE_PROPERTIES, "Set", params);
527 g_free(configurator_param_str);
528 if (message == NULL) {
529 ERR(" DPP : Failed to set configurator params !!!");
533 g_variant_unref(message);
537 static gboolean __netconfig_wifi_invoke_dpp_listen(guint32 freq, const gchar *dev_role)
539 char *if_path = NULL;
540 GVariantBuilder *builder = NULL;
541 GVariant *params = NULL;
542 GVariant *message = NULL;
544 DBG("[TizenMW-->WPAS]: DPP Listen Request: ");
546 if_path = __netconfig_dpp_get_supplicant_interface();
547 if (if_path == NULL) {
548 ERR("Fail to get wpa_supplicant DBus interface path");
551 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
552 g_variant_builder_add(builder, "{sv}", "freq", g_variant_new_uint32(freq));
553 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_string(dev_role));
554 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
555 g_variant_builder_unref(builder);
557 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
558 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "Listen", params);
560 if (message == NULL) {
561 ERR(" DPP : Failed to start DPP listen !!!");
565 g_variant_unref(message);
569 static gboolean __netconfig_wifi_invoke_auth_init_enrollee(guint32 peer_id)
571 char *if_path = NULL;
572 GVariantBuilder *builder = NULL;
573 GVariant *params = NULL;
574 GVariant *message = NULL;
576 DBG("[TizenMW-->WPAS]: DPP AuthInit Request: ");
578 if_path = __netconfig_dpp_get_supplicant_interface();
579 if (if_path == NULL) {
580 ERR("Fail to get wpa_supplicant DBus interface path");
583 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
584 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_uint32(peer_id));
585 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_string("enrollee"));
586 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
587 g_variant_builder_unref(builder);
589 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
590 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AuthInit", params);
592 if (message == NULL) {
593 ERR(" DPP : Failed to start DPP AuthInit !!!");
597 g_variant_unref(message);
601 static gboolean __netconfig_wifi_invoke_auth_init_configurator(guint32 peer_id,
602 guint32 configurator_id, const char *conf, const char *ssid, const char *pass)
604 char *if_path = NULL;
605 GVariantBuilder *builder = NULL;
606 GVariant *params = NULL;
607 GVariant *message = NULL;
608 gchar ssid_hex[65] = {0,};
609 gchar pass_hex[129] = {0,};
611 DBG("[TizenMW-->WPAS]: DPP AuthInit Request: ");
613 if_path = __netconfig_dpp_get_supplicant_interface();
614 if (if_path == NULL) {
615 ERR("Fail to get wpa_supplicant DBus interface path");
618 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
619 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_uint32(peer_id));
620 g_variant_builder_add(builder, "{sv}", "configurator", g_variant_new_uint32(configurator_id));
621 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_string("configurator"));
622 g_variant_builder_add(builder, "{sv}", "conf", g_variant_new_string(conf));
624 netconfig_convert_bytes_to_hexstr(ssid, strlen(ssid), ssid_hex);
625 g_variant_builder_add(builder, "{sv}", "ssid", g_variant_new_string(ssid_hex));
628 netconfig_convert_bytes_to_hexstr(pass, strlen(pass), pass_hex);
629 g_variant_builder_add(builder, "{sv}", "passphrase", g_variant_new_string(pass_hex));
631 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
632 g_variant_builder_unref(builder);
634 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
635 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AuthInit", params);
637 if (message == NULL) {
638 ERR(" DPP : Failed to start DPP AuthInit !!!");
642 g_variant_unref(message);
646 static void __netconfig_wifi_invoke_dpp_stop_listen()
648 char *if_path = NULL;
649 GVariant *message = NULL;
651 DBG("[TizenMW-->WPAS]: DPP StopListen Request: ");
653 if_path = __netconfig_dpp_get_supplicant_interface();
654 if (if_path == NULL) {
655 ERR("Fail to get wpa_supplicant DBus interface path");
659 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
660 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "StopListen", NULL);
662 if (message == NULL) {
663 ERR(" DPP : Failed to stop listen !!!");
667 g_variant_unref(message);
671 static void __netconfig_wifi_invoke_dpp_remove_bootstrap(guint32 uri_id)
673 char *if_path = NULL;
674 GVariant *message = NULL;
675 GVariant *params = NULL;
682 DBG("[TizenMW-->WPAS]: DPP RemoveBootstrap Request: ");
684 if_path = __netconfig_dpp_get_supplicant_interface();
685 if (if_path == NULL) {
686 ERR("Fail to get wpa_supplicant DBus interface path");
690 params = g_variant_new("(u)", uri_id);
691 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
692 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "RemoveBootstrap", params);
694 if (message == NULL) {
695 ERR(" DPP : Failed to remove URI !!!");
699 g_variant_unref(message);
703 static void __netconfig_wifi_invoke_dpp_remove_configurator(guint32 configurator_id)
705 char *if_path = NULL;
706 GVariant *message = NULL;
707 GVariant *params = NULL;
709 if (configurator_id == 0) {
714 DBG("[TizenMW-->WPAS]: DPP RemoveConfigurator Request: ");
716 if_path = __netconfig_dpp_get_supplicant_interface();
717 if (if_path == NULL) {
718 ERR("Fail to get wpa_supplicant DBus interface path");
722 params = g_variant_new("(u)", configurator_id);
723 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
724 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "RemoveConfigurator", params);
726 if (message == NULL) {
727 ERR(" DPP : Failed to remove configurator !!!");
731 g_variant_unref(message);
735 static void __wifi_dpp_connman_specific_scan_request_reply(GObject *source_object, GAsyncResult *res,
738 GDBusConnection *conn = NULL;
739 GError *error = NULL;
742 conn = G_DBUS_CONNECTION(source_object);
743 reply = g_dbus_connection_call_finish(conn, res, &error);
745 ERR("Scan failed. Error [%s]\n", error->message);
748 DBG("Specific Scan Request success\n");
752 g_variant_unref(reply);
755 static gboolean __netconfig_wifi_dpp_invoke_connman_specific_scan(gchar *ssid)
757 GVariant *params = NULL;
758 GVariantBuilder *builder;
761 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
762 g_variant_builder_add(builder, "{sv}", "SSID", g_variant_new_string(ssid));
764 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
765 g_variant_builder_unref(builder);
767 ret = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
768 CONNMAN_WIFI_TECHNOLOGY_PREFIX,
769 CONNMAN_TECHNOLOGY_INTERFACE, "SpecificScan", params,
770 __wifi_dpp_connman_specific_scan_request_reply);
775 static void __wifi_dpp_connman_scan_request_reply(GObject *source_object, GAsyncResult *res,
778 GDBusConnection *conn = NULL;
779 GError *error = NULL;
782 conn = G_DBUS_CONNECTION(source_object);
783 reply = g_dbus_connection_call_finish(conn, res, &error);
785 ERR("Scan failed. Error [%s]\n", error->message);
788 DBG("Scan Request success\n");
792 g_variant_unref(reply);
795 static gboolean __netconfig_wifi_dpp_invoke_connman_scan()
797 return netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
798 CONNMAN_WIFI_TECHNOLOGY_PREFIX,
799 CONNMAN_TECHNOLOGY_INTERFACE, "Scan", NULL,
800 __wifi_dpp_connman_scan_request_reply);
805 static gboolean __netconfig_wifi_invoke_flush_bss()
807 GVariant *message = NULL;
808 char *if_path = NULL;
809 GVariant *params = NULL;
811 DBG("[TizenMW-->WPAS]: Wi-Fi Flush BSS Request: ");
813 if_path = netconfig_wifi_get_supplicant_interface();
814 if (if_path == NULL) {
815 ERR("Fail to get wpa_supplicant DBus path");
819 params = g_variant_new("(u)", 0);
820 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
821 if_path, SUPPLICANT_INTERFACE ".Interface", "FlushBSS", params);
824 if (message == NULL) {
825 ERR(" Failed to flush BSS !!!");
829 g_variant_unref(message);
833 static gboolean __netconfig_wifi_dpp_enter_peer_uri(GDBusMethodInvocation *context,
834 guint32 peer_id, guint32 own_id, gboolean is_initiator, gchar *peer_uri)
836 wifi_dpp_s *p_dpp_info = NULL;
839 p_dpp_info = _get_dpp_info(peer_id, own_id);
841 ERR("Invalid parameter");
845 ret = __netconfig_wifi_invoke_dpp_qr_code(peer_uri, &(p_dpp_info->peer_id));
849 __netconfig_wifi_notify_dpp_bootstrapped(p_dpp_info->peer_id);
854 static gboolean __netconfig_wifi_dpp_generate_uri(GDBusMethodInvocation *context,
855 guint32 peer_id, guint32 own_id, gboolean is_initiator, const gchar *key)
857 wifi_dpp_s *p_dpp_info = NULL;
859 gchar *generated_uri = NULL;
862 p_dpp_info = _get_dpp_info(peer_id, own_id);
864 ERR("Invalid parameter");
868 ret = __netconfig_wifi_invoke_dpp_add_bootstrap(key, &id);
872 ret = __netconfig_wifi_invoke_dpp_get_bootstrap_uri(id, &generated_uri);
874 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
878 p_dpp_info->own_id = id;
879 __netconfig_wifi_notify_dpp_uri_generated(id, generated_uri);
880 g_free(generated_uri);
885 static gboolean __netconfig_wifi_dpp_start_configurator_initiator(GDBusMethodInvocation *context,
886 const char *group_id, const char *ssid, const char *peer_uri, guint32 peer_id,
887 const char *net_role, const char *akm, const char *configurator_key,
890 wifi_dpp_s *p_dpp_info = NULL;
892 char *conf_str = NULL;
893 gboolean ret = FALSE;
895 p_dpp_info = __create_dpp_info(TRUE);
897 INFO("Failed to create DPP info");
901 ret = __netconfig_wifi_invoke_dpp_qr_code(peer_uri, &(id));
903 __destroy_dpp_info(p_dpp_info);
907 ret = __netconfig_wifi_invoke_dpp_add_configurator(configurator_key, &(p_dpp_info->configurator_id));
909 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
910 __destroy_dpp_info(p_dpp_info);
913 p_dpp_info->state = WIFI_DPP_STATE_BOOTSTRAPPED;
914 __netconfig_wifi_notify_dpp_bootstrapped(id);
916 conf_str = g_strdup_printf("%s-%s", net_role, akm);
917 ret = __netconfig_wifi_invoke_auth_init_configurator(id,
918 p_dpp_info->configurator_id, conf_str, ssid, pass);
920 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
921 __destroy_dpp_info(p_dpp_info);
926 p_dpp_info->is_initiator = TRUE;
927 p_dpp_info->peer_id = id;
928 __add_to_dpp_info_list(p_dpp_info);
929 p_dpp_info->state = WIFI_DPP_STATE_AUTHENTICATING;
930 __netconfig_wifi_notify_dpp_authenticating(id, p_dpp_info->own_id);
937 static gboolean __netconfig_wifi_dpp_start_configurator_responder(GDBusMethodInvocation *context,
938 const char *group_id, const char *ssid, const char *net_role,
939 const char *akm, const char *auth_key, const char *configurator_key,
942 wifi_dpp_s *p_dpp_info = NULL;
943 gboolean ret = FALSE;
945 gchar *generated_uri = NULL;
947 p_dpp_info = __create_dpp_info(FALSE);
949 INFO("Failed to create DPP info");
953 ret = __netconfig_wifi_invoke_dpp_add_configurator(configurator_key, &(p_dpp_info->configurator_id));
955 __destroy_dpp_info(p_dpp_info);
959 ret = __netconfig_wifi_invoke_dpp_set_configurator_params(p_dpp_info->configurator_id, ssid, net_role, akm, pass);
961 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
962 __destroy_dpp_info(p_dpp_info);
966 ret = __netconfig_wifi_invoke_dpp_add_bootstrap(auth_key, &id);
968 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
969 __destroy_dpp_info(p_dpp_info);
973 ret = __netconfig_wifi_invoke_dpp_get_bootstrap_uri(id, &generated_uri);
975 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
976 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
977 __destroy_dpp_info(p_dpp_info);
981 __netconfig_wifi_notify_dpp_uri_generated(id, generated_uri);
983 ret = __netconfig_wifi_invoke_dpp_listen(DEFAULT_DPP_FREQ, "configurator");
985 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
986 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
987 g_free(generated_uri);
988 __destroy_dpp_info(p_dpp_info);
992 p_dpp_info->is_initiator = FALSE;
993 p_dpp_info->own_id = id;
994 __add_to_dpp_info_list(p_dpp_info);
995 p_dpp_info->state = WIFI_DPP_STATE_AWAITING;
996 __netconfig_wifi_notify_dpp_awaiting(id);
998 g_free(generated_uri);
1003 static gboolean __netconfig_wifi_dpp_start_enrollee_initiator(GDBusMethodInvocation *context,
1004 const char *peer_uri, guint32 peer_id)
1006 wifi_dpp_s *p_dpp_info = NULL;
1008 gboolean ret = FALSE;
1010 p_dpp_info = __create_dpp_info(TRUE);
1012 INFO("Failed to create DPP info");
1016 ret = __netconfig_wifi_invoke_dpp_set_dpp_config_processing();
1018 __destroy_dpp_info(p_dpp_info);
1022 ret = __netconfig_wifi_invoke_dpp_qr_code(peer_uri, &id);
1024 __destroy_dpp_info(p_dpp_info);
1027 p_dpp_info->state = WIFI_DPP_STATE_BOOTSTRAPPED;
1028 __netconfig_wifi_notify_dpp_bootstrapped(id);
1030 ret = __netconfig_wifi_invoke_auth_init_enrollee(id);
1032 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
1033 __destroy_dpp_info(p_dpp_info);
1037 p_dpp_info->is_initiator = TRUE;
1038 p_dpp_info->peer_id = id;
1039 __add_to_dpp_info_list(p_dpp_info);
1040 p_dpp_info->state = WIFI_DPP_STATE_AUTHENTICATING;
1041 __netconfig_wifi_notify_dpp_authenticating(id, p_dpp_info->own_id);
1046 static gboolean __netconfig_wifi_dpp_start_enrollee_responder(GDBusMethodInvocation *context,
1047 const char *auth_key)
1049 wifi_dpp_s *p_dpp_info = NULL;
1050 gboolean ret = FALSE;
1052 gchar *generated_uri = NULL;
1054 p_dpp_info = __create_dpp_info(FALSE);
1056 INFO("Failed to create DPP info");
1060 ret = __netconfig_wifi_invoke_dpp_set_dpp_config_processing();
1062 __destroy_dpp_info(p_dpp_info);
1066 ret = __netconfig_wifi_invoke_dpp_add_bootstrap(auth_key, &id);
1068 __destroy_dpp_info(p_dpp_info);
1072 ret = __netconfig_wifi_invoke_dpp_get_bootstrap_uri(id, &generated_uri);
1074 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
1075 __destroy_dpp_info(p_dpp_info);
1079 __netconfig_wifi_notify_dpp_uri_generated(id, generated_uri);
1081 ret = __netconfig_wifi_invoke_dpp_listen(DEFAULT_DPP_FREQ, "enrollee");
1083 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
1084 __destroy_dpp_info(p_dpp_info);
1088 p_dpp_info->is_initiator = FALSE;
1089 p_dpp_info->own_id = id;
1090 __add_to_dpp_info_list(p_dpp_info);
1091 p_dpp_info->state = WIFI_DPP_STATE_AWAITING;
1092 __netconfig_wifi_notify_dpp_awaiting(id);
1094 g_free(generated_uri);
1099 static gboolean __netconfig_wifi_dpp_stop(GDBusMethodInvocation *context,
1100 guint32 peer_id, guint32 own_id)
1102 wifi_dpp_s *p_dpp_info = NULL;
1104 p_dpp_info = _get_dpp_info(peer_id, own_id);
1106 ERR("Invalid parameter");
1110 __netconfig_wifi_invoke_dpp_stop_listen();
1111 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->peer_id);
1113 if (p_dpp_info->own_id != 0)
1114 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->own_id);
1116 if (p_dpp_info->configurator_id != 0)
1117 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
1119 __remove_from_dpp_info_list(p_dpp_info);
1120 __destroy_dpp_info(p_dpp_info);
1121 __netconfig_wifi_notify_dpp_removed(peer_id, own_id);
1127 void netconfig_wifi_dpp_auth_success_event(GVariant *message)
1129 wifi_dpp_s *p_dpp_info = NULL;
1130 GVariantBuilder *builder = NULL;
1132 p_dpp_info = _get_dpp_in_progress();
1134 ERR("DPP :there's no DPP in progress");
1138 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1139 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1140 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1142 p_dpp_info->state = WIFI_DPP_STATE_AUTHENTICATED;
1143 wifi_emit_dpp_auth_success((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1144 g_variant_builder_unref(builder);
1150 static void __clear_dpp_process(wifi_dpp_s *p_dpp_info)
1152 g_in_progress = FALSE;
1153 __netconfig_wifi_invoke_dpp_stop_listen();
1155 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->peer_id);
1157 if (p_dpp_info->own_id != 0)
1158 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->own_id);
1160 if (p_dpp_info->configurator_id != 0)
1161 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
1163 __remove_from_dpp_info_list(p_dpp_info);
1164 __netconfig_wifi_notify_dpp_removed(p_dpp_info->peer_id, p_dpp_info->own_id);
1165 __destroy_dpp_info(p_dpp_info);
1168 static void __resume_dpp_responder(wifi_dpp_s *p_dpp_info)
1170 gchar *device_role = NULL;
1173 __netconfig_wifi_invoke_dpp_stop_listen();
1175 if (p_dpp_info->configurator_id)
1176 device_role = "configurator";
1178 device_role = "enrollee";
1180 ret = __netconfig_wifi_invoke_dpp_listen(DEFAULT_DPP_FREQ, device_role);
1182 __clear_dpp_process(p_dpp_info);
1184 p_dpp_info->state = WIFI_DPP_STATE_AWAITING;
1185 __netconfig_wifi_notify_dpp_awaiting(p_dpp_info->own_id);
1189 static void __netconfig_wifi_dpp_wrap_up(wifi_dpp_s *p_dpp_info)
1191 if (p_dpp_info->is_initiator)
1192 __clear_dpp_process(p_dpp_info);
1194 __resume_dpp_responder(p_dpp_info);
1197 static void __netconfig_wifi_dpp_notify_dpp_failed(wifi_dpp_s *p_dpp_info)
1199 GVariantBuilder *builder = NULL;
1201 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1202 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1203 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1205 wifi_emit_dpp_auth_failed((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1206 g_variant_builder_unref(builder);
1208 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1211 void netconfig_wifi_dpp_auth_failed_event(GVariant *message)
1213 wifi_dpp_s *p_dpp_info = NULL;
1214 p_dpp_info = _get_dpp_in_progress();
1216 ERR("DPP :there's no DPP in progress");
1220 __netconfig_wifi_dpp_notify_dpp_failed(p_dpp_info);
1225 void netconfig_wifi_dpp_not_compatible_event(GVariant *message)
1227 wifi_dpp_s *p_dpp_info = NULL;
1228 GVariantBuilder *builder = NULL;
1230 p_dpp_info = _get_dpp_in_progress();
1232 ERR("DPP :there's no DPP in progress");
1236 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1237 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1238 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1240 wifi_emit_dpp_not_compatible((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1241 g_variant_builder_unref(builder);
1243 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1248 void netconfig_wifi_dpp_conf_failed_event(GVariant *message)
1250 wifi_dpp_s *p_dpp_info = NULL;
1251 GVariantBuilder *builder = NULL;
1253 p_dpp_info = _get_dpp_in_progress();
1255 ERR("DPP :there's no DPP in progress");
1259 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1260 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1261 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1263 wifi_emit_dpp_conf_failed((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1264 g_variant_builder_unref(builder);
1266 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1271 void netconfig_wifi_dpp_scan_peer_qr_event(GVariant *message)
1273 wifi_dpp_s *p_dpp_info = NULL;
1274 GVariantBuilder *builder = NULL;
1276 p_dpp_info = _get_dpp_in_progress();
1278 ERR("DPP :there's no DPP in progress");
1282 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1283 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1284 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1286 wifi_emit_dpp_scan_peer_qr((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1287 g_variant_builder_unref(builder);
1289 p_dpp_info->state = WIFI_DPP_STATE_PEER_QR_REQUESTED;
1294 void netconfig_wifi_dpp_network_id_event(GVariant *message)
1296 wifi_dpp_s *p_dpp_info = NULL;
1297 GVariantBuilder *builder = NULL;
1299 p_dpp_info = _get_dpp_in_progress();
1301 ERR("DPP :there's no DPP in progress");
1305 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1306 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1307 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1309 wifi_emit_dpp_network_id((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1310 g_variant_builder_unref(builder);
1315 void netconfig_wifi_dpp_conf_sent_event(GVariant *message)
1317 wifi_dpp_s *p_dpp_info = NULL;
1318 GVariantBuilder *builder = NULL;
1320 p_dpp_info = _get_dpp_in_progress();
1322 ERR("DPP :there's no DPP in progress");
1326 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1327 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1328 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1330 wifi_emit_dpp_conf_sent((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1331 g_variant_builder_unref(builder);
1333 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1338 void netconfig_wifi_dpp_conf_received_event(GVariant *message)
1340 wifi_dpp_s *p_dpp_info = NULL;
1341 GVariantBuilder *builder = NULL;
1343 p_dpp_info = _get_dpp_in_progress();
1345 ERR("DPP :there's no DPP in progress");
1349 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1350 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1351 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1353 wifi_emit_dpp_conf_received((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1354 g_variant_builder_unref(builder);
1356 p_dpp_info->state = WIFI_DPP_STATE_CONFIGURED;
1361 static wifi_dpp_akm_e __get_dpp_akm(const gchar *akm_str)
1363 if (g_strcmp0(akm_str, "psk") == 0)
1364 return WIFI_DPP_AKM_PSK;
1365 else if (g_strcmp0(akm_str, "sae") == 0)
1366 return WIFI_DPP_AKM_SAE;
1367 else if (g_strcmp0(akm_str, "dpp") == 0)
1368 return WIFI_DPP_AKM_DPP;
1370 return WIFI_DPP_AKM_UNKNOWN;
1373 static gboolean __is_configuration_valid(wifi_dpp_akm_e akm, const gchar *passphrase,
1374 const gchar *connector, const gchar *c_sign_key, const gchar *net_access_key)
1376 if ((akm == WIFI_DPP_AKM_PSK || akm == WIFI_DPP_AKM_SAE) && passphrase)
1378 else if (akm == WIFI_DPP_AKM_DPP && connector && c_sign_key && net_access_key)
1383 gboolean __save_passphrase(GKeyFile *keyfile, gchar *group_name, gchar *key, gchar *value)
1385 gchar *enc_data = NULL;
1386 gboolean ret = TRUE;
1391 enc_data = _netconfig_encrypt_passphrase(value);
1393 ERR("Failed to encrypt the passphrase");
1396 g_key_file_set_string(keyfile, group_name, key, enc_data);
1402 gboolean __save_credentials(GKeyFile *keyfile, gchar *group_name, wifi_dpp_conf_obj *conf_obj)
1406 ret = __save_passphrase(keyfile, group_name,
1407 "Passphrase", conf_obj->passphrase);
1411 ret = __save_passphrase(keyfile, group_name,
1412 "Connector", conf_obj->connector);
1416 ret = __save_passphrase(keyfile, group_name,
1417 "CSignKey", conf_obj->c_sign_key);
1421 ret = __save_passphrase(keyfile, group_name,
1422 "NetAccessKey", conf_obj->net_access_key);
1430 static gboolean __save_configuration_object(wifi_dpp_conf_obj *conf_obj)
1432 gchar ssid_hex[65] = {0,};
1433 gchar *config_id = NULL;
1434 gchar *group_name = NULL;
1435 GKeyFile *keyfile = NULL;
1438 if (!conf_obj->ssid) {
1439 ERR("DPP :there's no SSID in configuration");
1443 if (!__is_configuration_valid(__get_dpp_akm(conf_obj->akm),
1444 conf_obj->passphrase,
1445 conf_obj->connector,
1446 conf_obj->c_sign_key,
1447 conf_obj->net_access_key)) {
1448 ERR("DPP :Invalid AKM information in configuration");
1452 netconfig_convert_bytes_to_hexstr(conf_obj->ssid, strlen(conf_obj->ssid), ssid_hex);
1453 config_id = g_strdup_printf("%s_managed_%s", ssid_hex, conf_obj->akm);
1454 ret = wifi_config_get_group_name("wifi_", config_id, &group_name);
1456 ERR("Failed to get Wi-Fi config group name");
1461 keyfile = g_key_file_new();
1462 g_key_file_set_string(keyfile, group_name, "Name", conf_obj->ssid);
1463 g_key_file_set_string(keyfile, group_name, "SSID", ssid_hex);
1465 if (!__save_credentials(keyfile, group_name, conf_obj)) {
1466 g_key_file_free(keyfile);
1472 g_key_file_set_boolean(keyfile, group_name, "Favorite", TRUE);
1473 g_key_file_set_boolean(keyfile, group_name, "AutoConnect", TRUE);
1475 ret = wifi_config_save_configuration(config_id, keyfile);
1477 INFO("Success to save configuration [%s]", config_id);
1479 INFO("Fail to save configuration [%s]", config_id);
1481 g_key_file_free(keyfile);
1489 void netconfig_wifi_dpp_conf_obj_event(GVariant *message)
1491 GVariantIter *iter = NULL;
1493 GVariant *value = NULL;
1494 wifi_dpp_s *p_dpp_info = NULL;
1495 wifi_dpp_conf_obj conf_obj = {0,};
1497 p_dpp_info = _get_dpp_in_progress();
1499 ERR("DPP :there's no DPP in progress");
1503 g_variant_get(message, "(a{sv})", &iter);
1504 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
1505 if (g_strcmp0(key, "ssid") == 0)
1506 g_variant_get(value, "&s", &conf_obj.ssid);
1507 else if (g_strcmp0(key, "akm") == 0)
1508 g_variant_get(value, "&s", &conf_obj.akm);
1509 else if (g_strcmp0(key, "passphrase") == 0)
1510 g_variant_get(value, "&s", &conf_obj.passphrase);
1511 else if (g_strcmp0(key, "connector") == 0)
1512 g_variant_get(value, "&s", &conf_obj.connector);
1513 else if (g_strcmp0(key, "c_sign_key") == 0)
1514 g_variant_get(value, "&s", &conf_obj.c_sign_key);
1515 else if (g_strcmp0(key, "net_access_key") == 0)
1516 g_variant_get(value, "&s", &conf_obj.net_access_key);
1519 if (!__save_configuration_object(&conf_obj) || !__netconfig_wifi_invoke_flush_bss()) {
1520 g_variant_iter_free(iter);
1521 __netconfig_wifi_dpp_notify_dpp_failed(p_dpp_info);
1525 g_variant_iter_free(iter);
1526 __clear_dpp_process(p_dpp_info);
1527 __netconfig_wifi_dpp_invoke_connman_scan();
1531 gboolean handle_dpp_enter_peer_uri(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1533 gboolean ret = FALSE;
1537 guint32 peer_id = 0;
1539 gboolean is_initiator = FALSE;
1542 INFO("Received DPP enter peer uri Request");
1543 if ((wifi == NULL) || (dpp_info == NULL)) {
1544 ERR("Invalid arguments");
1545 netconfig_error_dbus_method_return(context,
1546 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1550 g_variant_get(dpp_info, "a{sv}", &iter);
1551 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1552 if (g_strcmp0(field, "peer_id") == 0 &&
1553 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1554 peer_id = g_variant_get_uint32(value);
1555 } else if (g_strcmp0(field, "own_id") == 0 &&
1556 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1557 own_id = g_variant_get_uint32(value);
1559 } else if (g_strcmp0(field, "uri") == 0 &&
1560 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1562 uri = g_strdup(g_variant_get_string(value, NULL));
1566 if (!own_id || !uri){
1567 g_variant_iter_free(iter);
1569 ERR("Invalid arguments");
1570 netconfig_error_dbus_method_return(context,
1571 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1574 wifi_complete_dpp_enter_peer_uri(wifi, context);
1576 ret = __netconfig_wifi_dpp_enter_peer_uri(context, peer_id, own_id,
1579 INFO("Success to enter peer uri");
1581 __netconfig_wifi_notify_dpp_failed();
1583 g_variant_iter_free(iter);
1589 gboolean handle_dpp_generate_uri(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1591 gboolean ret = FALSE;
1595 guint32 peer_id = 0;
1597 gboolean is_initiator = FALSE;
1600 INFO("Received DPP gen own uri Request");
1601 if ((wifi == NULL) || (dpp_info == NULL)) {
1602 ERR("Invalid arguments");
1603 netconfig_error_dbus_method_return(context,
1604 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1608 g_variant_get(dpp_info, "a{sv}", &iter);
1609 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1610 if (g_strcmp0(field, "peer_id") == 0 &&
1611 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1612 peer_id = g_variant_get_uint32(value);
1613 } else if (g_strcmp0(field, "own_id") == 0 &&
1614 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1615 own_id = g_variant_get_uint32(value);
1617 } else if (g_strcmp0(field, "is_initiator") == 0 &&
1618 g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
1619 is_initiator = g_variant_get_boolean(value);
1620 } else if (g_strcmp0(field, "key") == 0 &&
1621 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1622 __free_critical(key);
1623 key = g_strdup(g_variant_get_string(value, NULL));
1628 __free_critical(key);
1629 g_variant_iter_free(iter);
1630 ERR("Invalid arguments");
1631 netconfig_error_dbus_method_return(context,
1632 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1635 wifi_complete_dpp_generate_uri(wifi, context);
1637 ret = __netconfig_wifi_dpp_generate_uri(context, peer_id, own_id,
1640 INFO("Success to generate uri");
1642 __netconfig_wifi_notify_dpp_failed();
1644 g_variant_iter_free(iter);
1645 __free_critical(key);
1650 gboolean handle_dpp_start_configurator_initiator(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1655 gchar *group_id = NULL;
1657 gchar *peer_uri = NULL;
1658 guint32 peer_id = 0;
1659 gchar *net_role = NULL;
1661 gchar *configurator_key = NULL;
1664 INFO("Received DPP start configurator initiator");
1665 if ((wifi == NULL) || (dpp_info == NULL)) {
1666 ERR("Invalid arguments");
1667 netconfig_error_dbus_method_return(context,
1668 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1671 if (g_in_progress) {
1672 ERR("DPP in progress");;
1673 netconfig_error_inprogress(context);
1677 g_variant_get(dpp_info, "a{sv}", &iter);
1678 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1679 if (g_strcmp0(field, "group_id") == 0 &&
1680 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1682 group_id = g_strdup(g_variant_get_string(value, NULL));
1683 } else if (g_strcmp0(field, "ssid") == 0 &&
1684 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1686 ssid = g_strdup(g_variant_get_string(value, NULL));
1687 } else if (g_strcmp0(field, "peer_uri") == 0 &&
1688 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1690 peer_uri = g_strdup(g_variant_get_string(value, NULL));
1691 } else if (g_strcmp0(field, "peer_id") == 0 &&
1692 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1693 peer_id = g_variant_get_uint32(value);
1694 } else if (g_strcmp0(field, "net_role") == 0 &&
1695 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1697 net_role = g_strdup(g_variant_get_string(value, NULL));
1698 } else if (g_strcmp0(field, "akm") == 0 &&
1699 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1701 akm = g_strdup(g_variant_get_string(value, NULL));
1702 } else if (g_strcmp0(field, "configurator_key") == 0 &&
1703 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1704 __free_critical(configurator_key);
1705 configurator_key = g_strdup(g_variant_get_string(value, NULL));
1706 } else if (g_strcmp0(field, "pass") == 0 &&
1707 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1708 __free_critical(pass);
1709 pass = g_strdup(g_variant_get_string(value, NULL));
1713 if (!ssid || !akm || !net_role || !peer_uri){
1714 g_variant_iter_free(iter);
1720 __free_critical(configurator_key);
1721 __free_critical(pass);
1722 ERR("Invalid arguments");
1723 netconfig_error_dbus_method_return(context,
1724 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1728 wifi_complete_dpp_start_configurator_initiator(wifi, context);
1730 g_in_progress = __netconfig_wifi_dpp_start_configurator_initiator(context, group_id,
1731 ssid, peer_uri, peer_id, net_role, akm, configurator_key, pass);
1733 INFO("Success to dpp start configurator initiator");
1735 __netconfig_wifi_notify_dpp_failed();
1737 g_variant_iter_free(iter);
1743 __free_critical(configurator_key);
1744 __free_critical(pass);
1748 gboolean handle_dpp_start_enrollee_initiator(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1753 gchar *peer_uri = NULL;
1754 guint32 peer_id = 0;
1756 INFO("Received DPP start enrollee initiator");
1757 if ((wifi == NULL) || (dpp_info == NULL)) {
1758 ERR("Invalid arguments");
1759 netconfig_error_dbus_method_return(context,
1760 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1763 if (g_in_progress) {
1764 ERR("DPP in progress");;
1765 netconfig_error_inprogress(context);
1769 g_variant_get(dpp_info, "a{sv}", &iter);
1770 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1772 if (g_strcmp0(field, "peer_uri") == 0 &&
1773 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1775 peer_uri = g_strdup(g_variant_get_string(value, NULL));
1776 } else if (g_strcmp0(field, "peer_id") == 0 &&
1777 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1778 peer_id = g_variant_get_uint32(value);
1783 g_variant_iter_free(iter);
1784 ERR("Invalid arguments");
1785 netconfig_error_dbus_method_return(context,
1786 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1789 wifi_complete_dpp_start_enrollee_initiator(wifi, context);
1791 g_in_progress = __netconfig_wifi_dpp_start_enrollee_initiator(context, peer_uri, peer_id);
1793 INFO("Success to dpp start enrollee initiator");
1795 __netconfig_wifi_notify_dpp_failed();
1797 g_variant_iter_free(iter);
1803 gboolean handle_dpp_start_configurator_responder(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1808 gchar *group_id = NULL;
1810 gchar *net_role = NULL;
1812 gchar *auth_key = NULL;
1813 gchar *configurator_key = NULL;
1816 INFO("Received DPP start configurator responder");
1817 if ((wifi == NULL) || (dpp_info == NULL)) {
1818 ERR("Invalid arguments");
1819 netconfig_error_dbus_method_return(context,
1820 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1823 if (g_in_progress) {
1824 ERR("DPP in progress");;
1825 netconfig_error_inprogress(context);
1829 g_variant_get(dpp_info, "a{sv}", &iter);
1830 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1831 if (g_strcmp0(field, "group_id") == 0 &&
1832 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1834 group_id = g_strdup(g_variant_get_string(value, NULL));
1835 } else if (g_strcmp0(field, "ssid") == 0 &&
1836 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1838 ssid = g_strdup(g_variant_get_string(value, NULL));
1839 } else if (g_strcmp0(field, "net_role") == 0 &&
1840 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1842 net_role = g_strdup(g_variant_get_string(value, NULL));
1843 } else if (g_strcmp0(field, "akm") == 0 &&
1844 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1846 akm = g_strdup(g_variant_get_string(value, NULL));
1847 } else if (g_strcmp0(field, "auth_key") == 0 &&
1848 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1849 __free_critical(auth_key);
1850 auth_key = g_strdup(g_variant_get_string(value, NULL));
1851 } else if (g_strcmp0(field, "configurator_key") == 0 &&
1852 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1853 __free_critical(configurator_key);
1854 configurator_key = g_strdup(g_variant_get_string(value, NULL));
1855 } else if (g_strcmp0(field, "pass") == 0 &&
1856 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1857 __free_critical(pass);
1858 pass = g_strdup(g_variant_get_string(value, NULL));
1862 if (!ssid || !akm || !net_role){
1863 g_variant_iter_free(iter);
1868 __free_critical(auth_key);
1869 __free_critical(configurator_key);
1870 __free_critical(pass);
1871 ERR("Invalid arguments");
1872 netconfig_error_dbus_method_return(context,
1873 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1876 wifi_complete_dpp_start_configurator_responder(wifi, context);
1878 g_in_progress = __netconfig_wifi_dpp_start_configurator_responder(context, group_id,
1879 ssid, net_role, akm, auth_key, configurator_key, pass);
1881 INFO("Success to dpp start configurator responder");
1883 __netconfig_wifi_notify_dpp_failed();
1885 g_variant_iter_free(iter);
1890 __free_critical(auth_key);
1891 __free_critical(configurator_key);
1892 __free_critical(pass);
1897 gboolean handle_dpp_start_enrollee_responder(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1902 gchar *auth_key = NULL;
1904 INFO("Received DPP start enrollee responder");
1905 if ((wifi == NULL) || (dpp_info == NULL)) {
1906 ERR("Invalid arguments");
1907 netconfig_error_dbus_method_return(context,
1908 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1911 if (g_in_progress) {
1912 ERR("DPP in progress");;
1913 netconfig_error_inprogress(context);
1917 g_variant_get(dpp_info, "a{sv}", &iter);
1918 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1919 if (g_strcmp0(field, "auth_key") == 0 &&
1920 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1921 __free_critical(auth_key);
1922 auth_key = g_strdup(g_variant_get_string(value, NULL));
1925 wifi_complete_dpp_start_enrollee_responder(wifi, context);
1927 g_in_progress = __netconfig_wifi_dpp_start_enrollee_responder(context, auth_key);
1929 INFO("Success to dpp start enrolee responder");
1931 __netconfig_wifi_notify_dpp_failed();
1933 g_variant_iter_free(iter);
1934 __free_critical(auth_key);
1939 gboolean handle_dpp_stop(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1944 guint32 peer_id = 0;
1947 INFO("Received DPP stop Request");
1948 if ((wifi == NULL) || (dpp_info == NULL)) {
1949 ERR("Invalid arguments");
1950 netconfig_error_dbus_method_return(context,
1951 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1955 g_variant_get(dpp_info, "a{sv}", &iter);
1957 g_variant_get(dpp_info, "a{sv}", &iter);
1958 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1959 if (g_strcmp0(field, "peer_id") == 0 &&
1960 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1961 peer_id = g_variant_get_uint32(value);
1962 } else if (g_strcmp0(field, "own_id") == 0 &&
1963 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1964 own_id = g_variant_get_uint32(value);
1967 if (!peer_id && !own_id){
1968 g_variant_iter_free(iter);
1969 ERR("Invalid arguments");
1970 netconfig_error_dbus_method_return(context,
1971 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1974 wifi_complete_dpp_stop(wifi, context);
1976 g_in_progress = !(__netconfig_wifi_dpp_stop(context, peer_id, own_id));
1978 INFO("Success to dpp stop");
1980 __netconfig_wifi_notify_dpp_failed();
1982 g_variant_iter_free(iter);