}
const auto record = fileData.journalRecord();
- if (static_cast<SyncFileItem::LockOwnerType>(record._lockstate._lockOwnerType) != SyncFileItem::LockOwnerType::UserLock) {
- qCDebug(lcSocketApi) << "Only user lock state or non-locked files can be affected manually!";
+
+ if (lockState == SyncFileItem::LockStatus::UnlockedItem &&
+ !shareFolder->accountState()->account()->fileCanBeUnlocked(shareFolder->journalDb(), fileData.folderRelativePath)) {
return;
}
shareFolder->path(),
shareFolder->journalDb(),
lockState,
- SyncFileItem::LockOwnerType::UserLock);
+ (lockState == SyncFileItem::LockStatus::UnlockedItem) ? static_cast<SyncFileItem::LockOwnerType>(record._lockstate._lockOwnerType) : SyncFileItem::LockOwnerType::UserLock);
shareFolder->journalDb()->schedulePathForRemoteDiscovery(fileData.serverRelativePath);
shareFolder->scheduleThisFolderSoon();
{
SyncJournalFileRecord record;
if (journal->getFileRecord(folderRelativePath, &record)) {
- if (record._lockstate._lockOwnerType != static_cast<int>(SyncFileItem::LockOwnerType::UserLock)) {
+ if (record._lockstate._lockOwnerType == static_cast<int>(SyncFileItem::LockOwnerType::AppLock)) {
+ qCDebug(lcAccount()) << folderRelativePath << "cannot be unlocked: app lock";
return false;
}
- if (record._lockstate._lockOwnerId != sharedFromThis()->davUser()) {
+ if (record._lockstate._lockOwnerType == static_cast<int>(SyncFileItem::LockOwnerType::UserLock) &&
+ record._lockstate._lockOwnerId != sharedFromThis()->davUser()) {
+ qCDebug(lcAccount()) << folderRelativePath << "cannot be unlocked: user lock from" << record._lockstate._lockOwnerId;
+ return false;
+ }
+
+ if (record._lockstate._lockOwnerType == static_cast<int>(SyncFileItem::LockOwnerType::TokenLock) &&
+ record._lockstate._lockToken.isEmpty()) {
+ qCDebug(lcAccount()) << folderRelativePath << "cannot be unlocked: token lock without known token";
return false;
}