Check if the given item is shareable before fetching shares
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Tue, 19 Mar 2024 10:57:52 +0000 (18:57 +0800)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 17 Apr 2024 08:39:02 +0000 (16:39 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/ShareTableViewDataSource.swift

index 7c03ef60f37415be8bc19a5b23bbf31db38ba783..cab0f43a425134b4909f2df2a62ba0ff736d6da4 100644 (file)
@@ -25,6 +25,7 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
         }
     }
     var shareCapabilities = ShareCapabilities()
+    var itemMetadata: NKFile?
 
     private(set) var kit: NextcloudKit?
     private(set) var itemURL: URL?
@@ -79,7 +80,8 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
                 Logger.sharesDataSource.error("Failed to get details from FileProviderExt")
                 return
             }
-            itemServerRelativePath = serverPath as String
+            let serverPathString = serverPath as String
+            itemServerRelativePath = serverPathString
             account = convertedAccount
             await sharesTableView?.deselectAll(self)
             shareCapabilities = await fetchCapabilities()
@@ -89,8 +91,15 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
                 uiDelegate?.showError(errorMsg)
                 return
             }
+            itemMetadata = await fetchItemMetadata(itemRelativePath: serverPathString)
+            guard itemMetadata?.permissions.contains("S") == true else {
+                let errorMsg = "This file cannot be shared."
+                Logger.sharesDataSource.warning("\(errorMsg)")
+                uiDelegate?.showError(errorMsg)
+                return
+            }
             shares = await fetch(
-                itemIdentifier: itemIdentifier, itemRelativePath: serverPath as String
+                itemIdentifier: itemIdentifier, itemRelativePath: serverPathString
             )
         } catch let error {
             Logger.sharesDataSource.error("Could not reload data: \(error, privacy: .public)")