From 058233801596c706efb1cb668068f1c8e0135cb6 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sat, 14 May 2016 13:54:49 -0700 Subject: Initial Commit --- ZeroTier One.xcodeproj/project.pbxproj | 278 +++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 + .../xcschemes/ZeroTier One.xcscheme | 91 +++ .../xcschemes/xcschememanagement.plist | 22 + ZeroTier One/AppDelegate.swift | 27 + .../AppIcon.appiconset/Contents.json | 58 ++ ZeroTier One/Base.lproj/MainMenu.xib | 680 +++++++++++++++++++++ ZeroTier One/Info.plist | 34 ++ 8 files changed, 1197 insertions(+) create mode 100644 ZeroTier One.xcodeproj/project.pbxproj create mode 100644 ZeroTier One.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme create mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ZeroTier One/AppDelegate.swift create mode 100644 ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ZeroTier One/Base.lproj/MainMenu.xib create mode 100644 ZeroTier One/Info.plist diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj new file mode 100644 index 00000000..10787067 --- /dev/null +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -0,0 +1,278 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; + 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; + 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 93326BE01CE7C816005CA2AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 93326BE21CE7C816005CA2AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 93326BD51CE7C816005CA2AC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 93326BCF1CE7C816005CA2AC = { + isa = PBXGroup; + children = ( + 93326BDA1CE7C816005CA2AC /* ZeroTier One */, + 93326BD91CE7C816005CA2AC /* Products */, + ); + sourceTree = ""; + }; + 93326BD91CE7C816005CA2AC /* Products */ = { + isa = PBXGroup; + children = ( + 93326BD81CE7C816005CA2AC /* ZeroTier One.app */, + ); + name = Products; + sourceTree = ""; + }; + 93326BDA1CE7C816005CA2AC /* ZeroTier One */ = { + isa = PBXGroup; + children = ( + 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, + 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, + 93326BDF1CE7C816005CA2AC /* MainMenu.xib */, + 93326BE21CE7C816005CA2AC /* Info.plist */, + ); + path = "ZeroTier One"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 93326BD71CE7C816005CA2AC /* ZeroTier One */ = { + isa = PBXNativeTarget; + buildConfigurationList = 93326BE51CE7C816005CA2AC /* Build configuration list for PBXNativeTarget "ZeroTier One" */; + buildPhases = ( + 93326BD41CE7C816005CA2AC /* Sources */, + 93326BD51CE7C816005CA2AC /* Frameworks */, + 93326BD61CE7C816005CA2AC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "ZeroTier One"; + productName = "ZeroTier One"; + productReference = 93326BD81CE7C816005CA2AC /* ZeroTier One.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 93326BD01CE7C816005CA2AC /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = "ZeroTier, Inc"; + TargetAttributes = { + 93326BD71CE7C816005CA2AC = { + CreatedOnToolsVersion = 7.3; + }; + }; + }; + buildConfigurationList = 93326BD31CE7C816005CA2AC /* Build configuration list for PBXProject "ZeroTier One" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 93326BCF1CE7C816005CA2AC; + productRefGroup = 93326BD91CE7C816005CA2AC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 93326BD71CE7C816005CA2AC /* ZeroTier One */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 93326BD61CE7C816005CA2AC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */, + 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 93326BD41CE7C816005CA2AC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 93326BDF1CE7C816005CA2AC /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 93326BE01CE7C816005CA2AC /* Base */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 93326BE31CE7C816005CA2AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 93326BE41CE7C816005CA2AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 93326BE61CE7C816005CA2AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "ZeroTier One/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.zerotier.ZeroTier-One"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 93326BE71CE7C816005CA2AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "ZeroTier One/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.zerotier.ZeroTier-One"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 93326BD31CE7C816005CA2AC /* Build configuration list for PBXProject "ZeroTier One" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 93326BE31CE7C816005CA2AC /* Debug */, + 93326BE41CE7C816005CA2AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 93326BE51CE7C816005CA2AC /* Build configuration list for PBXNativeTarget "ZeroTier One" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 93326BE61CE7C816005CA2AC /* Debug */, + 93326BE71CE7C816005CA2AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 93326BD01CE7C816005CA2AC /* Project object */; +} diff --git a/ZeroTier One.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ZeroTier One.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..fd60338e --- /dev/null +++ b/ZeroTier One.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme new file mode 100644 index 00000000..ea3f64f8 --- /dev/null +++ b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..70969d2d --- /dev/null +++ b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + ZeroTier One.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 93326BD71CE7C816005CA2AC + + primary + + + + + diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift new file mode 100644 index 00000000..6ac5a5c1 --- /dev/null +++ b/ZeroTier One/AppDelegate.swift @@ -0,0 +1,27 @@ +// +// AppDelegate.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/14/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + @IBOutlet weak var window: NSWindow! + + + func applicationDidFinishLaunching(aNotification: NSNotification) { + // Insert code here to initialize your application + } + + func applicationWillTerminate(aNotification: NSNotification) { + // Insert code here to tear down your application + } + + +} + diff --git a/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json b/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..2db2b1c7 --- /dev/null +++ b/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ZeroTier One/Base.lproj/MainMenu.xib b/ZeroTier One/Base.lproj/MainMenu.xib new file mode 100644 index 00000000..3bcfb090 --- /dev/null +++ b/ZeroTier One/Base.lproj/MainMenu.xib @@ -0,0 +1,680 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist new file mode 100644 index 00000000..d5b744c6 --- /dev/null +++ b/ZeroTier One/Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + Copyright © 2016 ZeroTier, Inc. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + -- cgit v1.2.3 From 225c2b095b03e4b0383a99863349fc28b6a3f893 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sat, 14 May 2016 15:42:45 -0700 Subject: Initial start of the menu bar app. Has menu items to join/leave networks which currently displays an empty popover from the icon (icon needs to be made still) --- ZeroTier One.xcodeproj/project.pbxproj | 16 ++++++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 ++ ZeroTier One/AppDelegate.swift | 64 ++++++++++++++++++++- ZeroTier One/Assets.xcassets/Contents.json | 6 ++ .../MenuBarIconMac.imageset/Contents.json | 21 +++++++ .../MenuBarIconMac.imageset/MenuBarIconMac.png | Bin 0 -> 3810 bytes .../MenuBarIconMac.imageset/MenuBarIconMac@2x.png | Bin 0 -> 5444 bytes ZeroTier One/Base.lproj/MainMenu.xib | 11 ++-- ZeroTier One/Info.plist | 2 + ZeroTier One/JoinNetworkViewController.swift | 18 ++++++ ZeroTier One/JoinNetworkViewController.xib | 20 +++++++ ZeroTier One/ShowNetworksViewController.swift | 18 ++++++ ZeroTier One/ShowNetworksViewController.xib | 20 +++++++ 13 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ZeroTier One/Assets.xcassets/Contents.json create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png create mode 100644 ZeroTier One/JoinNetworkViewController.swift create mode 100644 ZeroTier One/JoinNetworkViewController.xib create mode 100644 ZeroTier One/ShowNetworksViewController.swift create mode 100644 ZeroTier One/ShowNetworksViewController.xib diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 10787067..2730b987 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -10,6 +10,10 @@ 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; + 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */; }; + 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */; }; + 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */; }; + 93326BEF1CE7DA30005CA2AC /* ShowNetworksViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -18,6 +22,10 @@ 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 93326BE01CE7C816005CA2AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 93326BE21CE7C816005CA2AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinNetworkViewController.swift; sourceTree = ""; }; + 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JoinNetworkViewController.xib; sourceTree = ""; }; + 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowNetworksViewController.swift; sourceTree = ""; }; + 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShowNetworksViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,9 +59,13 @@ isa = PBXGroup; children = ( 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, + 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, + 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, 93326BDF1CE7C816005CA2AC /* MainMenu.xib */, 93326BE21CE7C816005CA2AC /* Info.plist */, + 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */, + 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */, ); path = "ZeroTier One"; sourceTree = ""; @@ -116,6 +128,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 93326BEF1CE7DA30005CA2AC /* ShowNetworksViewController.xib in Resources */, + 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */, 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */, 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */, ); @@ -129,6 +143,8 @@ buildActionMask = 2147483647; files = ( 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, + 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, + 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..fe2b4541 --- /dev/null +++ b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index 6ac5a5c1..e5932f5f 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -14,8 +14,34 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! + let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2.0) + + let networkListPopover = NSPopover() + let joinNetworkPopover = NSPopover() + + var transientMonitor: AnyObject? = nil + func applicationDidFinishLaunching(aNotification: NSNotification) { - // Insert code here to initialize your application + + + statusItem.image = NSImage(named: "MenuBarIconMac") + + let menu = NSMenu() + + menu.addItem(NSMenuItem(title: "Show Networks", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) + menu.addItem(NSMenuItem(title: "Join Network", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) + menu.addItem(NSMenuItem.separatorItem()) + menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q")) + + statusItem.menu = menu + + joinNetworkPopover.contentViewController = JoinNetworkViewController( + nibName: "JoinNetworkViewController", bundle: nil) + joinNetworkPopover.behavior = .Transient + + networkListPopover.contentViewController = ShowNetworksViewController( + nibName: "ShowNetworksViewController", bundle: nil) + networkListPopover.behavior = .Transient } func applicationWillTerminate(aNotification: NSNotification) { @@ -23,5 +49,41 @@ class AppDelegate: NSObject, NSApplicationDelegate { } + func showNetworks() { + if let button = statusItem.button { + networkListPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) + + if transientMonitor == nil { + transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( + [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in + + NSEvent.removeMonitor(self.transientMonitor!) + self.transientMonitor = nil + self.networkListPopover.close() + } + } + } + } + + func joinNetwork() { + if let button = statusItem.button { + joinNetworkPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) + + if transientMonitor == nil { + transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( + [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in + + NSEvent.removeMonitor(self.transientMonitor!) + self.transientMonitor = nil + self.joinNetworkPopover.close() + + } + } + } + } + + func quit() { + NSApp.performSelector(#selector(NSApp.terminate(_:)), withObject: nil, afterDelay: 0.0) + } } diff --git a/ZeroTier One/Assets.xcassets/Contents.json b/ZeroTier One/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/ZeroTier One/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json new file mode 100644 index 00000000..ab75ef9a --- /dev/null +++ b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "mac", + "filename" : "MenuBarIconMac.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "filename" : "MenuBarIconMac@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png new file mode 100644 index 00000000..74e59fe7 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png differ diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png new file mode 100644 index 00000000..1c99f851 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png differ diff --git a/ZeroTier One/Base.lproj/MainMenu.xib b/ZeroTier One/Base.lproj/MainMenu.xib index 3bcfb090..4722fac2 100644 --- a/ZeroTier One/Base.lproj/MainMenu.xib +++ b/ZeroTier One/Base.lproj/MainMenu.xib @@ -1,7 +1,8 @@ - + - + + @@ -11,7 +12,7 @@ - + @@ -666,11 +667,11 @@ - + - + diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index d5b744c6..f5d0dc94 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -2,6 +2,8 @@ + LSUIElement + CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift new file mode 100644 index 00000000..d071ce91 --- /dev/null +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -0,0 +1,18 @@ +// +// JoinNetworkViewController.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/14/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class JoinNetworkViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib new file mode 100644 index 00000000..7f3f1329 --- /dev/null +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift new file mode 100644 index 00000000..0ecb38f5 --- /dev/null +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -0,0 +1,18 @@ +// +// ShowNetworksViewController.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/14/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class ShowNetworksViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib new file mode 100644 index 00000000..2fe5f22f --- /dev/null +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From b4a80579948038989c382fd41101f1f489245124 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 16 May 2016 17:51:14 -0700 Subject: limit the join network combobox to hex characters. Join only clickable when a valid network is entered --- ZeroTier One.xcodeproj/project.pbxproj | 1 + ZeroTier One/JoinNetworkViewController.swift | 72 ++++++++++++++++++++++++++-- ZeroTier One/JoinNetworkViewController.xib | 35 +++++++++++++- 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 2730b987..4fb0a76e 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -287,6 +287,7 @@ 93326BE71CE7C816005CA2AC /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift index d071ce91..0aaaf10f 100644 --- a/ZeroTier One/JoinNetworkViewController.swift +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -8,11 +8,77 @@ import Cocoa -class JoinNetworkViewController: NSViewController { +extension String { + func contains(find: String) -> Bool { + return self.rangeOfString(find) != nil + } + + func trunc(length: Int, trailing: String? = "...") -> String { + if self.characters.count > length { + return self.substringToIndex(self.startIndex.advancedBy(length)) + (trailing ?? "") + } else { + return self + } + } +} + +class JoinNetworkViewController: NSViewController, NSComboBoxDelegate { + + @IBOutlet var network: NSComboBox! + @IBOutlet var joinButton: NSButton! override func viewDidLoad() { super.viewDidLoad() - // Do view setup here. + network.setDelegate(self) + } + + @IBAction func onJoinClicked(sender: AnyObject?) { + let networkId = UInt64(network.stringValue, radix: 16) + + // TODO: Execute join network call + + network.stringValue = "" + } + + + // NSComboBoxDelegate Methods + + override func controlTextDidChange(obj: NSNotification) { + let cb = obj.object as! NSComboBox + let value = cb.stringValue + + + let allowedCharacters = "abcdefABCDEF0123456789" + + var outValue = "" + + for char in value.characters { + if !allowedCharacters.contains(String(char)) { + NSBeep() + } + else { + outValue += String(char) + } + } + + + + if outValue.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) == 16 { + joinButton.enabled = true + } + else { + + if outValue.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 16 { + outValue = outValue.trunc(16, trailing: "") + NSBeep() + joinButton.enabled = true + } + else { + joinButton.enabled = false + } + } + + cb.stringValue = outValue } - + // end NSComboBoxDelegate Methods } diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib index 7f3f1329..2de44c9d 100644 --- a/ZeroTier One/JoinNetworkViewController.xib +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -1,5 +1,5 @@ - + @@ -7,14 +7,45 @@ + + - + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From ccbd6f97cda44999230222b8b54d077b7a754e0c Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 16 May 2016 18:02:26 -0700 Subject: remove some mistakenly committed files and add .gitignore for Xcode projects --- .gitignore | 105 +++++++++++++++++++++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 - .../xcschemes/ZeroTier One.xcscheme | 91 ------------------ .../xcschemes/xcschememanagement.plist | 22 ----- 4 files changed, 105 insertions(+), 118 deletions(-) create mode 100644 .gitignore delete mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme delete mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c62c7939 --- /dev/null +++ b/.gitignore @@ -0,0 +1,105 @@ +##### +# OS X temporary files that should never be committed +# +# c.f. http://www.westwind.com/reference/os-x/invisibles.html + +.DS_Store + +# c.f. http://www.westwind.com/reference/os-x/invisibles.html + +.Trashes + +# c.f. http://www.westwind.com/reference/os-x/invisibles.html + +*.swp + +# +# *.lock - this is used and abused by many editors for many different things. +# For the main ones I use (e.g. Eclipse), it should be excluded +# from source-control, but YMMV. +# (lock files are usually local-only file-synchronization on the local FS that should NOT go in git) +# c.f. the "OPTIONAL" section at bottom though, for tool-specific variations! +# +# In particular, if you're using CocoaPods, you'll want to comment-out this line: +*.lock + + +# +# profile - REMOVED temporarily (on double-checking, I can't find it in OS X docs?) +#profile + + +#### +# Xcode temporary files that should never be committed +# +# NB: NIB/XIB files still exist even on Storyboard projects, so we want this... + +*~.nib + + +#### +# Xcode build files - +# +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" + +DerivedData/ + +# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" + +build/ + + +##### +# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) +# +# This is complicated: +# +# SOMETIMES you need to put this file in version control. +# Apple designed it poorly - if you use "custom executables", they are +# saved in this file. +# 99% of projects do NOT use those, so they do NOT want to version control this file. +# ..but if you're in the 1%, comment out the line "*.pbxuser" + +# .pbxuser: http://lists.apple.com/archives/xcode-users/2004/Jan/msg00193.html + +*.pbxuser + +# .mode1v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html + +*.mode1v3 + +# .mode2v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html + +*.mode2v3 + +# .perspectivev3: http://stackoverflow.com/questions/5223297/xcode-projects-what-is-a-perspectivev3-file + +*.perspectivev3 + +# NB: also, whitelist the default ones, some projects need to use these +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + + +#### +# Xcode 4 - semi-personal settings +# +# Apple Shared data that Apple put in the wrong folder +# c.f. http://stackoverflow.com/a/19260712/153422 +# FROM ANSWER: Apple says "don't ignore it" +# FROM COMMENTS: Apple is wrong; Apple code is too buggy to trust; there are no known negative side-effects to ignoring Apple's unofficial advice and instead doing the thing that actively fixes bugs in Xcode +# Up to you, but ... current advice: ignore it. +*.xccheckout + +# +# +# OPTION 1: --------------------------------- +# throw away ALL personal settings (including custom schemes! +# - unless they are "shared") +# As per build/ and DerivedData/, this ought to have a trailing slash +# +# NB: this is exclusive with OPTION 2 below +xcuserdata/ + diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme deleted file mode 100644 index ea3f64f8..00000000 --- a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/ZeroTier One.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 70969d2d..00000000 --- a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - ZeroTier One.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 93326BD71CE7C816005CA2AC - - primary - - - - - -- cgit v1.2.3 From acd6978a3094ae7cffdfb5cf79e4c2473ab3bb0f Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 16 May 2016 18:26:33 -0700 Subject: set the combo box to use a data source and remember the last 20 networks input --- ZeroTier One/JoinNetworkViewController.swift | 71 +++++++++++++++++++++++++++- ZeroTier One/JoinNetworkViewController.xib | 16 +++---- 2 files changed, 77 insertions(+), 10 deletions(-) diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift index 0aaaf10f..c9fdcebe 100644 --- a/ZeroTier One/JoinNetworkViewController.swift +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -22,22 +22,54 @@ extension String { } } -class JoinNetworkViewController: NSViewController, NSComboBoxDelegate { +let joinedNetworksKey = "com.zerotier.one.joined-networks" + + +class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBoxDataSource { @IBOutlet var network: NSComboBox! @IBOutlet var joinButton: NSButton! + var values: [String] = [String]() + override func viewDidLoad() { super.viewDidLoad() network.setDelegate(self) + network.dataSource = self + } + + override func viewWillAppear() { + let defaults = NSUserDefaults.standardUserDefaults() + + let vals = defaults.stringArrayForKey(joinedNetworksKey) + + if let v = vals { + values = v + } + } + + override func viewDidDisappear() { + let defaults = NSUserDefaults.standardUserDefaults() + + defaults.setObject(values, forKey: joinedNetworksKey) } @IBAction func onJoinClicked(sender: AnyObject?) { - let networkId = UInt64(network.stringValue, radix: 16) + let networkString = network.stringValue + let networkId = UInt64(networkString, radix: 16) // TODO: Execute join network call network.stringValue = "" + + + if !values.contains(networkString) { + values.insert(networkString, atIndex: 0) + + while values.count > 20 { + values.removeLast() + } + } } @@ -81,4 +113,39 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate { cb.stringValue = outValue } // end NSComboBoxDelegate Methods + + + // NSComboBoxDataSource methods + + func numberOfItemsInComboBox(aComboBox: NSComboBox) -> Int { + return values.count + } + + func comboBox(aComboBox: NSComboBox, objectValueForItemAtIndex index: Int) -> AnyObject { + return values[index] + } + + func comboBox(aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int { + + var counter = 0 + for val in values { + if val == string { + return counter + } + counter += 1 + } + return NSNotFound + } + + func comboBox(aComboBox: NSComboBox, completedString string: String) -> String? { + for val in values { + if val.hasPrefix(string) { + return val + } + } + + return nil + } + + // end NSComboBoxDataSorce methods } diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib index 2de44c9d..7a2ffe70 100644 --- a/ZeroTier One/JoinNetworkViewController.xib +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -26,14 +26,6 @@ - - - - - - - - + + + + + + + + -- cgit v1.2.3 From 4653ebc97ff15db5f22066a49d7fe4e5f8a9345d Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 16 May 2016 19:08:00 -0700 Subject: add table view to show networks view --- ZeroTier One/ShowNetworksViewController.swift | 2 + ZeroTier One/ShowNetworksViewController.xib | 100 +++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 0ecb38f5..8bf84a1c 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -10,6 +10,8 @@ import Cocoa class ShowNetworksViewController: NSViewController { + @IBOutlet var tableView: NSTableView! + override func viewDidLoad() { super.viewDidLoad() // Do view setup here. diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 2fe5f22f..e17bc5a9 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -1,5 +1,5 @@ - + @@ -7,6 +7,7 @@ + @@ -15,6 +16,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 40198d6c1398da33fb1c6340c03927da890d816e Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 16 May 2016 19:25:20 -0700 Subject: call super functions on a few overrides --- ZeroTier One/JoinNetworkViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift index c9fdcebe..1ac3c7ea 100644 --- a/ZeroTier One/JoinNetworkViewController.swift +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -39,6 +39,8 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo } override func viewWillAppear() { + super.viewWillAppear() + let defaults = NSUserDefaults.standardUserDefaults() let vals = defaults.stringArrayForKey(joinedNetworksKey) @@ -49,6 +51,8 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo } override func viewDidDisappear() { + super.viewWillDisappear() + let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(values, forKey: joinedNetworksKey) -- cgit v1.2.3 From da30d2898e59d34dc47b251a07376db70fcd3e96 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 16 May 2016 19:58:24 -0700 Subject: beginning of communicating with the zero tier service --- ZeroTier One.xcodeproj/project.pbxproj | 4 ++ ZeroTier One/Info.plist | 5 ++ ZeroTier One/ServiceCom.swift | 97 +++++++++++++++++++++++++++ ZeroTier One/ShowNetworksViewController.swift | 6 ++ 4 files changed, 112 insertions(+) create mode 100644 ZeroTier One/ServiceCom.swift diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 4fb0a76e..d0441a5c 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; @@ -17,6 +18,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; 93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -61,6 +63,7 @@ 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */, + 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, 93326BDF1CE7C816005CA2AC /* MainMenu.xib */, 93326BE21CE7C816005CA2AC /* Info.plist */, @@ -145,6 +148,7 @@ 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, + 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index f5d0dc94..7a6ab723 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -2,6 +2,11 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + LSUIElement CFBundleDevelopmentRegion diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift new file mode 100644 index 00000000..a1bb0a3c --- /dev/null +++ b/ZeroTier One/ServiceCom.swift @@ -0,0 +1,97 @@ +// +// ServiceCom.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/16/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class ServiceCom: NSObject { + static let baseURL = "http://localhost:9993" + static var key: NSString? = "ddeb3b1e6996b6b4f2d12d10" + + static func getNetworkList() { + + let urlString = baseURL + "/network?auth=\(ServiceCom.key!)" + + let url = NSURL(string: urlString) + + if let u = url { + let request = NSMutableURLRequest(URL: u) + let session = NSURLSession.sharedSession() + let task = session.dataTaskWithRequest(request) { (data, response, error) in + let httpResponse = response as! NSHTTPURLResponse + let status = httpResponse.statusCode + + if status == 200 { + do { + let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) + print("\(json)") + } + catch { + print("JSON Error: \(error)") + } + } + } + + task.resume() + } + else { + print("bad URL") + } + } + + + static func joinNetwork(network: String) { + let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.key!)" + let url = NSURL(string: urlString) + + if let u = url { + let request = NSMutableURLRequest(URL: u) + request.HTTPMethod = "POST" + + let session = NSURLSession.sharedSession() + let task = session.dataTaskWithRequest(request) { (data, response, error) in + let httpResponse = response as! NSHTTPURLResponse + let status = httpResponse.statusCode + + if status == 200 { + print("join ok") + } + else { + print("join error: \(status)") + } + } + + task.resume() + } + } + + static func leaveNetwork(network: String) { + let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.key!)" + let url = NSURL(string: urlString) + + if let u = url { + let request = NSMutableURLRequest(URL: u) + request.HTTPMethod = "DELETE" + + let session = NSURLSession.sharedSession() + let task = session.dataTaskWithRequest(request) { (data, response, error) in + let httpResponse = response as! NSHTTPURLResponse + let status = httpResponse.statusCode + + if status == 200 { + print("leave ok") + } + else { + print("leave error: \(status)") + } + } + + task.resume() + } + } + +} diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 8bf84a1c..0e8fd4b6 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -16,5 +16,11 @@ class ShowNetworksViewController: NSViewController { super.viewDidLoad() // Do view setup here. } + + override func viewWillAppear() { + super.viewWillAppear() + + ServiceCom.getNetworkList() + } } -- cgit v1.2.3 From d5620288d56085e749c04ae5bb9908a61238aaa4 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 17 May 2016 19:41:54 -0700 Subject: Parse JSON network list into Network objects for the view --- ZeroTier One.xcodeproj/project.pbxproj | 4 + ZeroTier One/Network.swift | 112 ++++++++++++++++++++++++++ ZeroTier One/ServiceCom.swift | 13 ++- ZeroTier One/ShowNetworksViewController.swift | 23 +++++- ZeroTier One/ShowNetworksViewController.xib | 48 ++--------- 5 files changed, 151 insertions(+), 49 deletions(-) create mode 100644 ZeroTier One/Network.swift diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index d0441a5c..0fcc7860 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; + 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; @@ -19,6 +20,7 @@ /* Begin PBXFileReference section */ 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; + 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -62,6 +64,7 @@ children = ( 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, + 9330F1361CEBF87200687EC8 /* Network.swift */, 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */, 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, @@ -145,6 +148,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9330F1371CEBF87200687EC8 /* Network.swift in Sources */, 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift new file mode 100644 index 00000000..4ee2f748 --- /dev/null +++ b/ZeroTier One/Network.swift @@ -0,0 +1,112 @@ +// +// Network.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/17/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +enum NetworkStatus : CustomStringConvertible { + case REQUESTING_CONFIGURATION + case OK + case ACCESS_DENIED + case NOT_FOUND + case PORT_ERROR + case CLIENT_TOO_OLD + + var description: String { + switch self { + case .REQUESTING_CONFIGURATION: return "REQUESTING_CONFIGURATION" + case .OK: return "OK" + case .ACCESS_DENIED: return "ACCESS_DENIED" + case .NOT_FOUND: return "NOT_FOUND" + case .PORT_ERROR: return "PORT_ERROR" + case .CLIENT_TOO_OLD: return "CLIENT_TOO_OLD" + } + } +} + +enum NetworkType: CustomStringConvertible { + case PUBLIC + case PRIVATE + + var description: String { + switch self { + case .PUBLIC: return "PUBLIC" + case .PRIVATE: return "PRIVATE" + } + } +} + +class Network: NSObject { + var assignedAddresses: [String] = [String]() + var bridge: Bool = false + var broadcastEnabled: Bool = false + var dhcp: Bool = false + var mac: String = "" + var mtu: Int = 0 + var multicastSubscriptions: [String] = [String]() + var name: String = "" + var netconfRevision: Int = 232 + var nwid: UInt64 = 0 + var portDeviceName: String = "" + var portError: Int = 0 + var status: NetworkStatus = .REQUESTING_CONFIGURATION + var type: NetworkType = .PRIVATE + + init(jsonData: [String: AnyObject]) { + super.init() + + let aa = jsonData["assignedAddresses"] as! [String] + for a in aa { + assignedAddresses.append(a) + } + + bridge = (jsonData["bridge"] as! NSNumber).boolValue + broadcastEnabled = (jsonData["broadcastEnabled"] as! NSNumber).boolValue + dhcp = (jsonData["dhcp"] as! NSNumber).boolValue + mac = jsonData["mac"] as! String + mtu = (jsonData["mtu"] as! NSNumber).integerValue + + let multSubs = jsonData["multicastSubscriptions"] as! [String] + for ms in multSubs { + multicastSubscriptions.append(ms) + } + + name = jsonData["name"] as! String + netconfRevision = (jsonData["netconfRevision"] as! NSNumber).integerValue + nwid = UInt64((jsonData["nwid"] as! String), radix: 16)! + portDeviceName = jsonData["portDeviceName"] as! String + portError = (jsonData["portError"] as! NSNumber).integerValue + + let statusStr = jsonData["status"] as! String + switch statusStr { + case "REQUESTING_CONFIGURATION": + status = .REQUESTING_CONFIGURATION + case "OK": + status = .OK + case "ACCESS_DENIED": + status = .ACCESS_DENIED + case "NOT_FOUND": + status = .NOT_FOUND + case "PORT_ERROR": + status = .PORT_ERROR + case "CLIENT_TOO_OLD": + status = .CLIENT_TOO_OLD + default: + break + } + + let typeStr = jsonData["type"] as! String + switch typeStr { + case "PRIVATE": + type = .PRIVATE + case "PUBLIC": + type = .PUBLIC + default: + break + } + } +} diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index a1bb0a3c..bdb59792 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -12,7 +12,7 @@ class ServiceCom: NSObject { static let baseURL = "http://localhost:9993" static var key: NSString? = "ddeb3b1e6996b6b4f2d12d10" - static func getNetworkList() { + static func getNetworkList(completionHandler: ([Network]) -> Void) { let urlString = baseURL + "/network?auth=\(ServiceCom.key!)" @@ -27,11 +27,16 @@ class ServiceCom: NSObject { if status == 200 { do { - let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) - print("\(json)") + let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! [[String: AnyObject]] + + var networks = [Network]() + for jobj in json { + networks.append(Network(jsonData: jobj)) + } + + completionHandler(networks) } catch { - print("JSON Error: \(error)") } } } diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 0e8fd4b6..d914c30e 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -8,19 +8,36 @@ import Cocoa -class ShowNetworksViewController: NSViewController { +class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource { @IBOutlet var tableView: NSTableView! + var networkList: [Network] = [Network]() + override func viewDidLoad() { super.viewDidLoad() // Do view setup here. + + tableView.setDelegate(self) + tableView.setDataSource(self) } override func viewWillAppear() { super.viewWillAppear() - ServiceCom.getNetworkList() + ServiceCom.getNetworkList() { (networkList) -> Void in + NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in + self.networkList = networkList + self.tableView.reloadData() + } + } + } + + // NSTableViewDataSource + + func numberOfRowsInTableView(tableView: NSTableView) -> Int { + return networkList.count } - + + // end NSTableViewDataSource } diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index e17bc5a9..fcc6cbfa 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -20,17 +20,17 @@ - + - - + + - + @@ -44,7 +44,7 @@ - + @@ -62,44 +62,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3 From 940c0f2b93ab2cebd55f5f0199499b68fef07d90 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 27 May 2016 13:28:32 -0700 Subject: WIP. Mac UI --- ZeroTier One.xcodeproj/project.pbxproj | 4 + ZeroTier One/NetworkInfoCell.swift | 22 ++++ ZeroTier One/ShowNetworksViewController.swift | 16 +++ ZeroTier One/ShowNetworksViewController.xib | 143 +++++++++++++++++++++++--- 4 files changed, 170 insertions(+), 15 deletions(-) create mode 100644 ZeroTier One/NetworkInfoCell.swift diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 0fcc7860..256d75e7 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; + 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */; }; 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; @@ -21,6 +22,7 @@ /* Begin PBXFileReference section */ 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; + 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkInfoCell.swift; sourceTree = ""; }; 93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -65,6 +67,7 @@ 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, 9330F1361CEBF87200687EC8 /* Network.swift */, + 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */, 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */, 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, @@ -150,6 +153,7 @@ files = ( 9330F1371CEBF87200687EC8 /* Network.swift in Sources */, 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, + 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */, 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */, diff --git a/ZeroTier One/NetworkInfoCell.swift b/ZeroTier One/NetworkInfoCell.swift new file mode 100644 index 00000000..694eded5 --- /dev/null +++ b/ZeroTier One/NetworkInfoCell.swift @@ -0,0 +1,22 @@ +// +// NetworkInfoCell.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/24/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class NetworkInfoCell: NSTableCellView { + + @IBOutlet var networkIdField: NSTextField! + @IBOutlet var networkNameField: NSTextField! + + override func drawRect(dirtyRect: NSRect) { + super.drawRect(dirtyRect) + + // Drawing code here. + } + +} diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index d914c30e..53f2e0f4 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -40,4 +40,20 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable } // end NSTableViewDataSource + + // NSTableViewDelegate + + func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { + if let cell = tableView.makeViewWithIdentifier("NetworkInfoCell", owner: nil) as? NetworkInfoCell { + let network = networkList[row] + cell.networkIdField.stringValue = String(network.nwid, radix: 16) + cell.networkNameField.stringValue = network.name + + return cell + } + + return nil + } + + // end NSTableViewDelegate } diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index fcc6cbfa..85dee589 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -14,23 +14,23 @@ - + - - - - + + + + - - + + - + @@ -43,21 +43,127 @@ - - + + - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + @@ -77,6 +183,13 @@ + + + + + + + -- cgit v1.2.3 From 1d27adb1021852709f144b6fef11cf83ef593e80 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 27 May 2016 13:48:22 -0700 Subject: Finished wiring up the view --- ZeroTier One/NetworkInfoCell.swift | 9 ++ ZeroTier One/ShowNetworksViewController.swift | 17 ++++ ZeroTier One/ShowNetworksViewController.xib | 121 ++++++++++++++++++++++---- 3 files changed, 129 insertions(+), 18 deletions(-) diff --git a/ZeroTier One/NetworkInfoCell.swift b/ZeroTier One/NetworkInfoCell.swift index 694eded5..038507ca 100644 --- a/ZeroTier One/NetworkInfoCell.swift +++ b/ZeroTier One/NetworkInfoCell.swift @@ -13,6 +13,15 @@ class NetworkInfoCell: NSTableCellView { @IBOutlet var networkIdField: NSTextField! @IBOutlet var networkNameField: NSTextField! + @IBOutlet var statusField: NSTextField! + @IBOutlet var typeField: NSTextField! + @IBOutlet var macField: NSTextField! + @IBOutlet var mtuField: NSTextField! + @IBOutlet var broadcastField: NSTextField! + @IBOutlet var bridgingField: NSTextField! + @IBOutlet var deviceField: NSTextField! + @IBOutlet var addressesField: NSTextField! + override func drawRect(dirtyRect: NSRect) { super.drawRect(dirtyRect) diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 53f2e0f4..a12e0743 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -49,6 +49,23 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable cell.networkIdField.stringValue = String(network.nwid, radix: 16) cell.networkNameField.stringValue = network.name + cell.statusField.stringValue = network.status.description + cell.typeField.stringValue = network.type.description + cell.macField.stringValue = network.mac + cell.mtuField.stringValue = String(network.mtu) + cell.broadcastField.stringValue = network.broadcastEnabled ? "ENABLED" : "DISABLED" + cell.bridgingField.stringValue = network.bridge ? "ENABLED" : "DISABLED" + cell.deviceField.stringValue = network.portDeviceName + + + cell.addressesField.stringValue = "" + + for nw in network.assignedAddresses { + cell.addressesField.stringValue += nw + cell.addressesField.stringValue += "\n" + } + + return cell } diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 85dee589..93286f86 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -17,14 +17,14 @@ - + - - + + @@ -44,11 +44,11 @@ - + - + @@ -56,7 +56,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -72,7 +72,7 @@ - + @@ -80,7 +80,7 @@ - + @@ -88,7 +88,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -112,7 +112,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -128,8 +128,64 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -137,33 +193,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 67d472424d92e1bd8dd2fff8d9ca911035569faf Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 27 May 2016 15:07:20 -0700 Subject: make the view show up light instead of dark --- ZeroTier One/AppDelegate.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index e5932f5f..c7cbc09a 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -39,9 +39,13 @@ class AppDelegate: NSObject, NSApplicationDelegate { nibName: "JoinNetworkViewController", bundle: nil) joinNetworkPopover.behavior = .Transient + joinNetworkPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) + networkListPopover.contentViewController = ShowNetworksViewController( nibName: "ShowNetworksViewController", bundle: nil) networkListPopover.behavior = .Transient + + networkListPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) } func applicationWillTerminate(aNotification: NSNotification) { -- cgit v1.2.3 From 59cf2ea34158ef6f6e827fbd9d062be6beef5691 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 27 May 2016 15:21:23 -0700 Subject: add proper border around the network list --- ZeroTier One/ShowNetworksViewController.swift | 1 + ZeroTier One/ShowNetworksViewController.xib | 40 +++++++++++++-------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index a12e0743..857e2147 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -20,6 +20,7 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable tableView.setDelegate(self) tableView.setDataSource(self) + tableView.backgroundColor = NSColor.clearColor() } override func viewWillAppear() { diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 93286f86..6b12ea3f 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -14,23 +14,23 @@ - + - - + + - + - + - + @@ -44,7 +44,7 @@ - + @@ -55,7 +55,7 @@ - + @@ -127,7 +127,7 @@ - + @@ -135,7 +135,7 @@ - + @@ -143,7 +143,7 @@ - + @@ -151,7 +151,7 @@ - + @@ -159,7 +159,7 @@ - + @@ -167,7 +167,7 @@ - + @@ -175,7 +175,7 @@ - + @@ -269,12 +269,12 @@ - - - - + + + + - + -- cgit v1.2.3 From 41328eef94e0f45a890c57b9d85862c7a54e0175 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 27 May 2016 15:25:32 -0700 Subject: . --- ZeroTier One/NetworkInfoCell.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ZeroTier One/NetworkInfoCell.swift b/ZeroTier One/NetworkInfoCell.swift index 038507ca..73305f83 100644 --- a/ZeroTier One/NetworkInfoCell.swift +++ b/ZeroTier One/NetworkInfoCell.swift @@ -22,6 +22,10 @@ class NetworkInfoCell: NSTableCellView { @IBOutlet var deviceField: NSTextField! @IBOutlet var addressesField: NSTextField! + override func awakeFromNib() { + super.awakeFromNib() + + } override func drawRect(dirtyRect: NSRect) { super.drawRect(dirtyRect) -- cgit v1.2.3 From b4f3dfc34727ec99853e22e7abb0c1dff9e5c205 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 31 May 2016 13:50:43 -0700 Subject: look up authtoken in user's app support directory --- ZeroTier One/ServiceCom.swift | 53 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index bdb59792..28957265 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -10,11 +10,56 @@ import Cocoa class ServiceCom: NSObject { static let baseURL = "http://localhost:9993" - static var key: NSString? = "ddeb3b1e6996b6b4f2d12d10" + + private static func getKey() -> String { + struct Holder { + static var key: String? = nil + } + + if Holder.key == nil { + do { + // Check the user's ZeroTier application support directory. If + // authtoken.secret exists, use it. + + var appSupportDir = try NSFileManager.defaultManager().URLForDirectory(.ApplicationSupportDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) + NSLog("\(appSupportDir)") + + + appSupportDir = appSupportDir.URLByAppendingPathComponent("ZeroTier") + NSLog("\(appSupportDir)") + + appSupportDir = appSupportDir.URLByAppendingPathComponent("One") + NSLog("\(appSupportDir)") + + let authtokenURL = appSupportDir.URLByAppendingPathComponent("authtoken.secret") + + NSLog("\(authtokenURL)") + + if NSFileManager.defaultManager().fileExistsAtPath(authtokenURL.path!) { + Holder.key = try String(contentsOfURL: authtokenURL) + } + else { + // TODO: Elevate priviledge to copy /Library/Application Support/ZeroTier/One/authtoken.secret to the user's local AppSupport directory + } + } + catch { + NSLog("Error getting app support dir: \(error)") + Holder.key = nil + } + + } + + if let k = Holder.key { + return k + } + else { + return "" + } + } static func getNetworkList(completionHandler: ([Network]) -> Void) { - let urlString = baseURL + "/network?auth=\(ServiceCom.key!)" + let urlString = baseURL + "/network?auth=\(ServiceCom.getKey())" let url = NSURL(string: urlString) @@ -50,7 +95,7 @@ class ServiceCom: NSObject { static func joinNetwork(network: String) { - let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.key!)" + let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.getKey())" let url = NSURL(string: urlString) if let u = url { @@ -75,7 +120,7 @@ class ServiceCom: NSObject { } static func leaveNetwork(network: String) { - let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.key!)" + let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.getKey())" let url = NSURL(string: urlString) if let u = url { -- cgit v1.2.3 From 51e74f8d4f200a7e3be9a6ac4bef8486f83a5d5d Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 31 May 2016 15:01:42 -0700 Subject: remove some extra logging --- ZeroTier One/ServiceCom.swift | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index 28957265..3aa9dc54 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -22,19 +22,10 @@ class ServiceCom: NSObject { // authtoken.secret exists, use it. var appSupportDir = try NSFileManager.defaultManager().URLForDirectory(.ApplicationSupportDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) - NSLog("\(appSupportDir)") - - appSupportDir = appSupportDir.URLByAppendingPathComponent("ZeroTier") - NSLog("\(appSupportDir)") - appSupportDir = appSupportDir.URLByAppendingPathComponent("One") - NSLog("\(appSupportDir)") - let authtokenURL = appSupportDir.URLByAppendingPathComponent("authtoken.secret") - NSLog("\(authtokenURL)") - if NSFileManager.defaultManager().fileExistsAtPath(authtokenURL.path!) { Holder.key = try String(contentsOfURL: authtokenURL) } -- cgit v1.2.3 From 975bcb8affa7fbd7ca534dac9ec8d642e6c977f7 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 31 May 2016 17:19:22 -0700 Subject: some OS X Authentication Services wizardry to get /Library/Application Support/ZeroTier/One/authtoken.secret and copy it to ~/Library/Application Support/ZeroTier/One/authtoken.secret --- ZeroTier One.xcodeproj/project.pbxproj | 13 +++++ ZeroTier One/AuthtokenCopy.h | 16 ++++++ ZeroTier One/AuthtokenCopy.m | 87 +++++++++++++++++++++++++++++ ZeroTier One/ServiceCom.swift | 31 +++++++++- ZeroTier One/ZeroTier One-Bridging-Header.h | 5 ++ 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 ZeroTier One/AuthtokenCopy.h create mode 100644 ZeroTier One/AuthtokenCopy.m create mode 100644 ZeroTier One/ZeroTier One-Bridging-Header.h diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 256d75e7..7c1e29be 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */; }; 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */; }; 93326BEF1CE7DA30005CA2AC /* ShowNetworksViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */; }; + 93DAFE4B1CFE53CA00547CC4 /* AuthtokenCopy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -32,6 +33,9 @@ 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JoinNetworkViewController.xib; sourceTree = ""; }; 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowNetworksViewController.swift; sourceTree = ""; }; 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShowNetworksViewController.xib; sourceTree = ""; }; + 93DAFE491CFE53C900547CC4 /* ZeroTier One-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ZeroTier One-Bridging-Header.h"; sourceTree = ""; }; + 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AuthtokenCopy.m; sourceTree = ""; }; + 93DAFE4C1CFE53DA00547CC4 /* AuthtokenCopy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuthtokenCopy.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,6 +79,9 @@ 93326BE21CE7C816005CA2AC /* Info.plist */, 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */, 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */, + 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */, + 93DAFE4C1CFE53DA00547CC4 /* AuthtokenCopy.h */, + 93DAFE491CFE53C900547CC4 /* ZeroTier One-Bridging-Header.h */, ); path = "ZeroTier One"; sourceTree = ""; @@ -153,6 +160,7 @@ files = ( 9330F1371CEBF87200687EC8 /* Network.swift in Sources */, 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, + 93DAFE4B1CFE53CA00547CC4 /* AuthtokenCopy.m in Sources */, 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */, 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, @@ -260,11 +268,14 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "ZeroTier One/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.zerotier.ZeroTier-One"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ZeroTier One/ZeroTier One-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; @@ -272,11 +283,13 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "ZeroTier One/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.zerotier.ZeroTier-One"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ZeroTier One/ZeroTier One-Bridging-Header.h"; }; name = Release; }; diff --git a/ZeroTier One/AuthtokenCopy.h b/ZeroTier One/AuthtokenCopy.h new file mode 100644 index 00000000..43c927e2 --- /dev/null +++ b/ZeroTier One/AuthtokenCopy.h @@ -0,0 +1,16 @@ +// +// AuthtokenCopy.h +// ZeroTier One +// +// Created by Grant Limberg on 5/31/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +#ifndef AuthtokenCopy_h +#define AuthtokenCopy_h + +#import + +NSString* getAdminAuthToken(AuthorizationRef authRef); + +#endif /* AuthtokenCopy_h */ diff --git a/ZeroTier One/AuthtokenCopy.m b/ZeroTier One/AuthtokenCopy.m new file mode 100644 index 00000000..893d90cf --- /dev/null +++ b/ZeroTier One/AuthtokenCopy.m @@ -0,0 +1,87 @@ +// +// AuthtokenCopy.m +// ZeroTier One +// +// Created by Grant Limberg on 5/31/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +#import + +#import "AuthtokenCopy.h" + + +NSString* getAdminAuthToken(AuthorizationRef authRef) { + char *tool = "/bin/cat"; + char *args[] = { "/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; + FILE *pipe = nil; + char token[25]; + memset(token, 0, sizeof(char)*25); + + + OSStatus status = AuthorizationExecuteWithPrivileges(authRef, tool, kAuthorizationFlagDefaults, args, &pipe); + + if (status != errAuthorizationSuccess) { + NSLog(@"Reading authtoken failed!"); + + + switch(status) { + case errAuthorizationDenied: + NSLog(@"Autorization Denied"); + break; + case errAuthorizationCanceled: + NSLog(@"Authorization Canceled"); + break; + case errAuthorizationInternal: + NSLog(@"Authorization Internal"); + break; + case errAuthorizationBadAddress: + NSLog(@"Bad Address"); + break; + case errAuthorizationInvalidRef: + NSLog(@"Invalid Ref"); + break; + case errAuthorizationInvalidSet: + NSLog(@"Invalid Set"); + break; + case errAuthorizationInvalidTag: + NSLog(@"Invalid Tag"); + break; + case errAuthorizationInvalidFlags: + NSLog(@"Invalid Flags"); + break; + case errAuthorizationInvalidPointer: + NSLog(@"Invalid Pointer"); + break; + case errAuthorizationToolExecuteFailure: + NSLog(@"Tool Execute Failure"); + break; + case errAuthorizationToolEnvironmentError: + NSLog(@"Tool Environment Failure"); + break; + case errAuthorizationExternalizeNotAllowed: + NSLog(@"Externalize Not Allowed"); + break; + case errAuthorizationInteractionNotAllowed: + NSLog(@"Interaction Not Allowed"); + break; + case errAuthorizationInternalizeNotAllowed: + NSLog(@"Internalize Not Allowed"); + break; + default: + NSLog(@"Unknown Error"); + break; + } + + return @""; + } + + if(pipe != nil) { + fread(&token, sizeof(char), 24, pipe); + fclose(pipe); + + return [NSString stringWithUTF8String:token]; + } + + return @""; +} \ No newline at end of file diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index 3aa9dc54..e2526610 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -30,7 +30,36 @@ class ServiceCom: NSObject { Holder.key = try String(contentsOfURL: authtokenURL) } else { - // TODO: Elevate priviledge to copy /Library/Application Support/ZeroTier/One/authtoken.secret to the user's local AppSupport directory + try NSFileManager.defaultManager().createDirectoryAtURL(appSupportDir, withIntermediateDirectories: true, attributes: nil) + + var authRef: AuthorizationRef = nil + var status = AuthorizationCreate(nil, nil, .Defaults, &authRef) + + if status != errAuthorizationSuccess { + NSLog("Authorization Failed! \(status)") + return "" + } + + var authItem = AuthorizationItem(name: kAuthorizationRightExecute, valueLength: 0, value: nil, flags: 0) + var authRights = AuthorizationRights(count: 1, items: &authItem) + let authFlags: AuthorizationFlags = [.Defaults, .InteractionAllowed, .PreAuthorize, .ExtendRights] + + status = AuthorizationCopyRights(authRef, &authRights, nil, authFlags, nil) + + if status != errAuthorizationSuccess { + NSLog("Authorization Failed! \(status)") + return "" + } + + let localKey = getAdminAuthToken(authRef) + AuthorizationFree(authRef, .DestroyRights) + + if localKey != nil && localKey.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 0 { + NSLog("\(localKey)") + Holder.key = localKey + + try localKey.writeToURL(authtokenURL, atomically: true, encoding: NSUTF8StringEncoding) + } } } catch { diff --git a/ZeroTier One/ZeroTier One-Bridging-Header.h b/ZeroTier One/ZeroTier One-Bridging-Header.h new file mode 100644 index 00000000..68795a0e --- /dev/null +++ b/ZeroTier One/ZeroTier One-Bridging-Header.h @@ -0,0 +1,5 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "AuthtokenCopy.h" -- cgit v1.2.3 From 188f8021f806ff922924949054b94e53dc0fed30 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 9 Jun 2016 19:59:05 -0700 Subject: Joining/Deleting networks now implemented. Still need to implement known networks cache so we can join/leave networks without deleting them from the UI --- ZeroTier One/JoinNetworkViewController.swift | 2 +- ZeroTier One/NetworkInfoCell.swift | 32 +++++++++++- ZeroTier One/ShowNetworksViewController.swift | 5 ++ ZeroTier One/ShowNetworksViewController.xib | 75 ++++++++++++++++++--------- 4 files changed, 88 insertions(+), 26 deletions(-) diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift index 1ac3c7ea..cc768254 100644 --- a/ZeroTier One/JoinNetworkViewController.swift +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -62,7 +62,7 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo let networkString = network.stringValue let networkId = UInt64(networkString, radix: 16) - // TODO: Execute join network call + ServiceCom.joinNetwork(networkString) network.stringValue = "" diff --git a/ZeroTier One/NetworkInfoCell.swift b/ZeroTier One/NetworkInfoCell.swift index 73305f83..c31fcb91 100644 --- a/ZeroTier One/NetworkInfoCell.swift +++ b/ZeroTier One/NetworkInfoCell.swift @@ -10,6 +10,8 @@ import Cocoa class NetworkInfoCell: NSTableCellView { + weak var parent: ShowNetworksViewController! + @IBOutlet var networkIdField: NSTextField! @IBOutlet var networkNameField: NSTextField! @@ -22,6 +24,9 @@ class NetworkInfoCell: NSTableCellView { @IBOutlet var deviceField: NSTextField! @IBOutlet var addressesField: NSTextField! + @IBOutlet var connectedCheckbox: NSButton! + @IBOutlet var deleteButton: NSButton! + override func awakeFromNib() { super.awakeFromNib() @@ -31,5 +36,30 @@ class NetworkInfoCell: NSTableCellView { // Drawing code here. } - + + @IBAction func onConnectCheckStateChanged(sender: NSButton) { + NSLog("Checked State Changed") + + if(sender.state == NSOnState) { + NSLog("Checked") + joinNetwork(networkIdField.stringValue) + } + else { + NSLog("Unchecked") + leaveNetwork(networkIdField.stringValue) + } + } + + @IBAction func deleteNetwork(sender: NSButton) { + leaveNetwork(networkIdField.stringValue) + parent.deleteNetworkFromList(networkIdField.stringValue) + } + + func joinNetwork(nwid: String) { + ServiceCom.joinNetwork(nwid) + } + + func leaveNetwork(nwid: String) { + ServiceCom.leaveNetwork(nwid) + } } diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 857e2147..33148f83 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -34,6 +34,10 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable } } + func deleteNetworkFromList(nwid: String) { + + } + // NSTableViewDataSource func numberOfRowsInTableView(tableView: NSTableView) -> Int { @@ -47,6 +51,7 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { if let cell = tableView.makeViewWithIdentifier("NetworkInfoCell", owner: nil) as? NetworkInfoCell { let network = networkList[row] + cell.parent = self cell.networkIdField.stringValue = String(network.nwid, radix: 16) cell.networkNameField.stringValue = network.name diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 6b12ea3f..12f1ea3c 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -17,14 +17,14 @@ - + - - + + @@ -44,11 +44,11 @@ - + - + @@ -56,7 +56,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -72,7 +72,7 @@ - + @@ -80,7 +80,7 @@ - + @@ -88,7 +88,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -112,7 +112,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -136,7 +136,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -152,7 +152,7 @@ - + @@ -160,7 +160,7 @@ - + @@ -168,7 +168,7 @@ - + @@ -176,7 +176,7 @@ - + @@ -184,13 +184,33 @@ - + + + @@ -210,6 +230,7 @@ + @@ -222,14 +243,18 @@ + + + + @@ -242,6 +267,8 @@ + + -- cgit v1.2.3 From b085329bca3e1eb1300045bf2cd2df52039e99d9 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 13 Jun 2016 19:46:54 -0700 Subject: Base functionality complete. Can join/leave/list networks. Can disconnect from networks without removing them from the network list. --- ZeroTier One/Network.swift | 62 ++++++++++++++++++- ZeroTier One/ShowNetworksViewController.swift | 89 +++++++++++++++++++++++++-- 2 files changed, 143 insertions(+), 8 deletions(-) diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift index 4ee2f748..28f3eda6 100644 --- a/ZeroTier One/Network.swift +++ b/ZeroTier One/Network.swift @@ -8,7 +8,7 @@ import Cocoa -enum NetworkStatus : CustomStringConvertible { +enum NetworkStatus : Int, CustomStringConvertible { case REQUESTING_CONFIGURATION case OK case ACCESS_DENIED @@ -28,7 +28,7 @@ enum NetworkStatus : CustomStringConvertible { } } -enum NetworkType: CustomStringConvertible { +enum NetworkType: Int, CustomStringConvertible { case PUBLIC case PRIVATE @@ -40,7 +40,25 @@ enum NetworkType: CustomStringConvertible { } } -class Network: NSObject { + +struct PropertyKeys { + static let addressesKey = "addresses" + static let bridgeKey = "bridge" + static let broadcastKey = "broadcast" + static let dhcpKey = "dhcp" + static let macKey = "mac" + static let mtuKey = "mtu" + static let multicastKey = "multicast" + static let nameKey = "name" + static let netconfKey = "netconf" + static let nwidKey = "nwid" + static let portNameKey = "port" + static let portErrorKey = "portError" + static let statusKey = "status" + static let typeKey = "type" +} + +class Network: NSObject, NSCoding { var assignedAddresses: [String] = [String]() var bridge: Bool = false var broadcastEnabled: Bool = false @@ -55,6 +73,7 @@ class Network: NSObject { var portError: Int = 0 var status: NetworkStatus = .REQUESTING_CONFIGURATION var type: NetworkType = .PRIVATE + var connected: Bool = false // NOT PERSISTED. Set to true if loaded via JSON init(jsonData: [String: AnyObject]) { super.init() @@ -108,5 +127,42 @@ class Network: NSObject { default: break } + + // if it's being initialized via JSON, it's connected + connected = true + } + + required init?(coder aDecoder: NSCoder) { + self.assignedAddresses = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String] + self.bridge = aDecoder.decodeBoolForKey(PropertyKeys.bridgeKey) + self.broadcastEnabled = aDecoder.decodeBoolForKey(PropertyKeys.broadcastKey) + self.dhcp = aDecoder.decodeBoolForKey(PropertyKeys.dhcpKey) + self.mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String + self.mtu = aDecoder.decodeIntegerForKey(PropertyKeys.mtuKey) + self.multicastSubscriptions = aDecoder.decodeObjectForKey(PropertyKeys.multicastKey) as! [String] + self.name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String + self.netconfRevision = aDecoder.decodeIntegerForKey(PropertyKeys.netconfKey) + self.nwid = (aDecoder.decodeObjectForKey(PropertyKeys.nwidKey) as! NSNumber).unsignedLongLongValue + self.portDeviceName = aDecoder.decodeObjectForKey(PropertyKeys.portNameKey) as! String + self.portError = aDecoder.decodeIntegerForKey(PropertyKeys.portErrorKey) + self.status = NetworkStatus(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.statusKey))! + self.type = NetworkType(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.typeKey))! + } + + func encodeWithCoder(aCoder: NSCoder) { + aCoder.encodeObject(self.assignedAddresses, forKey: PropertyKeys.addressesKey) + aCoder.encodeBool(self.bridge, forKey: PropertyKeys.bridgeKey) + aCoder.encodeBool(self.broadcastEnabled, forKey: PropertyKeys.broadcastKey) + aCoder.encodeBool(self.dhcp, forKey: PropertyKeys.dhcpKey) + aCoder.encodeObject(self.mac, forKey: PropertyKeys.macKey) + aCoder.encodeInteger(self.mtu, forKey: PropertyKeys.mtuKey) + aCoder.encodeObject(self.multicastSubscriptions, forKey: PropertyKeys.multicastKey) + aCoder.encodeObject(self.name, forKey: PropertyKeys.nameKey) + aCoder.encodeInteger(self.netconfRevision, forKey: PropertyKeys.netconfKey) + aCoder.encodeObject(NSNumber(unsignedLongLong: self.nwid), forKey: PropertyKeys.nwidKey) + aCoder.encodeObject(self.portDeviceName, forKey: PropertyKeys.portNameKey) + aCoder.encodeInteger(self.portError, forKey: PropertyKeys.portErrorKey) + aCoder.encodeInteger(self.status.rawValue, forKey: PropertyKeys.statusKey) + aCoder.encodeInteger(self.type.rawValue, forKey: PropertyKeys.typeKey) } } diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 33148f83..ed2479d1 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -23,19 +23,92 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable tableView.backgroundColor = NSColor.clearColor() } + private func dataFile() -> String { + var appSupport = NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask)[0] + appSupport = appSupport.URLByAppendingPathComponent("ZeroTier").URLByAppendingPathComponent("One").URLByAppendingPathComponent("networks.dat") + return appSupport.path! + } + + + private func findNetworkWithID(id: UInt64) -> Int { + + for (index, element) in networkList.enumerate() { + + if element.nwid == id { + return index + } + } + + return NSNotFound + } + override func viewWillAppear() { super.viewWillAppear() - ServiceCom.getNetworkList() { (networkList) -> Void in - NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in - self.networkList = networkList - self.tableView.reloadData() + let filePath = dataFile() + + if NSFileManager.defaultManager().fileExistsAtPath(filePath) { + networkList = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] + + ServiceCom.getNetworkList() { (networkList) -> Void in + + for nw in networkList { + let index = self.findNetworkWithID(nw.nwid) + + if index != NSNotFound { + self.networkList[index] = nw + } + else { + self.networkList.append(nw) + } + } + + NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in + self.networkList.sortInPlace({ (left, right) -> Bool in + if left.nwid < right.nwid { + return true + } + + return false + }) + self.tableView.reloadData() + } + } + } + else { + ServiceCom.getNetworkList() { (networkList) -> Void in + NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in + self.networkList.sortInPlace({ (left, right) -> Bool in + if left.nwid < right.nwid { + return true + } + + return false + }) + + self.networkList = networkList + self.tableView.reloadData() + } } } } + override func viewWillDisappear() { + super.viewWillDisappear() + + let filePath = dataFile() + NSKeyedArchiver.archiveRootObject(self.networkList, toFile: filePath) + } + func deleteNetworkFromList(nwid: String) { - + if let nwid = UInt64(nwid, radix: 16) { + let index = findNetworkWithID(nwid) + + if index != NSNotFound { + networkList.removeAtIndex(index) + tableView.reloadData() + } + } } // NSTableViewDataSource @@ -71,6 +144,12 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable cell.addressesField.stringValue += "\n" } + if network.connected { + cell.connectedCheckbox.state = NSOnState + } + else { + cell.connectedCheckbox.state = NSOffState + } return cell } -- cgit v1.2.3 From 2c1a8524f0e79b8eb4a7e7160960bd4402d06a6e Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 13 Jun 2016 19:56:43 -0700 Subject: remove unused variables --- ZeroTier One/JoinNetworkViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift index cc768254..92e30cae 100644 --- a/ZeroTier One/JoinNetworkViewController.swift +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -60,7 +60,6 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo @IBAction func onJoinClicked(sender: AnyObject?) { let networkString = network.stringValue - let networkId = UInt64(networkString, radix: 16) ServiceCom.joinNetwork(networkString) -- cgit v1.2.3 From 89cb0e260a65540ab6f3538ede1dc2493b031aba Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 13 Jun 2016 19:58:21 -0700 Subject: Set deployment target to 10.10 for the minimum OS X version for this app I'm currently using features only available in 10.10 or above. We'll have to discuss this and see what can be done for OS X 10.7 through 10.9. --- ZeroTier One.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 7c1e29be..0a8188c9 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -272,6 +272,7 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "ZeroTier One/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_BUNDLE_IDENTIFIER = "com.zerotier.ZeroTier-One"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "ZeroTier One/ZeroTier One-Bridging-Header.h"; @@ -287,6 +288,7 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "ZeroTier One/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_BUNDLE_IDENTIFIER = "com.zerotier.ZeroTier-One"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "ZeroTier One/ZeroTier One-Bridging-Header.h"; -- cgit v1.2.3 From c8750e5812f6ad453cb482fe3ff629536e376960 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 14 Jun 2016 18:09:30 -0700 Subject: more error checking when parsing JSON for network list remove "multicastSubscriptions" field as it isn't used anyway --- ZeroTier One/Info.plist | 16 ++-- ZeroTier One/Network.swift | 189 ++++++++++++++++++++++++++++++--------------- 2 files changed, 133 insertions(+), 72 deletions(-) diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index 7a6ab723..5777ef6c 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -2,13 +2,6 @@ - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - LSUIElement - CFBundleDevelopmentRegion en CFBundleExecutable @@ -28,9 +21,16 @@ CFBundleSignature ???? CFBundleVersion - 1 + 2 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) + LSUIElement + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSHumanReadableCopyright Copyright © 2016 ZeroTier, Inc. All rights reserved. NSMainNibFile diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift index 28f3eda6..95b3d93f 100644 --- a/ZeroTier One/Network.swift +++ b/ZeroTier One/Network.swift @@ -65,7 +65,6 @@ class Network: NSObject, NSCoding { var dhcp: Bool = false var mac: String = "" var mtu: Int = 0 - var multicastSubscriptions: [String] = [String]() var name: String = "" var netconfRevision: Int = 232 var nwid: UInt64 = 0 @@ -78,54 +77,80 @@ class Network: NSObject, NSCoding { init(jsonData: [String: AnyObject]) { super.init() - let aa = jsonData["assignedAddresses"] as! [String] - for a in aa { - assignedAddresses.append(a) - } - - bridge = (jsonData["bridge"] as! NSNumber).boolValue - broadcastEnabled = (jsonData["broadcastEnabled"] as! NSNumber).boolValue - dhcp = (jsonData["dhcp"] as! NSNumber).boolValue - mac = jsonData["mac"] as! String - mtu = (jsonData["mtu"] as! NSNumber).integerValue - - let multSubs = jsonData["multicastSubscriptions"] as! [String] - for ms in multSubs { - multicastSubscriptions.append(ms) - } - - name = jsonData["name"] as! String - netconfRevision = (jsonData["netconfRevision"] as! NSNumber).integerValue - nwid = UInt64((jsonData["nwid"] as! String), radix: 16)! - portDeviceName = jsonData["portDeviceName"] as! String - portError = (jsonData["portError"] as! NSNumber).integerValue - - let statusStr = jsonData["status"] as! String - switch statusStr { - case "REQUESTING_CONFIGURATION": - status = .REQUESTING_CONFIGURATION - case "OK": - status = .OK - case "ACCESS_DENIED": - status = .ACCESS_DENIED - case "NOT_FOUND": - status = .NOT_FOUND - case "PORT_ERROR": - status = .PORT_ERROR - case "CLIENT_TOO_OLD": - status = .CLIENT_TOO_OLD - default: - break - } - - let typeStr = jsonData["type"] as! String - switch typeStr { - case "PRIVATE": - type = .PRIVATE - case "PUBLIC": - type = .PUBLIC - default: - break + if let aa = jsonData["assignedAddresses"] as? [String] { + for a in aa { + assignedAddresses.append(a) + } + } + + if let b = jsonData["bridge"] as? NSNumber { + bridge = b.boolValue + } + + if let b = jsonData["broadcastEnabled"] as? NSNumber { + broadcastEnabled = b.boolValue + } + + if let d = jsonData["dhcp"] as? NSNumber { + dhcp = d.boolValue + } + + if let m = jsonData["mac"] as? String { + mac = m + } + + if let m = jsonData["mtu"] as? NSNumber { + mtu = m.integerValue + } + + if let n = jsonData["name"] as? String { + name = n + } + + if let n = jsonData["netconfRevision"] as? NSNumber { + netconfRevision = n.integerValue + } + + if let n = UInt64((jsonData["nwid"] as! String), radix: 16) { + nwid = n + } + + if let p = jsonData["portDeviceName"] as? String { + portDeviceName = p + } + + if let p = jsonData["portError"] as? NSNumber { + portError = p.integerValue + } + + if let statusStr = jsonData["status"] as? String { + switch statusStr { + case "REQUESTING_CONFIGURATION": + status = .REQUESTING_CONFIGURATION + case "OK": + status = .OK + case "ACCESS_DENIED": + status = .ACCESS_DENIED + case "NOT_FOUND": + status = .NOT_FOUND + case "PORT_ERROR": + status = .PORT_ERROR + case "CLIENT_TOO_OLD": + status = .CLIENT_TOO_OLD + default: + break + } + } + + if let typeStr = jsonData["type"] as? String { + switch typeStr { + case "PRIVATE": + type = .PRIVATE + case "PUBLIC": + type = .PUBLIC + default: + break + } } // if it's being initialized via JSON, it's connected @@ -133,20 +158,57 @@ class Network: NSObject, NSCoding { } required init?(coder aDecoder: NSCoder) { - self.assignedAddresses = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String] - self.bridge = aDecoder.decodeBoolForKey(PropertyKeys.bridgeKey) - self.broadcastEnabled = aDecoder.decodeBoolForKey(PropertyKeys.broadcastKey) - self.dhcp = aDecoder.decodeBoolForKey(PropertyKeys.dhcpKey) - self.mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String - self.mtu = aDecoder.decodeIntegerForKey(PropertyKeys.mtuKey) - self.multicastSubscriptions = aDecoder.decodeObjectForKey(PropertyKeys.multicastKey) as! [String] - self.name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String - self.netconfRevision = aDecoder.decodeIntegerForKey(PropertyKeys.netconfKey) - self.nwid = (aDecoder.decodeObjectForKey(PropertyKeys.nwidKey) as! NSNumber).unsignedLongLongValue - self.portDeviceName = aDecoder.decodeObjectForKey(PropertyKeys.portNameKey) as! String - self.portError = aDecoder.decodeIntegerForKey(PropertyKeys.portErrorKey) - self.status = NetworkStatus(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.statusKey))! - self.type = NetworkType(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.typeKey))! + if aDecoder.containsValueForKey(PropertyKeys.addressesKey) { + self.assignedAddresses = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String] + } + + if aDecoder.containsValueForKey(PropertyKeys.bridgeKey) { + self.bridge = aDecoder.decodeBoolForKey(PropertyKeys.bridgeKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.broadcastKey) { + self.broadcastEnabled = aDecoder.decodeBoolForKey(PropertyKeys.broadcastKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.dhcpKey) { + self.dhcp = aDecoder.decodeBoolForKey(PropertyKeys.dhcpKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.macKey) { + self.mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String + } + + if aDecoder.containsValueForKey(PropertyKeys.mtuKey) { + self.mtu = aDecoder.decodeIntegerForKey(PropertyKeys.mtuKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.nameKey) { + self.name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String + } + + if aDecoder.containsValueForKey(PropertyKeys.netconfKey) { + self.netconfRevision = aDecoder.decodeIntegerForKey(PropertyKeys.netconfKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.nwidKey) { + self.nwid = (aDecoder.decodeObjectForKey(PropertyKeys.nwidKey) as! NSNumber).unsignedLongLongValue + } + + if aDecoder.containsValueForKey(PropertyKeys.portNameKey) { + self.portDeviceName = aDecoder.decodeObjectForKey(PropertyKeys.portNameKey) as! String + } + + if aDecoder.containsValueForKey(PropertyKeys.portErrorKey) { + self.portError = aDecoder.decodeIntegerForKey(PropertyKeys.portErrorKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.statusKey) { + self.status = NetworkStatus(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.statusKey))! + } + + if aDecoder.containsValueForKey(PropertyKeys.typeKey) { + self.type = NetworkType(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.typeKey))! + } } func encodeWithCoder(aCoder: NSCoder) { @@ -156,7 +218,6 @@ class Network: NSObject, NSCoding { aCoder.encodeBool(self.dhcp, forKey: PropertyKeys.dhcpKey) aCoder.encodeObject(self.mac, forKey: PropertyKeys.macKey) aCoder.encodeInteger(self.mtu, forKey: PropertyKeys.mtuKey) - aCoder.encodeObject(self.multicastSubscriptions, forKey: PropertyKeys.multicastKey) aCoder.encodeObject(self.name, forKey: PropertyKeys.nameKey) aCoder.encodeInteger(self.netconfRevision, forKey: PropertyKeys.netconfKey) aCoder.encodeObject(NSNumber(unsignedLongLong: self.nwid), forKey: PropertyKeys.nwidKey) -- cgit v1.2.3 From bae0060552e652559937287f160a550622a5cab8 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 14 Jun 2016 19:59:45 -0700 Subject: add a timer to retrieve the network list every second. --- ZeroTier One/ShowNetworksViewController.swift | 51 ++++++++++++++++----------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index ed2479d1..d9a4291a 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -14,6 +14,9 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable var networkList: [Network] = [Network]() + + var timer: NSTimer? = nil + override func viewDidLoad() { super.viewDidLoad() // Do view setup here. @@ -45,10 +48,36 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable override func viewWillAppear() { super.viewWillAppear() + updateNetworkInfo() + + self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(updateNetworkInfo), userInfo: nil, repeats: true) + } + + override func viewWillDisappear() { + super.viewWillDisappear() + + self.timer?.invalidate() + let filePath = dataFile() + NSKeyedArchiver.archiveRootObject(self.networkList, toFile: filePath) + } + + func deleteNetworkFromList(nwid: String) { + if let nwid = UInt64(nwid, radix: 16) { + let index = findNetworkWithID(nwid) + + if index != NSNotFound { + networkList.removeAtIndex(index) + tableView.reloadData() + } + } + } + + func updateNetworkInfo() { + let filePath = self.dataFile() if NSFileManager.defaultManager().fileExistsAtPath(filePath) { - networkList = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] + self.networkList = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] ServiceCom.getNetworkList() { (networkList) -> Void in @@ -85,7 +114,7 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable return false }) - + self.networkList = networkList self.tableView.reloadData() } @@ -93,24 +122,6 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable } } - override func viewWillDisappear() { - super.viewWillDisappear() - - let filePath = dataFile() - NSKeyedArchiver.archiveRootObject(self.networkList, toFile: filePath) - } - - func deleteNetworkFromList(nwid: String) { - if let nwid = UInt64(nwid, radix: 16) { - let index = findNetworkWithID(nwid) - - if index != NSNotFound { - networkList.removeAtIndex(index) - tableView.reloadData() - } - } - } - // NSTableViewDataSource func numberOfRowsInTableView(tableView: NSTableView) -> Int { -- cgit v1.2.3 From c8f85ffec97206174dbffbf6290ebcdcf84355ac Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 16 Jun 2016 20:53:55 -0700 Subject: Factored network updates into its own class. Delivered via notification --- ZeroTier One.xcodeproj/project.pbxproj | 4 + ZeroTier One/AppDelegate.swift | 12 ++- ZeroTier One/Info.plist | 2 +- ZeroTier One/NetworkMonitor.swift | 116 ++++++++++++++++++++++++++ ZeroTier One/ServiceCom.swift | 5 ++ ZeroTier One/ShowNetworksViewController.swift | 87 ++----------------- 6 files changed, 145 insertions(+), 81 deletions(-) create mode 100644 ZeroTier One/NetworkMonitor.swift diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 0a8188c9..ed054cb4 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 932D472D1D138B0C004BCFE2 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */; }; 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */; }; @@ -21,6 +22,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkInfoCell.swift; sourceTree = ""; }; @@ -82,6 +84,7 @@ 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */, 93DAFE4C1CFE53DA00547CC4 /* AuthtokenCopy.h */, 93DAFE491CFE53C900547CC4 /* ZeroTier One-Bridging-Header.h */, + 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */, ); path = "ZeroTier One"; sourceTree = ""; @@ -159,6 +162,7 @@ buildActionMask = 2147483647; files = ( 9330F1371CEBF87200687EC8 /* Network.swift in Sources */, + 932D472D1D138B0C004BCFE2 /* NetworkMonitor.swift in Sources */, 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, 93DAFE4B1CFE53CA00547CC4 /* AuthtokenCopy.m in Sources */, 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */, diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index c7cbc09a..f0bd0437 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -21,8 +21,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { var transientMonitor: AnyObject? = nil - func applicationDidFinishLaunching(aNotification: NSNotification) { + let monitor = NetworkMonitor() + func applicationDidFinishLaunching(aNotification: NSNotification) { + let nc = NSNotificationCenter.defaultCenter() + nc.addObserver(self, selector: #selector(onNetworkListUpdated(_:)), name: networkUpdateKey, object: nil) statusItem.image = NSImage(named: "MenuBarIconMac") @@ -50,6 +53,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillTerminate(aNotification: NSNotification) { // Insert code here to tear down your application + let nc = NSNotificationCenter.defaultCenter() + nc.removeObserver(self) } @@ -89,5 +94,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { func quit() { NSApp.performSelector(#selector(NSApp.terminate(_:)), withObject: nil, afterDelay: 0.0) } + + func onNetworkListUpdated(note: NSNotification) { + let netList = note.userInfo!["networks"] as! [Network] + (networkListPopover.contentViewController as! ShowNetworksViewController).setNetworks(netList) + } } diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index 5777ef6c..29e935d0 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 2 + 3 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement diff --git a/ZeroTier One/NetworkMonitor.swift b/ZeroTier One/NetworkMonitor.swift new file mode 100644 index 00000000..124fce26 --- /dev/null +++ b/ZeroTier One/NetworkMonitor.swift @@ -0,0 +1,116 @@ +// +// NetworkMonitor.swift +// ZeroTier One +// +// Created by Grant Limberg on 6/16/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +let networkUpdateKey = "com.zerotier.one.network-list" + +class NetworkMonitor: NSObject { + + var timer: NSTimer? = nil + + var savedNetworks: [Network] = [Network]() + var receivedNetworks: [Network] = [Network]() + var allNetworks: [Network] = [Network]() + + override init() { + super.init() + + timer = NSTimer.scheduledTimerWithTimeInterval(1.0, + target: self, + selector: #selector(updateNetworkInfo), + userInfo: nil, + repeats: true) + } + + deinit { + timer?.invalidate() + } + + private func dataFile() -> String { + var appSupport = NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask)[0] + appSupport = appSupport.URLByAppendingPathComponent("ZeroTier").URLByAppendingPathComponent("One").URLByAppendingPathComponent("networks.dat") + return appSupport.path! + } + + func updateNetworkInfo() { + let filePath = dataFile() + + if NSFileManager.defaultManager().fileExistsAtPath(filePath) { + self.savedNetworks = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] + + } + + ServiceCom.getNetworkList() { (networkList) -> Void in + self.receivedNetworks = networkList + + NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in + self.internal_updateNetworkInfo() + } + } + } + + func deleteSavedNetwork(nwid: String) { + if let nwid = UInt64(nwid, radix: 16) { + let index = findNetworkWithID(nwid) + + if index != NSNotFound { + allNetworks.removeAtIndex(index) + } + } + } + + // Only to be called by updateNetworkInfo() + private func internal_updateNetworkInfo() { + var networks = self.savedNetworks + + for nw in receivedNetworks { + let index = findNetworkWithID(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]) + } + } + + private func findNetworkWithID(nwid: UInt64) -> Int { + for (index, element) in allNetworks.enumerate() { + + if element.nwid == nwid { + return index + } + } + + return NSNotFound + } + + private func saveNetworks() { + let file = dataFile() + + objc_sync_enter(allNetworks) + NSKeyedArchiver.archiveRootObject(self.allNetworks, toFile: file) + objc_sync_exit(allNetworks) + } +} diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index e2526610..21d5529c 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -87,6 +87,11 @@ class ServiceCom: NSObject { let request = NSMutableURLRequest(URL: u) let session = NSURLSession.sharedSession() let task = session.dataTaskWithRequest(request) { (data, response, error) in + if error != nil{ + NSLog("\(error)") + return + } + let httpResponse = response as! NSHTTPURLResponse let status = httpResponse.statusCode diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index d9a4291a..e8b9e332 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -10,20 +10,18 @@ import Cocoa class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource { - @IBOutlet var tableView: NSTableView! + @IBOutlet var tableView: NSTableView? var networkList: [Network] = [Network]() - - - var timer: NSTimer? = nil + var netMonitor: NetworkMonitor! override func viewDidLoad() { super.viewDidLoad() // Do view setup here. - tableView.setDelegate(self) - tableView.setDataSource(self) - tableView.backgroundColor = NSColor.clearColor() + tableView?.setDelegate(self) + tableView?.setDataSource(self) + tableView?.backgroundColor = NSColor.clearColor() } private func dataFile() -> String { @@ -32,94 +30,25 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable return appSupport.path! } - - private func findNetworkWithID(id: UInt64) -> Int { - - for (index, element) in networkList.enumerate() { - - if element.nwid == id { - return index - } - } - - return NSNotFound - } - override func viewWillAppear() { super.viewWillAppear() - - updateNetworkInfo() - - self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(updateNetworkInfo), userInfo: nil, repeats: true) } override func viewWillDisappear() { super.viewWillDisappear() - self.timer?.invalidate() - let filePath = dataFile() NSKeyedArchiver.archiveRootObject(self.networkList, toFile: filePath) } func deleteNetworkFromList(nwid: String) { - if let nwid = UInt64(nwid, radix: 16) { - let index = findNetworkWithID(nwid) - if index != NSNotFound { - networkList.removeAtIndex(index) - tableView.reloadData() - } - } } - func updateNetworkInfo() { - let filePath = self.dataFile() - - if NSFileManager.defaultManager().fileExistsAtPath(filePath) { - self.networkList = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] - - ServiceCom.getNetworkList() { (networkList) -> Void in - - for nw in networkList { - let index = self.findNetworkWithID(nw.nwid) - if index != NSNotFound { - self.networkList[index] = nw - } - else { - self.networkList.append(nw) - } - } - - NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in - self.networkList.sortInPlace({ (left, right) -> Bool in - if left.nwid < right.nwid { - return true - } - - return false - }) - self.tableView.reloadData() - } - } - } - else { - ServiceCom.getNetworkList() { (networkList) -> Void in - NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in - self.networkList.sortInPlace({ (left, right) -> Bool in - if left.nwid < right.nwid { - return true - } - - return false - }) - - self.networkList = networkList - self.tableView.reloadData() - } - } - } + func setNetworks(list: [Network]) { + networkList = list + tableView?.reloadData() } // NSTableViewDataSource -- cgit v1.2.3 From 6d114b7480ed5a6356b8938a4ebf11a9d19adeec Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 21 Jun 2016 19:44:59 -0700 Subject: dynamically generate the menu so that networks are listed can join/leave networks directly from the menu --- ZeroTier One/AppDelegate.swift | 65 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index f0bd0437..dc7a3b9a 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -23,20 +23,15 @@ class AppDelegate: NSObject, NSApplicationDelegate { let monitor = NetworkMonitor() + var networks = [Network]() + func applicationDidFinishLaunching(aNotification: NSNotification) { let nc = NSNotificationCenter.defaultCenter() nc.addObserver(self, selector: #selector(onNetworkListUpdated(_:)), name: networkUpdateKey, object: nil) statusItem.image = NSImage(named: "MenuBarIconMac") - let menu = NSMenu() - - menu.addItem(NSMenuItem(title: "Show Networks", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) - menu.addItem(NSMenuItem(title: "Join Network", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) - menu.addItem(NSMenuItem.separatorItem()) - menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q")) - - statusItem.menu = menu + buildMenu() joinNetworkPopover.contentViewController = JoinNetworkViewController( nibName: "JoinNetworkViewController", bundle: nil) @@ -98,6 +93,60 @@ class AppDelegate: NSObject, NSApplicationDelegate { func onNetworkListUpdated(note: NSNotification) { let netList = note.userInfo!["networks"] as! [Network] (networkListPopover.contentViewController as! ShowNetworksViewController).setNetworks(netList) + + self.networks = netList + + buildMenu() + } + + func buildMenu() { + let menu = NSMenu() + + menu.addItem(NSMenuItem(title: "Show Networks", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) + menu.addItem(NSMenuItem(title: "Join Network", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) + menu.addItem(NSMenuItem.separatorItem()) + + if networks.count > 0 { + for net in networks { + let id = String(net.nwid, radix: 16) + let networkName = "\(id) (\(net.name))" + + let item = NSMenuItem(title: networkName, action: #selector(AppDelegate.toggleNetwork(_:)), keyEquivalent: "") + + if net.connected { + item.state = NSOnState + } + else { + item.state = NSOffState + } + + item.representedObject = net + + menu.addItem(item) + } + + menu.addItem(NSMenuItem.separatorItem()) + } + + menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q")) + + statusItem.menu = menu + + } + + func toggleNetwork(sender: NSMenuItem) { + NSLog("\(sender.title)") + + let network = sender.representedObject as! Network + + let id = String(network.nwid, radix: 16) + + if network.connected { + ServiceCom.leaveNetwork(id) + } + else { + ServiceCom.joinNetwork(id) + } } } -- cgit v1.2.3 From b5a90a437b177e4cf486c571418f835e32ab8c1d Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 21 Jun 2016 19:45:08 -0700 Subject: update build number --- ZeroTier One/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index 29e935d0..87cfc3f6 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 3 + 4 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement -- cgit v1.2.3 From b256111a17ba9ea223b7d706eebf66605e46c701 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 21 Jun 2016 20:02:18 -0700 Subject: misc cleanup --- ZeroTier One/AppDelegate.swift | 8 +++++++- ZeroTier One/ServiceCom.swift | 8 ++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index dc7a3b9a..8e0cbf10 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -109,7 +109,13 @@ class AppDelegate: NSObject, NSApplicationDelegate { if networks.count > 0 { for net in networks { let id = String(net.nwid, radix: 16) - let networkName = "\(id) (\(net.name))" + var networkName = "" + if net.name.isEmpty { + networkName = "\(id)" + } + else { + networkName = "\(id) (\(net.name))" + } let item = NSMenuItem(title: networkName, action: #selector(AppDelegate.toggleNetwork(_:)), keyEquivalent: "") diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index 21d5529c..23c194c2 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -133,10 +133,10 @@ class ServiceCom: NSObject { let status = httpResponse.statusCode if status == 200 { - print("join ok") + NSLog("join ok") } else { - print("join error: \(status)") + NSLog("join error: \(status)") } } @@ -158,10 +158,10 @@ class ServiceCom: NSObject { let status = httpResponse.statusCode if status == 200 { - print("leave ok") + NSLog("leave ok") } else { - print("leave error: \(status)") + NSLog("leave error: \(status)") } } -- cgit v1.2.3 From c3deedd6fd2198f2ee379c896aee55b7c6d894cb Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 23 Jun 2016 19:44:00 -0700 Subject: Fix menu bar icon. Add app icon. --- ZeroTier One.xcodeproj/project.pbxproj | 6 ++++-- .../Assets.xcassets/AppIcon.appiconset/Contents.json | 3 ++- .../AppIcon.appiconset/ZeroTierIcon512x512.png | Bin 0 -> 51309 bytes .../MenuBarIconMac.imageset/Contents.json | 4 ++-- .../MenuBarIconMac.imageset/MenuBar.png | Bin 0 -> 392 bytes .../MenuBarIconMac.imageset/MenuBar@2x.png | Bin 0 -> 761 bytes .../MenuBarIconMac.imageset/MenuBarIconMac.png | Bin 3810 -> 0 bytes .../MenuBarIconMac.imageset/MenuBarIconMac@2x.png | Bin 5444 -> 0 bytes ZeroTier One/Info.plist | 2 +- ZeroTier One/ZeroTierIcon.icns | Bin 0 -> 125598 bytes 10 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 ZeroTier One/Assets.xcassets/AppIcon.appiconset/ZeroTierIcon512x512.png create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar.png create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar@2x.png delete mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png delete mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png create mode 100644 ZeroTier One/ZeroTierIcon.icns diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index ed054cb4..5aa71456 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 932D472D1D138B0C004BCFE2 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */; }; + 932D472F1D1CD499004BCFE2 /* ZeroTierIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */; }; 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */; }; @@ -23,6 +24,7 @@ /* Begin PBXFileReference section */ 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; + 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = ZeroTierIcon.icns; sourceTree = ""; }; 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkInfoCell.swift; sourceTree = ""; }; @@ -70,6 +72,7 @@ 93326BDA1CE7C816005CA2AC /* ZeroTier One */ = { isa = PBXGroup; children = ( + 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */, 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, 9330F1361CEBF87200687EC8 /* Network.swift */, @@ -151,6 +154,7 @@ 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */, 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */, 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */, + 932D472F1D1CD499004BCFE2 /* ZeroTierIcon.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -271,7 +275,6 @@ 93326BE61CE7C816005CA2AC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "ZeroTier One/Info.plist"; @@ -287,7 +290,6 @@ 93326BE71CE7C816005CA2AC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "ZeroTier One/Info.plist"; diff --git a/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json b/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json index 2db2b1c7..24c81d35 100644 --- a/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ZeroTier One/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -41,8 +41,9 @@ "scale" : "2x" }, { - "idiom" : "mac", "size" : "512x512", + "idiom" : "mac", + "filename" : "ZeroTierIcon512x512.png", "scale" : "1x" }, { diff --git a/ZeroTier One/Assets.xcassets/AppIcon.appiconset/ZeroTierIcon512x512.png b/ZeroTier One/Assets.xcassets/AppIcon.appiconset/ZeroTierIcon512x512.png new file mode 100644 index 00000000..d225c2e3 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/AppIcon.appiconset/ZeroTierIcon512x512.png differ diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json index ab75ef9a..3213cbe1 100644 --- a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json +++ b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json @@ -2,12 +2,12 @@ "images" : [ { "idiom" : "mac", - "filename" : "MenuBarIconMac.png", + "filename" : "MenuBar.png", "scale" : "1x" }, { "idiom" : "mac", - "filename" : "MenuBarIconMac@2x.png", + "filename" : "MenuBar@2x.png", "scale" : "2x" } ], diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar.png new file mode 100644 index 00000000..2734f6b6 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar.png differ diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar@2x.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar@2x.png new file mode 100644 index 00000000..08afad40 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBar@2x.png differ diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png deleted file mode 100644 index 74e59fe7..00000000 Binary files a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png and /dev/null differ diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png deleted file mode 100644 index 1c99f851..00000000 Binary files a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png and /dev/null differ diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index 87cfc3f6..80b0c466 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile - + ZeroTierIcon.icns CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/ZeroTier One/ZeroTierIcon.icns b/ZeroTier One/ZeroTierIcon.icns new file mode 100644 index 00000000..17e60d58 Binary files /dev/null and b/ZeroTier One/ZeroTierIcon.icns differ -- cgit v1.2.3 From 3c534abc9989719061dedd43a74221f73409357b Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 23 Jun 2016 19:48:48 -0700 Subject: "Show Networks" -> "Network Details" --- ZeroTier One/AppDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index 8e0cbf10..0179780f 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -102,7 +102,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func buildMenu() { let menu = NSMenu() - menu.addItem(NSMenuItem(title: "Show Networks", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) + menu.addItem(NSMenuItem(title: "Network Details", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) menu.addItem(NSMenuItem(title: "Join Network", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) menu.addItem(NSMenuItem.separatorItem()) -- cgit v1.2.3 From 35d1736c9726d3be8ab2cbc63b445d14b32c4d14 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 23 Jun 2016 20:04:57 -0700 Subject: add preferences view not populated yet --- ZeroTier One.xcodeproj/project.pbxproj | 8 ++++++++ ZeroTier One/AppDelegate.swift | 27 +++++++++++++++++++++++++++ ZeroTier One/JoinNetworkViewController.xib | 1 - ZeroTier One/PreferencesViewController.swift | 18 ++++++++++++++++++ ZeroTier One/PreferencesViewController.xib | 19 +++++++++++++++++++ ZeroTier One/ShowNetworksViewController.xib | 1 - 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 ZeroTier One/PreferencesViewController.swift create mode 100644 ZeroTier One/PreferencesViewController.xib diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 5aa71456..d6b38dd8 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 932D472D1D138B0C004BCFE2 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */; }; 932D472F1D1CD499004BCFE2 /* ZeroTierIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */; }; + 932D47321D1CD861004BCFE2 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932D47301D1CD861004BCFE2 /* PreferencesViewController.swift */; }; + 932D47331D1CD861004BCFE2 /* PreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */; }; 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */; }; @@ -25,6 +27,8 @@ /* Begin PBXFileReference section */ 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = ZeroTierIcon.icns; sourceTree = ""; }; + 932D47301D1CD861004BCFE2 /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; + 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesViewController.xib; sourceTree = ""; }; 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkInfoCell.swift; sourceTree = ""; }; @@ -88,6 +92,8 @@ 93DAFE4C1CFE53DA00547CC4 /* AuthtokenCopy.h */, 93DAFE491CFE53C900547CC4 /* ZeroTier One-Bridging-Header.h */, 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */, + 932D47301D1CD861004BCFE2 /* PreferencesViewController.swift */, + 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */, ); path = "ZeroTier One"; sourceTree = ""; @@ -155,6 +161,7 @@ 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */, 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */, 932D472F1D1CD499004BCFE2 /* ZeroTierIcon.icns in Resources */, + 932D47331D1CD861004BCFE2 /* PreferencesViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -167,6 +174,7 @@ files = ( 9330F1371CEBF87200687EC8 /* Network.swift in Sources */, 932D472D1D138B0C004BCFE2 /* NetworkMonitor.swift in Sources */, + 932D47321D1CD861004BCFE2 /* PreferencesViewController.swift in Sources */, 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, 93DAFE4B1CFE53CA00547CC4 /* AuthtokenCopy.m in Sources */, 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */, diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index 0179780f..f37eba73 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -18,6 +18,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { let networkListPopover = NSPopover() let joinNetworkPopover = NSPopover() + let preferencesPopover = NSPopover() var transientMonitor: AnyObject? = nil @@ -44,6 +45,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { networkListPopover.behavior = .Transient networkListPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) + + preferencesPopover.contentViewController = PreferencesViewController( + nibName: "PreferencesViewController", bundle: nil) + preferencesPopover.behavior = .Transient + + preferencesPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) } func applicationWillTerminate(aNotification: NSNotification) { @@ -86,6 +93,22 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } + func showPreferences() { + if let button = statusItem.button { + preferencesPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) + + if transientMonitor == nil { + transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( + [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in + + NSEvent.removeMonitor(self.transientMonitor!) + self.transientMonitor = nil + self.preferencesPopover.close() + } + } + } + } + func quit() { NSApp.performSelector(#selector(NSApp.terminate(_:)), withObject: nil, afterDelay: 0.0) } @@ -134,6 +157,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { menu.addItem(NSMenuItem.separatorItem()) } + menu.addItem(NSMenuItem(title: "Preferences...", action: #selector(AppDelegate.showPreferences), keyEquivalent: ",")) + + menu.addItem(NSMenuItem.separatorItem()) + menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q")) statusItem.menu = menu diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib index 7a2ffe70..625f1a3e 100644 --- a/ZeroTier One/JoinNetworkViewController.xib +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -1,7 +1,6 @@ - diff --git a/ZeroTier One/PreferencesViewController.swift b/ZeroTier One/PreferencesViewController.swift new file mode 100644 index 00000000..95d2d882 --- /dev/null +++ b/ZeroTier One/PreferencesViewController.swift @@ -0,0 +1,18 @@ +// +// PreferencesViewController.swift +// ZeroTier One +// +// Created by Grant Limberg on 6/23/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class PreferencesViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/ZeroTier One/PreferencesViewController.xib b/ZeroTier One/PreferencesViewController.xib new file mode 100644 index 00000000..2a80a43a --- /dev/null +++ b/ZeroTier One/PreferencesViewController.xib @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 12f1ea3c..69120fc9 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -1,7 +1,6 @@ - -- cgit v1.2.3 From f2e2632ae706a97c7172e6925d395d8752b044ed Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 23 Jun 2016 20:22:03 -0700 Subject: Added About view also not yet populated --- ZeroTier One.xcodeproj/project.pbxproj | 8 ++++++++ ZeroTier One/AboutViewController.swift | 18 ++++++++++++++++++ ZeroTier One/AboutViewController.xib | 19 +++++++++++++++++++ ZeroTier One/AppDelegate.swift | 25 +++++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 ZeroTier One/AboutViewController.swift create mode 100644 ZeroTier One/AboutViewController.xib diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index d6b38dd8..657f5150 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 932D472F1D1CD499004BCFE2 /* ZeroTierIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */; }; 932D47321D1CD861004BCFE2 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932D47301D1CD861004BCFE2 /* PreferencesViewController.swift */; }; 932D47331D1CD861004BCFE2 /* PreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */; }; + 932D47361D1CDC9B004BCFE2 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932D47341D1CDC9B004BCFE2 /* AboutViewController.swift */; }; + 932D47371D1CDC9B004BCFE2 /* AboutViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 932D47351D1CDC9B004BCFE2 /* AboutViewController.xib */; }; 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */; }; @@ -29,6 +31,8 @@ 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = ZeroTierIcon.icns; sourceTree = ""; }; 932D47301D1CD861004BCFE2 /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesViewController.xib; sourceTree = ""; }; + 932D47341D1CDC9B004BCFE2 /* AboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; + 932D47351D1CDC9B004BCFE2 /* AboutViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutViewController.xib; sourceTree = ""; }; 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 9330F13A1CF534E500687EC8 /* NetworkInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkInfoCell.swift; sourceTree = ""; }; @@ -94,6 +98,8 @@ 932D472C1D138B0C004BCFE2 /* NetworkMonitor.swift */, 932D47301D1CD861004BCFE2 /* PreferencesViewController.swift */, 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */, + 932D47341D1CDC9B004BCFE2 /* AboutViewController.swift */, + 932D47351D1CDC9B004BCFE2 /* AboutViewController.xib */, ); path = "ZeroTier One"; sourceTree = ""; @@ -157,6 +163,7 @@ buildActionMask = 2147483647; files = ( 93326BEF1CE7DA30005CA2AC /* ShowNetworksViewController.xib in Resources */, + 932D47371D1CDC9B004BCFE2 /* AboutViewController.xib in Resources */, 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */, 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */, 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */, @@ -180,6 +187,7 @@ 9330F13B1CF534E500687EC8 /* NetworkInfoCell.swift in Sources */, 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, + 932D47361D1CDC9B004BCFE2 /* AboutViewController.swift in Sources */, 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ZeroTier One/AboutViewController.swift b/ZeroTier One/AboutViewController.swift new file mode 100644 index 00000000..bbca975a --- /dev/null +++ b/ZeroTier One/AboutViewController.swift @@ -0,0 +1,18 @@ +// +// AboutViewController.swift +// ZeroTier One +// +// Created by Grant Limberg on 6/23/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class AboutViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/ZeroTier One/AboutViewController.xib b/ZeroTier One/AboutViewController.xib new file mode 100644 index 00000000..8722929f --- /dev/null +++ b/ZeroTier One/AboutViewController.xib @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index f37eba73..2ca97f3c 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -19,6 +19,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { let networkListPopover = NSPopover() let joinNetworkPopover = NSPopover() let preferencesPopover = NSPopover() + let aboutPopover = NSPopover() var transientMonitor: AnyObject? = nil @@ -51,6 +52,13 @@ class AppDelegate: NSObject, NSApplicationDelegate { preferencesPopover.behavior = .Transient preferencesPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) + + aboutPopover.contentViewController = AboutViewController( + nibName: "AboutViewController", bundle: nil) + aboutPopover.behavior = .Transient + + aboutPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) + } func applicationWillTerminate(aNotification: NSNotification) { @@ -109,6 +117,22 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } + func showAbout() { + if let button = statusItem.button { + aboutPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) + + if transientMonitor == nil { + transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( + [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in + + NSEvent.removeMonitor(self.transientMonitor!) + self.transientMonitor = nil + self.aboutPopover.close() + } + } + } + } + func quit() { NSApp.performSelector(#selector(NSApp.terminate(_:)), withObject: nil, afterDelay: 0.0) } @@ -157,6 +181,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { menu.addItem(NSMenuItem.separatorItem()) } + menu.addItem(NSMenuItem(title: "About ZeroTier One...", action: #selector(AppDelegate.showAbout), keyEquivalent: "")) menu.addItem(NSMenuItem(title: "Preferences...", action: #selector(AppDelegate.showPreferences), keyEquivalent: ",")) menu.addItem(NSMenuItem.separatorItem()) -- cgit v1.2.3 From e621058cfd6ad505de9dcb5ee38e0d0983091f66 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 24 Jun 2016 15:24:03 -0700 Subject: build number 5 --- ZeroTier One/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index 80b0c466..b4345ac4 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 4 + 5 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement -- cgit v1.2.3 From 5da4fd2aef1f510d1bae4e90fa195f8e7962e36f Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 24 Jun 2016 15:24:29 -0700 Subject: Added "..." to menu items to signify it pops up in a window --- ZeroTier One/AppDelegate.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index 2ca97f3c..e52b7be5 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -149,8 +149,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { func buildMenu() { let menu = NSMenu() - menu.addItem(NSMenuItem(title: "Network Details", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) - menu.addItem(NSMenuItem(title: "Join Network", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) + menu.addItem(NSMenuItem(title: "Network Details...", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) + menu.addItem(NSMenuItem(title: "Join Network...", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) menu.addItem(NSMenuItem.separatorItem()) if networks.count > 0 { -- cgit v1.2.3 From 9c94d6527a1968468567232698818c479c04b44b Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sun, 26 Jun 2016 16:11:30 -0700 Subject: add allowGlobal, allowDefault, allowManaged options to joining a network --- ZeroTier One/JoinNetworkViewController.swift | 10 +++++-- ZeroTier One/JoinNetworkViewController.xib | 34 +++++++++++++++++---- ZeroTier One/ServiceCom.swift | 45 ++++++++++++++++++---------- 3 files changed, 67 insertions(+), 22 deletions(-) diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift index 92e30cae..cef30d4e 100644 --- a/ZeroTier One/JoinNetworkViewController.swift +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -30,6 +30,10 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo @IBOutlet var network: NSComboBox! @IBOutlet var joinButton: NSButton! + @IBOutlet var allowManagedCheckBox: NSButton! + @IBOutlet var allowGlobalCheckBox: NSButton! + @IBOutlet var allowDefaultCheckBox:NSButton! + var values: [String] = [String]() override func viewDidLoad() { @@ -61,8 +65,10 @@ class JoinNetworkViewController: NSViewController, NSComboBoxDelegate, NSComboBo @IBAction func onJoinClicked(sender: AnyObject?) { let networkString = network.stringValue - ServiceCom.joinNetwork(networkString) - + ServiceCom.joinNetwork(networkString, + allowManaged: allowManagedCheckBox.state == NSOnState, + allowGlobal: allowGlobalCheckBox.state == NSOnState, + allowDefault: allowDefaultCheckBox.state == NSOnState) network.stringValue = "" diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib index 625f1a3e..187af008 100644 --- a/ZeroTier One/JoinNetworkViewController.xib +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -6,6 +6,9 @@ + + + @@ -14,11 +17,11 @@ - + - + @@ -26,7 +29,7 @@ - + + + + - + diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index 23c194c2..4c920ad2 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -119,29 +119,44 @@ class ServiceCom: NSObject { } - static func joinNetwork(network: String) { + static func joinNetwork(network: String, allowManaged: Bool = true, allowGlobal: Bool = false, allowDefault: Bool = false) { let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.getKey())" let url = NSURL(string: urlString) - if let u = url { - let request = NSMutableURLRequest(URL: u) - request.HTTPMethod = "POST" + var jsonDict = [String: AnyObject]() + jsonDict["allowManaged"] = NSNumber(bool: allowManaged) + jsonDict["allowGlobal"] = NSNumber(bool: allowGlobal) + jsonDict["allowDefault"] = NSNumber(bool: allowDefault) - let session = NSURLSession.sharedSession() - let task = session.dataTaskWithRequest(request) { (data, response, error) in - let httpResponse = response as! NSHTTPURLResponse - let status = httpResponse.statusCode + do { + let json = try NSJSONSerialization.dataWithJSONObject(jsonDict, options: NSJSONWritingOptions()) - if status == 200 { - NSLog("join ok") - } - else { - NSLog("join error: \(status)") + if let u = url { + let request = NSMutableURLRequest(URL: u) + request.HTTPMethod = "POST" + request.HTTPBody = json + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + let session = NSURLSession.sharedSession() + let task = session.dataTaskWithRequest(request) { (data, response, error) in + let httpResponse = response as! NSHTTPURLResponse + let status = httpResponse.statusCode + + if status == 200 { + NSLog("join ok") + } + else { + NSLog("join error: \(status)") + } } - } - task.resume() + task.resume() + } } + catch { + NSLog("\(error)") + } + } static func leaveNetwork(network: String) { -- cgit v1.2.3 From 7e17a2072cbae143dde41a1a5bda646622cf3979 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sun, 26 Jun 2016 16:41:52 -0700 Subject: add allowManaged, allowGlobal, allowDefault to Network object --- ZeroTier One/Network.swift | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift index 95b3d93f..2e66ac8e 100644 --- a/ZeroTier One/Network.swift +++ b/ZeroTier One/Network.swift @@ -56,6 +56,9 @@ struct PropertyKeys { static let portErrorKey = "portError" static let statusKey = "status" static let typeKey = "type" + static let allowManagedKey = "allowManaged" + static let allowGlobalKey = "allowGlobal" + static let allowDefaultKey = "allowDefault" } class Network: NSObject, NSCoding { @@ -72,6 +75,9 @@ class Network: NSObject, NSCoding { var portError: Int = 0 var status: NetworkStatus = .REQUESTING_CONFIGURATION var type: NetworkType = .PRIVATE + var allowManaged: Bool = true + var allowGlobal: Bool = false + var allowDefault: Bool = false var connected: Bool = false // NOT PERSISTED. Set to true if loaded via JSON init(jsonData: [String: AnyObject]) { @@ -123,6 +129,18 @@ class Network: NSObject, NSCoding { portError = p.integerValue } + if let a = jsonData["allowManaged"] as? NSNumber { + allowManaged = a.boolValue + } + + if let a = jsonData["allowGlobal"] as? NSNumber { + allowGlobal = a.boolValue + } + + if let a = jsonData["allowDefault"] as? NSNumber { + allowDefault = a.boolValue + } + if let statusStr = jsonData["status"] as? String { switch statusStr { case "REQUESTING_CONFIGURATION": @@ -209,6 +227,18 @@ class Network: NSObject, NSCoding { if aDecoder.containsValueForKey(PropertyKeys.typeKey) { self.type = NetworkType(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.typeKey))! } + + if aDecoder.containsValueForKey(PropertyKeys.allowManagedKey) { + self.allowManaged = aDecoder.decodeBoolForKey(PropertyKeys.allowManagedKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.allowGlobalKey) { + self.allowGlobal = aDecoder.decodeBoolForKey(PropertyKeys.allowGlobalKey) + } + + if aDecoder.containsValueForKey(PropertyKeys.allowDefaultKey) { + self.allowDefault = aDecoder.decodeBoolForKey(PropertyKeys.allowDefaultKey) + } } func encodeWithCoder(aCoder: NSCoder) { @@ -225,5 +255,8 @@ class Network: NSObject, NSCoding { aCoder.encodeInteger(self.portError, forKey: PropertyKeys.portErrorKey) aCoder.encodeInteger(self.status.rawValue, forKey: PropertyKeys.statusKey) aCoder.encodeInteger(self.type.rawValue, forKey: PropertyKeys.typeKey) + aCoder.encodeBool(self.allowManaged, forKey: PropertyKeys.allowManagedKey) + aCoder.encodeBool(self.allowGlobal, forKey: PropertyKeys.allowGlobalKey) + aCoder.encodeBool(self.allowDefault, forKey: PropertyKeys.allowDefaultKey) } } -- cgit v1.2.3 From d57e343245558312847dc37ecdbebf6b65b6a66e Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sun, 26 Jun 2016 17:21:45 -0700 Subject: add UI elements in network details for allowDefault, allowGlobal, allowManaged --- ZeroTier One/Network.swift | 10 + ZeroTier One/NetworkInfoCell.swift | 4 + ZeroTier One/ShowNetworksViewController.swift | 17 ++ ZeroTier One/ShowNetworksViewController.xib | 280 +++++++++++++++----------- 4 files changed, 197 insertions(+), 114 deletions(-) diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift index 2e66ac8e..b344b6c2 100644 --- a/ZeroTier One/Network.swift +++ b/ZeroTier One/Network.swift @@ -260,3 +260,13 @@ class Network: NSObject, NSCoding { aCoder.encodeBool(self.allowDefault, forKey: PropertyKeys.allowDefaultKey) } } + +func defaultRouteExists(netList: [Network]) -> Bool { + for net in netList { + if net.allowDefault { + return true + } + } + + return false +} diff --git a/ZeroTier One/NetworkInfoCell.swift b/ZeroTier One/NetworkInfoCell.swift index c31fcb91..427bdc84 100644 --- a/ZeroTier One/NetworkInfoCell.swift +++ b/ZeroTier One/NetworkInfoCell.swift @@ -24,6 +24,10 @@ class NetworkInfoCell: NSTableCellView { @IBOutlet var deviceField: NSTextField! @IBOutlet var addressesField: NSTextField! + @IBOutlet var allowManaged: NSButton! + @IBOutlet var allowGlobal: NSButton! + @IBOutlet var allowDefault: NSButton! + @IBOutlet var connectedCheckbox: NSButton! @IBOutlet var deleteButton: NSButton! diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index e8b9e332..250cc73a 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -77,6 +77,23 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable cell.deviceField.stringValue = network.portDeviceName + if network.allowDefault { + cell.allowDefault.state = NSOnState + } + else { + cell.allowDefault.state = NSOffState + + if defaultRouteExists(networkList) { + cell.allowDefault.enabled = false + } + else { + cell.allowDefault.enabled = true + } + } + + cell.allowGlobal.state = (network.allowGlobal ? NSOnState : NSOffState) + cell.allowManaged.state = (network.allowManaged ? NSOnState : NSOffState) + cell.addressesField.stringValue = "" for nw in network.assignedAddresses { diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 69120fc9..74582eb6 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -16,13 +16,13 @@ - + - + @@ -43,83 +43,75 @@ - + - - - - - - - - - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -127,143 +119,203 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 1756e8b0f2bb5a322f38f5e0e079d27cfcfecd57 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sun, 26 Jun 2016 17:33:46 -0700 Subject: Wire up checkboxes for allowGlobal, allowDefault, allowManaged to set the proper state in zerotier daemon checkboxes are disabled if the network is not currently connected. --- ZeroTier One/NetworkInfoCell.swift | 13 ++++++++----- ZeroTier One/ShowNetworksViewController.swift | 8 ++++++++ ZeroTier One/ShowNetworksViewController.xib | 9 +++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/ZeroTier One/NetworkInfoCell.swift b/ZeroTier One/NetworkInfoCell.swift index 427bdc84..12e71948 100644 --- a/ZeroTier One/NetworkInfoCell.swift +++ b/ZeroTier One/NetworkInfoCell.swift @@ -42,14 +42,10 @@ class NetworkInfoCell: NSTableCellView { } @IBAction func onConnectCheckStateChanged(sender: NSButton) { - NSLog("Checked State Changed") - if(sender.state == NSOnState) { - NSLog("Checked") joinNetwork(networkIdField.stringValue) } else { - NSLog("Unchecked") leaveNetwork(networkIdField.stringValue) } } @@ -60,10 +56,17 @@ class NetworkInfoCell: NSTableCellView { } func joinNetwork(nwid: String) { - ServiceCom.joinNetwork(nwid) + ServiceCom.joinNetwork(nwid, + allowManaged: allowManaged.state == NSOnState, + allowGlobal: allowGlobal.state == NSOnState, + allowDefault: !defaultRouteExists(parent.networkList) && (allowDefault.state == NSOnState)) } func leaveNetwork(nwid: String) { ServiceCom.leaveNetwork(nwid) } + + @IBAction func onAllowStatusChanged(sender: NSButton) { + joinNetwork(networkIdField.stringValue) + } } diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 250cc73a..e2bdd105 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -103,9 +103,17 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable 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 diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 74582eb6..1535c668 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -168,6 +168,9 @@ + + + -- cgit v1.2.3 From 3fc11e2278a5e88ebc4ec3150fda050959e0c446 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sun, 26 Jun 2016 18:18:59 -0700 Subject: 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 | 43 ++++++++++++++++++--------- ZeroTier One/ShowNetworksViewController.swift | 28 +++++++++-------- 6 files changed, 53 insertions(+), 29 deletions(-) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index e52b7be5..25c11229 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 cef30d4e..ecab8f6c 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 187af008..338d35ee 100644 --- a/ZeroTier One/JoinNetworkViewController.xib +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -62,7 +62,7 @@ + + -- cgit v1.2.3 From ba0a45365c985a8a54b3d10a2942293ef5bb8148 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 30 Jun 2016 19:42:23 -0700 Subject: Work around for several strange corner cases in Automatic Reference Counting in Apple's runtime --- ZeroTier One/LaunchAtLoginController.m | 2 +- ZeroTier One/Network.swift | 13 ++++++++++--- ZeroTier One/NetworkMonitor.swift | 7 ++++++- ZeroTier One/ServiceCom.swift | 3 +-- ZeroTier One/ShowNetworksViewController.swift | 3 +-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/ZeroTier One/LaunchAtLoginController.m b/ZeroTier One/LaunchAtLoginController.m index f8aaafa0..53eb2b08 100644 --- a/ZeroTier One/LaunchAtLoginController.m +++ b/ZeroTier One/LaunchAtLoginController.m @@ -69,7 +69,7 @@ void sharedFileListDidChange(LSSharedFileListRef inList, void *context) if (wantedURL == NULL || fileList == NULL) return NULL; - NSArray *listSnapshot = (__bridge NSArray*)LSSharedFileListCopySnapshot(fileList, NULL); + NSArray *listSnapshot = (__bridge_transfer NSArray*)LSSharedFileListCopySnapshot(fileList, NULL); for (id itemObject in listSnapshot) { LSSharedFileListItemRef item = (__bridge LSSharedFileListItemRef) itemObject; UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes; diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift index b5f6b423..45151686 100644 --- a/ZeroTier One/Network.swift +++ b/ZeroTier One/Network.swift @@ -177,7 +177,11 @@ class Network: NSObject, NSCoding { required init?(coder aDecoder: NSCoder) { if aDecoder.containsValueForKey(PropertyKeys.addressesKey) { - self.assignedAddresses = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String] + let addrs = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String] + + for a in addrs { + self.assignedAddresses.append(a) + } } if aDecoder.containsValueForKey(PropertyKeys.bridgeKey) { @@ -193,7 +197,8 @@ class Network: NSObject, NSCoding { } if aDecoder.containsValueForKey(PropertyKeys.macKey) { - self.mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String + let mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String + self.mac = mac } if aDecoder.containsValueForKey(PropertyKeys.mtuKey) { @@ -201,7 +206,9 @@ class Network: NSObject, NSCoding { } if aDecoder.containsValueForKey(PropertyKeys.nameKey) { - self.name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String + let name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String + + self.name = name } if aDecoder.containsValueForKey(PropertyKeys.netconfKey) { diff --git a/ZeroTier One/NetworkMonitor.swift b/ZeroTier One/NetworkMonitor.swift index d6ab55ee..c81ac47d 100644 --- a/ZeroTier One/NetworkMonitor.swift +++ b/ZeroTier One/NetworkMonitor.swift @@ -42,8 +42,13 @@ class NetworkMonitor: NSObject { let filePath = dataFile() if NSFileManager.defaultManager().fileExistsAtPath(filePath) { - self.savedNetworks = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] + let networks = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network] + self.savedNetworks.removeAll() + + for n in networks { + self.savedNetworks.append(n) + } } ServiceCom.getNetworkList() { (networkList) -> Void in diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index 4c920ad2..2a98ec36 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -161,9 +161,8 @@ class ServiceCom: NSObject { static func leaveNetwork(network: String) { let urlString = baseURL + "/network/\(network)?auth=\(ServiceCom.getKey())" - let url = NSURL(string: urlString) - if let u = url { + if let u = NSURL(string: urlString) { let request = NSMutableURLRequest(URL: u) request.HTTPMethod = "DELETE" diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index cb017075..394a6bdc 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -112,8 +112,7 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable cell.addressesField.stringValue = "" for nw in network.assignedAddresses { - cell.addressesField.stringValue += nw - cell.addressesField.stringValue += "\n" + cell.addressesField.stringValue += "\(nw)\n" } -- cgit v1.2.3 From d786c5265f5260528a7f461bcc0bbc3aa7c933c8 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 30 Jun 2016 19:46:59 -0700 Subject: bump version number --- ZeroTier One/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index ce6eb729..9c70406f 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 6 + 7 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement -- cgit v1.2.3 From e7476927276cc957dce6710357326bb71ca3f17f Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 30 Jun 2016 20:07:22 -0700 Subject: remove background from network details view --- ZeroTier One/ShowNetworksViewController.xib | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index 1535c668..91ce57cc 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -18,16 +18,16 @@ - - + + - + - - + + @@ -42,7 +42,7 @@ - + @@ -343,7 +343,7 @@ - +