Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalServiceKit/Network/API/Requests/AuthedDevice.swift
1 views
//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import Foundation
public import LibSignalClient

public enum AuthedDevice {
    case implicit
    case explicit(Explicit)

    public struct Explicit {
        public let aci: Aci
        public let phoneNumber: E164
        public let pni: Pni
        public let deviceId: DeviceId
        public var isPrimaryDevice: Bool { deviceId == .primary }
        public let authPassword: String

        public init(aci: Aci, phoneNumber: E164, pni: Pni, deviceId: DeviceId, authPassword: String) {
            self.aci = aci
            self.phoneNumber = phoneNumber
            self.pni = pni
            self.deviceId = deviceId
            self.authPassword = authPassword
        }

        public var localIdentifiers: LocalIdentifiers {
            return LocalIdentifiers(aci: aci, pni: pni, e164: phoneNumber)
        }

        public var authedAccount: AuthedAccount.Explicit {
            return .init(
                aci: aci,
                pni: pni,
                e164: phoneNumber,
                deviceId: deviceId,
                authPassword: authPassword,
            )
        }
    }

    public func orIfImplicitUse(_ other: Self) -> Self {
        switch self {
        case .explicit:
            return self
        case .implicit:
            return other
        }
    }

    public var authedAccount: AuthedAccount {
        switch self {
        case .implicit:
            return .implicit()
        case .explicit(let explicit):
            return .explicit(
                aci: explicit.aci,
                pni: explicit.pni,
                e164: explicit.phoneNumber,
                deviceId: explicit.deviceId,
                authPassword: explicit.authPassword,
            )
        }
    }
}