Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
969f8ef
Add read permission indicator + refactor
mpivchev Apr 2, 2025
e92ac49
WIP
mpivchev Apr 8, 2025
4647e9e
Merge branch 'master' of https://github.com/nextcloud/ios into add-sh…
mpivchev Apr 9, 2025
b473eb3
WIP
mpivchev Apr 9, 2025
fefa242
WIP
mpivchev Apr 9, 2025
f8a77ea
Download and sync in advanced
mpivchev Apr 9, 2025
d6adbb2
Make download and sync button work
mpivchev Apr 9, 2025
935fdcf
Remove download from normal permissions
mpivchev Apr 10, 2025
c2b8fd1
Remove unneeded db param
mpivchev Apr 11, 2025
5889f64
Fix view only, allow edit, custom permissions
mpivchev Apr 14, 2025
219df5a
Fix link custom permissions being grayed out
mpivchev Apr 14, 2025
7fc9a8a
Merge branch 'master' of https://github.com/nextcloud/ios into add-sh…
mpivchev Apr 15, 2025
bd87c2b
Fix share screen not updating with sharees on first open
mpivchev Apr 15, 2025
e6098fb
Refactor
mpivchev Apr 15, 2025
4637451
Add capabilities check for download limit
mpivchev Apr 15, 2025
6aae638
WIP
mpivchev Apr 16, 2025
b2140cc
WIP
mpivchev May 2, 2025
e58020b
Merge branch 'master' of https://github.com/nextcloud/ios into add-sh…
mpivchev May 2, 2025
2288d34
Add quick options to link shares
mpivchev May 5, 2025
d5d5dbf
WIP
mpivchev May 6, 2025
1d6ef84
Add selected flag to file drop
mpivchev May 6, 2025
05f0485
Remove share permission on email shares
mpivchev May 6, 2025
559ef53
Refactor
mpivchev May 7, 2025
5a450ac
Merge branch 'master' of https://github.com/nextcloud/ios into add-sh…
mpivchev May 7, 2025
9186989
Fix shares not showing
mpivchev May 7, 2025
5375499
Fix ui
mpivchev May 7, 2025
151ff20
Refactor
mpivchev May 14, 2025
7d67a04
Merge branch 'master' of https://github.com/nextcloud/ios into add-sh…
mpivchev May 15, 2025
b2fca73
PR changes
mpivchev May 16, 2025
ebe9ab3
PR changes
mpivchev May 16, 2025
f736cd4
WIP
mpivchev May 19, 2025
64becc2
Prevent user from choosing themselves
mpivchev May 19, 2025
3cf367d
Do not show already existing sharees
mpivchev May 20, 2025
ff67bb1
WIP
mpivchev May 21, 2025
dbc89f3
Refactor
mpivchev May 27, 2025
bc48f00
Fix plus button not enabling properly
mpivchev May 28, 2025
2f9c8fc
Refactor
mpivchev Jun 3, 2025
ac9dfbe
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jun 3, 2025
e6fb976
WIP
mpivchev Jun 3, 2025
8fdecd5
WIP
mpivchev Jun 4, 2025
faf1d6d
Remove delete option if no permission
mpivchev Jun 6, 2025
c2edd7d
WIP
mpivchev Jun 10, 2025
039bd82
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jun 10, 2025
a2b9ff3
WIP
mpivchev Jun 10, 2025
15baef0
WIP
mpivchev Jul 4, 2025
423de88
Refactor
mpivchev Jul 4, 2025
2462754
Fix build
mpivchev Jul 14, 2025
1063272
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jul 16, 2025
dbcf918
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jul 21, 2025
6d21f74
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jul 22, 2025
0ba5729
WIP
mpivchev Jul 24, 2025
f4f99c7
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jul 24, 2025
4007984
WIP
mpivchev Jul 28, 2025
491b8cf
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Jul 31, 2025
a1f32f0
PR improvements
mpivchev Aug 1, 2025
35f1f36
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Aug 1, 2025
e241ee4
Merge branch 'master' of https://github.com/nextcloud/ios into handle…
mpivchev Aug 4, 2025
fa0ebaf
PR changes
mpivchev Aug 4, 2025
c017b86
PR fixes
mpivchev Aug 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Brand/NCBrand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ final class NCBrandOptions: @unchecked Sendable {
var disable_openin_file: Bool = false // Don't touch me !!
var disable_crash_service: Bool = false
var disable_log: Bool = false
var disable_mobileconfig: Bool = false
var disable_mobileconfig: Bool = false
var disable_show_more_nextcloud_apps_in_settings: Bool = false
var doNotAskPasscodeAtStartup: Bool = false
var disable_source_code_in_settings: Bool = false
Expand Down
52 changes: 34 additions & 18 deletions Nextcloud.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions Share/NCShareExtension+DataSource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,11 @@ extension NCShareExtension: UICollectionViewDataSource {
func setupDirectoryCell(_ cell: NCListCell, indexPath: IndexPath, with metadata: tableMetadata) {
var isShare = false
var isMounted = false
let permissions = NCPermissions()
let session = self.extensionData.getSession()

if let metadataFolder = metadataFolder {
isShare = metadata.permissions.contains(permissions.permissionShared) && !metadataFolder.permissions.contains(permissions.permissionShared)
isMounted = metadata.permissions.contains(permissions.permissionMounted) && !metadataFolder.permissions.contains(permissions.permissionMounted)
isShare = metadata.permissions.contains(NCMetadataPermissions.permissionShared) && !metadataFolder.permissions.contains(NCMetadataPermissions.permissionShared)
isMounted = metadata.permissions.contains(NCMetadataPermissions.permissionMounted) && !metadataFolder.permissions.contains(NCMetadataPermissions.permissionMounted)
}

if metadata.e2eEncrypted {
Expand Down
22 changes: 16 additions & 6 deletions iOSClient/Data/NCManageDatabase+Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ extension tableMetadata {
}

var isRenameable: Bool {
if !NCMetadataPermissions.canRename(self) {
return false
}
if lock {
return false
}
Expand Down Expand Up @@ -193,8 +196,16 @@ extension tableMetadata {
return isPDF || isImage
}

var isCreatable: Bool {
if isDirectory {
return NCMetadataPermissions.canCreateFolder(self)
} else {
return NCMetadataPermissions.canCreateFile(self)
}
}

var isDeletable: Bool {
if !isDirectoryE2EE && e2eEncrypted {
if (!isDirectoryE2EE && e2eEncrypted) || !NCMetadataPermissions.canDelete(self) {
return false
}
return true
Expand Down Expand Up @@ -329,16 +340,15 @@ extension tableMetadata {

extension NCManageDatabase {
func isMetadataShareOrMounted(metadata: tableMetadata, metadataFolder: tableMetadata?) -> Bool {
let permissions = NCPermissions()
var isShare = false
var isMounted = false

if metadataFolder != nil {
isShare = metadata.permissions.contains(permissions.permissionShared) && !metadataFolder!.permissions.contains(permissions.permissionShared)
isMounted = metadata.permissions.contains(permissions.permissionMounted) && !metadataFolder!.permissions.contains(permissions.permissionMounted)
isShare = metadata.permissions.contains(NCMetadataPermissions.permissionShared) && !metadataFolder!.permissions.contains(NCMetadataPermissions.permissionShared)
isMounted = metadata.permissions.contains(NCMetadataPermissions.permissionMounted) && !metadataFolder!.permissions.contains(NCMetadataPermissions.permissionMounted)
} else if let directory = getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", metadata.account, metadata.serverUrl)) {
isShare = metadata.permissions.contains(permissions.permissionShared) && !directory.permissions.contains(permissions.permissionShared)
isMounted = metadata.permissions.contains(permissions.permissionMounted) && !directory.permissions.contains(permissions.permissionMounted)
isShare = metadata.permissions.contains(NCMetadataPermissions.permissionShared) && !directory.permissions.contains(NCMetadataPermissions.permissionShared)
isMounted = metadata.permissions.contains(NCMetadataPermissions.permissionMounted) && !directory.permissions.contains(NCMetadataPermissions.permissionMounted)
}

if isShare || isMounted {
Expand Down
8 changes: 8 additions & 0 deletions iOSClient/Files/NCFiles.swift
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,14 @@ class NCFiles: NCCollectionViewCommon {
if let tblDirectory = await self.database.getTableDirectoryAsync(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.session.account, self.serverUrl)) {
self.richWorkspaceText = tblDirectory.richWorkspace
}
if let metadataFolder {
nkLog(info: "Inside metadata folder \(metadataFolder.fileName) with permissions: \(metadataFolder.permissions)")

// disable + button if no create permission
plusButton.isEnabled = metadataFolder.isCreatable
plusButton.backgroundColor = metadataFolder.isCreatable ? NCBrandColor.shared.customer : .lightGray
}

let metadatas = await self.database.getMetadatasAsync(predicate: predicate,
withLayout: self.layoutForView,
withAccount: self.session.account)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell: NCCellProtocol & UICollectionViewCell
let permissions = NCPermissions()
var isShare = false
var isMounted = false
var a11yValues: [String] = []
Expand Down Expand Up @@ -202,8 +201,8 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
}

if metadataFolder != nil {
isShare = metadata.permissions.contains(permissions.permissionShared) && !metadataFolder!.permissions.contains(permissions.permissionShared)
isMounted = metadata.permissions.contains(permissions.permissionMounted) && !metadataFolder!.permissions.contains(permissions.permissionMounted)
isShare = metadata.permissions.contains(NCMetadataPermissions.permissionShared) && !metadataFolder!.permissions.contains(NCMetadataPermissions.permissionShared)
isMounted = metadata.permissions.contains(NCMetadataPermissions.permissionMounted) && !metadataFolder!.permissions.contains(NCMetadataPermissions.permissionMounted)
}

cell.fileAccount = metadata.account
Expand Down Expand Up @@ -549,6 +548,10 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
emptyImage = utility.loadImage(named: "arrow.triangle.2.circlepath", colors: [NCBrandColor.shared.getElement(account: session.account)])
emptyTitle = NSLocalizedString("_files_no_files_", comment: "")
emptyDescription = NSLocalizedString("_folder_offline_desc_", comment: "")
} else if let metadataFolder, !metadataFolder.isCreatable {
emptyImage = imageCache.getFolder(account: session.account)
emptyTitle = NSLocalizedString("_files_no_files_", comment: "")
emptyDescription = NSLocalizedString("_no_file_no_permission_to_create_", comment: "")
} else {
emptyImage = imageCache.getFolder(account: session.account)
emptyTitle = NSLocalizedString("_files_no_files_", comment: "")
Expand Down
25 changes: 1 addition & 24 deletions iOSClient/Menu/NCCollectionViewCommon+Menu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -265,29 +265,6 @@ extension NCCollectionViewCommon {
)
}

//
// SET LIVE PHOTO NO
//
/*
if NCNetworking.shared.isOnline,
let metadataMOV = database.getMetadataLivePhoto(metadata: metadata) {
actions.append(
NCMenuAction(
title: NSLocalizedString("_livephoto_no_", comment: ""),
icon: NCUtility().loadImage(named: "livephoto.slash", colors: [NCBrandColor.shared.iconImageColor]),
order: 105,
action: { _ in
Task {
let userInfo: [String: Any] = ["serverUrl": metadata.serverUrl,
"account": metadata.account]
await NCNetworking.shared.setLivePhoto(metadataFirst: metadata, metadataLast: metadataMOV, userInfo: userInfo, livePhoto: false)
}
}
)
)
}
*/

//
// SAVE AS SCAN
//
Expand Down Expand Up @@ -420,7 +397,7 @@ extension NCCollectionViewCommon {
// DELETE
//
if metadata.isDeletable {
actions.append(.deleteAction(selectedMetadatas: [metadata], metadataFolder: metadataFolder, controller: self.controller, order: 170, sender: sender))
actions.append(.deleteOrUnshareAction(selectedMetadatas: [metadata], metadataFolder: metadataFolder, controller: self.controller, order: 170, sender: sender))
}

applicationHandle.addCollectionViewCommonMenu(metadata: metadata, image: image, actions: &actions)
Expand Down
9 changes: 4 additions & 5 deletions iOSClient/Menu/NCMenuAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,13 @@ extension NCMenuAction {
)
}

/// Delete files either from cache or from Nextcloud
static func deleteAction(selectedMetadatas: [tableMetadata], metadataFolder: tableMetadata? = nil, controller: NCMainTabBarController?, order: Int = 0, sender: Any?, completion: (() -> Void)? = nil) -> NCMenuAction {
/// Delete files either from cache or from Nextcloud, or unshare (depending on context)
static func deleteOrUnshareAction(selectedMetadatas: [tableMetadata], metadataFolder: tableMetadata? = nil, controller: NCMainTabBarController?, order: Int = 0, sender: Any?, completion: (() -> Void)? = nil) -> NCMenuAction {
var titleDelete = NSLocalizedString("_delete_", comment: "")
var message = NSLocalizedString("_want_delete_", comment: "")
var icon = "trash"
var destructive = false
var color = NCBrandColor.shared.iconImageColor
let permissions = NCPermissions()

if selectedMetadatas.count > 1 {
titleDelete = NSLocalizedString("_delete_selected_files_", comment: "")
Expand All @@ -131,8 +130,8 @@ extension NCMenuAction {
}

if let metadataFolder = metadataFolder {
let isShare = metadata.permissions.contains(permissions.permissionShared) && !metadataFolder.permissions.contains(permissions.permissionShared)
let isMounted = metadata.permissions.contains(permissions.permissionMounted) && !metadataFolder.permissions.contains(permissions.permissionMounted)
let isShare = metadata.permissions.contains(NCMetadataPermissions.permissionShared) && !metadataFolder.permissions.contains(NCMetadataPermissions.permissionShared)
let isMounted = metadata.permissions.contains(NCMetadataPermissions.permissionMounted) && !metadataFolder.permissions.contains(NCMetadataPermissions.permissionMounted)
if isShare || isMounted {
titleDelete = NSLocalizedString("_leave_share_", comment: "")
icon = "person.2.slash"
Expand Down
20 changes: 9 additions & 11 deletions iOSClient/Menu/NCShare+Menu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -96,17 +96,16 @@ extension NCShare {

func toggleQuickPermissionsMenu(isDirectory: Bool, share: tableShare, sender: Any?) {
var actions = [NCMenuAction]()
let permissions = NCPermissions()

actions.append(contentsOf:
[NCMenuAction(
title: NSLocalizedString("_share_read_only_", comment: ""),
icon: utility.loadImage(named: "eye", colors: [NCBrandColor.shared.iconImageColor]),
selected: share.permissions == (permissions.permissionReadShare + permissions.permissionShareShare) || share.permissions == permissions.permissionReadShare,
selected: share.permissions == (NCSharePermissions.permissionReadShare + NCSharePermissions.permissionReshareShare) || share.permissions == NCSharePermissions.permissionReadShare,
on: false,
sender: sender,
action: { _ in
let permissions = permissions.getPermissionValue(canCreate: false, canEdit: false, canDelete: false, canShare: false, isDirectory: isDirectory)
let permissions = NCSharePermissions.getPermissionValue(canCreate: false, canEdit: false, canDelete: false, canShare: false, isDirectory: isDirectory)
self.updateSharePermissions(share: share, permissions: permissions)
}
),
Expand All @@ -117,7 +116,7 @@ extension NCShare {
on: false,
sender: sender,
action: { _ in
let permissions = permissions.getPermissionValue(canCreate: true, canEdit: true, canDelete: true, canShare: true, isDirectory: isDirectory)
let permissions = NCSharePermissions.getPermissionValue(canCreate: true, canEdit: true, canDelete: true, canShare: true, isDirectory: isDirectory)
self.updateSharePermissions(share: share, permissions: permissions)
}
),
Expand Down Expand Up @@ -147,11 +146,11 @@ extension NCShare {
actions.insert(NCMenuAction(
title: NSLocalizedString("_share_file_drop_", comment: ""),
icon: utility.loadImage(named: "arrow.up.document", colors: [NCBrandColor.shared.iconImageColor]),
selected: share.permissions == permissions.permissionCreateShare,
selected: share.permissions == NCSharePermissions.permissionCreateShare,
on: false,
sender: sender,
action: { _ in
let permissions = permissions.getPermissionValue(canRead: false, canCreate: true, canEdit: false, canDelete: false, canShare: false, isDirectory: isDirectory)
let permissions = NCSharePermissions.getPermissionValue(canRead: false, canCreate: true, canEdit: false, canDelete: false, canShare: false, isDirectory: isDirectory)
self.updateSharePermissions(share: share, permissions: permissions)
}
), at: 2)
Expand All @@ -161,12 +160,11 @@ extension NCShare {
}

fileprivate func hasUploadPermission(tableShare: tableShare) -> Bool {
let permissions = NCPermissions()
let uploadPermissions = [
permissions.permissionMaxFileShare,
permissions.permissionMaxFolderShare,
permissions.permissionDefaultFileRemoteShareNoSupportShareOption,
permissions.permissionDefaultFolderRemoteShareNoSupportShareOption]
NCSharePermissions.permissionMaxFileShare,
NCSharePermissions.permissionMaxFolderShare,
NCSharePermissions.permissionDefaultFileRemoteShareNoSupportShareOption,
NCSharePermissions.permissionDefaultFolderRemoteShareNoSupportShareOption]
return uploadPermissions.contains(tableShare.permissions)
}

Expand Down
2 changes: 1 addition & 1 deletion iOSClient/Menu/NCViewer+Menu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ extension NCViewer {
// DELETE
//
if !webView, metadata.isDeletable {
actions.append(.deleteAction(selectedMetadatas: [metadata], metadataFolder: nil, controller: controller, sender: sender))
actions.append(.deleteOrUnshareAction(selectedMetadatas: [metadata], metadataFolder: nil, controller: controller, sender: sender))
}

controller.presentMenu(with: actions, sender: sender)
Expand Down
8 changes: 4 additions & 4 deletions iOSClient/Networking/NCNetworking+WebDAV.swift
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ extension NCNetworking {
var serverUrls = Set<String>()

for metadata in metadatasPlain {
let permission = NCUtility().permissionsContainsString(metadata.permissions, permissions: NCPermissions().permissionCanDelete)
let permission = NCMetadataPermissions.permissionsContainsString(metadata.permissions, permissions: NCMetadataPermissions.permissionCanDeleteOrUnshare)
if (!metadata.permissions.isEmpty && permission == false) || (metadata.status != global.metadataStatusNormal) {
return NCContentPresenter().showInfo(error: NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_delete_file_"))
}
Expand Down Expand Up @@ -407,7 +407,7 @@ extension NCNetworking {
// MARK: - Rename

func renameMetadata(_ metadata: tableMetadata, fileNameNew: String) {
let permission = utility.permissionsContainsString(metadata.permissions, permissions: NCPermissions().permissionCanRename)
let permission = NCMetadataPermissions.permissionsContainsString(metadata.permissions, permissions: NCMetadataPermissions.permissionCanRename)
if (!metadata.permissions.isEmpty && permission == false) ||
(metadata.status != global.metadataStatusNormal && metadata.status != global.metadataStatusWaitRename) {
return NCContentPresenter().showInfo(error: NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_modify_file_"))
Expand Down Expand Up @@ -439,7 +439,7 @@ extension NCNetworking {
// MARK: - Move

func moveMetadata(_ metadata: tableMetadata, serverUrlTo: String, overwrite: Bool) {
let permission = utility.permissionsContainsString(metadata.permissions, permissions: NCPermissions().permissionCanRename)
let permission = NCMetadataPermissions.permissionsContainsString(metadata.permissions, permissions: NCMetadataPermissions.permissionCanRename)

if (!metadata.permissions.isEmpty && !permission) ||
(metadata.status != global.metadataStatusNormal && metadata.status != global.metadataStatusWaitMove) {
Expand All @@ -458,7 +458,7 @@ extension NCNetworking {
// MARK: - Copy

func copyMetadata(_ metadata: tableMetadata, serverUrlTo: String, overwrite: Bool) {
let permission = utility.permissionsContainsString(metadata.permissions, permissions: NCPermissions().permissionCanRename)
let permission = NCMetadataPermissions.permissionsContainsString(metadata.permissions, permissions: NCMetadataPermissions.permissionCanRename)

if (!metadata.permissions.isEmpty && !permission) ||
(metadata.status != global.metadataStatusNormal && metadata.status != global.metadataStatusWaitCopy) {
Expand Down
5 changes: 2 additions & 3 deletions iOSClient/Select/NCSelect.swift
Original file line number Diff line number Diff line change
Expand Up @@ -353,10 +353,9 @@ extension NCSelect: UICollectionViewDataSource {

var isShare = false
var isMounted = false
let permissions = NCPermissions()

isShare = metadata.permissions.contains(permissions.permissionShared) && !metadataFolder.permissions.contains(permissions.permissionShared)
isMounted = metadata.permissions.contains(permissions.permissionMounted) && !metadataFolder.permissions.contains(permissions.permissionMounted)
isShare = metadata.permissions.contains(NCMetadataPermissions.permissionShared) && !metadataFolder.permissions.contains(NCMetadataPermissions.permissionShared)
isMounted = metadata.permissions.contains(NCMetadataPermissions.permissionMounted) && !metadataFolder.permissions.contains(NCMetadataPermissions.permissionMounted)

cell.listCellDelegate = self

Expand Down
Loading
Loading