Skip to content

Commit 6ad9fb0

Browse files
Read owner and permissions from PUT response on new file creation (#4105)
* WIP Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * WIP Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * WIP Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * WIP Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * Refactor Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * Refactor Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * Fix compile Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> * down Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * prj Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * up Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * main Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * varie Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * dele Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * delegate Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * header2 Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * delegate Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * nk main Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * code cleaning Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * ownerDisplayName Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * ownerDisplayName Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * lint Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * fix query Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * Refactor Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> --------- Signed-off-by: Milen Pivchev <milen.pivchev@gmail.com> Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> Co-authored-by: Marino Faggiana <marino.faggiana@nextcloud.com>
1 parent ac069c0 commit 6ad9fb0

30 files changed

Lines changed: 286 additions & 189 deletions

Brand/NCBrand.swift

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,43 @@ let userAgent: String = {
2020
The codename embodies the concept of dynamic, living matter — reflecting our vision of a platform that is not only powerful and reliable, but also capable of continuous transformation and intelligent adaptation.
2121
*/
2222

23+
struct NextcloudVersion: Comparable {
24+
let major: Int
25+
let minor: Int
26+
let micro: Int
27+
28+
init(_ major: Int, _ minor: Int = 0, _ micro: Int = 0) {
29+
self.major = major
30+
self.minor = minor
31+
self.micro = micro
32+
}
33+
34+
init(_ capabilities: NKCapabilities.Capabilities) {
35+
self.major = capabilities.serverVersionMajor
36+
self.minor = capabilities.serverVersionMinor
37+
self.micro = capabilities.serverVersionMicro
38+
}
39+
40+
static let v18 = NextcloudVersion(18)
41+
static let v20 = NextcloudVersion(20)
42+
static let v23 = NextcloudVersion(23)
43+
static let v24 = NextcloudVersion(24)
44+
static let v25 = NextcloudVersion(25)
45+
static let v26 = NextcloudVersion(26)
46+
static let v27 = NextcloudVersion(27)
47+
static let v28 = NextcloudVersion(28)
48+
static let v30 = NextcloudVersion(30)
49+
static let v31 = NextcloudVersion(31)
50+
static let v32 = NextcloudVersion(32)
51+
static let v32_0_2 = NextcloudVersion(32, 0, 2)
52+
static let v33 = NextcloudVersion(33)
53+
static let v34 = NextcloudVersion(34)
54+
55+
static func < (lhs: NextcloudVersion, rhs: NextcloudVersion) -> Bool {
56+
(lhs.major, lhs.minor, lhs.micro) < (rhs.major, rhs.minor, rhs.micro)
57+
}
58+
}
59+
2360
final class NCBrandOptions: @unchecked Sendable {
2461
static let shared = NCBrandOptions()
2562

@@ -129,19 +166,8 @@ final class NCBrandOptions: @unchecked Sendable {
129166
}
130167

131168
func isServerVersion(_ capabilities: NKCapabilities.Capabilities,
132-
greaterOrEqualTo major: Int,
133-
_ minor: Int,
134-
_ micro: Int) -> Bool {
135-
136-
let server = (
137-
capabilities.serverVersionMajor,
138-
capabilities.serverVersionMinor,
139-
capabilities.serverVersionMicro
140-
)
141-
142-
let required = (major, minor, micro)
143-
144-
return server >= required
169+
greaterOrEqualTo version: NextcloudVersion) -> Bool {
170+
return NextcloudVersion(capabilities) >= version
145171
}
146172
}
147173

File Provider Extension/FileProviderData.swift

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class FileProviderData: NSObject {
9090
return isPaginated
9191
} else if serverUrl == NCUtilityFileSystem().getHomeServer(session: session),
9292
let capabilities = await NextcloudKit.shared.getCapabilitiesAsync(account: session.account).capabilities,
93-
NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: 32, 0, 2) {
93+
NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v32_0_2) {
9494
isPaginated = true
9595
return true
9696
}
@@ -147,10 +147,7 @@ class FileProviderData: NSObject {
147147

148148
func downloadComplete(fileName: String,
149149
serverUrl: String,
150-
etag: String?,
151-
date: Date?,
152-
dateLastModified: Date?,
153-
length: Int64,
150+
allHeaderFields: [AnyHashable: Any]?,
154151
task: URLSessionTask,
155152
error: NKError) async {
156153
let taskIdentifier = task.taskIdentifier
@@ -165,6 +162,7 @@ class FileProviderData: NSObject {
165162
}
166163

167164
let ocId = metadata.ocId
165+
let etag = NextcloudKit.shared.nkCommonInstance.findHeader("oc-etag", allHeaderFields: allHeaderFields)
168166

169167
await NCManageDatabase.shared.setMetadataSessionAsync(ocId: ocId,
170168
session: "",
@@ -196,7 +194,8 @@ class FileProviderData: NSObject {
196194
ocId: String?,
197195
etag: String?,
198196
date: Date?,
199-
size: Int64,
197+
ownerId: String?,
198+
permissions: String?,
200199
task: URLSessionTask,
201200
error: NKError) async {
202201
guard let metadata = await NCManageDatabase.shared.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileName == %@ AND sessionTaskIdentifier == %d", serverUrl, fileName, task.taskIdentifier)) else {
@@ -225,11 +224,22 @@ class FileProviderData: NSObject {
225224
metadata.uploadDate = (date as? NSDate) ?? NSDate()
226225
metadata.etag = etag ?? ""
227226
metadata.ocId = ocId
228-
metadata.size = size
227+
229228
if let fileId = fileProviderUtility().ocIdToFileId(ocId: ocId) {
230229
metadata.fileId = fileId
231230
}
232231

232+
if let ownerId, !ownerId.isEmpty {
233+
metadata.ownerId = ownerId
234+
if let ownerDisplayName = await NCManageDatabase.shared.getOwnerDisplayName(account: metadata.account, ownerId: ownerId) {
235+
metadata.ownerDisplayName = ownerDisplayName
236+
}
237+
}
238+
239+
if let permissions, !permissions.isEmpty {
240+
metadata.permissions = permissions
241+
}
242+
233243
metadata.sceneIdentifier = nil
234244
metadata.session = ""
235245
metadata.sessionError = ""

Nextcloud.xcodeproj/project.pbxproj

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,13 @@
441441
F75DD765290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
442442
F75DD766290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
443443
F75DD767290ABB25002EB562 /* Intent.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = F75DD769290ABB25002EB562 /* Intent.intentdefinition */; };
444+
F75F4BC02FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
445+
F75F4BC12FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
446+
F75F4BC22FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
447+
F75F4BC32FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
448+
F75F4BC42FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
449+
F75F4BC52FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
450+
F75F4BC62FD008D7009E55ED /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F343A4BA2A1E734600DDA874 /* Optional+Extension.swift */; };
444451
F760DE032AE66EA80027D78A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F760DE022AE66EA80027D78A /* KeychainAccess */; };
445452
F760DE052AE66EBE0027D78A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F760DE042AE66EBE0027D78A /* KeychainAccess */; };
446453
F760DE072AE66EC70027D78A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = F760DE062AE66EC70027D78A /* KeychainAccess */; };
@@ -4163,6 +4170,7 @@
41634170
buildActionMask = 2147483647;
41644171
files = (
41654172
F73EF7BD2B0224AB0087E6E9 /* NCManageDatabase+ExternalSites.swift in Sources */,
4173+
F75F4BC62FD008D7009E55ED /* Optional+Extension.swift in Sources */,
41664174
F73EF7C52B02250B0087E6E9 /* NCManageDatabase+GPS.swift in Sources */,
41674175
2C1D5D7923E2DE9100334ABB /* NCBrand.swift in Sources */,
41684176
F770768A263A8A2500A1BA94 /* NCUtilityFileSystem.swift in Sources */,
@@ -4257,6 +4265,7 @@
42574265
buildActionMask = 2147483647;
42584266
files = (
42594267
F78E2D6A29AF02DB0024D4F3 /* Database.swift in Sources */,
4268+
F75F4BC52FD008D7009E55ED /* Optional+Extension.swift in Sources */,
42604269
F7490E6E29882B56009DCE94 /* NCBrand.swift in Sources */,
42614270
F7D61E942EBF1366007F865B /* UIColor+Extension.swift in Sources */,
42624271
F71F6D0C2B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */,
@@ -4327,6 +4336,7 @@
43274336
F77C973A2953143A00FDDD09 /* NCCameraRoll.swift in Sources */,
43284337
F740BEF02A35C2AD00E9B6D5 /* UILabel+Extension.swift in Sources */,
43294338
F7C30E01291BD2610017149B /* NCNetworkingE2EERename.swift in Sources */,
4339+
F75F4BC22FD008D7009E55ED /* Optional+Extension.swift in Sources */,
43304340
AF4BF61A27562A4B0081CEEF /* NCManageDatabase+Metadata.swift in Sources */,
43314341
AF4BF615275629E20081CEEF /* NCManageDatabase+Account.swift in Sources */,
43324342
F798F0E225880608000DAFFD /* UIColor+Extension.swift in Sources */,
@@ -4477,6 +4487,7 @@
44774487
F72EA95228B7BA2A00C88F0C /* DashboardWidgetProvider.swift in Sources */,
44784488
F77E8C242E79717D00EAE68F /* NCManageDatabase+LivePhoto.swift in Sources */,
44794489
F76340F72EBDE9760056F538 /* NCManageDatabaseCore.swift in Sources */,
4490+
F75F4BC02FD008D7009E55ED /* Optional+Extension.swift in Sources */,
44804491
F7D496FD2EBFA6D9004F9823 /* String+Extension.swift in Sources */,
44814492
F7D7A7702DCDD437003D2007 /* NCManageDatabase+AutoUpload.swift in Sources */,
44824493
F72EA95828B7BC4F00C88F0C /* FilesData.swift in Sources */,
@@ -4514,6 +4525,7 @@
45144525
F3E173C42C9B1067006D177A /* AwakeMode.swift in Sources */,
45154526
F7D61E932EBF1366007F865B /* UIColor+Extension.swift in Sources */,
45164527
F76340F42EBDE9760056F538 /* NCManageDatabaseCore.swift in Sources */,
4528+
F75F4BC42FD008D7009E55ED /* Optional+Extension.swift in Sources */,
45174529
F7CAFE212F17A37C00DB35A5 /* NCNetworking+Actor.swift in Sources */,
45184530
F76340EE2EBDE74C0056F538 /* NCManageDatabase.swift in Sources */,
45194531
F763410A2EBDFCB10056F538 /* NCManageDatabase+CreateMetadata.swift in Sources */,
@@ -4909,6 +4921,7 @@
49094921
F7C55C8E2FB5B03D004A974F /* NCGlobal.swift in Sources */,
49104922
F7C55CC92FB5CE74004A974F /* ActionViewController.swift in Sources */,
49114923
F7C55C9B2FB5B1A7004A974F /* UIColor+Extension.swift in Sources */,
4924+
F75F4BC32FD008D7009E55ED /* Optional+Extension.swift in Sources */,
49124925
F7C55C8D2FB5B02C004A974F /* NCAssistantSharedTextStore.swift in Sources */,
49134926
F7C55C9A2FB5B127004A974F /* ThreadSafeDictionary.swift in Sources */,
49144927
);
@@ -4965,6 +4978,7 @@
49654978
F71F6D092B6A6A5E00F1EB15 /* ThreadSafeArray.swift in Sources */,
49664979
F757CC8429E7F88B00F31428 /* NCManageDatabase+Groupfolders.swift in Sources */,
49674980
F78E2D6729AF02DB0024D4F3 /* Database.swift in Sources */,
4981+
F75F4BC12FD008D7009E55ED /* Optional+Extension.swift in Sources */,
49684982
F77DD6AA2C5CC093009448FB /* NCSession.swift in Sources */,
49694983
F7A8D73628F17E1A008BBE1C /* NCManageDatabase+Activity.swift in Sources */,
49704984
);
@@ -6346,7 +6360,7 @@
63466360
isa = XCRemoteSwiftPackageReference;
63476361
repositoryURL = "https://github.com/nextcloud/NextcloudKit";
63486362
requirement = {
6349-
branch = 7.3.2;
6363+
branch = main;
63506364
kind = branch;
63516365
};
63526366
};

iOSClient/Assistant/NCAssistantModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class NCAssistantModel {
4343
self.session = NCSession.shared.getSession(controller: controller)
4444
let capabilities = NCNetworking.shared.capabilities[session.account] ?? NKCapabilities.Capabilities()
4545

46-
useV2 = capabilities.serverVersionMajor >= NCGlobal.shared.nextcloudVersion30
46+
useV2 = NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v30)
4747
loadAllTypes()
4848
}
4949

iOSClient/Data/NCManageDatabase+Metadata.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,22 @@ extension NCManageDatabase {
10281028
}
10291029
}
10301030

1031+
func getOwnerDisplayName(account: String?, ownerId: String?) async -> String? {
1032+
guard let account = account.isNotEmpty,
1033+
let ownerId = ownerId.isNotEmpty else {
1034+
return nil
1035+
}
1036+
1037+
return await core.performRealmReadAsync { realm in
1038+
let ownerDisplayName = realm.objects(tableMetadata.self)
1039+
.filter("account == %@ AND ownerId == %@", account, ownerId)
1040+
.first?
1041+
.ownerDisplayName
1042+
1043+
return ownerDisplayName.isNotEmpty
1044+
}
1045+
}
1046+
10311047
/// Asynchronously retrieves the metadata for a folder, based on its session and serverUrl.
10321048
/// Handles the home directory case rootFileName) and detaches the Realm object before returning.
10331049
func getMetadataFolderAsync(session: NCSession.Session, serverUrl: String) async -> tableMetadata? {

iOSClient/Data/NCMetadataTranfersSuccess.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ actor NCMetadataTranfersSuccess {
3030
delegates.removeAll { $0 as AnyObject === delegate as AnyObject }
3131
}
3232

33-
func append(metadata: tableMetadata, ocId: String, date: Date?, etag: String?) async {
33+
func append(metadata: tableMetadata,
34+
ocId: String,
35+
date: Date?,
36+
etag: String?,
37+
ownerId: String? = nil,
38+
permissions: String? = nil) async {
3439
let status = metadata.status
3540

3641
metadata.ocId = ocId
@@ -42,6 +47,17 @@ actor NCMetadataTranfersSuccess {
4247
metadata.fileId = fileId
4348
}
4449

50+
if let ownerId = ownerId.isNotEmpty {
51+
metadata.ownerId = ownerId
52+
if let ownerDisplayName = await NCManageDatabase.shared.getOwnerDisplayName(account: metadata.account, ownerId: ownerId) {
53+
metadata.ownerDisplayName = ownerDisplayName
54+
}
55+
}
56+
57+
if let permissions = permissions.isNotEmpty {
58+
metadata.permissions = permissions
59+
}
60+
4561
metadata.session = ""
4662
metadata.sessionError = ""
4763
metadata.sessionTaskIdentifier = 0

iOSClient/Extensions/Optional+Extension.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,11 @@ extension Optional where Wrapped: Collection {
2828
var isEmptyOrNil: Bool {
2929
return self?.isEmpty ?? true
3030
}
31+
32+
var isNotEmpty: Wrapped? {
33+
guard let value = self, !value.isEmpty else {
34+
return nil
35+
}
36+
return value
37+
}
3138
}

iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ extension NCCollectionViewCommon: UICollectionViewDelegate {
7878
await banner.dismissAsync()
7979
}
8080

81-
if results.nkError == .success || results.afError?.isExplicitlyCancelledError ?? false {
81+
if results.nkError == .success || results.nkError == .cancelled {
8282
print("ok")
8383
} else {
8484
await showErrorBanner(windowScene: windowScene, text: results.nkError.errorDescription, errorCode: results.nkError.errorCode)

iOSClient/Main/Collection Common/NCCollectionViewCommon+Search.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extension NCCollectionViewCommon {
2929
setSearchBarLoading(true)
3030
networkSearchInProgress = true
3131

32-
if capabilities.serverVersionMajor >= global.nextcloudVersion20 {
32+
if NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v20) {
3333
await unifiedSearch(text: text)
3434
} else {
3535
await searchLiteral(text: text)

iOSClient/Main/Create/Upload Assets/NCUploadAssetsModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class NCUploadAssetsModel: ObservableObject, NCCreateFormUploadConflictDelegate
172172
self.uploadInProgress.toggle()
173173
return
174174
}
175-
let autoMkcol = capabilities.serverVersionMajor >= NCGlobal.shared.nextcloudVersion33
175+
let autoMkcol = NCBrandOptions.shared.isServerVersion(capabilities, greaterOrEqualTo: .v33)
176176

177177
func createProcessUploads() {
178178
if !self.dismissView {

0 commit comments

Comments
 (0)