X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bus%2Fservices.c;h=90a2f5f18cd556c9e695b06a093ee075c47d8fe7;hb=c1a77d2c58c78abc606f1cb7918704596ebf2bfe;hp=7c42c7d2417e3b1055665ebac4b2582e9534e870;hpb=a0be921da79a78e2c0484d99aac9002a1de1d0cf;p=platform%2Fupstream%2Fdbus.git diff --git a/bus/services.c b/bus/services.c index 7c42c7d..90a2f5f 100644 --- a/bus/services.c +++ b/bus/services.c @@ -46,6 +46,7 @@ #include "kdbus-d.h" #include "dbus/kdbus.h" +#include "dbus/kdbus-common.h" #endif struct BusService @@ -222,7 +223,7 @@ bus_owner_set_flags (BusOwner *owner, #ifdef ENABLE_KDBUS_TRANSPORT owner->is_kdbus_starter = - (flags & KDBUS_NAME_STARTER) != FALSE; + (flags & KDBUS_NAME_STARTER_NAME) != FALSE; #endif } @@ -650,14 +651,14 @@ bus_registry_acquire_kdbus_service (BusRegistry *registry, dbus_bool_t retval; BusService *service; BusActivation *activation; - DBusString service_name_real; const DBusString *service_name = &service_name_real; char* name; dbus_uint32_t flags; __u64 sender_id; - dbus_bool_t rm_owner_daemon = FALSE; const char* conn_unique_name; + DBusConnection* phantom; + unsigned long int uid; if (!dbus_message_get_args (message, error, DBUS_TYPE_STRING, &name, @@ -673,25 +674,22 @@ bus_registry_acquire_kdbus_service (BusRegistry *registry, _dbus_string_get_length (service_name))) { dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, - "Requested bus name \"%s\" is not valid", - _dbus_string_get_const_data (service_name)); + "Requested bus name \"%s\" is not valid", name); _dbus_verbose ("Attempt to acquire invalid service name\n"); - goto out; + return FALSE; } if (_dbus_string_get_byte (service_name, 0) == ':') { /* Not allowed; only base services can start with ':' */ dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, - "Cannot acquire a service starting with ':' such as \"%s\"", - _dbus_string_get_const_data (service_name)); + "Cannot acquire a service starting with ':' such as \"%s\"", name); - _dbus_verbose ("Attempt to acquire invalid base service name \"%s\"", - _dbus_string_get_const_data (service_name)); + _dbus_verbose ("Attempt to acquire invalid base service name \"%s\"", name); - goto out; + return FALSE; } conn_unique_name = dbus_message_get_sender(message); @@ -702,104 +700,87 @@ bus_registry_acquire_kdbus_service (BusRegistry *registry, "Connection \"%s\" is not allowed to own the service \"%s\"because " "it is reserved for D-Bus' use only", conn_unique_name, DBUS_SERVICE_DBUS); - goto out; + return FALSE; } - if (!bus_client_policy_check_can_own (bus_connection_get_policy (connection), service_name)) - { - dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, - "Connection \"%s\" is not allowed to own the service \"%s\" due " - "to security policies in the configuration file", - conn_unique_name, _dbus_string_get_const_data (service_name)); - goto out; - } + sender_id = sender_name_to_id(conn_unique_name, error); + if(dbus_error_is_set(error)) + return FALSE; - service = bus_registry_lookup (registry, service_name); - if (service == NULL) - { - service = bus_registry_ensure (registry, service_name, connection, flags, - transaction, error); //adds daemon to service owners list - must be removed after right owner is set - if (service == NULL) - goto out; + phantom = bus_connections_find_conn_by_name(bus_connection_get_connections(connection), conn_unique_name); + if(phantom == NULL) + { + phantom = create_phantom_connection(connection, conn_unique_name, error); + if(phantom == NULL) + return FALSE; + } - rm_owner_daemon = TRUE; - if(!kdbus_register_policy(service_name, connection)) - { - dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, - "Kdbus error when setting policy for connection \"%s\" and service name \"%s\"", - conn_unique_name, _dbus_string_get_const_data (service_name)); - goto failed; - } - } + if (!bus_client_policy_check_can_own (bus_connection_get_policy (phantom), service_name)) + { + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, + "Connection \"%s\" is not allowed to own the service \"%s\" due " + "to security policies in the configuration file", conn_unique_name, name); + goto failed; + } - sender_id = sender_name_to_id(conn_unique_name, error); - if(dbus_error_is_set(error)) - goto failed; + if (!kdbus_connection_get_unix_user(phantom, conn_unique_name, &uid, NULL)) + goto failed; - *result = kdbus_request_name(connection, service_name, flags, sender_id); - if(*result == -EPERM) - { - dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, - "Kdbus not allowed to own the service \"%s\"", - _dbus_string_get_const_data (service_name)); - goto failed; - } - else if(*result < 0) - { - dbus_set_error (error, DBUS_ERROR_FAILED , "Name \"%s\" could not be acquired", name); - goto failed; - } +#ifdef POLICY_TO_KDBUS + if (!register_kdbus_policy(name, dbus_connection_get_transport(phantom), uid)) + { + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, + "Kdbus error when setting policy for connection \"%s\" and service name \"%s\"", + conn_unique_name, name); + goto failed; + } +#endif - if((*result == DBUS_REQUEST_NAME_REPLY_IN_QUEUE) || (*result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)) - { - DBusConnection* phantom; - const char* name; -// DBusList *link; - - name = dbus_message_get_sender(message); - phantom = bus_connections_find_conn_by_name(bus_connection_get_connections(connection), name); - if(phantom == NULL) - phantom = create_phantom_connection(connection, name, error); - if(phantom == NULL) - goto failed2; - if (!bus_service_add_owner (service, phantom, flags, transaction, error)) - goto failed2; - if((*result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) && rm_owner_daemon) - { - /* Here we are removing DBus daemon as an owner of the service, - * which is set by bus_registry_ensure. - * If bus_service_remove_owner fail, we ignore it, because it has - * almost none impact on the usage - */ - if(_bus_service_find_owner_link (service, connection)) - bus_service_remove_owner (service, connection, transaction, NULL); - } - /*if(bus_service_get_is_kdbus_starter(service)) - { - if (!bus_service_swap_owner (service, bus_service_get_primary_owners_connection(service), - transaction, error)) - goto failed2; - }*/ - /*if((link = _bus_service_find_owner_link (service, connection))) //if daemon is a starter - { - _dbus_list_unlink (&service->owners, link); - _dbus_list_append_link (&service->owners, link); //it must be moved at the end of the queue - }*/ - } + *result = kdbus_request_name(connection, service_name, flags, sender_id); + if(*result == -EPERM) + { + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, + "Kdbus not allowed %s to own the service \"%s\"", + conn_unique_name, _dbus_string_get_const_data (service_name)); + goto failed; + } + else if(*result < 0) + { + dbus_set_error (error, DBUS_ERROR_FAILED , "Name \"%s\" could not be acquired", name); + goto failed; + } - activation = bus_context_get_activation (registry->context); - retval = bus_activation_send_pending_auto_activation_messages (activation, - service, - transaction, - error); - out: - return retval; + if((*result == DBUS_REQUEST_NAME_REPLY_IN_QUEUE) || (*result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)) + { + service = bus_registry_lookup (registry, service_name); + if (service == NULL) + { + service = bus_registry_ensure (registry, service_name, phantom, flags, + transaction, error); + if (service == NULL) + goto failed2; + } + else + { + if (!bus_service_add_owner (service, phantom, flags, transaction, error)) + goto failed2; + } + + activation = bus_context_get_activation (registry->context); + retval = bus_activation_send_pending_auto_activation_messages (activation, + service, + transaction, + error); + } + else + retval = TRUE; + + return retval; failed2: - kdbus_release_name(connection, service_name, sender_id); + kdbus_release_name(phantom, service_name, sender_id); failed: - if(_bus_service_find_owner_link (service, connection)) - bus_service_remove_owner (service, connection, transaction, NULL); + bus_connection_disconnected(phantom); return FALSE; } @@ -1526,9 +1507,16 @@ bus_service_get_primary_owners_connection (BusService *service) owner = bus_service_get_primary_owner (service); #ifdef ENABLE_KDBUS_TRANSPORT - if(kdbus_get_name_owner(owner->conn, bus_service_get_name(service), unique_name) < 0) + if(!owner) return NULL; - return _bus_service_find_owner_connection(service, unique_name); //bus_connections_find_conn_by_name would be safer? but slower + if(bus_context_is_kdbus(service->registry->context)) + { + if(kdbus_get_name_owner(owner->conn, bus_service_get_name(service), unique_name) < 0) + return NULL; + return _bus_service_find_owner_connection(service, unique_name); //bus_connections_find_conn_by_name would be safer? but slower + } + else + return owner->conn; #else if (owner != NULL) return owner->conn;