diff --git a/app/src/main/java/com/nextcloud/android/files/FileLockingHelper.kt b/app/src/main/java/com/nextcloud/android/files/FileLockingHelper.kt index 5e3c7a66a964..c864147c8129 100644 --- a/app/src/main/java/com/nextcloud/android/files/FileLockingHelper.kt +++ b/app/src/main/java/com/nextcloud/android/files/FileLockingHelper.kt @@ -19,6 +19,8 @@ object FileLockingHelper { if (!file.isLocked || file.lockOwnerId == null || file.lockType != FileLockType.MANUAL) { return false } - return file.lockOwnerId == userId + // Lock owner can always unlock. The file owner can as well: server-side + // LockService::canUnlock allows TYPE_USER locks for the file owner. + return file.lockOwnerId == userId || file.ownerId == userId } } diff --git a/app/src/test/java/com/nextcloud/android/files/FileLockingHelperTest.kt b/app/src/test/java/com/nextcloud/android/files/FileLockingHelperTest.kt index d105e99cfc8c..ec603758d81b 100644 --- a/app/src/test/java/com/nextcloud/android/files/FileLockingHelperTest.kt +++ b/app/src/test/java/com/nextcloud/android/files/FileLockingHelperTest.kt @@ -34,6 +34,17 @@ class FileLockingHelperTest { Assert.assertFalse(FileLockingHelper.canUserUnlockFile(USER_NAME, file)) } + @Test + fun fileOwnerCanUnlockLockOfAnotherClient() { + val file = OCFile("/foo.md").apply { + isLocked = true + lockOwnerId = "text" + lockType = FileLockType.MANUAL + ownerId = USER_NAME + } + Assert.assertTrue(FileLockingHelper.canUserUnlockFile(USER_NAME, file)) + } + @Test fun typeNotManual_cannotUnlock() { val file = OCFile("/foo.md").apply {