mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	modules: get also instance id for flatpak apps
Add "pipewire.access.portal.instance_id" property for distinguishing Flatpak application instances from each other.
This commit is contained in:
		
							parent
							
								
									09a5b7ee35
								
							
						
					
					
						commit
						1445843ced
					
				
					 3 changed files with 21 additions and 10 deletions
				
			
		| 
						 | 
					@ -16,8 +16,6 @@
 | 
				
			||||||
#include <sys/vfs.h>
 | 
					#include <sys/vfs.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_GLIB2
 | 
					#ifdef HAVE_GLIB2
 | 
				
			||||||
#include <glib.h>
 | 
					#include <glib.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -26,7 +24,7 @@
 | 
				
			||||||
#include <spa/utils/result.h>
 | 
					#include <spa/utils/result.h>
 | 
				
			||||||
#include <pipewire/log.h>
 | 
					#include <pipewire/log.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pw_check_flatpak_parse_metadata(const char *buf, size_t size, char **app_id, char **devices)
 | 
					static int pw_check_flatpak_parse_metadata(const char *buf, size_t size, char **app_id, char **instance_id, char **devices)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef HAVE_GLIB2
 | 
					#ifdef HAVE_GLIB2
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					@ -53,13 +51,19 @@ static int pw_check_flatpak_parse_metadata(const char *buf, size_t size, char **
 | 
				
			||||||
		g_free(s);
 | 
							g_free(s);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (instance_id) {
 | 
				
			||||||
 | 
							s = g_key_file_get_value(metadata, "Instance", "instance-id", NULL);
 | 
				
			||||||
 | 
							*instance_id = s ? strdup(s) : NULL;
 | 
				
			||||||
 | 
							g_free(s);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	return -ENOTSUP;
 | 
						return -ENOTSUP;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pw_check_flatpak(pid_t pid, char **app_id, char **devices)
 | 
					static int pw_check_flatpak(pid_t pid, char **app_id, char **instance_id, char **devices)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(__linux__)
 | 
					#if defined(__linux__)
 | 
				
			||||||
	char root_path[2048];
 | 
						char root_path[2048];
 | 
				
			||||||
| 
						 | 
					@ -68,6 +72,8 @@ static int pw_check_flatpak(pid_t pid, char **app_id, char **devices)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (app_id)
 | 
						if (app_id)
 | 
				
			||||||
		*app_id = NULL;
 | 
							*app_id = NULL;
 | 
				
			||||||
 | 
						if (instance_id)
 | 
				
			||||||
 | 
							*instance_id = NULL;
 | 
				
			||||||
	if (devices)
 | 
						if (devices)
 | 
				
			||||||
		*devices = NULL;
 | 
							*devices = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,14 +113,14 @@ static int pw_check_flatpak(pid_t pid, char **app_id, char **devices)
 | 
				
			||||||
	if (fstat (info_fd, &stat_buf) != 0 || !S_ISREG (stat_buf.st_mode)) {
 | 
						if (fstat (info_fd, &stat_buf) != 0 || !S_ISREG (stat_buf.st_mode)) {
 | 
				
			||||||
		/* Some weird fd => failure, assume sandboxed */
 | 
							/* Some weird fd => failure, assume sandboxed */
 | 
				
			||||||
		pw_log_error("error fstat .flatpak-info: %m");
 | 
							pw_log_error("error fstat .flatpak-info: %m");
 | 
				
			||||||
	} else if (app_id || devices) {
 | 
						} else if (app_id || instance_id || devices) {
 | 
				
			||||||
		/* Parse the application ID if needed */
 | 
							/* Parse the application ID if needed */
 | 
				
			||||||
		const size_t size = stat_buf.st_size;
 | 
							const size_t size = stat_buf.st_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (size > 0) {
 | 
							if (size > 0) {
 | 
				
			||||||
			void *buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, info_fd, 0);
 | 
								void *buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, info_fd, 0);
 | 
				
			||||||
			if (buf != MAP_FAILED) {
 | 
								if (buf != MAP_FAILED) {
 | 
				
			||||||
				res = pw_check_flatpak_parse_metadata(buf, size, app_id, devices);
 | 
									res = pw_check_flatpak_parse_metadata(buf, size, app_id, instance_id, devices);
 | 
				
			||||||
				munmap(buf, size);
 | 
									munmap(buf, size);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				res = -errno;
 | 
									res = -errno;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,12 +167,13 @@ context_check_access(void *data, struct pw_impl_client *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = data;
 | 
						struct impl *impl = data;
 | 
				
			||||||
	struct pw_permission permissions[1];
 | 
						struct pw_permission permissions[1];
 | 
				
			||||||
	struct spa_dict_item items[3];
 | 
						struct spa_dict_item items[4];
 | 
				
			||||||
	const struct pw_properties *props;
 | 
						const struct pw_properties *props;
 | 
				
			||||||
	const char *str;
 | 
						const char *str;
 | 
				
			||||||
	const char *access;
 | 
						const char *access;
 | 
				
			||||||
	const char *socket;
 | 
						const char *socket;
 | 
				
			||||||
	spa_autofree char *flatpak_app_id = NULL;
 | 
						spa_autofree char *flatpak_app_id = NULL;
 | 
				
			||||||
 | 
						spa_autofree char *flatpak_instance_id = NULL;
 | 
				
			||||||
	int nitems = 0;
 | 
						int nitems = 0;
 | 
				
			||||||
	bool sandbox_flatpak;
 | 
						bool sandbox_flatpak;
 | 
				
			||||||
	int pid, res;
 | 
						int pid, res;
 | 
				
			||||||
| 
						 | 
					@ -197,7 +198,7 @@ context_check_access(void *data, struct pw_impl_client *client)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pw_log_info("client %p has trusted pid %d", client, pid);
 | 
							pw_log_info("client %p has trusted pid %d", client, pid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		res = pw_check_flatpak(pid, &flatpak_app_id, NULL);
 | 
							res = pw_check_flatpak(pid, &flatpak_app_id, &flatpak_instance_id, NULL);
 | 
				
			||||||
		if (res != 0) {
 | 
							if (res != 0) {
 | 
				
			||||||
			if (res < 0)
 | 
								if (res < 0)
 | 
				
			||||||
				pw_log_warn("%p: client %p flatpak check failed: %s",
 | 
									pw_log_warn("%p: client %p flatpak check failed: %s",
 | 
				
			||||||
| 
						 | 
					@ -233,6 +234,8 @@ context_check_access(void *data, struct pw_impl_client *client)
 | 
				
			||||||
	if (sandbox_flatpak) {
 | 
						if (sandbox_flatpak) {
 | 
				
			||||||
		items[nitems++] = SPA_DICT_ITEM_INIT("pipewire.access.portal.app_id",
 | 
							items[nitems++] = SPA_DICT_ITEM_INIT("pipewire.access.portal.app_id",
 | 
				
			||||||
				flatpak_app_id);
 | 
									flatpak_app_id);
 | 
				
			||||||
 | 
							items[nitems++] = SPA_DICT_ITEM_INIT("pipewire.access.portal.instance_id",
 | 
				
			||||||
 | 
									flatpak_instance_id);
 | 
				
			||||||
		items[nitems++] = SPA_DICT_ITEM_INIT("pipewire.sec.flatpak", "true");
 | 
							items[nitems++] = SPA_DICT_ITEM_INIT("pipewire.sec.flatpak", "true");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -430,7 +430,7 @@ on_connect(void *data, int fd, uint32_t mask)
 | 
				
			||||||
		client_access = server->client_access;
 | 
							client_access = server->client_access;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (server->addr.ss_family == AF_UNIX) {
 | 
						if (server->addr.ss_family == AF_UNIX) {
 | 
				
			||||||
		spa_autofree char *app_id = NULL, *snap_app_id = NULL, *devices = NULL;
 | 
							spa_autofree char *app_id = NULL, *snap_app_id = NULL, *devices = NULL, *instance_id = NULL;
 | 
				
			||||||
#ifdef HAVE_SNAP
 | 
					#ifdef HAVE_SNAP
 | 
				
			||||||
		pw_sandbox_access_t snap_access;
 | 
							pw_sandbox_access_t snap_access;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -441,7 +441,7 @@ on_connect(void *data, int fd, uint32_t mask)
 | 
				
			||||||
			pw_log_warn("setsockopt(SO_PRIORITY) failed: %m");
 | 
								pw_log_warn("setsockopt(SO_PRIORITY) failed: %m");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		pid = get_client_pid(client, client_fd);
 | 
							pid = get_client_pid(client, client_fd);
 | 
				
			||||||
		if (pid != 0 && pw_check_flatpak(pid, &app_id, &devices) == 1) {
 | 
							if (pid != 0 && pw_check_flatpak(pid, &app_id, &instance_id, &devices) == 1) {
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * XXX: we should really use Portal client access here
 | 
								 * XXX: we should really use Portal client access here
 | 
				
			||||||
			 *
 | 
								 *
 | 
				
			||||||
| 
						 | 
					@ -464,6 +464,8 @@ on_connect(void *data, int fd, uint32_t mask)
 | 
				
			||||||
			client_access = "flatpak";
 | 
								client_access = "flatpak";
 | 
				
			||||||
			pw_properties_set(client->props, "pipewire.access.portal.app_id",
 | 
								pw_properties_set(client->props, "pipewire.access.portal.app_id",
 | 
				
			||||||
					app_id);
 | 
										app_id);
 | 
				
			||||||
 | 
								pw_properties_set(client->props, "pipewire.access.portal.instance_id",
 | 
				
			||||||
 | 
										instance_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (devices && (spa_streq(devices, "all") ||
 | 
								if (devices && (spa_streq(devices, "all") ||
 | 
				
			||||||
							spa_strstartswith(devices, "all;") ||
 | 
												spa_strstartswith(devices, "all;") ||
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue