Move includes into subdirectory
[project/rpcd.git] / session.c
index 9f42226..c8da5a4 100644 (file)
--- a/session.c
+++ b/session.c
@@ -1,5 +1,5 @@
 /*
- * luci-rpcd - LuCI UBUS RPC server
+ * rpcd - UBUS RPC server
  *
  *   Copyright (C) 2013 Felix Fietkau <nbd@openwrt.org>
  *   Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
 #include <libubus.h>
 #include <fnmatch.h>
 
-#include "session.h"
+#include <rpcd/session.h>
 
 static struct avl_tree sessions;
 static struct blob_buf buf;
 
+static LIST_HEAD(create_callbacks);
+static LIST_HEAD(destroy_callbacks);
+
 static const struct blobmsg_policy new_policy = {
        .name = "timeout", .type = BLOBMSG_TYPE_INT32
 };
@@ -142,6 +145,7 @@ rpc_session_dump_acls(struct rpc_session *ses, struct blob_buf *b)
                {
                        if (c) blobmsg_close_table(b, c);
                        c = blobmsg_open_table(b, acl_scope->avl.key);
+                       lastobj = NULL;
                }
 
                d = NULL;
@@ -199,6 +203,10 @@ rpc_session_destroy(struct rpc_session *ses)
        struct rpc_session_acl *acl, *nacl;
        struct rpc_session_acl_scope *acl_scope, *nacl_scope;
        struct rpc_session_data *data, *ndata;
+       struct rpc_session_cb *cb;
+
+       list_for_each_entry(cb, &destroy_callbacks, list)
+               cb->cb(ses, cb->priv);
 
        uloop_timeout_cancel(&ses->t);
 
@@ -229,6 +237,7 @@ static struct rpc_session *
 rpc_session_create(int timeout)
 {
        struct rpc_session *ses;
+       struct rpc_session_cb *cb;
 
        ses = calloc(1, sizeof(*ses));
        if (!ses)
@@ -245,6 +254,9 @@ rpc_session_create(int timeout)
        ses->t.cb = rpc_session_timeout;
        rpc_touch_session(ses);
 
+       list_for_each_entry(cb, &create_callbacks, list)
+               cb->cb(ses, cb->priv);
+
        return ses;
 }
 
@@ -708,3 +720,26 @@ int rpc_session_api_init(struct ubus_context *ctx)
 
        return ubus_add_object(ctx, &obj);
 }
+
+bool rpc_session_access(const char *sid, const char *scope,
+                        const char *object, const char *function)
+{
+       struct rpc_session *ses = rpc_session_get(sid);
+
+       if (!ses)
+               return false;
+
+       return rpc_session_acl_allowed(ses, scope, object, function);
+}
+
+void rpc_session_create_cb(struct rpc_session_cb *cb)
+{
+       if (cb && cb->cb)
+               list_add(&cb->list, &create_callbacks);
+}
+
+void rpc_session_destroy_cb(struct rpc_session_cb *cb)
+{
+       if (cb && cb->cb)
+               list_add(&cb->list, &destroy_callbacks);
+}