ZeroTierOne/ZeroTier One/ServiceCom.swift
2016-05-31 13:50:43 -07:00

148 lines
4.5 KiB
Swift

//
// 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"
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.getKey())"
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()) as! [[String: AnyObject]]
var networks = [Network]()
for jobj in json {
networks.append(Network(jsonData: jobj))
}
completionHandler(networks)
}
catch {
}
}
}
task.resume()
}
else {
print("bad URL")
}
}
static func joinNetwork(network: String) {
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"
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.getKey())"
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()
}
}
}