diff options
Diffstat (limited to 'WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift')
-rw-r--r-- | WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift | 300 |
1 files changed, 0 insertions, 300 deletions
diff --git a/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift b/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift deleted file mode 100644 index 65679c7..0000000 --- a/WireGuard/ViewControllers/TunnelConfigurationTableViewController.swift +++ /dev/null @@ -1,300 +0,0 @@ -// -// Copyright © 2018 WireGuard LLC. All rights reserved. -// - -import UIKit -import CoreData -import BNRCoreDataStack -import PromiseKit - -protocol TunnelConfigurationTableViewControllerDelegate: class { - func didSave(tunnel: Tunnel, tunnelConfigurationTableViewController: TunnelConfigurationTableViewController) - func showSettings() -} - -class TunnelConfigurationTableViewController: UITableViewController { - - @IBOutlet weak var saveButton: UIBarButtonItem! - - private var viewContext: NSManagedObjectContext! - private weak var delegate: TunnelConfigurationTableViewControllerDelegate? - private var tunnel: Tunnel! - - override func viewDidLoad() { - super.viewDidLoad() - - // Get rid of seperator lines in table. - tableView.tableFooterView = UIView(frame: CGRect.zero) - } - - func configure(context: NSManagedObjectContext, delegate: TunnelConfigurationTableViewControllerDelegate? = nil, tunnel: Tunnel? = nil) { - viewContext = context - self.delegate = delegate - self.tunnel = tunnel ?? generateNewTunnelConfig() - } - - private func generateNewTunnelConfig() -> Tunnel { - var tunnel: Tunnel! = nil - - viewContext.performAndWait { - tunnel = Tunnel(context: viewContext) - tunnel.tunnelIdentifier = UUID().uuidString - - let interface = Interface(context: viewContext) - - tunnel.interface = interface - } - return tunnel - } - - @IBAction func showSettings(_ sender: Any) { - delegate?.showSettings() - } - - @IBAction func addPeer(_ sender: Any) { - if let moc = tunnel.managedObjectContext { - tableView.beginUpdates() - let insertedAt = IndexPath(row: tunnel.peers?.count ?? 0, section: 1) - tableView.insertRows(at: [insertedAt], with: .automatic) - - let peer = Peer(context: moc) - tunnel.addToPeers(peer) - - tableView.endUpdates() - tableView.scrollToRow(at: insertedAt, at: .middle, animated: true) - } - } - - override func numberOfSections(in tableView: UITableView) -> Int { - return 3 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - switch section { - case 1: - return tunnel?.peers?.count ?? 1 - default: - return 1 - } - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - switch indexPath.section { - case 0: - let cell = tableView.dequeueReusableCell(type: InterfaceTableViewCell.self, for: indexPath) - cell.model = tunnel.interface - cell.delegate = self - return cell - case 1: - 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 - } - cell.delegate = self - return cell - default: - let cell = tableView.dequeueReusableCell(type: AddPeerTableViewCell.self, for: indexPath) - cell.tunnel = tunnel - return cell - } - } - - @IBAction func saveTunnelConfiguration(_ sender: Any) { - Promise<Void>(resolver: { (seal) in - do { - try tunnel.validate() - } catch { - seal.reject(error) - return - } - - viewContext.perform({ - self.viewContext.saveContext({ (result) in - switch result { - case .success: - seal.fulfill(()) - case .failure(let error): - seal.reject(error) - } - }) - }) - }).then { () -> Promise<Void> in - self.delegate?.didSave(tunnel: self.tunnel, tunnelConfigurationTableViewController: self) - return Promise.value(()) - }.catch { error in - let alert = UIAlertController(title: "Error", message: "\(error)", preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) - self.present(alert, animated: true, completion: nil) - } - } -} - -extension TunnelConfigurationTableViewController: PeerTableViewCellDelegate { - func delete(peer: Peer) { - if let moc = tunnel.managedObjectContext { - tableView.beginUpdates() - let deletedAt = IndexPath(row: tunnel.peers?.index(of: peer) ?? 0, section: 1) - tableView.deleteRows(at: [deletedAt], with: .automatic) - tunnel.removeFromPeers(peer) - moc.delete(peer) - tableView.endUpdates() - } - } -} - -extension TunnelConfigurationTableViewController: InterfaceTableViewCellDelegate { - func generateKeys() { - if let moc = tunnel.managedObjectContext { - moc.perform { - var privateKey = Data(count: 32) - privateKey.withUnsafeMutableBytes { (mutableBytes) -> Void in - curve25519_generate_private_key(mutableBytes) - } - - self.tunnel.interface?.privateKey = privateKey.base64EncodedString() - } - } - self.tableView.reloadData() - } -} - -protocol InterfaceTableViewCellDelegate: class { - func generateKeys() -} - -class InterfaceTableViewCell: UITableViewCell { - var model: Interface! { - didSet { - nameField.text = model.tunnel?.title - addressesField.text = model.addresses - privateKeyField.text = model.privateKey - publicKeyField.text = model.publicKey - - listenPortField.text = model.listenPort > 0 ? String(model.listenPort) : nil - dnsField.text = model.dns - mtuField.text = model.mtu > 0 ? String(model.mtu) : nil - } - } - - weak var delegate: InterfaceTableViewCellDelegate? - - @IBOutlet weak var nameField: UITextField! - @IBOutlet weak var addressesField: UITextField! - @IBOutlet weak var privateKeyField: UITextField! - @IBOutlet weak var publicKeyField: CopyableLabel! - @IBOutlet weak var listenPortField: UITextField! - @IBOutlet weak var dnsField: UITextField! - @IBOutlet weak var mtuField: UITextField! - - @IBAction func generateTapped(_ sender: Any) { - delegate?.generateKeys() - } -} - -extension InterfaceTableViewCell: UITextFieldDelegate { - - @IBAction - func textfieldDidChange(_ sender: UITextField) { - let string = sender.text - - if sender == nameField { - model.tunnel?.title = string - } else if sender == privateKeyField { - model.privateKey = string - publicKeyField.text = model.publicKey - } else if sender == addressesField { - model.addresses = string - } else if sender == listenPortField { - if let string = string, let port = Int16(string) { - model.listenPort = port - } else { - model.listenPort = 0 - } - } else if sender == dnsField { - model.dns = string - } else if sender == mtuField { - if let string = string, let mtu = Int32(string) { - model.mtu = mtu - } else { - model.mtu = 0 - } - } - } - - func textFieldDidEndEditing(_ textField: UITextField) { - if textField == addressesField { - if let addresses = model.addresses?.commaSeparatedToArray() { - textField.text = addresses.compactMap { try? CIDRAddress(stringRepresentation: $0 ) }.compactMap { $0?.stringRepresentation }.joined(separator: ", ") - } - } - } -} - -protocol PeerTableViewCellDelegate: class { - func delete(peer: Peer) -} - -class PeerTableViewCell: UITableViewCell { - var peer: Peer! { - didSet { - publicKeyField.text = peer.publicKey - preSharedKeyField.text = peer.presharedKey - allowedIpsField.text = peer.allowedIPs - endpointField.text = peer.endpoint - persistentKeepaliveField.text = peer.persistentKeepalive > 0 ? String(peer.persistentKeepalive) : nil - } - } - weak var delegate: PeerTableViewCellDelegate? - - @IBOutlet weak var publicKeyField: UITextField! - @IBOutlet weak var preSharedKeyField: UITextField! - @IBOutlet weak var allowedIpsField: UITextField! - @IBOutlet weak var endpointField: UITextField! - @IBOutlet weak var persistentKeepaliveField: UITextField! - - @IBAction func deletePeer(_ sender: Any) { - delegate?.delete(peer: peer) - } -} - -extension PeerTableViewCell: UITextFieldDelegate { - @IBAction - func textfieldDidChange(_ sender: UITextField) { - let string = sender.text - - 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 = Int32(string) { - peer.persistentKeepalive = persistentKeepalive - } else { - peer.persistentKeepalive = 0 - } - } - } -} - -class AddPeerTableViewCell: UITableViewCell { - var tunnel: Tunnel! - - @IBAction func addPeer(_ sender: Any) { - if let moc = tunnel.managedObjectContext { - tunnel.addToPeers(Peer(context: moc)) - } - } -} - -extension TunnelConfigurationTableViewController: Identifyable {} -extension InterfaceTableViewCell: Identifyable {} -extension PeerTableViewCell: Identifyable {} -extension AddPeerTableViewCell: Identifyable {} |