@@ -124,6 +124,61 @@ final class TunnelConfiguration: Codable {
124124 return ( ipv4IncludedRoutes, ipv6IncludedRoutes)
125125 }
126126
127+ #if os(iOS)
128+ /// Helper function allowing to parse comma-separated string of addresses.
129+ private func parseAddresses( fromString string: String ) -> [ IpAddrMask ] {
130+ var addresses : [ IpAddrMask ] = [ ]
131+
132+ for addr in string. split ( separator: " , " ) . map ( {
133+ String ( $0. trimmingCharacters ( in: . whitespaces) )
134+ } ) {
135+ if let addr_mask = IpAddrMask ( fromString: addr) {
136+ addresses. append ( addr_mask)
137+ }
138+ }
139+
140+ return addresses
141+ }
142+
143+ init ( fromStartData startData: TunnelStartData ) {
144+ name = startData. locationName
145+ privateKey = startData. privateKey
146+ let peer = Peer ( publicKey: startData. publicKey)
147+ peers = [ peer]
148+
149+ addresses = self . parseAddresses ( fromString: startData. address)
150+
151+ // DNS settings
152+ let dnsRecords = startData. dns? . split ( separator: " , " ) . map {
153+ $0. trimmingCharacters ( in: . whitespaces)
154+ } ?? [ ]
155+ if !dnsRecords. isEmpty {
156+ for record in dnsRecords {
157+ if IPv4Address ( record) != nil || IPv6Address ( record) != nil {
158+ dns. append ( record)
159+ } else {
160+ dnsSearch. append ( record)
161+ }
162+ }
163+ }
164+
165+ // Peer settings
166+ peer. preSharedKey = startData. presharedKey
167+ peer. endpoint = Endpoint ( from: startData. endpoint)
168+ peer. persistentKeepAlive = UInt16 ( startData. keepalive)
169+ peer. allowedIPs =
170+ switch startData. traffic {
171+ case . All:
172+ [
173+ IpAddrMask ( address: IPv4Address . any, cidr: 0 ) ,
174+ IpAddrMask ( address: IPv6Address . any, cidr: 0 ) ,
175+ ]
176+ case . Predefined:
177+ self . parseAddresses ( fromString: startData. allowedIps)
178+ }
179+ }
180+ #endif
181+
127182 /// Client connection expects one peer, so check for that.
128183 func isValidForClientConnection( ) -> Bool {
129184 return peers. count == 1
0 commit comments