diff --git a/Brand/NCBrand.swift b/Brand/NCBrand.swift index 0e46d8126a..e68a6dd148 100755 --- a/Brand/NCBrand.swift +++ b/Brand/NCBrand.swift @@ -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 diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index d2c9284465..d2f3dc083a 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -219,6 +219,13 @@ F3F0419B2B9F7E6700D5155F /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F3F0419A2B9F7E6700D5155F /* RealmSwift */; }; F3F0419D2B9F7E6E00D5155F /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F3F0419C2B9F7E6E00D5155F /* RealmSwift */; }; F3F0419F2B9F7E7900D5155F /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F3F0419E2B9F7E7900D5155F /* RealmSwift */; }; + F3F442EE2DDE292D00FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; + F3F442EF2DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; + F3F442F02DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; + F3F442F12DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; + F3F442F22DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; + F3F442F32DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; + F3F442F42DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */; }; F700222C1EC479840080073F /* Custom.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F700222B1EC479840080073F /* Custom.xcassets */; }; F700222D1EC479840080073F /* Custom.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F700222B1EC479840080073F /* Custom.xcassets */; }; F700510122DF63AC003A3356 /* NCShare.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F700510022DF63AC003A3356 /* NCShare.storyboard */; }; @@ -315,13 +322,13 @@ F72429362AFE39860040AEF3 /* NCLivePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */; }; F72429372AFE39980040AEF3 /* NCLivePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */; }; F72429382AFE39A80040AEF3 /* NCLivePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70968A324212C4E00ED60E5 /* NCLivePhoto.swift */; }; - F724377B2C10B83E00C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; - F724377C2C10B92200C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; - F724377D2C10B92300C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; - F724377E2C10B92300C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; - F724377F2C10B92400C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; - F72437802C10B92400C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; - F72437812C10B92500C7C68D /* NCPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCPermissions.swift */; }; + F724377B2C10B83E00C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; + F724377C2C10B92200C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; + F724377D2C10B92300C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; + F724377E2C10B92300C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; + F724377F2C10B92400C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; + F72437802C10B92400C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; + F72437812C10B92500C7C68D /* NCSharePermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */; }; F7245924289BB50C00474787 /* ThreadSafeDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7245923289BB50B00474787 /* ThreadSafeDictionary.swift */; }; F7245925289BB59100474787 /* ThreadSafeDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7245923289BB50B00474787 /* ThreadSafeDictionary.swift */; }; F7245926289BB59300474787 /* ThreadSafeDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7245923289BB50B00474787 /* ThreadSafeDictionary.swift */; }; @@ -1390,6 +1397,7 @@ F3CA337C2D0B2B6A00672333 /* AlbumModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumModel.swift; sourceTree = ""; }; F3E173AF2C9AF637006D177A /* ScreenAwakeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenAwakeManager.swift; sourceTree = ""; }; F3E173BF2C9B1067006D177A /* AwakeMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AwakeMode.swift; sourceTree = ""; }; + F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCMetadataPermissions.swift; sourceTree = ""; }; F700222B1EC479840080073F /* Custom.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Custom.xcassets; sourceTree = ""; }; F700510022DF63AC003A3356 /* NCShare.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCShare.storyboard; sourceTree = ""; }; F700510422DF6A89003A3356 /* NCShare.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCShare.swift; sourceTree = ""; }; @@ -1451,7 +1459,7 @@ F723985B253C95CE00257F49 /* NCViewerRichdocument.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NCViewerRichdocument.storyboard; sourceTree = ""; }; F723B3DC22FC6D1C00301EFE /* NCShareCommentsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCShareCommentsCell.xib; sourceTree = ""; }; F72408322B8A27C900F128E2 /* NCMedia+Command.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCMedia+Command.swift"; sourceTree = ""; }; - F724377A2C10B83E00C7C68D /* NCPermissions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCPermissions.swift; sourceTree = ""; }; + F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCSharePermissions.swift; sourceTree = ""; }; F7245923289BB50B00474787 /* ThreadSafeDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThreadSafeDictionary.swift; sourceTree = ""; }; F72685E827C78E490019EF5E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; F72944F12A84246400246839 /* NCEndToEndMetadataV20.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCEndToEndMetadataV20.swift; sourceTree = ""; }; @@ -2407,7 +2415,8 @@ isa = PBXGroup; children = ( AF93471327E235EB002537EE /* Advanced */, - F724377A2C10B83E00C7C68D /* NCPermissions.swift */, + F724377A2C10B83E00C7C68D /* NCSharePermissions.swift */, + F3F442ED2DDE292600FD701F /* NCMetadataPermissions.swift */, F700510022DF63AC003A3356 /* NCShare.storyboard */, F700510422DF6A89003A3356 /* NCShare.swift */, AF730AF727834B1400B7520E /* NCShare+NCCellDelegate.swift */, @@ -4146,7 +4155,7 @@ 2C1D5D7623E2DE3300334ABB /* NCManageDatabase.swift in Sources */, F7864AD22A78FE73004870E0 /* NCManageDatabase+LocalFile.swift in Sources */, F314F1142A30E2DE00BC7FAB /* View+Extension.swift in Sources */, - F724377D2C10B92300C7C68D /* NCPermissions.swift in Sources */, + F724377D2C10B92300C7C68D /* NCSharePermissions.swift in Sources */, F7D68FD028CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */, F343A4C12A1E734600DDA874 /* Optional+Extension.swift in Sources */, F7245927289BB59300474787 /* ThreadSafeDictionary.swift in Sources */, @@ -4168,6 +4177,7 @@ F757CC8829E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */, F79B646326CA661600838ACA /* UIControl+Extension.swift in Sources */, F7C687EF2D22BDE5004757BC /* NCManageDatabase+RecommendedFiles.swift in Sources */, + F3F442F42DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */, F77DD6AE2C5CC093009448FB /* NCSession.swift in Sources */, F78A10C429322E8A008499B8 /* NCManageDatabase+Directory.swift in Sources */, F7B769AE2B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift in Sources */, @@ -4260,6 +4270,7 @@ F7490E8529882C8C009DCE94 /* NCManageDatabase+Video.swift in Sources */, F7CF06892E1127460063AD04 /* NCManageDatabase+Metadata+Create.swift in Sources */, F7386E4A2DA90E0F009A00F6 /* NCAppVersionManager.swift in Sources */, + F3F442F32DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */, F7490E7729882C10009DCE94 /* UIColor+Extension.swift in Sources */, F70716E62987F81500E72C1D /* DocumentActionViewController.swift in Sources */, F359D86C2A7D03420023F405 /* NCUtility+Exif.swift in Sources */, @@ -4283,7 +4294,7 @@ F7B769AD2B7A0B2000C1AAEB /* NCManageDatabase+Metadata+Session.swift in Sources */, F39170AC2CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */, F73EF7BC2B0224AB0087E6E9 /* NCManageDatabase+ExternalSites.swift in Sources */, - F724377E2C10B92300C7C68D /* NCPermissions.swift in Sources */, + F724377E2C10B92300C7C68D /* NCSharePermissions.swift in Sources */, F7490E8229882C80009DCE94 /* NCManageDatabase+E2EE.swift in Sources */, F7490E7829882C28009DCE94 /* NCUtility.swift in Sources */, F3E173C52C9B1067006D177A /* AwakeMode.swift in Sources */, @@ -4376,7 +4387,7 @@ F799DF862C4B7E56003410B5 /* NCSectionHeader.swift in Sources */, F702F2D025EE5B5C008F8E80 /* NCGlobal.swift in Sources */, F343A4BE2A1E734600DDA874 /* Optional+Extension.swift in Sources */, - F72437802C10B92400C7C68D /* NCPermissions.swift in Sources */, + F72437802C10B92400C7C68D /* NCSharePermissions.swift in Sources */, F7EDE4DB262D7BA200414FE6 /* NCCellProtocol.swift in Sources */, F72944F62A8424F800246839 /* NCEndToEndMetadataV1.swift in Sources */, F73EF7BA2B0224AB0087E6E9 /* NCManageDatabase+ExternalSites.swift in Sources */, @@ -4404,6 +4415,7 @@ F78A10C229322E8A008499B8 /* NCManageDatabase+Directory.swift in Sources */, F79FFB272A97C24A0055EEA4 /* NCNetworkingE2EEMarkFolder.swift in Sources */, F7D68FCE28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */, + F3F442F12DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */, AF22B217277D196700DAB0CC /* NCShareExtension+DataSource.swift in Sources */, F73EF7E22B02266D0087E6E9 /* NCManageDatabase+Trash.swift in Sources */, F33EE6F52BF4C9B200CA1A51 /* PKCS12.swift in Sources */, @@ -4481,7 +4493,7 @@ F783030628B4C51E00B84583 /* String+Extension.swift in Sources */, F763D29E2A249C4500A3C901 /* NCManageDatabase+Capabilities.swift in Sources */, F711A4DD2AF92CAE00095DD8 /* NCUtility+Date.swift in Sources */, - F724377C2C10B92200C7C68D /* NCPermissions.swift in Sources */, + F724377C2C10B92200C7C68D /* NCSharePermissions.swift in Sources */, F36E64FB2B9733F10085ABB5 /* UIView+Extension.swift in Sources */, F77ED59328C9CEA000E24ED0 /* ToolbarWidgetProvider.swift in Sources */, F72A17D828B221E300F3F159 /* DashboardWidgetView.swift in Sources */, @@ -4503,6 +4515,7 @@ F78302FF28B4C45000B84583 /* NCUtilityFileSystem.swift in Sources */, F73EF7B82B0224AB0087E6E9 /* NCManageDatabase+ExternalSites.swift in Sources */, F73EF7C02B02250B0087E6E9 /* NCManageDatabase+GPS.swift in Sources */, + F3F442EF2DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */, F3E173C12C9B1067006D177A /* AwakeMode.swift in Sources */, F75DD766290ABB25002EB562 /* Intent.intentdefinition in Sources */, F7D68FCD28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */, @@ -4539,7 +4552,7 @@ F7434B3820E2400600417916 /* NCBrand.swift in Sources */, F7327E332B73A86700A462C7 /* NCNetworking+WebDAV.swift in Sources */, F7411C572D7B26D700F57358 /* NCNetworking+ServerError.swift in Sources */, - F724377F2C10B92400C7C68D /* NCPermissions.swift in Sources */, + F724377F2C10B92400C7C68D /* NCSharePermissions.swift in Sources */, F785EE9E2461A09900B3F945 /* NCNetworking.swift in Sources */, F749B655297B0F2400087535 /* NCManageDatabase+Avatar.swift in Sources */, F7327E382B73AEDE00A462C7 /* NCNetworking+LivePhoto.swift in Sources */, @@ -4558,6 +4571,7 @@ F7F3E58B2D3BB65600A32B14 /* NCNetworking+Recommendations.swift in Sources */, F73EF7C32B02250B0087E6E9 /* NCManageDatabase+GPS.swift in Sources */, F7C9B9212B582F550064EA91 /* NCManageDatabase+SecurityGuard.swift in Sources */, + F3F442F22DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */, F359D86B2A7D03420023F405 /* NCUtility+Exif.swift in Sources */, F7864AD02A78FE73004870E0 /* NCManageDatabase+LocalFile.swift in Sources */, F7327E402B73B92800A462C7 /* NCNetworking+Synchronization.swift in Sources */, @@ -4693,6 +4707,7 @@ F77A697D250A0FBC00FF1708 /* NCCollectionViewCommon+Menu.swift in Sources */, F7BF9D822934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift in Sources */, AA8D31662D411FA100FE2775 /* NCShareDateCell.swift in Sources */, + F3F442EE2DDE292D00FD701F /* NCMetadataPermissions.swift in Sources */, F3374A812D64AB9F002A38F9 /* StatusInfo.swift in Sources */, AF7E504E27A2D8FF00B5E4AF /* UIBarButton+Extension.swift in Sources */, AA8D31682D41224800FE2775 /* NCShareToggleCell.swift in Sources */, @@ -4711,7 +4726,7 @@ F72D1007210B6882009C96B7 /* NCPushNotificationEncryption.m in Sources */, F76882362C0DD1E7001CF441 /* NCAcknowledgementsView.swift in Sources */, F785EE9D246196DF00B3F945 /* NCNetworkingE2EE.swift in Sources */, - F724377B2C10B83E00C7C68D /* NCPermissions.swift in Sources */, + F724377B2C10B83E00C7C68D /* NCSharePermissions.swift in Sources */, F794E13D2BBBFF2E003693D7 /* NCMainTabBarController.swift in Sources */, F7CBC1252BAC8B0000EC1D55 /* NCSectionFirstHeaderEmptyData.swift in Sources */, F7D4BF3D2CA2E8D800A5E746 /* TOPasscodeKeypadView.m in Sources */, @@ -4941,13 +4956,14 @@ F7F1FB9D2E27CE7200C79E20 /* NCNetworking.swift in Sources */, F343A4BD2A1E734600DDA874 /* Optional+Extension.swift in Sources */, F7A8D73528F17E16008BBE1C /* NCManageDatabase.swift in Sources */, + F3F442F02DDE2A7700FD701F /* NCMetadataPermissions.swift in Sources */, F7A8D74428F1827B008BBE1C /* ThreadSafeDictionary.swift in Sources */, F7C9739528F17131002C43E2 /* IntentHandler.swift in Sources */, F7A8D73D28F181D3008BBE1C /* NCUtilityFileSystem.swift in Sources */, F73EF7E12B02266D0087E6E9 /* NCManageDatabase+Trash.swift in Sources */, F7C9B91F2B582F550064EA91 /* NCManageDatabase+SecurityGuard.swift in Sources */, F75DD767290ABB25002EB562 /* Intent.intentdefinition in Sources */, - F72437812C10B92500C7C68D /* NCPermissions.swift in Sources */, + F72437812C10B92500C7C68D /* NCSharePermissions.swift in Sources */, F39170A92CB82024006127BC /* FileAutoRenamer+Extensions.swift in Sources */, F749B64C297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */, F7A8D73F28F181EF008BBE1C /* NCGlobal.swift in Sources */, @@ -6205,8 +6221,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/marinofaggiana/TLPhotoPicker"; requirement = { - branch = master; - kind = branch; + kind = revision; + revision = 491bcc34add71bacd77a410034b20cfe501dfd10; }; }; F73ADD1A265546880069EA0D /* XCRemoteSwiftPackageReference "SwiftEntryKit" */ = { diff --git a/Share/NCShareExtension+DataSource.swift b/Share/NCShareExtension+DataSource.swift index 0bc3c15969..34e36c325a 100644 --- a/Share/NCShareExtension+DataSource.swift +++ b/Share/NCShareExtension+DataSource.swift @@ -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 { diff --git a/iOSClient/Data/NCManageDatabase+Metadata.swift b/iOSClient/Data/NCManageDatabase+Metadata.swift index c7e783ff68..254668b24c 100644 --- a/iOSClient/Data/NCManageDatabase+Metadata.swift +++ b/iOSClient/Data/NCManageDatabase+Metadata.swift @@ -141,6 +141,9 @@ extension tableMetadata { } var isRenameable: Bool { + if !NCMetadataPermissions.canRename(self) { + return false + } if lock { return false } @@ -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 @@ -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 { diff --git a/iOSClient/Files/NCFiles.swift b/iOSClient/Files/NCFiles.swift index ebfd04c311..e1dc166ea4 100644 --- a/iOSClient/Files/NCFiles.swift +++ b/iOSClient/Files/NCFiles.swift @@ -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) diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift index 3778497b7a..d5e8333a36 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift @@ -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] = [] @@ -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 @@ -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: "") diff --git a/iOSClient/Menu/NCCollectionViewCommon+Menu.swift b/iOSClient/Menu/NCCollectionViewCommon+Menu.swift index aac13bfe6e..a84a0a4d8e 100644 --- a/iOSClient/Menu/NCCollectionViewCommon+Menu.swift +++ b/iOSClient/Menu/NCCollectionViewCommon+Menu.swift @@ -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 // @@ -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) diff --git a/iOSClient/Menu/NCMenuAction.swift b/iOSClient/Menu/NCMenuAction.swift index bb4e882481..d384d02b9b 100644 --- a/iOSClient/Menu/NCMenuAction.swift +++ b/iOSClient/Menu/NCMenuAction.swift @@ -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: "") @@ -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" diff --git a/iOSClient/Menu/NCShare+Menu.swift b/iOSClient/Menu/NCShare+Menu.swift index fa33a31fb6..fafba175cc 100644 --- a/iOSClient/Menu/NCShare+Menu.swift +++ b/iOSClient/Menu/NCShare+Menu.swift @@ -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) } ), @@ -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) } ), @@ -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) @@ -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) } diff --git a/iOSClient/Menu/NCViewer+Menu.swift b/iOSClient/Menu/NCViewer+Menu.swift index 12888a5215..e84a6f6b1a 100644 --- a/iOSClient/Menu/NCViewer+Menu.swift +++ b/iOSClient/Menu/NCViewer+Menu.swift @@ -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) diff --git a/iOSClient/Networking/NCNetworking+WebDAV.swift b/iOSClient/Networking/NCNetworking+WebDAV.swift index 65d982426f..c8b7b4951e 100644 --- a/iOSClient/Networking/NCNetworking+WebDAV.swift +++ b/iOSClient/Networking/NCNetworking+WebDAV.swift @@ -372,7 +372,7 @@ extension NCNetworking { var serverUrls = Set() 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_")) } @@ -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_")) @@ -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) { @@ -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) { diff --git a/iOSClient/Select/NCSelect.swift b/iOSClient/Select/NCSelect.swift index fb1361b8bf..1a857dba63 100644 --- a/iOSClient/Select/NCSelect.swift +++ b/iOSClient/Select/NCSelect.swift @@ -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 diff --git a/iOSClient/Share/Advanced/NCShareAdvancePermission.swift b/iOSClient/Share/Advanced/NCShareAdvancePermission.swift index aa121b3f75..059ef65886 100644 --- a/iOSClient/Share/Advanced/NCShareAdvancePermission.swift +++ b/iOSClient/Share/Advanced/NCShareAdvancePermission.swift @@ -132,7 +132,7 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if section == 0 { // check reshare permission, if restricted add note - let maxPermission = metadata.directory ? NCPermissions().permissionMaxFolderShare : NCPermissions().permissionMaxFileShare + let maxPermission = metadata.directory ? NCSharePermissions.permissionMaxFolderShare : NCSharePermissions.permissionMaxFileShare return shareConfig.sharePermission != maxPermission ? shareConfig.permissions.count + 1 : shareConfig.permissions.count } else if section == 1 { return shareConfig.advanced.count @@ -236,8 +236,8 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg } Task { - if (share.shareType == NCShareCommon.shareTypeLink || share.shareType == NCShareCommon.shareTypeEmail) && NCPermissions().isPermissionToCanShare(share.permissions) { - share.permissions = share.permissions - NCPermissions().permissionShareShare + if (share.shareType == NCShareCommon.shareTypeLink || share.shareType == NCShareCommon.shareTypeEmail) && NCSharePermissions.hasPermissionToShare(share.permissions) { + share.permissions = share.permissions - NCSharePermissions.permissionReshareShare } if isNewShare { diff --git a/iOSClient/Share/Advanced/NCShareCells.swift b/iOSClient/Share/Advanced/NCShareCells.swift index 784bf45012..e812b5241c 100644 --- a/iOSClient/Share/Advanced/NCShareCells.swift +++ b/iOSClient/Share/Advanced/NCShareCells.swift @@ -64,12 +64,12 @@ enum NCUserPermission: CaseIterable, NCPermission { } var permissionBitFlag: Int { - switch self { - case .read: return NCPermissions().permissionReadShare - case .reshare: return NCPermissions().permissionShareShare - case .edit: return NCPermissions().permissionEditShare - case .create: return NCPermissions().permissionCreateShare - case .delete: return NCPermissions().permissionDeleteShare + return switch self { + case .read: NCSharePermissions.permissionReadShare + case .reshare: NCSharePermissions.permissionReshareShare + case .edit: NCSharePermissions.permissionEditShare + case .create: NCSharePermissions.permissionCreateShare + case .delete: NCSharePermissions.permissionDeleteShare } } @@ -122,11 +122,11 @@ enum NCLinkEmailPermission: CaseIterable, NCPermission { } var permissionBitFlag: Int { - switch self { - case .read: return NCPermissions().permissionReadShare - case .edit: return NCPermissions().permissionEditShare - case .create: return NCPermissions().permissionCreateShare - case .delete: return NCPermissions().permissionDeleteShare + return switch self { + case .read: NCSharePermissions.permissionReadShare + case .edit: NCSharePermissions.permissionEditShare + case .create: NCSharePermissions.permissionCreateShare + case .delete: NCSharePermissions.permissionDeleteShare } } diff --git a/iOSClient/Share/Advanced/NCShareDateCell.swift b/iOSClient/Share/Advanced/NCShareDateCell.swift index 99360efb0f..7d4e8c18c2 100644 --- a/iOSClient/Share/Advanced/NCShareDateCell.swift +++ b/iOSClient/Share/Advanced/NCShareDateCell.swift @@ -12,7 +12,6 @@ class NCShareDateCell: UITableViewCell { let textField = UITextField() var shareType: Int var onReload: (() -> Void)? - let shareCommon = NCShareCommon() init(share: Shareable) { self.shareType = share.shareType diff --git a/iOSClient/Share/NCMetadataPermissions.swift b/iOSClient/Share/NCMetadataPermissions.swift new file mode 100644 index 0000000000..21a2dcd5bf --- /dev/null +++ b/iOSClient/Share/NCMetadataPermissions.swift @@ -0,0 +1,48 @@ +// +// NCMetadataPermissions.swift +// Nextcloud +// +// Created by Milen Pivchev on 21.05.25. +// Copyright © 2025 Marino Faggiana. All rights reserved. +// + +import Foundation + +/// Metadata permissions, represented as symbols (letters) +enum NCMetadataPermissions { + static let permissionShared = "S" + static let permissionCanShare = "R" + static let permissionMounted = "M" + static let permissionFileCanWrite = "W" + static let permissionCanCreateFile = "C" + static let permissionCanCreateFolder = "K" + /** Note: If a folder is shared it will be unshared instead of deleted */ + static let permissionCanDeleteOrUnshare = "D" + static let permissionCanRename = "N" + static let permissionCanMove = "V" + + static func canCreateFile(_ metadata: tableMetadata) -> Bool { + return metadata.permissions.contains(permissionCanCreateFile) + } + + static func canCreateFolder(_ metadata: tableMetadata) -> Bool { + return metadata.permissions.contains(permissionCanCreateFolder) + } + + static func canDelete(_ metadata: tableMetadata) -> Bool { + return metadata.permissions.contains(permissionCanDeleteOrUnshare) + } + + static func canRename(_ metadata: tableMetadata) -> Bool { + return metadata.permissions.contains(permissionCanRename) + } + + static func permissionsContainsString(_ metadataPermissions: String, permissions: String) -> Bool { + for char in permissions { + if metadataPermissions.contains(char) == false { + return false + } + } + return true + } +} diff --git a/iOSClient/Share/NCShare+NCCellDelegate.swift b/iOSClient/Share/NCShare+NCCellDelegate.swift index 06eeda91e7..bce0bf4510 100644 --- a/iOSClient/Share/NCShare+NCCellDelegate.swift +++ b/iOSClient/Share/NCShare+NCCellDelegate.swift @@ -32,7 +32,7 @@ extension NCShare: NCShareLinkCellDelegate, NCShareUserCellDelegate { NCNetworking.shared.readFile(serverUrlFileName: metadata.serverUrlFileName, account: metadata.account) { _, metadata, error in if error == .success, let metadata = metadata { let internalLink = metadata.urlBase + "/index.php/f/" + metadata.fileId - self.shareCommon.copyLink(link: internalLink, viewController: self, sender: sender) + NCShareCommon.copyLink(link: internalLink, viewController: self, sender: sender) } else { NCContentPresenter().showError(error: error) } @@ -43,7 +43,7 @@ extension NCShare: NCShareLinkCellDelegate, NCShareUserCellDelegate { guard let tableShare = tableShare else { return copyInternalLink(sender: sender) } - shareCommon.copyLink(link: tableShare.url, viewController: self, sender: sender) + NCShareCommon.copyLink(link: tableShare.url, viewController: self, sender: sender) } func tapMenu(with tableShare: tableShare?, sender: Any) { diff --git a/iOSClient/Share/NCShare.swift b/iOSClient/Share/NCShare.swift index 9bd6649241..d71a3e9f98 100644 --- a/iOSClient/Share/NCShare.swift +++ b/iOSClient/Share/NCShare.swift @@ -46,7 +46,6 @@ class NCShare: UIViewController, NCSharePagingContent { public var metadata: tableMetadata! public var height: CGFloat = 0 - let shareCommon = NCShareCommon() let utilityFileSystem = NCUtilityFileSystem() let utility = NCUtility() let database = NCManageDatabase.shared @@ -54,7 +53,7 @@ class NCShare: UIViewController, NCSharePagingContent { var shareLinksCount = 0 var canReshare: Bool { - return ((metadata.sharePermissionsCollaborationServices & NCPermissions().permissionShareShare) != 0) + return ((metadata.sharePermissionsCollaborationServices & NCSharePermissions.permissionReshareShare) != 0) } var session: NCSession.Session { diff --git a/iOSClient/Share/NCShareCommon.swift b/iOSClient/Share/NCShareCommon.swift index fc62b796d3..d43326f5be 100644 --- a/iOSClient/Share/NCShareCommon.swift +++ b/iOSClient/Share/NCShareCommon.swift @@ -23,7 +23,7 @@ import UIKit import DropDown -class NCShareCommon: NSObject { +enum NCShareCommon { static let shareTypeUser = 0 static let shareTypeGroup = 1 static let shareTypeLink = 3 @@ -38,7 +38,7 @@ class NCShareCommon: NSObject { static let itemTypeFile = "file" static let itemTypeFolder = "folder" - func createLinkAvatar(imageName: String, colorCircle: UIColor) -> UIImage? { + static func createLinkAvatar(imageName: String, colorCircle: UIColor) -> UIImage? { let size: CGFloat = 200 let bottomImage = UIImage(named: "circle_fill")!.image(color: colorCircle, size: size / 2) @@ -52,7 +52,7 @@ class NCShareCommon: NSObject { return image } - func copyLink(link: String, viewController: UIViewController, sender: Any) { + static func copyLink(link: String, viewController: UIViewController, sender: Any) { let objectsToShare = [link] let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) @@ -68,7 +68,7 @@ class NCShareCommon: NSObject { } } - func getImageShareType(shareType: Int) -> UIImage? { + static func getImageShareType(shareType: Int) -> UIImage? { switch shareType { case NCShareCommon.shareTypeUser: diff --git a/iOSClient/Share/NCShareLinkCell.swift b/iOSClient/Share/NCShareLinkCell.swift index d7fbd53193..8f42838e6c 100644 --- a/iOSClient/Share/NCShareLinkCell.swift +++ b/iOSClient/Share/NCShareLinkCell.swift @@ -48,17 +48,13 @@ class NCShareLinkCell: UITableViewCell { func setupCellUI(titleAppendString: String? = nil) { var menuImageName = "ellipsis" - let permissions = NCPermissions() menuButton.isHidden = isInternalLink descriptionLabel.isHidden = !isInternalLink copyButton.isHidden = !isInternalLink && tableShare == nil statusStackView.isHidden = isInternalLink - if #available(iOS 18.0, *) { - // use NCShareLinkCell image - } else { - copyButton.setImage(UIImage(systemName: "doc.on.doc")?.withTintColor(.label, renderingMode: .alwaysOriginal), for: .normal) - } + + copyButton.setImage(UIImage(systemName: "doc.on.doc")?.withTintColor(.label, renderingMode: .alwaysOriginal), for: .normal) copyButton.accessibilityLabel = NSLocalizedString("_copy_", comment: "") menuButton.accessibilityLabel = NSLocalizedString("_more_", comment: "") @@ -97,13 +93,13 @@ class NCShareLinkCell: UITableViewCell { statusStackView.isHidden = false labelQuickStatus.text = NSLocalizedString("_custom_permissions_", comment: "") - if permissions.canEdit(tableShare.permissions, isDirectory: isDirectory) { // Can edit + if NCSharePermissions.canEdit(tableShare.permissions, isDirectory: isDirectory) { // Can edit labelQuickStatus.text = NSLocalizedString("_share_editing_", comment: "") } - if permissions.getPermissionValue(canRead: false, canCreate: true, canEdit: false, canDelete: false, canShare: false, isDirectory: isDirectory) == tableShare.permissions { + if NCSharePermissions.getPermissionValue(canRead: false, canCreate: true, canEdit: false, canDelete: false, canShare: false, isDirectory: isDirectory) == tableShare.permissions { // File request labelQuickStatus.text = NSLocalizedString("_share_file_drop_", comment: "") } - if permissions.getPermissionValue(canCreate: false, canEdit: false, canDelete: false, canShare: true, isDirectory: isDirectory) == tableShare.permissions { // Read only + if NCSharePermissions.getPermissionValue(canCreate: false, canEdit: false, canDelete: false, canShare: true, isDirectory: isDirectory) == tableShare.permissions { // Read only labelQuickStatus.text = NSLocalizedString("_share_read_only_", comment: "") } diff --git a/iOSClient/Share/NCPermissions.swift b/iOSClient/Share/NCSharePermissions.swift similarity index 51% rename from iOSClient/Share/NCPermissions.swift rename to iOSClient/Share/NCSharePermissions.swift index f9014edd71..aa44ca07e6 100644 --- a/iOSClient/Share/NCPermissions.swift +++ b/iOSClient/Share/NCSharePermissions.swift @@ -24,75 +24,65 @@ import UIKit import Foundation -class NCPermissions: NSObject { - let permissionShared = "S" - let permissionCanShare = "R" - let permissionMounted = "M" - let permissionFileCanWrite = "W" - let permissionCanCreateFile = "C" - let permissionCanCreateFolder = "K" - let permissionCanDelete = "D" - let permissionCanRename = "N" - let permissionCanMove = "V" - +enum NCSharePermissions { // Share permission - // permissions - (int) 1 = read; 2 = update; 4 = create; 8 = delete; 16 = share; 31 = all - // - let permissionReadShare: Int = 1 - let permissionEditShare: Int = 2 - let permissionCreateShare: Int = 4 - let permissionDeleteShare: Int = 8 - let permissionShareShare: Int = 16 + // permissions - (int) 1 = read; 2 = update; 4 = create; 8 = delete; 16 = Reshare; 31 = all // - let permissionMinFileShare: Int = 1 - let permissionMaxFileShare: Int = 19 - let permissionMinFolderShare: Int = 1 - let permissionMaxFolderShare: Int = 31 - let permissionDefaultFileRemoteShareNoSupportShareOption: Int = 3 - let permissionDefaultFolderRemoteShareNoSupportShareOption: Int = 15 + static let permissionReadShare: Int = 1 + static let permissionEditShare: Int = 2 + static let permissionCreateShare: Int = 4 + static let permissionDeleteShare: Int = 8 + static let permissionReshareShare: Int = 16 + + static let permissionMinFileShare: Int = 1 + static let permissionMaxFileShare: Int = 19 + static let permissionMinFolderShare: Int = 1 + static let permissionMaxFolderShare: Int = 31 + static let permissionDefaultFileRemoteShareNoSupportShareOption: Int = 3 + static let permissionDefaultFolderRemoteShareNoSupportShareOption: Int = 15 // Additional attributes. This also includes the permission to download. // Check https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-share-api.html#share-attributes - let permissionDownloadShare: Int = 0 + static let permissionDownloadShare: Int = 0 - func isPermissionToRead(_ permission: Int) -> Bool { + static func hasPermissionToRead(_ permission: Int) -> Bool { return ((permission & permissionReadShare) > 0) } - func isPermissionToCanDelete(_ permission: Int) -> Bool { + static func hasPermissionToDelete(_ permission: Int) -> Bool { return ((permission & permissionDeleteShare) > 0) } - func isPermissionToCanCreate(_ permission: Int) -> Bool { + static func hasPermissionToCreate(_ permission: Int) -> Bool { return ((permission & permissionCreateShare) > 0) } - func isPermissionToCanEdit(_ permission: Int) -> Bool { + static func hasPermissionToEdit(_ permission: Int) -> Bool { return ((permission & permissionEditShare) > 0) } - func isPermissionToCanShare(_ permission: Int) -> Bool { - return ((permission & permissionShareShare) > 0) + static func hasPermissionToShare(_ permission: Int) -> Bool { + return ((permission & permissionReshareShare) > 0) } - func isAnyPermissionToEdit(_ permission: Int) -> Bool { - let canCreate = isPermissionToCanCreate(permission) - let canEdit = isPermissionToCanEdit(permission) - let canDelete = isPermissionToCanDelete(permission) + static func isAnyPermissionToEdit(_ permission: Int) -> Bool { + let canCreate = hasPermissionToCreate(permission) + let canEdit = hasPermissionToEdit(permission) + let canDelete = hasPermissionToDelete(permission) return canCreate || canEdit || canDelete } /// "Can edit" means it has can read, create, edit, and delete. - func canEdit(_ permission: Int, isDirectory: Bool) -> Bool { - let canRead = isPermissionToRead(permission) - let canCreate = isDirectory ? isPermissionToCanCreate(permission) : true - let canEdit = isPermissionToCanEdit(permission) - let canDelete = isDirectory ? isPermissionToCanDelete(permission) : true + static func canEdit(_ permission: Int, isDirectory: Bool) -> Bool { + let canRead = hasPermissionToRead(permission) + let canCreate = isDirectory ? hasPermissionToCreate(permission) : true + let canEdit = hasPermissionToEdit(permission) + let canDelete = isDirectory ? hasPermissionToDelete(permission) : true return canCreate && canEdit && canRead && canDelete } /// Read permission is always true for a share, hence why it's not here. - func getPermissionValue(canRead: Bool = true, canCreate: Bool, canEdit: Bool, canDelete: Bool, canShare: Bool, isDirectory: Bool) -> Int { + static func getPermissionValue(canRead: Bool = true, canCreate: Bool, canEdit: Bool, canDelete: Bool, canShare: Bool, isDirectory: Bool) -> Int { var permission = 0 if canRead { @@ -109,7 +99,7 @@ class NCPermissions: NSObject { permission = permission + permissionDeleteShare } if canShare { - permission = permission + permissionShareShare + permission = permission + permissionReshareShare } return permission diff --git a/iOSClient/Share/NCShareUserCell.swift b/iOSClient/Share/NCShareUserCell.swift index de7465f8cc..5a816e0061 100644 --- a/iOSClient/Share/NCShareUserCell.swift +++ b/iOSClient/Share/NCShareUserCell.swift @@ -62,10 +62,9 @@ class NCShareUserCell: UITableViewCell, NCCellProtocol { name: NSLocalizedString("_show_profile_", comment: ""), target: self, selector: #selector(tapAvatarImage(_:)))] - let permissions = NCPermissions() labelTitle.text = (tableShare.shareWithDisplayname.isEmpty ? tableShare.shareWith : tableShare.shareWithDisplayname) - let type = getType(tableShare) + let type = getTypeString(tableShare) if !type.isEmpty { labelTitle.text?.append(" (\(type))") } @@ -77,7 +76,7 @@ class NCShareUserCell: UITableViewCell, NCCellProtocol { imageDownArrow.isHidden = false buttonMenu.isHidden = false buttonMenu.accessibilityLabel = NSLocalizedString("_more_", comment: "") - imageItem.image = NCShareCommon().getImageShareType(shareType: tableShare.shareType) + imageItem.image = NCShareCommon.getImageShareType(shareType: tableShare.shareType) let status = utility.getUserStatus(userIcon: tableShare.userIcon, userStatus: tableShare.userStatus, userMessage: tableShare.userMessage) imageStatus.image = status.statusImage @@ -95,9 +94,9 @@ class NCShareUserCell: UITableViewCell, NCCellProtocol { btnQuickStatus.setTitle("", for: .normal) btnQuickStatus.contentHorizontalAlignment = .left - if permissions.canEdit(tableShare.permissions, isDirectory: isDirectory) { // Can edit + if NCSharePermissions.canEdit(tableShare.permissions, isDirectory: isDirectory) { // Can edit labelQuickStatus.text = NSLocalizedString("_share_editing_", comment: "") - } else if tableShare.permissions == permissions.permissionReadShare { // Read only + } else if tableShare.permissions == NCSharePermissions.permissionReadShare { // Read only labelQuickStatus.text = NSLocalizedString("_share_read_only_", comment: "") } else { // Custom permissions labelQuickStatus.text = NSLocalizedString("_custom_permissions_", comment: "") @@ -109,7 +108,8 @@ class NCShareUserCell: UITableViewCell, NCCellProtocol { imageItem.contentMode = .scaleAspectFill if tableShare.shareType == NCShareCommon.shareTypeTeam { - imageItem.image = utility.loadImage(named: "person.3.circle.fill", colors: [NCBrandColor.shared.iconImageColor]) + imageItem.image = utility.loadImage(named: "person.3.fill", colors: [NCBrandColor.shared.iconImageColor]) + imageItem.contentMode = .scaleAspectFit } else if results.image == nil { imageItem.image = utility.loadUserImage(for: tableShare.shareWith, displayName: tableShare.shareWithDisplayname, urlBase: metadata.urlBase) } else { @@ -122,10 +122,12 @@ class NCShareUserCell: UITableViewCell, NCCellProtocol { } } - private func getType(_ tableShare: tableShareV2) -> String { + private func getTypeString(_ tableShare: tableShareV2) -> String { switch tableShare.shareType { case NCShareCommon.shareTypeFederated: return NSLocalizedString("_remote_", comment: "") + case NCShareCommon.shareTypeFederatedGroup: + return NSLocalizedString("_remote_group_", comment: "") case NCShareCommon.shareTypeRoom: return NSLocalizedString("_conversation_", comment: "") default: @@ -188,8 +190,8 @@ class NCSearchUserDropDownCell: DropDownCell, NCCellProtocol { func setupCell(sharee: NKSharee, session: NCSession.Session) { let utility = NCUtility() - imageItem.image = NCShareCommon().getImageShareType(shareType: sharee.shareType) - imageShareeType.image = NCShareCommon().getImageShareType(shareType: sharee.shareType) + imageItem.image = NCShareCommon.getImageShareType(shareType: sharee.shareType) + imageShareeType.image = NCShareCommon.getImageShareType(shareType: sharee.shareType) let status = utility.getUserStatus(userIcon: sharee.userIcon, userStatus: sharee.userStatus, userMessage: sharee.userMessage) if let statusImage = status.statusImage { diff --git a/iOSClient/Share/NCShareUserCell.xib b/iOSClient/Share/NCShareUserCell.xib index eb9b65ca76..288198bfa7 100755 --- a/iOSClient/Share/NCShareUserCell.xib +++ b/iOSClient/Share/NCShareUserCell.xib @@ -1,9 +1,8 @@ - + - - + @@ -12,10 +11,10 @@ - + - + @@ -42,10 +41,9 @@ -