receive and decode tokens for locks
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Thu, 19 Sep 2024 16:50:33 +0000 (18:50 +0200)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Wed, 25 Sep 2024 13:06:29 +0000 (15:06 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/discovery.cpp
src/libsync/discoveryphase.cpp
src/libsync/discoveryphase.h
src/libsync/lockfilejobs.cpp
src/libsync/lockfilejobs.h
src/libsync/syncengine.cpp
src/libsync/syncfileitem.cpp
src/libsync/syncfileitem.h

index 6eb2eefd755e159b47604609961f924d0dfcc741..0a259360f45e447e8e67a36bdb94b6d2520b2853 100644 (file)
@@ -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
     {
index ca96b8c82523726cbe6f3941466b165a6d431f74..606f34f35f8140447fc1e5e35929a5eb4e0b3a3c 100644 (file)
@@ -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<QString, QString> &map, RemotePer
                 result.lockTimeout = 0;
             }
         }
-
+        if (property == "lock-token") {
+            result.lockToken = value;
+        }
     }
 
     if (result.isDirectory && map.contains("size")) {
index 7d53f1336d698f9fcd4533d450028690734501c2..ff38d739118ae3f0c2497795a9c41865fb2175c2 100644 (file)
@@ -86,6 +86,7 @@ struct RemoteInfo
     QString lockEditorApp;
     qint64 lockTime = 0;
     qint64 lockTimeout = 0;
+    QString lockToken;
 };
 
 struct LocalInfo
index aa4b8af428731bb2d15222fffc16d31fbaca2af6..77e48afcbc66ffc7bbc9b1fb14236a3d04280262 100644 (file)
@@ -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();
     }
 }
 
index 8b2e287f6d4c056cd93ccae4f159e686ec1e7a28..9b8be46c5523fde2b0d0fccb6ddb14fe28aa66c2 100644 (file)
@@ -59,6 +59,7 @@ private:
     QByteArray _etag;
     qint64 _lockTime = 0;
     qint64 _lockTimeout = 0;
+    QString _lockToken;
     QString _remoteSyncPathWithTrailingSlash;
     QString _localSyncPath;
 };
index 9be7992a5b7288de77dcc293ff2644ed546ba322..61b6f0c5aa2334179262c8cdc81541558c36967c 100644 (file)
@@ -440,6 +440,7 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
             lockInfo._lockOwnerType = static_cast<qint64>(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;
index 6bf10cd7af1b0190c4e62e0c1eb7ebca4c2f85d2..4b71c75342339e855bb4d19804748c875c487757 100644 (file)
@@ -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;
 }
 
 }
index 3f6a52898611d1118cf07ab755d2f17ff8fee2d6..4bf481a138c86b783dc22bd47f598635e45aa62b 100644 (file)
@@ -326,6 +326,7 @@ public:
     QString _lockEditorApp;
     qint64 _lockTime = 0;
     qint64 _lockTimeout = 0;
+    QString _lockToken;
 
     bool _isShared = false;
     time_t _lastShareStateFetchedTimestamp = 0;