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) { if (set_permission) {
permissions[n_permissions++] = 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_log_info(NAME" %p: object %d allowed:%d", impl, object->id, allowed);
pw_client_update_permissions(client->obj->obj.proxy, pw_client_update_permissions(client->obj->obj.proxy,
n_permissions, permissions); n_permissions, permissions);

View file

@ -210,7 +210,7 @@ granted:
pw_log_info(NAME" %p: client %p '%s' access granted", impl, client, access); pw_log_info(NAME" %p: client %p '%s' access granted", impl, client, access);
items[0] = SPA_DICT_ITEM_INIT(PW_KEY_ACCESS, access); items[0] = SPA_DICT_ITEM_INIT(PW_KEY_ACCESS, access);
pw_impl_client_update_properties(client, &SPA_DICT_INIT(items, 1)); 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); pw_impl_client_update_permissions(client, 1, permissions);
return; return;

View file

@ -116,7 +116,7 @@ static void node_initialized(void *data)
global = pw_impl_node_get_global(nd->adapter); global = pw_impl_node_get_global(nd->adapter);
res = pw_global_bind(global, client, 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) if (res < 0)
goto error_bind; 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); struct pw_impl_client *client = pw_resource_get_client(resource);
int res; 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) { if (device_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; 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); struct pw_impl_client *client = pw_resource_get_client(resource);
int res; 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) { if (node_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; 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)); sizeof(struct pw_node_activation));
if (impl->bind_node_id) { 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); 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); ld->global = pw_impl_link_get_global(ld->link);
pw_global_add_listener(ld->global, &ld->global_listener, &global_events, ld); 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) if (res < 0)
goto error_bind; 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); struct pw_impl_client *client = pw_resource_get_client(resource);
int res; 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) { if (metadata_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; 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 /* portal makes this connection and will change the permissions before
* handing this connection to the client */ * 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); pw_impl_client_update_permissions(client, 1, permissions);
return; return;
} }

View file

@ -330,7 +330,7 @@ static void on_start(void *data, uint32_t version)
pw_resource_remove(client->core_resource); pw_resource_remove(client->core_resource);
if (pw_global_bind(pw_impl_core_get_global(client->core), client, 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; return;
if (version == 0) 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); pw_log_error("server %p: failed to create client: %m", s);
goto error_close; 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); pw_impl_client_update_permissions(c->client, 1, permissions);
res = pw_protocol_client_connect_fd(client, sv[1], true); 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_properties_setf(properties, PW_KEY_FACTORY_ID, "%d",
pw_impl_factory_get_info(factory)->id); 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) if (this->resource == NULL)
goto no_mem; 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_properties_setf(properties, PW_KEY_FACTORY_ID, "%d",
pw_impl_factory_get_info(factory)->id); 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) if (this->resource == NULL)
goto no_mem; goto no_mem;

View file

@ -439,7 +439,7 @@ static void *create_object(void *data,
void *result; void *result;
int res; 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) { if (impl_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; goto error_resource;

View file

@ -430,7 +430,7 @@ static void *create_object(void *data,
void *result; void *result;
int res; 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) { if (impl_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; goto error_resource;

View file

@ -439,7 +439,7 @@ static void *create_object(void *data,
void *result; void *result;
int res; 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) { if (impl_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; goto error_resource;

View file

@ -430,7 +430,7 @@ static void *create_object(void *data,
void *result; void *result;
int res; 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) { if (impl_resource == NULL) {
res = -errno; res = -errno;
goto error_resource; 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), res = pw_global_bind(pw_impl_device_get_global(device),
client, client,
PW_PERM_RWX, version, PW_PERM_ALL, version,
new_id); new_id);
if (res < 0) if (res < 0)
goto error_bind; goto error_bind;

View file

@ -144,9 +144,7 @@ static void *create_object(void *_data,
struct pw_resource *bound_resource; struct pw_resource *bound_resource;
res = pw_global_bind(pw_impl_node_get_global(node), res = pw_global_bind(pw_impl_node_get_global(node),
client, client, PW_PERM_ALL, version, new_id);
PW_PERM_RWX,
version, new_id);
if (res < 0) if (res < 0)
goto error_bind; 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) uint32_t pw_global_get_permissions(struct pw_global *global, struct pw_impl_client *client)
{ {
if (client->permission_func == NULL) if (client->permission_func == NULL)
return PW_PERM_RWX; return PW_PERM_ALL;
return client->permission_func(global, client, client->permission_data); 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 (version >= 3) {
if ((res = pw_global_bind(client->global, client, 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 res;
} }
return 0; 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, registry_resource = pw_resource_new(client,
new_id, new_id,
PW_PERM_RWX, PW_PERM_ALL,
PW_TYPE_INTERFACE_Registry, PW_TYPE_INTERFACE_Registry,
version, version,
sizeof(*data)); 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_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 #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. */ * 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_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_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_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_IS_X(p) (((p)&PW_PERM_X) == PW_PERM_X)
#define PW_PERM_ALL PW_PERM_RWX
#define PW_PERM_INVALID (uint32_t)(0xffffffff) #define PW_PERM_INVALID (uint32_t)(0xffffffff)
struct pw_permission { struct pw_permission {
@ -60,6 +62,12 @@ struct pw_permission {
#define PW_PERMISSION_INIT(id,p) (struct pw_permission){ (id), (p) } #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 #ifdef __cplusplus
} }
#endif #endif

View file

@ -574,9 +574,8 @@ static void info_global(struct proxy_data *pd)
return; return;
fprintf(stdout, "\tid: %d\n", global->id); fprintf(stdout, "\tid: %d\n", global->id);
fprintf(stdout, "\tpermissions: %c%c%c\n", global->permissions & PW_PERM_R ? 'r' : '-', fprintf(stdout, "\tpermissions: "PW_PERMISSION_FORMAT"\n",
global->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(global->permissions));
global->permissions & PW_PERM_X ? 'x' : '-');
fprintf(stdout, "\ttype: %s/%d\n", global->type, global->version); 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:"); fprintf(stdout, " default:");
else else
fprintf(stdout, " %u:", permissions[i].id); fprintf(stdout, " %u:", permissions[i].id);
fprintf(stdout, " %c%c%c\n", permissions[i].permissions & PW_PERM_R ? 'r' : '-', fprintf(stdout, " "PW_PERMISSION_FORMAT"\n",
permissions[i].permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(permissions[i].permissions));
permissions[i].permissions & PW_PERM_X ? 'x' : '-');
} }
} }
@ -1525,8 +1523,8 @@ static bool do_permissions(struct data *data, const char *cmd, char *args, char
{ {
struct remote_data *rd = data->current; struct remote_data *rd = data->current;
char *a[3]; char *a[3];
int n; int n;
uint32_t id; uint32_t id, p;
struct global *global; struct global *global;
struct pw_permission permissions[1]; struct pw_permission permissions[1];
@ -1551,8 +1549,11 @@ static bool do_permissions(struct data *data, const char *cmd, char *args, char
return false; 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, pw_client_update_permissions((struct pw_client*)global->proxy,
1, permissions); 1, permissions);
@ -1956,10 +1957,8 @@ dump_global_common(struct data *data, struct global *global,
if (!(flags & is_short)) { if (!(flags & is_short)) {
ind = INDENT(level + 1); ind = INDENT(level + 1);
fprintf(stdout, "%sid: %"PRIu32"\n", ind, global->id); fprintf(stdout, "%sid: %"PRIu32"\n", ind, global->id);
fprintf(stdout, "%spermissions: %c%c%c\n", ind, fprintf(stdout, "%spermissions: "PW_PERMISSION_FORMAT"\n", ind,
global->permissions & PW_PERM_R ? 'r' : '-', PW_PERMISSION_ARGS(global->permissions));
global->permissions & PW_PERM_W ? 'w' : '-',
global->permissions & PW_PERM_X ? 'x' : '-');
fprintf(stdout, "%stype: %s/%d\n", ind, fprintf(stdout, "%stype: %s/%d\n", ind,
global->type, global->version); global->type, global->version);
} else { } 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); info = data->info = pw_module_info_update(data->info, info);
printf("\tid: %d\n", data->id); printf("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\tname: \"%s\"\n", info->name); printf("\tname: \"%s\"\n", info->name);
printf("\tfilename: \"%s\"\n", info->filename); 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("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
if (print_all) { if (print_all) {
print_params(data, MARK_CHANGE(PW_NODE_CHANGE_MASK_PARAMS)); 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("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\tdirection: \"%s\"\n", pw_direction_as_string(info->direction)); 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); info = data->info = pw_factory_info_update(data->info, info);
printf("\tid: %d\n", data->id); printf("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\tname: \"%s\"\n", info->name); 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); info = data->info = pw_client_info_update(data->info, info);
printf("\tid: %d\n", data->id); printf("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
if (print_all) { 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); info = data->info = pw_link_info_update(data->info, info);
printf("\tid: %d\n", data->id); printf("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
printf("\toutput-node-id: %u\n", info->output_node_id); 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("\tid: %d\n", data->id);
printf("\tpermissions: %c%c%c\n", data->permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
data->permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(data->permissions));
data->permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", data->type, data->version); printf("\ttype: %s (version %d)\n", data->type, data->version);
if (print_all) { if (print_all) {
@ -617,9 +610,8 @@ static void registry_event_global(void *data, uint32_t id,
} else { } else {
printf("added:\n"); printf("added:\n");
printf("\tid: %u\n", id); printf("\tid: %u\n", id);
printf("\tpermissions: %c%c%c\n", permissions & PW_PERM_R ? 'r' : '-', printf("\tpermissions: "PW_PERMISSION_FORMAT"\n",
permissions & PW_PERM_W ? 'w' : '-', PW_PERMISSION_ARGS(permissions));
permissions & PW_PERM_X ? 'x' : '-');
printf("\ttype: %s (version %d)\n", type, version); printf("\ttype: %s (version %d)\n", type, version);
print_properties(props, ' '); print_properties(props, ' ');
return; return;