mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			181 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			181 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Swift
		
	
//
 | 
						|
//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
import XCTest
 | 
						|
import Foundation
 | 
						|
import SignalCoreKit
 | 
						|
import SignalMetadataKit
 | 
						|
@testable import SignalServiceKit
 | 
						|
 | 
						|
class MockCertificateValidator: NSObject, SMKCertificateValidator {
 | 
						|
    @objc public func throwswrapped_validate(senderCertificate: SMKSenderCertificate, validationTime: UInt64) throws {
 | 
						|
        // Do not throw
 | 
						|
    }
 | 
						|
 | 
						|
    @objc public func throwswrapped_validate(serverCertificate: SMKServerCertificate) throws {
 | 
						|
        // Do not throw
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
class OWSUDManagerTest: SSKBaseTestSwift {
 | 
						|
 | 
						|
    // MARK: - Singletons
 | 
						|
 | 
						|
    private var tsAccountManager: TSAccountManager {
 | 
						|
        return TSAccountManager.sharedInstance()
 | 
						|
    }
 | 
						|
 | 
						|
    private var udManager: OWSUDManagerImpl {
 | 
						|
        return SSKEnvironment.shared.udManager as! OWSUDManagerImpl
 | 
						|
    }
 | 
						|
 | 
						|
    private var profileManager: ProfileManagerProtocol {
 | 
						|
        return SSKEnvironment.shared.profileManager
 | 
						|
    }
 | 
						|
 | 
						|
    // MARK: registration
 | 
						|
    let aliceRecipientId = "+13213214321"
 | 
						|
 | 
						|
    override func setUp() {
 | 
						|
        super.setUp()
 | 
						|
 | 
						|
        tsAccountManager.registerForTests(withLocalNumber: aliceRecipientId)
 | 
						|
 | 
						|
        // Configure UDManager
 | 
						|
        profileManager.setProfileKeyData(OWSAES256Key.generateRandom().keyData, forRecipientId: aliceRecipientId)
 | 
						|
 | 
						|
        udManager.certificateValidator = MockCertificateValidator()
 | 
						|
 | 
						|
        let serverCertificate = SMKServerCertificate(keyId: 1,
 | 
						|
                                                     key: try! ECPublicKey(keyData: Randomness.generateRandomBytes(ECCKeyLength)),
 | 
						|
                                                     signatureData: Randomness.generateRandomBytes(ECCSignatureLength))
 | 
						|
        let senderCertificate = SMKSenderCertificate(signer: serverCertificate,
 | 
						|
                                                     key: try! ECPublicKey(keyData: Randomness.generateRandomBytes(ECCKeyLength)),
 | 
						|
                                                     senderDeviceId: 1,
 | 
						|
                                                     senderRecipientId: aliceRecipientId,
 | 
						|
                                                     expirationTimestamp: NSDate.ows_millisecondTimeStamp() + kWeekInMs,
 | 
						|
                                                     signatureData: Randomness.generateRandomBytes(ECCSignatureLength))
 | 
						|
 | 
						|
        udManager.setSenderCertificate(try! senderCertificate.serialized())
 | 
						|
    }
 | 
						|
 | 
						|
    override func tearDown() {
 | 
						|
        // Put teardown code here. This method is called after the invocation of each test method in the class.
 | 
						|
        super.tearDown()
 | 
						|
    }
 | 
						|
 | 
						|
    func testMode_self() {
 | 
						|
 | 
						|
        XCTAssert(udManager.hasSenderCertificate())
 | 
						|
        XCTAssert(tsAccountManager.isRegistered())
 | 
						|
        XCTAssertNotNil(tsAccountManager.localNumber())
 | 
						|
        XCTAssert(tsAccountManager.localNumber()!.count > 0)
 | 
						|
 | 
						|
        var udAccess: OWSUDAccess!
 | 
						|
 | 
						|
        XCTAssertEqual(.enabled, udManager.unidentifiedAccessMode(forRecipientId: aliceRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: aliceRecipientId, requireSyncAccess: false)
 | 
						|
        XCTAssertFalse(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.unknown, recipientId: aliceRecipientId)
 | 
						|
        XCTAssertEqual(.unknown, udManager.unidentifiedAccessMode(forRecipientId: aliceRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: aliceRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssertFalse(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.disabled, recipientId: aliceRecipientId)
 | 
						|
        XCTAssertEqual(.disabled, udManager.unidentifiedAccessMode(forRecipientId: aliceRecipientId))
 | 
						|
        XCTAssertNil(udManager.udAccess(forRecipientId: aliceRecipientId, requireSyncAccess: false))
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.enabled, recipientId: aliceRecipientId)
 | 
						|
        XCTAssert(UnidentifiedAccessMode.enabled == udManager.unidentifiedAccessMode(forRecipientId: aliceRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: aliceRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssertFalse(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.unrestricted, recipientId: aliceRecipientId)
 | 
						|
        XCTAssertEqual(.unrestricted, udManager.unidentifiedAccessMode(forRecipientId: aliceRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: aliceRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssert(udAccess.isRandomKey)
 | 
						|
    }
 | 
						|
 | 
						|
    func testMode_noProfileKey() {
 | 
						|
 | 
						|
        XCTAssert(udManager.hasSenderCertificate())
 | 
						|
        XCTAssert(tsAccountManager.isRegistered())
 | 
						|
        XCTAssertNotNil(tsAccountManager.localNumber())
 | 
						|
        XCTAssert(tsAccountManager.localNumber()!.count > 0)
 | 
						|
 | 
						|
        // Ensure UD is enabled by setting our own access level to enabled.
 | 
						|
        udManager.setUnidentifiedAccessMode(.enabled, recipientId: tsAccountManager.localNumber()!)
 | 
						|
 | 
						|
        let bobRecipientId = "+13213214322"
 | 
						|
        XCTAssertNotEqual(bobRecipientId, tsAccountManager.localNumber()!)
 | 
						|
 | 
						|
        var udAccess: OWSUDAccess!
 | 
						|
 | 
						|
        XCTAssertEqual(UnidentifiedAccessMode.unknown, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssert(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.unknown, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(UnidentifiedAccessMode.unknown, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssert(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.disabled, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(UnidentifiedAccessMode.disabled, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        XCTAssertNil(udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false))
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.enabled, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(UnidentifiedAccessMode.enabled, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        XCTAssertNil(udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false))
 | 
						|
 | 
						|
        // Bob should work in unrestricted mode, even if he doesn't have a profile key.
 | 
						|
        udManager.setUnidentifiedAccessMode(.unrestricted, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(UnidentifiedAccessMode.unrestricted, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssert(udAccess.isRandomKey)
 | 
						|
    }
 | 
						|
 | 
						|
    func testMode_withProfileKey() {
 | 
						|
        XCTAssert(udManager.hasSenderCertificate())
 | 
						|
        XCTAssert(tsAccountManager.isRegistered())
 | 
						|
        XCTAssertNotNil(tsAccountManager.localNumber())
 | 
						|
        XCTAssert(tsAccountManager.localNumber()!.count > 0)
 | 
						|
 | 
						|
        // Ensure UD is enabled by setting our own access level to enabled.
 | 
						|
        udManager.setUnidentifiedAccessMode(.enabled, recipientId: tsAccountManager.localNumber()!)
 | 
						|
 | 
						|
        let bobRecipientId = "+13213214322"
 | 
						|
        XCTAssertNotEqual(bobRecipientId, tsAccountManager.localNumber()!)
 | 
						|
        profileManager.setProfileKeyData(OWSAES256Key.generateRandom().keyData, forRecipientId: bobRecipientId)
 | 
						|
 | 
						|
        var udAccess: OWSUDAccess!
 | 
						|
 | 
						|
        XCTAssertEqual(.unknown, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssertFalse(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.unknown, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(.unknown, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssertFalse(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.disabled, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(.disabled, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        XCTAssertNil(udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false))
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.enabled, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(.enabled, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssertFalse(udAccess.isRandomKey)
 | 
						|
 | 
						|
        udManager.setUnidentifiedAccessMode(.unrestricted, recipientId: bobRecipientId)
 | 
						|
        XCTAssertEqual(.unrestricted, udManager.unidentifiedAccessMode(forRecipientId: bobRecipientId))
 | 
						|
        udAccess = udManager.udAccess(forRecipientId: bobRecipientId, requireSyncAccess: false)!
 | 
						|
        XCTAssert(udAccess.isRandomKey)
 | 
						|
    }
 | 
						|
}
 |