summaryrefslogtreecommitdiff
path: root/dbus
diff options
context:
space:
mode:
authorRadoslaw Pajak <r.pajak@samsung.com>2013-11-06 10:43:02 +0100
committerLubomir Rintel <lkundrak@v3.sk>2015-02-11 11:55:09 +0100
commitd9bb3c6b4b5d41a423a3c18546ac2eab4870a537 (patch)
tree35112fc5aa73f05af35c2b2041b11364a1123461 /dbus
parent70a034ad20d7e4850fc8abf43781577eae8e3716 (diff)
[lib-fix] handling org.freedesktop.DBus.Hello fixed
- handling org.freedesktop.DBus.Hello method fixed and optimized - removed commented (unused and no longer needed) code from library Change-Id: I087addcd12988926e33607d186729d224a4d56ce Signed-off-by: Radoslaw Pajak <r.pajak@samsung.com>
Diffstat (limited to 'dbus')
-rw-r--r--dbus/dbus-transport-kdbus.c315
-rw-r--r--dbus/dbus-transport-kdbus.h4
2 files changed, 20 insertions, 299 deletions
diff --git a/dbus/dbus-transport-kdbus.c b/dbus/dbus-transport-kdbus.c
index d6c5bed6..6c1d05a2 100644
--- a/dbus/dbus-transport-kdbus.c
+++ b/dbus/dbus-transport-kdbus.c
@@ -501,306 +501,31 @@ static dbus_bool_t bus_register_kdbus(char* name, DBusTransportKdbus* transportS
*/
static int emulateOrgFreedesktopDBus(DBusTransport *transport, DBusMessage *message)
{
-#ifdef DBUS_SERVICES_IN_LIB
- int inter_ret;
- struct nameInfo info;
-#endif
- int ret_value = -1;
-
- if(!strcmp(dbus_message_get_member(message), "Hello"))
- {
- char* sender = NULL;
- char* name = NULL;
-
- name = malloc(snprintf(name, 0, "%llu", ULLONG_MAX) + 1);
- if(name == NULL)
- return -1;
- if(!bus_register_kdbus(name, (DBusTransportKdbus*)transport))
- goto outH1;
- if(!register_kdbus_policy(name, transport, geteuid()))
- goto outH1;
-
- sender = malloc (strlen(name) + 4);
- if(!sender)
- goto outH1;
- sprintf(sender, ":1.%s", name);
- ((DBusTransportKdbus*)transport)->sender = sender;
-
- if(!reply_1_data(message, DBUS_TYPE_STRING, &name, transport->connection))
- return 0; //todo why we cannot free name after sending reply, shouldn't we?
- else
- free(sender);
-
- outH1:
- free(name);
- }
-#ifdef DBUS_SERVICES_IN_LIB
- else if(!strcmp(dbus_message_get_member(message), "RequestName"))
- {
- char* name;
- int flags;
- int result;
-
- if(!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_UINT32, &flags, DBUS_TYPE_INVALID))
- return -1;
-
- if(!register_kdbus_policy(name, ((DBusTransportKdbus*)transport)->fd))
- return -1;
-
- result = request_kdbus_name(((DBusTransportKdbus*)transport)->fd, name, flags, 0);
- if(result == -EPERM)
- return reply_with_error(DBUS_ERROR_ACCESS_DENIED,
- "Connection is not allowed to own the service \"%s\" due to security policies in the configuration file",
- name, message, transport->connection);
- else if(result < 0)
- return reply_with_error(DBUS_ERROR_FAILED , "Name \"%s\" could not be acquired", name, message, transport->connection);
- else
- return reply_1_data(message, DBUS_TYPE_UINT32, &result, transport->connection);
- }
- else if(!strcmp(dbus_message_get_member(message), "AddMatch"))
- {
- char* rule;
-
- if(!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &rule, DBUS_TYPE_INVALID))
- return -1;
-
- if(!add_match_kdbus(transport, 0, rule))
- return -1;
-
- return reply_ack(message,transport->connection);
- }
- else if(!strcmp(dbus_message_get_member(message), "RemoveMatch"))
- {
- if(!remove_match_kdbus(transport, 0))
- return -1;
- return reply_ack(message, transport->connection);
- }
- else if(!strcmp(dbus_message_get_member(message), "GetNameOwner")) //returns id of the well known name
- {
- char* name = NULL;
-
- dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
- inter_ret = kdbus_NameQuery(name, transport, &info);
- if(inter_ret == 0) //unique id of the name
- {
- char unique_name[(unsigned int)(snprintf(name, 0, "%llu", ULLONG_MAX) + sizeof(":1."))];
- const char* pString = unique_name;
-
- sprintf(unique_name, ":1.%llu", (unsigned long long int)info.uniqueId);
- _dbus_verbose("Unique name discovered:%s\n", unique_name);
- ret_value = reply_1_data(message, DBUS_TYPE_STRING, &pString, transport->connection);
- }
- else if(inter_ret == -ENOENT) //name has no owner
- return reply_with_error(DBUS_ERROR_NAME_HAS_NO_OWNER, "Could not get owner of name '%s': no such name", name, message, transport->connection);
- else
- {
- _dbus_verbose("kdbus error sending name query: err %d (%m)\n", errno);
- ret_value = reply_with_error(DBUS_ERROR_FAILED, "Could not determine unique name for '%s'", name, message, transport->connection);
- }
- }
- else if(!strcmp(dbus_message_get_member(message), "NameHasOwner")) //returns if name is currently registered on the bus
- {
- char* name = NULL;
- dbus_bool_t result;
-
- dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
- inter_ret = kdbus_NameQuery(name, transport, &info);
- if((inter_ret == 0) || (inter_ret == -ENOENT))
- {
- result = (inter_ret == 0) ? TRUE : FALSE;
- ret_value = reply_1_data(message, DBUS_TYPE_BOOLEAN, &result, transport->connection);
- }
- else
- {
- _dbus_verbose("kdbus error checking if name exists: err %d (%m)\n", errno);
- ret_value = reply_with_error(DBUS_ERROR_FAILED, "Could not determine whether name '%s' exists", name, message, transport->connection);
- }
- }
- else if(!strcmp(dbus_message_get_member(message), "GetConnectionUnixUser"))
- {
- char* name = NULL;
-
- dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
- inter_ret = kdbus_NameQuery(name, transport, &info);
- if(inter_ret == 0) //name found
- {
- _dbus_verbose("User id:%llu\n", (unsigned long long) info.userId);
- ret_value = reply_1_data(message, DBUS_TYPE_UINT32, &info.userId, transport->connection);
- }
- else if(inter_ret == -ENOENT) //name has no owner
- return reply_with_error(DBUS_ERROR_NAME_HAS_NO_OWNER, "Could not get UID of name '%s': no such name", name, message, transport->connection);
- else
- {
- _dbus_verbose("kdbus error determining UID: err %d (%m)\n", errno);
- ret_value = reply_with_error(DBUS_ERROR_FAILED, "Could not determine UID for '%s'", name, message, transport->connection);
- }
- }
- else if(!strcmp(dbus_message_get_member(message), "GetConnectionUnixProcessID"))
- {
- char* name = NULL;
-
- dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
- inter_ret = kdbus_NameQuery(name, transport, &info);
- if(inter_ret == 0) //name found
- ret_value = reply_1_data(message, DBUS_TYPE_UINT32, &info.processId, transport->connection);
- else if(inter_ret == -ENOENT) //name has no owner
- return reply_with_error(DBUS_ERROR_NAME_HAS_NO_OWNER, "Could not get PID of name '%s': no such name", name, message, transport->connection);
- else
- {
- _dbus_verbose("kdbus error determining PID: err %d (%m)\n", errno);
- ret_value = reply_with_error(DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN,"Could not determine PID for '%s'", name, message, transport->connection);
- }
- }
- else if(!strcmp(dbus_message_get_member(message), "ListNames")) //return all well known names on he bus
- {
- struct kdbus_cmd_names* pCmd;
- uint64_t cmd_size;
-
- cmd_size = sizeof(struct kdbus_cmd_names) + KDBUS_ITEM_SIZE(1);
- pCmd = malloc(cmd_size);
- if(pCmd == NULL)
- goto out;
- pCmd->size = cmd_size;
-
- again:
- cmd_size = 0;
- if(ioctl(((DBusTransportKdbus*)transport)->fd, KDBUS_CMD_NAME_LIST, pCmd))
- {
- if(errno == EINTR)
- goto again;
- if(errno == ENOBUFS) //buffer to small to put all names into it
- cmd_size = pCmd->size; //here kernel tells how much memory it needs
- else
- {
- _dbus_verbose("kdbus error asking for name list: err %d (%m)\n",errno);
- goto out;
- }
- }
- if(cmd_size) //kernel needs more memory
- {
- pCmd = realloc(pCmd, cmd_size); //prepare memory
- if(pCmd == NULL)
- return -1;
- goto again; //and try again
- }
- else
- {
- DBusMessage *reply;
- DBusMessageIter iter, sub;
- struct kdbus_cmd_name* pCmd_name;
- char* pName;
-
- reply = dbus_message_new_method_return(message);
- if(reply == NULL)
- goto out;
- dbus_message_set_sender(reply, DBUS_SERVICE_DBUS);
- dbus_message_iter_init_append(reply, &iter);
- if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &sub))
- {
- dbus_message_unref(reply);
- goto out;
- }
- for (pCmd_name = pCmd->names; (uint8_t *)(pCmd_name) < (uint8_t *)(pCmd) + pCmd->size; pCmd_name = KDBUS_PART_NEXT(pCmd_name))
- {
- pName = pCmd_name->name;
- if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &pName))
- {
- dbus_message_unref(reply);
- goto out;
- }
- }
-
- if (!dbus_message_iter_close_container (&iter, &sub))
- {
- dbus_message_unref (reply);
- goto out;
- }
+ if(!strcmp(dbus_message_get_member(message), "Hello"))
+ {
+ char* name = NULL;
- if(add_message_to_received(reply, transport->connection))
- ret_value = 0;
- }
-out:
- if(pCmd)
- free(pCmd);
- return ret_value;
- }
- else if(!strcmp(dbus_message_get_member(message), "GetId"))
- {
- char* path;
- char uuid[DBUS_UUID_LENGTH_BYTES];
- struct stat stats;
- MD5_CTX md5;
- DBusString binary, encoded;
-
- path = &transport->address[11]; //start of kdbus bus path
- if(stat(path, &stats) < -1)
- {
- _dbus_verbose("kdbus error reading stats of bus: err %d (%m)\n", errno);
- return reply_with_error(DBUS_ERROR_FAILED, "Could not determine bus '%s' uuid", path, message, transport->connection);
- }
+ name = malloc(snprintf(name, 0, "%llu", ULLONG_MAX) + sizeof(":1."));
+ if(name == NULL)
+ return -1;
+ strcpy(name, ":1.");
+ if(!bus_register_kdbus(&name[3], (DBusTransportKdbus*)transport))
+ goto out;
+ if(!register_kdbus_policy(&name[3], transport, geteuid()))
+ goto out;
- MD5_Init(&md5);
- MD5_Update(&md5, path, strlen(path));
- MD5_Update(&md5, &stats.st_ctim.tv_sec, sizeof(stats.st_ctim.tv_sec));
- MD5_Final(uuid, &md5);
-
- if(!_dbus_string_init (&encoded))
- goto outgid;
- _dbus_string_init_const_len (&binary, uuid, DBUS_UUID_LENGTH_BYTES);
- if(!_dbus_string_hex_encode (&binary, 0, &encoded, _dbus_string_get_length (&encoded)))
- goto outb;
- path = (char*)_dbus_string_get_const_data (&encoded);
- ret_value = reply_1_data(message, DBUS_TYPE_STRING, &path, transport->connection);
-
- outb:
- _dbus_string_free(&binary);
- _dbus_string_free(&encoded);
- outgid:
- return ret_value;
- }
-#endif
-/* else if(!strcmp(dbus_message_get_member(message), "GetAdtAuditSessionData")) //todo to be implemented if needed and possible
- {
- char* name = NULL;
+ ((DBusTransportKdbus*)transport)->sender = name;
- dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
- return reply_with_error(DBUS_ERROR_ADT_AUDIT_DATA_UNKNOWN, "Could not determine audit session data for '%s'", name, message, transport->connection);
- }*/
-#ifdef DBUS_SERVICES_IN_LIB
- else if(!strcmp(dbus_message_get_member(message), "GetConnectionSELinuxSecurityContext"))
- {
- char* name = NULL;
-
- dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
- inter_ret = kdbus_NameQuery(name, transport, &info);
- if(inter_ret == -ENOENT) //name has no owner
- return reply_with_error(DBUS_ERROR_NAME_HAS_NO_OWNER, "Could not get security context of name '%s': no such name", name, message, transport->connection);
- else if(inter_ret < 0)
- return reply_with_error(DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN, "Could not determine security context for '%s'", name, message, transport->connection);
- else
- {
- DBusMessage *reply;
+ if(!reply_1_data(message, DBUS_TYPE_STRING, &name, transport->connection))
+ return 0;
- reply = dbus_message_new_method_return(message);
- if(reply != NULL)
- {
- dbus_message_set_sender(reply, DBUS_SERVICE_DBUS);
- if (!dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &info.sec_label, info.sec_label_len, DBUS_TYPE_INVALID))
- dbus_message_unref(reply);
- else if(add_message_to_received(reply, transport->connection))
- ret_value = 0;
- }
- }
- }
-#endif
- else
- return 1; //send to daemon
+ out:
+ free(name);
+ }
+ else
+ return 1; //send to daemon
-#ifdef DBUS_SERVICES_IN_LIB
- if(info.sec_label)
- free(info.sec_label);
-#endif
- return ret_value;
+ return -1;
}
#if KDBUS_MSG_DECODE_DEBUG == 1
diff --git a/dbus/dbus-transport-kdbus.h b/dbus/dbus-transport-kdbus.h
index 3aa0c1a3..935ad6e8 100644
--- a/dbus/dbus-transport-kdbus.h
+++ b/dbus/dbus-transport-kdbus.h
@@ -27,11 +27,7 @@
#ifndef DBUS_TRANSPORT_KDBUS_H_
#define DBUS_TRANSPORT_KDBUS_H_
-//#include "dbus-transport.h"
#include "dbus-transport-protected.h"
-//#include "dbus-address.h"
-//#include "dbus-errors.h"
-#include "dbus-types.h"
#include <linux/types.h>
__u64 dbus_transport_get_bloom_size(DBusTransport* transport);