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
12 changes: 12 additions & 0 deletions FlowCrypt.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
5133B6722716321F00C95463 /* ContactKeyDetailDecorator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133B6712716321F00C95463 /* ContactKeyDetailDecorator.swift */; };
5133B6742716E5EA00C95463 /* LabelCellNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133B6732716E5EA00C95463 /* LabelCellNode.swift */; };
5137CB1427F8E0A900AEF895 /* EnterpriseServerApiHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5137CB1327F8E0A900AEF895 /* EnterpriseServerApiHelper.swift */; };
513DC088284F161400FAD5F2 /* EmailKeyManagerApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513DC087284F161400FAD5F2 /* EmailKeyManagerApi.swift */; };
514C34DB276CE19C00FCAB79 /* ComposeMessageContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 514C34DA276CE19C00FCAB79 /* ComposeMessageContext.swift */; };
514C34DD276CE1C000FCAB79 /* ComposeMessageRecipient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 514C34DC276CE1C000FCAB79 /* ComposeMessageRecipient.swift */; };
514C34DF276CE20700FCAB79 /* ComposeMessageService+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 514C34DE276CE20700FCAB79 /* ComposeMessageService+State.swift */; };
Expand Down Expand Up @@ -549,6 +550,7 @@
5133B6712716321F00C95463 /* ContactKeyDetailDecorator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactKeyDetailDecorator.swift; sourceTree = "<group>"; };
5133B6732716E5EA00C95463 /* LabelCellNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelCellNode.swift; sourceTree = "<group>"; };
5137CB1327F8E0A900AEF895 /* EnterpriseServerApiHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterpriseServerApiHelper.swift; sourceTree = "<group>"; };
513DC087284F161400FAD5F2 /* EmailKeyManagerApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailKeyManagerApi.swift; sourceTree = "<group>"; };
514C34DA276CE19C00FCAB79 /* ComposeMessageContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeMessageContext.swift; sourceTree = "<group>"; };
514C34DC276CE1C000FCAB79 /* ComposeMessageRecipient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeMessageRecipient.swift; sourceTree = "<group>"; };
514C34DE276CE20700FCAB79 /* ComposeMessageService+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ComposeMessageService+State.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1127,6 +1129,14 @@
path = ObjcException;
sourceTree = "<group>";
};
513DC086284F15F600FAD5F2 /* Remote Private Key Apis */ = {
isa = PBXGroup;
children = (
513DC087284F161400FAD5F2 /* EmailKeyManagerApi.swift */,
);
path = "Remote Private Key Apis";
sourceTree = "<group>";
};
5161D87D27A488BD00130518 /* Contact Models */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -1266,6 +1276,7 @@
isa = PBXGroup;
children = (
2C03CC14275BB51000887EEB /* Account Server Apis */,
513DC086284F15F600FAD5F2 /* Remote Private Key Apis */,
);
path = Apis;
sourceTree = "<group>";
Expand Down Expand Up @@ -2654,6 +2665,7 @@
A36108E9273C7A2E00A90E34 /* MockError.swift in Sources */,
2C03CC16275BB53400887EEB /* EnterpriseServerApiTests.swift in Sources */,
51B7421B27F318D300E702C8 /* XCTestCaseExtension.swift in Sources */,
513DC088284F161400FAD5F2 /* EmailKeyManagerApi.swift in Sources */,
9F5F504326FA6C7500294FA2 /* EnterpriseServerApiMock.swift in Sources */,
51DA5BDA2722C82E001C4359 /* RecipientTests.swift in Sources */,
9FC41171268118A7004C0A69 /* PassPhraseStorageTests.swift in Sources */,
Expand Down
12 changes: 6 additions & 6 deletions FlowCrypt.xcworkspace/xcshareddata/swiftpm/Package.resolved

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

10 changes: 3 additions & 7 deletions FlowCrypt/Core/Models/DecryptedPrivateKey.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,9 @@
import Foundation

struct DecryptedPrivateKeysResponse: Decodable {

let privateKeys: [DecryptedPrivateKey]

static let empty = DecryptedPrivateKeysResponse(privateKeys: [])
}

struct DecryptedPrivateKey: Decodable {

let decryptedPrivateKey: String
struct DecryptedPrivateKey: Decodable {
let decryptedPrivateKey: String
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ actor EmailKeyManagerApi: EmailKeyManagerApiType {
let response = try await ApiCall.call(request)
let decryptedPrivateKeysResponse = try JSONDecoder().decode(DecryptedPrivateKeysResponse.self, from: response.data)

let validKeys = try await validate(decryptedPrivateKeysResponse: decryptedPrivateKeysResponse)
return validKeys
}

func validate(decryptedPrivateKeysResponse: DecryptedPrivateKeysResponse) async throws -> [KeyDetails] {
var keys: [KeyDetails] = []
for privateKey in decryptedPrivateKeysResponse.privateKeys {
let parsedPrivateKey = try await core.parseKeys(armoredOrBinary: privateKey.decryptedPrivateKey.data())
Expand All @@ -84,7 +89,6 @@ actor EmailKeyManagerApi: EmailKeyManagerApiType {
}
keys.append(contentsOf: parsedPrivateKey.keyDetails)
}

return keys
}

Expand Down
2 changes: 0 additions & 2 deletions FlowCrypt/Functionality/Services/EKMVcHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ final class EKMVcHelper: EKMVcHelperType {

for keyDetail in keysToUpdate {
try await saveKeyToLocal(
in: viewController,
context: appContext,
keyDetail: keyDetail,
passPhrase: passPhrase,
Expand Down Expand Up @@ -116,7 +115,6 @@ final class EKMVcHelper: EKMVcHelperType {
}

private func saveKeyToLocal(
in viewController: UIViewController,
context: AppContextWithUser,
keyDetail: KeyDetails,
passPhrase: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//
// EmailKeyManagerApi.swift
// FlowCryptAppTests
//
// Created by Roma Sosnovsky on 07/06/22
// Copyright © 2017-present FlowCrypt a. s. All rights reserved.
//

@testable import FlowCrypt
import XCTest

final class EmailKeyManagerApiTests: XCTestCase {
let core: Core! = .shared

override func setUp() {
let expectation = XCTestExpectation()
Task {
await core.startIfNotAlreadyRunning()
expectation.fulfill()
}
wait(for: [expectation], timeout: 20)
}

func testValidKeyParsing() async throws {
let service = EmailKeyManagerApi(clientConfiguration: .init(raw: .empty))
let privateKey = DecryptedPrivateKeysResponse.DecryptedPrivateKey(
decryptedPrivateKey: TestData.decryptedPrivateKey
)
let response = DecryptedPrivateKeysResponse(privateKeys: [privateKey])
let validKeys = try await service.validate(decryptedPrivateKeysResponse: response)
XCTAssertEqual(validKeys.count, 1)
}

func testInvalidKeyParsing() async throws {
let service = EmailKeyManagerApi(clientConfiguration: .init(raw: .empty))
let privateKey = DecryptedPrivateKeysResponse.DecryptedPrivateKey(
decryptedPrivateKey: String(TestData.decryptedPrivateKey.prefix(200))
)
let response = DecryptedPrivateKeysResponse(privateKeys: [privateKey])

do {
_ = try await service.validate(decryptedPrivateKeysResponse: response)
XCTFail("Invalid key parsing should throw")
} catch {
XCTAssertEqual(error as! EmailKeyManagerApiError, EmailKeyManagerApiError.keysAreInvalid)
}
}
}
2 changes: 2 additions & 0 deletions FlowCryptAppTests/TestData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ struct TestData {
isRevoked: false
)

static let decryptedPrivateKey = "-----BEGIN PGP PRIVATE KEY BLOCK-----\nVersion: FlowCrypt iOS 0.2 Gmail Encryption\nComment: Seamlessly send and receive encrypted email\n\n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\nqAcyYcY1rZf88Hcs0ubVCg==\n=p0Yj\n-----END PGP PRIVATE KEY BLOCK-----"

static let matchingEncryptedMsg = "-----BEGIN PGP MESSAGE-----\r\nVersion: FlowCrypt 6.9.2 Gmail Encryption\r\nComment: Seamlessly send and receive encrypted email\r\n\r\nwV4DCv5+q0kWfdoSAQdA59SzeKU0efRDXSuzoFGHMDdQMujqEQHEaD0AdD21\r\nF3MwAHBc7I5rQmf+h5YvPcG4AaLIIWuC05lUt2NSpk6WPixleHTlo87wNspC\r\n6mCcPBtmwV4D1pPs8ZqVF5kSAQdA5Fmry/eWkZ5BORCTa/HQE5FXple74KpE\r\n6iQBuG7ODzEwdOc33533LE9OehrvhpAsmrGVR7tQfct5UAWYq7Qj3SL/jgMq\r\nfBYJbvHCQFOoRR4VwcBMAwurnAGLJl0iAQf/Rst9i88egj3Ax1gMv+K06F9J\r\nzOw+McaGcc0ob0DO30IOa5OjOaAzjRxQqMLkbG9xQfhhDU0jUsYSP/AX6utf\r\nBDFjndvUcPnoTiP4vvxDuFot3w3K0p1wWqXOR9oUJCb2HpcmBMKUbiJ+qM2D\r\nf5a1McbZeWZJCngXwS7ty76X6xpfVFi/DzeHVe7ryohZPfGB7gCS3scD46Pj\r\nifjgwJhyDjYkCh16voLjWJMOuZdKDIURi7pdnD1C1MexR3gpF9lYuNjkbPvA\r\nmWzT4cBKOTpnmclX8+3wXZ0qPegWAJ1jN0nGHsQAm4MBR3hsM8qZO0FungZF\r\nr3K4WuWx+GK5uFL988HBTAMpGvuIPzZ0jgEP/2Fvg/dg9PbeFaqB3anxRecF\r\nBeaMx0837yqPFxMNz3A8VPR3N+KkjqyBXospe/mKqJcpVIz2KWuqQchgN7xd\r\ny6BzsJ5Nfimvht8nLInQhzp944pfSYeCSYKUAG9z2ZnTNYlzW/c8Ko719nx8\r\nzzukZPmHGJGy8tu3eTHRPyLCBzGJNmQpPw4q/D/SQuWndc/pGv25gWmJi0xn\r\n3+ZQXUPqCRNwc76kEdlLmA23GyHwZGwwoUs2Q9j7fmPx6WLusII4HeGwNKRb\r\nf3B8mFTESwObYnqxXaShPFVFmabUtcWAEmT7Mjw2S1JeOMkHzi7vNcxRY9ld\r\noSTrwL/JeN7N1OOhZr1ow8CByumsPZErB3LHVbNXN4nui8587KibqiNMMOMw\r\nmd28+x0NN8PyIyCwhaz2B+Ekbp3gwLESbqXWa65+HsRiUCE8DBVUrewJMI8y\r\niUcfFyuS+i45nbAeVDf9r4nhcGYoOgXn+ho63ayWVdv4hZtDjg7RO2+M2B2Y\r\norRXlqOtUwutTEXl7mHnfWd0Yi5TOgZOoHkkYhX7GSd9OlFcK91s15OsFWCM\r\nH0SPj5mPEFB73xIGO8oWFE3ZLddIOB98Y38lyHy6ygJ760mX7E0BKNY8zzlS\r\nM1q1NhXdgdUzAhYgvy9jERtdl+REQemvXmeq5u2wSUFwM6N81mlLEsi8T3bY\r\n0kkBas9hguq98M52EU2F887pCB8pcIKvvWmDfxdRda3J5Fs9VvBQN3rU0Mgv\r\nWGGc0+GRUZW/uq603ywgnzIiz2R2N9TS6xviZnhF\r\n=wtE6\r\n-----END PGP MESSAGE-----\r\n"
static let mismatchEncryptedMsg = "-----BEGIN PGP MESSAGE-----\nVersion: FlowCrypt 6.9.1 Gmail Encryption\nComment: Seamlessly send and receive encrypted email\n\nwcFMAzBfgamu0SA1AQ//SmjzUxGcRf5+wlfm1HMldnoFZZUtNua4vdBhTa6X\nTdeHLbPL4cN9Jx9HvrqcH+L4j/2zjM7LiJuFeWdUbfmDQDcTx8UPPnC2i5vW\nizQIDvgJtRtybIpJgxgfFkXYo1P0Dqar3EVRMn3tfxHPax/ZXhr2yCEwg76D\nMZiUKRiWmBlmUw+mEM09YOgjOOhELtxyrrRDbZbv1dcb6KydEGrrsh0X091L\nKiAZdQfksg4NvvbbNdH8tUnpROHiBxD9RUqhsEsZOM0OzOPU+TpIgUgqFO52\nAuCVTurBdW7ZCPH+B0rrxDFBwcO+Pjl0wYOpm9+4LjvA6nlPa0tN/7/c5/z0\n/gV66q8GIxCYkDw+MIMcLWDLsMU6J9vzjC8fGQBnibzIMYeC/eJ5zmeHMo0U\nloA11IMVXnCR9NDS9b/5bJTUBIDABFQEKDjFPhRhD8c0khL9lbGvDzmpM9GZ\nMlz8IMbfQcpNkK65vjXYZuW8rPp0qZOOjkFg1CpUoYEk4VLsvECOLKGeCPz0\nRKWB3ar+l7xF5zxyF7QvMlnusHg2O4V7Z0Cbik06qCesTNNF1CBV77vSrSwN\nnpkXalTBCaJTAbhGrorBPrZf5N0AeVN8XpCgZHEeLkYKfBU8GAa1gOPuLOEn\nFoO3Pu6gvkvnke0/kMsSHYfDw6uzjsePm97fOM3MfkDBwUwDS1ov/OYtlQEB\nD/9NGt+sLI3adjz3SApw6r0so1Ewc6WRdHdjv1BWDPwncE6UCnSnqOonRqnb\n9p6kUC010C4ptw5hP/EL5dR1PEe1uomGcd2VtsRBDe8lreG652td4BebCH0Q\naKwLek+g3QazYpQ5ZDvPfWGB/ny9VrqGdFcpNKTdnvSrMeswSyvFdimWmDew\nLLmBOORaewlRaHAtYUJOfx75zGqCjN/MlPT8Z8MIDg7LnWh9/XANzT3gfkNH\n3UsdTqY7wm4AKxW5ukL1t1przXp1KjNjzQ/fZ8S/gbpYBBNxZ2uQF1ztyacX\nin+UTsUXbP7m94VOPMNDSoN82KUMI1NkOmWlHIyAT55Pt7FcQKp4HH8FBEpO\np/J+6TuIbHTP1Te+NQiwb4XGq5VGF+406bFqELPkcIYHBa4tbE5VLy+UT9Se\n84Lx+Jtf50b4Mw3otSEWoF6c37/4BnB75QgRRYnke5NcM/oS6DMIkETRWTJW\nHULwqRu7W3+4/SF3YhOvaFt+thejPaxHJEicTi6mLPaAIlCtHcH8dXbxy1th\nXVuvm0wlvBBf2JBmgN4e/nU6UxGUbfe4FbeU3RClcYISMFs55povkdMJfQKb\nqCGyfc1TPXfkq/DWiaWWHG+Vvi3oVgWV+DViQNY3OXiNlczZvjW4V01VVzoC\n0wPMSieBveFhGgrW+TZ6GSS4ZdJ5AaeVc8bQ2g3zsd2K1vWzYehIIlhSpMt3\nk4JCeFcP43qmKqZ5lTa5bPkGxCx30OkjBdjkTSNpiiGMlENZBCcp7X3hN3bj\neaDM/LDOwT+fgxgu6UMZBnO6Y6QYR0x3zJy5YAUaF/FBaaxaSrZoaQOnqeHq\nM1TcHBqYcA==\n=+4Oj\n-----END PGP MESSAGE-----"
}

This file was deleted.

Loading