From c384b8339edc1b4a582302226609f86bb7ce1ef3 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 24 Jan 2025 11:55:38 +0800 Subject: [PATCH 1/6] shell_integration/macOS/FileProviderUIExt: Add internal link share type to NKShare extension Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Extensions/NKShare+Extensions.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/NKShare+Extensions.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/NKShare+Extensions.swift index 2527fb83c5caf..82c9748d6c51a 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/NKShare+Extensions.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/NKShare+Extensions.swift @@ -10,6 +10,7 @@ import NextcloudKit extension NKShare { enum ShareType: Int { + case internalLink = -1 case user = 0 case group = 1 case publicLink = 3 @@ -31,6 +32,11 @@ extension NKShare { var typeImage: NSImage? { var image: NSImage? switch shareType { + case ShareType.internalLink.rawValue: + image = NSImage( + systemSymbolName: "square.and.arrow.up.circle.fill", + accessibilityDescription: "Internal link share icon" + ) case ShareType.user.rawValue: image = NSImage( systemSymbolName: "person.circle.fill", @@ -85,6 +91,8 @@ extension NKShare { } switch shareType { + case ShareType.internalLink.rawValue: + return "Internal share (requires access to file)" case ShareType.user.rawValue: return "User share (\(shareWith))" case ShareType.group.rawValue: From e27c492778055e02622b47ce9d97f0e36b3f36bd Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 24 Jan 2025 11:56:26 +0800 Subject: [PATCH 2/6] shell_integration/macOS/FileProviderUIExt: Do not hide copy link buttons for internal link shares Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Sharing/ShareTableItemView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableItemView.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableItemView.swift index 6651062934380..b08193531e8ce 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableItemView.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableItemView.swift @@ -24,7 +24,9 @@ class ShareTableItemView: NSTableCellView { } typeImageView.image = share.typeImage label.stringValue = share.displayString - copyLinkButton.isHidden = share.shareType != NKShare.ShareType.publicLink.rawValue + copyLinkButton.isHidden = + share.shareType != NKShare.ShareType.publicLink.rawValue && + share.shareType != NKShare.ShareType.internalLink.rawValue } } From 33b3bc946e09354dd5bd1e0cd70119e19217aefa Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 24 Jan 2025 11:57:14 +0800 Subject: [PATCH 3/6] shell_integration/macOS/FileProviderUIExt: Do not present share options view for uneditable and undeletable shares Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Sharing/ShareViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift index 79f6054c65383..380822e8c88df 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift @@ -176,7 +176,7 @@ class ShareViewController: NSViewController, ShareViewDataSourceUIDelegate { } func showOptions(share: NKShare) { - guard let account = shareDataSource.account else { return } + guard let account = shareDataSource.account, share.canEdit || share.canDelete else { return } optionsView.account = account optionsView.controller = ShareController( share: share, account: account, kit: shareDataSource.kit From 97944ca0c3ba505068ad81415d8288549c3c573d Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 24 Jan 2025 12:13:53 +0800 Subject: [PATCH 4/6] shell_integration/macOS/FileProviderUIExt: Add method to generate a share from an nkfile Signed-off-by: Claudio Cambra f Signed-off-by: Claudio Cambra --- .../Sharing/ShareTableViewDataSource.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift index f315b1635518d..4fcea06522196 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift @@ -164,6 +164,17 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele } } + private static func generateInternalShare(for file: NKFile) -> NKShare { + let internalShare = NKShare() + internalShare.shareType = NKShare.ShareType.internalLink.rawValue + internalShare.url = file.urlBase + "/index.php/f/" + file.fileId + internalShare.account = file.account + internalShare.displaynameOwner = file.ownerDisplayName + internalShare.displaynameFileOwner = file.ownerDisplayName + internalShare.path = file.path + return internalShare + } + private func fetchCapabilities() async -> Capabilities? { guard let account else { self.presentError("Could not fetch capabilities as account is invalid.") From 5dac5dfbf8198f3218f5f48ff9739e0c3ea240fa Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 24 Jan 2025 12:14:30 +0800 Subject: [PATCH 5/6] shell_integration/macOS/FileProviderUIExt: Enforce item metadata being valid when fetching shares Signed-off-by: Claudio Cambra --- .../Sharing/ShareTableViewDataSource.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift index 4fcea06522196..d5e8ae58a36c5 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift @@ -30,7 +30,6 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele } } var capabilities: Capabilities? - var itemMetadata: NKFile? private(set) var itemURL: URL? private(set) var itemServerRelativePath: String? @@ -117,10 +116,13 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele presentError("Account data is unavailable, cannot reload data!") return } - itemMetadata = await fetchItemMetadata( + guard let itemMetadata = await fetchItemMetadata( itemRelativePath: serverPathString, account: account, kit: kit - ) - guard itemMetadata?.permissions.contains("R") == true else { + ) else { + presentError("Unable to retrieve file metadata...") + return + } + guard itemMetadata.permissions.contains("R") == true else { presentError("This file cannot be shared.") return } From fae1bc4e36e681a16c752244f69cf6b78e3635fd Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Fri, 24 Jan 2025 12:14:49 +0800 Subject: [PATCH 6/6] shell_integration/macOS/FileProviderUIExt: Append internal link share to fetched shares Signed-off-by: Claudio Cambra --- .../FileProviderUIExt/Sharing/ShareTableViewDataSource.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift index d5e8ae58a36c5..dd8e2f79674b9 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift @@ -129,6 +129,7 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele shares = await fetch( itemIdentifier: itemIdentifier, itemRelativePath: serverPathString ) + shares.append(Self.generateInternalShare(for: itemMetadata)) } catch let error { presentError("Could not reload data: \(error), will try again.") reattempt()