// // PEPSessionTest.m // pEpObjCAdapterTests // // Created by Dirk Zimmermann on 18.07.20. // Copyright © 2020 p≡p. All rights reserved. // #import #import "PEPObjCAdapterTypes_iOS.h" #import "PEPObjCAdapter_iOS.h" #import "NSNumber+PEPRating.h" #import "PEPTestUtils.h" #import "PEPSessionProvider.h" #import "PEPInternalSession.h" #import "PEPInternalSession+SetIdentity.h" #import "XCTestCase+PEPSession.h" @interface PEPSessionTest : XCTestCase @end @implementation PEPSessionTest - (void)setUp { [super setUp]; [self pEpCleanUp]; [PEPObjCAdapter setUnEncryptedSubjectEnabled:NO]; NSError *error = nil; XCTAssertTrue([PEPObjCAdapter configurePassphraseForNewKeys:nil error:&error]); XCTAssertNil(error); } - (void)tearDown { [self pEpCleanUp]; [super tearDown]; } - (void)pEpCleanUp { [PEPTestUtils cleanUp]; } - (void)testMailToMyself { // Our test user: // pEp Test Alice (test key don't use) // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97 XCTAssertTrue([self importBundledKey:@"6FF00E97_sec.asc"]); PEPIdentity *identAlice = [[PEPIdentity alloc] initWithAddress:@"pep.test.alice@pep-project.org" userID:ownUserId userName:@"pEp Test Alice" isOwn:YES fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"]; PEPSession *asyncSession = [PEPSession new]; NSError *error = nil; PEPIdentity *identAliceMyselfed = [self mySelf:identAlice error:&error]; XCTAssertNotNil(identAliceMyselfed); XCTAssertNil(error); PEPMessage *msg = [PEPMessage new]; msg.from = identAlice; msg.to = @[identAlice]; msg.shortMessage = @"Mail to Myself"; msg.longMessage = @"This is a text content"; msg.direction = PEPMsgDirectionOutgoing; error = nil; NSNumber *numRating = [self testOutgoingRatingForMessage:msg error:&error]; XCTAssertNotNil(numRating); XCTAssertNil(error); XCTAssertEqual(numRating.pEpRating, PEPRatingTrustedAndAnonymized); for (NSNumber *boolNumWithEncFormat in @[@YES, @NO]) { error = nil; PEPMessage *encryptedMessage = [PEPMessage new]; if (boolNumWithEncFormat.boolValue) { encryptedMessage = [self encryptMessage:msg extraKeys:nil encFormat:PEPEncFormatPEP status:nil error:&error]; XCTAssertNotNil(encryptedMessage); XCTAssertNil(error); } else { encryptedMessage = [self encryptMessage:msg extraKeys:nil status:nil error:&error]; XCTAssertNotNil(encryptedMessage); XCTAssertNil(error); } XCTestExpectation *expectationDec = [self expectationWithDescription:@"expectationDec"]; [asyncSession decryptMessage:encryptedMessage flags:0 extraKeys:nil errorCallback:^(NSError *error) { XCTFail(); [expectationDec fulfill]; } successCallback:^(PEPMessage * srcMessage, PEPMessage * dstMessage, PEPStringList * keyList, PEPRating rating, PEPDecryptFlags flags, BOOL isFormerlyEncryptedReuploadedMessage) { XCTAssertNotNil(dstMessage); XCTAssertEqual(rating, PEPRatingTrustedAndAnonymized); [expectationDec fulfill]; }]; [self waitForExpectations:@[expectationDec] timeout:PEPTestInternalSyncTimeout]; } } - (void)testEncryptToSelf { // Write mail to yourself ... PEPMessage *encMessage = [self mailWrittenToMySelf]; // ... and assert subject is encrypted XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p"); } - (void)testEncryptAndAttachPrivateKeyIllegalValue { PEPIdentity *identMe = [[PEPIdentity alloc] initWithAddress:@"me-myself-and-i@pep-project.org" userID:@"me-myself-and-i" userName:@"pEp Me" isOwn:YES]; NSError *error = nil; identMe = [self mySelf:identMe error:&error]; XCTAssertNotNil(identMe); XCTAssertNil(error); XCTAssertNotNil(identMe.fingerPrint); NSString *fprAlice = @"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"; PEPIdentity *identAlice = [self checkImportingKeyFilePath:@"6FF00E97_sec.asc" address:@"pep.test.alice@pep-project.org" userID:@"alice_user_id" fingerPrint:fprAlice]; XCTAssertNotNil(identAlice); XCTAssertEqualObjects(identAlice.fingerPrint, fprAlice); NSString *shortMessage = @"whatever it may be"; NSString *longMessage = [NSString stringWithFormat:@"%@ %@", shortMessage, shortMessage]; PEPMessage *message = [PEPMessage new]; message.from = identMe; message.to = @[identAlice]; message.shortMessage = shortMessage; message.longMessage = longMessage; XCTestExpectation *expectationEnc = [self expectationWithDescription:@"expectationEnc"]; PEPSession *asyncSession = [PEPSession new]; [asyncSession encryptMessage:message toFpr:fprAlice encFormat:PEPEncFormatPEP flags:0 errorCallback:^(NSError * _Nonnull error) { [expectationEnc fulfill]; } successCallback:^(PEPMessage * _Nonnull srcMessage, PEPMessage * _Nonnull destMessage) { XCTFail(); [expectationEnc fulfill]; }]; [self waitForExpectations:@[expectationEnc] timeout:PEPTestInternalSyncTimeout]; } - (void)testRatingForIdentity { PEPIdentity *me = [self checkMySelfImportingKeyFilePath:@"6FF00E97_sec.asc" address:@"pep.test.alice@pep-project.org" userID:@"Alice_User_ID" fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"]; XCTAssertNotNil(me); XCTAssertEqual([self ratingForIdentity:me], PEPRatingTrustedAndAnonymized); PEPIdentity *alice = [self checkImportingKeyFilePath:@"6FF00E97_sec.asc" address:@"pep.test.alice@pep-project.org" userID:@"This Is Alice" fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"]; XCTAssertNotNil(alice); XCTAssertEqual([self ratingForIdentity:alice], PEPRatingReliable); } - (void)testTrustWords { NSError *error = nil; NSArray *trustwords = [self trustwordsForFingerprint:@"DB47DB47DB47DB47DB47DB47DB47DB47DB47DB47" languageID:@"en" shortened:false error:&error]; XCTAssertNil(error); XCTAssertEqual([trustwords count], 10); for(id word in trustwords) { XCTAssertEqualObjects(word, @"BAPTISMAL"); } } - (void)testIdentityRatingTrustResetMistrustUndo { PEPIdentity *me = [[PEPIdentity alloc] initWithAddress:@"me@example.org" userID:@"me_myself" userName:@"Me Me" isOwn:YES]; NSError *error = nil; me = [self mySelf:me error:&error]; XCTAssertNotNil(me); XCTAssertNil(error); XCTAssertNotNil(me.fingerPrint); XCTAssertEqual([self ratingForIdentity:me], PEPRatingTrustedAndAnonymized); PEPIdentity *alice = [self checkImportingKeyFilePath:@"6FF00E97_sec.asc" address:@"pep.test.alice@pep-project.org" userID:@"This Is Alice" fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"]; XCTAssertNotNil(alice); XCTAssertEqual([self ratingForIdentity:alice], PEPRatingReliable); XCTAssertTrue([self trustPersonalKey:alice error:&error]); XCTAssertNil(error); XCTAssertEqual([self ratingForIdentity:alice], PEPRatingTrusted); XCTAssertTrue([self keyResetTrust:alice error:&error]); XCTAssertNil(error); XCTAssertEqual([self ratingForIdentity:alice], PEPRatingReliable); XCTAssertTrue([self keyMistrusted:alice error:&error]); XCTAssertNil(error); XCTAssertEqual([self ratingForIdentity:alice], PEPRatingHaveNoKey); } - (void)testQueryKeySyncOnOwnIdentityInALoop { PEPIdentity *identMe = [[PEPIdentity alloc] initWithAddress:@"me-myself-and-i@pep-project.org" userID:@"me-myself-and-i" userName:@"pEp Me" isOwn:YES]; NSError *error = nil; identMe = [self mySelf:identMe error:&error]; XCTAssertNotNil(identMe); XCTAssertNil(error); for (NSNumber *numBool in @[@YES, @NO]) { error = nil; if ([numBool boolValue]) { XCTAssertTrue([self enableSyncForIdentity:identMe error:&error]); } else { XCTAssertTrue([self disableSyncForIdentity:identMe error:&error]); } XCTAssertNil(error); } } - (void)testGetLogWithError { NSError *error = nil; NSString *log = [self getLogWithError:&error]; XCTAssertGreaterThan(log.length, 0); XCTAssertNotNil(log); XCTAssertNil(error); } - (void)testGetTrustwords { PEPIdentity *partner1Orig = [[PEPIdentity alloc] initWithAddress:@"partner1@dontcare.me" userID:@"partner1" userName:@"partner1" isOwn:NO fingerPrint:@"F0CD3F7B422E5D587ABD885BF2D281C2789DD7F6"]; PEPIdentity *meOrig = [[PEPIdentity alloc] initWithAddress:@"me@dontcare.me" userID:@"me" userName:@"me" isOwn:NO fingerPrint:@"CC1F73F6FB774BF08B197691E3BFBCA9248FC681"]; NSError *error = nil; NSString *trustwordsFull = [self getTrustwordsIdentity1:meOrig identity2:partner1Orig language:@"en" full:YES error:&error]; XCTAssertNil(error); XCTAssertEqualObjects(trustwordsFull, @"EMERSON GASPER TOKENISM BOLUS COLLAGE DESPISE BEDDED ENCRYPTION IMAGINE BEDFORD"); NSString *trustwordsUndefined = [self getTrustwordsIdentity1:meOrig identity2:partner1Orig language:@"ZZ" full:YES error:&error]; XCTAssertNotNil(error); XCTAssertNil(trustwordsUndefined); } - (void)testGenKey { PEPIdentity *identMe = [[PEPIdentity alloc] initWithAddress:@"pep.test.iosgenkey@pep-project.org" userID:@"Me" userName:@"pEp Test iOS GenKey" isOwn:YES]; NSError *error = nil; identMe = [self mySelf:identMe error:&error]; XCTAssertNotNil(identMe); XCTAssertNil(error); XCTAssertNotNil(identMe.fingerPrint); XCTAssertNotEqual(identMe.commType, PEPCommTypeUnknown); NSNumber *boolNum = [self isPEPUser:identMe error:&error]; XCTAssertNil(error); XCTAssertNotNil(boolNum); XCTAssertTrue(boolNum.boolValue); } - (void)testTrustOwnKey { PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch" userName:@"userName"]; NSError *error = nil; me = [self mySelf:me error:&error]; XCTAssertNotNil(me); XCTAssertNil(error); XCTAssertTrue([self trustOwnKeyIdentity:me error:&error]); XCTAssertNil(error); } - (void)testKeyResetIdentityOnOwnKeyIsIllegal { PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch" userName:@"userName"]; NSError *error = nil; me = [self mySelf:me error:&error]; XCTAssertNotNil(me); XCTAssertNil(error); NSString *fprOriginal = me.fingerPrint; XCTAssertNotNil(fprOriginal); // Cannot reset all _own_ keys with this method, as documented XCTAssertFalse([self keyReset:me fingerprint:nil error:&error]); XCTAssertNotNil(error); me = [self mySelf:me error:&error]; XCTAssertNotNil(me); XCTAssertNil(error); NSString *fprAfterReset = me.fingerPrint; XCTAssertNotNil(fprAfterReset); XCTAssertNotEqual(fprOriginal, fprAfterReset); } #pragma mark - Helpers - (PEPMessage *)mailWrittenToMySelf { // Write a e-mail to yourself ... PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch" userName:@"userName"]; NSError *error = nil; me = [self mySelf:me error:&error]; XCTAssertNotNil(me); XCTAssertNil(error); NSString *shortMessage = @"Subject"; NSString *longMessage = @"Oh, this is a long body text!"; PEPMessage *mail = [PEPTestUtils mailFrom:me toIdent:me shortMessage:shortMessage longMessage:longMessage outgoing:YES]; PEPSession *asyncSession = [PEPSession new]; XCTestExpectation *expectationEnc = [self expectationWithDescription:@"expectationEnc"]; __block PEPMessage *encryptedMessage = [PEPMessage new]; [asyncSession encryptMessage:mail forSelf:me extraKeys:nil errorCallback:^(NSError * _Nonnull error) { XCTFail(); [expectationEnc fulfill]; } successCallback:^(PEPMessage * _Nonnull srcMessage, PEPMessage * _Nonnull destMessage) { encryptedMessage = destMessage; [expectationEnc fulfill]; }]; [self waitForExpectations:@[expectationEnc] timeout:PEPTestInternalSyncTimeout]; return encryptedMessage; } - (NSNumber * _Nullable)testOutgoingRatingForMessage:(PEPMessage * _Nonnull)theMessage error:(NSError * _Nullable * _Nullable)error { NSError *theError = nil; NSNumber *ratingOriginal = [self outgoingRatingForMessage:theMessage error:&theError]; XCTAssertNotNil(ratingOriginal); XCTAssertNil(theError); if (ratingOriginal == nil) { return nil; } NSNumber *ratingPreview = [[PEPSessionProvider session] outgoingRatingPreviewForMessage:theMessage error:error]; XCTAssertEqual(ratingOriginal, ratingPreview); return ratingOriginal; } - (PEPIdentity *)checkImportingKeyFilePath:(NSString *)filePath address:(NSString *)address userID:(NSString *)userID fingerPrint:(NSString *)fingerPrint { BOOL success = [self importBundledKey:filePath]; XCTAssertTrue(success); if (success) { // Our test user: PEPIdentity *identTest = [[PEPIdentity alloc] initWithAddress:address userID:userID userName:[NSString stringWithFormat:@"Some User Name %@", userID] isOwn:NO]; NSError *error = nil; PEPIdentity *identTestUpdated = [self updateIdentity:identTest error:&error]; XCTAssertNil(identTestUpdated.fingerPrint); // key election, no key is chosen yet PEPInternalSession *session = [PEPInternalSession new]; error = nil; identTest.fingerPrint = fingerPrint; [session setIdentity:identTest error:&error]; XCTAssertNil(error); identTest.fingerPrint = fingerPrint; identTestUpdated = [self updateIdentity:identTest error:&error]; XCTAssertNil(error); XCTAssertNotNil(identTestUpdated); XCTAssertNotNil(identTestUpdated.fingerPrint); XCTAssertEqualObjects(identTestUpdated.fingerPrint, fingerPrint); return identTestUpdated; } else { return nil; } } - (BOOL)importBundledKey:(NSString *)item { PEPSession *asyncSession = [PEPSession new]; NSString *txtFileContents = [PEPTestUtils loadStringFromFileName:item]; if (!txtFileContents) { XCTFail(); } __block BOOL success = YES; XCTestExpectation *expImport = [self expectationWithDescription:@"expImport"]; [asyncSession importKey:txtFileContents errorCallback:^(NSError * _Nonnull error) { XCTFail(); success = NO; [expImport fulfill]; } successCallback:^(NSArray * _Nonnull identities) { [expImport fulfill]; success = YES; }]; [self waitForExpectations:@[expImport] timeout:PEPTestInternalSyncTimeout]; return success; } - (PEPIdentity * _Nullable)checkMySelfImportingKeyFilePath:(NSString *)filePath address:(NSString *)address userID:(NSString *)userID fingerPrint:(NSString *)fingerPrint { PEPSession *asyncSession = [PEPSession new]; XCTAssertTrue([self importBundledKey:filePath]); // Our test user: PEPIdentity *identTest = [[PEPIdentity alloc] initWithAddress:address userID:userID userName:[NSString stringWithFormat:@"Some User Name %@", userID] isOwn:YES fingerPrint: fingerPrint]; __block BOOL success = NO; XCTestExpectation *expSetOwnKey = [self expectationWithDescription:@"expSetOwnKey"]; [asyncSession setOwnKey:identTest fingerprint:fingerPrint errorCallback:^(NSError * _Nonnull error) { XCTFail(); success = NO; [expSetOwnKey fulfill]; } successCallback:^{ success = YES; [expSetOwnKey fulfill]; }]; [self waitForExpectations:@[expSetOwnKey] timeout:PEPTestInternalSyncTimeout]; if (success) { return identTest; } else { return nil; } } @end