Fix some WPA Enterprise privacy issues
[framework/connectivity/connman.git] / src / service.c
index a941f44..1d94a66 100644 (file)
@@ -139,6 +139,8 @@ const char *__connman_service_type2string(enum connman_service_type type)
                return "bluetooth";
        case CONNMAN_SERVICE_TYPE_CELLULAR:
                return "cellular";
+       case CONNMAN_SERVICE_TYPE_GPS:
+               return "gps";
        case CONNMAN_SERVICE_TYPE_VPN:
                return "vpn";
        }
@@ -312,13 +314,29 @@ static void strength_changed(struct connman_service *service)
 
 static void favorite_changed(struct connman_service *service)
 {
+       if (service->path == NULL)
+               return;
+
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "Favorite",
                                        DBUS_TYPE_BOOLEAN, &service->favorite);
 }
 
+static void immutable_changed(struct connman_service *service)
+{
+       if (service->path == NULL)
+               return;
+
+       connman_dbus_property_changed_basic(service->path,
+                               CONNMAN_SERVICE_INTERFACE, "Immutable",
+                                       DBUS_TYPE_BOOLEAN, &service->immutable);
+}
+
 static void roaming_changed(struct connman_service *service)
 {
+       if (service->path == NULL)
+               return;
+
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "Roaming",
                                        DBUS_TYPE_BOOLEAN, &service->roaming);
@@ -326,6 +344,9 @@ static void roaming_changed(struct connman_service *service)
 
 static void autoconnect_changed(struct connman_service *service)
 {
+       if (service->path == NULL)
+               return;
+
        connman_dbus_property_changed_basic(service->path,
                                CONNMAN_SERVICE_INTERFACE, "AutoConnect",
                                DBUS_TYPE_BOOLEAN, &service->autoconnect);
@@ -342,6 +363,7 @@ static void passphrase_changed(struct connman_service *service)
        case CONNMAN_SERVICE_TYPE_WIMAX:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_CELLULAR:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                return;
        case CONNMAN_SERVICE_TYPE_WIFI:
@@ -355,10 +377,11 @@ static void passphrase_changed(struct connman_service *service)
                case CONNMAN_SERVICE_SECURITY_PSK:
                case CONNMAN_SERVICE_SECURITY_WPA:
                case CONNMAN_SERVICE_SECURITY_RSN:
-               case CONNMAN_SERVICE_SECURITY_8021X:
                        if (service->passphrase == NULL)
                                required = TRUE;
                        break;
+               case CONNMAN_SERVICE_SECURITY_8021X:
+                       break;
                }
                break;
        }
@@ -379,6 +402,7 @@ static void apn_changed(struct connman_service *service)
        case CONNMAN_SERVICE_TYPE_WIMAX:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
        case CONNMAN_SERVICE_TYPE_WIFI:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                return;
        case CONNMAN_SERVICE_TYPE_CELLULAR:
@@ -440,6 +464,26 @@ static void append_ipv4config(DBusMessageIter *iter, void *user_data)
                __connman_ipconfig_append_ipv4config(service->ipconfig, iter);
 }
 
+static void append_proxy(DBusMessageIter *iter, void *user_data)
+{
+       struct connman_service *service = user_data;
+
+       switch (service->state) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_FAILURE:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+               return;
+       case CONNMAN_SERVICE_STATE_READY:
+               break;
+       }
+
+       if (service->ipconfig != NULL)
+               __connman_ipconfig_append_proxy(service->ipconfig, iter);
+}
+
 static void settings_changed(struct connman_service *service)
 {
        connman_dbus_property_changed_dict(service->path,
@@ -447,6 +491,15 @@ static void settings_changed(struct connman_service *service)
                                                        append_ipv4, service);
 }
 
+static void ipv4_configuration_changed(struct connman_service *service)
+{
+       connman_dbus_property_changed_dict(service->path,
+                                       CONNMAN_SERVICE_INTERFACE,
+                                                       "IPv4.Configuration",
+                                                       append_ipv4config,
+                                                       service);
+}
+
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -515,8 +568,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
-       case CONNMAN_SERVICE_TYPE_WIMAX:
-       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                break;
        case CONNMAN_SERVICE_TYPE_CELLULAR:
@@ -568,16 +620,19 @@ static DBusMessage *get_properties(DBusConnection *conn,
                case CONNMAN_SERVICE_SECURITY_PSK:
                case CONNMAN_SERVICE_SECURITY_WPA:
                case CONNMAN_SERVICE_SECURITY_RSN:
-               case CONNMAN_SERVICE_SECURITY_8021X:
                        if (service->passphrase == NULL)
                                required = TRUE;
                        break;
+               case CONNMAN_SERVICE_SECURITY_8021X:
+                       break;
                }
 
                connman_dbus_dict_append_basic(&dict, "PassphraseRequired",
                                                DBUS_TYPE_BOOLEAN, &required);
                /* fall through */
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_WIMAX:
+       case CONNMAN_SERVICE_TYPE_BLUETOOTH:
                connman_dbus_dict_append_dict(&dict, "Ethernet",
                                                append_ethernet, service);
                break;
@@ -588,6 +643,8 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_append_dict(&dict, "IPv4.Configuration",
                                                append_ipv4config, service);
 
+       connman_dbus_dict_append_dict(&dict, "Proxy", append_proxy, service);
+
        connman_dbus_dict_close(&array, &dict);
 
        return reply;
@@ -727,6 +784,8 @@ static DBusMessage *set_property(DBusConnection *conn,
                if (err < 0)
                        return __connman_error_failed(msg, -err);
 
+               ipv4_configuration_changed(service);
+
                __connman_storage_save_service(service);
        } else
                return __connman_error_invalid_property(msg);
@@ -1059,7 +1118,7 @@ static DBusMessage *remove_service(DBusConnection *conn,
 
        set_idle(service);
 
-       connman_service_set_favorite(service, FALSE);
+       __connman_service_set_favorite(service, FALSE);
        __connman_storage_save_service(service);
 
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
@@ -1322,6 +1381,7 @@ static gint service_compare(gconstpointer a, gconstpointer b,
                case CONNMAN_SERVICE_TYPE_UNKNOWN:
                case CONNMAN_SERVICE_TYPE_SYSTEM:
                case CONNMAN_SERVICE_TYPE_ETHERNET:
+               case CONNMAN_SERVICE_TYPE_GPS:
                case CONNMAN_SERVICE_TYPE_VPN:
                        break;
                case CONNMAN_SERVICE_TYPE_WIFI:
@@ -1387,13 +1447,13 @@ __connman_service_get_network(struct connman_service *service)
 }
 
 /**
- * connman_service_set_favorite:
+ * __connman_service_set_favorite:
  * @service: service structure
  * @favorite: favorite value
  *
  * Change the favorite setting of service
  */
-int connman_service_set_favorite(struct connman_service *service,
+int __connman_service_set_favorite(struct connman_service *service,
                                                connman_bool_t favorite)
 {
        GSequenceIter *iter;
@@ -1416,6 +1476,16 @@ int connman_service_set_favorite(struct connman_service *service,
        return 0;
 }
 
+int __connman_service_set_immutable(struct connman_service *service,
+                                               connman_bool_t immutable)
+{
+       service->immutable = immutable;
+
+       immutable_changed(service);
+
+       return 0;
+}
+
 void __connman_service_set_string(struct connman_service *service,
                                  const char *key, const char *value)
 {
@@ -1477,6 +1547,9 @@ int __connman_service_indicate_state(struct connman_service *service,
                __connman_service_disconnect(service);
        }
 
+       if (state == CONNMAN_SERVICE_STATE_CONFIGURATION)
+               __connman_ipconfig_enable(service->ipconfig);
+
        service->state = state;
        state_changed(service);
 
@@ -1491,7 +1564,7 @@ int __connman_service_indicate_state(struct connman_service *service,
        if (state == CONNMAN_SERVICE_STATE_READY) {
                set_reconnect_state(service, TRUE);
 
-               connman_service_set_favorite(service, TRUE);
+               __connman_service_set_favorite(service, TRUE);
 
                reply_pending(service, 0);
 
@@ -1598,34 +1671,34 @@ static connman_bool_t prepare_network(struct connman_service *service)
 
 static void prepare_8021x(struct connman_service *service)
 {
-       if (service->eap)
+       if (service->eap != NULL)
                connman_network_set_string(service->network, "WiFi.EAP",
                                                                service->eap);
 
-       if (service->identity)
+       if (service->identity != NULL)
                connman_network_set_string(service->network, "WiFi.Identity",
                                                        service->identity);
 
-       if (service->ca_cert_file)
+       if (service->ca_cert_file != NULL)
                connman_network_set_string(service->network, "WiFi.CACertFile",
                                                        service->ca_cert_file);
 
-       if (service->client_cert_file)
+       if (service->client_cert_file != NULL)
                connman_network_set_string(service->network,
                                                "WiFi.ClientCertFile",
                                                service->client_cert_file);
 
-       if (service->private_key_file)
+       if (service->private_key_file != NULL)
                connman_network_set_string(service->network,
                                                "WiFi.PrivateKeyFile",
                                                service->private_key_file);
 
-       if (service->private_key_passphrase)
+       if (service->private_key_passphrase != NULL)
                connman_network_set_string(service->network,
                                        "WiFi.PrivateKeyPassphrase",
                                        service->private_key_passphrase);
 
-       if (service->phase2)
+       if (service->phase2 != NULL)
                connman_network_set_string(service->network, "WiFi.Phase2",
                                                        service->phase2);
 }
@@ -1645,6 +1718,7 @@ int __connman_service_connect(struct connman_service *service)
        switch (service->type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                return -EINVAL;
        case CONNMAN_SERVICE_TYPE_ETHERNET:
@@ -1664,10 +1738,11 @@ int __connman_service_connect(struct connman_service *service)
                case CONNMAN_SERVICE_SECURITY_PSK:
                case CONNMAN_SERVICE_SECURITY_WPA:
                case CONNMAN_SERVICE_SECURITY_RSN:
-               case CONNMAN_SERVICE_SECURITY_8021X:
                        if (service->passphrase == NULL)
                                return -ENOKEY;
                        break;
+               case CONNMAN_SERVICE_SECURITY_8021X:
+                       break;
                }
                break;
        }
@@ -2334,6 +2409,7 @@ struct connman_service *__connman_service_create_from_network(struct connman_net
        case CONNMAN_SERVICE_TYPE_ETHERNET:
        case CONNMAN_SERVICE_TYPE_WIMAX:
        case CONNMAN_SERVICE_TYPE_BLUETOOTH:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                service->autoconnect = FALSE;
                break;
@@ -2465,6 +2541,7 @@ static int service_load(struct connman_service *service)
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                break;
        case CONNMAN_SERVICE_TYPE_WIFI:
@@ -2611,6 +2688,7 @@ update:
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+       case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
                break;
        case CONNMAN_SERVICE_TYPE_WIFI: