-
Notifications
You must be signed in to change notification settings - Fork 32
/
VPNInterfacer.m
149 lines (109 loc) · 3.99 KB
/
VPNInterfacer.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//
// VPNInterfacer.m
// Sidestep
//
// Created by Chetan Surpur on 12/6/10.
// Copyright 2010 Chetan Surpur. All rights reserved.
//
#import "VPNInterfacer.h"
#import "AppUtilities.h"
@implementation VPNInterfacer
/*
* Gets a list of VPN services that have been configured in System Preferences > Network.
*
* return: (NSArray *)services on success
* return: nil if task path not found
*/
- (NSArray *)getListOfVPNServices {
XLog(self, @"Getting list of VPN services");
NSTask *task = [[[NSTask alloc] init] autorelease];
// Setup the pipes on the task
NSPipe *outputPipe = [NSPipe pipe];
NSPipe *errorPipe = [NSPipe pipe];
[task setStandardOutput:outputPipe];
[task setStandardInput:[NSFileHandle fileHandleWithNullDevice]];
[task setStandardError:errorPipe];
// Get the path of the task, which is included as part of the main application bundle
NSString *taskPath = [NSBundle pathForResource:@"GetListOfVPNServices"
ofType:@"sh"
inDirectory:[[NSBundle mainBundle] bundlePath]];
if (!taskPath) {
return nil;
}
// Set task's launch path
[task setLaunchPath:taskPath];
// Before launching the task, get a filehandle for reading its output
NSFileHandle *readHandle = [[task standardOutput] fileHandleForReading];
// Launch task
[task launch];
// Read task's output data
NSData *readData;
while ((readData = [readHandle availableData]) && [readData length]) {
NSString *readString = [[NSString alloc] initWithData:readData encoding:NSASCIIStringEncoding];
XLog(self, @"Get list of VPN services said: %@", readString);
// Return values of Get List Of VPN Services:
// Comma-seperated list of service names
NSString *csvList = [readString stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
XLog(self, @"Comma-separated list of VPN services: %@", csvList);
if ([csvList isEqualToString:@""]) {
XLog(self, @"No services found.");
return [NSArray arrayWithObjects:nil];
}
else {
return [csvList componentsSeparatedByString:@", "];
}
}
// If we get this far, that means the task didn't output anything for some reason.
// Return empty array.
return [NSArray arrayWithObjects:nil];
}
/*
* Turns on or off the VPN connection for the service name given.
*
* return: result code on success
* return: 0 task path not found
*/
- (BOOL)turnVPNOnOrOff:(NSString *)serviceName withState:(BOOL)state {
XLog(self, @"Turning VPN on with service name: %@", serviceName);
NSTask *task = [[[NSTask alloc] init] autorelease];
// Setup the pipes on the task
NSPipe *outputPipe = [NSPipe pipe];
NSPipe *errorPipe = [NSPipe pipe];
[task setStandardOutput:outputPipe];
[task setStandardInput:[NSFileHandle fileHandleWithNullDevice]];
[task setStandardError:errorPipe];
// Set up arguments to the task
NSArray *args = [NSArray arrayWithObjects: [NSString stringWithString:serviceName],
[NSString stringWithFormat:@"%d", state],
nil];
// Get the path of the task, which is included as part of the main application bundle
NSString *taskPath = [NSBundle pathForResource:@"TurnVPNOnOrOff"
ofType:@"sh"
inDirectory:[[NSBundle mainBundle] bundlePath]];
if (!taskPath) {
return 0;
}
// Set task's arguments and launch path
[task setArguments:args];
[task setLaunchPath:taskPath];
// Before launching the task, get a filehandle for reading its output
NSFileHandle *readHandle = [[task standardOutput] fileHandleForReading];
// Launch task
[task launch];
// Read task's output data
NSData *readData;
int result = 0;
while ((readData = [readHandle availableData]) && [readData length]) {
NSString *readString = [[NSString alloc] initWithData:readData encoding:NSASCIIStringEncoding];
XLog(self, @"Turn VPN On said: %@", readString);
// Return values of Turn VPN On:
// 1 - Success
// 2 - No such service
// 3 - Service found was not of type VPN
if (![readString isEqualToString:@"\n"]) {
result = [readString intValue];
}
}
return result;
}
@end