metadata: only allow setting metadata on objects we can see

Allow a client to only set metadata on objects that it has
read access to.
This commit is contained in:
Wim Taymans 2020-07-30 15:30:13 +02:00
parent bd8b239621
commit 8db9a2741b

View file

@ -22,10 +22,14 @@
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
*/ */
#include <spa/utils/result.h>
#include <pipewire/impl.h> #include <pipewire/impl.h>
#include <extensions/metadata.h> #include <extensions/metadata.h>
#define NAME "metadata"
struct impl { struct impl {
struct pw_global *global; struct pw_global *global;
struct spa_hook global_listener; struct spa_hook global_listener;
@ -60,9 +64,14 @@ static int metadata_property(void *object,
const char *value) const char *value)
{ {
struct resource_data *d = object; struct resource_data *d = object;
struct pw_resource *resource = d->resource;
struct pw_impl_client *client = pw_resource_get_client(resource);
struct impl *impl = d->impl; struct impl *impl = d->impl;
if (impl->pending == 0 || d->pong_seq != 0)
pw_metadata_resource_property(d->resource, subject, key, type, value); if (impl->pending == 0 || d->pong_seq != 0) {
if (pw_impl_client_check_permissions(client, subject, PW_PERM_R) >= 0)
pw_metadata_resource_property(d->resource, subject, key, type, value);
}
return 0; return 0;
} }
@ -79,8 +88,20 @@ static int metadata_set_property(void *object,
{ {
struct resource_data *d = object; struct resource_data *d = object;
struct impl *impl = d->impl; struct impl *impl = d->impl;
struct pw_resource *resource = d->resource;
struct pw_impl_client *client = pw_resource_get_client(resource);
int res;
if ((res = pw_impl_client_check_permissions(client, subject, PW_PERM_R)) < 0)
goto error;
pw_metadata_set_property(impl->metadata, subject, key, type, value); pw_metadata_set_property(impl->metadata, subject, key, type, value);
return 0; return 0;
error:
pw_resource_errorf(resource, res, "set property error for id %d: %s",
subject, spa_strerror(res));
return res;
} }
static int metadata_clear(void *object) static int metadata_clear(void *object)