Permissions: Keep more user permissions
authorChristian Kamm <mail@ckamm.de>
Mon, 23 Nov 2015 12:23:19 +0000 (13:23 +0100)
committerChristian Kamm <mail@ckamm.de>
Mon, 23 Nov 2015 12:24:05 +0000 (13:24 +0100)
t4.pl discovered that it'd needlessly override permissions sometimes

src/libsync/filesystem.cpp
src/libsync/filesystem.h
src/libsync/propagatedownload.cpp
src/libsync/syncengine.cpp

index db13a7471218ed7321a2e6a273f6d21a1c08b5d6..e28cfde20764348485f6dbc87eb4c038976f5a60 100644 (file)
@@ -143,6 +143,19 @@ void FileSystem::setFileReadOnly(const QString& filename, bool readonly)
     file.setPermissions(permissions);
 }
 
+
+void FileSystem::setFileReadOnlyWeak(const QString& filename, bool readonly)
+{
+    QFile file(filename);
+    QFile::Permissions permissions = file.permissions();
+
+    if (!readonly && (permissions & QFile::WriteOwner)) {
+        return; // already writable enough
+    }
+
+    setFileReadOnly(filename, readonly);
+}
+
 time_t FileSystem::getModTime(const QString &filename)
 {
     csync_vio_file_stat_t* stat = csync_vio_file_stat_new();
index e6a760a81a76ad8f4450937121acf643d10190f5..21e6975363012b4100e29efdf1284683ffe7d1d4 100644 (file)
@@ -55,6 +55,17 @@ void OWNCLOUDSYNC_EXPORT setFileHidden(const QString& filename, bool hidden);
  */
 void OWNCLOUDSYNC_EXPORT setFileReadOnly(const QString& filename, bool readonly);
 
+/**
+ * @brief Marks the file as read-only.
+ *
+ * It's like setFileReadOnly(), but weaker: if readonly is false and the user
+ * already has write permissions, no change to the permissions is made.
+ *
+ * This means that it will preserve explicitly set rw-r--r-- permissions even
+ * when the umask is 0002. (setFileReadOnly() would adjust to rw-rw-r--)
+ */
+void OWNCLOUDSYNC_EXPORT setFileReadOnlyWeak(const QString& filename, bool readonly);
+
 /** convert a "normal" windows path into a path that can be 32k chars long. */
 QString OWNCLOUDSYNC_EXPORT longWinPath( const QString& inpath );
 
index c0572e4ce926d810c4758a0c4bbd93fd679ec6b4..305f8977aabf97c8793263985a47d66eaff6fa65 100644 (file)
@@ -671,8 +671,8 @@ void PropagateDownloadFileQNAM::downloadFinished()
     }
 
     // Apply the remote permissions
-    FileSystem::setFileReadOnly(_tmpFile.fileName(),
-                                 !_item->_remotePerm.contains('W'));
+    FileSystem::setFileReadOnlyWeak(_tmpFile.fileName(),
+                                    !_item->_remotePerm.contains('W'));
 
     QString error;
     _propagator->addTouchedFile(fn);
index d1e70cff8b6cef3f7e7bc34db3d799a9078c44e7..36acf77ca1007d4fc4ac948a494c87effc7c3a43 100644 (file)
@@ -493,7 +493,7 @@ int SyncEngine::treewalkFile( TREE_WALK_FILE *file, bool remote )
             SyncJournalFileRecord prev = _journal->getFileRecord(item->_file);
             if (prev._remotePerm.contains('W') != item->_remotePerm.contains('W')) {
                 const bool isReadOnly = !item->_remotePerm.contains('W');
-                FileSystem::setFileReadOnly(filePath, isReadOnly);
+                FileSystem::setFileReadOnlyWeak(filePath, isReadOnly);
             }
 
             _journal->setFileRecordMetadata(SyncJournalFileRecord(*item, filePath));