diff options
| author | Monsta <[email protected]> | 2015-06-04 11:19:21 +0300 | 
|---|---|---|
| committer | Monsta <[email protected]> | 2015-06-04 11:19:21 +0300 | 
| commit | 251d80191df6a2bcd81f1aa67da6e261ef41610d (patch) | |
| tree | 8d82edfadad1b6ee671239acef9a9169cc6468cb | |
| parent | e556b69e2cf83b559aff32a7bbc1942b6838cf69 (diff) | |
| download | eom-251d80191df6a2bcd81f1aa67da6e261ef41610d.tar.bz2 eom-251d80191df6a2bcd81f1aa67da6e261ef41610d.tar.xz | |
don't change file permissions when saving the modified image
adapted from:
https://git.gnome.org/browse/eog/commit/?id=4626596c2c179bfe35c4212efced15c38d7337d6
| -rw-r--r-- | src/eom-image.c | 108 | ||||
| -rw-r--r-- | src/eom-jobs.c | 23 | 
2 files changed, 108 insertions, 23 deletions
| diff --git a/src/eom-image.c b/src/eom-image.c index d990f98..523f37f 100644 --- a/src/eom-image.c +++ b/src/eom-image.c @@ -1433,6 +1433,110 @@ transfer_progress_cb (goffset cur_bytes,  	}  } +static void +tmp_file_restore_unix_attributes (GFile *temp_file, +				  GFile *target_file) +{ +	GFileInfo *file_info; +	guint      uid; +	guint      gid; +	guint      mode; +	guint      mode_mask = 00600; + +	GError    *error = NULL; + +	g_return_if_fail (G_IS_FILE (temp_file)); +	g_return_if_fail (G_IS_FILE (target_file)); + +	/* check if file exists */ +	if (!g_file_query_exists (target_file, NULL)) { +		eom_debug_message (DEBUG_IMAGE_SAVE, +				   "Target file doesn't exist. Setting default attributes."); +		return; +	} + +	/* retrieve UID, GID, and MODE of the original file info */ +	file_info = g_file_query_info (target_file, +				       "unix::uid,unix::gid,unix::mode", +				       G_FILE_QUERY_INFO_NONE, +				       NULL, +				       &error); + +	/* check that there aren't any error */ +	if (error != NULL) { +		eom_debug_message (DEBUG_IMAGE_SAVE, +				   "File information not available. Setting default attributes."); + +		/* free objects */ +		g_object_unref (file_info); +		g_clear_error (&error); + +		return; +	} + +	/* save UID, GID and MODE values */ +	uid = g_file_info_get_attribute_uint32 (file_info, +						G_FILE_ATTRIBUTE_UNIX_UID); + +	gid = g_file_info_get_attribute_uint32 (file_info, +						G_FILE_ATTRIBUTE_UNIX_GID); + +	mode = g_file_info_get_attribute_uint32 (file_info, +						 G_FILE_ATTRIBUTE_UNIX_MODE); + +	/* apply default mode mask to file mode */ +	mode |= mode_mask; + +	/* restore original UID, GID, and MODE into the temporal file */ +	g_file_set_attribute_uint32 (temp_file, +				     G_FILE_ATTRIBUTE_UNIX_UID, +				     uid, +				     G_FILE_QUERY_INFO_NONE, +				     NULL, +				     &error); + +	/* check that there aren't any error */ +	if (error != NULL) { +		eom_debug_message (DEBUG_IMAGE_SAVE, +				   "You do not have the permissions necessary to change the file UID."); + +		g_clear_error (&error); +	} + +	g_file_set_attribute_uint32 (temp_file, +				     G_FILE_ATTRIBUTE_UNIX_GID, +				     gid, +				     G_FILE_QUERY_INFO_NONE, +				     NULL, +				     &error); + +	/* check that there aren't any error */ +	if (error != NULL) { +		eom_debug_message (DEBUG_IMAGE_SAVE, +				   "You do not have the permissions necessary to change the file GID. Setting user default GID."); + +		g_clear_error (&error); +	} + +	g_file_set_attribute_uint32 (temp_file, +				     G_FILE_ATTRIBUTE_UNIX_MODE, +				     mode, +				     G_FILE_QUERY_INFO_NONE, +				     NULL, +				     &error); + +	/* check that there aren't any error */ +	if (error != NULL) { +		eom_debug_message (DEBUG_IMAGE_SAVE, +				   "You do not have the permissions necessary to change the file MODE."); + +		g_clear_error (&error); +	} + +	/* free objects */ +	g_object_unref (file_info); +} +  static gboolean  tmp_file_move_to_uri (EomImage *image,  		      GFile *tmpfile, @@ -1443,6 +1547,10 @@ tmp_file_move_to_uri (EomImage *image,  	gboolean result;  	GError *ioerror = NULL; +	/* try to restore target file unix attributes */ +	tmp_file_restore_unix_attributes (tmpfile, file); + +	/* replace target file with temporal file */  	result = g_file_move (tmpfile,  			      file,  			      (overwrite ? G_FILE_COPY_OVERWRITE : 0) | diff --git a/src/eom-jobs.c b/src/eom-jobs.c index df5c714..1974ee4 100644 --- a/src/eom-jobs.c +++ b/src/eom-jobs.c @@ -708,9 +708,6 @@ eom_job_save_as_run (EomJob *ejob)  	EomJobSaveAs *saveas_job;  	GList *it;  	guint n_images; -	guint file_permissions = 00000; -	guint permissions_mask = 00600; -	GFileInfo *info;  	g_return_if_fail (EOM_IS_JOB_SAVE_AS (ejob)); @@ -796,26 +793,6 @@ eom_job_save_as_run (EomJob *ejob)  						     dest_info,  						     &ejob->error); -		/* get file permissions */ -		info = g_file_query_info (saveas_job->file, -					  G_FILE_ATTRIBUTE_UNIX_MODE, -					  G_FILE_QUERY_INFO_NONE, -					  NULL, -					  NULL); - -		file_permissions = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE); - -		/* apply permission mask to file permissions */ -		file_permissions |= permissions_mask; - -		g_file_set_attribute_uint32 (saveas_job->file, -					     G_FILE_ATTRIBUTE_UNIX_MODE, -					     file_permissions, -					     G_FILE_QUERY_INFO_NONE, -					     NULL, -					     NULL); - -		g_object_unref (info);  		if (src_info)  			g_object_unref (src_info); | 
