Network.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. * ZeroTier One - Network Virtualization Everywhere
  3. * Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #import "Network.h"
  19. NSString *NetworkAddressesKey = @"addresses";
  20. NSString *NetworkBridgeKey = @"bridge";
  21. NSString *NetworkBroadcastKey = @"broadcast";
  22. NSString *NetworkDhcpKey = @"dhcp";
  23. NSString *NetworkMacKey = @"mac";
  24. NSString *NetworkMtuKey = @"mtu";
  25. NSString *NetworkMulticastKey = @"multicast";
  26. NSString *NetworkNameKey = @"name";
  27. NSString *NetworkNetconfKey = @"netconf";
  28. NSString *NetworkNwidKey = @"nwid";
  29. NSString *NetworkPortNameKey = @"port";
  30. NSString *NetworkPortErrorKey = @"portError";
  31. NSString *NetworkStatusKey = @"status";
  32. NSString *NetworkTypeKey = @"type";
  33. NSString *NetworkAllowManagedKey = @"allowManaged";
  34. NSString *NetworkAllowGlobalKey = @"allowGlobal";
  35. NSString *NetworkAllowDefaultKey = @"allowDefault";
  36. NSString *NetworkAllowDNSKey = @"allowDNS";
  37. @implementation Network
  38. - (id)initWithJsonData:(NSDictionary*)jsonData
  39. {
  40. self = [super init];
  41. if(self) {
  42. if([jsonData objectForKey:@"assignedAddresses"]) {
  43. _assignedAddresses = (NSArray<NSString*>*)[jsonData objectForKey:@"assignedAddresses"];
  44. }
  45. if([jsonData objectForKey:@"bridge"]) {
  46. _bridge = [(NSNumber*)[jsonData objectForKey:@"bridge"] boolValue];
  47. }
  48. if([jsonData objectForKey:@"broadcastEnabled"]) {
  49. _broadcastEnabled = [(NSNumber*)[jsonData objectForKey:@"broadcastEnabled"] boolValue];
  50. }
  51. if([jsonData objectForKey:@"dhcp"]) {
  52. _dhcp = [(NSNumber*)[jsonData objectForKey:@"dhcp"] boolValue];
  53. }
  54. if([jsonData objectForKey:@"mac"]) {
  55. _mac = (NSString*)[jsonData objectForKey:@"mac"];
  56. }
  57. if([jsonData objectForKey:@"mtu"]) {
  58. _mtu = [(NSNumber*)[jsonData objectForKey:@"mtu"] intValue];
  59. }
  60. if([jsonData objectForKey:@"name"]) {
  61. _name = (NSString*)[jsonData objectForKey:@"name"];
  62. }
  63. if([jsonData objectForKey:@"netconfRevision"]) {
  64. _netconfRevision = [(NSNumber*)[jsonData objectForKey:@"netconfRevision"] intValue];
  65. }
  66. if([jsonData objectForKey:@"nwid"]) {
  67. NSString *networkid = (NSString*)[jsonData objectForKey:@"nwid"];
  68. NSScanner *scanner = [NSScanner scannerWithString:networkid];
  69. [scanner scanHexLongLong:&_nwid];
  70. }
  71. if([jsonData objectForKey:@"portDeviceName"]) {
  72. _portDeviceName = (NSString*)[jsonData objectForKey:@"portDeviceName"];
  73. }
  74. if([jsonData objectForKey:@"portError"]) {
  75. _portError = [(NSNumber*)[jsonData objectForKey:@"portError"] intValue];
  76. }
  77. if([jsonData objectForKey:@"allowManaged"]) {
  78. _allowManaged = [(NSNumber*)[jsonData objectForKey:@"allowManaged"] boolValue];
  79. }
  80. if([jsonData objectForKey:@"allowGlobal"]) {
  81. _allowGlobal = [(NSNumber*)[jsonData objectForKey:@"allowGlobal"] boolValue];
  82. }
  83. if([jsonData objectForKey:@"allowDefault"]) {
  84. _allowDefault = [(NSNumber*)[jsonData objectForKey:@"allowDefault"] boolValue];
  85. }
  86. if([jsonData objectForKey:@"allowDNS"]) {
  87. _allowDNS = [(NSNumber*)[jsonData objectForKey:@"allowDNS"] boolValue];
  88. } else {
  89. _allowDNS = false;
  90. }
  91. if([jsonData objectForKey:@"status"]) {
  92. NSString *statusStr = (NSString*)[jsonData objectForKey:@"status"];
  93. if([statusStr isEqualToString:@"REQUESTING_CONFIGURATION"]) {
  94. _status = REQUESTING_CONFIGURATION;
  95. }
  96. else if([statusStr isEqualToString:@"OK"]) {
  97. _status = OK;
  98. }
  99. else if([statusStr isEqualToString:@"ACCESS_DENIED"]) {
  100. _status = ACCESS_DENIED;
  101. }
  102. else if([statusStr isEqualToString:@"NOT_FOUND"]) {
  103. _status = NOT_FOUND;
  104. }
  105. else if([statusStr isEqualToString:@"PORT_ERROR"]) {
  106. _status = PORT_ERROR;
  107. }
  108. else if([statusStr isEqualToString:@"CLIENT_TOO_OLD"]) {
  109. _status = CLIENT_TOO_OLD;
  110. }
  111. }
  112. if([jsonData objectForKey:@"type"]) {
  113. NSString *typeStr = (NSString*)[jsonData objectForKey:@"type"];
  114. if([typeStr isEqualToString:@"PRIVATE"]) {
  115. _type = PRIVATE;
  116. }
  117. else if([typeStr isEqualToString:@"PUBLIC"]) {
  118. _type = PUBLIC;
  119. }
  120. }
  121. _connected = YES;
  122. }
  123. return self;
  124. }
  125. - (id)initWithCoder:(NSCoder *)aDecoder
  126. {
  127. self = [super init];
  128. if(self) {
  129. if([aDecoder containsValueForKey:NetworkAddressesKey]) {
  130. _assignedAddresses = (NSArray<NSString*>*)[aDecoder decodeObjectForKey:NetworkAddressesKey];
  131. }
  132. if([aDecoder containsValueForKey:NetworkBridgeKey]) {
  133. _bridge = [aDecoder decodeBoolForKey:NetworkBridgeKey];
  134. }
  135. if([aDecoder containsValueForKey:NetworkBroadcastKey]) {
  136. _broadcastEnabled = [aDecoder decodeBoolForKey:NetworkBroadcastKey];
  137. }
  138. if([aDecoder containsValueForKey:NetworkDhcpKey]) {
  139. _dhcp = [aDecoder decodeBoolForKey:NetworkDhcpKey];
  140. }
  141. if([aDecoder containsValueForKey:NetworkMacKey]) {
  142. _mac = (NSString*)[aDecoder decodeObjectForKey:NetworkMacKey];
  143. }
  144. if([aDecoder containsValueForKey:NetworkMtuKey]) {
  145. _mtu = (int)[aDecoder decodeIntegerForKey:NetworkMtuKey];
  146. }
  147. if([aDecoder containsValueForKey:NetworkNameKey]) {
  148. _name = (NSString*)[aDecoder decodeObjectForKey:NetworkNameKey];
  149. }
  150. if([aDecoder containsValueForKey:NetworkNetconfKey]) {
  151. _netconfRevision = (int)[aDecoder decodeIntegerForKey:NetworkNetconfKey];
  152. }
  153. if([aDecoder containsValueForKey:NetworkNwidKey]) {
  154. _nwid = [(NSNumber*)[aDecoder decodeObjectForKey:NetworkNwidKey] unsignedLongLongValue];
  155. }
  156. if([aDecoder containsValueForKey:NetworkPortNameKey]) {
  157. _portDeviceName = (NSString*)[aDecoder decodeObjectForKey:NetworkPortNameKey];
  158. }
  159. if([aDecoder containsValueForKey:NetworkPortErrorKey]) {
  160. _portError = (int)[aDecoder decodeIntegerForKey:NetworkPortErrorKey];
  161. }
  162. if([aDecoder containsValueForKey:NetworkStatusKey]) {
  163. _status = (enum NetworkStatus)[aDecoder decodeIntegerForKey:NetworkStatusKey];
  164. }
  165. if([aDecoder containsValueForKey:NetworkTypeKey]) {
  166. _type = (enum NetworkType)[aDecoder decodeIntegerForKey:NetworkTypeKey];
  167. }
  168. if([aDecoder containsValueForKey:NetworkAllowManagedKey]) {
  169. _allowManaged = [aDecoder decodeBoolForKey:NetworkAllowManagedKey];
  170. }
  171. if([aDecoder containsValueForKey:NetworkAllowGlobalKey]) {
  172. _allowGlobal = [aDecoder decodeBoolForKey:NetworkAllowGlobalKey];
  173. }
  174. if([aDecoder containsValueForKey:NetworkAllowDefaultKey]) {
  175. _allowDefault = [aDecoder decodeBoolForKey:NetworkAllowDefaultKey];
  176. }
  177. if([aDecoder containsValueForKey:NetworkAllowDNSKey]) {
  178. _allowDNS = [aDecoder decodeBoolForKey:NetworkAllowDNSKey];
  179. } else {
  180. _allowDNS = false;
  181. }
  182. _connected = NO;
  183. }
  184. return self;
  185. }
  186. - (void)encodeWithCoder:(NSCoder *)aCoder
  187. {
  188. [aCoder encodeObject:_assignedAddresses forKey:NetworkAddressesKey];
  189. [aCoder encodeBool:_bridge forKey:NetworkBridgeKey];
  190. [aCoder encodeBool:_broadcastEnabled forKey:NetworkBroadcastKey];
  191. [aCoder encodeBool:_dhcp forKey:NetworkDhcpKey];
  192. [aCoder encodeObject:_mac forKey:NetworkMacKey];
  193. [aCoder encodeInteger:_mtu forKey:NetworkMtuKey];
  194. [aCoder encodeObject:_name forKey:NetworkNameKey];
  195. [aCoder encodeInteger:_netconfRevision forKey:NetworkNetconfKey];
  196. [aCoder encodeObject:[NSNumber numberWithUnsignedLongLong:_nwid]
  197. forKey:NetworkNwidKey];
  198. [aCoder encodeObject:_portDeviceName forKey:NetworkPortNameKey];
  199. [aCoder encodeInteger:_portError forKey:NetworkPortErrorKey];
  200. [aCoder encodeInteger:_status forKey:NetworkStatusKey];
  201. [aCoder encodeInteger:_type forKey:NetworkTypeKey];
  202. [aCoder encodeBool:_allowManaged forKey:NetworkAllowManagedKey];
  203. [aCoder encodeBool:_allowGlobal forKey:NetworkAllowGlobalKey];
  204. [aCoder encodeBool:_allowDefault forKey:NetworkAllowDefaultKey];
  205. [aCoder encodeBool:_allowDNS forKey:NetworkAllowDNSKey];
  206. }
  207. + (BOOL)defaultRouteExists:(NSArray<Network *>*)netList
  208. {
  209. for(Network *net in netList) {
  210. if (net.allowDefault && net.connected) {
  211. return YES;
  212. }
  213. }
  214. return NO;
  215. }
  216. - (NSString*)statusString {
  217. switch(_status) {
  218. case REQUESTING_CONFIGURATION:
  219. return @"REQUESTING_CONFIGURATION";
  220. case OK:
  221. return @"OK";
  222. case ACCESS_DENIED:
  223. return @"ACCESS_DENIED";
  224. case NOT_FOUND:
  225. return @"NOT_FOUND";
  226. case PORT_ERROR:
  227. return @"PORT_ERROR";
  228. case CLIENT_TOO_OLD:
  229. return @"CLIENT_TOO_OLD";
  230. default:
  231. return @"";
  232. }
  233. }
  234. - (NSString*)typeString {
  235. switch(_type) {
  236. case PUBLIC:
  237. return @"PUBLIC";
  238. case PRIVATE:
  239. return @"PRIVATE";
  240. default:
  241. return @"";
  242. }
  243. }
  244. - (BOOL)hasSameNetworkId:(UInt64)networkId
  245. {
  246. return self.nwid == networkId;
  247. }
  248. - (BOOL)isEqualToNetwork:(Network*)network
  249. {
  250. return [self.assignedAddresses isEqualToArray:network.assignedAddresses] &&
  251. self.bridge == network.bridge &&
  252. self.broadcastEnabled == network.broadcastEnabled &&
  253. self.dhcp == network.dhcp &&
  254. [self.mac isEqualToString:network.mac] &&
  255. self.mtu == network.mtu &&
  256. self.netconfRevision == network.netconfRevision &&
  257. [self.name isEqualToString:network.name] &&
  258. self.nwid == network.nwid &&
  259. [self.portDeviceName isEqualToString:network.portDeviceName] &&
  260. self.status == network.status &&
  261. self.type == network.type &&
  262. self.allowManaged == network.allowManaged &&
  263. self.allowGlobal == network.allowGlobal &&
  264. self.allowDefault == network.allowDefault &&
  265. self.allowDNS == network.allowDNS &&
  266. self.connected == network.connected;
  267. }
  268. - (BOOL)isEqual:(id)object
  269. {
  270. if (self == object) {
  271. return YES;
  272. }
  273. if (![object isKindOfClass:[Network class]]) {
  274. return NO;
  275. }
  276. return [self isEqualToNetwork:object];
  277. }
  278. - (NSUInteger)hash
  279. {
  280. return [self.assignedAddresses hash] ^
  281. self.bridge ^
  282. self.broadcastEnabled ^
  283. self.dhcp ^
  284. [self.mac hash] ^
  285. self.mtu ^
  286. self.netconfRevision ^
  287. [self.name hash] ^
  288. self.nwid ^
  289. [self.portDeviceName hash] ^
  290. self.portError ^
  291. self.status ^
  292. self.type ^
  293. self.allowManaged ^
  294. self.allowGlobal ^
  295. self.allowDefault ^
  296. self.allowDNS ^
  297. self.connected;
  298. }
  299. @end