diff options
author | Martin Wimpress <[email protected]> | 2015-06-11 19:24:24 +0100 |
---|---|---|
committer | Martin Wimpress <[email protected]> | 2015-06-11 19:24:24 +0100 |
commit | 7a7e57f718f0ea9128d7cb6fe239ab25e4a0da0d (patch) | |
tree | 16c6d57337655d1b42529c1d5adffa4bb1720fd4 | |
parent | 64a7b25e12b248e7869e77a272528ba14bc4b832 (diff) | |
parent | 02d0316da724f63026bb804699dcbc6875083911 (diff) | |
download | eom-7a7e57f718f0ea9128d7cb6fe239ab25e4a0da0d.tar.bz2 eom-7a7e57f718f0ea9128d7cb6fe239ab25e4a0da0d.tar.xz |
Merge pull request #76 from monsta/1.81.8
[1.8] don't change file permissions when saving the modified image
-rw-r--r-- | src/eom-image.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/eom-image.c b/src/eom-image.c index 989f365..3ea28d4 100644 --- a/src/eom-image.c +++ b/src/eom-image.c @@ -1431,6 +1431,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, @@ -1441,6 +1545,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) | |