permission: add some helpers

Add PW_PERM_ALL as a shortcut for all permissions
Add PW_PERMISSION_FORMAT and PW_PERMISSION_ARGS to nicely format
permissions.
This commit is contained in:
Wim Taymans 2020-07-30 16:26:29 +02:00
parent f5e78196c4
commit 91d4806611
23 changed files with 58 additions and 61 deletions

View file

@ -221,7 +221,7 @@ set_global_permissions(void *data, struct sm_object *object)
if (set_permission) {
permissions[n_permissions++] =
PW_PERMISSION_INIT(object->id, allowed ? PW_PERM_RWX : 0);
PW_PERMISSION_INIT(object->id, allowed ? PW_PERM_ALL : 0);
pw_log_info(NAME" %p: object %d allowed:%d", impl, object->id, allowed);
pw_client_update_permissions(client->obj->obj.proxy,
n_permissions, permissions);

View file

@ -210,7 +210,7 @@ granted:
pw_log_info(NAME" %p: client %p '%s' access granted", impl, client, access);
items[0] = SPA_DICT_ITEM_INIT(PW_KEY_ACCESS, access);
pw_impl_client_update_properties(client, &SPA_DICT_INIT(items, 1));
permissions[0] = PW_PERMISSION_INIT(PW_ID_ANY, PW_PERM_RWX);
permissions[0] = PW_PERMISSION_INIT(PW_ID_ANY, PW_PERM_ALL);
pw_impl_client_update_permissions(client, 1, permissions);
return;

View file

@ -116,7 +116,7 @@ static void node_initialized(void *data)
global = pw_impl_node_get_global(nd->adapter);
res = pw_global_bind(global, client,
PW_PERM_RWX, PW_VERSION_NODE, nd->new_id);
PW_PERM_ALL, PW_VERSION_NODE, nd->new_id);
if (res < 0)
goto error_bind;

View file

@ -72,7 +72,7 @@ static void *create_object(void *_data,
struct pw_impl_client *client = pw_resource_get_client(resource);
int res;
device_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
device_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (device_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -74,7 +74,7 @@ static void *create_object(void *_data,
struct pw_impl_client *client = pw_resource_get_client(resource);
int res;
node_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
node_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (node_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -1280,7 +1280,7 @@ void pw_impl_client_node_registered(struct pw_impl_client_node *this, struct pw_
sizeof(struct pw_node_activation));
if (impl->bind_node_id) {
pw_global_bind(global, client, PW_PERM_RWX,
pw_global_bind(global, client, PW_PERM_ALL,
impl->bind_node_version, impl->bind_node_id);
}
}

View file

@ -119,7 +119,7 @@ static void link_initialized(void *data)
ld->global = pw_impl_link_get_global(ld->link);
pw_global_add_listener(ld->global, &ld->global_listener, &global_events, ld);
res = pw_global_bind(ld->global, client, PW_PERM_RWX, PW_VERSION_LINK, ld->new_id);
res = pw_global_bind(ld->global, client, PW_PERM_ALL, PW_VERSION_LINK, ld->new_id);
if (res < 0)
goto error_bind;

View file

@ -72,7 +72,7 @@ static void *create_object(void *_data,
struct pw_impl_client *client = pw_resource_get_client(resource);
int res;
metadata_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
metadata_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (metadata_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -86,7 +86,7 @@ context_check_access(void *data, struct pw_impl_client *client)
/* portal makes this connection and will change the permissions before
* handing this connection to the client */
permissions[0] = PW_PERMISSION_INIT(PW_ID_ANY, PW_PERM_RWX);
permissions[0] = PW_PERMISSION_INIT(PW_ID_ANY, PW_PERM_ALL);
pw_impl_client_update_permissions(client, 1, permissions);
return;
}

View file

@ -330,7 +330,7 @@ static void on_start(void *data, uint32_t version)
pw_resource_remove(client->core_resource);
if (pw_global_bind(pw_impl_core_get_global(client->core), client,
PW_PERM_RWX, version, 0) < 0)
PW_PERM_ALL, version, 0) < 0)
return;
if (version == 0)
@ -846,7 +846,7 @@ static int pw_protocol_native_connect_internal(struct pw_protocol_client *client
pw_log_error("server %p: failed to create client: %m", s);
goto error_close;
}
permissions[0] = PW_PERMISSION_INIT(PW_ID_ANY, PW_PERM_RWX);
permissions[0] = PW_PERMISSION_INIT(PW_ID_ANY, PW_PERM_ALL);
pw_impl_client_update_permissions(c->client, 1, permissions);
res = pw_protocol_client_connect_fd(client, sv[1], true);

View file

@ -189,7 +189,7 @@ static void *create_object(void *data,
pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d",
pw_impl_factory_get_info(factory)->id);
this->resource = pw_resource_new(owner, new_id, PW_PERM_RWX, type, version, 0);
this->resource = pw_resource_new(owner, new_id, PW_PERM_ALL, type, version, 0);
if (this->resource == NULL)
goto no_mem;

View file

@ -188,7 +188,7 @@ static void *create_object(void *data,
pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d",
pw_impl_factory_get_info(factory)->id);
this->resource = pw_resource_new(owner, new_id, PW_PERM_RWX, type, version, 0);
this->resource = pw_resource_new(owner, new_id, PW_PERM_ALL, type, version, 0);
if (this->resource == NULL)
goto no_mem;

View file

@ -439,7 +439,7 @@ static void *create_object(void *data,
void *result;
int res;
impl_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
impl_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (impl_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -430,7 +430,7 @@ static void *create_object(void *data,
void *result;
int res;
impl_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
impl_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (impl_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -439,7 +439,7 @@ static void *create_object(void *data,
void *result;
int res;
impl_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
impl_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (impl_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -430,7 +430,7 @@ static void *create_object(void *data,
void *result;
int res;
impl_resource = pw_resource_new(client, new_id, PW_PERM_RWX, type, version, 0);
impl_resource = pw_resource_new(client, new_id, PW_PERM_ALL, type, version, 0);
if (impl_resource == NULL) {
res = -errno;
goto error_resource;

View file

@ -144,7 +144,7 @@ static void *create_object(void *_data,
res = pw_global_bind(pw_impl_device_get_global(device),
client,
PW_PERM_RWX, version,
PW_PERM_ALL, version,
new_id);
if (res < 0)
goto error_bind;

View file

@ -144,9 +144,7 @@ static void *create_object(void *_data,
struct pw_resource *bound_resource;
res = pw_global_bind(pw_impl_node_get_global(node),
client,
PW_PERM_RWX,
version, new_id);
client, PW_PERM_ALL, version, new_id);
if (res < 0)
goto error_bind;

View file

@ -45,7 +45,7 @@ SPA_EXPORT
uint32_t pw_global_get_permissions(struct pw_global *global, struct pw_impl_client *client)
{
if (client->permission_func == NULL)
return PW_PERM_RWX;
return PW_PERM_ALL;
return client->permission_func(global, client, client->permission_data);
}

View file

@ -169,7 +169,7 @@ static int core_hello(void *object, uint32_t version)
if (version >= 3) {
if ((res = pw_global_bind(client->global, client,
PW_PERM_RWX, PW_VERSION_CLIENT, 1)) < 0)
PW_PERM_ALL, PW_VERSION_CLIENT, 1)) < 0)
return res;
}
return 0;
@ -226,7 +226,7 @@ static struct pw_registry * core_get_registry(void *object, uint32_t version, si
registry_resource = pw_resource_new(client,
new_id,
PW_PERM_RWX,
PW_PERM_ALL,
PW_TYPE_INTERFACE_Registry,
version,
sizeof(*data));

View file

@ -45,12 +45,14 @@ extern "C" {
#define PW_PERM_W 0200 /**< methods can be called that modify the object */
#define PW_PERM_X 0100 /**< methods can be called on the object. The W flag must be
* present in order to call methods that modify the object. */
#define PW_PERM_RWX (PW_PERM_R|PW_PERM_W|PW_PERM_X)
#define PW_PERM_IS_R(p) (((p)&PW_PERM_R) == PW_PERM_R)
#define PW_PERM_IS_W(p) (((p)&PW_PERM_W) == PW_PERM_W)
#define PW_PERM_IS_X(p) (((p)&PW_PERM_X) == PW_PERM_X)
#define PW_PERM_ALL PW_PERM_RWX
#define PW_PERM_INVALID (uint32_t)(0xffffffff)
struct pw_permission {
@ -60,6 +62,12 @@ struct pw_permission {
#define PW_PERMISSION_INIT(id,p) (struct pw_permission){ (id), (p) }
#define PW_PERMISSION_FORMAT "%c%c%c"
#define PW_PERMISSION_ARGS(permission) \
(permission) & PW_PERM_R ? 'r' : '-', \
(permission) & PW_PERM_W ? 'w' : '-', \
(permission) & PW_PERM_X ? 'x' : '-'
#ifdef __cplusplus
}
#endif

View file

@ -574,9 +574,8 @@ static void info_global(struct proxy_data *pd)
return;
fprintf(stdout, "\tid: %d\n", global->id);
fprintf(stdout, "\tpermissions: %c%c%c\n", global->permissions & PW_PERM_R ? 'r' : '-',
global->permissions & PW_PERM_W ? 'w' : '-',
global->permissions & PW_PERM_X ? 'x' : '-');
fprintf(stdout, "\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(global->permissions));
fprintf(stdout, "\ttype: %s/%d\n", global->type, global->version);
}
@ -893,9 +892,8 @@ static void client_event_permissions(void *object, uint32_t index,
fprintf(stdout, " default:");
else
fprintf(stdout, " %u:", permissions[i].id);
fprintf(stdout, " %c%c%c\n", permissions[i].permissions & PW_PERM_R ? 'r' : '-',
permissions[i].permissions & PW_PERM_W ? 'w' : '-',
permissions[i].permissions & PW_PERM_X ? 'x' : '-');
fprintf(stdout, " "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(permissions[i].permissions));
}
}
@ -1525,8 +1523,8 @@ static bool do_permissions(struct data *data, const char *cmd, char *args, char
{
struct remote_data *rd = data->current;
char *a[3];
int n;
uint32_t id;
int n;
uint32_t id, p;
struct global *global;
struct pw_permission permissions[1];
@ -1551,8 +1549,11 @@ static bool do_permissions(struct data *data, const char *cmd, char *args, char
return false;
}
permissions[0] = PW_PERMISSION_INIT(atoi(a[1]), atoi(a[2]));
p = strtol(a[2], NULL, 0);
fprintf(stderr, "setting permissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(p));
permissions[0] = PW_PERMISSION_INIT(atoi(a[1]), p);
pw_client_update_permissions((struct pw_client*)global->proxy,
1, permissions);
@ -1956,10 +1957,8 @@ dump_global_common(struct data *data, struct global *global,
if (!(flags & is_short)) {
ind = INDENT(level + 1);
fprintf(stdout, "%sid: %"PRIu32"\n", ind, global->id);
fprintf(stdout, "%spermissions: %c%c%c\n", ind,
global->permissions & PW_PERM_R ? 'r' : '-',
global->permissions & PW_PERM_W ? 'w' : '-',
global->permissions & PW_PERM_X ? 'x' : '-');
fprintf(stdout, "%spermissions: "PW_PERMISSION_FORMAT"\n", ind,
PW_PERMISSION_ARGS(global->permissions));
fprintf(stdout, "%stype: %s/%d\n", ind,
global->type, global->version);
} else {

View file

@ -221,9 +221,8 @@ static void module_event_info(void *object, const struct pw_module_info *info)
info = data->info = pw_module_info_update(data->info, info);
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\tname: \"%s\"\n", info->name);
printf("\tfilename: \"%s\"\n", info->filename);
@ -255,9 +254,8 @@ static void print_node(struct proxy_data *data)
}
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
if (print_all) {
print_params(data, MARK_CHANGE(PW_NODE_CHANGE_MASK_PARAMS));
@ -323,9 +321,8 @@ static void print_port(struct proxy_data *data)
}
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\tdirection: \"%s\"\n", pw_direction_as_string(info->direction));
@ -384,9 +381,8 @@ static void factory_event_info(void *object, const struct pw_factory_info *info)
info = data->info = pw_factory_info_update(data->info, info);
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\tname: \"%s\"\n", info->name);
@ -419,9 +415,8 @@ static void client_event_info(void *object, const struct pw_client_info *info)
info = data->info = pw_client_info_update(data->info, info);
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
if (print_all) {
@ -452,9 +447,8 @@ static void link_event_info(void *object, const struct pw_link_info *info)
info = data->info = pw_link_info_update(data->info, info);
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\toutput-node-id: %u\n", info->output_node_id);
@ -499,9 +493,8 @@ static void print_device(struct proxy_data *data)
}
printf("\tid: %d\n", data->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("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(data->permissions));
printf("\ttype: %s (version %d)\n", data->type, data->version);
if (print_all) {
@ -617,9 +610,8 @@ static void registry_event_global(void *data, uint32_t id,
} else {
printf("added:\n");
printf("\tid: %u\n", id);
printf("\tpermissions: %c%c%c\n", permissions & PW_PERM_R ? 'r' : '-',
permissions & PW_PERM_W ? 'w' : '-',
permissions & PW_PERM_X ? 'x' : '-');
printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
PW_PERMISSION_ARGS(permissions));
printf("\ttype: %s (version %d)\n", type, version);
print_properties(props, ' ');
return;