2 * Network Configuration - EAPoL Service Module
4 * Copyright (c) 2020 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 <gio/gunixfdlist.h>
29 #include "wifi-power.h"
30 #include "netsupplicant.h"
32 #define EAPOL_STORAGEDIR "/opt/usr/data/network/"
33 #define ETH_IFNAME "eth0"
35 #define CONNMAN_CONFIG_FIELD_EAP_METHOD "EAP"
36 #define CONNMAN_CONFIG_FIELD_IDENTITY "Identity"
37 #define CONNMAN_CONFIG_FIELD_PASSPHRASE "Passphrase"
38 #define CONNMAN_CONFIG_FIELD_ANONYMOUS_IDENTITY "AnonymousIdentity"
39 #define CONNMAN_CONFIG_FIELD_CA_CERT_FILE "CACertFile"
40 #define CONNMAN_CONFIG_FIELD_CLIENT_CERT_FILE "ClientCertFile"
41 #define CONNMAN_CONFIG_FIELD_PVT_KEY_FILE "PrivateKeyFile"
42 #define CONNMAN_CONFIG_FIELD_PVT_KEY_PASSPHRASE "PrivateKeyPassphrase"
43 #define CONNMAN_CONFIG_FIELD_PAC_FILE "PacFile"
44 #define CONNMAN_CONFIG_FIELD_PHASE2 "Phase2"
45 #define CONNMAN_CONFIG_FIELD_PHASE1 "Phase1"
47 static Ethernet *ethernet_object = NULL;
48 static gboolean g_eap_supported = FALSE;
50 Ethernet *get_ethernet_object(void)
52 return ethernet_object;
55 static gboolean __netconfig_set_eap_config_file(GVariant *fields)
59 gchar *filename = NULL;
63 /* create eapol conf file */
64 filename = g_strdup_printf("%s/%s-eapol.conf", EAPOL_STORAGEDIR, ETH_IFNAME);
66 ERR("Failed to allocate memory.");
71 fp = fopen(filename, "w");
73 ERR("Failed to open %s", filename);
78 /* update eapol conf file */
79 fprintf (fp, "network={\n");
80 fprintf (fp, "key_mgmt=WPA-EAP\n");
82 g_variant_get(fields, "a{ss}", &iter);
83 while (g_variant_iter_loop(iter, "{ss}", &field, &value)) {
84 if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_EAP_METHOD) == 0) {
85 DBG("field: %s, value: %s", field, value);
88 fprintf (fp, "eap=%s\n", value);
89 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_IDENTITY) == 0) {
90 DBG("field: %s, value: %s", field, value);
93 fprintf (fp, "identity=\"%s\"\n", value);
94 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_ANONYMOUS_IDENTITY) == 0) {
95 DBG("field: %s, value: %s", field, value);
98 fprintf (fp, "anonymous_identity=\"%s\"\n", value);
99 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_PASSPHRASE) == 0) {
100 DBG("field: %s, value: %s", field, value);
103 fprintf (fp, "password=\"%s\"\n", value);
104 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_CA_CERT_FILE) == 0) {
105 DBG("field: %s, value: %s", field, value);
108 fprintf (fp, "ca_cert=\"%s\"\n", value);
109 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_CLIENT_CERT_FILE) == 0) {
110 DBG("field: %s, value: %s", field, value);
113 fprintf (fp, "client_cert=\"%s\"\n", value);
114 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_PVT_KEY_FILE) == 0) {
115 DBG("field: %s, value: %s", field, value);
118 fprintf (fp, "private_key=\"%s\"\n", value);
119 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_PVT_KEY_PASSPHRASE) == 0) {
120 DBG("field: %s, value: %s", field, value);
123 fprintf (fp, "private_key_passwd=\"%s\"\n", value);
124 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_PAC_FILE) == 0) {
125 DBG("field: %s, value: %s", field, value);
128 fprintf (fp, "pac_file=\"%s\"\n", value);
129 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_PHASE2) == 0) {
130 DBG("field: %s, value: %s", field, value);
134 sprintf(str, "auth=%s", value);
135 fprintf (fp, "phase2=\"%s\"\n", str);
137 } else if (g_strcmp0(field, CONNMAN_CONFIG_FIELD_PHASE1) == 0) {
138 DBG("field: %s, value: %s", field, value);
143 if ((g_strcmp0(value, "VERSION_AUTO") == 0) ||
144 (g_strcmp0(value, "VERSION_0") == 0))
148 sprintf(str, "peapver=%d", peap_version);
149 fprintf (fp, "phase1=\"%s\"\n", str);
154 fprintf (fp, "}"); /* closing of conf file */
164 /*********************
165 * Handler Functions *
166 ********************/
168 gboolean handle_enable_eap(Ethernet *object, GDBusMethodInvocation *invocation,
169 const gchar *service, gboolean enable)
171 g_return_val_if_fail(object != NULL, TRUE);
173 DBG("%s EAPoL", enable ? "enable" : "disable");
175 if (netconfig_is_ethernet_profile(service) != TRUE) {
176 netconfig_error_dbus_method_return(invocation, NETCONFIG_ERROR_WRONG_PROFILE, "InvalidService");
180 /* TODO: Execute WPA Supplicant if not running */
181 __execute_supplicant(enable);
183 /* TODO: Make below variable interface specific and set
184 connMan profile associated with this interface as EAP enabled.
186 g_eap_supported = enable;
188 if (enable == false) {
189 gboolean use_eapol = false;
190 GVariant *params = g_variant_new("(sv)", "UseEapol", g_variant_new_boolean(use_eapol));
192 GVariant *message = netconfig_invoke_dbus_method(CONNMAN_SERVICE, service,
193 CONNMAN_SERVICE_INTERFACE, "SetProperty", params);
195 ERR("Failed to reset EAPoL property");
197 g_variant_unref(message);
200 ethernet_complete_enable_eap(object, invocation);
204 gboolean handle_is_eap_supported(Ethernet *object, GDBusMethodInvocation *invocation)
206 g_return_val_if_fail(object != NULL, TRUE);
208 DBG("handle_is_eap_supported");
209 gboolean value = FALSE;
211 value = g_eap_supported;
213 ethernet_complete_is_eap_supported(object, invocation, value);
217 gboolean handle_set_eap_config(Ethernet *object, GDBusMethodInvocation *invocation,
218 const gchar *service, GVariant *fields)
220 g_return_val_if_fail(object != NULL, TRUE);
222 GVariant *message = NULL;
223 GVariant *params = NULL;
224 gboolean use_eapol = true;
226 DBG("handle_set_eap_config for service [%s]", service);
228 if (netconfig_is_ethernet_profile(service) != TRUE) {
229 netconfig_error_dbus_method_return(invocation, NETCONFIG_ERROR_WRONG_PROFILE, "InvalidService");
233 if (g_eap_supported == FALSE) {
234 netconfig_error_dbus_method_return(invocation,
235 NETCONFIG_ERROR_INTERNAL,
240 /** Create conf file */
241 int err = __netconfig_set_eap_config_file(fields);
243 ERR("Failed to save eapol conf file.");
244 netconfig_error_dbus_method_return(invocation, NETCONFIG_ERROR_INTERNAL, "InternalError");
248 params = g_variant_new("(sv)", "UseEapol", g_variant_new_boolean(use_eapol));
250 message = netconfig_invoke_dbus_method(CONNMAN_SERVICE, service,
251 CONNMAN_SERVICE_INTERFACE, "SetProperty", params);
253 ERR("Failed to Set EAPoL property");
255 g_variant_unref(message);
257 ethernet_complete_set_eap_config(object, invocation);
261 /*****************************
262 * Initializations Functions *
263 ****************************/
264 void ethernet_object_create_and_init(void)
266 DBG("Create ethernet object.");
267 GDBusInterfaceSkeleton *interface_ethernet = NULL;
268 GDBusConnection *connection = NULL;
269 GDBusObjectManagerServer *server = netdbus_get_ethernet_manager();
273 connection = netdbus_get_connection();
274 g_dbus_object_manager_server_set_connection(server, connection);
277 ethernet_object = ethernet_skeleton_new();
278 interface_ethernet = G_DBUS_INTERFACE_SKELETON(ethernet_object);
280 /* EAP over Ethernet Service */
281 g_signal_connect(ethernet_object, "handle-enable-eap",
282 G_CALLBACK(handle_enable_eap), NULL);
283 g_signal_connect(ethernet_object, "handle-is-eap-supported",
284 G_CALLBACK(handle_is_eap_supported), NULL);
285 g_signal_connect(ethernet_object, "handle-set-eap-config",
286 G_CALLBACK(handle_set_eap_config), NULL);
288 if (!g_dbus_interface_skeleton_export(interface_ethernet, connection,
289 NETCONFIG_ETHERNET_PATH, NULL)) {
290 ERR("Export NETCONFIG_ETHERNET_PATH for ethernet failed");
296 void ethernet_object_deinit(void)
298 DBG("Deinit ethernet object.");
300 g_object_unref(ethernet_object);