Allow adding unvalidated config.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jeroen Leenarts 2018-05-29 22:21:44 +02:00
parent 1407090f94
commit db7b24dd02
6 changed files with 121 additions and 16 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait"> <device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/> <adaptation id="fullscreen"/>
</device> </device>
@ -118,6 +118,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="Ike-ou-qa9"/>
<outlet property="delegate" destination="06N-KU-LSv" id="TuA-ac-TIy"/> <outlet property="delegate" destination="06N-KU-LSv" id="TuA-ac-TIy"/>
</connections> </connections>
</textField> </textField>
@ -141,6 +142,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="CQd-My-M7G"/>
<outlet property="delegate" destination="06N-KU-LSv" id="7YF-mU-HZT"/> <outlet property="delegate" destination="06N-KU-LSv" id="7YF-mU-HZT"/>
</connections> </connections>
</textField> </textField>
@ -167,6 +169,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="d2c-NL-e1I"/>
<outlet property="delegate" destination="06N-KU-LSv" id="apT-gO-mcr"/> <outlet property="delegate" destination="06N-KU-LSv" id="apT-gO-mcr"/>
</connections> </connections>
</textField> </textField>
@ -190,6 +193,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="Vtr-4A-l3g"/>
<outlet property="delegate" destination="06N-KU-LSv" id="CUZ-nd-ETQ"/> <outlet property="delegate" destination="06N-KU-LSv" id="CUZ-nd-ETQ"/>
</connections> </connections>
</textField> </textField>
@ -210,6 +214,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="z45-u7-zCB"/>
<outlet property="delegate" destination="06N-KU-LSv" id="YZ0-LC-PjW"/> <outlet property="delegate" destination="06N-KU-LSv" id="YZ0-LC-PjW"/>
</connections> </connections>
</textField> </textField>
@ -235,6 +240,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="8gN-mk-GtN"/>
<outlet property="delegate" destination="06N-KU-LSv" id="YjV-8W-z5Q"/> <outlet property="delegate" destination="06N-KU-LSv" id="YjV-8W-z5Q"/>
</connections> </connections>
</textField> </textField>
@ -255,6 +261,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="06N-KU-LSv" eventType="editingChanged" id="fgZ-LJ-ksN"/>
<outlet property="delegate" destination="06N-KU-LSv" id="F1E-lK-AsD"/> <outlet property="delegate" destination="06N-KU-LSv" id="F1E-lK-AsD"/>
</connections> </connections>
</textField> </textField>
@ -277,6 +284,15 @@
<constraint firstItem="DIe-hK-tf6" firstAttribute="leading" secondItem="CSX-Am-ix0" secondAttribute="leadingMargin" id="sab-5q-2rU"/> <constraint firstItem="DIe-hK-tf6" firstAttribute="leading" secondItem="CSX-Am-ix0" secondAttribute="leadingMargin" id="sab-5q-2rU"/>
</constraints> </constraints>
</tableViewCellContentView> </tableViewCellContentView>
<connections>
<outlet property="addressesField" destination="Oh8-qT-kJL" id="8aV-2T-PxV"/>
<outlet property="dnsField" destination="ByK-wW-6Q4" id="gZ4-7d-AHM"/>
<outlet property="listenPortField" destination="CSv-At-WVr" id="xnx-xz-pqS"/>
<outlet property="mtuField" destination="myM-B2-sjT" id="ppo-pV-tMl"/>
<outlet property="nameField" destination="6y9-eJ-8fF" id="PKk-lj-jK9"/>
<outlet property="privateKeyField" destination="hYd-0L-nnY" id="JLS-5M-E3T"/>
<outlet property="publicKeyField" destination="aXZ-aL-pFu" id="Vdo-km-hgS"/>
</connections>
</tableViewCell> </tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="AddPeerTableViewCell" rowHeight="60" id="RyR-s5-lBV" customClass="AddPeerTableViewCell" customModule="WireGuard" customModuleProvider="target"> <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="AddPeerTableViewCell" rowHeight="60" id="RyR-s5-lBV" customClass="AddPeerTableViewCell" customModule="WireGuard" customModuleProvider="target">
<rect key="frame" x="0.0" y="396" width="375" height="60"/> <rect key="frame" x="0.0" y="396" width="375" height="60"/>
@ -347,6 +363,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="gzz-88-0IG" eventType="editingChanged" id="taX-Ji-pVu"/>
<outlet property="delegate" destination="gzz-88-0IG" id="bkQ-Nc-VH4"/> <outlet property="delegate" destination="gzz-88-0IG" id="bkQ-Nc-VH4"/>
</connections> </connections>
</textField> </textField>
@ -367,6 +384,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="gzz-88-0IG" eventType="editingChanged" id="XeB-bW-Zog"/>
<outlet property="delegate" destination="gzz-88-0IG" id="oAu-VZ-2dn"/> <outlet property="delegate" destination="gzz-88-0IG" id="oAu-VZ-2dn"/>
</connections> </connections>
</textField> </textField>
@ -387,6 +405,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="gzz-88-0IG" eventType="editingChanged" id="k1U-vW-Jom"/>
<outlet property="delegate" destination="gzz-88-0IG" id="DXo-0s-9sc"/> <outlet property="delegate" destination="gzz-88-0IG" id="DXo-0s-9sc"/>
</connections> </connections>
</textField> </textField>
@ -410,6 +429,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="gzz-88-0IG" eventType="editingChanged" id="bjR-TZ-Sx8"/>
<outlet property="delegate" destination="gzz-88-0IG" id="PLB-sa-SBV"/> <outlet property="delegate" destination="gzz-88-0IG" id="PLB-sa-SBV"/>
</connections> </connections>
</textField> </textField>
@ -430,6 +450,7 @@
<fontDescription key="fontDescription" type="system" pointSize="14"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/> <textInputTraits key="textInputTraits"/>
<connections> <connections>
<action selector="textfieldDidChange:" destination="gzz-88-0IG" eventType="editingChanged" id="fQC-Pf-jUQ"/>
<outlet property="delegate" destination="gzz-88-0IG" id="sbH-Sb-rcW"/> <outlet property="delegate" destination="gzz-88-0IG" id="sbH-Sb-rcW"/>
</connections> </connections>
</textField> </textField>
@ -450,6 +471,13 @@
<constraint firstAttribute="bottomMargin" secondItem="NIK-2J-pTR" secondAttribute="bottom" id="rRD-SV-Wft"/> <constraint firstAttribute="bottomMargin" secondItem="NIK-2J-pTR" secondAttribute="bottom" id="rRD-SV-Wft"/>
</constraints> </constraints>
</tableViewCellContentView> </tableViewCellContentView>
<connections>
<outlet property="allowedIpsField" destination="iiY-Tl-UcH" id="QQK-x0-C3T"/>
<outlet property="endpointField" destination="W88-H0-dFZ" id="l0A-57-I5p"/>
<outlet property="persistentKeepaliveField" destination="Q8w-jh-0ox" id="thE-f2-vzz"/>
<outlet property="preSharedKeyField" destination="wkY-3s-yTK" id="0Tn-cP-uXS"/>
<outlet property="publicKeyField" destination="RLw-0o-akQ" id="teS-po-0h2"/>
</connections>
</tableViewCell> </tableViewCell>
</prototypes> </prototypes>
<connections> <connections>

View File

@ -97,12 +97,10 @@ extension AppCoordinator: TunnelsTableViewControllerDelegate {
} }
func configure(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) { func configure(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
// TODO implement
print("configure tunnel \(tunnel)") print("configure tunnel \(tunnel)")
let editContext = persistentContainer.newBackgroundContext() let editContext = persistentContainer.newBackgroundContext()
var backgroundTunnel: Tunnel? var backgroundTunnel: Tunnel?
editContext.performAndWait { editContext.performAndWait {
backgroundTunnel = editContext.object(with: tunnel.objectID) as? Tunnel backgroundTunnel = editContext.object(with: tunnel.objectID) as? Tunnel
} }
@ -118,8 +116,14 @@ extension AppCoordinator: TunnelsTableViewControllerDelegate {
} }
func delete(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) { func delete(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
// TODO implement
print("delete tunnel \(tunnel)") print("delete tunnel \(tunnel)")
if let moc = tunnel.managedObjectContext {
moc.perform {
moc.delete(tunnel)
moc.saveContextToStore()
}
}
} }
} }

View File

@ -23,6 +23,7 @@ extension Interface {
@NSManaged public var dns: String? @NSManaged public var dns: String?
@NSManaged public var table: String? @NSManaged public var table: String?
@NSManaged public var tunnel: Tunnel? @NSManaged public var tunnel: Tunnel?
@NSManaged public var publicKey: String?
@NSManaged public var adresses: NSSet? @NSManaged public var adresses: NSSet?
} }

View File

@ -17,14 +17,32 @@ extension Tunnel {
} }
@NSManaged public var title: String? @NSManaged public var title: String?
@NSManaged public var peers: NSSet?
@NSManaged public var interface: Interface? @NSManaged public var interface: Interface?
@NSManaged public var peers: NSOrderedSet?
} }
// MARK: Generated accessors for peers // MARK: Generated accessors for peers
extension Tunnel { extension Tunnel {
@objc(insertObject:inPeersAtIndex:)
@NSManaged public func insertIntoPeers(_ value: Peer, at idx: Int)
@objc(removeObjectFromPeersAtIndex:)
@NSManaged public func removeFromPeers(at idx: Int)
@objc(insertPeers:atIndexes:)
@NSManaged public func insertIntoPeers(_ values: [Peer], at indexes: NSIndexSet)
@objc(removePeersAtIndexes:)
@NSManaged public func removeFromPeers(at indexes: NSIndexSet)
@objc(replaceObjectInPeersAtIndex:withObject:)
@NSManaged public func replacePeers(at idx: Int, with value: Peer)
@objc(replacePeersAtIndexes:withPeers:)
@NSManaged public func replacePeers(at indexes: NSIndexSet, with values: [Peer])
@objc(addPeersObject:) @objc(addPeersObject:)
@NSManaged public func addToPeers(_ value: Peer) @NSManaged public func addToPeers(_ value: Peer)
@ -32,9 +50,9 @@ extension Tunnel {
@NSManaged public func removeFromPeers(_ value: Peer) @NSManaged public func removeFromPeers(_ value: Peer)
@objc(addPeers:) @objc(addPeers:)
@NSManaged public func addToPeers(_ values: NSSet) @NSManaged public func addToPeers(_ values: NSOrderedSet)
@objc(removePeers:) @objc(removePeers:)
@NSManaged public func removeFromPeers(_ values: NSSet) @NSManaged public func removeFromPeers(_ values: NSOrderedSet)
} }

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="14133" systemVersion="17E202" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="14135" systemVersion="17E202" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="Address" representedClassName="Address" syncable="YES"> <entity name="Address" representedClassName="Address" syncable="YES">
<attribute name="address" optional="YES" attributeType="String" syncable="YES"/> <attribute name="address" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="interface" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Interface" inverseName="adresses" inverseEntity="Interface" syncable="YES"/> <relationship name="interface" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Interface" inverseName="adresses" inverseEntity="Interface" syncable="YES"/>
@ -10,6 +10,7 @@
<attribute name="listenPort" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> <attribute name="listenPort" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
<attribute name="mtu" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> <attribute name="mtu" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
<attribute name="privateKey" attributeType="String" syncable="YES"/> <attribute name="privateKey" attributeType="String" syncable="YES"/>
<attribute name="publicKey" attributeType="String" syncable="YES"/>
<attribute name="table" optional="YES" attributeType="String" syncable="YES"/> <attribute name="table" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="adresses" toMany="YES" deletionRule="Cascade" destinationEntity="Address" inverseName="interface" inverseEntity="Address" syncable="YES"/> <relationship name="adresses" toMany="YES" deletionRule="Cascade" destinationEntity="Address" inverseName="interface" inverseEntity="Address" syncable="YES"/>
<relationship name="tunnel" maxCount="1" deletionRule="Nullify" destinationEntity="Tunnel" inverseName="interface" inverseEntity="Tunnel" syncable="YES"/> <relationship name="tunnel" maxCount="1" deletionRule="Nullify" destinationEntity="Tunnel" inverseName="interface" inverseEntity="Tunnel" syncable="YES"/>
@ -25,11 +26,11 @@
<entity name="Tunnel" representedClassName="Tunnel" syncable="YES"> <entity name="Tunnel" representedClassName="Tunnel" syncable="YES">
<attribute name="title" optional="YES" attributeType="String" syncable="YES"/> <attribute name="title" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="interface" maxCount="1" deletionRule="Cascade" destinationEntity="Interface" inverseName="tunnel" inverseEntity="Interface" syncable="YES"/> <relationship name="interface" maxCount="1" deletionRule="Cascade" destinationEntity="Interface" inverseName="tunnel" inverseEntity="Interface" syncable="YES"/>
<relationship name="peers" toMany="YES" deletionRule="Cascade" destinationEntity="Peer" inverseName="tunnel" inverseEntity="Peer" syncable="YES"/> <relationship name="peers" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="Peer" inverseName="tunnel" inverseEntity="Peer" syncable="YES"/>
</entity> </entity>
<elements> <elements>
<element name="Address" positionX="-54" positionY="45" width="128" height="75"/> <element name="Address" positionX="-54" positionY="45" width="128" height="75"/>
<element name="Interface" positionX="-54" positionY="-9" width="128" height="165"/> <element name="Interface" positionX="-54" positionY="-9" width="128" height="180"/>
<element name="Peer" positionX="-36" positionY="9" width="128" height="135"/> <element name="Peer" positionX="-36" positionY="9" width="128" height="135"/>
<element name="Tunnel" positionX="160" positionY="192" width="128" height="90"/> <element name="Tunnel" positionX="160" positionY="192" width="128" height="90"/>
</elements> </elements>

View File

@ -61,9 +61,19 @@ class TunnelConfigurationTableViewController: UITableViewController {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.section { switch indexPath.section {
case 0: case 0:
return tableView.dequeueReusableCell(type: InterfaceTableViewCell.self, for: indexPath) let cell = tableView.dequeueReusableCell(type: InterfaceTableViewCell.self, for: indexPath)
cell.model = tunnel.interface
return cell
case 1: case 1:
return tableView.dequeueReusableCell(type: PeerTableViewCell.self, for: indexPath) let cell = tableView.dequeueReusableCell(type: PeerTableViewCell.self, for: indexPath)
if let peer = tunnel.peers?.object(at: indexPath.row) as? Peer {
cell.peer = peer
} else {
let peer = Peer(context: tunnel.managedObjectContext!)
tunnel.addToPeers(peer)
cell.peer = peer
}
return cell
default: default:
return tableView.dequeueReusableCell(type: AddPeerTableViewCell.self, for: indexPath) return tableView.dequeueReusableCell(type: AddPeerTableViewCell.self, for: indexPath)
} }
@ -104,12 +114,38 @@ class InterfaceTableViewCell: UITableViewCell {
} }
extension InterfaceTableViewCell: UITextFieldDelegate { extension InterfaceTableViewCell: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) { @IBAction
print("\(textField) \(textField.text)") func textfieldDidChange(_ sender: UITextField) {
let string = sender.text
print(string)
if sender == nameField {
model.tunnel?.title = string
} else if sender == privateKeyField {
model.privateKey = string
} else if sender == publicKeyField {
model.publicKey = string
} else if sender == addressesField {
let address = Address(context: model.managedObjectContext!)
address.address = string
model.adresses = NSSet(array: [address])
} else if sender == listenPortField {
if let string = string, let port = Int16(string) {
model.listenPort = port
}
} else if sender == dnsField {
model.dns = string
} else if sender == mtuField {
if let string = string, let mtu = Int32(string) {
model.mtu = mtu
}
}
} }
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print("\(string)") print("\(string)")
return true return true
} }
} }
@ -126,12 +162,29 @@ class PeerTableViewCell: UITableViewCell {
} }
extension PeerTableViewCell: UITextFieldDelegate { extension PeerTableViewCell: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) { @IBAction
print("\(textField) \(textField.text)") func textfieldDidChange(_ sender: UITextField) {
let string = sender.text
print(string)
if sender == publicKeyField {
peer.publicKey = string
} else if sender == preSharedKeyField {
peer.presharedKey = string
} else if sender == allowedIpsField {
peer.allowedIPs = string
} else if sender == endpointField {
peer.endpoint = string
} else if sender == persistentKeepaliveField {
if let string = string, let persistentKeepalive = Int16(string) {
peer.persistentKeepalive = persistentKeepalive
}
}
} }
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print("\(string)") print("\(string)")
return true return true
} }
} }