fix typo
[src/app-framework-binder.git] / src / afb-api-dbus.c
index a9f5010..13cbf7d 100644 (file)
@@ -35,6 +35,7 @@
 #include "afb-apis.h"
 #include "afb-api-so.h"
 #include "afb-context.h"
+#include "afb-cred.h"
 #include "afb-evt.h"
 #include "afb-xreq.h"
 #include "verbose.h"
@@ -663,10 +664,39 @@ struct origin
        /* count of references */
        int refcount;
 
+       /* credentials of the origin */
+       struct afb_cred *cred;
+
        /* the origin */
        char name[1];
 };
 
+/* get the credentials for the message */
+static void init_origin_creds(struct origin *origin)
+{
+       int rc;
+       sd_bus_creds *c;
+       uid_t uid;
+       gid_t gid;
+       pid_t pid;
+       const char *context;
+
+       rc = sd_bus_get_name_creds(origin->api->sdbus, origin->name,
+                       SD_BUS_CREDS_PID|SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_SELINUX_CONTEXT,
+                       &c);
+       if (rc < 0)
+               origin->cred = NULL;
+       else {
+               afb_cred_unref(origin->cred);
+               sd_bus_creds_get_uid(c, &uid);
+               sd_bus_creds_get_gid(c, &gid);
+               sd_bus_creds_get_pid(c, &pid);
+               sd_bus_creds_get_selinux_context(c, &context);
+               origin->cred = afb_cred_create(uid, gid, pid, context);
+               sd_bus_creds_unref(c);
+       }
+}
+
 static struct origin *afb_api_dbus_server_origin_get(struct api_dbus *api, const char *sender)
 {
        struct origin *origin;
@@ -689,6 +719,7 @@ static struct origin *afb_api_dbus_server_origin_get(struct api_dbus *api, const
                origin->api = api;
                origin->refcount = 1;
                strcpy(origin->name, sender);
+               init_origin_creds(origin);
                origin->next = api->server.origins;
                api->server.origins = origin;
        }
@@ -704,6 +735,7 @@ static void afb_api_dbus_server_origin_unref(struct origin *origin)
                while(*prv != origin)
                        prv = &(*prv)->next;
                *prv = origin->next;
+               afb_cred_unref(origin->cred);
                free(origin);
        }
 }
@@ -724,7 +756,7 @@ static void afb_api_dbus_server_listener_free(struct listener *listener)
        free(listener);
 }
 
-static struct listener *afb_api_dbus_server_listerner_get(struct api_dbus *api, const char *sender, struct afb_session *session)
+static struct listener *afb_api_dbus_server_listener_get(struct api_dbus *api, const char *sender, struct afb_session *session)
 {
        int rc;
        struct listener *listener;
@@ -776,9 +808,9 @@ struct dbus_req {
 };
 
 /* decrement the reference count of the request and free/release it on falling to null */
-static void dbus_req_destroy(void *closure)
+static void dbus_req_destroy(struct afb_xreq *xreq)
 {
-       struct dbus_req *dreq = closure;
+       struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq);
 
        afb_context_disconnect(&dreq->xreq.context);
        json_object_put(dreq->json);
@@ -787,9 +819,9 @@ static void dbus_req_destroy(void *closure)
 }
 
 /* get the object of the request */
-static struct json_object *dbus_req_json(void *closure)
+static struct json_object *dbus_req_json(struct afb_xreq *xreq)
 {
-       struct dbus_req *dreq = closure;
+       struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq);
 
        return dreq->json;
 }
@@ -804,25 +836,25 @@ static void dbus_req_reply(struct dbus_req *dreq, uint8_t type, const char *firs
                ERROR("sending the reply failed");
 }
 
-static void dbus_req_success(void *closure, struct json_object *obj, const char *info)
+static void dbus_req_success(struct afb_xreq *xreq, struct json_object *obj, const char *info)
 {
-       struct dbus_req *dreq = closure;
+       struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq);
 
        dbus_req_reply(dreq, RETOK, json_object_to_json_string_ext(obj, JSON_C_TO_STRING_PLAIN), info);
 }
 
-static void dbus_req_fail(void *closure, const char *status, const char *info)
+static void dbus_req_fail(struct afb_xreq *xreq, const char *status, const char *info)
 {
-       struct dbus_req *dreq = closure;
+       struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq);
 
        dbus_req_reply(dreq, RETERR, status, info);
 }
 
 static void afb_api_dbus_server_event_send(struct origin *origin, char order, const char *event, int eventid, const char *data, uint64_t msgid);
 
-static int dbus_req_subscribe(void *closure, struct afb_event event)
+static int dbus_req_subscribe(struct afb_xreq *xreq, struct afb_event event)
 {
-       struct dbus_req *dreq = closure;
+       struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq);
        uint64_t msgid;
        int rc;
 
@@ -832,9 +864,9 @@ static int dbus_req_subscribe(void *closure, struct afb_event event)
        return rc;
 }
 
-static int dbus_req_unsubscribe(void *closure, struct afb_event event)
+static int dbus_req_unsubscribe(struct afb_xreq *xreq, struct afb_event event)
 {
-       struct dbus_req *dreq = closure;
+       struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq);
        uint64_t msgid;
        int rc;
 
@@ -944,12 +976,13 @@ static int api_dbus_server_on_object_called(sd_bus_message *message, void *userd
        }
 
        /* connect to the context */
+       afb_xreq_init(&dreq->xreq, &afb_api_dbus_xreq_itf);
        if (afb_context_connect(&dreq->xreq.context, uuid, NULL) < 0)
                goto out_of_memory;
        session = dreq->xreq.context.session;
 
        /* get the listener */
-       listener = afb_api_dbus_server_listerner_get(api, sd_bus_message_get_sender(message), session);
+       listener = afb_api_dbus_server_listener_get(api, sd_bus_message_get_sender(message), session);
        if (listener == NULL)
                goto out_of_memory;
 
@@ -962,9 +995,6 @@ static int api_dbus_server_on_object_called(sd_bus_message *message, void *userd
                dreq->json = json_object_new_string(dreq->request);
        }
        dreq->listener = listener;
-       dreq->xreq.refcount = 1;
-       dreq->xreq.query = dreq;
-       dreq->xreq.queryitf = &afb_api_dbus_xreq_itf;
        dreq->xreq.api = api->api;
        dreq->xreq.verb = method;
        afb_apis_call(&dreq->xreq);