From: Matthieu Gallien Date: Thu, 19 Sep 2024 16:50:33 +0000 (+0200) Subject: receive and decode tokens for locks X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~6^2~8^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=27d8ecbf4403035fcf69272264b2cfa0b681cb1c;p=nextcloud-desktop.git receive and decode tokens for locks Signed-off-by: Matthieu Gallien --- diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 6eb2eefd7..0a259360f 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -712,6 +712,7 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(const SyncFileItemPtr &it item->_lockEditorApp = serverEntry.lockEditorApp; item->_lockTime = serverEntry.lockTime; item->_lockTimeout = serverEntry.lockTimeout; + item->_lockToken = serverEntry.lockToken; qCDebug(lcDisco()) << "item lock for:" << item->_file << item->_locked @@ -720,7 +721,8 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(const SyncFileItemPtr &it << item->_lockOwnerType << item->_lockEditorApp << item->_lockTime - << item->_lockTimeout; + << item->_lockTimeout + << item->_lockToken; // Check for missing server data { diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp index ca96b8c82..606f34f35 100644 --- a/src/libsync/discoveryphase.cpp +++ b/src/libsync/discoveryphase.cpp @@ -415,7 +415,8 @@ void DiscoverySingleDirectoryJob::start() << "http://nextcloud.org/ns:lock-owner-type" << "http://nextcloud.org/ns:lock-owner-editor" << "http://nextcloud.org/ns:lock-time" - << "http://nextcloud.org/ns:lock-timeout"; + << "http://nextcloud.org/ns:lock-timeout" + << "http://nextcloud.org/ns:lock-token"; } props << "http://nextcloud.org/ns:is-mount-root"; @@ -547,7 +548,9 @@ static void propertyMapToRemoteInfo(const QMap &map, RemotePer result.lockTimeout = 0; } } - + if (property == "lock-token") { + result.lockToken = value; + } } if (result.isDirectory && map.contains("size")) { diff --git a/src/libsync/discoveryphase.h b/src/libsync/discoveryphase.h index 7d53f1336..ff38d7391 100644 --- a/src/libsync/discoveryphase.h +++ b/src/libsync/discoveryphase.h @@ -86,6 +86,7 @@ struct RemoteInfo QString lockEditorApp; qint64 lockTime = 0; qint64 lockTimeout = 0; + QString lockToken; }; struct LocalInfo diff --git a/src/libsync/lockfilejobs.cpp b/src/libsync/lockfilejobs.cpp index aa4b8af42..77e48afcb 100644 --- a/src/libsync/lockfilejobs.cpp +++ b/src/libsync/lockfilejobs.cpp @@ -115,6 +115,7 @@ void LockFileJob::setFileRecordLocked(SyncJournalFileRecord &record) const record._lockstate._lockEditorApp = _editorName; record._lockstate._lockTime = _lockTime; record._lockstate._lockTimeout = _lockTimeout; + record._lockstate._lockToken = _lockToken; if (!_etag.isEmpty()) { record._etag = _etag; } @@ -129,6 +130,7 @@ void LockFileJob::resetState() _userId.clear(); _lockTime = 0; _lockTimeout = 0; + _lockToken.clear(); } SyncJournalFileRecord LockFileJob::handleReply() @@ -241,6 +243,8 @@ void LockFileJob::decodeStartElement(const QString &name, _editorName = reader.readElementText(); } else if (name == QStringLiteral("getetag")) { _etag = reader.readElementText().toUtf8(); + } else if (name == QStringLiteral("lock-token")) { + _lockToken = reader.readElementText(); } } diff --git a/src/libsync/lockfilejobs.h b/src/libsync/lockfilejobs.h index 8b2e287f6..9b8be46c5 100644 --- a/src/libsync/lockfilejobs.h +++ b/src/libsync/lockfilejobs.h @@ -59,6 +59,7 @@ private: QByteArray _etag; qint64 _lockTime = 0; qint64 _lockTimeout = 0; + QString _lockToken; QString _remoteSyncPathWithTrailingSlash; QString _localSyncPath; }; diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 9be7992a5..61b6f0c5a 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -440,6 +440,7 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item) lockInfo._lockOwnerType = static_cast(item->_lockOwnerType); lockInfo._lockOwnerDisplayName = item->_lockOwnerDisplayName; lockInfo._lockEditorApp = item->_lockOwnerDisplayName; + lockInfo._lockToken = item->_lockToken; if (!_journal->updateLocalMetadata(item->_file, item->_modtime, item->_size, item->_inode, lockInfo)) { qCWarning(lcEngine) << "Could not update local metadata for file" << item->_file; diff --git a/src/libsync/syncfileitem.cpp b/src/libsync/syncfileitem.cpp index 6bf10cd7a..4b71c7534 100644 --- a/src/libsync/syncfileitem.cpp +++ b/src/libsync/syncfileitem.cpp @@ -125,6 +125,7 @@ SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QStri rec._lockstate._lockEditorApp = _lockEditorApp; rec._lockstate._lockTime = _lockTime; rec._lockstate._lockTimeout = _lockTimeout; + rec._lockstate._lockToken = _lockToken; // Update the inode if possible rec._inode = _inode; @@ -163,6 +164,7 @@ SyncFileItemPtr SyncFileItem::fromSyncJournalFileRecord(const SyncJournalFileRec item->_lockEditorApp = rec._lockstate._lockEditorApp; item->_lockTime = rec._lockstate._lockTime; item->_lockTimeout = rec._lockstate._lockTimeout; + item->_lockToken = rec._lockstate._lockToken; item->_sharedByMe = rec._sharedByMe; item->_isShared = rec._isShared; item->_lastShareStateFetchedTimestamp = rec._lastShareStateFetchedTimestamp; @@ -220,6 +222,8 @@ SyncFileItemPtr SyncFileItem::fromProperties(const QString &filePath, const QMap item->_lockTimeout = ok ? intConvertedValue : 0; } + item->_lockToken = properties.value(QStringLiteral("lock-token")); + const auto date = QDateTime::fromString(properties.value(QStringLiteral("getlastmodified")), Qt::RFC2822Date); Q_ASSERT(date.isValid()); if (date.toSecsSinceEpoch() > 0) { @@ -250,6 +254,7 @@ void SyncFileItem::updateLockStateFromDbRecord(const SyncJournalFileRecord &dbRe _lockEditorApp = dbRecord._lockstate._lockEditorApp; _lockTime = dbRecord._lockstate._lockTime; _lockTimeout = dbRecord._lockstate._lockTimeout; + _lockToken = dbRecord._lockstate._lockToken; } } diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index 3f6a52898..4bf481a13 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -326,6 +326,7 @@ public: QString _lockEditorApp; qint64 _lockTime = 0; qint64 _lockTimeout = 0; + QString _lockToken; bool _isShared = false; time_t _lastShareStateFetchedTimestamp = 0;