Skip to content

Commit dbea874

Browse files
authored
Merge pull request #7787 from nextcloud/feature/macos-vfs-internal-share
shell_integration/macOS: Add ability to share macOS VFS files via internal link shares
2 parents 0c2fdb7 + fae1bc4 commit dbea874

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/NKShare+Extensions.swift

+8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import NextcloudKit
1010

1111
extension NKShare {
1212
enum ShareType: Int {
13+
case internalLink = -1
1314
case user = 0
1415
case group = 1
1516
case publicLink = 3
@@ -31,6 +32,11 @@ extension NKShare {
3132
var typeImage: NSImage? {
3233
var image: NSImage?
3334
switch shareType {
35+
case ShareType.internalLink.rawValue:
36+
image = NSImage(
37+
systemSymbolName: "square.and.arrow.up.circle.fill",
38+
accessibilityDescription: "Internal link share icon"
39+
)
3440
case ShareType.user.rawValue:
3541
image = NSImage(
3642
systemSymbolName: "person.circle.fill",
@@ -85,6 +91,8 @@ extension NKShare {
8591
}
8692

8793
switch shareType {
94+
case ShareType.internalLink.rawValue:
95+
return "Internal share (requires access to file)"
8896
case ShareType.user.rawValue:
8997
return "User share (\(shareWith))"
9098
case ShareType.group.rawValue:

shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableItemView.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ class ShareTableItemView: NSTableCellView {
2424
}
2525
typeImageView.image = share.typeImage
2626
label.stringValue = share.displayString
27-
copyLinkButton.isHidden = share.shareType != NKShare.ShareType.publicLink.rawValue
27+
copyLinkButton.isHidden =
28+
share.shareType != NKShare.ShareType.publicLink.rawValue &&
29+
share.shareType != NKShare.ShareType.internalLink.rawValue
2830
}
2931
}
3032

shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift

+18-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
3030
}
3131
}
3232
var capabilities: Capabilities?
33-
var itemMetadata: NKFile?
3433

3534
private(set) var itemURL: URL?
3635
private(set) var itemServerRelativePath: String?
@@ -117,16 +116,20 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
117116
presentError("Account data is unavailable, cannot reload data!")
118117
return
119118
}
120-
itemMetadata = await fetchItemMetadata(
119+
guard let itemMetadata = await fetchItemMetadata(
121120
itemRelativePath: serverPathString, account: account, kit: kit
122-
)
123-
guard itemMetadata?.permissions.contains("R") == true else {
121+
) else {
122+
presentError("Unable to retrieve file metadata...")
123+
return
124+
}
125+
guard itemMetadata.permissions.contains("R") == true else {
124126
presentError("This file cannot be shared.")
125127
return
126128
}
127129
shares = await fetch(
128130
itemIdentifier: itemIdentifier, itemRelativePath: serverPathString
129131
)
132+
shares.append(Self.generateInternalShare(for: itemMetadata))
130133
} catch let error {
131134
presentError("Could not reload data: \(error), will try again.")
132135
reattempt()
@@ -164,6 +167,17 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
164167
}
165168
}
166169

170+
private static func generateInternalShare(for file: NKFile) -> NKShare {
171+
let internalShare = NKShare()
172+
internalShare.shareType = NKShare.ShareType.internalLink.rawValue
173+
internalShare.url = file.urlBase + "/index.php/f/" + file.fileId
174+
internalShare.account = file.account
175+
internalShare.displaynameOwner = file.ownerDisplayName
176+
internalShare.displaynameFileOwner = file.ownerDisplayName
177+
internalShare.path = file.path
178+
return internalShare
179+
}
180+
167181
private func fetchCapabilities() async -> Capabilities? {
168182
guard let account else {
169183
self.presentError("Could not fetch capabilities as account is invalid.")

shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class ShareViewController: NSViewController, ShareViewDataSourceUIDelegate {
176176
}
177177

178178
func showOptions(share: NKShare) {
179-
guard let account = shareDataSource.account else { return }
179+
guard let account = shareDataSource.account, share.canEdit || share.canDelete else { return }
180180
optionsView.account = account
181181
optionsView.controller = ShareController(
182182
share: share, account: account, kit: shareDataSource.kit

0 commit comments

Comments
 (0)