From ad9aee5c34348cac3bdd7d1670631fd936a7c0a2 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Thu, 7 Jan 2021 17:37:15 +0100 Subject: [PATCH 1/3] Set permissions for new folder --- changelog/unreleased/8076 | 5 +++ src/libsync/propagateremotemkdir.cpp | 46 +++++++++------------------- src/libsync/propagateremotemkdir.h | 2 -- 3 files changed, 19 insertions(+), 34 deletions(-) create mode 100644 changelog/unreleased/8076 diff --git a/changelog/unreleased/8076 b/changelog/unreleased/8076 new file mode 100644 index 00000000000..79ccc77e039 --- /dev/null +++ b/changelog/unreleased/8076 @@ -0,0 +1,5 @@ +Bugfix: Fix missing permission for newly created folder + +We fixed a bug where a newly created folder had no permissions set. + +https://github.com/owncloud/client/pull/8076 diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp index 5faa2f44bb9..56925ca0002 100644 --- a/src/libsync/propagateremotemkdir.cpp +++ b/src/libsync/propagateremotemkdir.cpp @@ -106,38 +106,20 @@ void PropagateRemoteMkdir::slotMkcolJobFinished() _item->_fileId = _job->reply()->rawHeader("OC-FileId"); - if (_item->_fileId.isEmpty()) { - // Owncloud 7.0.0 and before did not have a header with the file id. - // (https://github.com/owncloud/core/issues/9000) - // So we must get the file id using a PROPFIND - // This is required so that we can detect moves even if the folder is renamed on the server - // while files are still uploading - propagator()->_activeJobList.append(this); - auto propfindJob = new PropfindJob(_job->account(), _job->path(), this); - propfindJob->setProperties(QList() << "http://owncloud.org/ns:id"); - QObject::connect(propfindJob, &PropfindJob::result, this, &PropagateRemoteMkdir::propfindResult); - QObject::connect(propfindJob, &PropfindJob::finishedWithError, this, &PropagateRemoteMkdir::propfindError); - propfindJob->start(); - _job = propfindJob; - return; - } - success(); -} - -void PropagateRemoteMkdir::propfindResult(const QVariantMap &result) -{ - propagator()->_activeJobList.removeOne(this); - if (result.contains(QStringLiteral("id"))) { - _item->_fileId = result[QStringLiteral("id")].toByteArray(); - } - success(); -} - -void PropagateRemoteMkdir::propfindError() -{ - // ignore the PROPFIND error - propagator()->_activeJobList.removeOne(this); - done(SyncFileItem::Success); + propagator()->_activeJobList.append(this); + auto propfindJob = new PropfindJob(_job->account(), _job->path(), this); + propfindJob->setProperties({"http://owncloud.org/ns:permissions"}); + connect(propfindJob, &PropfindJob::result, this, [this](const QVariantMap &result){ + propagator()->_activeJobList.removeOne(this); + _item->_remotePerm = RemotePermissions::fromServerString(result.value(QStringLiteral("permissions")).toString()); + success(); + }); + connect(propfindJob, &PropfindJob::finishedWithError, this, [this]{ + // ignore the PROPFIND error + propagator()->_activeJobList.removeOne(this); + done(SyncFileItem::NormalError); + }); + propfindJob->start(); } void PropagateRemoteMkdir::success() diff --git a/src/libsync/propagateremotemkdir.h b/src/libsync/propagateremotemkdir.h index b850e6f2a0d..d1168195008 100644 --- a/src/libsync/propagateremotemkdir.h +++ b/src/libsync/propagateremotemkdir.h @@ -51,8 +51,6 @@ class PropagateRemoteMkdir : public PropagateItemJob private slots: void slotStartMkcolJob(); void slotMkcolJobFinished(); - void propfindResult(const QVariantMap &); - void propfindError(); void success(); }; } From 772e110201f1c061f0a32f59b2ae56c049797543 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Mon, 14 Sep 2020 10:40:02 +0200 Subject: [PATCH 2/3] Ensure we don't enter empty permissions to the db --- src/common/syncjournaldb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp index 7cbfc55e292..4320073baa9 100644 --- a/src/common/syncjournaldb.cpp +++ b/src/common/syncjournaldb.cpp @@ -880,7 +880,7 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record) } } } - + OC_ASSERT(!record._remotePerm.isNull()); qCInfo(lcDb) << "Updating file record for path:" << record._path << "inode:" << record._inode << "modtime:" << record._modtime << "type:" << record._type << "etag:" << record._etag << "fileId:" << record._fileId << "remotePerm:" << record._remotePerm.toString() From 71cf6a6478716e0fdbf28548842de42c32ff04f6 Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Thu, 7 Jan 2021 17:37:50 +0100 Subject: [PATCH 3/3] Fix unittests --- test/testsyncjournaldb.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/testsyncjournaldb.cpp b/test/testsyncjournaldb.cpp index 8fba254c378..1f34d8f54a1 100644 --- a/test/testsyncjournaldb.cpp +++ b/test/testsyncjournaldb.cpp @@ -117,7 +117,7 @@ private slots: { SyncJournalFileRecord record; record._path = "foo-nochecksum"; - record._remotePerm = RemotePermissions(); + record._remotePerm = RemotePermissions::fromDbValue("RW"); record._modtime = Utility::qDateTimeToTime_t(QDateTime::currentDateTimeUtc()); QVERIFY(_db.setFileRecord(record)); @@ -201,6 +201,7 @@ private slots: record._path = path; record._type = type; record._etag = initialEtag; + record._remotePerm = RemotePermissions::fromDbValue("RW"); _db.setFileRecord(record); }; auto getEtag = [&](const QByteArray &path) { @@ -265,6 +266,7 @@ private slots: auto makeEntry = [&](const QByteArray &path) { SyncJournalFileRecord record; record._path = path; + record._remotePerm = RemotePermissions::fromDbValue("RW"); _db.setFileRecord(record); };