summaryrefslogtreecommitdiffhomepage
path: root/ios/PacketTunnel/PacketTunnelProvider/SettingsReader.swift
blob: ef3924f7213701df3fd74e807699538b708f6035 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//
//  SettingsReader.swift
//  PacketTunnel
//
//  Created by pronebird on 30/08/2023.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import Foundation
import MullvadSettings
import PacketTunnelCore

struct SettingsReader: SettingsReaderProtocol {
    func read() throws -> Settings {
        let settings = try SettingsManager.readSettings()
        let deviceState = try SettingsManager.readDeviceState()
        let deviceData = try deviceState.getDeviceData()

        return Settings(
            privateKey: deviceData.wgKeyData.privateKey,
            interfaceAddresses: [deviceData.ipv4Address, deviceData.ipv6Address],
            tunnelSettings: settings
        )
    }
}

private extension DeviceState {
    /**
     Returns `StoredDeviceState` if device is logged in, otherwise throws an error.
    
     - Throws: an error of type `ReadDeviceDataError` when device is either revoked or logged out.
     - Returns: a copy of `StoredDeviceData` stored as associated value in `DeviceState.loggedIn` variant.
     */
    func getDeviceData() throws -> StoredDeviceData {
        switch self {
        case .revoked:
            throw ReadDeviceDataError.revoked
        case .loggedOut:
            throw ReadDeviceDataError.loggedOut
        case let .loggedIn(_, deviceData):
            return deviceData
        }
    }
}

/// Error returned when device state is either revoked or logged out.
public enum ReadDeviceDataError: LocalizedError {
    case loggedOut, revoked

    public var errorDescription: String? {
        switch self {
        case .loggedOut:
            return "Device is logged out."
        case .revoked:
            return "Device is revoked."
        }
    }
}