Skip to content

Commit

Permalink
cod (#3078)
Browse files Browse the repository at this point in the history
Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
  • Loading branch information
marinofaggiana authored Sep 26, 2024
1 parent 0c05e6b commit 98188a2
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 91 deletions.
2 changes: 1 addition & 1 deletion Share/NCShareExtension+Files.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ extension NCShareExtension {
NCNetworking.shared.readFolder(serverUrl: serverUrl, account: session.account) { task in
self.dataSourceTask = task
self.collectionView.reloadData()
} completion: { _, metadataFolder, _, _, _, error in
} completion: { _, metadataFolder, _, error in
DispatchQueue.main.async {
if error != .success {
self.showAlert(description: error.errorDescription)
Expand Down
24 changes: 6 additions & 18 deletions iOSClient/Data/NCManageDatabase+Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -751,34 +751,22 @@ extension NCManageDatabase {
}
}

@discardableResult
func updateMetadatas(_ metadatas: [tableMetadata], predicate: NSPredicate) -> (metadatasDifferentCount: Int, metadatasModified: Int) {
var metadatasDifferentCount: Int = 0
var metadatasModified: Int = 0

func updateFilesMetadatas(_ metadatas: [tableMetadata], serverUrl: String, account: String) {
do {
let realm = try Realm()
try realm.write {
let results = realm.objects(tableMetadata.self).filter(predicate)
metadatasDifferentCount = metadatas.count - results.count
let results = realm.objects(tableMetadata.self).filter(NSPredicate(format: "account == %@ AND serverUrl == %@ AND status == %d", account, serverUrl, NCGlobal.shared.metadataStatusNormal))
realm.delete(results)
for metadata in metadatas {
if let result = results.first(where: { $0.ocId == metadata.ocId }) {
// before realm.add copy the value not available from server
metadata.assetLocalIdentifier = result.assetLocalIdentifier
if !metadata.isEqual(result) { metadatasModified += 1 }
}
}
if metadatasDifferentCount != 0 || metadatasModified > 0 {
realm.delete(results)
for metadata in metadatas {
realm.add(tableMetadata(value: metadata), update: .all)
if realm.objects(tableMetadata.self).filter(NSPredicate(format: "ocId == %@ AND status != %d", metadata.ocId, NCGlobal.shared.metadataStatusNormal)).first != nil {
continue
}
realm.add(tableMetadata(value: metadata), update: .all)
}
}
} catch let error {
NextcloudKit.shared.nkCommonInstance.writeLog("[ERROR] Could not write to database: \(error)")
}
return (metadatasDifferentCount, metadatasModified)
}

// MARK: - GetMetadata
Expand Down
116 changes: 57 additions & 59 deletions iOSClient/Files/NCFiles.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,19 +157,19 @@ class NCFiles: NCCollectionViewCommon {

super.reloadDataSourceNetwork()

networkReadFolder { tableDirectory, metadatas, metadatasDifferentCount, metadatasModified, error in
networkReadFolder { tableDirectory, metadatas, reloadDataSource, error in
DispatchQueue.main.async {
if error == .success {
for metadata in metadatas ?? [] where !metadata.directory && downloadMetadata(metadata) {
if NCNetworking.shared.downloadQueue.operations.filter({ ($0 as? NCOperationDownload)?.metadata.ocId == metadata.ocId }).isEmpty {
NCNetworking.shared.downloadQueue.addOperation(NCOperationDownload(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile))
}
}

self.richWorkspaceText = tableDirectory?.richWorkspace
if metadatasDifferentCount != 0 || metadatasModified != 0 {

if reloadDataSource {
self.reloadDataSource()
} else {
self.reloadDataSource(withQueryDB: withQueryDB)
}
} else {
self.reloadDataSource(withQueryDB: withQueryDB)
Expand All @@ -178,82 +178,80 @@ class NCFiles: NCCollectionViewCommon {
}
}

private func networkReadFolder(completion: @escaping (_ tableDirectory: tableDirectory?, _ metadatas: [tableMetadata]?, _ metadatasDifferentCount: Int, _ metadatasModified: Int, _ error: NKError) -> Void) {
private func networkReadFolder(completion: @escaping (_ tableDirectory: tableDirectory?, _ metadatas: [tableMetadata]?, _ reloadDataSource: Bool, _ error: NKError) -> Void) {
var tableDirectory: tableDirectory?

NCNetworking.shared.readFile(serverUrlFileName: serverUrl, account: session.account) { task in
self.dataSourceTask = task
self.collectionView.reloadData()
} completion: { account, metadata, error in
guard error == .success, let metadata else {
return completion(nil, nil, 0, 0, error)
return completion(nil, nil, false, error)
}
tableDirectory = self.database.setDirectory(serverUrl: self.serverUrl, richWorkspace: metadata.richWorkspace, account: account)
// swiftlint:disable empty_string
let forceReplaceMetadatas = tableDirectory?.etag == ""
// swiftlint:enable empty_string

if tableDirectory?.etag != metadata.etag || metadata.e2eEncrypted {
NCNetworking.shared.readFolder(serverUrl: self.serverUrl,
account: metadata.account,
forceReplaceMetadatas: forceReplaceMetadatas) { task in
self.dataSourceTask = task
self.collectionView.reloadData()
} completion: { account, metadataFolder, metadatas, metadatasDifferentCount, metadatasModified, error in
guard error == .success else {
return completion(tableDirectory, nil, 0, 0, error)
}
self.metadataFolder = metadataFolder
// E2EE
if let metadataFolder = metadataFolder,
metadataFolder.e2eEncrypted,
NCKeychain().isEndToEndEnabled(account: account),
!NCNetworkingE2EE().isInUpload(account: account, serverUrl: self.serverUrl) {
let lock = self.database.getE2ETokenLock(account: account, serverUrl: self.serverUrl)
NCNetworkingE2EE().getMetadata(fileId: metadataFolder.ocId, e2eToken: lock?.e2eToken, account: account) { account, version, e2eMetadata, signature, _, error in
if error == .success, let e2eMetadata = e2eMetadata {
let error = NCEndToEndMetadata().decodeMetadata(e2eMetadata, signature: signature, serverUrl: self.serverUrl, session: self.session)
if error == .success {
if version == "v1", NCCapabilities.shared.getCapabilities(account: account).capabilityE2EEApiVersion == NCGlobal.shared.e2eeVersionV20 {
NextcloudKit.shared.nkCommonInstance.writeLog("[E2EE] Conversion v1 to v2")
NCActivityIndicator.shared.start()
Task {
let serverUrl = metadataFolder.serverUrl + "/" + metadataFolder.fileName
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, updateVersionV1V2: true, account: account)
if error != .success {
NCContentPresenter().showError(error: error)
}
NCActivityIndicator.shared.stop()
self.reloadDataSource()
}
} else {
self.reloadDataSource()
}
} else {
// Client Diagnostic
self.database.addDiagnostic(account: account, issue: NCGlobal.shared.diagnosticIssueE2eeErrors)
NCContentPresenter().showError(error: error)
}
} else if error.errorCode == NCGlobal.shared.errorResourceNotFound {
// no metadata found, send a new metadata
guard tableDirectory?.etag != metadata.etag || metadata.e2eEncrypted else {
return completion(tableDirectory, nil, false, NKError())
}

NCNetworking.shared.readFolder(serverUrl: self.serverUrl,
account: metadata.account) { task in
self.dataSourceTask = task
self.collectionView.reloadData()
} completion: { account, metadataFolder, metadatas, error in
guard error == .success else {
return completion(tableDirectory, nil, false, error)
}
self.metadataFolder = metadataFolder

/// E2EE
guard let metadataFolder = metadataFolder,
metadataFolder.e2eEncrypted,
NCKeychain().isEndToEndEnabled(account: account),
!NCNetworkingE2EE().isInUpload(account: account, serverUrl: self.serverUrl) else {
return completion(tableDirectory, metadatas, true, error)
}

let lock = self.database.getE2ETokenLock(account: account, serverUrl: self.serverUrl)
NCNetworkingE2EE().getMetadata(fileId: metadataFolder.ocId, e2eToken: lock?.e2eToken, account: account) { account, version, e2eMetadata, signature, _, error in

if error == .success, let e2eMetadata = e2eMetadata {
let error = NCEndToEndMetadata().decodeMetadata(e2eMetadata, signature: signature, serverUrl: self.serverUrl, session: self.session)

if error == .success {
if version == "v1", NCCapabilities.shared.getCapabilities(account: account).capabilityE2EEApiVersion == NCGlobal.shared.e2eeVersionV20 {
NextcloudKit.shared.nkCommonInstance.writeLog("[E2EE] Conversion v1 to v2")
NCActivityIndicator.shared.start()
Task {
let serverUrl = metadataFolder.serverUrl + "/" + metadataFolder.fileName
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, account: account)
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, updateVersionV1V2: true, account: account)
if error != .success {
NCContentPresenter().showError(error: error)
}
NCActivityIndicator.shared.stop()
self.reloadDataSource()
}
} else {
NCContentPresenter().showError(error: NKError(errorCode: NCGlobal.shared.errorE2EEKeyDecodeMetadata, errorDescription: "_e2e_error_"))
self.reloadDataSource()
}
} else {
// Client Diagnostic
self.database.addDiagnostic(account: account, issue: NCGlobal.shared.diagnosticIssueE2eeErrors)
NCContentPresenter().showError(error: error)
}
} else if error.errorCode == NCGlobal.shared.errorResourceNotFound {
// no metadata found, send a new metadata
Task {
let serverUrl = metadataFolder.serverUrl + "/" + metadataFolder.fileName
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, account: account)
if error != .success {
NCContentPresenter().showError(error: error)
}
completion(tableDirectory, metadatas, metadatasDifferentCount, metadatasModified, error)
}
} else {
completion(tableDirectory, metadatas, metadatasDifferentCount, metadatasModified, error)
NCContentPresenter().showError(error: NKError(errorCode: NCGlobal.shared.errorE2EEKeyDecodeMetadata, errorDescription: "_e2e_error_"))
}
completion(tableDirectory, metadatas, true, error)
}
} else {
completion(tableDirectory, nil, 0, 0, NKError())
}
}
}
Expand Down
16 changes: 4 additions & 12 deletions iOSClient/Networking/NCNetworking+WebDAV.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@ extension NCNetworking {

func readFolder(serverUrl: String,
account: String,
forceReplaceMetadatas: Bool = false,
taskHandler: @escaping (_ task: URLSessionTask) -> Void = { _ in },
completion: @escaping (_ account: String, _ metadataFolder: tableMetadata?, _ metadatas: [tableMetadata]?, _ metadatasDifferentCount: Int, _ metadatasModified: Int, _ error: NKError) -> Void) {
completion: @escaping (_ account: String, _ metadataFolder: tableMetadata?, _ metadatas: [tableMetadata]?, _ error: NKError) -> Void) {
NextcloudKit.shared.readFileOrFolder(serverUrlFileName: serverUrl,
depth: "1",
showHiddenFiles: NCKeychain().showHiddenFiles,
Expand All @@ -43,7 +42,7 @@ extension NCNetworking {
taskHandler(task)
} completion: { account, files, _, error in
guard error == .success, let files else {
return completion(account, nil, nil, 0, 0, error)
return completion(account, nil, nil, error)
}

self.database.convertFilesToMetadatas(files, useFirstAsMetadataFolder: true) { metadataFolder, metadatas in
Expand All @@ -58,15 +57,8 @@ extension NCNetworking {
serverUrl: serverUrl,
account: metadataFolder.account)

let predicate = NSPredicate(format: "account == %@ AND serverUrl == %@ AND status == %d", account, serverUrl, self.global.metadataStatusNormal)

if forceReplaceMetadatas {
self.database.replaceMetadata(metadatas, predicate: predicate)
completion(account, metadataFolder, metadatas, 1, 1, error)
} else {
let results = self.database.updateMetadatas(metadatas, predicate: predicate)
completion(account, metadataFolder, metadatas, results.metadatasDifferentCount, results.metadatasModified, error)
}
self.database.updateFilesMetadatas(metadatas, serverUrl: serverUrl, account: account)
completion(account, metadataFolder, metadatas, error)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion iOSClient/Select/NCSelect.swift
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ extension NCSelect {
NCNetworking.shared.readFolder(serverUrl: serverUrl, account: session.account) { task in
self.dataSourceTask = task
self.collectionView.reloadData()
} completion: { _, _, _, _, _, error in
} completion: { _, _, _, error in
DispatchQueue.main.async {
if error != .success {
NCContentPresenter().showError(error: error)
Expand Down

0 comments on commit 98188a2

Please sign in to comment.