From 790c20876f35538eeafe9d09549641f5d28f5941 Mon Sep 17 00:00:00 2001 From: Iva Horn Date: Thu, 9 Oct 2025 13:44:34 +0200 Subject: [PATCH] fix: Interpretation of lock responses. Signed-off-by: Iva Horn --- .../NextcloudKit/Models/NKDataFileXML.swift | 23 ++++++++++++++-- Sources/NextcloudKit/Models/NKFile.swift | 27 ++++++++++++++----- Sources/NextcloudKit/Models/NKLock.swift | 12 ++++----- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/Sources/NextcloudKit/Models/NKDataFileXML.swift b/Sources/NextcloudKit/Models/NKDataFileXML.swift index cb56d8fa..cdb27649 100644 --- a/Sources/NextcloudKit/Models/NKDataFileXML.swift +++ b/Sources/NextcloudKit/Models/NKDataFileXML.swift @@ -429,8 +429,27 @@ public class NKDataFileXML: NSObject { file.richWorkspace = richWorkspace } - if let lock = NKLock(xml: propstat["d:prop"]) { - file.lock = lock + if let lock = propstat["d:prop", "nc:lock"].int { + file.lock = lock > 0 + } + + if let lockOwner = propstat["d:prop", "nc:lock-owner"].text { + file.lockOwner = lockOwner + } + if let lockOwnerEditor = propstat["d:prop", "nc:lock-owner-editor"].text { + file.lockOwnerEditor = lockOwnerEditor + } + if let lockOwnerType = propstat["d:prop", "nc:lock-owner-type"].int { + file.lockOwnerType = lockOwnerType + } + if let lockOwnerDisplayName = propstat["d:prop", "nc:lock-owner-displayname"].text { + file.lockOwnerDisplayName = lockOwnerDisplayName + } + if let lockTime = propstat["d:prop", "nc:lock-time"].int { + file.lockTime = Date(timeIntervalSince1970: TimeInterval(lockTime)) + } + if let lockTimeOut = propstat["d:prop", "nc:lock-timeout"].int { + file.lockTimeOut = file.lockTime?.addingTimeInterval(TimeInterval(lockTimeOut)) } let tagsElements = propstat["d:prop", "nc:system-tags"] diff --git a/Sources/NextcloudKit/Models/NKFile.swift b/Sources/NextcloudKit/Models/NKFile.swift index c3eccde3..f048edac 100644 --- a/Sources/NextcloudKit/Models/NKFile.swift +++ b/Sources/NextcloudKit/Models/NKFile.swift @@ -38,12 +38,13 @@ public struct NKFile: Sendable { public var ocId: String public var ownerId: String public var ownerDisplayName: String - - /// - /// An optional lock on this file. `nil` equals the file not being locked. - /// - public var lock: NKLock? - + public var lock: Bool + public var lockOwner: String + public var lockOwnerEditor: String + public var lockOwnerType: Int + public var lockOwnerDisplayName: String + public var lockTime: Date? + public var lockTimeOut: Date? public var path: String public var permissions: String public var quotaUsedBytes: Int64 @@ -109,7 +110,13 @@ public struct NKFile: Sendable { ocId: String = "", ownerId: String = "", ownerDisplayName: String = "", - lock: NKLock? = nil, + lock: Bool = false, + lockOwner: String = "", + lockOwnerEditor: String = "", + lockOwnerType: Int = 0, + lockOwnerDisplayName: String = "", + lockTime: Date? = nil, + lockTimeOut: Date? = nil, path: String = "", permissions: String = "", quotaUsedBytes: Int64 = 0, @@ -167,6 +174,12 @@ public struct NKFile: Sendable { self.ownerId = ownerId self.ownerDisplayName = ownerDisplayName self.lock = lock + self.lockOwner = lockOwner + self.lockOwnerEditor = lockOwnerEditor + self.lockOwnerType = lockOwnerType + self.lockOwnerDisplayName = lockOwnerDisplayName + self.lockTime = lockTime + self.lockTimeOut = lockTimeOut self.path = path self.permissions = permissions self.quotaUsedBytes = quotaUsedBytes diff --git a/Sources/NextcloudKit/Models/NKLock.swift b/Sources/NextcloudKit/Models/NKLock.swift index 9471d221..182a14ca 100644 --- a/Sources/NextcloudKit/Models/NKLock.swift +++ b/Sources/NextcloudKit/Models/NKLock.swift @@ -18,7 +18,7 @@ public struct NKLock: Equatable, Sendable { /// /// App id of an app owned lock to allow clients to suggest joining the collaborative editing session through the web or direct editing. /// - public let ownerEditor: String + public let ownerEditor: String? /// /// What kind of lock this is. @@ -53,19 +53,19 @@ public struct NKLock: Equatable, Sendable { /// This is intended for creating an instance based on a superset of required properties returned by a `PROPFIND` request to the server about an item. /// public init?(xml properties: XML.Accessor) { - guard let isLocked = properties["nc:lock"].bool else { + guard let rawIsLocked = properties["nc:lock"].int else { return nil } - guard let owner = properties["nc:lock-owner"].text else { + guard rawIsLocked > 0 else { return nil } - guard let ownerDisplayName = properties["nc:lock-owner-displayname"].text else { + guard let owner = properties["nc:lock-owner"].text else { return nil } - guard let ownerEditor = properties["nc:lock-owner-editor"].text else { + guard let ownerDisplayName = properties["nc:lock-owner-displayname"].text else { return nil } @@ -84,7 +84,7 @@ public struct NKLock: Equatable, Sendable { let lockToken = properties["nc:lock-token"].text self.owner = owner - self.ownerEditor = ownerEditor + self.ownerEditor = properties["nc:lock-owner-editor"].text self.ownerType = lockOwnerType self.ownerDisplayName = ownerDisplayName self.time = Date(timeIntervalSince1970: rawTime)