pEpObjCTests/PEPSessionTest.m
author Dirk Zimmermann <dirk@pep-project.org>
Fri, 09 Feb 2018 13:18:44 +0100
changeset 437 28774351ee04
parent 436 3e2e18760184
child 438 0cf0dad6d7c6
permissions -rw-r--r--
IOS-937 importing keys still works
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@437
   160
                        fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@436
   161
dirk@437
   162
    [self checkImportingKeyFilePath:@"0xC9C2EE39.asc" address:@"pep.test.bob@pep-project.org"
dirk@437
   163
                             userID:@"This Is Bob"
dirk@437
   164
                        fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
dirk@436
   165
}
dirk@436
   166
andreas@392
   167
- (void)testOutgoingColors
andreas@392
   168
{
andreas@392
   169
    PEPSession *session = [PEPSession new];
andreas@392
   170
andreas@392
   171
    // Our test user :
andreas@392
   172
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   173
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   174
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   175
andreas@392
   176
    // Our test user :
andreas@392
   177
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   178
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   179
                               userID:ownUserId
andreas@392
   180
                               userName:@"pEp Test Alice"
andreas@392
   181
                               isOwn:YES
andreas@392
   182
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   183
andreas@392
   184
    [session mySelf:identAlice];
andreas@392
   185
andreas@392
   186
    //Message
andreas@392
   187
andreas@392
   188
    PEPMessage *msg = [PEPMessage new];
andreas@392
   189
    msg.from = identAlice;
andreas@392
   190
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   191
                                             userID: @"42"
andreas@392
   192
                                           userName:@"pEp Test Bob"
andreas@392
   193
                                              isOwn:NO]];
andreas@392
   194
    msg.shortMessage = @"All Green Test";
andreas@392
   195
    msg.longMessage = @"This is a text content";
andreas@392
   196
    msg.direction = PEP_dir_outgoing;
andreas@392
   197
andreas@392
   198
    // Test with unknown Bob
andreas@392
   199
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   200
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   201
andreas@392
   202
    // Now let see with bob's pubkey already known
andreas@392
   203
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   204
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
andreas@392
   205
    [PEPTestUtils importBundledKey:@"0xC9C2EE39.asc"];
andreas@392
   206
andreas@392
   207
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   208
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   209
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   210
                             isOwn:NO
andreas@392
   211
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
dirk@433
   212
    [self updateAndVerifyPartnerIdentity:identBob session:session];
andreas@392
   213
andreas@392
   214
    // Should be yellow, since no handshake happened.
andreas@392
   215
    clr = [session outgoingColorForMessage:msg];
dirk@420
   216
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   217
andreas@392
   218
    clr = [session identityRating:identBob];
dirk@420
   219
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   220
andreas@392
   221
    // Let' say we got that handshake, set PEP_ct_confirmed in Bob's identity
andreas@392
   222
    [session trustPersonalKey:identBob];
andreas@392
   223
andreas@392
   224
    // This time it should be green
andreas@392
   225
    clr = [session outgoingColorForMessage:msg];
dirk@420
   226
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   227
andreas@392
   228
    clr = [session identityRating:identBob];
dirk@420
   229
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   230
andreas@392
   231
    // Let' say we undo handshake
andreas@392
   232
    [session keyResetTrust:identBob];
andreas@392
   233
andreas@392
   234
    // Yellow ?
andreas@392
   235
    clr = [session outgoingColorForMessage:msg];
dirk@420
   236
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   237
andreas@392
   238
    // mistrust Bob
andreas@392
   239
    [session keyMistrusted:identBob];
andreas@392
   240
andreas@392
   241
    // Gray == PEP_rating_unencrypted
andreas@392
   242
    clr = [session outgoingColorForMessage:msg];
dirk@420
   243
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   244
andreas@392
   245
    // Forget
andreas@392
   246
    [session keyResetTrust:identBob];
andreas@392
   247
andreas@392
   248
    // Back to yellow
andreas@392
   249
    clr = [session outgoingColorForMessage:msg];
dirk@420
   250
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   251
andreas@392
   252
    // Trust again
andreas@392
   253
    [session trustPersonalKey:identBob];
andreas@392
   254
andreas@392
   255
    // Back to green
andreas@392
   256
    clr = [session outgoingColorForMessage:msg];
dirk@420
   257
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   258
andreas@392
   259
    // Now let see if it turns back yellow if we add an unconfirmed folk.
andreas@392
   260
    // pEp Test John (test key, don't use) <pep.test.john@pep-project.org>
andreas@392
   261
    // AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575
andreas@392
   262
    [PEPTestUtils importBundledKey:@"0x70DCF575.asc"];
andreas@392
   263
andreas@392
   264
    PEPIdentity *identJohn = [[PEPIdentity alloc]
andreas@392
   265
                              initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   266
                              userID:@"101" userName:@"pEp Test John"
andreas@392
   267
                              isOwn:NO
andreas@392
   268
                              fingerPrint:@"AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575"];
andreas@392
   269
andreas@392
   270
    [session updateIdentity:identJohn];
andreas@392
   271
andreas@411
   272
    msg.cc = @[[PEPTestUtils foreignPepIdentityWithAddress:@"pep.test.john@pep-project.org"
andreas@411
   273
                                                  userName:@"pEp Test John"]];
andreas@392
   274
    // Yellow ?
andreas@392
   275
    clr = [session outgoingColorForMessage:msg];
dirk@420
   276
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   277
andreas@392
   278
    PEPMessage *encmsg;
andreas@392
   279
    PEP_STATUS status = [session encryptMessage:msg extra:@[] dest:&encmsg];
andreas@392
   280
andreas@392
   281
    XCTAssertNotNil(encmsg);
andreas@392
   282
    XCTAssertEqualObjects(encmsg.shortMessage, @"p≡p");
andreas@392
   283
    XCTAssertTrue([encmsg.longMessage containsString:@"p≡p"]);
andreas@392
   284
dirk@420
   285
    XCTAssertEqual(status, PEP_STATUS_OK);
andreas@392
   286
}
andreas@392
   287
andreas@392
   288
andreas@392
   289
- (void)testOutgoingBccColors
andreas@392
   290
{
andreas@392
   291
    PEPSession *session = [PEPSession new];
andreas@392
   292
andreas@392
   293
    // Our test user :
andreas@392
   294
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   295
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   296
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   297
andreas@392
   298
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   299
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   300
                               userID:ownUserId
andreas@392
   301
                               userName:@"pEp Test Alice"
andreas@392
   302
                               isOwn:YES
andreas@392
   303
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   304
andreas@392
   305
    [session mySelf:identAlice];
andreas@392
   306
andreas@392
   307
    PEPMessage *msg = [PEPMessage new];
andreas@392
   308
    msg.from = identAlice;
andreas@392
   309
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   310
                                             userID:@"42" userName:@"pEp Test Bob" isOwn:NO]];
andreas@392
   311
    msg.shortMessage = @"All Green Test";
andreas@392
   312
    msg.longMessage = @"This is a text content";
andreas@392
   313
    msg.direction = PEP_dir_outgoing;
andreas@392
   314
andreas@392
   315
    // Test with unknown Bob
andreas@392
   316
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   317
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   318
andreas@392
   319
    // Now let see with bob's pubkey already known
andreas@392
   320
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   321
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
andreas@392
   322
    [PEPTestUtils importBundledKey:@"0xC9C2EE39.asc"];
andreas@392
   323
andreas@392
   324
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   325
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   326
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   327
                             isOwn:NO
andreas@392
   328
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
andreas@392
   329
andreas@392
   330
    [session updateIdentity:identBob];
andreas@392
   331
andreas@392
   332
    // Should be yellow, since no handshake happened.
andreas@392
   333
    clr = [session outgoingColorForMessage:msg];
dirk@420
   334
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   335
andreas@392
   336
    clr = [session identityRating:identBob];
dirk@420
   337
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   338
andreas@392
   339
    // Let' say we got that handshake, set PEP_ct_confirmed in Bob's identity
andreas@392
   340
    [session trustPersonalKey:identBob];
andreas@392
   341
andreas@392
   342
    // This time it should be green
andreas@392
   343
    clr = [session outgoingColorForMessage:msg];
dirk@420
   344
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   345
andreas@392
   346
    clr = [session identityRating:identBob];
dirk@420
   347
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   348
andreas@392
   349
    // Now let see if it turns back yellow if we add an unconfirmed folk.
andreas@392
   350
    // pEp Test John (test key, don't use) <pep.test.john@pep-project.org>
andreas@392
   351
    // AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575
andreas@392
   352
    [PEPTestUtils importBundledKey:@"0x70DCF575.asc"];
andreas@392
   353
andreas@392
   354
    PEPIdentity *identJohn = [[PEPIdentity alloc]
andreas@392
   355
                              initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   356
                              userID:@"101" userName:@"pEp Test John"
andreas@392
   357
                              isOwn:NO
andreas@392
   358
                              fingerPrint:@"AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575"];
andreas@392
   359
andreas@392
   360
    [session updateIdentity:identJohn];
andreas@392
   361
andreas@392
   362
    msg.bcc = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   363
                                              userID:@"101" userName:@"pEp Test John" isOwn:NO]];
andreas@392
   364
andreas@392
   365
    // Yellow ?
andreas@392
   366
    clr = [session outgoingColorForMessage:msg];
dirk@420
   367
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   368
andreas@392
   369
    [session trustPersonalKey:identJohn];
andreas@392
   370
andreas@392
   371
    // This time it should be green
andreas@392
   372
    clr = [session outgoingColorForMessage:msg];
dirk@420
   373
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   374
andreas@392
   375
    clr = [session identityRating:identJohn];
dirk@420
   376
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   377
}
andreas@392
   378
andreas@392
   379
- (void)testDontEncryptForMistrusted
andreas@392
   380
{
andreas@392
   381
    PEPSession *session = [PEPSession new];
andreas@392
   382
andreas@392
   383
    // Our test user :
andreas@392
   384
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   385
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   386
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   387
andreas@392
   388
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   389
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   390
                               userID:ownUserId
andreas@392
   391
                               userName:@"pEp Test Alice"
andreas@392
   392
                               isOwn:YES
andreas@392
   393
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   394
andreas@392
   395
    [session mySelf:identAlice];
andreas@392
   396
andreas@392
   397
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   398
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
andreas@392
   399
    [PEPTestUtils importBundledKey:@"0xC9C2EE39.asc"];
andreas@392
   400
andreas@392
   401
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   402
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   403
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   404
                             isOwn:NO
andreas@392
   405
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
andreas@392
   406
andreas@392
   407
    [session updateIdentity:identBob];
andreas@392
   408
andreas@392
   409
    // mistrust Bob
andreas@392
   410
    [session keyMistrusted:identBob];
andreas@392
   411
andreas@392
   412
    PEPMessage *msg = [PEPMessage new];
andreas@392
   413
    msg.from = identAlice;
andreas@392
   414
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org" userID:@"42"
andreas@392
   415
                                           userName:@"pEp Test Bob" isOwn:NO]];
andreas@392
   416
    msg.shortMessage = @"All Green Test";
andreas@392
   417
    msg.longMessage = @"This is a text content";
andreas@392
   418
    msg.direction = PEP_dir_outgoing;
andreas@392
   419
andreas@392
   420
    // Gray == PEP_rating_unencrypted
andreas@392
   421
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   422
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   423
andreas@392
   424
    PEPMessage *encmsg;
andreas@392
   425
    PEP_STATUS status = [session encryptMessage:msg extra:@[] dest:&encmsg];
andreas@392
   426
dirk@420
   427
    XCTAssertEqual(status, PEP_UNENCRYPTED);
andreas@392
   428
andreas@392
   429
    XCTAssertNotEqualObjects(encmsg.attachments[0][@"mimeType"], @"application/pgp-encrypted");
andreas@392
   430
andreas@392
   431
    [self pEpCleanUp];
andreas@392
   432
}
andreas@392
   433
andreas@392
   434
- (void)testRenewExpired
andreas@392
   435
{
andreas@392
   436
    PEPSession *session = [PEPSession new];
andreas@392
   437
andreas@392
   438
    // Our expired test user :
andreas@392
   439
    // pEp Test Hector (old test key don't use) <pep.test.hector@pep-project.org>
andreas@392
   440
    [PEPTestUtils importBundledKey:@"5CB2C182_sec.asc"];
andreas@392
   441
andreas@392
   442
    PEPIdentity *identHector = [[PEPIdentity alloc]
andreas@392
   443
                                initWithAddress:@"pep.test.hector@pep-project.org"
andreas@392
   444
                                userID:@"fc2d33" userName:@"pEp Test Hector"
andreas@392
   445
                                isOwn:NO
andreas@392
   446
                                fingerPrint:@"EEA655839E347EC9E10A5DE2E80CB3FD5CB2C182"];
andreas@392
   447
andreas@392
   448
    // Check that this key is indeed expired
andreas@392
   449
    [session updateIdentity:identHector];
andreas@392
   450
    XCTAssertEqual(PEP_ct_key_expired, identHector.commType);
andreas@392
   451
andreas@392
   452
    PEPIdentity *identHectorOwn = [[PEPIdentity alloc]
andreas@392
   453
                                   initWithAddress:@"pep.test.hector@pep-project.org"
andreas@392
   454
                                   userID:ownUserId userName:@"pEp Test Hector"
andreas@392
   455
                                   isOwn:YES
andreas@392
   456
                                   fingerPrint:@"EEA655839E347EC9E10A5DE2E80CB3FD5CB2C182"];
andreas@392
   457
andreas@392
   458
    // Myself automatically renew expired key.
andreas@392
   459
    [session mySelf:identHectorOwn];
andreas@392
   460
    XCTAssertEqual(PEP_ct_pEp, identHectorOwn.commType);
andreas@392
   461
andreas@392
   462
    [self pEpCleanUpRestoringBackupNamed:@"Bob"];
andreas@392
   463
andreas@392
   464
andreas@392
   465
    [self pEpSetUp:@"Bob"];
andreas@392
   466
andreas@392
   467
    PEPIdentity *_identHector = [[PEPIdentity alloc]
andreas@392
   468
                                 initWithAddress:@"pep.test.hector@pep-project.org"
andreas@392
   469
                                 userID:@"khkhkh" userName:@"pEp Test Hector"
andreas@392
   470
                                 isOwn:NO
andreas@392
   471
                                 fingerPrint:@"EEA655839E347EC9E10A5DE2E80CB3FD5CB2C182"];
andreas@392
   472
andreas@392
   473
    [session updateIdentity:_identHector];
andreas@392
   474
    XCTAssertEqual(PEP_ct_OpenPGP_unconfirmed, _identHector.commType);
andreas@392
   475
}
andreas@392
   476
andreas@392
   477
- (void)testRevoke
andreas@392
   478
{
andreas@392
   479
    PEPSession *session = [PEPSession new];
andreas@392
   480
andreas@392
   481
    // Our test user :
andreas@392
   482
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   483
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   484
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   485
    NSString *fpr = @"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
andreas@392
   486
andreas@392
   487
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   488
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   489
                               userID:ownUserId
andreas@392
   490
                               userName:@"pEp Test Alice"
andreas@392
   491
                               isOwn:YES
andreas@392
   492
                               fingerPrint:fpr];
andreas@392
   493
andreas@392
   494
    [session mySelf:identAlice];
andreas@392
   495
andreas@392
   496
    PEPIdentity *identAlice2 = [identAlice mutableCopy];
andreas@392
   497
andreas@392
   498
    // This will revoke key
andreas@392
   499
    [session keyMistrusted:identAlice2];
andreas@416
   500
    identAlice2.fingerPrint = nil;
andreas@416
   501
    [session mySelf:identAlice];
andreas@416
   502
andreas@392
   503
andreas@392
   504
    // Check fingerprint is different
andreas@392
   505
    XCTAssertNotEqualObjects(identAlice2.fingerPrint, fpr);
andreas@392
   506
}
andreas@392
   507
andreas@392
   508
- (void)testMailToMyself
andreas@392
   509
{
andreas@392
   510
    PEPSession *session = [PEPSession new];
andreas@392
   511
andreas@392
   512
    // Our test user :
andreas@392
   513
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   514
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
andreas@392
   515
    [PEPTestUtils importBundledKey:@"6FF00E97_sec.asc"];
andreas@392
   516
andreas@392
   517
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   518
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   519
                               userID:ownUserId
andreas@392
   520
                               userName:@"pEp Test Alice"
andreas@392
   521
                               isOwn:YES
andreas@392
   522
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   523
andreas@392
   524
    [session mySelf:identAlice];
andreas@392
   525
andreas@392
   526
    PEPMessage *msg = [PEPMessage new];
andreas@392
   527
    msg.from = identAlice;
andreas@392
   528
    msg.to = @[identAlice];
andreas@392
   529
    msg.shortMessage = @"Mail to Myself";
andreas@392
   530
    msg.longMessage = @"This is a text content";
andreas@392
   531
    msg.direction = PEP_dir_outgoing;
andreas@392
   532
andreas@392
   533
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   534
    XCTAssertEqual(clr, PEP_rating_trusted_and_anonymized);
andreas@392
   535
andreas@392
   536
    PEPMessage *encmsg;
andreas@392
   537
    PEP_STATUS status = [session encryptMessage:msg extra:@[] dest:&encmsg];
andreas@392
   538
dirk@420
   539
    XCTAssertEqual(status, PEP_STATUS_OK);
andreas@392
   540
andreas@392
   541
    NSArray* keys;
andreas@392
   542
    PEPMessage *decmsg;
andreas@392
   543
andreas@392
   544
    clr = [session decryptMessage:encmsg dest:&decmsg keys:&keys];
dirk@420
   545
    XCTAssertEqual(clr, PEP_rating_trusted_and_anonymized);
andreas@392
   546
}
andreas@392
   547
andreas@392
   548
- (void)testEncryptedMailFromMutt
andreas@392
   549
{
andreas@392
   550
    PEPSession *session = [PEPSession new];
andreas@392
   551
andreas@392
   552
    // This is the public key for test001@peptest.ch
andreas@392
   553
    [PEPTestUtils importBundledKey:@"A3FC7F0A.asc"];
andreas@392
   554
andreas@392
   555
    // This is the secret key for test001@peptest.ch
andreas@392
   556
    [PEPTestUtils importBundledKey:@"A3FC7F0A_sec.asc"];
andreas@392
   557
andreas@392
   558
    // Mail from mutt, already processed into message dict by the app.
dirk@434
   559
    NSMutableDictionary *msgDict = [PEPTestUtils
dirk@434
   560
                                    unarchiveDictionary:@"msg_to_A3FC7F0A_from_mutt.ser"].mutableCopy;
andreas@392
   561
    [msgDict removeObjectForKey:kPepLongMessage];
andreas@392
   562
    [msgDict removeObjectForKey:kPepLongMessageFormatted];
andreas@392
   563
andreas@392
   564
    // Also extracted "live" from the app.
dirk@434
   565
    NSMutableDictionary *accountDict = [PEPTestUtils
dirk@434
   566
                                        unarchiveDictionary:@"account_A3FC7F0A.ser"].mutableCopy;
andreas@392
   567
    [accountDict removeObjectForKey:kPepCommType];
andreas@392
   568
    [accountDict removeObjectForKey:kPepFingerprint];
andreas@392
   569
    PEPIdentity *identMe = [[PEPIdentity alloc] initWithDictionary:accountDict];
andreas@392
   570
andreas@392
   571
    [session mySelf:identMe];
andreas@392
   572
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
   573
andreas@392
   574
    NSArray* keys;
andreas@392
   575
    PEPMessage *msg = [PEPMessage new];
andreas@392
   576
    [msg setValuesForKeysWithDictionary:msgDict];
andreas@392
   577
    PEPMessage *pepDecryptedMail;
andreas@392
   578
    [session decryptMessage:msg dest:&pepDecryptedMail keys:&keys];
andreas@392
   579
    XCTAssertNotNil(pepDecryptedMail.longMessage);
andreas@392
   580
}
andreas@392
   581
andreas@392
   582
- (void)testOutgoingContactColor
andreas@392
   583
{
andreas@392
   584
    PEPSession *session = [PEPSession new];
andreas@392
   585
andreas@411
   586
    PEPIdentity *partner1Orig = [PEPTestUtils foreignPepIdentityWithAddress:@"partner1@dontcare.me"
andreas@411
   587
                                                                   userName:@"Partner 1"];
andreas@392
   588
    NSString *pubKeyPartner1 = [PEPTestUtils loadResourceByName:@"partner1_F2D281C2789DD7F6_pub.asc"];
andreas@392
   589
    XCTAssertNotNil(pubKeyPartner1);
andreas@392
   590
    [session importKey:pubKeyPartner1];
andreas@392
   591
andreas@392
   592
    PEP_rating color = [session identityRating:partner1Orig];
andreas@392
   593
    XCTAssertEqual(color, PEP_rating_reliable);
andreas@392
   594
}
andreas@392
   595
andreas@392
   596
- (void)testMessageTrustwordsWithMySelf
andreas@392
   597
{
andreas@392
   598
    PEPSession *session = [PEPSession new];
andreas@392
   599
andreas@392
   600
    PEPStringList *keys = nil;
andreas@392
   601
    PEPMessage *decryptedDict = [self internalEncryptToMySelfKeys:&keys];
andreas@392
   602
    XCTAssertNotNil(keys);
andreas@392
   603
    XCTAssert(keys.count > 0);
andreas@392
   604
andreas@392
   605
    PEPIdentity *receiver = decryptedDict.to[0];
andreas@392
   606
    [session updateIdentity:receiver];
andreas@392
   607
    XCTAssertNotNil(receiver);
andreas@392
   608
    PEP_STATUS trustwordsStatus;
andreas@392
   609
andreas@392
   610
    NSString *trustwords = [session getTrustwordsForMessage:decryptedDict
andreas@392
   611
                                                   receiver:receiver
andreas@392
   612
                                                  keysArray:keys language:@"en"
andreas@392
   613
                                                       full:YES
andreas@392
   614
                                            resultingStatus: &trustwordsStatus];
andreas@392
   615
    // No trustwords with yourself
andreas@392
   616
    XCTAssertEqual(trustwordsStatus, PEP_TRUSTWORDS_DUPLICATE_FPR);
andreas@392
   617
    XCTAssertNil(trustwords);
andreas@392
   618
}
andreas@392
   619
andreas@392
   620
- (void)testGetTrustwords
andreas@392
   621
{
andreas@392
   622
    PEPSession *session = [PEPSession new];
andreas@392
   623
andreas@392
   624
    PEPIdentity *partner1Orig = [[PEPIdentity alloc]
andreas@392
   625
                                 initWithAddress:@"partner1@dontcare.me" userID:@"partner1"
andreas@392
   626
                                 userName:@"partner1"
andreas@392
   627
                                 isOwn:NO fingerPrint:@"F0CD3F7B422E5D587ABD885BF2D281C2789DD7F6"];
andreas@392
   628
andreas@392
   629
    PEPIdentity *meOrig = [[PEPIdentity alloc]
andreas@392
   630
                           initWithAddress:@"me@dontcare.me" userID:@"me"
andreas@392
   631
                           userName:@"me"
andreas@392
   632
                           isOwn:NO fingerPrint:@"CC1F73F6FB774BF08B197691E3BFBCA9248FC681"];
andreas@392
   633
andreas@392
   634
    NSString *pubKeyPartner1 = [PEPTestUtils loadResourceByName:@"partner1_F2D281C2789DD7F6_pub.asc"];
andreas@392
   635
    XCTAssertNotNil(pubKeyPartner1);
andreas@392
   636
    NSString *pubKeyMe = [PEPTestUtils loadResourceByName:@"meATdontcare_E3BFBCA9248FC681_pub.asc"];
andreas@392
   637
    XCTAssertNotNil(pubKeyMe);
andreas@392
   638
    NSString *secKeyMe = [PEPTestUtils loadResourceByName:@"meATdontcare_E3BFBCA9248FC681_sec.asc"];
andreas@392
   639
    XCTAssertNotNil(secKeyMe);
andreas@392
   640
andreas@392
   641
    NSString *trustwordsFull = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   642
                                                      language:nil full:YES];
andreas@392
   643
    XCTAssertEqualObjects(trustwordsFull,
andreas@392
   644
                          @"EMERSON GASPER TOKENISM BOLUS COLLAGE DESPISE BEDDED ENCRYPTION IMAGINE BEDFORD");
andreas@392
   645
andreas@392
   646
    NSString *trustwordsFullEnglish = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   647
                                                             language:@"en" full:YES];
andreas@392
   648
    XCTAssertEqualObjects(trustwordsFullEnglish, trustwordsFull);
andreas@392
   649
andreas@392
   650
    NSString *trustwordsUndefined = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   651
                                                           language:@"ZZ" full:YES];
andreas@392
   652
    XCTAssertNil(trustwordsUndefined);
andreas@392
   653
}
andreas@392
   654
andreas@416
   655
#pragma mark - configUnencryptedSubject
andreas@416
   656
andreas@416
   657
- (void)testConfigUnencryptedSubject
andreas@416
   658
{
andreas@416
   659
    // Setup Config to encrypt subject
andreas@416
   660
    [PEPObjCAdapter setUnecryptedSubjectEnabled:NO];
andreas@416
   661
andreas@416
   662
    // Write mail to yourself ...
andreas@416
   663
    PEPMessage *encMessage = [self mailWrittenToMySelf];
andreas@416
   664
andreas@416
   665
    // ... and assert subject is encrypted
andreas@416
   666
    XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p", @"Subject should be encrypted");
andreas@416
   667
}
andreas@416
   668
andreas@416
   669
- (void)testConfigUnencryptedSubject_encryptedSubjectDisabled
andreas@416
   670
{
andreas@416
   671
    // Setup Config to not encrypt subject
andreas@416
   672
    [PEPObjCAdapter setUnecryptedSubjectEnabled:YES];
andreas@416
   673
andreas@416
   674
    // Write mail to yourself ...
andreas@416
   675
    PEPMessage *encMessage = [self mailWrittenToMySelf];
andreas@416
   676
andreas@416
   677
    // ... and assert the subject is not encrypted
andreas@416
   678
    XCTAssertNotEqualObjects(encMessage.shortMessage, @"p≡p", @"Subject should not be encrypted");
andreas@416
   679
}
andreas@416
   680
dirk@418
   681
- (void)testStringToRating
dirk@418
   682
{
dirk@418
   683
    PEPSession *session = [PEPSession new];
dirk@418
   684
    XCTAssertEqual([session ratingFromString:@"cannot_decrypt"], PEP_rating_cannot_decrypt);
dirk@418
   685
    XCTAssertEqual([session ratingFromString:@"have_no_key"], PEP_rating_have_no_key);
dirk@418
   686
    XCTAssertEqual([session ratingFromString:@"unencrypted"], PEP_rating_unencrypted);
dirk@418
   687
    XCTAssertEqual([session ratingFromString:@"unencrypted_for_some"],
dirk@418
   688
                   PEP_rating_unencrypted_for_some);
dirk@418
   689
    XCTAssertEqual([session ratingFromString:@"unreliable"], PEP_rating_unreliable);
dirk@418
   690
    XCTAssertEqual([session ratingFromString:@"reliable"], PEP_rating_reliable);
dirk@418
   691
    XCTAssertEqual([session ratingFromString:@"trusted"], PEP_rating_trusted);
dirk@418
   692
    XCTAssertEqual([session ratingFromString:@"trusted_and_anonymized"],
dirk@418
   693
                   PEP_rating_trusted_and_anonymized);
dirk@418
   694
    XCTAssertEqual([session ratingFromString:@"fully_anonymous"], PEP_rating_fully_anonymous);
dirk@418
   695
    XCTAssertEqual([session ratingFromString:@"mistrust"], PEP_rating_mistrust);
dirk@418
   696
    XCTAssertEqual([session ratingFromString:@"b0rken"], PEP_rating_b0rken);
dirk@418
   697
    XCTAssertEqual([session ratingFromString:@"under_attack"], PEP_rating_under_attack);
dirk@418
   698
    XCTAssertEqual([session ratingFromString:@"undefined"], PEP_rating_undefined);
dirk@418
   699
    XCTAssertEqual([session ratingFromString:@"does not exist111"], PEP_rating_undefined);
dirk@418
   700
}
dirk@418
   701
dirk@418
   702
- (void)testRatingToString
dirk@418
   703
{
dirk@418
   704
    PEPSession *session = [PEPSession new];
dirk@418
   705
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_cannot_decrypt], @"cannot_decrypt");
dirk@418
   706
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_have_no_key], @"have_no_key");
dirk@418
   707
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unencrypted], @"unencrypted");
dirk@418
   708
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unencrypted_for_some],
dirk@418
   709
                          @"unencrypted_for_some");
dirk@418
   710
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unreliable], @"unreliable");
dirk@418
   711
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_reliable], @"reliable");
dirk@418
   712
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_trusted], @"trusted");
dirk@418
   713
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_trusted_and_anonymized],
dirk@418
   714
                          @"trusted_and_anonymized");
dirk@418
   715
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_fully_anonymous],
dirk@418
   716
                          @"fully_anonymous");
dirk@418
   717
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_mistrust], @"mistrust");
dirk@418
   718
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_b0rken], @"b0rken");
dirk@418
   719
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_under_attack], @"under_attack");
dirk@418
   720
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_undefined], @"undefined");
dirk@418
   721
    XCTAssertEqualObjects([session stringFromRating:500], @"undefined");
dirk@418
   722
}
dirk@418
   723
dirk@431
   724
- (void)testIsPEPUser
dirk@431
   725
{
dirk@431
   726
    PEPSession *session = [PEPSession new];
dirk@431
   727
dirk@431
   728
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@431
   729
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@431
   730
                            userID:@"me-myself-and-i"
dirk@431
   731
                            userName:@"pEp Test Alice"
dirk@431
   732
                            isOwn:YES];
dirk@431
   733
    [session mySelf:identMe];
dirk@431
   734
    XCTAssertNotNil(identMe.fingerPrint);
dirk@432
   735
dirk@432
   736
    // PEP_CANNOT_FIND_PERSON == 902
dirk@431
   737
    NSError *error;
dirk@431
   738
    XCTAssertTrue([session isPEPUser:identMe error:&error]);
dirk@431
   739
    XCTAssertNil(error);
dirk@431
   740
}
dirk@431
   741
andreas@392
   742
#pragma mark - Helpers
andreas@392
   743
dirk@437
   744
- (void)checkImportingKeyFilePath:(NSString *)filePath address:(NSString *)address
dirk@437
   745
                           userID:(NSString *)userID
dirk@437
   746
                      fingerPrint:(NSString *)fingerPrint
dirk@437
   747
{
dirk@437
   748
    PEPSession *session = [PEPSession new];
dirk@437
   749
dirk@437
   750
    [PEPTestUtils importBundledKey:filePath];
dirk@437
   751
dirk@437
   752
    // Our test user:
dirk@437
   753
    PEPIdentity *identTest = [[PEPIdentity alloc]
dirk@437
   754
                              initWithAddress:address
dirk@437
   755
                              userID:userID
dirk@437
   756
                              userName:@"Some User Name"
dirk@437
   757
                              isOwn:NO];
dirk@437
   758
dirk@437
   759
    [session updateIdentity:identTest];
dirk@437
   760
    XCTAssertNotNil(identTest.fingerPrint);
dirk@437
   761
    XCTAssertEqualObjects(identTest.fingerPrint, fingerPrint);
dirk@437
   762
}
dirk@437
   763
dirk@433
   764
/**
dirk@433
   765
 Verifies that a partner ID is really a correct Identity.
dirk@433
   766
 Usually used on identities imported as keys, since the engine has problems with them.
dirk@433
   767
 */
dirk@433
   768
- (void)updateAndVerifyPartnerIdentity:(PEPIdentity *)partnerIdentity session:(PEPSession *)session
dirk@433
   769
{
dirk@433
   770
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
   771
    [session updateIdentity:partnerIdentity];
dirk@433
   772
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
   773
    NSString *fingerprint = partnerIdentity.fingerPrint;
dirk@433
   774
    partnerIdentity.fingerPrint = nil;
dirk@433
   775
    [session updateIdentity:partnerIdentity];
dirk@433
   776
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
   777
    XCTAssertEqualObjects(partnerIdentity.fingerPrint, fingerprint);
dirk@433
   778
}
dirk@433
   779
andreas@416
   780
- (PEPMessage *)mailWrittenToMySelf
andreas@416
   781
{
andreas@416
   782
    PEPSession *session = [PEPSession new];
andreas@416
   783
andreas@416
   784
    // Write a e-mail to yourself ...
andreas@416
   785
    PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch"
andreas@416
   786
                                                     userName:@"userName"];
andreas@416
   787
    [session mySelf:me];
andreas@416
   788
andreas@416
   789
    NSString *shortMessage = @"Subject";
andreas@416
   790
    NSString *longMessage = @"Oh, this is a long body text!";
andreas@416
   791
    PEPMessage *mail = [PEPTestUtils mailFrom:me
andreas@416
   792
                                      toIdent:me
andreas@416
   793
                                 shortMessage:shortMessage
andreas@416
   794
                                  longMessage:longMessage
andreas@416
   795
                                     outgoing:YES];
andreas@416
   796
    PEPMessage *encMessage;
andreas@416
   797
    [session encryptMessage:mail identity:me dest:&encMessage];
andreas@416
   798
andreas@416
   799
    return encMessage;
andreas@416
   800
}
andreas@416
   801
andreas@392
   802
- (PEPMessage *)internalEncryptToMySelfKeys:(PEPStringList **)keys
andreas@392
   803
{
andreas@392
   804
    PEPSession *session = [PEPSession new];
andreas@411
   805
    
andreas@411
   806
    PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch"
andreas@411
   807
                                                     userName:@"userName"];
andreas@392
   808
    [session mySelf:me];
andreas@392
   809
    XCTAssertNotNil(me.fingerPrint);
andreas@392
   810
andreas@392
   811
    // Create draft
andreas@392
   812
    NSString *shortMessage = @"Subject";
andreas@392
   813
    NSString *longMessage = @"Oh, this is a long body text!";
andreas@392
   814
    PEPMessage *mail = [PEPTestUtils mailFrom:me toIdent:me shortMessage:shortMessage longMessage:longMessage outgoing:YES];
andreas@392
   815
andreas@392
   816
    PEPMessage *encMessage;
andreas@392
   817
    PEP_STATUS status = [session encryptMessage:mail identity:me dest:&encMessage];
andreas@392
   818
    XCTAssertEqual(status, 0);
andreas@392
   819
    XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p");
andreas@392
   820
andreas@392
   821
    PEPMessage *unencDict;
andreas@392
   822
    PEP_rating rating = [session decryptMessage:encMessage dest:&unencDict keys:keys];
andreas@392
   823
    XCTAssertGreaterThanOrEqual(rating, PEP_rating_reliable);
andreas@392
   824
andreas@392
   825
    XCTAssertEqualObjects(unencDict.shortMessage, shortMessage);
andreas@392
   826
    XCTAssertEqualObjects(unencDict.longMessage, longMessage);
andreas@392
   827
andreas@392
   828
    return unencDict;
andreas@392
   829
}
andreas@392
   830
andreas@392
   831
- (void)pEpCleanUpRestoringBackupNamed:(NSString *)backup {
andreas@392
   832
    [PEPTestUtils deleteWorkFilesAfterBackingUpWithBackupName:backup];
andreas@392
   833
}
andreas@392
   834
andreas@392
   835
- (void)pEpCleanUp
andreas@392
   836
{
andreas@392
   837
    [PEPSession cleanup];
andreas@392
   838
    [self pEpCleanUpRestoringBackupNamed:NULL];
andreas@392
   839
}
andreas@392
   840
andreas@392
   841
- (void)pEpSetUp:(NSString *)restore
andreas@392
   842
{
andreas@392
   843
    // Must be the first thing you do before using anything pEp-related
andreas@392
   844
    // ... but this is now done in session, with a "dispatch_once"
andreas@392
   845
    // [PEPObjCAdapter setupTrustWordsDB:[NSBundle bundleForClass:[self class]]];
andreas@392
   846
andreas@392
   847
    [PEPTestUtils deleteWorkFilesAfterBackingUpWithBackupName:nil];
andreas@392
   848
    [PEPTestUtils restoreWorkFilesFromBackupNamed:restore];
andreas@392
   849
}
andreas@392
   850
andreas@392
   851
- (void)pEpSetUp
andreas@392
   852
{
andreas@392
   853
    [self pEpSetUp:NULL];
andreas@392
   854
}
andreas@392
   855
dirk@424
   856
- (void)helperXEncStatusForOutgoingEncryptdMailToSelf:(BOOL)toSelf
dirk@424
   857
                                       expectedRating:(PEP_rating)expectedRating
dirk@422
   858
{
dirk@422
   859
    PEPSession *session = [PEPSession new];
dirk@422
   860
dirk@422
   861
    // Partner pubkey for the test:
dirk@422
   862
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
dirk@422
   863
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@422
   864
    [PEPTestUtils importBundledKey:@"0x6FF00E97.asc"];
dirk@422
   865
dirk@422
   866
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@422
   867
                               initWithAddress:@"pep.test.alice@pep-project.org"
dirk@422
   868
                               userID:ownUserId
dirk@422
   869
                               userName:@"pEp Test Alice"
dirk@422
   870
                               isOwn:NO
dirk@433
   871
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@433
   872
    [self updateAndVerifyPartnerIdentity:identAlice session:session];
dirk@422
   873
dirk@422
   874
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@422
   875
                               initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@422
   876
                               userID:@"me-myself-and-i"
dirk@422
   877
                               userName:@"pEp Test Alice"
dirk@422
   878
                               isOwn:YES];
dirk@422
   879
    [session mySelf:identMe];
dirk@422
   880
    XCTAssertNotNil(identMe.fingerPrint);
dirk@422
   881
dirk@422
   882
    PEPMessage *msg = [PEPMessage new];
dirk@422
   883
    msg.from = identMe;
dirk@422
   884
    msg.to = @[identAlice];
dirk@422
   885
    msg.shortMessage = @"Mail to Alice";
dirk@422
   886
    msg.longMessage = @"Alice?";
dirk@422
   887
    msg.direction = PEP_dir_outgoing;
dirk@422
   888
dirk@422
   889
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@424
   890
    XCTAssertEqual(clr, PEP_rating_reliable);
dirk@422
   891
dirk@423
   892
    PEPMessage *encMsg;
dirk@424
   893
dirk@424
   894
    PEP_STATUS statusEnc = PEP_VERSION_MISMATCH;
dirk@424
   895
    if (toSelf) {
dirk@424
   896
        statusEnc = [session encryptMessage:msg identity:identMe dest:&encMsg];
dirk@424
   897
    } else {
dirk@424
   898
         statusEnc = [session encryptMessage:msg extra:@[] dest:&encMsg];
dirk@424
   899
    }
dirk@422
   900
dirk@423
   901
    XCTAssertEqual(statusEnc, PEP_STATUS_OK);
dirk@423
   902
dirk@423
   903
    XCTAssertNotNil(encMsg);
dirk@423
   904
dirk@423
   905
    PEPMessage *decMsg;
dirk@423
   906
    PEPStringList *keys;
dirk@423
   907
    PEP_rating pEpRating = [session decryptMessage:encMsg dest:&decMsg keys:&keys];
dirk@424
   908
    XCTAssertEqual(pEpRating, expectedRating);
dirk@423
   909
    XCTAssertNotNil(decMsg);
dirk@423
   910
dirk@423
   911
    NSArray * encStatusField = nil;
dirk@423
   912
    for (NSArray *field in decMsg.optionalFields) {
dirk@423
   913
        NSString *header = [field[0] lowercaseString];
dirk@423
   914
        if ([header isEqualToString:@"x-encstatus"]) {
dirk@423
   915
            encStatusField = field;
dirk@423
   916
        }
dirk@423
   917
    }
dirk@423
   918
    XCTAssertNotNil(encStatusField);
dirk@423
   919
    if (encStatusField) {
dirk@423
   920
        PEP_rating outgoingRating = [session ratingFromString:encStatusField[1]];
dirk@424
   921
        XCTAssertEqual(outgoingRating, expectedRating);
dirk@423
   922
    }
dirk@422
   923
}
dirk@422
   924
dirk@424
   925
- (void)testXEncStatusForOutgoingEncryptedMail
dirk@424
   926
{
dirk@424
   927
    [self helperXEncStatusForOutgoingEncryptdMailToSelf:NO expectedRating:PEP_rating_reliable];
dirk@424
   928
}
dirk@424
   929
dirk@424
   930
- (void)testXEncStatusForOutgoingSelfEncryptedMail
dirk@424
   931
{
dirk@424
   932
    [self helperXEncStatusForOutgoingEncryptdMailToSelf:YES
dirk@424
   933
                                         expectedRating:PEP_rating_trusted_and_anonymized];
dirk@424
   934
}
dirk@424
   935
andreas@392
   936
@end