Skip to content

Commit

Permalink
Merge branch 'develop' into feature/Box-support
Browse files Browse the repository at this point in the history
  • Loading branch information
tobihagemann committed Aug 21, 2024
2 parents fbaf000 + a855f11 commit 0c05b70
Show file tree
Hide file tree
Showing 37 changed files with 210 additions and 140 deletions.
4 changes: 3 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
name: Build

on:
[push]
push:
pull_request_target:
types: [labeled]

jobs:
build:
Expand Down
4 changes: 4 additions & 0 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
disabled_rules:
- file_length
- line_length
- redundant_void_return
- todo
- type_body_length

Expand All @@ -14,6 +15,9 @@ included:
- FileProviderExtension
- FileProviderExtensionUI

excluded:
- CryptomatorCommon/.build

identifier_name:
min_length: 1
max_length: 50
Expand Down
14 changes: 12 additions & 2 deletions Cryptomator.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,10 @@
740D3684266A1B180058744D /* SettingsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 740D3683266A1B180058744D /* SettingsCoordinator.swift */; };
742679FC26A56CF9004C61BC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 742679F926A56B33004C61BC /* Localizable.strings */; };
742679FD26A56CFA004C61BC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 742679F926A56B33004C61BC /* Localizable.strings */; };
74420BC32BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 74420BC22BD2449900E77F92 /* PrivacyInfo.xcprivacy */; };
74420BC42BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 74420BC22BD2449900E77F92 /* PrivacyInfo.xcprivacy */; };
74420BC52BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 74420BC22BD2449900E77F92 /* PrivacyInfo.xcprivacy */; };
74420BC62BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 74420BC22BD2449900E77F92 /* PrivacyInfo.xcprivacy */; };
7460FFEF26FCC6FC0018BCC4 /* OnboardingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7460FFEE26FCC6FC0018BCC4 /* OnboardingNavigationController.swift */; };
746815462475605E00038679 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4AE97DB324572E4A00452814 /* Assets.xcassets */; };
746815472475605E00038679 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4AE97DB524572E4A00452814 /* LaunchScreen.storyboard */; };
Expand Down Expand Up @@ -996,6 +1000,7 @@
74275AE728478E160058AD25 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Intents.strings; sourceTree = "<group>"; };
74397A842832A05E00CB9410 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = "<group>"; };
74397A852832A09B00CB9410 /* sw-TZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sw-TZ"; path = "sw-TZ.lproj/Localizable.strings"; sourceTree = "<group>"; };
74420BC22BD2449900E77F92 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
7460FFED26FB6C100018BCC4 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = "<group>"; };
7460FFEE26FCC6FC0018BCC4 /* OnboardingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNavigationController.swift; sourceTree = "<group>"; };
74626665283BD2D20070924B /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/Localizable.strings"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2026,6 +2031,7 @@
children = (
4AE97DB324572E4A00452814 /* Assets.xcassets */,
4AF91CC625A6437000ACF01E /* Colors.xcassets */,
74420BC22BD2449900E77F92 /* PrivacyInfo.xcprivacy */,
742679F926A56B33004C61BC /* Localizable.strings */,
);
path = SharedResources;
Expand Down Expand Up @@ -2382,6 +2388,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74420BC42BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */,
4A80407B2769201400D7D999 /* Localizable.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -2392,6 +2399,7 @@
files = (
4A6A5213268B66AC006F7368 /* Colors.xcassets in Resources */,
742679FD26A56CFA004C61BC /* Localizable.strings in Resources */,
74420BC52BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */,
4A6A5212268B6697006F7368 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -2400,6 +2408,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74420BC62BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */,
4A1A7AC628327419008EEC84 /* Assets.xcassets in Resources */,
4A1A7AC528326554008EEC84 /* Localizable.strings in Resources */,
);
Expand All @@ -2415,6 +2424,7 @@
742679FC26A56CF9004C61BC /* Localizable.strings in Resources */,
7408E6C52677954000D7FAEA /* about.html in Resources */,
7408E6CA2677985800D7FAEA /* jquery-3.6.0.slim.min.js in Resources */,
74420BC32BD2449900E77F92 /* PrivacyInfo.xcprivacy in Resources */,
746815462475605E00038679 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -3302,7 +3312,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MARKETING_VERSION = 2.5.1;
MARKETING_VERSION = 2.5.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
Expand Down Expand Up @@ -3364,7 +3374,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MARKETING_VERSION = 2.5.1;
MARKETING_VERSION = 2.5.2;
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
2 changes: 1 addition & 1 deletion Cryptomator/AddVault/AddVaultSuccessViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ private class VaultSuccessFooterView: UITableViewHeaderFooterView {

let text = NSMutableAttributedString(string: LocalizedString.getValue("addVault.success.footer"), attributes: [NSAttributedString.Key.foregroundColor: UIColor.secondaryLabel])
text.append(NSAttributedString(string: " "))
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/1.6/ios/access-vault/#enable-cryptomator-in-files-app")!])
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/latest/ios/access-vault/#enable-cryptomator-in-files-app")!])
text.append(learnMoreLink)
textView.attributedText = text
textView.isUserInteractionEnabled = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class LocalFileSystemAuthenticationInfoFooterViewModel: AttributedTextHeaderFoot
let infoText = LocalizedString.getValue("localFileSystemAuthentication.info.footer")
let text = NSMutableAttributedString(string: infoText)
text.append(NSAttributedString(string: " "))
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/1.6/ios/cloud-management/#other-file-provider")!])
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/latest/ios/cloud-management/#other-file-provider")!])
text.append(learnMoreLink)
super.init(attributedText: text)
}
Expand Down
2 changes: 1 addition & 1 deletion Cryptomator/Settings/SettingsCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class SettingsCoordinator: Coordinator {
}

func openShortcutsGuide() {
if let shortcutsGuideURL = URL(string: "https://docs.cryptomator.org/en/1.6/ios/shortcuts-guide/") {
if let shortcutsGuideURL = URL(string: "https://docs.cryptomator.org/en/latest/ios/shortcuts-guide/") {
UIApplication.shared.open(shortcutsGuideURL)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class KeepUnlockedSectionFooterViewModel: BindableAttributedTextHeaderFooterView
}
let text = NSMutableAttributedString(string: infoText)
text.append(NSAttributedString(string: " "))
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/1.6/ios/vault-management/#unlock-duration")!])
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/latest/ios/vault-management/#unlock-duration")!])
text.append(learnMoreLink)
return text
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class VaultDetailInfoFooterViewModel: BindableAttributedTextHeaderFooterViewMode
let infoText = loggedInText + LocalizedString.getValue("vaultDetail.info.footer.accessVault")
let text = NSMutableAttributedString(string: infoText)
text.append(NSAttributedString(string: " "))
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/1.6/ios/access-vault/#enable-cryptomator-in-files-app")!])
let learnMoreLink = NSAttributedString(string: LocalizedString.getValue("common.footer.learnMore"), attributes: [NSAttributedString.Key.link: URL(string: "https://docs.cryptomator.org/en/latest/ios/access-vault/#enable-cryptomator-in-files-app")!])
text.append(learnMoreLink)
return text
}
Expand Down
10 changes: 7 additions & 3 deletions Cryptomator/VaultDetail/VaultDetailViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,15 @@ class VaultDetailViewModel: VaultDetailViewModelProtocol {
private var subscribers = Set<AnyCancellable>()

private lazy var sections: [VaultDetailSection] = {
var sections: [VaultDetailSection] = [.vaultInfoSection, .lockingSection]
if vaultIsEligibleToMove() {
return [.vaultInfoSection, .lockingSection, .moveVaultSection, .changeVaultPasswordSection, .removeVaultSection]
} else {
return [.vaultInfoSection, .lockingSection, .changeVaultPasswordSection, .removeVaultSection]
sections.append(.moveVaultSection)
}
if vaultInfo.vaultConfigType == .masterkeyFile {
sections.append(.changeVaultPasswordSection)
}
sections.append(.removeVaultSection)
return sections
}()

private lazy var lockButton: ButtonCellViewModel<VaultDetailButtonAction> = {
Expand Down
10 changes: 10 additions & 0 deletions Cryptomator/VaultList/VaultInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,16 @@ public class VaultInfo: Decodable, FetchableRecord {
vaultListPosition.position = newValue
}
}

var vaultConfigType: VaultConfigType {
if let cachedVault = try? VaultDBCache().getCachedVault(withVaultUID: vaultUID),
let vaultConfigToken = cachedVault.vaultConfigToken,
let unverifiedVaultConfig = try? UnverifiedVaultConfig(token: vaultConfigToken) {
return VaultConfigHelper.getType(for: unverifiedVaultConfig)
} else {
return .unknown
}
}
}

extension VaultInfo: Equatable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ public enum CryptomatorHubAuthenticatorError: Error {
case unexpectedResponse
case deviceNameAlreadyExists

case unexpectedPrivateKeyFormat
case invalidVaultConfig
case invalidHubConfig
case invalidBaseURL
Expand Down Expand Up @@ -154,13 +153,9 @@ public class CryptomatorHubAuthenticator: HubDeviceRegistering, HubKeyReceiving
}

private func getEncryptedUserKeyJWE(userDto: UserDto, setupCode: String, publicKey: P384.KeyAgreement.PublicKey) throws -> JWE {
guard let privateKey = userDto.privateKey.data(using: .utf8) else {
throw CryptomatorHubAuthenticatorError.unexpectedPrivateKeyFormat
}
let privateKey = Data(userDto.privateKey.utf8)
let jwe = try JWE(compactSerialization: privateKey)

let userKey = try JWEHelper.decryptUserKey(jwe: jwe, setupCode: setupCode)

return try JWEHelper.encryptUserKey(userKey: userKey, deviceKey: publicKey)
}

Expand Down Expand Up @@ -239,9 +234,7 @@ public class CryptomatorHubAuthenticator: HubDeviceRegistering, HubKeyReceiving
let httpResponse = response as? HTTPURLResponse
switch httpResponse?.statusCode {
case 200:
guard let body = String(data: data, encoding: .utf8) else {
throw CryptomatorHubAuthenticatorError.unexpectedResponse
}
let body = String(decoding: data, as: UTF8.self)
return .success(encryptedVaultKey: body, header: httpResponse?.allHeaderFields ?? [:])
case 402:
return .licenseExceeded
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ extension CloudProviderType: DatabaseValueConvertible {
guard let data = try? jsonEncoder.encode(self) else {
return .null
}
let string = String(data: data, encoding: .utf8)
return string?.databaseValue ?? .null
let string = String(decoding: data, as: UTF8.self)
return string.databaseValue
}

public static func fromDatabaseValue(_ dbValue: DatabaseValue) -> Self? {
guard let string = String.fromDatabaseValue(dbValue) else { return nil }
guard let data = string.data(using: .utf8) else { return nil }
let data = Data(string.utf8)
let jsonDecoder = JSONDecoder()
return try? jsonDecoder.decode(CloudProviderType.self, from: data)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,13 @@ public protocol VaultPasswordManager {
}

public enum VaultPasswordManagerError: Error {
case encodingError
case passwordNotFound
}

public class VaultPasswordKeychainManager: VaultPasswordManager {
public init() {}
public func setPassword(_ password: String, forVaultUID vaultUID: String) throws {
guard let data = password.data(using: .utf8) else {
throw VaultPasswordManagerError.encodingError
}
let data = Data(password.utf8)
try CryptomatorUserPresenceKeychain.vaultPassword.set(vaultUID, value: data)
}

Expand Down Expand Up @@ -56,9 +53,7 @@ public class VaultPasswordKeychainManager: VaultPasswordManager {
guard let data = CryptomatorUserPresenceKeychain.vaultPassword.getAsData(vaultUID, context: context) else {
throw VaultPasswordManagerError.passwordNotFound
}
guard let password = String(data: data, encoding: .utf8) else {
throw VaultPasswordManagerError.encodingError
}
let password = String(decoding: data, as: UTF8.self)
return password
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -242,11 +242,11 @@ final class HubAuthenticationViewModelTests: XCTestCase {
private struct TestError: Error {}

private func validHubVaultConfig() -> Data {
"eyJraWQiOiJodWIraHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcvaHViMzAvYXBpL3ZhdWx0cy83NWFmMjFiNy00ODQ5LTQ1NTgtYjA1Yy1kZTZkYzkwNzdhNjciLCJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiIsImh1YiI6eyJjbGllbnRJZCI6ImNyeXB0b21hdG9yIiwiYXV0aEVuZHBvaW50IjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcva2MvcmVhbG1zL2h1YjMwL3Byb3RvY29sL29wZW5pZC1jb25uZWN0L2F1dGgiLCJ0b2tlbkVuZHBvaW50IjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcva2MvcmVhbG1zL2h1YjMwL3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuIiwiYXV0aFN1Y2Nlc3NVcmwiOiJodHRwczovL3Rlc3RpbmcuaHViLmNyeXB0b21hdG9yLm9yZy9odWIzMC9hcHAvdW5sb2NrLXN1Y2Nlc3M_dmF1bHQ9NzVhZjIxYjctNDg0OS00NTU4LWIwNWMtZGU2ZGM5MDc3YTY3IiwiYXV0aEVycm9yVXJsIjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcvaHViMzAvYXBwL3VubG9jay1lcnJvcj92YXVsdD03NWFmMjFiNy00ODQ5LTQ1NTgtYjA1Yy1kZTZkYzkwNzdhNjciLCJhcGlCYXNlVXJsIjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcvaHViMzAvYXBpLyIsImRldmljZXNSZXNvdXJjZVVybCI6Imh0dHBzOi8vdGVzdGluZy5odWIuY3J5cHRvbWF0b3Iub3JnL2h1YjMwL2FwaS9kZXZpY2VzLyJ9fQ.eyJqdGkiOiI3NWFmMjFiNy00ODQ5LTQ1NTgtYjA1Yy1kZTZkYzkwNzdhNjciLCJmb3JtYXQiOjgsImNpcGhlckNvbWJvIjoiU0lWX0dDTSIsInNob3J0ZW5pbmdUaHJlc2hvbGQiOjIyMH0.Z0x_5D073zo3smZq5q5wgDRheewcapCrIqg_0iD5qwM".data(using: .utf8)!
Data("eyJraWQiOiJodWIraHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcvaHViMzAvYXBpL3ZhdWx0cy83NWFmMjFiNy00ODQ5LTQ1NTgtYjA1Yy1kZTZkYzkwNzdhNjciLCJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiIsImh1YiI6eyJjbGllbnRJZCI6ImNyeXB0b21hdG9yIiwiYXV0aEVuZHBvaW50IjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcva2MvcmVhbG1zL2h1YjMwL3Byb3RvY29sL29wZW5pZC1jb25uZWN0L2F1dGgiLCJ0b2tlbkVuZHBvaW50IjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcva2MvcmVhbG1zL2h1YjMwL3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuIiwiYXV0aFN1Y2Nlc3NVcmwiOiJodHRwczovL3Rlc3RpbmcuaHViLmNyeXB0b21hdG9yLm9yZy9odWIzMC9hcHAvdW5sb2NrLXN1Y2Nlc3M_dmF1bHQ9NzVhZjIxYjctNDg0OS00NTU4LWIwNWMtZGU2ZGM5MDc3YTY3IiwiYXV0aEVycm9yVXJsIjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcvaHViMzAvYXBwL3VubG9jay1lcnJvcj92YXVsdD03NWFmMjFiNy00ODQ5LTQ1NTgtYjA1Yy1kZTZkYzkwNzdhNjciLCJhcGlCYXNlVXJsIjoiaHR0cHM6Ly90ZXN0aW5nLmh1Yi5jcnlwdG9tYXRvci5vcmcvaHViMzAvYXBpLyIsImRldmljZXNSZXNvdXJjZVVybCI6Imh0dHBzOi8vdGVzdGluZy5odWIuY3J5cHRvbWF0b3Iub3JnL2h1YjMwL2FwaS9kZXZpY2VzLyJ9fQ.eyJqdGkiOiI3NWFmMjFiNy00ODQ5LTQ1NTgtYjA1Yy1kZTZkYzkwNzdhNjciLCJmb3JtYXQiOjgsImNpcGhlckNvbWJvIjoiU0lWX0dDTSIsInNob3J0ZW5pbmdUaHJlc2hvbGQiOjIyMH0.Z0x_5D073zo3smZq5q5wgDRheewcapCrIqg_0iD5qwM".utf8)
}

private func validHubResponseData() -> Data {
"eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTI1NkdDTSIsImVwayI6eyJjcnYiOiJQLTM4NCIsImV4dCI6dHJ1ZSwia2V5X29wcyI6W10sImt0eSI6IkVDIiwieCI6Im9DLWlIcDhjZzVsUy1Qd3JjRjZxS0NzbWxfMFJzaEtCV0JJTUYzVjhuTGg2NGlCWTdsX0VsZ3Fjd0JZLXNsR3IiLCJ5IjoiVWozVzdYYVBQakJiMFRwWUFHeXlweVRIR3ByQU1hRXdWTk5Gb05tNEJuNjZuVkNKLU9pUUJYN3RhaVUtby1yWSJ9LCJhcHUiOiIiLCJhcHYiOiIifQ.._r7LC8HLc00jk2SI.ooeI0-E29jryMJ_wbGWKVc_IfHOh3Mlfh5geRYEmLTA4GKHItRYmDdZvGsCj9pJRoNORyHdmlAMxXXIXq_v9ZocoCwZrN7EsaB8A3Kukka35i1sr7kpNbksk3G_COsGRmwQ.GJCKBE-OZ7Nm5RMf_9UwVg".data(using: .utf8)!
Data("eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTI1NkdDTSIsImVwayI6eyJjcnYiOiJQLTM4NCIsImV4dCI6dHJ1ZSwia2V5X29wcyI6W10sImt0eSI6IkVDIiwieCI6Im9DLWlIcDhjZzVsUy1Qd3JjRjZxS0NzbWxfMFJzaEtCV0JJTUYzVjhuTGg2NGlCWTdsX0VsZ3Fjd0JZLXNsR3IiLCJ5IjoiVWozVzdYYVBQakJiMFRwWUFHeXlweVRIR3ByQU1hRXdWTk5Gb05tNEJuNjZuVkNKLU9pUUJYN3RhaVUtby1yWSJ9LCJhcHUiOiIiLCJhcHYiOiIifQ.._r7LC8HLc00jk2SI.ooeI0-E29jryMJ_wbGWKVc_IfHOh3Mlfh5geRYEmLTA4GKHItRYmDdZvGsCj9pJRoNORyHdmlAMxXXIXq_v9ZocoCwZrN7EsaB8A3Kukka35i1sr7kpNbksk3G_COsGRmwQ.GJCKBE-OZ7Nm5RMf_9UwVg".utf8)
}
}

Expand Down
Loading

0 comments on commit 0c05b70

Please sign in to comment.