From 3fc11e2278a5e88ebc4ec3150fda050959e0c446 Mon Sep 17 00:00:00 2001
From: Grant Limberg <glimberg@gmail.com>
Date: Sun, 26 Jun 2016 18:18:59 -0700
Subject: [PATCH] misc bug fixes related to default routes

---
 ZeroTier One/AppDelegate.swift                |  3 ++
 ZeroTier One/JoinNetworkViewController.swift  |  4 ++
 ZeroTier One/JoinNetworkViewController.xib    |  2 +-
 ZeroTier One/Network.swift                    |  2 +-
 ZeroTier One/NetworkMonitor.swift             | 51 ++++++++++++-------
 ZeroTier One/ShowNetworksViewController.swift | 28 +++++-----
 6 files changed, 57 insertions(+), 33 deletions(-)

diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift
index e52b7be53..25c112298 100644
--- a/ZeroTier One/AppDelegate.swift	
+++ b/ZeroTier One/AppDelegate.swift	
@@ -164,6 +164,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {
                     networkName = "\(id) (\(net.name))"
                 }
 
+                if net.allowDefault && net.connected {
+                    networkName += " [default]"
+                }
                 let item = NSMenuItem(title: networkName, action: #selector(AppDelegate.toggleNetwork(_:)), keyEquivalent: "")
 
                 if net.connected {
diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift
index cef30d4ee..ecab8f6c6 100644
--- a/ZeroTier One/JoinNetworkViewController.swift	
+++ b/ZeroTier One/JoinNetworkViewController.swift	
@@ -45,6 +45,10 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo
     override func viewWillAppear() {
         super.viewWillAppear()
 
+        allowManagedCheckBox.state = NSOnState
+        allowGlobalCheckBox.state = NSOffState
+        allowDefaultCheckBox.state = NSOffState
+
         let defaults = NSUserDefaults.standardUserDefaults()
 
         let vals = defaults.stringArrayForKey(joinedNetworksKey)
diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib
index 187af0088..338d35eea 100644
--- a/ZeroTier One/JoinNetworkViewController.xib	
+++ b/ZeroTier One/JoinNetworkViewController.xib	
@@ -62,7 +62,7 @@
                 </button>
                 <button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rz3-0a-oNA">
                     <rect key="frame" x="238" y="59" width="141" height="18"/>
-                    <buttonCell key="cell" type="check" title="Allow Default Route" alternateTitle="Allow override of default route ‘full tunnel'" bezelStyle="regularSquare" imagePosition="left" inset="2" id="Lkd-XI-Kcu">
+                    <buttonCell key="cell" type="check" title="Allow Default Route" bezelStyle="regularSquare" imagePosition="left" inset="2" id="Lkd-XI-Kcu">
                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                         <font key="font" metaFont="system"/>
                     </buttonCell>
diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift
index b344b6c21..b5f6b4235 100644
--- a/ZeroTier One/Network.swift	
+++ b/ZeroTier One/Network.swift	
@@ -263,7 +263,7 @@ class Network: NSObject, NSCoding  {
 
 func defaultRouteExists(netList: [Network]) -> Bool {
     for net in netList {
-        if net.allowDefault {
+        if net.allowDefault && net.connected {
             return true
         }
     }
diff --git a/ZeroTier One/NetworkMonitor.swift b/ZeroTier One/NetworkMonitor.swift
index 124fce265..a653f9807 100644
--- a/ZeroTier One/NetworkMonitor.swift	
+++ b/ZeroTier One/NetworkMonitor.swift	
@@ -70,29 +70,33 @@ class NetworkMonitor: NSObject {
         var networks = self.savedNetworks
 
         for nw in receivedNetworks {
-            let index = findNetworkWithID(nw.nwid)
+            let index = findSavedNetworkWithID(nw.nwid)
 
             if index != NSNotFound {
                 networks[index] = nw
             }
-            networks.sortInPlace({ (left, right) -> Bool in
-                if left.nwid < right.nwid {
-                    return true
-                }
-
-                return false
-            })
-
-            objc_sync_enter(allNetworks)
-            allNetworks = networks
-            objc_sync_exit(allNetworks)
-
-            saveNetworks()
-
-            let nc = NSNotificationCenter.defaultCenter()
-
-            nc.postNotificationName(networkUpdateKey, object: nil, userInfo: ["networks": networks])
+            else {
+                networks.append(nw)
+            }
         }
+
+        networks.sortInPlace({ (left, right) -> Bool in
+            if left.nwid < right.nwid {
+                return true
+            }
+
+            return false
+        })
+
+        objc_sync_enter(allNetworks)
+        allNetworks = networks
+        objc_sync_exit(allNetworks)
+
+        saveNetworks()
+
+        let nc = NSNotificationCenter.defaultCenter()
+
+        nc.postNotificationName(networkUpdateKey, object: nil, userInfo: ["networks": networks])
     }
 
     private func findNetworkWithID(nwid: UInt64) -> Int {
@@ -106,6 +110,17 @@ class NetworkMonitor: NSObject {
         return NSNotFound
     }
 
+    private func findSavedNetworkWithID(nwid: UInt64) -> Int {
+        for (index, element) in savedNetworks.enumerate() {
+
+            if element.nwid == nwid {
+                return index
+            }
+        }
+
+        return NSNotFound
+    }
+
     private func saveNetworks() {
         let file = dataFile()
 
diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift
index e2bdd105c..0361f6dce 100644
--- a/ZeroTier One/ShowNetworksViewController.swift	
+++ b/ZeroTier One/ShowNetworksViewController.swift	
@@ -76,6 +76,21 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable
             cell.bridgingField.stringValue = network.bridge ? "ENABLED" : "DISABLED"
             cell.deviceField.stringValue = network.portDeviceName
 
+            if network.connected {
+                cell.connectedCheckbox.state = NSOnState
+
+                cell.allowDefault.enabled = true
+                cell.allowGlobal.enabled = true
+                cell.allowManaged.enabled = true
+            }
+            else {
+                cell.connectedCheckbox.state = NSOffState
+
+                cell.allowDefault.enabled = false
+                cell.allowGlobal.enabled = false
+                cell.allowManaged.enabled = false
+            }
+            
 
             if network.allowDefault {
                 cell.allowDefault.state = NSOnState
@@ -101,20 +116,7 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable
                 cell.addressesField.stringValue += "\n"
             }
 
-            if network.connected {
-                cell.connectedCheckbox.state = NSOnState
 
-                cell.allowDefault.enabled = true
-                cell.allowGlobal.enabled = true
-                cell.allowManaged.enabled = true
-            }
-            else {
-                cell.connectedCheckbox.state = NSOffState
-
-                cell.allowDefault.enabled = false
-                cell.allowGlobal.enabled = false
-                cell.allowManaged.enabled = false
-            }
 
             return cell
         }