Use more fine grained access control

Make it possible to add more permissions to an object than just visible
or not. Pass these permissions to the client. This way we can make a
difference between being able to see and read, modify or query an
object. More permissions can be added later when needed. Because the
permissions is set on the resource by the access control module, the
implementations can check if the right permission is set before doing
anything.
This commit is contained in:
Wim Taymans 2017-08-01 17:09:57 +02:00
parent c59bc457d4
commit 4f08dbcd24
14 changed files with 110 additions and 59 deletions

View file

@ -40,6 +40,7 @@ struct data {
struct proxy_data {
uint32_t id;
uint32_t parent_id;
uint32_t permissions;
uint32_t version;
void *info;
};
@ -95,6 +96,9 @@ static void module_event_info(void *object, struct pw_module_info *info)
printf("\tid: %d\n", data->id);
printf("\tparent_id: %d\n", data->parent_id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-',
data->permissions & PW_PERM_W ? 'w' : '-',
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", PW_TYPE_INTERFACE__Module, data->version);
if (print_all) {
printf("%c\tname: \"%s\"\n", MARK_CHANGE(0), info->name);
@ -129,6 +133,9 @@ static void node_event_info(void *object, struct pw_node_info *info)
printf("\tid: %d\n", data->id);
printf("\tparent_id: %d\n", data->parent_id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-',
data->permissions & PW_PERM_W ? 'w' : '-',
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", PW_TYPE_INTERFACE__Node, data->version);
if (print_all) {
int i;
@ -178,6 +185,9 @@ static void client_event_info(void *object, struct pw_client_info *info)
printf("\tid: %d\n", data->id);
printf("\tparent_id: %d\n", data->parent_id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-',
data->permissions & PW_PERM_W ? 'w' : '-',
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", PW_TYPE_INTERFACE__Client, data->version);
if (print_all) {
print_properties(info->props, MARK_CHANGE(0));
@ -209,6 +219,9 @@ static void link_event_info(void *object, struct pw_link_info *info)
printf("\tid: %d\n", data->id);
printf("\tparent_id: %d\n", data->parent_id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-',
data->permissions & PW_PERM_W ? 'w' : '-',
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", PW_TYPE_INTERFACE__Link, data->version);
if (print_all) {
printf("%c\toutput-node-id: %u\n", MARK_CHANGE(0), info->output_node_id);
@ -258,7 +271,7 @@ destroy_proxy (void *data)
static void registry_event_global(void *object, uint32_t id, uint32_t parent_id,
uint32_t type, uint32_t version)
uint32_t permissions, uint32_t type, uint32_t version)
{
struct pw_proxy *proxy = object;
struct data *data = proxy->object;
@ -287,6 +300,9 @@ static void registry_event_global(void *object, uint32_t id, uint32_t parent_id,
printf("added:\n");
printf("\tid: %u\n", id);
printf("\tparent_id: %d\n", parent_id);
printf("\tpermissions: %c%c%c\n", permissions & PW_PERM_R ? 'r' : '-',
permissions & PW_PERM_W ? 'w' : '-',
permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", spa_type_map_get_type(core->type.map, type), version);
return;
}
@ -299,6 +315,7 @@ static void registry_event_global(void *object, uint32_t id, uint32_t parent_id,
pd = proxy->user_data;
pd->id = id;
pd->parent_id = parent_id;
pd->permissions = permissions;
pd->version = version;
pw_proxy_add_listener(proxy, proxy, events);