walters / rpms / glib2

Forked from rpms/glib2 5 years ago
Clone
Tomas Bzatek 9ac10ee
Index: gio/glocalfileinfo.c
Tomas Bzatek 9ac10ee
===================================================================
Tomas Bzatek 9ac10ee
--- gio/glocalfileinfo.c	(revision 6871)
Tomas Bzatek 9ac10ee
+++ gio/glocalfileinfo.c	(working copy)
Tomas Bzatek 9ac10ee
@@ -1706,6 +1706,24 @@
Tomas Bzatek 9ac10ee
 #endif
Tomas Bzatek 9ac10ee
 
Tomas Bzatek 9ac10ee
 static gboolean
Tomas Bzatek 9ac10ee
+get_string (const GFileAttributeValue  *value,
Tomas Bzatek 9ac10ee
+	    const char                **val_out,
Tomas Bzatek 9ac10ee
+	    GError                    **error)
Tomas Bzatek 9ac10ee
+{
Tomas Bzatek 9ac10ee
+  if (value->type != G_FILE_ATTRIBUTE_TYPE_STRING)
Tomas Bzatek 9ac10ee
+    {
Tomas Bzatek 9ac10ee
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
Tomas Bzatek 9ac10ee
+		   _("Invalid attribute type (byte string expected)"));
Tomas Bzatek 9ac10ee
+      return FALSE;
Tomas Bzatek 9ac10ee
+    }
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+  *val_out = value->u.string;
Tomas Bzatek 9ac10ee
+  
Tomas Bzatek 9ac10ee
+  return TRUE;
Tomas Bzatek 9ac10ee
+}
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+static gboolean
Tomas Bzatek 9ac10ee
 set_unix_mode (char                       *filename,
Tomas Bzatek 9ac10ee
 	       const GFileAttributeValue  *value,
Tomas Bzatek 9ac10ee
 	       GError                    **error)
Tomas Bzatek 9ac10ee
@@ -1948,6 +1966,52 @@
Tomas Bzatek 9ac10ee
 }
Tomas Bzatek 9ac10ee
 #endif
Tomas Bzatek 9ac10ee
 
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+static gboolean
Tomas Bzatek 9ac10ee
+set_selinux_context (char                       *filename,
Tomas Bzatek 9ac10ee
+		 const GFileAttributeValue  *value,
Tomas Bzatek 9ac10ee
+		 GError                    **error)
Tomas Bzatek 9ac10ee
+{
Tomas Bzatek 9ac10ee
+  const char *val;
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+  if (!get_string (value, &val, error))
Tomas Bzatek 9ac10ee
+    return FALSE;
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+  if (val == NULL)
Tomas Bzatek 9ac10ee
+  {
Tomas Bzatek 9ac10ee
+    g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
Tomas Bzatek 9ac10ee
+               _("SELinux context must be non-NULL"));
Tomas Bzatek 9ac10ee
+    return FALSE;
Tomas Bzatek 9ac10ee
+  }
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+#ifdef HAVE_SELINUX
Tomas Bzatek 9ac10ee
+  if (is_selinux_enabled ()) {
Tomas Bzatek 9ac10ee
+	security_context_t val_s;
Tomas Bzatek 9ac10ee
+	
Tomas Bzatek 9ac10ee
+	val_s = g_strdup (val);
Tomas Bzatek 9ac10ee
+	
Tomas Bzatek 9ac10ee
+	if (setfilecon_raw (filename, val_s) < 0)
Tomas Bzatek 9ac10ee
+	{
Tomas Bzatek 9ac10ee
+            int errsv = errno;
Tomas Bzatek 9ac10ee
+            
Tomas Bzatek 9ac10ee
+            g_set_error (error, G_IO_ERROR,
Tomas Bzatek 9ac10ee
+                         g_io_error_from_errno (errsv),
Tomas Bzatek 9ac10ee
+                	_("Error setting SELinux context: %s"),
Tomas Bzatek 9ac10ee
+                         g_strerror (errsv));
Tomas Bzatek 9ac10ee
+            return FALSE;
Tomas Bzatek 9ac10ee
+        }
Tomas Bzatek 9ac10ee
+        g_free (val_s);
Tomas Bzatek 9ac10ee
+  } else {
Tomas Bzatek 9ac10ee
+    g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
Tomas Bzatek 9ac10ee
+               _("SELinux is not enabled on this system"));
Tomas Bzatek 9ac10ee
+    return FALSE;
Tomas Bzatek 9ac10ee
+  }
Tomas Bzatek 9ac10ee
+#endif 
Tomas Bzatek 9ac10ee
+                                                     
Tomas Bzatek 9ac10ee
+  return TRUE;
Tomas Bzatek 9ac10ee
+}
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
 gboolean
Tomas Bzatek 9ac10ee
 _g_local_file_info_set_attribute (char                 *filename,
Tomas Bzatek 9ac10ee
 				  const char           *attribute,
Tomas Bzatek 9ac10ee
@@ -1993,6 +2057,11 @@
Tomas Bzatek 9ac10ee
   else if (g_str_has_prefix (attribute, "xattr-sys::"))
Tomas Bzatek 9ac10ee
     return set_xattr (filename, attribute, &value, error);
Tomas Bzatek 9ac10ee
 #endif
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+#ifdef HAVE_SELINUX 
Tomas Bzatek 9ac10ee
+  else if (strcmp (attribute, G_FILE_ATTRIBUTE_SELINUX_CONTEXT) == 0)
Tomas Bzatek 9ac10ee
+    return set_selinux_context (filename, &value, error);
Tomas Bzatek 9ac10ee
+#endif
Tomas Bzatek 9ac10ee
   
Tomas Bzatek 9ac10ee
   g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
Tomas Bzatek 9ac10ee
 	       _("Setting attribute %s not supported"), attribute);
Tomas Bzatek 9ac10ee
@@ -2110,5 +2179,25 @@
Tomas Bzatek 9ac10ee
 
Tomas Bzatek 9ac10ee
   /* xattrs are handled by default callback */
Tomas Bzatek 9ac10ee
 
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
+  /*  SELinux context */
Tomas Bzatek 9ac10ee
+#ifdef HAVE_SELINUX 
Tomas Bzatek 9ac10ee
+  if (is_selinux_enabled ()) {
Tomas Bzatek 9ac10ee
+    value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_SELINUX_CONTEXT);
Tomas Bzatek 9ac10ee
+    if (value)
Tomas Bzatek 9ac10ee
+    {
Tomas Bzatek 9ac10ee
+      if (!set_selinux_context (filename, value, error))
Tomas Bzatek 9ac10ee
+        {
Tomas Bzatek 9ac10ee
+          value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING;
Tomas Bzatek 9ac10ee
+          res = FALSE;
Tomas Bzatek 9ac10ee
+          /* Don't set error multiple times */
Tomas Bzatek 9ac10ee
+          error = NULL;
Tomas Bzatek 9ac10ee
+        }
Tomas Bzatek 9ac10ee
+      else
Tomas Bzatek 9ac10ee
+        value->status = G_FILE_ATTRIBUTE_STATUS_SET;
Tomas Bzatek 9ac10ee
+    }
Tomas Bzatek 9ac10ee
+  }
Tomas Bzatek 9ac10ee
+#endif
Tomas Bzatek 9ac10ee
+
Tomas Bzatek 9ac10ee
   return res;
Tomas Bzatek 9ac10ee
 }