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."
}
}
}
|