|
@@ -52,6 +52,7 @@ struct ubusd_acl_obj {
|
|
|
bool subscribe;
|
|
|
bool publish;
|
|
|
bool listen;
|
|
|
+ bool send;
|
|
|
};
|
|
|
|
|
|
struct ubusd_acl_file {
|
|
@@ -138,6 +139,11 @@ ubusd_acl_check(struct ubus_client *cl, const char *obj,
|
|
|
return 0;
|
|
|
break;
|
|
|
|
|
|
+ case UBUS_ACL_SEND:
|
|
|
+ if (acl->send)
|
|
|
+ return 0;
|
|
|
+ break;
|
|
|
+
|
|
|
case UBUS_ACL_ACCESS:
|
|
|
if (acl->methods) {
|
|
|
struct blob_attr *cur;
|
|
@@ -292,6 +298,13 @@ static void ubusd_acl_add_listen(struct ubusd_acl_file *file, const char *obj)
|
|
|
o->listen = true;
|
|
|
}
|
|
|
|
|
|
+static void ubusd_acl_add_send(struct ubusd_acl_file *file, const char *obj)
|
|
|
+{
|
|
|
+ struct ubusd_acl_obj *o = ubusd_acl_alloc_obj(file, obj);
|
|
|
+
|
|
|
+ o->send = true;
|
|
|
+}
|
|
|
+
|
|
|
enum {
|
|
|
ACL_USER,
|
|
|
ACL_GROUP,
|
|
@@ -300,6 +313,7 @@ enum {
|
|
|
ACL_SUBSCRIBE,
|
|
|
ACL_INHERIT,
|
|
|
ACL_LISTEN,
|
|
|
+ ACL_SEND,
|
|
|
__ACL_MAX
|
|
|
};
|
|
|
|
|
@@ -311,6 +325,7 @@ static const struct blobmsg_policy acl_policy[__ACL_MAX] = {
|
|
|
[ACL_SUBSCRIBE] = { .name = "subscribe", .type = BLOBMSG_TYPE_ARRAY },
|
|
|
[ACL_INHERIT] = { .name = "inherit", .type = BLOBMSG_TYPE_ARRAY },
|
|
|
[ACL_LISTEN] = { .name= "listen", .type = BLOBMSG_TYPE_ARRAY },
|
|
|
+ [ACL_SEND] = { .name= "send", .type = BLOBMSG_TYPE_ARRAY },
|
|
|
};
|
|
|
|
|
|
static void
|
|
@@ -347,6 +362,11 @@ ubusd_acl_file_add(struct ubusd_acl_file *file)
|
|
|
blobmsg_for_each_attr(cur, tb[ACL_LISTEN], rem)
|
|
|
if (blobmsg_type(cur) == BLOBMSG_TYPE_STRING)
|
|
|
ubusd_acl_add_listen(file, blobmsg_get_string(cur));
|
|
|
+
|
|
|
+ if (tb[ACL_SEND])
|
|
|
+ blobmsg_for_each_attr(cur, tb[ACL_SEND], rem)
|
|
|
+ if (blobmsg_type(cur) == BLOBMSG_TYPE_STRING)
|
|
|
+ ubusd_acl_add_send(file, blobmsg_get_string(cur));
|
|
|
}
|
|
|
|
|
|
static void
|