luci2: change ops->access to ops->session_access to accomodate for changed plugin api
[project/rpcd.git] / session.c
index 35324bfd6c668dd8743d2ac3d63b9e7073333ec5..6cc4ffe883dfd249569aa361f0837bde4c46d510 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>
@@ -27,6 +27,9 @@
 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
 };
@@ -200,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);
 
@@ -230,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)
@@ -246,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;
 }
 
@@ -709,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);
+}