pEpObjCTests/PEPSessionTest.m
author Dirk Zimmermann <dirk@pep-project.org>
Mon, 19 Feb 2018 10:30:59 +0100
changeset 470 3d39b8fc939d
parent 465 c119e90af091
child 471 b19faa4c131f
permissions -rw-r--r--
IOSAD-78 rm test code that manipulates DB files during tests
andreas@392
     1
//
andreas@392
     2
//  PEPSessionTest.m
andreas@392
     3
//  pEpObjCAdapterTests
andreas@392
     4
//
andreas@392
     5
//  Created by Andreas Buff on 18.01.18.
andreas@392
     6
//  Copyright © 2018 p≡p. All rights reserved.
andreas@392
     7
//
andreas@392
     8
andreas@392
     9
#import <XCTest/XCTest.h>
andreas@392
    10
andreas@392
    11
#import "PEPObjCAdapter.h"
andreas@392
    12
#import "NSDictionary+Extension.h"
andreas@392
    13
#import "PEPIdentity.h"
andreas@392
    14
#import "PEPMessage.h"
andreas@392
    15
andreas@392
    16
#import "PEPTestUtils.h"
andreas@392
    17
#import "PEPTestSyncDelegate.h"
andreas@392
    18
andreas@392
    19
@interface PEPSessionTest : XCTestCase
andreas@392
    20
@end
andreas@392
    21
andreas@392
    22
@implementation PEPSessionTest
andreas@392
    23
andreas@392
    24
- (void)setUp
andreas@392
    25
{
andreas@392
    26
    [super setUp];
andreas@416
    27
    [PEPObjCAdapter setUnecryptedSubjectEnabled:NO];
andreas@416
    28
andreas@392
    29
    [self pEpCleanUp];
andreas@392
    30
}
andreas@392
    31
andreas@392
    32
- (void)tearDown {
andreas@392
    33
    [self pEpCleanUp];
andreas@392
    34
    [super tearDown];
andreas@392
    35
}
andreas@392
    36
andreas@392
    37
- (void)testSyncSession
andreas@392
    38
{
andreas@392
    39
    PEPSession *session = [PEPSession new];
andreas@392
    40
    PEPTestSyncDelegate *syncDelegate = [[PEPTestSyncDelegate alloc] init];
andreas@392
    41
andreas@392
    42
    // This should attach session just created
andreas@392
    43
    [PEPObjCAdapter startSync:syncDelegate];
andreas@392
    44
andreas@392
    45
    PEPIdentity *identMe = [[PEPIdentity alloc]
andreas@392
    46
                            initWithAddress:@"pep.test.iosgenkey@pep-project.org"
andreas@392
    47
                            userID:@"Me"
andreas@392
    48
                            userName:@"pEp Test iOS GenKey"
andreas@392
    49
                            isOwn:YES];
andreas@392
    50
andreas@392
    51
    [session mySelf:identMe];
andreas@392
    52
andreas@392
    53
    bool res = [syncDelegate waitUntilSent:1];
andreas@392
    54
andreas@392
    55
    // Can't currently work, engine doesn't contain sync.
andreas@392
    56
    XCTAssertFalse(res);
andreas@392
    57
andreas@392
    58
    // This should detach session just created
andreas@392
    59
    [PEPObjCAdapter stopSync];
andreas@392
    60
}
andreas@392
    61
andreas@392
    62
- (void)testTrustWords
andreas@392
    63
{
andreas@392
    64
    PEPSession *session = [PEPSession new];
andreas@392
    65
andreas@392
    66
    NSArray *trustwords = [session trustwords:@"DB47DB47DB47DB47DB47DB47DB47DB47DB47DB47"
andreas@392
    67
                                  forLanguage:@"en" shortened:false];
andreas@392
    68
    XCTAssertEqual([trustwords count], 10);
andreas@392
    69
andreas@392
    70
    for(id word in trustwords)
andreas@392
    71
        XCTAssertEqualObjects(word, @"BAPTISMAL");
andreas@392
    72
}
andreas@392
    73
andreas@392
    74
- (void)testGenKey
andreas@392
    75
{
andreas@392
    76
    PEPSession *session = [PEPSession new];
andreas@392
    77
andreas@392
    78
    PEPIdentity *identMe = [[PEPIdentity alloc]
andreas@392
    79
                            initWithAddress:@"pep.test.iosgenkey@pep-project.org"
andreas@392
    80
                            userID:@"Me"
andreas@392
    81
                            userName:@"pEp Test iOS GenKey"
andreas@392
    82
                            isOwn:YES];
andreas@392
    83
andreas@392
    84
    [session mySelf:identMe];
andreas@392
    85
andreas@392
    86
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
    87
    XCTAssertNotEqual(identMe.commType, PEP_ct_unknown);
andreas@392
    88
andreas@392
    89
    // check that the comm type is not a PGP one
andreas@392
    90
    XCTAssertFalse([identMe containsPGPCommType]);
andreas@392
    91
}
andreas@392
    92
andreas@392
    93
- (void)testMySelfCommType
andreas@392
    94
{
andreas@392
    95
    PEPSession *session = [PEPSession new];
andreas@392
    96
andreas@392
    97
    PEPIdentity *identMe = [[PEPIdentity alloc]
andreas@392
    98
                            initWithAddress:@"pep.test.iosgenkey@pep-project.org"
andreas@392
    99
                            userID:@"Me"
andreas@392
   100
                            userName:@"pEp Test iOS GenKey"
andreas@392
   101
                            isOwn:YES];
andreas@392
   102
andreas@392
   103
    [session mySelf:identMe];
andreas@392
   104
andreas@392
   105
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
   106
    XCTAssertNotEqual(identMe.commType, PEP_ct_unknown);
andreas@392
   107
andreas@392
   108
    // check that the comm type is not a PGP one
andreas@392
   109
    XCTAssertFalse([identMe containsPGPCommType]);
andreas@392
   110
andreas@392
   111
    dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0);
andreas@392
   112
    dispatch_sync(queue, ^{
andreas@392
   113
        PEPSession *session2 = [PEPSession new];
andreas@392
   114
andreas@392
   115
        // Now simulate an update from the app, which usually only caches
andreas@392
   116
        // kPepUsername, kPepAddress and optionally kPepUserID.
andreas@392
   117
        PEPIdentity *identMe2 = [[PEPIdentity alloc]
andreas@392
   118
                                 initWithAddress:identMe.address
andreas@392
   119
                                 userID:identMe.userID
andreas@392
   120
                                 userName:identMe.userName
andreas@392
   121
                                 isOwn:NO];
andreas@392
   122
        [session2 mySelf:identMe2];
andreas@392
   123
        XCTAssertNotNil(identMe2.fingerPrint);
andreas@392
   124
        XCTAssertFalse([identMe2 containsPGPCommType]);
andreas@392
   125
        XCTAssertEqualObjects(identMe2.fingerPrint, identMe.fingerPrint);
andreas@392
   126
andreas@392
   127
        // Now pretend the app only knows kPepUsername and kPepAddress
andreas@411
   128
        PEPIdentity *identMe3 = [PEPTestUtils foreignPepIdentityWithAddress:identMe.address
andreas@411
   129
                                                                   userName:identMe.userName];
andreas@392
   130
        [session2 mySelf:identMe3];
andreas@392
   131
        XCTAssertNotNil(identMe3.fingerPrint);
andreas@392
   132
        XCTAssertFalse([identMe3 containsPGPCommType]);
andreas@392
   133
        XCTAssertEqualObjects(identMe3.fingerPrint, identMe.fingerPrint);
andreas@392
   134
andreas@392
   135
        XCTAssertEqualObjects(identMe.address, identMe2.address);
andreas@392
   136
        XCTAssertEqualObjects(identMe.address, identMe3.address);
andreas@392
   137
        XCTAssertEqual(identMe.commType, identMe2.commType);
andreas@392
   138
        XCTAssertEqual(identMe.commType, identMe3.commType);
andreas@392
   139
    });
andreas@392
   140
}
andreas@392
   141
dirk@435
   142
- (void)testPartnerWithoutFingerPrint
dirk@435
   143
{
dirk@435
   144
    PEPSession *session = [PEPSession new];
dirk@435
   145
dirk@435
   146
    PEPIdentity *identRandom = [[PEPIdentity alloc]
dirk@435
   147
                                initWithAddress:@"does_not_exist@example.com"
dirk@435
   148
                                userID:@"got_out"
dirk@435
   149
                                userName:@"No Way Not Even Alice"
dirk@435
   150
                                isOwn:NO];
dirk@435
   151
dirk@435
   152
    [session updateIdentity:identRandom];
dirk@435
   153
    XCTAssertNil(identRandom.fingerPrint);
dirk@435
   154
}
dirk@435
   155
dirk@437
   156
- (void)testImportPartnerKeys
dirk@436
   157
{
dirk@437
   158
    [self checkImportingKeyFilePath:@"6FF00E97_sec.asc" address:@"pep.test.alice@pep-project.org"
dirk@437
   159
                             userID:@"This Is Alice"
dirk@456
   160
                        fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@456
   161
                            session: nil];
dirk@436
   162
dirk@437
   163
    [self checkImportingKeyFilePath:@"0xC9C2EE39.asc" address:@"pep.test.bob@pep-project.org"
dirk@437
   164
                             userID:@"This Is Bob"
dirk@456
   165
                        fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"
dirk@456
   166
                            session: nil];
dirk@436
   167
}
dirk@436
   168
dirk@439
   169
- (void)testIdentityRating
dirk@439
   170
{
dirk@439
   171
    PEPSession *session = [PEPSession new];
dirk@439
   172
dirk@439
   173
    PEPIdentity *me = [self
dirk@439
   174
                       checkMySelfImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@439
   175
                       address:@"pep.test.alice@pep-project.org"
dirk@439
   176
                       userID:@"Alice_User_ID"
dirk@439
   177
                       fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@439
   178
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@439
   179
dirk@439
   180
    PEPIdentity *alice = [self
dirk@439
   181
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@439
   182
                          address:@"pep.test.alice@pep-project.org"
dirk@439
   183
                          userID:@"This Is Alice"
dirk@456
   184
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@456
   185
                          session: session];
dirk@439
   186
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@439
   187
}
dirk@439
   188
dirk@446
   189
- (void)testIdentityRatingTrustResetMistrustUndo
dirk@445
   190
{
dirk@445
   191
    PEPSession *session = [PEPSession new];
dirk@445
   192
dirk@460
   193
    PEPIdentity *me = [[PEPIdentity alloc]
dirk@460
   194
                       initWithAddress:@"me@example.org"
dirk@460
   195
                       userID:@"me_myself"
dirk@460
   196
                       userName:@"Me Me"
dirk@460
   197
                       isOwn:YES];
dirk@460
   198
    [session mySelf:me];
dirk@460
   199
    XCTAssertNotNil(me.fingerPrint);
dirk@445
   200
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@445
   201
dirk@445
   202
    PEPIdentity *alice = [self
dirk@445
   203
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@445
   204
                          address:@"pep.test.alice@pep-project.org"
dirk@445
   205
                          userID:@"This Is Alice"
dirk@456
   206
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@456
   207
                          session: session];
dirk@445
   208
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@445
   209
dirk@446
   210
    [session trustPersonalKey:alice];
dirk@446
   211
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@446
   212
dirk@446
   213
    [session keyResetTrust:alice];
dirk@446
   214
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@446
   215
dirk@445
   216
    [session keyMistrusted:alice];
dirk@445
   217
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@445
   218
dirk@445
   219
    [session undoLastMistrust];
dirk@445
   220
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@446
   221
dirk@446
   222
    [session trustPersonalKey:alice];
dirk@446
   223
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@446
   224
dirk@446
   225
    [session keyResetTrust:alice];
dirk@450
   226
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@445
   227
}
dirk@445
   228
dirk@458
   229
/**
dirk@458
   230
 Try to provoke a SQLITE_BUSY (ENGINE-374)
dirk@458
   231
 */
dirk@458
   232
- (void)testIdentityRatingTrustResetMistrustUndoBusy
dirk@458
   233
{
dirk@458
   234
    PEPSession *session = [PEPSession new];
dirk@458
   235
dirk@459
   236
    PEPIdentity *me = [[PEPIdentity alloc]
dirk@459
   237
                       initWithAddress:@"me@example.org"
dirk@459
   238
                       userID:@"me_myself"
dirk@459
   239
                       userName:@"Me Me"
dirk@459
   240
                       isOwn:YES];
dirk@459
   241
    [session mySelf:me];
dirk@459
   242
    XCTAssertNotNil(me.fingerPrint);
dirk@458
   243
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@458
   244
dirk@458
   245
    PEPIdentity *alice = [self
dirk@458
   246
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@458
   247
                          address:@"pep.test.alice@pep-project.org"
dirk@458
   248
                          userID:@"This Is Alice"
dirk@458
   249
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@458
   250
                          session: session];
dirk@458
   251
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@458
   252
dirk@458
   253
    void (^encryptingBlock)(void) = ^{
dirk@458
   254
        PEPSession *innerSession = [PEPSession new];
dirk@458
   255
        PEPMessage *msg = [PEPMessage new];
dirk@458
   256
        msg.from = me;
dirk@458
   257
        msg.to = @[alice];
dirk@458
   258
        msg.shortMessage = @"The subject";
dirk@458
   259
        msg.longMessage = @"Lots and lots of text";
dirk@458
   260
        PEPMessage *encMsg;
dirk@458
   261
        PEP_STATUS status = [innerSession encryptMessage:msg identity:me dest:&encMsg];
dirk@458
   262
        XCTAssertEqual(status, PEP_STATUS_OK);
dirk@458
   263
    };
dirk@458
   264
dirk@458
   265
    dispatch_group_t backgroundGroup = dispatch_group_create();
dirk@458
   266
    dispatch_group_async(backgroundGroup,
dirk@458
   267
                         dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), encryptingBlock);
dirk@458
   268
dirk@458
   269
    [session trustPersonalKey:alice];
dirk@458
   270
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@458
   271
dirk@458
   272
    [session keyResetTrust:alice];
dirk@458
   273
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@458
   274
dirk@458
   275
    [session keyMistrusted:alice];
dirk@458
   276
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@458
   277
dirk@458
   278
    [session undoLastMistrust];
dirk@458
   279
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@458
   280
dirk@458
   281
    [session trustPersonalKey:alice];
dirk@458
   282
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@458
   283
dirk@458
   284
    [session keyResetTrust:alice];
dirk@458
   285
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@458
   286
dirk@458
   287
    dispatch_group_wait(backgroundGroup, DISPATCH_TIME_FOREVER);
dirk@458
   288
}
dirk@458
   289
andreas@392
   290
- (void)testOutgoingColors
andreas@392
   291
{
andreas@392
   292
    PEPSession *session = [PEPSession new];
andreas@392
   293
andreas@392
   294
    // Our test user :
andreas@392
   295
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   296
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   297
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   298
andreas@392
   299
    // Our test user :
dirk@440
   300
    PEPIdentity *identAlice = [self
dirk@440
   301
                               checkMySelfImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@440
   302
                               address:@"pep.test.alice@pep-project.org"
dirk@440
   303
                               userID:@"Alice_User_ID"
andreas@392
   304
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   305
andreas@392
   306
    //Message
andreas@392
   307
dirk@441
   308
    {
dirk@441
   309
        PEPIdentity *identUnknownBob = [[PEPIdentity alloc]
dirk@441
   310
                                        initWithAddress:@"pep.test.unknown.bob@pep-project.org"
dirk@441
   311
                                        userID:@"4242" userName:@"pEp Test Bob Unknown"
dirk@441
   312
                                        isOwn:NO];
dirk@441
   313
dirk@441
   314
        PEPMessage *msgGray = [PEPMessage new];
dirk@441
   315
        msgGray.from = identAlice;
dirk@441
   316
        msgGray.to = @[identUnknownBob];
dirk@441
   317
        msgGray.shortMessage = @"All Gray Test";
dirk@441
   318
        msgGray.longMessage = @"This is a text content";
dirk@441
   319
        msgGray.direction = PEP_dir_outgoing;
dirk@441
   320
dirk@441
   321
        // Test with unknown Bob
dirk@441
   322
        PEP_rating clr = [session outgoingColorForMessage:msgGray];
dirk@441
   323
        XCTAssertEqual(clr, PEP_rating_unencrypted);
dirk@441
   324
    }
dirk@441
   325
dirk@441
   326
    PEPIdentity *identBob = [self
dirk@441
   327
                             checkImportingKeyFilePath:@"0xC9C2EE39.asc"
dirk@441
   328
                             address:@"pep.test.bob@pep-project.org"
dirk@441
   329
                             userID:@"42"
dirk@456
   330
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"
dirk@456
   331
                             session: session];
dirk@438
   332
andreas@392
   333
    PEPMessage *msg = [PEPMessage new];
andreas@392
   334
    msg.from = identAlice;
dirk@438
   335
    msg.to = @[identBob];
dirk@441
   336
    msg.shortMessage = @"All Gray Test";
andreas@392
   337
    msg.longMessage = @"This is a text content";
andreas@392
   338
    msg.direction = PEP_dir_outgoing;
andreas@392
   339
dirk@441
   340
    // Should be yellow, since no handshake happened.
andreas@392
   341
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   342
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   343
andreas@392
   344
    clr = [session identityRating:identBob];
dirk@420
   345
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   346
andreas@392
   347
    // Let' say we got that handshake, set PEP_ct_confirmed in Bob's identity
andreas@392
   348
    [session trustPersonalKey:identBob];
andreas@392
   349
andreas@392
   350
    // This time it should be green
andreas@392
   351
    clr = [session outgoingColorForMessage:msg];
dirk@420
   352
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   353
andreas@392
   354
    clr = [session identityRating:identBob];
dirk@420
   355
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   356
andreas@392
   357
    // Let' say we undo handshake
andreas@392
   358
    [session keyResetTrust:identBob];
andreas@392
   359
andreas@392
   360
    // Yellow ?
andreas@392
   361
    clr = [session outgoingColorForMessage:msg];
dirk@420
   362
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   363
andreas@392
   364
    // mistrust Bob
andreas@392
   365
    [session keyMistrusted:identBob];
andreas@392
   366
dirk@444
   367
    identBob.fingerPrint = nil;
dirk@441
   368
    [session updateIdentity:identBob];
dirk@441
   369
    XCTAssertNil(identBob.fingerPrint);
dirk@441
   370
andreas@392
   371
    // Gray == PEP_rating_unencrypted
andreas@392
   372
    clr = [session outgoingColorForMessage:msg];
dirk@420
   373
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   374
dirk@444
   375
    // Undo
dirk@443
   376
    [session undoLastMistrust];
dirk@444
   377
    [session updateIdentity:identBob];
dirk@444
   378
    XCTAssertNotNil(identBob.fingerPrint);
andreas@392
   379
andreas@392
   380
    // Back to yellow
andreas@392
   381
    clr = [session outgoingColorForMessage:msg];
dirk@420
   382
    XCTAssertEqual(clr, PEP_rating_reliable);
dirk@444
   383
    XCTAssertEqual([session identityRating:identBob], PEP_rating_reliable);
andreas@392
   384
andreas@392
   385
    // Trust again
andreas@392
   386
    [session trustPersonalKey:identBob];
andreas@392
   387
andreas@392
   388
    // Back to green
andreas@392
   389
    clr = [session outgoingColorForMessage:msg];
dirk@420
   390
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   391
andreas@392
   392
    // Now let see if it turns back yellow if we add an unconfirmed folk.
andreas@392
   393
    // pEp Test John (test key, don't use) <pep.test.john@pep-project.org>
andreas@392
   394
    // AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575
andreas@392
   395
    [PEPTestUtils importBundledKey:@"0x70DCF575.asc"];
andreas@392
   396
andreas@392
   397
    PEPIdentity *identJohn = [[PEPIdentity alloc]
andreas@392
   398
                              initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   399
                              userID:@"101" userName:@"pEp Test John"
andreas@392
   400
                              isOwn:NO
andreas@392
   401
                              fingerPrint:@"AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575"];
andreas@392
   402
andreas@392
   403
    [session updateIdentity:identJohn];
andreas@392
   404
andreas@411
   405
    msg.cc = @[[PEPTestUtils foreignPepIdentityWithAddress:@"pep.test.john@pep-project.org"
andreas@411
   406
                                                  userName:@"pEp Test John"]];
andreas@392
   407
    // Yellow ?
andreas@392
   408
    clr = [session outgoingColorForMessage:msg];
dirk@420
   409
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   410
andreas@392
   411
    PEPMessage *encmsg;
andreas@392
   412
    PEP_STATUS status = [session encryptMessage:msg extra:@[] dest:&encmsg];
andreas@392
   413
andreas@392
   414
    XCTAssertNotNil(encmsg);
andreas@392
   415
    XCTAssertEqualObjects(encmsg.shortMessage, @"p≡p");
andreas@392
   416
    XCTAssertTrue([encmsg.longMessage containsString:@"p≡p"]);
andreas@392
   417
dirk@420
   418
    XCTAssertEqual(status, PEP_STATUS_OK);
andreas@392
   419
}
andreas@392
   420
andreas@392
   421
andreas@392
   422
- (void)testOutgoingBccColors
andreas@392
   423
{
andreas@392
   424
    PEPSession *session = [PEPSession new];
andreas@392
   425
andreas@392
   426
    // Our test user :
andreas@392
   427
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   428
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   429
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   430
andreas@392
   431
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   432
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   433
                               userID:ownUserId
andreas@392
   434
                               userName:@"pEp Test Alice"
andreas@392
   435
                               isOwn:YES
andreas@392
   436
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   437
andreas@392
   438
    [session mySelf:identAlice];
andreas@392
   439
andreas@392
   440
    PEPMessage *msg = [PEPMessage new];
andreas@392
   441
    msg.from = identAlice;
andreas@392
   442
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   443
                                             userID:@"42" userName:@"pEp Test Bob" isOwn:NO]];
andreas@392
   444
    msg.shortMessage = @"All Green Test";
andreas@392
   445
    msg.longMessage = @"This is a text content";
andreas@392
   446
    msg.direction = PEP_dir_outgoing;
andreas@392
   447
andreas@392
   448
    // Test with unknown Bob
andreas@392
   449
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   450
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   451
andreas@392
   452
    // Now let see with bob's pubkey already known
andreas@392
   453
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   454
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
andreas@392
   455
    [PEPTestUtils importBundledKey:@"0xC9C2EE39.asc"];
andreas@392
   456
andreas@392
   457
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   458
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   459
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   460
                             isOwn:NO
andreas@392
   461
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
andreas@392
   462
andreas@392
   463
    [session updateIdentity:identBob];
andreas@392
   464
andreas@392
   465
    // Should be yellow, since no handshake happened.
andreas@392
   466
    clr = [session outgoingColorForMessage:msg];
dirk@420
   467
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   468
andreas@392
   469
    clr = [session identityRating:identBob];
dirk@420
   470
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   471
andreas@392
   472
    // Let' say we got that handshake, set PEP_ct_confirmed in Bob's identity
andreas@392
   473
    [session trustPersonalKey:identBob];
andreas@392
   474
andreas@392
   475
    // This time it should be green
andreas@392
   476
    clr = [session outgoingColorForMessage:msg];
dirk@420
   477
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   478
andreas@392
   479
    clr = [session identityRating:identBob];
dirk@420
   480
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   481
andreas@392
   482
    // Now let see if it turns back yellow if we add an unconfirmed folk.
andreas@392
   483
    // pEp Test John (test key, don't use) <pep.test.john@pep-project.org>
andreas@392
   484
    // AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575
andreas@392
   485
    [PEPTestUtils importBundledKey:@"0x70DCF575.asc"];
andreas@392
   486
andreas@392
   487
    PEPIdentity *identJohn = [[PEPIdentity alloc]
andreas@392
   488
                              initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   489
                              userID:@"101" userName:@"pEp Test John"
andreas@392
   490
                              isOwn:NO
andreas@392
   491
                              fingerPrint:@"AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575"];
andreas@392
   492
andreas@392
   493
    [session updateIdentity:identJohn];
andreas@392
   494
andreas@392
   495
    msg.bcc = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   496
                                              userID:@"101" userName:@"pEp Test John" isOwn:NO]];
andreas@392
   497
andreas@392
   498
    // Yellow ?
andreas@392
   499
    clr = [session outgoingColorForMessage:msg];
dirk@420
   500
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   501
andreas@392
   502
    [session trustPersonalKey:identJohn];
andreas@392
   503
andreas@392
   504
    // This time it should be green
andreas@392
   505
    clr = [session outgoingColorForMessage:msg];
dirk@420
   506
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   507
andreas@392
   508
    clr = [session identityRating:identJohn];
dirk@420
   509
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   510
}
andreas@392
   511
andreas@392
   512
- (void)testDontEncryptForMistrusted
andreas@392
   513
{
andreas@392
   514
    PEPSession *session = [PEPSession new];
andreas@392
   515
andreas@392
   516
    // Our test user :
andreas@392
   517
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   518
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   519
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   520
andreas@392
   521
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   522
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   523
                               userID:ownUserId
andreas@392
   524
                               userName:@"pEp Test Alice"
andreas@392
   525
                               isOwn:YES
andreas@392
   526
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   527
andreas@392
   528
    [session mySelf:identAlice];
andreas@392
   529
andreas@392
   530
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   531
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
andreas@392
   532
    [PEPTestUtils importBundledKey:@"0xC9C2EE39.asc"];
andreas@392
   533
andreas@392
   534
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   535
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   536
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   537
                             isOwn:NO
andreas@392
   538
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
andreas@392
   539
andreas@392
   540
    [session updateIdentity:identBob];
andreas@392
   541
andreas@392
   542
    // mistrust Bob
andreas@392
   543
    [session keyMistrusted:identBob];
andreas@392
   544
andreas@392
   545
    PEPMessage *msg = [PEPMessage new];
andreas@392
   546
    msg.from = identAlice;
andreas@392
   547
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org" userID:@"42"
andreas@392
   548
                                           userName:@"pEp Test Bob" isOwn:NO]];
andreas@392
   549
    msg.shortMessage = @"All Green Test";
andreas@392
   550
    msg.longMessage = @"This is a text content";
andreas@392
   551
    msg.direction = PEP_dir_outgoing;
andreas@392
   552
andreas@392
   553
    // Gray == PEP_rating_unencrypted
andreas@392
   554
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   555
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   556
andreas@392
   557
    PEPMessage *encmsg;
andreas@392
   558
    PEP_STATUS status = [session encryptMessage:msg extra:@[] dest:&encmsg];
andreas@392
   559
dirk@420
   560
    XCTAssertEqual(status, PEP_UNENCRYPTED);
andreas@392
   561
andreas@392
   562
    XCTAssertNotEqualObjects(encmsg.attachments[0][@"mimeType"], @"application/pgp-encrypted");
andreas@392
   563
andreas@392
   564
    [self pEpCleanUp];
andreas@392
   565
}
andreas@392
   566
andreas@392
   567
- (void)testRevoke
andreas@392
   568
{
andreas@392
   569
    PEPSession *session = [PEPSession new];
andreas@392
   570
andreas@392
   571
    // Our test user :
andreas@392
   572
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   573
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   574
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   575
    NSString *fpr = @"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
andreas@392
   576
andreas@392
   577
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   578
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   579
                               userID:ownUserId
andreas@392
   580
                               userName:@"pEp Test Alice"
andreas@392
   581
                               isOwn:YES
andreas@392
   582
                               fingerPrint:fpr];
andreas@392
   583
andreas@392
   584
    [session mySelf:identAlice];
andreas@392
   585
andreas@392
   586
    PEPIdentity *identAlice2 = [identAlice mutableCopy];
andreas@392
   587
andreas@392
   588
    // This will revoke key
andreas@392
   589
    [session keyMistrusted:identAlice2];
andreas@416
   590
    identAlice2.fingerPrint = nil;
andreas@416
   591
    [session mySelf:identAlice];
andreas@416
   592
andreas@392
   593
    // Check fingerprint is different
andreas@392
   594
    XCTAssertNotEqualObjects(identAlice2.fingerPrint, fpr);
andreas@392
   595
}
andreas@392
   596
andreas@392
   597
- (void)testMailToMyself
andreas@392
   598
{
andreas@392
   599
    PEPSession *session = [PEPSession new];
andreas@392
   600
andreas@392
   601
    // Our test user :
andreas@392
   602
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   603
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   604
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   605
andreas@392
   606
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   607
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   608
                               userID:ownUserId
andreas@392
   609
                               userName:@"pEp Test Alice"
andreas@392
   610
                               isOwn:YES
andreas@392
   611
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   612
andreas@392
   613
    [session mySelf:identAlice];
andreas@392
   614
andreas@392
   615
    PEPMessage *msg = [PEPMessage new];
andreas@392
   616
    msg.from = identAlice;
andreas@392
   617
    msg.to = @[identAlice];
andreas@392
   618
    msg.shortMessage = @"Mail to Myself";
andreas@392
   619
    msg.longMessage = @"This is a text content";
andreas@392
   620
    msg.direction = PEP_dir_outgoing;
andreas@392
   621
andreas@392
   622
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   623
    XCTAssertEqual(clr, PEP_rating_trusted_and_anonymized);
andreas@392
   624
andreas@392
   625
    PEPMessage *encmsg;
andreas@392
   626
    PEP_STATUS status = [session encryptMessage:msg extra:@[] dest:&encmsg];
andreas@392
   627
dirk@420
   628
    XCTAssertEqual(status, PEP_STATUS_OK);
andreas@392
   629
andreas@392
   630
    NSArray* keys;
andreas@392
   631
    PEPMessage *decmsg;
andreas@392
   632
andreas@392
   633
    clr = [session decryptMessage:encmsg dest:&decmsg keys:&keys];
dirk@420
   634
    XCTAssertEqual(clr, PEP_rating_trusted_and_anonymized);
andreas@392
   635
}
andreas@392
   636
andreas@392
   637
- (void)testEncryptedMailFromMutt
andreas@392
   638
{
andreas@392
   639
    PEPSession *session = [PEPSession new];
andreas@392
   640
andreas@392
   641
    // This is the public key for test001@peptest.ch
andreas@392
   642
    [PEPTestUtils importBundledKey:@"A3FC7F0A.asc"];
andreas@392
   643
andreas@392
   644
    // This is the secret key for test001@peptest.ch
andreas@392
   645
    [PEPTestUtils importBundledKey:@"A3FC7F0A_sec.asc"];
andreas@392
   646
andreas@392
   647
    // Mail from mutt, already processed into message dict by the app.
dirk@465
   648
    NSMutableDictionary *msgDict = [[PEPTestUtils
dirk@465
   649
                                     unarchiveDictionary:@"msg_to_A3FC7F0A_from_mutt.ser"]
dirk@465
   650
                                    mutableCopy];
andreas@392
   651
    [msgDict removeObjectForKey:kPepLongMessage];
andreas@392
   652
    [msgDict removeObjectForKey:kPepLongMessageFormatted];
andreas@392
   653
andreas@392
   654
    // Also extracted "live" from the app.
dirk@465
   655
    NSMutableDictionary *accountDict = [[PEPTestUtils
dirk@465
   656
                                         unarchiveDictionary:@"account_A3FC7F0A.ser"]
dirk@465
   657
                                        mutableCopy];
andreas@392
   658
    [accountDict removeObjectForKey:kPepCommType];
andreas@392
   659
    [accountDict removeObjectForKey:kPepFingerprint];
andreas@392
   660
    PEPIdentity *identMe = [[PEPIdentity alloc] initWithDictionary:accountDict];
andreas@392
   661
andreas@392
   662
    [session mySelf:identMe];
andreas@392
   663
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
   664
andreas@392
   665
    NSArray* keys;
andreas@392
   666
    PEPMessage *msg = [PEPMessage new];
andreas@392
   667
    [msg setValuesForKeysWithDictionary:msgDict];
andreas@392
   668
    PEPMessage *pepDecryptedMail;
dirk@465
   669
    PEP_rating rating = [session decryptMessage:msg dest:&pepDecryptedMail keys:&keys];
andreas@392
   670
    XCTAssertNotNil(pepDecryptedMail.longMessage);
andreas@392
   671
}
andreas@392
   672
andreas@392
   673
- (void)testOutgoingContactColor
andreas@392
   674
{
andreas@392
   675
    PEPSession *session = [PEPSession new];
andreas@392
   676
andreas@411
   677
    PEPIdentity *partner1Orig = [PEPTestUtils foreignPepIdentityWithAddress:@"partner1@dontcare.me"
andreas@411
   678
                                                                   userName:@"Partner 1"];
andreas@392
   679
    NSString *pubKeyPartner1 = [PEPTestUtils loadResourceByName:@"partner1_F2D281C2789DD7F6_pub.asc"];
andreas@392
   680
    XCTAssertNotNil(pubKeyPartner1);
andreas@392
   681
    [session importKey:pubKeyPartner1];
andreas@392
   682
andreas@392
   683
    PEP_rating color = [session identityRating:partner1Orig];
andreas@392
   684
    XCTAssertEqual(color, PEP_rating_reliable);
andreas@392
   685
}
andreas@392
   686
andreas@392
   687
- (void)testMessageTrustwordsWithMySelf
andreas@392
   688
{
andreas@392
   689
    PEPSession *session = [PEPSession new];
andreas@392
   690
andreas@392
   691
    PEPStringList *keys = nil;
andreas@392
   692
    PEPMessage *decryptedDict = [self internalEncryptToMySelfKeys:&keys];
andreas@392
   693
    XCTAssertNotNil(keys);
andreas@392
   694
    XCTAssert(keys.count > 0);
andreas@392
   695
andreas@392
   696
    PEPIdentity *receiver = decryptedDict.to[0];
andreas@392
   697
    [session updateIdentity:receiver];
andreas@392
   698
    XCTAssertNotNil(receiver);
andreas@392
   699
    PEP_STATUS trustwordsStatus;
andreas@392
   700
andreas@392
   701
    NSString *trustwords = [session getTrustwordsForMessage:decryptedDict
andreas@392
   702
                                                   receiver:receiver
andreas@392
   703
                                                  keysArray:keys language:@"en"
andreas@392
   704
                                                       full:YES
andreas@392
   705
                                            resultingStatus: &trustwordsStatus];
andreas@392
   706
    // No trustwords with yourself
andreas@392
   707
    XCTAssertEqual(trustwordsStatus, PEP_TRUSTWORDS_DUPLICATE_FPR);
andreas@392
   708
    XCTAssertNil(trustwords);
andreas@392
   709
}
andreas@392
   710
andreas@392
   711
- (void)testGetTrustwords
andreas@392
   712
{
andreas@392
   713
    PEPSession *session = [PEPSession new];
andreas@392
   714
andreas@392
   715
    PEPIdentity *partner1Orig = [[PEPIdentity alloc]
andreas@392
   716
                                 initWithAddress:@"partner1@dontcare.me" userID:@"partner1"
andreas@392
   717
                                 userName:@"partner1"
andreas@392
   718
                                 isOwn:NO fingerPrint:@"F0CD3F7B422E5D587ABD885BF2D281C2789DD7F6"];
andreas@392
   719
andreas@392
   720
    PEPIdentity *meOrig = [[PEPIdentity alloc]
andreas@392
   721
                           initWithAddress:@"me@dontcare.me" userID:@"me"
andreas@392
   722
                           userName:@"me"
andreas@392
   723
                           isOwn:NO fingerPrint:@"CC1F73F6FB774BF08B197691E3BFBCA9248FC681"];
andreas@392
   724
andreas@392
   725
    NSString *pubKeyPartner1 = [PEPTestUtils loadResourceByName:@"partner1_F2D281C2789DD7F6_pub.asc"];
andreas@392
   726
    XCTAssertNotNil(pubKeyPartner1);
andreas@392
   727
    NSString *pubKeyMe = [PEPTestUtils loadResourceByName:@"meATdontcare_E3BFBCA9248FC681_pub.asc"];
andreas@392
   728
    XCTAssertNotNil(pubKeyMe);
andreas@392
   729
    NSString *secKeyMe = [PEPTestUtils loadResourceByName:@"meATdontcare_E3BFBCA9248FC681_sec.asc"];
andreas@392
   730
    XCTAssertNotNil(secKeyMe);
andreas@392
   731
andreas@392
   732
    NSString *trustwordsFull = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   733
                                                      language:nil full:YES];
andreas@392
   734
    XCTAssertEqualObjects(trustwordsFull,
andreas@392
   735
                          @"EMERSON GASPER TOKENISM BOLUS COLLAGE DESPISE BEDDED ENCRYPTION IMAGINE BEDFORD");
andreas@392
   736
andreas@392
   737
    NSString *trustwordsFullEnglish = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   738
                                                             language:@"en" full:YES];
andreas@392
   739
    XCTAssertEqualObjects(trustwordsFullEnglish, trustwordsFull);
andreas@392
   740
andreas@392
   741
    NSString *trustwordsUndefined = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   742
                                                           language:@"ZZ" full:YES];
andreas@392
   743
    XCTAssertNil(trustwordsUndefined);
andreas@392
   744
}
andreas@392
   745
dirk@418
   746
- (void)testStringToRating
dirk@418
   747
{
dirk@418
   748
    PEPSession *session = [PEPSession new];
dirk@418
   749
    XCTAssertEqual([session ratingFromString:@"cannot_decrypt"], PEP_rating_cannot_decrypt);
dirk@418
   750
    XCTAssertEqual([session ratingFromString:@"have_no_key"], PEP_rating_have_no_key);
dirk@418
   751
    XCTAssertEqual([session ratingFromString:@"unencrypted"], PEP_rating_unencrypted);
dirk@418
   752
    XCTAssertEqual([session ratingFromString:@"unencrypted_for_some"],
dirk@418
   753
                   PEP_rating_unencrypted_for_some);
dirk@418
   754
    XCTAssertEqual([session ratingFromString:@"unreliable"], PEP_rating_unreliable);
dirk@418
   755
    XCTAssertEqual([session ratingFromString:@"reliable"], PEP_rating_reliable);
dirk@418
   756
    XCTAssertEqual([session ratingFromString:@"trusted"], PEP_rating_trusted);
dirk@418
   757
    XCTAssertEqual([session ratingFromString:@"trusted_and_anonymized"],
dirk@418
   758
                   PEP_rating_trusted_and_anonymized);
dirk@418
   759
    XCTAssertEqual([session ratingFromString:@"fully_anonymous"], PEP_rating_fully_anonymous);
dirk@418
   760
    XCTAssertEqual([session ratingFromString:@"mistrust"], PEP_rating_mistrust);
dirk@418
   761
    XCTAssertEqual([session ratingFromString:@"b0rken"], PEP_rating_b0rken);
dirk@418
   762
    XCTAssertEqual([session ratingFromString:@"under_attack"], PEP_rating_under_attack);
dirk@418
   763
    XCTAssertEqual([session ratingFromString:@"undefined"], PEP_rating_undefined);
dirk@418
   764
    XCTAssertEqual([session ratingFromString:@"does not exist111"], PEP_rating_undefined);
dirk@418
   765
}
dirk@418
   766
dirk@418
   767
- (void)testRatingToString
dirk@418
   768
{
dirk@418
   769
    PEPSession *session = [PEPSession new];
dirk@418
   770
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_cannot_decrypt], @"cannot_decrypt");
dirk@418
   771
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_have_no_key], @"have_no_key");
dirk@418
   772
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unencrypted], @"unencrypted");
dirk@418
   773
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unencrypted_for_some],
dirk@418
   774
                          @"unencrypted_for_some");
dirk@418
   775
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unreliable], @"unreliable");
dirk@418
   776
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_reliable], @"reliable");
dirk@418
   777
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_trusted], @"trusted");
dirk@418
   778
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_trusted_and_anonymized],
dirk@418
   779
                          @"trusted_and_anonymized");
dirk@418
   780
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_fully_anonymous],
dirk@418
   781
                          @"fully_anonymous");
dirk@418
   782
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_mistrust], @"mistrust");
dirk@418
   783
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_b0rken], @"b0rken");
dirk@418
   784
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_under_attack], @"under_attack");
dirk@418
   785
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_undefined], @"undefined");
dirk@418
   786
    XCTAssertEqualObjects([session stringFromRating:500], @"undefined");
dirk@418
   787
}
dirk@418
   788
dirk@431
   789
- (void)testIsPEPUser
dirk@431
   790
{
dirk@431
   791
    PEPSession *session = [PEPSession new];
dirk@431
   792
dirk@431
   793
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@431
   794
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@431
   795
                            userID:@"me-myself-and-i"
dirk@452
   796
                            userName:@"pEp Me"
dirk@431
   797
                            isOwn:YES];
dirk@431
   798
    [session mySelf:identMe];
dirk@431
   799
    XCTAssertNotNil(identMe.fingerPrint);
dirk@432
   800
dirk@432
   801
    // PEP_CANNOT_FIND_PERSON == 902
dirk@453
   802
    XCTAssertTrue([session isPEPUser:identMe]);
dirk@431
   803
}
dirk@431
   804
dirk@449
   805
- (void)testXEncStatusForOutgoingEncryptedMail
dirk@449
   806
{
dirk@449
   807
    [self helperXEncStatusForOutgoingEncryptdMailToSelf:NO expectedRating:PEP_rating_reliable];
dirk@449
   808
}
dirk@449
   809
dirk@449
   810
- (void)testXEncStatusForOutgoingSelfEncryptedMail
dirk@449
   811
{
dirk@449
   812
    [self helperXEncStatusForOutgoingEncryptdMailToSelf:YES
dirk@449
   813
                                         expectedRating:PEP_rating_trusted_and_anonymized];
dirk@449
   814
}
dirk@449
   815
dirk@456
   816
- (void)testEncryptMessagesWithoutKeys
dirk@456
   817
{
dirk@456
   818
    PEPSession *session = [PEPSession new];
dirk@456
   819
dirk@456
   820
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@456
   821
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@456
   822
                            userID:@"me-myself-and-i"
dirk@456
   823
                            userName:@"pEp Me"
dirk@456
   824
                            isOwn:YES];
dirk@456
   825
    [session mySelf:identMe];
dirk@456
   826
    XCTAssertNotNil(identMe.fingerPrint);
dirk@456
   827
dirk@456
   828
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@456
   829
                               initWithAddress:@"alice@pep-project.org"
dirk@456
   830
                               userID:@"alice"
dirk@456
   831
                               userName:@"pEp Test Alice"
dirk@456
   832
                               isOwn:NO];
dirk@456
   833
dirk@456
   834
    PEPMessage *msg = [PEPMessage new];
dirk@456
   835
    msg.from = identMe;
dirk@456
   836
    msg.to = @[identAlice];
dirk@456
   837
    msg.shortMessage = @"Mail to Alice";
dirk@456
   838
    msg.longMessage = @"Alice?";
dirk@456
   839
    msg.direction = PEP_dir_outgoing;
dirk@456
   840
dirk@456
   841
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@456
   842
    XCTAssertEqual(clr, PEP_rating_unencrypted);
dirk@456
   843
dirk@456
   844
    PEPMessage *encMsg;
dirk@456
   845
dirk@456
   846
    PEP_STATUS statusEnc = statusEnc = [session encryptMessage:msg extra:@[] dest:&encMsg];
dirk@456
   847
dirk@456
   848
    XCTAssertEqual(statusEnc, PEP_UNENCRYPTED);
dirk@456
   849
dirk@456
   850
    XCTAssertNotNil(encMsg);
dirk@456
   851
dirk@456
   852
    PEPMessage *decMsg;
dirk@456
   853
    PEPStringList *keys;
dirk@456
   854
    PEP_rating pEpRating = [session decryptMessage:encMsg dest:&decMsg keys:&keys];
dirk@456
   855
    XCTAssertEqual(pEpRating, PEP_rating_unencrypted);
dirk@456
   856
    XCTAssertNotNil(decMsg);
dirk@456
   857
}
dirk@456
   858
dirk@456
   859
/**
dirk@456
   860
 ENGINE-364. Tries to invoke trustPersonalKey on an identity without key,
dirk@456
   861
 giving it a fake fingerprint.
dirk@456
   862
 */
dirk@456
   863
- (void)testTrustPersonalKey
dirk@456
   864
{
dirk@456
   865
    PEPSession *session = [PEPSession new];
dirk@456
   866
dirk@456
   867
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@456
   868
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@456
   869
                            userID:@"me-myself-and-i"
dirk@456
   870
                            userName:@"pEp Me"
dirk@456
   871
                            isOwn:YES];
dirk@456
   872
    [session mySelf:identMe];
dirk@456
   873
    XCTAssertNotNil(identMe.fingerPrint);
dirk@456
   874
dirk@456
   875
    // The fingerprint is definitely wrong, we don't have a key
dirk@456
   876
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@456
   877
                               initWithAddress:@"alice@pep-project.org"
dirk@456
   878
                               userID:@"alice"
dirk@456
   879
                               userName:@"pEp Test Alice"
dirk@456
   880
                               isOwn:NO
dirk@456
   881
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@456
   882
dirk@456
   883
    [session trustPersonalKey:identAlice];
dirk@456
   884
}
dirk@456
   885
dirk@457
   886
/**
dirk@457
   887
 ENGINE-381
dirk@457
   888
 */
dirk@457
   889
- (void)testVolatileIdentityRating
dirk@457
   890
{
dirk@457
   891
    PEPSession *session = [PEPSession new];
dirk@457
   892
dirk@457
   893
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@457
   894
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@457
   895
                            userID:@"me-myself-and-i"
dirk@457
   896
                            userName:@"pEp Me"
dirk@457
   897
                            isOwn:YES];
dirk@457
   898
    [session mySelf:identMe];
dirk@457
   899
    XCTAssertNotNil(identMe.fingerPrint);
dirk@457
   900
dirk@457
   901
    PEPIdentity *identAlice = [self
dirk@457
   902
                               checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@457
   903
                               address:@"pep.test.alice@pep-project.org"
dirk@457
   904
                               userID:@"alice_user_id"
dirk@457
   905
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@457
   906
                               session: session];
dirk@457
   907
dirk@457
   908
    dispatch_group_t identityRatingGroup = dispatch_group_create();
dirk@457
   909
dirk@457
   910
    void (^ratingBlock)(void) = ^{
dirk@457
   911
        PEPSession *innerSession = [PEPSession new];
dirk@457
   912
        PEP_rating rating = [innerSession identityRating:identAlice];
dirk@457
   913
        XCTAssertEqual(rating, PEP_rating_reliable);
dirk@457
   914
    };
dirk@457
   915
dirk@464
   916
    for (int i = 0; i < 2; ++i) {
dirk@457
   917
        dispatch_group_async(identityRatingGroup,
dirk@457
   918
                             dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0),
dirk@457
   919
                             ratingBlock);
dirk@457
   920
    }
dirk@457
   921
dirk@464
   922
    for (int i = 0; i < 2; ++i) {
dirk@457
   923
        ratingBlock();
dirk@457
   924
    }
dirk@457
   925
dirk@457
   926
    dispatch_group_wait(identityRatingGroup, DISPATCH_TIME_FOREVER);
dirk@457
   927
}
dirk@457
   928
dirk@449
   929
#pragma mark - configUnencryptedSubject
dirk@449
   930
dirk@449
   931
- (void)testConfigUnencryptedSubject
dirk@449
   932
{
dirk@449
   933
    // Setup Config to encrypt subject
dirk@449
   934
    [PEPObjCAdapter setUnecryptedSubjectEnabled:NO];
dirk@449
   935
dirk@449
   936
    // Write mail to yourself ...
dirk@449
   937
    PEPMessage *encMessage = [self mailWrittenToMySelf];
dirk@449
   938
dirk@449
   939
    // ... and assert subject is encrypted
dirk@449
   940
    XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p", @"Subject should be encrypted");
dirk@449
   941
}
dirk@449
   942
dirk@449
   943
- (void)testConfigUnencryptedSubject_encryptedSubjectDisabled
dirk@449
   944
{
dirk@449
   945
    // Setup Config to not encrypt subject
dirk@449
   946
    [PEPObjCAdapter setUnecryptedSubjectEnabled:YES];
dirk@449
   947
dirk@449
   948
    // Write mail to yourself ...
dirk@449
   949
    PEPMessage *encMessage = [self mailWrittenToMySelf];
dirk@449
   950
dirk@449
   951
    // ... and assert the subject is not encrypted
dirk@449
   952
    XCTAssertNotEqualObjects(encMessage.shortMessage, @"p≡p", @"Subject should not be encrypted");
dirk@449
   953
}
dirk@449
   954
andreas@392
   955
#pragma mark - Helpers
andreas@392
   956
dirk@439
   957
- (PEPIdentity *)checkImportingKeyFilePath:(NSString *)filePath address:(NSString *)address
dirk@439
   958
                                    userID:(NSString *)userID
dirk@439
   959
                               fingerPrint:(NSString *)fingerPrint
dirk@456
   960
                                   session:(PEPSession *)session
dirk@437
   961
{
dirk@456
   962
    if (!session) {
dirk@456
   963
        session = [PEPSession new];
dirk@456
   964
    }
dirk@437
   965
dirk@437
   966
    [PEPTestUtils importBundledKey:filePath];
dirk@437
   967
dirk@437
   968
    // Our test user:
dirk@437
   969
    PEPIdentity *identTest = [[PEPIdentity alloc]
dirk@437
   970
                              initWithAddress:address
dirk@437
   971
                              userID:userID
dirk@439
   972
                              userName:[NSString stringWithFormat:@"Some User Name %@", userID]
dirk@437
   973
                              isOwn:NO];
dirk@437
   974
dirk@437
   975
    [session updateIdentity:identTest];
dirk@437
   976
    XCTAssertNotNil(identTest.fingerPrint);
dirk@437
   977
    XCTAssertEqualObjects(identTest.fingerPrint, fingerPrint);
dirk@439
   978
dirk@439
   979
    return identTest;
dirk@439
   980
}
dirk@439
   981
dirk@439
   982
- (PEPIdentity *)checkMySelfImportingKeyFilePath:(NSString *)filePath address:(NSString *)address
dirk@439
   983
                                          userID:(NSString *)userID
dirk@439
   984
                                     fingerPrint:(NSString *)fingerPrint
dirk@439
   985
{
dirk@439
   986
    PEPSession *session = [PEPSession new];
dirk@439
   987
dirk@439
   988
    [PEPTestUtils importBundledKey:filePath];
dirk@439
   989
dirk@439
   990
    // Our test user:
dirk@439
   991
    PEPIdentity *identTest = [[PEPIdentity alloc]
dirk@439
   992
                              initWithAddress:address
dirk@439
   993
                              userID:userID
dirk@439
   994
                              userName:[NSString stringWithFormat:@"Some User Name %@", userID]
dirk@439
   995
                              isOwn:YES
dirk@439
   996
                              fingerPrint: fingerPrint];
dirk@439
   997
dirk@439
   998
    [session mySelf:identTest];
dirk@439
   999
    XCTAssertNotNil(identTest.fingerPrint);
dirk@439
  1000
    XCTAssertEqualObjects(identTest.fingerPrint, fingerPrint);
dirk@439
  1001
dirk@439
  1002
    return identTest;
dirk@437
  1003
}
dirk@437
  1004
dirk@433
  1005
/**
dirk@433
  1006
 Verifies that a partner ID is really a correct Identity.
dirk@433
  1007
 Usually used on identities imported as keys, since the engine has problems with them.
dirk@433
  1008
 */
dirk@433
  1009
- (void)updateAndVerifyPartnerIdentity:(PEPIdentity *)partnerIdentity session:(PEPSession *)session
dirk@433
  1010
{
dirk@433
  1011
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
  1012
    [session updateIdentity:partnerIdentity];
dirk@433
  1013
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
  1014
    NSString *fingerprint = partnerIdentity.fingerPrint;
dirk@433
  1015
    partnerIdentity.fingerPrint = nil;
dirk@433
  1016
    [session updateIdentity:partnerIdentity];
dirk@433
  1017
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
  1018
    XCTAssertEqualObjects(partnerIdentity.fingerPrint, fingerprint);
dirk@433
  1019
}
dirk@433
  1020
andreas@416
  1021
- (PEPMessage *)mailWrittenToMySelf
andreas@416
  1022
{
andreas@416
  1023
    PEPSession *session = [PEPSession new];
andreas@416
  1024
andreas@416
  1025
    // Write a e-mail to yourself ...
andreas@416
  1026
    PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch"
andreas@416
  1027
                                                     userName:@"userName"];
andreas@416
  1028
    [session mySelf:me];
andreas@416
  1029
andreas@416
  1030
    NSString *shortMessage = @"Subject";
andreas@416
  1031
    NSString *longMessage = @"Oh, this is a long body text!";
andreas@416
  1032
    PEPMessage *mail = [PEPTestUtils mailFrom:me
andreas@416
  1033
                                      toIdent:me
andreas@416
  1034
                                 shortMessage:shortMessage
andreas@416
  1035
                                  longMessage:longMessage
andreas@416
  1036
                                     outgoing:YES];
andreas@416
  1037
    PEPMessage *encMessage;
andreas@416
  1038
    [session encryptMessage:mail identity:me dest:&encMessage];
andreas@416
  1039
andreas@416
  1040
    return encMessage;
andreas@416
  1041
}
andreas@416
  1042
andreas@392
  1043
- (PEPMessage *)internalEncryptToMySelfKeys:(PEPStringList **)keys
andreas@392
  1044
{
andreas@392
  1045
    PEPSession *session = [PEPSession new];
andreas@411
  1046
    
andreas@411
  1047
    PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch"
andreas@411
  1048
                                                     userName:@"userName"];
andreas@392
  1049
    [session mySelf:me];
andreas@392
  1050
    XCTAssertNotNil(me.fingerPrint);
andreas@392
  1051
andreas@392
  1052
    // Create draft
andreas@392
  1053
    NSString *shortMessage = @"Subject";
andreas@392
  1054
    NSString *longMessage = @"Oh, this is a long body text!";
andreas@392
  1055
    PEPMessage *mail = [PEPTestUtils mailFrom:me toIdent:me shortMessage:shortMessage longMessage:longMessage outgoing:YES];
andreas@392
  1056
andreas@392
  1057
    PEPMessage *encMessage;
andreas@392
  1058
    PEP_STATUS status = [session encryptMessage:mail identity:me dest:&encMessage];
andreas@392
  1059
    XCTAssertEqual(status, 0);
andreas@392
  1060
    XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p");
andreas@392
  1061
andreas@392
  1062
    PEPMessage *unencDict;
andreas@392
  1063
    PEP_rating rating = [session decryptMessage:encMessage dest:&unencDict keys:keys];
andreas@392
  1064
    XCTAssertGreaterThanOrEqual(rating, PEP_rating_reliable);
andreas@392
  1065
andreas@392
  1066
    XCTAssertEqualObjects(unencDict.shortMessage, shortMessage);
andreas@392
  1067
    XCTAssertEqualObjects(unencDict.longMessage, longMessage);
andreas@392
  1068
andreas@392
  1069
    return unencDict;
andreas@392
  1070
}
andreas@392
  1071
andreas@392
  1072
- (void)pEpCleanUp
andreas@392
  1073
{
dirk@470
  1074
    [PEPTestUtils cleanUp];
andreas@392
  1075
}
andreas@392
  1076
andreas@392
  1077
- (void)pEpSetUp
andreas@392
  1078
{
andreas@392
  1079
}
andreas@392
  1080
dirk@424
  1081
- (void)helperXEncStatusForOutgoingEncryptdMailToSelf:(BOOL)toSelf
dirk@424
  1082
                                       expectedRating:(PEP_rating)expectedRating
dirk@422
  1083
{
dirk@422
  1084
    PEPSession *session = [PEPSession new];
dirk@422
  1085
dirk@422
  1086
    // Partner pubkey for the test:
dirk@422
  1087
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
dirk@422
  1088
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@422
  1089
    [PEPTestUtils importBundledKey:@"0x6FF00E97.asc"];
dirk@422
  1090
dirk@422
  1091
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@422
  1092
                               initWithAddress:@"pep.test.alice@pep-project.org"
dirk@422
  1093
                               userID:ownUserId
dirk@422
  1094
                               userName:@"pEp Test Alice"
dirk@422
  1095
                               isOwn:NO
dirk@433
  1096
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@433
  1097
    [self updateAndVerifyPartnerIdentity:identAlice session:session];
dirk@422
  1098
dirk@422
  1099
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@422
  1100
                               initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@422
  1101
                               userID:@"me-myself-and-i"
dirk@452
  1102
                               userName:@"pEp Me"
dirk@422
  1103
                               isOwn:YES];
dirk@422
  1104
    [session mySelf:identMe];
dirk@422
  1105
    XCTAssertNotNil(identMe.fingerPrint);
dirk@422
  1106
dirk@422
  1107
    PEPMessage *msg = [PEPMessage new];
dirk@422
  1108
    msg.from = identMe;
dirk@422
  1109
    msg.to = @[identAlice];
dirk@422
  1110
    msg.shortMessage = @"Mail to Alice";
dirk@422
  1111
    msg.longMessage = @"Alice?";
dirk@422
  1112
    msg.direction = PEP_dir_outgoing;
dirk@422
  1113
dirk@422
  1114
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@424
  1115
    XCTAssertEqual(clr, PEP_rating_reliable);
dirk@422
  1116
dirk@423
  1117
    PEPMessage *encMsg;
dirk@424
  1118
dirk@424
  1119
    PEP_STATUS statusEnc = PEP_VERSION_MISMATCH;
dirk@424
  1120
    if (toSelf) {
dirk@424
  1121
        statusEnc = [session encryptMessage:msg identity:identMe dest:&encMsg];
dirk@424
  1122
    } else {
dirk@424
  1123
         statusEnc = [session encryptMessage:msg extra:@[] dest:&encMsg];
dirk@424
  1124
    }
dirk@422
  1125
dirk@423
  1126
    XCTAssertEqual(statusEnc, PEP_STATUS_OK);
dirk@423
  1127
dirk@423
  1128
    XCTAssertNotNil(encMsg);
dirk@423
  1129
dirk@423
  1130
    PEPMessage *decMsg;
dirk@423
  1131
    PEPStringList *keys;
dirk@423
  1132
    PEP_rating pEpRating = [session decryptMessage:encMsg dest:&decMsg keys:&keys];
dirk@424
  1133
    XCTAssertEqual(pEpRating, expectedRating);
dirk@423
  1134
    XCTAssertNotNil(decMsg);
dirk@423
  1135
dirk@423
  1136
    NSArray * encStatusField = nil;
dirk@423
  1137
    for (NSArray *field in decMsg.optionalFields) {
dirk@423
  1138
        NSString *header = [field[0] lowercaseString];
dirk@423
  1139
        if ([header isEqualToString:@"x-encstatus"]) {
dirk@423
  1140
            encStatusField = field;
dirk@423
  1141
        }
dirk@423
  1142
    }
dirk@423
  1143
    XCTAssertNotNil(encStatusField);
dirk@423
  1144
    if (encStatusField) {
dirk@423
  1145
        PEP_rating outgoingRating = [session ratingFromString:encStatusField[1]];
dirk@424
  1146
        XCTAssertEqual(outgoingRating, expectedRating);
dirk@423
  1147
    }
dirk@422
  1148
}
dirk@422
  1149
andreas@392
  1150
@end