Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 8 additions & 0 deletions Cryptomator.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
4A09E54E27071F4F0056D32A /* ErrorMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A09E54D27071F4F0056D32A /* ErrorMapper.swift */; };
4A0C07E225AC80C100B83211 /* UIView+Preview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A0C07E125AC80C100B83211 /* UIView+Preview.swift */; };
4A0C07EB25AC832900B83211 /* VaultListPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A0C07EA25AC832900B83211 /* VaultListPosition.swift */; };
4A0EAAD2296F604200E27B56 /* SessionTaskRegistratorMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A0EAAD1296F604200E27B56 /* SessionTaskRegistratorMock.swift */; };
4A123EA824BEF5F0001D1CF7 /* CloudProviderPaginationMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A123EA724BEF5F0001D1CF7 /* CloudProviderPaginationMock.swift */; };
4A136124276767D60077EB7F /* Snapshots.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A136123276767D60077EB7F /* Snapshots.swift */; };
4A13612D276768000077EB7F /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A13612C276768000077EB7F /* SnapshotHelper.swift */; };
Expand Down Expand Up @@ -190,6 +191,7 @@
4A717CD924C835740048E08F /* ReparentTaskManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A717CD824C835740048E08F /* ReparentTaskManagerTests.swift */; };
4A74337A28B3E3AB00AECD21 /* WebDAVAuthentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A74337928B3E3AB00AECD21 /* WebDAVAuthentication.swift */; };
4A74DBB1282132EC00A332C4 /* FileProviderAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A74DBB0282132EC00A332C4 /* FileProviderAction.swift */; };
4A7514A12937F777002E802E /* SessionTaskRegistrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A7514A02937F777002E802E /* SessionTaskRegistrator.swift */; };
4A753DB92678A226005F79C1 /* OpenExistingLegacyVaultPasswordViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A753DB82678A226005F79C1 /* OpenExistingLegacyVaultPasswordViewModel.swift */; };
4A773907286D86C20006B3C3 /* S3AuthenticationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A773906286D86C20006B3C3 /* S3AuthenticationViewModel.swift */; };
4A773909286D87AB0006B3C3 /* S3AuthenticationViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A773908286D87AB0006B3C3 /* S3AuthenticationViewModelTests.swift */; };
Expand Down Expand Up @@ -545,6 +547,7 @@
4A09E54D27071F4F0056D32A /* ErrorMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorMapper.swift; sourceTree = "<group>"; };
4A0C07E125AC80C100B83211 /* UIView+Preview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Preview.swift"; sourceTree = "<group>"; };
4A0C07EA25AC832900B83211 /* VaultListPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VaultListPosition.swift; sourceTree = "<group>"; };
4A0EAAD1296F604200E27B56 /* SessionTaskRegistratorMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionTaskRegistratorMock.swift; sourceTree = "<group>"; };
4A123EA724BEF5F0001D1CF7 /* CloudProviderPaginationMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudProviderPaginationMock.swift; sourceTree = "<group>"; };
4A136121276767D60077EB7F /* Snapshots.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Snapshots.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
4A136123276767D60077EB7F /* Snapshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Snapshots.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -715,6 +718,7 @@
4A717CD824C835740048E08F /* ReparentTaskManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReparentTaskManagerTests.swift; sourceTree = "<group>"; };
4A74337928B3E3AB00AECD21 /* WebDAVAuthentication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebDAVAuthentication.swift; sourceTree = "<group>"; };
4A74DBB0282132EC00A332C4 /* FileProviderAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileProviderAction.swift; sourceTree = "<group>"; };
4A7514A02937F777002E802E /* SessionTaskRegistrator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionTaskRegistrator.swift; sourceTree = "<group>"; };
4A753DB82678A226005F79C1 /* OpenExistingLegacyVaultPasswordViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenExistingLegacyVaultPasswordViewModel.swift; sourceTree = "<group>"; };
4A753FBB2832A371006A9C3F /* CryptomatorIntents.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = CryptomatorIntents.entitlements; sourceTree = "<group>"; };
4A773906286D86C20006B3C3 /* S3AuthenticationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = S3AuthenticationViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1716,6 +1720,7 @@
4AA782E3282A9007001A71E3 /* NSFileProviderDomainProviderMock.swift */,
4AEECD3A279EB24300C6E2B5 /* NSFileProviderEnumerationObserverMock.swift */,
4AFBFA172829414A00E30818 /* ProgressManagerMock.swift */,
4A0EAAD1296F604200E27B56 /* SessionTaskRegistratorMock.swift */,
4ADC66C627A95E67002E6CC7 /* UnlockMonitorTaskExecutorMock.swift */,
4AAD444627E26D1800D16707 /* UploadTaskManagerMock.swift */,
4AEECD30279EA50D00C6E2B5 /* WorkingSetObservingMock.swift */,
Expand Down Expand Up @@ -1893,6 +1898,7 @@
4AEE6EE92825716400E1B35E /* ProgressManager.swift */,
4AC1157527F5BD890023F51B /* Promise+AllIgnoringResult.swift */,
4ADD233F26737CD400374E4E /* RootFileProviderItem.swift */,
4A7514A02937F777002E802E /* SessionTaskRegistrator.swift */,
4ADC66C027A7F426002E6CC7 /* UnlockMonitor.swift */,
740375F52587AEB50023FF53 /* URL+NameCollisionExtension.swift */,
4A74DBAF2821312200A332C4 /* Actions */,
Expand Down Expand Up @@ -2564,6 +2570,7 @@
4AA782E4282A9007001A71E3 /* NSFileProviderDomainProviderMock.swift in Sources */,
4A9C8DFD27A007C2000063E4 /* FileProviderNotificatorTests.swift in Sources */,
4AB1C325265CE69700DC7A49 /* DownloadTaskExecutorTests.swift in Sources */,
4A0EAAD2296F604200E27B56 /* SessionTaskRegistratorMock.swift in Sources */,
4AEECD3B279EB24300C6E2B5 /* NSFileProviderEnumerationObserverMock.swift in Sources */,
4A8F149C266A29E400ADBCE4 /* OnlineItemNameCollisionHandlerTests.swift in Sources */,
4A8F14A2266A302A00ADBCE4 /* FileProviderAdapterTestCase.swift in Sources */,
Expand Down Expand Up @@ -2925,6 +2932,7 @@
4AB1D4EC27D0E027009060AB /* LocalURLProviderType.swift in Sources */,
4A511D4E2660FF9E000A0E01 /* WorkflowScheduler.swift in Sources */,
4AD9481A2909A66900072110 /* MaintenanceModeHelperServiceSource.swift in Sources */,
4A7514A12937F777002E802E /* SessionTaskRegistrator.swift in Sources */,
4A2482352671110A002D9F59 /* DBManagerError.swift in Sources */,
4AA2531B28216E45003B45EE /* ServiceSource.swift in Sources */,
4A2060D5279AF67C00DA6C62 /* WorkingSetObserver.swift in Sources */,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion CryptomatorCommon/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ let package = Package(
)
],
dependencies: [
.package(url: "https://github.com/cryptomator/cloud-access-swift.git", .upToNextMinor(from: "1.6.0")),
.package(url: "https://github.com/cryptomator/cloud-access-swift.git", .upToNextMinor(from: "1.7.0")),
.package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack.git", .upToNextMinor(from: "3.8.0"))
],
targets: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public class LocalizedCloudProviderDecorator: CloudProvider {
}
}

public func downloadFile(from cloudPath: CloudPath, to localURL: URL) -> Promise<Void> {
return delegate.downloadFile(from: cloudPath, to: localURL).recover { error -> Void in
public func downloadFile(from cloudPath: CloudPath, to localURL: URL, onTaskCreation: ((URLSessionDownloadTask?) -> Void)?) -> Promise<Void> {
return delegate.downloadFile(from: cloudPath, to: localURL, onTaskCreation: onTaskCreation).recover { error -> Void in
if let error = error as? CloudProviderError {
switch error {
case .itemAlreadyExists:
Expand All @@ -53,8 +53,8 @@ public class LocalizedCloudProviderDecorator: CloudProvider {
}
}

public func uploadFile(from localURL: URL, to cloudPath: CloudPath, replaceExisting: Bool) -> Promise<CloudItemMetadata> {
return delegate.uploadFile(from: localURL, to: cloudPath, replaceExisting: replaceExisting).recover { error -> CloudItemMetadata in
public func uploadFile(from localURL: URL, to cloudPath: CloudPath, replaceExisting: Bool, onTaskCreation: ((URLSessionUploadTask?) -> Void)?) -> Promise<CloudItemMetadata> {
return delegate.uploadFile(from: localURL, to: cloudPath, replaceExisting: replaceExisting, onTaskCreation: onTaskCreation).recover { error -> CloudItemMetadata in
if let error = error as? CloudProviderError {
switch error {
case .itemNotFound, .itemTypeMismatch:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import CryptomatorCloudAccessCore
import Foundation
import PCloudSDKSwift

public protocol CloudProviderManager {
func getProvider(with accountUID: String) throws -> CloudProvider
Expand Down Expand Up @@ -60,8 +61,7 @@ public class CloudProviderDBManager: CloudProviderManager, CloudProviderUpdating
useBackgroundSession: useBackgroundSession,
maxPageSize: useBackgroundSession ? maxPageSizeForFileProvider : .max)
case .pCloud:
let credential = try PCloudCredential(userID: accountUID)
provider = try PCloudCloudProvider(credential: credential)
provider = try createPCloudProvider(for: accountUID)
case .webDAV:
guard let credential = WebDAVCredentialManager.shared.getCredentialFromKeychain(with: accountUID) else {
throw CloudProviderAccountError.accountNotFoundError
Expand Down Expand Up @@ -96,6 +96,17 @@ public class CloudProviderDBManager: CloudProviderManager, CloudProviderUpdating
}
}

private func createPCloudProvider(for accountUID: String) throws -> CloudProvider {
let credential = try PCloudCredential(userID: accountUID)
let client: PCloudClient
if useBackgroundSession {
client = PCloud.createBackgroundClient(with: credential.user, sharedContainerIdentifier: CryptomatorConstants.appGroupName)
} else {
client = PCloud.createClient(with: credential.user)
}
return try PCloudCloudProvider(client: client)
}

public func providerShouldUpdate(with accountUID: String) {
CloudProviderDBManager.cachedProvider[accountUID] = nil
// call XPCService for FileProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ final class CloudProviderMock: CloudProvider {
}
}

func downloadFile(from cloudPath: CloudPath, to localURL: URL) -> Promise<Void> {
func downloadFile(from cloudPath: CloudPath, to localURL: URL, onTaskCreation: ((URLSessionDownloadTask?) -> Void)?) -> Promise<Void> {
if let error = downloadFileFromToThrowableError {
return Promise(error)
}
Expand All @@ -136,7 +136,7 @@ final class CloudProviderMock: CloudProvider {
var uploadFileFromToReplaceExistingReturnValue: Promise<CloudItemMetadata>!
var uploadFileFromToReplaceExistingClosure: ((URL, CloudPath, Bool) -> Promise<CloudItemMetadata>)?

func uploadFile(from localURL: URL, to cloudPath: CloudPath, replaceExisting: Bool) -> Promise<CloudItemMetadata> {
func uploadFile(from localURL: URL, to cloudPath: CloudPath, replaceExisting: Bool, onTaskCreation: ((URLSessionUploadTask?) -> Void)?) -> Promise<CloudItemMetadata> {
if let error = uploadFileFromToReplaceExistingThrowableError {
return Promise(error)
}
Expand Down
3 changes: 3 additions & 0 deletions CryptomatorFileProvider/CloudTask/DownloadTask.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ import GRDB
struct DownloadTask: CloudTask {
let taskRecord: DownloadTaskRecord
let itemMetadata: ItemMetadata
let onURLSessionTaskCreation: URLSessionTaskCreationClosure?

enum CodingKeys: String, CodingKey {
case taskRecord = "downloadTask"
case itemMetadata
}
}

typealias URLSessionTaskCreationClosure = (URLSessionTask) -> Void
9 changes: 3 additions & 6 deletions CryptomatorFileProvider/CloudTask/UploadTask.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@
// Copyright © 2020 Skymatic GmbH. All rights reserved.
//

import Foundation
import GRDB

struct UploadTask: CloudTask, FetchableRecord, Decodable {
struct UploadTask: CloudTask {
let taskRecord: UploadTaskRecord
let itemMetadata: ItemMetadata

enum CodingKeys: String, CodingKey {
case taskRecord = "uploadTask"
case itemMetadata
}
let onURLSessionTaskCreation: URLSessionTaskCreationClosure?
}
6 changes: 3 additions & 3 deletions CryptomatorFileProvider/DB/DownloadTaskDBManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation
import GRDB

protocol DownloadTaskManager {
func createTask(for item: ItemMetadata, replaceExisting: Bool, localURL: URL) throws -> DownloadTask
func createTask(for item: ItemMetadata, replaceExisting: Bool, localURL: URL, onURLSessionTaskCreation: URLSessionTaskCreationClosure?) throws -> DownloadTask
func removeTaskRecord(_ task: DownloadTaskRecord) throws
}

Expand All @@ -24,11 +24,11 @@ class DownloadTaskDBManager: DownloadTaskManager {
}
}

func createTask(for item: ItemMetadata, replaceExisting: Bool, localURL: URL) throws -> DownloadTask {
func createTask(for item: ItemMetadata, replaceExisting: Bool, localURL: URL, onURLSessionTaskCreation: URLSessionTaskCreationClosure?) throws -> DownloadTask {
try database.write { db in
let taskRecord = DownloadTaskRecord(correspondingItem: item.id!, replaceExisting: replaceExisting, localURL: localURL)
try taskRecord.save(db)
return DownloadTask(taskRecord: taskRecord, itemMetadata: item)
return DownloadTask(taskRecord: taskRecord, itemMetadata: item, onURLSessionTaskCreation: onURLSessionTaskCreation)
}
}

Expand Down
6 changes: 3 additions & 3 deletions CryptomatorFileProvider/DB/UploadTaskDBManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ protocol UploadTaskManager {
func updateTaskRecord(_ task: inout UploadTaskRecord, error: NSError) throws
func getCorrespondingTaskRecords(ids: [Int64]) throws -> [UploadTaskRecord?]
func removeTaskRecord(for id: Int64) throws
func getTask(for uploadTask: UploadTaskRecord) throws -> UploadTask
func getTask(for uploadTask: UploadTaskRecord, onURLSessionTaskCreation: URLSessionTaskCreationClosure?) throws -> UploadTask
}

extension UploadTaskManager {
Expand Down Expand Up @@ -115,12 +115,12 @@ class UploadTaskDBManager: UploadTaskManager {
}
}

func getTask(for uploadTask: UploadTaskRecord) throws -> UploadTask {
func getTask(for uploadTask: UploadTaskRecord, onURLSessionTaskCreation: URLSessionTaskCreationClosure?) throws -> UploadTask {
try database.read { db in
guard let itemMetadata = try uploadTask.itemMetadata.fetchOne(db) else {
throw DBManagerError.missingItemMetadata
}
return UploadTask(taskRecord: uploadTask, itemMetadata: itemMetadata)
return UploadTask(taskRecord: uploadTask, itemMetadata: itemMetadata, onURLSessionTaskCreation: onURLSessionTaskCreation)
}
}
}
Loading