Skip to contentSkip to conversation

Introduce XDG type definition

PATCH Superseded Sven Vermeulen 2 participants 3 messages Oct 7, 2011 – Oct 10, 2011

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 Introduce XDG type definition

Below an updated version for the XDG patch, which includes updates based on feedback received from Dominick (well, he was so kind to code some stuff on IRC which I blindly copied and extended).

The changes include
- Use proper userdomain interfaces
- Introduce attributes for the xdg locations so that other modules can create their specific types within
- Introduce xdg_runtime_home_t for the /run/user/* files (can't test that one here though, not using /run yet)

Some questions I still have:
- Are the "xdg_read_<subcomponent>" interfaces still needed? First few runs on my system here show that most (all?) need "xdg_read_all_<subcomponent>"
- Is the naming "xdg_read_all_<subcomponent>" okay? Or does it need to be something like "xdg_read_all_<subcomponent>_files"?
- I called the attributes "xdg_<subcomponent>_type", like "xdg_data_home_type" and not "xdg_data_type" since this is specifically for the end user location types. I am not aware of the need for non-home components (like xdg_data_type) as these are generally labeled as usr_t or similar (which is okay)

Comments always appreciated. Also when I'm playing the wrong ball here ;-)

+++

The XDG Base Directory specification is an open specification for dealing with user data in a desktop environment. It is published on
http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
and in use by many applications.

In this patch, we introduce the xdg-specific types and give the standard interfaces for dealing with these types. We also provide a typeattribute for each of the xdg-specific locations, allowing applications that create files therein to mark these files as the appropriate xdg type.

I opted for a separate module instead of userdomain since it is targeting desktop users more than servers.

---
 xdg.fc |    8 +
 xdg.if |  472 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 xdg.te |   30 ++++
 3 files changed, 510 insertions(+), 0 deletions(-)
 create mode 100644 xdg.fc
 create mode 100644 xdg.if
 create mode 100644 xdg.te
xdg.fc new file +8 -0
new file mode 100644
index 0000000..d6ba4da
@@ -0,0 +1,8 @@
+HOME_DIR/\.cache(/.*)?		gen_context(system_u:object_r:xdg_cache_home_t,s0)
+HOME_DIR/\.config(/.*)?		gen_context(system_u:object_r:xdg_config_home_t,s0)
+HOME_DIR/\.local/share(/.*)?	gen_context(system_u:object_r:xdg_data_home_t,s0)
+
+#
+# /run
+#
+/run/user/USER(/.*)?			gen_context(system_u:object_r:xdg_runtime_home_t,s0)
xdg.if new file +472 -0

472 lines not on this page · raw message

xdg.te new file +30 -0
new file mode 100644
index 0000000..087eef8
@@ -0,0 +1,30 @@
+policy_module(xdg, 1.0.0)
+
+########################################
+#
+# Declarations
+#
+
+attribute xdg_data_home_type;
+
+attribute xdg_config_home_type;
+
+attribute xdg_cache_home_type;
+
+attribute xdg_runtime_home_type;
+
+type xdg_data_home_t;
+xdg_data_home_content(xdg_data_home_t)
+userdom_user_home_content(xdg_data_home_t)
+
+type xdg_config_home_t;
+xdg_config_home_content(xdg_config_home_t)
+userdom_user_home_content(xdg_config_home_t)
+
+type xdg_cache_home_t;
+xdg_cache_home_content(xdg_cache_home_t)
+userdom_user_home_content(xdg_cache_home_t)
+
+type xdg_runtime_home_t;
+xdg_runtime_home_content(xdg_runtime_home_t)
+userdom_user_home_content(xdg_runtime_home_t)
Signature · 1 line
1.7.3.4
#1 lore raw

PATCH v2 1/1 Introduce XDG type definition

On Fri, 2011-10-07 at 21:35 +0200, Sven Vermeulen wrote:
snip

Quoted 3 lines

Some questions I still have:
- Are the "xdg_read_<subcomponent>" interfaces still needed? First few runs on my system here show that most (all?) need "xdg_read_all_<subcomponent>"

If you do not need an interface then no need to add it. But only call the "read_all" interfaces if it really needs to read all (which is almost never, except ofcourse the user domain)

confined applications need specific access.

Quoted 2 lines

- Is the naming "xdg_read_all_<subcomponent>" okay? Or does it need to be something like "xdg_read_all_<subcomponent>_files"?

in my view you need to be more specific if its reading files only then _files if its all content then _content if its dirs only then _dirs etc

some examples:

xdg_read_generic_cache_home_content (read any cache home content) xdg_read_all_cache_home_files (read all cache home files only) xdg_list_generic_data_home (read data home dirs only)

Quoted 5 lines

- I called the attributes "xdg_<subcomponent>_type", like "xdg_data_home_type" and not "xdg_data_type" since this is specifically for the end user location types. I am not aware of the need for non-home components (like xdg_data_type) as these are generally labeled as usr_t or similar (which is okay)

yes better to be more specific. xdg_*_home_type is good imho

Quoted 137 lines

Comments always appreciated. Also when I'm playing the wrong ball here ;-)

+++

The XDG Base Directory specification is an open specification for dealing with user data in a desktop environment. It is published on
http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
and in use by many applications.

In this patch, we introduce the xdg-specific types and give the standard interfaces for dealing with these types. We also provide a typeattribute for each of the xdg-specific locations, allowing applications that create files therein to mark these files as the appropriate xdg type.

I opted for a separate module instead of userdomain since it is targeting desktop users more than servers.

---
 xdg.fc |    8 +
 xdg.if |  472 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 xdg.te |   30 ++++
 3 files changed, 510 insertions(+), 0 deletions(-)
 create mode 100644 xdg.fc
 create mode 100644 xdg.if
 create mode 100644 xdg.te
xdg.fc new file +8 -0
new file mode 100644
index 0000000..d6ba4da
@@ -0,0 +1,8 @@
+HOME_DIR/\.cache(/.*)?		gen_context(system_u:object_r:xdg_cache_home_t,s0)
+HOME_DIR/\.config(/.*)?		gen_context(system_u:object_r:xdg_config_home_t,s0)
+HOME_DIR/\.local/share(/.*)?	gen_context(system_u:object_r:xdg_data_home_t,s0)
+
+#
+# /run
+#
+/run/user/USER(/.*)?			gen_context(system_u:object_r:xdg_runtime_home_t,s0)
xdg.if new file +90 -0
new file mode 100644
index 0000000..3cddcc0
@@ -0,0 +1,472 @@
+## <summary>Policy for xdg desktop standard</summary>
+
+########################################
+## <summary>
+##	Mark the selected type as an xdg_data_home_type
+## </summary>
+## <param name="type">
+##	<summary>
+##	Type to give the xdg_data_home_type attribute to
+##	</summary>
+## </param>
+#
+interface(`xdg_data_home_content',`
+	gen_require(`
+		attribute xdg_data_home_type;
+	')
+
+	typeattribute $1 xdg_data_home_type;
+
+	userdom_user_home_content($1)
+')
+
+########################################
+## <summary>
+##	Create objects in an xdg_data_home directory
+##	with an automatic type transition to
+##	a specified private type.
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+## <param name="private_type">
+##	<summary>
+##	The type of the object to create.
+##	</summary>
+## </param>
+## <param name="object_class">
+##	<summary>
+##	The class of the object to be created.
+##	</summary>
+## </param>
+#
+interface(`xdg_data_home_filetrans',`
+	gen_require(`
+		type xdg_data_home_t;
+	')
+
+	filetrans_pattern($1, xdg_data_home_t, $2, $3)
+')
+
+
+########################################
+## <summary>
+##	Mark the selected type as an xdg_cache_home_type
+## </summary>
+## <param name="type">
+##	<summary>
+##	Type to give the xdg_cache_home_type attribute to
+##	</summary>
+## </param>
+#
+interface(`xdg_cache_home_content',`
+	gen_require(`
+		attribute xdg_cache_home_type;
+	')
+
+	typeattribute $1 xdg_cache_home_type;
+
+	userdom_user_home_content($1)
+')
+
+########################################
+## <summary>
+##	Create objects in an xdg_cache_home directory
+##	with an automatic type transition to
+##	a specified private type.
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+## <param name="private_type">
+##	<summary>
+##	The type of the object to create.
+##	</summary>
+## </param>
+## <param name="object_class">

xdg.if line 100

Quoted 10 lines
xdg.if new file +10 -0
+##	<summary>
+##	The class of the object to be created.
+##	</summary>
+## </param>
+#
+interface(`xdg_cache_home_filetrans',`
+	gen_require(`
+		type xdg_cache_home_t;
+	')
+

userdom_search_user_home_dirs($1)

Quoted 41 lines
xdg.if new file +41 -0
+	filetrans_pattern($1, xdg_cache_home_t, $2, $3)
+')
+
+
+########################################
+## <summary>
+##	Mark the selected type as an xdg_config_home_type
+## </summary>
+## <param name="type">
+##	<summary>
+##	Type to give the xdg_config_home_type attribute to
+##	</summary>
+## </param>
+#
+interface(`xdg_config_home_content',`
+	gen_require(`
+		attribute xdg_config_home_type;
+	')
+
+	typeattribute $1 xdg_config_home_type;
+
+	userdom_user_home_content($1)
+')
+
+########################################
+## <summary>
+##	Create objects in an xdg_config_home directory
+##	with an automatic type transition to
+##	a specified private type.
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+## <param name="private_type">
+##	<summary>
+##	The type of the object to create.
+##	</summary>
+## </param>
+## <param name="object_class">

xdg.if line 151

Quoted 10 lines
xdg.if new file +10 -0
+##	<summary>
+##	The class of the object to be created.
+##	</summary>
+## </param>
+#
+interface(`xdg_config_home_filetrans',`
+	gen_require(`
+		type xdg_config_home_t;
+	')
+

userdom_search_user_home_dirs($1)

Quoted 40 lines
xdg.if new file +40 -0
+	filetrans_pattern($1, xdg_config_home_t, $2, $3)
+')
+
+########################################
+## <summary>
+##	Mark the selected type as an xdg_runtime_home_type
+## </summary>
+## <param name="type">
+##	<summary>
+##	Type to give the xdg_runtime_home_type attribute to
+##	</summary>
+## </param>
+#
+interface(`xdg_runtime_home_content',`
+	gen_require(`
+		attribute xdg_runtime_home_type;
+	')
+
+	typeattribute $1 xdg_runtime_home_type;
+
+	userdom_user_home_content($1)
+')
+
+########################################
+## <summary>
+##	Create objects in an xdg_runtime_home directory
+##	with an automatic type transition to
+##	a specified private type.
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+## <param name="private_type">
+##	<summary>
+##	The type of the object to create.
+##	</summary>
+## </param>
+## <param name="object_class">

xdg.if line 201

Quoted 10 lines
xdg.if new file +10 -0
+##	<summary>
+##	The class of the object to be created.
+##	</summary>
+## </param>
+#
+interface(`xdg_runtime_home_filetrans',`
+	gen_require(`
+		type xdg_runtime_home_t;
+	')
+

userdom_search_user_home_dirs($1)

Quoted 5 lines
xdg.if new file +5 -0
+	filetrans_pattern($1, xdg_runtime_home_t, $2, $3)
+')
+
+
+########################################

xdg.if line 216

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read the xdg cache home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_cache_home',`

xdg_read_generic_cache_home_files

xdg.if line 222

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		type xdg_cache_home_t;	
+	')
+
+	read_files_pattern($1, xdg_cache_home_t, xdg_cache_home_t)
+

why list? userdom_search_user_home_dirs($1)

Quoted 4 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 236

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read all xdg_cache_home_type files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_all_cache_home',`

xdg_read_all_cache_home_files()

xdg.if line 242

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		attribute xdg_cache_home_type;
+	')
+
+	read_files_pattern($1, xdg_cache_home_type, xdg_cache_home_type)
+

why list?

Quoted 5 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 256

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Manage the xdg cache home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_manage_cache_home',`

xdg_manage_generic_cache_home_content

xdg.if line 262

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		type xdg_cache_home_t;	
+	')
+
+	manage_files_pattern($1, xdg_cache_home_t, xdg_cache_home_t)
+	manage_dirs_pattern($1, xdg_cache_home_t, xdg_cache_home_t)

manage_lnk_files_pattern()
manage_fifo_files_pattern()

xdg.if line 263

Quoted 1 line
xdg.if new file +1 -0
+

why list?

Quoted 5 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 277

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read the xdg config home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_config_home',`

xdg_read_generic_config_home_files()

xdg.if line 283

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		type xdg_config_home_t;	
+	')
+
+	read_files_pattern($1, xdg_config_home_t, xdg_config_home_t)
+	

userdom_search_user_home_dirs($1)

Quoted 4 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 297

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read all xdg_config_home_type files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_all_config_home',`

xdg_read_all_config_home_files()

xdg.if line 303

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		attribute xdg_config_home_type;
+	')
+
+	read_files_pattern($1, xdg_config_home_type, xdg_config_home_type)
+	

why list?

Quoted 5 lines
xdg.if new file +5 -0
+	userdom_list_user_home_dirs($1)
+')
+
+
+########################################

xdg.if line 318

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Manage the xdg config home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_manage_config_home',`

xdg_manage_generic_config_home_content()

xdg.if line 324

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		type xdg_config_home_t;	
+	')
+
+	manage_files_pattern($1, xdg_config_home_t, xdg_config_home_t)
+	manage_dirs_pattern($1, xdg_config_home_t, xdg_config_home_t)

manage_lnk_files_pattern()
manage_fifo_files_pattern()

xdg.if line 325

Quoted 1 line
xdg.if new file +1 -0
+	

userdom_search_user_home_dirs()

Quoted 4 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 339

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read the xdg data home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_data_home',`

xdg_read_generic_data_home_files()

xdg.if line 345

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		type xdg_data_home_t;	
+	')
+
+	read_files_pattern($1, xdg_data_home_t, xdg_data_home_t)
+

why list?

Quoted 5 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 359

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read all xdg_data_home_type files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_all_data_home',`

xdg_read_all_data_home_files()

xdg.if line 365

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		attribute xdg_data_home_type;
+	')
+
+	read_files_pattern($1, xdg_data_home_type, xdg_data_home_type)
+

why list?

Quoted 5 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 379

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Manage the xdg data home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_manage_data_home',`

xdg_manage_all_data_home_content()

xdg.if line 386

Quoted 7 lines
xdg.if new file +7 -0
+	gen_require(`
+		type xdg_data_home_t;	
+	')
+
+	manage_files_pattern($1, xdg_data_home_t, xdg_data_home_t)
+	manage_dirs_pattern($1, xdg_data_home_t, xdg_data_home_t)
+	

manage_lnk_files_pattern()
manage_fifo_files_pattern()

why list?

Quoted 4 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 400

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read the xdg runtime home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_runtime_home',`

xdg_read_generic_runtime_home_files()

xdg.if line 406

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		type xdg_runtime_home_t;	
+	')
+
+	read_files_pattern($1, xdg_runtime_home_t, xdg_runtime_home_t)
+

why list? (besides , caller does not need to search user_home_dir_t to get to /run/user/$USER

files_search_pids($1) might be more appropriate (we need to find a good label for /run/user)

Quoted 5 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 420

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Read all xdg_runtime_home_type files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_read_all_runtime_home',`

xdg_read_all_runtime_home_files()

xdg.if line 426

Quoted 6 lines
xdg.if new file +6 -0
+	gen_require(`
+		attribute xdg_runtime_home_type;
+	')
+
+	read_files_pattern($1, xdg_runtime_home_type, xdg_runtime_home_type)
+

no need for this

Quoted 5 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+########################################

xdg.if line 440

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##	Manage the xdg runtime home files
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+#
+interface(`xdg_manage_runtime_home',`

xdg_manage_generic_runtime_home_content()

xdg.if line 447

Quoted 7 lines
xdg.if new file +7 -0
+	gen_require(`
+		type xdg_runtime_home_t;	
+	')
+
+	manage_files_pattern($1, xdg_runtime_home_t, xdg_runtime_home_t)
+	manage_dirs_pattern($1, xdg_runtime_home_t, xdg_runtime_home_t)
+

manage_lnk_files_pattern()
manage_fifo_files_pattern()

Quoted 1 line

no need for this

Quoted 4 lines
xdg.if new file +4 -0
+	userdom_list_user_home_dirs($1)
+')
+
+#######################################

xdg.if line 461

Quoted 10 lines
xdg.if new file +10 -0
+## <summary>
+##   Allow the userdomain full administrative rights on the xdg_* locations
+## </summary>
+## <param name="userdomain">
+##	<summary>
+##	The user domain
+##	</summary>
+## </param>
+## <rolebase/>
+#

just use xdm_manage_all_*_home_content()
besides i do not believe that pebenito want to give users full access to all xdg content types from one single place

rather call specific interfaces from the various role templates.

only give user domains access to manage generic content by default(from /roles/ layer)

so for example in staff.te there could be:

optional_policy(`
xdg_manage_generic_data_home_content(staff_t) xdg_manage_generic_cache_home_content(staff_t) xdg_manage_generic_config_home_content(staff_t) xdg_manage_generic_runtime_home_content(staff_t)
')

then all private xdg content types will be dealt with in the various confined applications' role templates

Quoted 49 lines
xdg.if new file +11 -0
+interface(`xdg_admin',`
+	gen_require(`
+		attribute xdg_cache_home_type, xdg_config_home_type, xdg_data_home_type;
+	')
+
+	# full control over the xdg_* directories
+	admin_pattern($1, xdg_cache_home_type)
+	admin_pattern($1, xdg_config_home_type)
+	admin_pattern($1, xdg_data_home_type)
+')
+
xdg.te new file +17 -0
new file mode 100644
index 0000000..087eef8
@@ -0,0 +1,30 @@
+policy_module(xdg, 1.0.0)
+
+########################################
+#
+# Declarations
+#
+
+attribute xdg_data_home_type;
+
+attribute xdg_config_home_type;
+
+attribute xdg_cache_home_type;
+
+attribute xdg_runtime_home_type;
+
+type xdg_data_home_t;
+xdg_data_home_content(xdg_data_home_t)

this is not needed xdg_data_home_content already calls userdom_user_home_content() +userdom_user_home_content(xdg_data_home_t)

xdg.te new file +3 -0
+
+type xdg_config_home_t;
+xdg_config_home_content(xdg_config_home_t)

not needed: +userdom_user_home_content(xdg_config_home_t)

xdg.te new file +3 -0
+
+type xdg_cache_home_t;
+xdg_cache_home_content(xdg_cache_home_t)

not needed: +userdom_user_home_content(xdg_cache_home_t)

xdg.te new file +3 -0
+
+type xdg_runtime_home_t;
+xdg_runtime_home_content(xdg_runtime_home_t)
 
 not needed: +userdom_user_home_content(xdg_runtime_home_t)
#2 lore raw

PATCH v2 1/1 Introduce XDG type definition

In reply to Sven Vermeulen
Quoted 20 lines · Sven Vermeulen
xdg.if new file +20 -0
+########################################
+## <summary>
+##	Create objects in an xdg_config_home directory
+##	with an automatic type transition to
+##	a specified private type.
+## </summary>
+## <param name="domain">
+##	<summary>
+##	Domain allowed access.
+##	</summary>
+## </param>
+## <param name="private_type">
+##	<summary>
+##	The type of the object to create.
+##	</summary>
+## </param>
+## <param name="object_class">
+##	<summary>
+##	The class of the object to be created.
+##	</summary>

xdg.if line 154

Quoted 10 lines
xdg.if new file +10 -0
+## </param>
+#
+interface(`xdg_config_home_filetrans',`
+	gen_require(`
+		type xdg_config_home_t;
+	')
+
+	filetrans_pattern($1, xdg_config_home_t, $2, $3)
+')
+

I have been thinking about this and i think we may want to make these xdg_*_home_spec_filetrans.

The reason is because we also need a normal xdg_*_home_filetrans for processes actually creating .config .cache .local and /run/user/$USER

Any process can create these dirs if they do not exist.

example:

xdg_cache_home_filetrans() userdom_user_home_dir_filetrans($1, xdg_cache_home_t, dir, ".cache")

xdg_config_home_filetrans() userdom_user_home_dir_filetrans($1, xdg_config_home_t, dir, ".config")

xdg_data_home_filetrans() userdom_user_home_dir_filetrans($1, xdg_data_home_t, dir, ".local")

xdg_runtime_home_filetrans()
???

Also hopefully reference policy will add support for named filetrans soon. We will need it here.