Skip to content

Commit

Permalink
Merge tag '2.6.0' into develop
Browse files Browse the repository at this point in the history
# -----BEGIN SSH SIGNATURE-----
# U1NIU0lHAAAAAQAAAhcAAAAHc3NoLXJzYQAAAAMBAAEAAAIBAKgu9N6lXOixsGNEmzxZhA
# Rc8ABi3MlOHGT30s3zCQEtvbE/j1QXRycgru5n/TZPKiEqZz5OGLM7FG3lNqHTjrQG1jfZ
# rH9JfmTRX9kLWyDmsiKJkB0L19NcCJQKwhkAdcJkbhQHP4bk1o3uMS+M89n6Y0nmUocGrk
# j7yX/79iQn7PQXdDRk7I+p0p1hCMC7fRlhxPwBX8iPOoty9L75ZoteRoWMGoq4T2fhDdUd
# 5ASRKfdVDjUnFrYvI+o8mhXdbzxNLjp5oN9VWQsb+YIkzApcI1+42BT5WABk+3cLlheqPR
# SocNgYdoZZPA1x6Zlzy2gggm33m/uU7gww2iATphdoyXoj1Nv9loMDOaCQUe6s7Fnnn+xH
# hC1fJoCRlrWJ2QjQmZj18KkrXp2/ZNfvLYUIoQVONF40iizb5GJewH00m1ZV+/oAqbJ/W1
# nfLmXJ/ShwACe3hyZFVOaB2582UyTDFCFJL2Bgbiw8y1ayS15+gs9TkFJlAtbpwofPqVB2
# 16iiE8ViFf//J5ommM1S2sHXaPvu1D038OScIGnz0grhnCjzBr3BduW7EYQ6RhVOqMaEUy
# mQiRKIAtfj+6eHgk3IxB3ynReUFQqE3wreE9buA0vrCO4aWEet+qJsg+395K+/l7E6LQOg
# 5rkgcVj9rtFeo4gFBT2AUUSLmHaqpfABAAAAA2dpdAAAAAAAAAAGc2hhNTEyAAACFAAAAA
# xyc2Etc2hhMi0yNTYAAAIAdV9LMPJ0IZnk7Fd3Rfk9p5Z69GSnbSaEFxxEYLCT7IZjSqmJ
# laj24T2EzNcMGcZCD2CbA9wOuErVokUfKHoiStitS5RUJ7/pKEKxiI+vQRl4OJToPpLxhh
# YG670umwnWPiqJ0gZsgD0yF9NC6YUXWWmXUCJmlLArE58yrDXkkcNvq/6T3lbJ26GCHLpc
# LbmqZ11JXn3nhQI3kIm+qgegAYgrj0Y467J4zSNSGnqXw+8pTywbCM+DHrXUT+d0fxl5a7
# a8L65k+D6QRWweVpQ3nLCfPNuLzIyehzakI4NlTNfteq8chjN140CX4cyDbzbDm1xkqIuz
# UxNfqCxEiPwpX39UrljmnHvfUCkpc59M39dU1EIDA2qmjXExR3jOCTvj1kjn6CNV+O8ztV
# yYiqBVTuH236eFC2r6v4m9xtpDvgtqsRxEus9gj3KQE+V2tRppsgzxJicAImgYk680Jp4M
# uA2Vcn8HRbDbfSexbzVIzIf8EhAyuBTNJDC20O1GFQ0Rdv1h8rpePPU37/WXIblvGgFt0p
# 8LlPelrdAaX/QPrH9LvRbj/Y2LPvU6PvLihXhMhSOMiByKvf3vqY76xWTgcYymvaYp9m9z
# mp/vTh/IIq/4jzGIuSrH0aHxf2NMlHlPz/UNKfePp0XkoEtErPNkK94H0v0P5eJveuW095
# iNiJY=
# -----END SSH SIGNATURE-----
# gpg verification failed.
  • Loading branch information
tobihagemann committed Sep 13, 2024
2 parents 6ed4454 + 59d83fe commit fb56c6a
Show file tree
Hide file tree
Showing 17 changed files with 78 additions and 84 deletions.
4 changes: 2 additions & 2 deletions Cryptomator.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3320,7 +3320,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MARKETING_VERSION = 2.5.2;
MARKETING_VERSION = 2.6.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
Expand Down Expand Up @@ -3382,7 +3382,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MARKETING_VERSION = 2.5.2;
MARKETING_VERSION = 2.6.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=200 -Xfrontend -warn-long-function-bodies=200";
Expand Down
22 changes: 18 additions & 4 deletions Cryptomator/Snapshots/SnapshotCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#if SNAPSHOTS
import CryptomatorCommonCore
import Dependencies
import FileProvider
import Foundation
import LocalAuthentication
Expand All @@ -31,9 +32,7 @@ class SnapshotCoordinator: MainCoordinator {
}

override func showVaultDetail(for vaultInfo: VaultInfo) {
let snapshotFileProviderConnectorMock = SnapshotFileProviderConnectorMock()
snapshotFileProviderConnectorMock.proxy = SnapshotVaultLockingMock()
let viewModel = VaultDetailViewModel(vaultInfo: vaultInfo, vaultManager: VaultDBManager.shared, fileProviderConnector: snapshotFileProviderConnectorMock, passwordManager: SnapshotVaultPasswordManagerMock(), dbManager: DatabaseManager.shared, vaultKeepUnlockedSettings: SnapshotVaultKeepUnlockedSettings())
let viewModel = VaultDetailViewModel(vaultInfo: vaultInfo, vaultManager: VaultDBManager.shared, passwordManager: SnapshotVaultPasswordManagerMock(), dbManager: DatabaseManager.shared, vaultKeepUnlockedSettings: SnapshotVaultKeepUnlockedSettings())
let vaultDetailViewController = VaultDetailViewController(viewModel: viewModel)
let detailNavigationController = BaseNavigationController(rootViewController: vaultDetailViewController)
rootViewController.showDetailViewController(detailNavigationController, sender: nil)
Expand All @@ -57,8 +56,23 @@ class SnapshotCoordinator: MainCoordinator {
}
}

private enum FileProviderConnectorKey: DependencyKey {
static var liveValue: FileProviderConnector = SnapshotFileProviderConnectorMock()
#if DEBUG
static var testValue: FileProviderConnector = SnapshotFileProviderConnectorMock()
#endif
}

public extension DependencyValues {
var fileProviderConnector: FileProviderConnector {
get { self[FileProviderConnectorKey.self] }
set { self[FileProviderConnectorKey.self] = newValue }
}
}

private class SnapshotFileProviderConnectorMock: FileProviderConnector {
var proxy: Any?
let proxy = SnapshotVaultLockingMock()

func getXPC<T>(serviceName: NSFileProviderServiceName, domain: NSFileProviderDomain?) -> Promise<XPC<T>> {
return getCastedProxy()
}
Expand Down
7 changes: 3 additions & 4 deletions FileProviderExtension/FileProviderExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,9 @@ class FileProviderExtension: NSFileProviderExtension {
#if SNAPSHOTS
let snapshotVaultPath = CloudPath(LocalizedString.getValue("snapshots.main.vault1"))
let snapshotDomain = NSFileProviderDomain(vaultUID: "12345", displayName: snapshotVaultPath.lastPathComponent)
serviceSources.append(VaultUnlockingServiceSourceSnapshotMock(domain: snapshotDomain,
notificator: notificator,
dbPath: dbPath,
delegate: LocalURLProvider(domain: snapshotDomain)))
if let manager = NSFileProviderManager(for: snapshotDomain) {
serviceSources.append(VaultUnlockingServiceSourceSnapshotMock(domain: snapshotDomain, notificator: notificator, dbPath: dbPath, delegate: LocalURLProvider(domain: snapshotDomain), taskRegistrator: manager))
}
#else
if let domain = domain, let localURLProvider = localURLProvider, let dbPath = dbPath, let notificator = notificator, let manager = NSFileProviderManager(for: domain) {
serviceSources.append(VaultUnlockingServiceSource(domain: domain, notificator: notificator, dbPath: dbPath, delegate: localURLProvider, taskRegistrator: manager))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

#if SNAPSHOTS
import CryptomatorCommonCore
import CryptomatorFileProvider
import Dependencies
import FileProviderUI
import LocalAuthentication
import Promises
Expand All @@ -21,8 +23,8 @@ class FileProviderCoordinatorSnapshotMock: FileProviderCoordinator {
super.init(extensionContext: extensionContext, hostViewController: hostViewController)
}

override func showManualPasswordScreen(viewModel: UnlockVaultViewModel) {
let viewModel = UnlockVaultViewModelSnapshotMock(domain: NSFileProviderDomain(vaultUID: "123", displayName: ""))
override func showManualLogin(for domain: NSFileProviderDomain, unlockError: UnlockError) {
let viewModel = UnlockVaultViewModelSnapshotMock(domain: domain)
let unlockVaultVC = UnlockVaultViewController(viewModel: viewModel)
unlockVaultVC.coordinator = self
navigationController.pushViewController(unlockVaultVC, animated: false)
Expand All @@ -33,11 +35,10 @@ class UnlockVaultViewModelSnapshotMock: UnlockVaultViewModel {
init(domain: NSFileProviderDomain) {
super.init(domain: domain,
wrongBiometricalPassword: false,
fileProviderConnector: FileProviderXPCConnector.shared,
passwordManager: VaultPasswordManagerSnapshotMock(),
vaultAccountManager: VaultAccountDBManager.shared,
providerManager: CloudProviderDBManager.shared,
vaultCache: VaultDBCache(dbWriter: CryptomatorDatabase.shared.dbPool))
vaultCache: VaultDBCache())
}
}

Expand All @@ -64,7 +65,8 @@ extension UnlockVaultViewController {
}()

@objc func swizzled_unlock() {
let getXPCPromise: Promise<XPC<VaultUnlocking>> = FileProviderXPCConnector.shared.getXPC(serviceName: .vaultUnlocking, domain: nil)
@Dependency(\.fileProviderConnector) var fileProviderConnector
let getXPCPromise: Promise<XPC<VaultUnlocking>> = fileProviderConnector.getXPC(serviceName: .vaultUnlocking, domain: nil)
getXPCPromise.then { xpc in
xpc.proxy.unlockVault(kek: [UInt8](), reply: { [weak self] _ in
self?.coordinator?.done()
Expand Down
25 changes: 15 additions & 10 deletions Snapshots/SnapshotHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,12 @@
import Foundation
import XCTest

var deviceLanguage = ""
var locale = ""

@MainActor
func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) {
Snapshot.setupSnapshot(app, waitForAnimations: waitForAnimations)
}

@MainActor
func snapshot(_ name: String, waitForLoadingIndicator: Bool) {
if waitForLoadingIndicator {
Snapshot.snapshot(name)
Expand All @@ -33,6 +32,7 @@ func snapshot(_ name: String, waitForLoadingIndicator: Bool) {
/// - Parameters:
/// - name: The name of the snapshot
/// - timeout: Amount of seconds to wait until the network loading indicator disappears. Pass `0` if you don't want to wait.
@MainActor
func snapshot(_ name: String, timeWaitingForIdle timeout: TimeInterval = 20) {
Snapshot.snapshot(name, timeWaitingForIdle: timeout)
}
Expand All @@ -52,6 +52,7 @@ enum SnapshotError: Error, CustomDebugStringConvertible {
}

@objcMembers
@MainActor
open class Snapshot: NSObject {
static var app: XCUIApplication?
static var waitForAnimations = true
Expand All @@ -60,6 +61,9 @@ open class Snapshot: NSObject {
return cacheDirectory?.appendingPathComponent("screenshots", isDirectory: true)
}

static var deviceLanguage = ""
static var currentLocale = ""

open class func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) {
Snapshot.app = app
Snapshot.waitForAnimations = waitForAnimations
Expand Down Expand Up @@ -102,17 +106,17 @@ open class Snapshot: NSObject {

do {
let trimCharacterSet = CharacterSet.whitespacesAndNewlines
locale = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet)
currentLocale = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet)
} catch {
NSLog("Couldn't detect/set locale...")
}

if locale.isEmpty, !deviceLanguage.isEmpty {
locale = Locale(identifier: deviceLanguage).identifier
if currentLocale.isEmpty && !deviceLanguage.isEmpty {
currentLocale = Locale(identifier: deviceLanguage).identifier
}

if !locale.isEmpty {
app.launchArguments += ["-AppleLocale", "\"\(locale)\""]
if !currentLocale.isEmpty {
app.launchArguments += ["-AppleLocale", "\"\(currentLocale)\""]
}
}

Expand Down Expand Up @@ -180,7 +184,7 @@ open class Snapshot: NSObject {

let path = screenshotsDir.appendingPathComponent("\(simulator)-\(name).png")
#if swift(<5.0)
UIImagePNGRepresentation(image)?.write(to: path, options: .atomic)
try UIImagePNGRepresentation(image)?.write(to: path, options: .atomic)
#else
try image.pngData()?.write(to: path, options: .atomic)
#endif
Expand Down Expand Up @@ -280,6 +284,7 @@ private extension XCUIElementQuery {
return containing(isNetworkLoadingIndicator)
}

@MainActor
var deviceStatusBars: XCUIElementQuery {
guard let app = Snapshot.app else {
fatalError("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().")
Expand All @@ -305,4 +310,4 @@ private extension CGFloat {

// Please don't remove the lines below
// They are used to detect outdated configuration files
// SnapshotHelperVersion [1.28]
// SnapshotHelperVersion [1.30]
51 changes: 6 additions & 45 deletions Snapshots/Snapshots.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import XCTest

@MainActor
class Snapshots: XCTestCase {
var app: XCUIApplication!
var filesApp: XCUIApplication!
Expand Down Expand Up @@ -166,58 +167,14 @@ class Snapshots: XCTestCase {
XCTAssert(filesApp.wait(for: .runningForeground, timeout: 5.0))

navigateFromRecentsToFilesAppOverview()

// Tap on More Locations
tapMoreLocationsInFilesAppOverview()

// Enable Cryptomator as FileProvider
let browseCollectionView = filesApp.collectionViews["Browse View"]
let cryptomatorCell = browseCollectionView.cells["DOC.sidebar.item.Cryptomator"]
let cryptomatorCellSwitch = cryptomatorCell.switches.firstMatch
XCTAssert(cryptomatorCellSwitch.waitForIsHittable(timeout: 3.0))
cryptomatorCellSwitch.tap()

// Press Done
tapDoneButtonInFilesAppOverview()
}

private func navigateFromRecentsToFilesAppOverview() {
guard XCUIDevice.shared.orientation == .portrait else {
return
}
// Tap on Browse
filesApp.tabBars["DOC.browsingModeTabBar"].buttons.element(boundBy: 1).tap(withNumberOfTaps: 2, numberOfTouches: 1)
}

private func tapDoneButtonInFilesAppOverview() {
let doneButton: XCUIElement
switch UIDevice.current.userInterfaceIdiom {
case .phone:
doneButton = filesApp.navigationBars["FullDocumentManagerViewControllerNavigationBar"].buttons.firstMatch
case .pad:
doneButton = filesApp.navigationBars.firstMatch.buttons.element(boundBy: 1)
default:
XCTFail("Tap Done button in Files app overview is not supported for device: \(UIDevice.current.userInterfaceIdiom)")
return
}
XCTAssert(doneButton.waitForIsHittable(timeout: 3.0))
doneButton.tap()
}

private func tapMoreLocationsInFilesAppOverview() {
let index: Int
switch UIDevice.current.userInterfaceIdiom {
case .phone:
index = 2
case .pad:
index = 3
default:
XCTFail("Tap Done button in Files app overview is not supported for device: \(UIDevice.current.userInterfaceIdiom)")
return
}
let moreLocationsCell = filesApp.cells.element(boundBy: index)
XCTAssert(moreLocationsCell.waitForIsHittable(timeout: 3.0))
moreLocationsCell.tap()
filesApp.tabBars["DOC.browsingModeTabBar"].buttons.element(boundBy: 2).tap(withNumberOfTaps: 2, numberOfTouches: 1)
}

private func snapshotFilesOverview() {
Expand All @@ -233,6 +190,10 @@ class Snapshots: XCTestCase {
// Start Cryptomator FileProvider
cryptomatorCell.tap()

// Enable Cryptomator as FileProvider
let activateButton = filesApp.alerts.element(boundBy: 0).buttons.element(boundBy: 1)
activateButton.tap()

// Unlock Screen
let vaultUnlockTableView = filesApp.tables["Snapshot_UnlockVaultViewController"]
XCTAssert(vaultUnlockTableView.waitForExistence(timeout: 20.0))
Expand Down
2 changes: 1 addition & 1 deletion fastlane/Fastfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
fastlane_version("2.206.2")
fastlane_version("2.222.0")

default_platform(:ios)

Expand Down
6 changes: 2 additions & 4 deletions fastlane/Snapfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
# A list of devices you want to take the screenshots from
devices([
"iPhone 13 Pro Max",
"iPhone 8 Plus",
"iPad Pro (12.9-inch) (5th generation)",
"iPad Pro (12.9-inch) (2nd generation)",
"iPhone 15 Pro Max",
"iPad Pro 13-inch (M4)",
])

languages([
Expand Down
5 changes: 4 additions & 1 deletion fastlane/changelog.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
- Fixed "Content Unavailable" error when unlocking multiple vaults in Google Drive, OneDrive, pCloud, and WebDAV (#342, #345, #351)
- Introducing support for Box, allowing secure access to vaults stored on Box (#319, #352).
- Added Slovenian and Ukrainian translations.
- Fixed an issue that caused "Unauthorized" errors when uploading files to OneDrive (#358).
- Removed the "Change Password" option for Hub vaults (#360, #367).
2 changes: 1 addition & 1 deletion fastlane/config/freemium/metadata/de-DE/description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ KOMPATIBEL

Cryptomator ist kompatibel mit den meistgenutzten Cloudspeichern und verfügbar für alle gängigen Betriebssysteme.

• Kompatibel mit iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, WebDAV- und S3-basierten Cloudspeicher-Diensten
• Kompatibel mit iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, Box, WebDAV- und S3-basierten Cloudspeicher-Diensten
• Erstelle auch Tresore an einem beliebigen Ort über andere Speicher-Anbieter (Drittanbieter-Apps müssen dies unterstützen)
• Greife auf deine Tresore von allen deinen mobilen Endgeräten und Computern zu

Expand Down
5 changes: 4 additions & 1 deletion fastlane/config/freemium/metadata/de-DE/release_notes.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
- Fehler "Inhalt nicht verfügbar" beim Entsperren mehrerer Tresore in Google Drive, OneDrive, pCloud und WebDAV behoben (#342, #345, #351)
- Einführung der Unterstützung für Box, um sicheren Zugriff auf in Box gespeicherte Tresore zu ermöglichen (#319, #352).
- Übersetzungen ins Slowenische und Ukrainische hinzugefügt.
- Fehler behoben, der beim Hochladen von Dateien auf OneDrive die Fehlermeldung „Unautorisiert“ verursachte (#358).
- Option „Passwort ändern“ für Hub-Tresore entfernt (#360, #367).
2 changes: 1 addition & 1 deletion fastlane/config/freemium/metadata/en-US/description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ COMPATIBLE

Cryptomator is compatible with the most commonly used cloud storages and available for all major operating systems.

• Compatible with iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, WebDAV- and S3-based cloud storage services
• Compatible with iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, Box, WebDAV- and S3-based cloud storage services
• Create vaults in any location via other File Providers (third-party apps must support this)
• Access your vaults on all your mobile devices and computers

Expand Down
5 changes: 4 additions & 1 deletion fastlane/config/freemium/metadata/en-US/release_notes.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
- Fixed "Content Unavailable" error when unlocking multiple vaults in Google Drive, OneDrive, pCloud, and WebDAV (#342, #345, #351)
- Introducing support for Box, allowing secure access to vaults stored on Box (#319, #352).
- Added Slovenian and Ukrainian translations.
- Fixed an issue that caused "Unauthorized" errors when uploading files to OneDrive (#358).
- Removed the "Change Password" option for Hub vaults (#360, #367).
2 changes: 1 addition & 1 deletion fastlane/config/premium/metadata/de-DE/description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ KOMPATIBEL

Cryptomator ist kompatibel mit den meistgenutzten Cloudspeichern und verfügbar für alle gängigen Betriebssysteme.

• Kompatibel mit iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, WebDAV- und S3-basierten Cloudspeicher-Diensten
• Kompatibel mit iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, Box, WebDAV- und S3-basierten Cloudspeicher-Diensten
• Erstelle auch Tresore an einem beliebigen Ort über andere Speicher-Anbieter (Drittanbieter-Apps müssen dies unterstützen)
• Greife auf deine Tresore von allen deinen mobilen Endgeräten und Computern zu

Expand Down
5 changes: 4 additions & 1 deletion fastlane/config/premium/metadata/de-DE/release_notes.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
- Fehler "Inhalt nicht verfügbar" beim Entsperren mehrerer Tresore in Google Drive, OneDrive, pCloud und WebDAV behoben (#342, #345, #351)
- Einführung der Unterstützung für Box, um sicheren Zugriff auf in Box gespeicherte Tresore zu ermöglichen (#319, #352).
- Übersetzungen ins Slowenische und Ukrainische hinzugefügt.
- Fehler behoben, der beim Hochladen von Dateien auf OneDrive die Fehlermeldung „Unautorisiert“ verursachte (#358).
- Option „Passwort ändern“ für Hub-Tresore entfernt (#360, #367).
2 changes: 1 addition & 1 deletion fastlane/config/premium/metadata/en-US/description.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ COMPATIBLE

Cryptomator is compatible with the most commonly used cloud storages and available for all major operating systems.

• Compatible with iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, WebDAV- and S3-based cloud storage services
• Compatible with iCloud Drive, Dropbox, Google Drive, OneDrive, pCloud, Box, WebDAV- and S3-based cloud storage services
• Create vaults in any location via other File Providers (third-party apps must support this)
• Access your vaults on all your mobile devices and computers

Expand Down
5 changes: 4 additions & 1 deletion fastlane/config/premium/metadata/en-US/release_notes.txt
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
- Fixed "Content Unavailable" error when unlocking multiple vaults in Google Drive, OneDrive, pCloud, and WebDAV (#342, #345, #351)
- Introducing support for Box, allowing secure access to vaults stored on Box (#319, #352).
- Added Slovenian and Ukrainian translations.
- Fixed an issue that caused "Unauthorized" errors when uploading files to OneDrive (#358).
- Removed the "Change Password" option for Hub vaults (#360, #367).

0 comments on commit fb56c6a

Please sign in to comment.