| | 1152 | |
|---|
| | 1153 | /* Network Methods */ |
|---|
| | 1154 | /* Firewall Port Tableview Delegates */ |
|---|
| | 1155 | |
|---|
| | 1156 | - (int)numberOfRowsInTableView:(NSTableView *)tableView |
|---|
| | 1157 | { |
|---|
| | 1158 | return [firewallPortList count]; |
|---|
| | 1159 | } |
|---|
| | 1160 | |
|---|
| | 1161 | - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row |
|---|
| | 1162 | { |
|---|
| | 1163 | id thisPort; |
|---|
| | 1164 | thisPort = [firewallPortList objectAtIndex:row]; |
|---|
| | 1165 | |
|---|
| | 1166 | if ([[tableColumn identifier] isEqualToString:@"status"]) { |
|---|
| | 1167 | return [thisPort objectForKey:@"Enabled"]; |
|---|
| | 1168 | } else if ([[tableColumn identifier] isEqualToString:@"name"]) { |
|---|
| | 1169 | return [thisPort objectForKey:@"Name"]; |
|---|
| | 1170 | } else { |
|---|
| | 1171 | return @""; |
|---|
| | 1172 | } |
|---|
| | 1173 | return nil; |
|---|
| | 1174 | } |
|---|
| | 1175 | |
|---|
| | 1176 | - (void) disableTableView:(BOOL)disable |
|---|
| | 1177 | { |
|---|
| | 1178 | NSEnumerator * ec = [[firewallPortTable tableColumns] objectEnumerator]; |
|---|
| | 1179 | NSTableColumn * curColumn; |
|---|
| | 1180 | NSColor * textColor = nil; |
|---|
| | 1181 | NSColor * backgroundColor = nil; |
|---|
| | 1182 | |
|---|
| | 1183 | if(disable) { |
|---|
| | 1184 | textColor = [NSColor colorWithCalibratedWhite:0.50 alpha:1.0]; |
|---|
| | 1185 | backgroundColor = [NSColor colorWithCalibratedWhite:0.94 alpha:1.0]; |
|---|
| | 1186 | firewallPortTableEnabled = NO; |
|---|
| | 1187 | } else { |
|---|
| | 1188 | textColor = [NSColor blackColor]; |
|---|
| | 1189 | backgroundColor = [NSColor colorWithCalibratedWhite:0.94 alpha:1.0]; |
|---|
| | 1190 | firewallPortTableEnabled = YES; |
|---|
| | 1191 | } |
|---|
| | 1192 | |
|---|
| | 1193 | while ((curColumn = [ec nextObject])) { |
|---|
| | 1194 | if([[curColumn dataCell] isKindOfClass:[NSTextFieldCell class]]) { |
|---|
| | 1195 | [[curColumn dataCell] setTextColor:textColor]; |
|---|
| | 1196 | [[curColumn dataCell] setBackgroundColor:backgroundColor]; |
|---|
| | 1197 | } |
|---|
| | 1198 | } |
|---|
| | 1199 | |
|---|
| | 1200 | if([[firewallPortTable enclosingScrollView] hasVerticalScroller]) |
|---|
| | 1201 | [[[firewallPortTable enclosingScrollView] verticalScroller] setEnabled:!disable]; |
|---|
| | 1202 | |
|---|
| | 1203 | //if([[table enclosingScrollView] hasHorizontalScroller]) |
|---|
| | 1204 | //[[[table enclosingScrollView] horizontalScroller] setEnabled:(bEnable && saveHorizontalScrollerEnabled)]; |
|---|
| | 1205 | } |
|---|
| | 1206 | |
|---|
| | 1207 | #pragma mark Table Delegate Methods needed for the disableTableView method |
|---|
| | 1208 | |
|---|
| | 1209 | - (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView |
|---|
| | 1210 | { |
|---|
| | 1211 | return firewallPortTableEnabled; |
|---|
| | 1212 | } |
|---|
| | 1213 | |
|---|
| | 1214 | - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex |
|---|
| | 1215 | { |
|---|
| | 1216 | return firewallPortTableEnabled; |
|---|
| | 1217 | } |
|---|
| | 1218 | |
|---|
| | 1219 | - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex |
|---|
| | 1220 | { |
|---|
| | 1221 | return firewallPortTableEnabled; |
|---|
| | 1222 | } |
|---|
| | 1223 | |
|---|
| | 1224 | - (BOOL)tableView:(NSTableView *)aTableView shouldSelectTableColumn:(NSTableColumn *)aTableColumn |
|---|
| | 1225 | { |
|---|
| | 1226 | return firewallPortTableEnabled; |
|---|
| | 1227 | } |
|---|
| | 1228 | |
|---|
| | 1229 | // for setting the checkbox status to the configuration file |
|---|
| | 1230 | - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)theValue forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex |
|---|
| | 1231 | { |
|---|
| | 1232 | if([[aTableColumn identifier] isEqualToString:@"status"]) { |
|---|
| | 1233 | // set the new "enabled" status in firewallPortList |
|---|
| | 1234 | [[firewallPortList objectAtIndex:rowIndex] setObject:theValue forKey:@"Enabled"]; |
|---|
| | 1235 | // calls table reloadData automatically |
|---|
| | 1236 | } |
|---|
| | 1237 | } |
|---|
| | 1238 | |
|---|
| | 1239 | - (void)initFirewallSettings |
|---|
| | 1240 | { |
|---|
| | 1241 | firewallPortTableEnabled = YES; |
|---|
| | 1242 | if(firewallPortList == nil) { |
|---|
| | 1243 | firewallPortList = [[[NSMutableArray alloc] init] retain]; |
|---|
| | 1244 | } else { |
|---|
| | 1245 | [firewallPortList removeAllObjects]; |
|---|
| | 1246 | } |
|---|
| | 1247 | // load defaults into array |
|---|
| | 1248 | NSArray * firewallDefaults = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]]; |
|---|
| | 1249 | NSMutableArray * tempArray = [NSMutableArray arrayWithCapacity:5]; |
|---|
| | 1250 | [firewallPortList addObjectsFromArray:firewallDefaults]; |
|---|
| | 1251 | // load customs from thisPC |
|---|
| | 1252 | if([[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"]) { |
|---|
| | 1253 | // enumerate through entries and check for defaults |
|---|
| | 1254 | int i; |
|---|
| | 1255 | int ii; |
|---|
| | 1256 | int found = 0; |
|---|
| | 1257 | for(i=0; i<[[[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"] count]; i++) { |
|---|
| | 1258 | for(ii=0; ii<[firewallPortList count]; ii++) { |
|---|
| | 1259 | if([[[[[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"] objectAtIndex:i] objectForKey:@"Name"] isEqualTo:[[firewallDefaults objectAtIndex:ii] objectForKey:@"Name"]]) { |
|---|
| | 1260 | // found equal entry in customs, set enabled status in firewallPortList |
|---|
| | 1261 | [[firewallPortList objectAtIndex:ii] setObject:[NSNumber numberWithBool:YES] forKey:@"Enabled"]; |
|---|
| | 1262 | found = 1; |
|---|
| | 1263 | } |
|---|
| | 1264 | } |
|---|
| | 1265 | // check if previously found |
|---|
| | 1266 | if(found == 0) { |
|---|
| | 1267 | // not found, add entry to firewallPortList |
|---|
| | 1268 | [tempArray addObject:[[[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"] objectAtIndex:i]]; |
|---|
| | 1269 | } |
|---|
| | 1270 | found = 0; |
|---|
| | 1271 | } |
|---|
| | 1272 | if([tempArray count] > 0) [firewallPortList addObjectsFromArray:tempArray]; |
|---|
| | 1273 | } |
|---|
| | 1274 | |
|---|
| | 1275 | // load additionals into additional selector |
|---|
| | 1276 | NSArray * firewallAdditionalServices = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; |
|---|
| | 1277 | |
|---|
| | 1278 | int i; |
|---|
| | 1279 | [popUpButtonFirewallAdditionalPorts removeAllItems]; |
|---|
| | 1280 | for(i=0; i<[firewallAdditionalServices count]; i++) { |
|---|
| | 1281 | [popUpButtonFirewallAdditionalPorts addItemWithTitle:[[firewallAdditionalServices objectAtIndex:i] valueForKey:@"Name"]]; |
|---|
| | 1282 | } |
|---|
| | 1283 | [[popUpButtonFirewallAdditionalPorts menu] addItem:[NSMenuItem separatorItem]]; |
|---|
| | 1284 | [popUpButtonFirewallAdditionalPorts addItemWithTitle:@"Custom.."]; |
|---|
| | 1285 | [popUpButtonFirewallAdditionalPorts selectItemAtIndex:0]; |
|---|
| | 1286 | } |
|---|
| | 1287 | |
|---|
| | 1288 | - (IBAction) showFirewallPortList:(id)sender |
|---|
| | 1289 | { |
|---|
| | 1290 | [firewallPortTable reloadData]; |
|---|
| | 1291 | [firewallPortTable selectRow:0 byExtendingSelection:NO]; |
|---|
| | 1292 | |
|---|
| | 1293 | [NSApp beginSheet:firewallPortPanel |
|---|
| | 1294 | modalForWindow:editPCPanel |
|---|
| | 1295 | modalDelegate:self |
|---|
| | 1296 | didEndSelector:nil |
|---|
| | 1297 | contextInfo:nil]; |
|---|
| | 1298 | } |
|---|
| | 1299 | |
|---|
| | 1300 | - (IBAction) startShowNewPort:(id)sender |
|---|
| | 1301 | { |
|---|
| | 1302 | [self startEditPort:YES]; |
|---|
| | 1303 | } |
|---|
| | 1304 | - (IBAction) startShowEditPort:(id)sender |
|---|
| | 1305 | { |
|---|
| | 1306 | int restrictedPort = 0; |
|---|
| | 1307 | NSArray * additionalPorts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; |
|---|
| | 1308 | if([firewallPortTable selectedRow] >= 0) { |
|---|
| | 1309 | int i; |
|---|
| | 1310 | for(i=0; i<=[additionalPorts count]-1; i++) { |
|---|
| | 1311 | if([[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] objectForKey:@"Name"] isEqualTo:[[additionalPorts objectAtIndex:i] objectForKey:@"Name"]]) { |
|---|
| | 1312 | restrictedPort = 1; |
|---|
| | 1313 | } |
|---|
| | 1314 | } |
|---|
| | 1315 | if([firewallPortTable selectedRow] >= 0 && [firewallPortTable selectedRow] < [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]] count]) { |
|---|
| | 1316 | restrictedPort = 1; |
|---|
| | 1317 | } |
|---|
| | 1318 | if(restrictedPort == 1) { |
|---|
| | 1319 | NSString * redirectedPorts; |
|---|
| | 1320 | if(![[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""] && ![[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1321 | // tcp and udp |
|---|
| | 1322 | redirectedPorts = [NSString stringWithFormat:@"%@,%@ on the Host to port(s) %@,%@ on the Guest (TCP and UDP).", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Guest"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Guest"]]; |
|---|
| | 1323 | } else if (![[[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1324 | // tcp only |
|---|
| | 1325 | redirectedPorts = [NSString stringWithFormat:@"%@ on the Host to port(s) %@ on the Guest (TCP).", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"TCP-Ports-Guest"]]; |
|---|
| | 1326 | } else { |
|---|
| | 1327 | // udp only |
|---|
| | 1328 | redirectedPorts = [NSString stringWithFormat:@"%@ on the Host to port(s) %@ on the Guest (UDP).", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Host"], [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"UDP-Ports-Guest"]]; |
|---|
| | 1329 | } |
|---|
| | 1330 | |
|---|
| | 1331 | NSAlert *alert = [NSAlert alertWithMessageText:@"This service cannot be edited!" |
|---|
| | 1332 | defaultButton:@"OK" |
|---|
| | 1333 | alternateButton:nil |
|---|
| | 1334 | otherButton:nil |
|---|
| | 1335 | informativeTextWithFormat:[NSString stringWithFormat:@"%@ redirects incoming connections from port(s) %@", [[firewallPortList objectAtIndex:[firewallPortTable selectedRow]] valueForKey:@"Name"], redirectedPorts]]; |
|---|
| | 1336 | |
|---|
| | 1337 | [alert runModal]; |
|---|
| | 1338 | } else { |
|---|
| | 1339 | [self startEditPort:NO]; |
|---|
| | 1340 | } |
|---|
| | 1341 | } |
|---|
| | 1342 | } |
|---|
| | 1343 | |
|---|
| | 1344 | - (void) startEditPort:(BOOL)newPort |
|---|
| | 1345 | { |
|---|
| | 1346 | [firewallPortPanel setFrame:NSMakeRect( |
|---|
| | 1347 | [firewallPortPanel frame].origin.x, |
|---|
| | 1348 | [firewallPortPanel frame].origin.y - 263, |
|---|
| | 1349 | [firewallPortPanel frame].size.width, |
|---|
| | 1350 | [firewallPortPanel frame].size.height + 263 |
|---|
| | 1351 | ) display:YES animate:YES]; |
|---|
| | 1352 | |
|---|
| | 1353 | // disable new,edit,delete,ok,tableview |
|---|
| | 1354 | [buttonFirewallNewPort setEnabled:NO]; |
|---|
| | 1355 | [buttonFirewallEditPort setEnabled:NO]; |
|---|
| | 1356 | [buttonFirewallDeletePort setEnabled:NO]; |
|---|
| | 1357 | [buttonFirewallOk setKeyEquivalent:@""]; |
|---|
| | 1358 | [buttonFirewallOk setEnabled:NO]; |
|---|
| | 1359 | [self disableTableView:YES]; |
|---|
| | 1360 | |
|---|
| | 1361 | [buttonFirewallSavePort setKeyEquivalent:@"\r"]; |
|---|
| | 1362 | |
|---|
| | 1363 | if(newPort) { |
|---|
| | 1364 | // called to create a new port |
|---|
| | 1365 | [textFieldFirewallPortName setStringValue:@""]; |
|---|
| | 1366 | [popUpButtonFirewallServiceType selectItemAtIndex:0]; |
|---|
| | 1367 | [textFieldFirewallPortHostPorts setStringValue:@""]; |
|---|
| | 1368 | [textFieldFirewallPortGuestPorts setStringValue:@""]; |
|---|
| | 1369 | |
|---|
| | 1370 | [popUpButtonFirewallAdditionalPorts selectItemAtIndex:0]; |
|---|
| | 1371 | [self setAdditionalPort:self]; |
|---|
| | 1372 | [buttonFirewallSavePort setTarget:self]; |
|---|
| | 1373 | [buttonFirewallSavePort setAction:@selector(saveNewPort:)]; |
|---|
| | 1374 | } else { |
|---|
| | 1375 | // called to edit a port |
|---|
| | 1376 | [buttonFirewallSavePort setTarget:self]; |
|---|
| | 1377 | [buttonFirewallSavePort setAction:@selector(saveEditPort:)]; |
|---|
| | 1378 | [popUpButtonFirewallAdditionalPorts selectItemWithTitle:@"Custom.."]; |
|---|
| | 1379 | // load port info from list |
|---|
| | 1380 | int selectedPort = [firewallPortTable selectedRow]; |
|---|
| | 1381 | |
|---|
| | 1382 | [textFieldFirewallPortName setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"Name"]]; |
|---|
| | 1383 | if(![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""] && ![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1384 | [popUpButtonFirewallServiceType selectItemAtIndex:2]; |
|---|
| | 1385 | [textFieldFirewallPortHostPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"]]; |
|---|
| | 1386 | [textFieldFirewallPortGuestPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Guest"]]; |
|---|
| | 1387 | } else if(![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1388 | [popUpButtonFirewallServiceType selectItemAtIndex:0]; |
|---|
| | 1389 | [textFieldFirewallPortHostPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Host"]]; |
|---|
| | 1390 | [textFieldFirewallPortGuestPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"TCP-Ports-Guest"]]; |
|---|
| | 1391 | } else if(![[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1392 | [popUpButtonFirewallServiceType selectItemAtIndex:1]; |
|---|
| | 1393 | [textFieldFirewallPortHostPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Host"]]; |
|---|
| | 1394 | [textFieldFirewallPortGuestPorts setStringValue:[[firewallPortList objectAtIndex:selectedPort] valueForKey:@"UDP-Ports-Guest"]]; |
|---|
| | 1395 | } |
|---|
| | 1396 | } |
|---|
| | 1397 | } |
|---|
| | 1398 | |
|---|
| | 1399 | - (IBAction) deletePort:(id)sender |
|---|
| | 1400 | { |
|---|
| | 1401 | // check if port is a default port |
|---|
| | 1402 | if([firewallPortTable selectedRow] >= 0 && [firewallPortTable selectedRow] < [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]] count]) { |
|---|
| | 1403 | NSAlert *alert = [NSAlert alertWithMessageText:@"This service cannot be deleted!" |
|---|
| | 1404 | defaultButton:@"OK" |
|---|
| | 1405 | alternateButton:nil |
|---|
| | 1406 | otherButton:nil |
|---|
| | 1407 | informativeTextWithFormat:@"To disable this service from being redirected use the corresponding checkbox."]; |
|---|
| | 1408 | |
|---|
| | 1409 | [alert runModal]; |
|---|
| | 1410 | } else { |
|---|
| | 1411 | // delete |
|---|
| | 1412 | [firewallPortList removeObjectAtIndex:[firewallPortTable selectedRow]]; |
|---|
| | 1413 | [firewallPortTable reloadData]; |
|---|
| | 1414 | } |
|---|
| | 1415 | } |
|---|
| | 1416 | |
|---|
| | 1417 | - (IBAction) setAdditionalPort:(id)sender |
|---|
| | 1418 | { |
|---|
| | 1419 | // load data from fw-additionals.plist |
|---|
| | 1420 | if ([popUpButtonFirewallAdditionalPorts indexOfSelectedItem] <= ([popUpButtonFirewallAdditionalPorts numberOfItems] - 3)) { |
|---|
| | 1421 | // only sets from fw-additionals are loaded here.. |
|---|
| | 1422 | NSArray * additionalPorts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; |
|---|
| | 1423 | |
|---|
| | 1424 | [textFieldFirewallPortName setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"Name"]]; |
|---|
| | 1425 | if(![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""] && ![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1426 | // tcp and udp |
|---|
| | 1427 | // add both type's ports, if set is saved we load it directly from fw-additionals because of possible duplicates |
|---|
| | 1428 | [popUpButtonFirewallServiceType selectItemAtIndex:2]; |
|---|
| | 1429 | [textFieldFirewallPortHostPorts setStringValue:[NSString stringWithFormat:@"%@,%@", [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"], [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"]]]; |
|---|
| | 1430 | [textFieldFirewallPortGuestPorts setStringValue:[NSString stringWithFormat:@"%@,%@", [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Guest"], [[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Guest"]]]; |
|---|
| | 1431 | } else if(![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1432 | // tcp only |
|---|
| | 1433 | [popUpButtonFirewallServiceType selectItemAtIndex:0]; |
|---|
| | 1434 | [textFieldFirewallPortHostPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Host"]]; |
|---|
| | 1435 | [textFieldFirewallPortGuestPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"TCP-Ports-Guest"]]; |
|---|
| | 1436 | } else if(![[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"] isEqualToString:@""]) { |
|---|
| | 1437 | // udp only |
|---|
| | 1438 | [popUpButtonFirewallServiceType selectItemAtIndex:1]; |
|---|
| | 1439 | [textFieldFirewallPortHostPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Host"]]; |
|---|
| | 1440 | [textFieldFirewallPortGuestPorts setStringValue:[[additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]] valueForKey:@"UDP-Ports-Guest"]]; |
|---|
| | 1441 | } |
|---|
| | 1442 | // lock elements |
|---|
| | 1443 | [textFieldFirewallPortName setEnabled:NO]; |
|---|
| | 1444 | [textFieldFirewallPortHostPorts setEnabled:NO]; |
|---|
| | 1445 | [textFieldFirewallPortGuestPorts setEnabled:NO]; |
|---|
| | 1446 | [popUpButtonFirewallServiceType setEnabled:NO]; |
|---|
| | 1447 | } else { |
|---|
| | 1448 | // custom port chosen |
|---|
| | 1449 | [textFieldFirewallPortName setStringValue:@""]; |
|---|
| | 1450 | [textFieldFirewallPortHostPorts setStringValue:@""]; |
|---|
| | 1451 | [textFieldFirewallPortGuestPorts setStringValue:@""]; |
|---|
| | 1452 | [popUpButtonFirewallServiceType selectItemAtIndex:0]; |
|---|
| | 1453 | |
|---|
| | 1454 | [textFieldFirewallPortName setEnabled:YES]; |
|---|
| | 1455 | [textFieldFirewallPortHostPorts setEnabled:YES]; |
|---|
| | 1456 | [textFieldFirewallPortGuestPorts setEnabled:YES]; |
|---|
| | 1457 | [popUpButtonFirewallServiceType setEnabled:YES]; |
|---|
| | 1458 | } |
|---|
| | 1459 | } |
|---|
| | 1460 | |
|---|
| | 1461 | - (IBAction) saveNewPort:(id)sender |
|---|
| | 1462 | { |
|---|
| | 1463 | if([self checkPort:YES] == YES) { |
|---|
| | 1464 | NSMutableDictionary * portDict; |
|---|
| | 1465 | if ([popUpButtonFirewallAdditionalPorts indexOfSelectedItem] <= ([popUpButtonFirewallAdditionalPorts numberOfItems] - 3)) { |
|---|
| | 1466 | // this is a set from fw-additionals, load it directly from the file |
|---|
| | 1467 | NSArray * additionalPorts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-additionals" ofType:@"plist"]]; |
|---|
| | 1468 | portDict = [additionalPorts objectAtIndex:[popUpButtonFirewallAdditionalPorts indexOfSelectedItem]]; |
|---|
| | 1469 | } else { |
|---|
| | 1470 | // this is a custom port, take entries from textFields |
|---|
| | 1471 | portDict = [NSMutableDictionary dictionaryWithCapacity:5]; |
|---|
| | 1472 | [portDict setObject:[textFieldFirewallPortName stringValue] forKey:@"Name"]; |
|---|
| | 1473 | if([popUpButtonFirewallServiceType indexOfSelectedItem] == 0) { |
|---|
| | 1474 | // tcp only |
|---|
| | 1475 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; |
|---|
| | 1476 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; |
|---|
| | 1477 | } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 1) { |
|---|
| | 1478 | // udp only |
|---|
| | 1479 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; |
|---|
| | 1480 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; |
|---|
| | 1481 | } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 2) { |
|---|
| | 1482 | // tcp and udp |
|---|
| | 1483 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; |
|---|
| | 1484 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; |
|---|
| | 1485 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; |
|---|
| | 1486 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; |
|---|
| | 1487 | } |
|---|
| | 1488 | } // end predefined/custom check |
|---|
| | 1489 | // set enabled key |
|---|
| | 1490 | [portDict setObject:[NSNumber numberWithBool:YES] forKey:@"Enabled"]; |
|---|
| | 1491 | // add to list |
|---|
| | 1492 | [firewallPortList addObject:portDict]; |
|---|
| | 1493 | [self endEditPort:self]; |
|---|
| | 1494 | } |
|---|
| | 1495 | } |
|---|
| | 1496 | |
|---|
| | 1497 | - (IBAction) saveEditPort:(id)sender |
|---|
| | 1498 | { |
|---|
| | 1499 | if([self checkPort:NO] == YES) { |
|---|
| | 1500 | // save to edited port |
|---|
| | 1501 | int selectedPort = [firewallPortTable selectedRow]; |
|---|
| | 1502 | |
|---|
| | 1503 | NSMutableDictionary * portDict = [NSMutableDictionary dictionaryWithCapacity:5]; |
|---|
| | 1504 | [portDict setObject:[textFieldFirewallPortName stringValue] forKey:@"Name"]; |
|---|
| | 1505 | if([popUpButtonFirewallServiceType indexOfSelectedItem] == 0) { |
|---|
| | 1506 | // tcp only |
|---|
| | 1507 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; |
|---|
| | 1508 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; |
|---|
| | 1509 | } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 1) { |
|---|
| | 1510 | // udp only |
|---|
| | 1511 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; |
|---|
| | 1512 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; |
|---|
| | 1513 | } else if([popUpButtonFirewallServiceType indexOfSelectedItem] == 2) { |
|---|
| | 1514 | // tcp and udp |
|---|
| | 1515 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"TCP-Ports-Host"]; |
|---|
| | 1516 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"TCP-Ports-Guest"]; |
|---|
| | 1517 | [portDict setObject:[textFieldFirewallPortHostPorts stringValue] forKey:@"UDP-Ports-Host"]; |
|---|
| | 1518 | [portDict setObject:[textFieldFirewallPortGuestPorts stringValue] forKey:@"UDP-Ports-Guest"]; |
|---|
| | 1519 | } |
|---|
| | 1520 | // set enabled/disabled key |
|---|
| | 1521 | [portDict setObject:[[firewallPortList objectAtIndex:selectedPort] objectForKey:@"Enabled"] forKey:@"Enabled"]; |
|---|
| | 1522 | // replace in list |
|---|
| | 1523 | [firewallPortList replaceObjectAtIndex:selectedPort withObject:portDict]; |
|---|
| | 1524 | [self endEditPort:self]; |
|---|
| | 1525 | } |
|---|
| | 1526 | } |
|---|
| | 1527 | |
|---|
| | 1528 | - (BOOL) checkPort:(BOOL)newPort |
|---|
| | 1529 | { |
|---|
| | 1530 | if([[textFieldFirewallPortName stringValue] isEqualToString:@""]) { |
|---|
| | 1531 | // name empty |
|---|
| | 1532 | [textFieldFirewallPortError setStringValue:@"No empty name!"]; |
|---|
| | 1533 | [textFieldFirewallPortError setHidden:NO]; |
|---|
| | 1534 | return NO; |
|---|
| | 1535 | } else if([[textFieldFirewallPortHostPorts stringValue] isEqualToString:@""]) { |
|---|
| | 1536 | // host ports empty |
|---|
| | 1537 | NSLog(@"No empty host-port entry!"); |
|---|
| | 1538 | [textFieldFirewallPortError setStringValue:@"No empty host-port entry!"]; |
|---|
| | 1539 | [textFieldFirewallPortError setHidden:NO]; |
|---|
| | 1540 | return NO; |
|---|
| | 1541 | } else if([[textFieldFirewallPortGuestPorts stringValue] isEqualToString:@""]) { |
|---|
| | 1542 | // guest ports empty |
|---|
| | 1543 | NSLog(@"No empty guest-port entry!"); |
|---|
| | 1544 | [textFieldFirewallPortError setStringValue:@"No empty guest-port entry!"]; |
|---|
| | 1545 | [textFieldFirewallPortError setHidden:NO]; |
|---|
| | 1546 | return NO; |
|---|
| | 1547 | } else { |
|---|
| | 1548 | // check for valid port ranges |
|---|
| | 1549 | int i,j,k; |
|---|
| | 1550 | int dcc = 0; // delimiter comma count |
|---|
| | 1551 | int dhc = 0; // delimiter haifin count |
|---|
| | 1552 | unichar tChar; |
|---|
| | 1553 | int invalid = 0; |
|---|
| | 1554 | NSString *tForbidden = [NSString stringWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"$%&/()=?+*#'_;:.<>"]; |
|---|
| | 1555 | NSString *tDelimiters = [NSString stringWithString:@",-"]; |
|---|
| | 1556 | NSArray *tPortRanges = [NSArray arrayWithObjects:[textFieldFirewallPortHostPorts stringValue], [textFieldFirewallPortGuestPorts stringValue], nil]; |
|---|
| | 1557 | for (i = 0; i < [tPortRanges count]; i++) { |
|---|
| | 1558 | for (j = 0; j < [[tPortRanges objectAtIndex:i] length]; j++) { |
|---|
| | 1559 | tChar = [[tPortRanges objectAtIndex:i] characterAtIndex:j]; |
|---|
| | 1560 | for (k=0; k < [tForbidden length]; k++) { |
|---|
| | 1561 | //NSLog(@"%C, %C", tChar, [tForbidden characterAtIndex:k]); |
|---|
| | 1562 | if (tChar == [tForbidden characterAtIndex:k]) { |
|---|
| | 1563 | // invalid character |
|---|
| | 1564 | invalid = 1; |
|---|
| | 1565 | } else if(tChar == [tDelimiters characterAtIndex:0]) { |
|---|
| | 1566 | // raise comma count |
|---|
| | 1567 | dcc++; |
|---|
| | 1568 | } else if(tChar == [tDelimiters characterAtIndex:1]) { |
|---|
| | 1569 | // raise haifin count |
|---|
| | 1570 | dhc++; |
|---|
| | 1571 | } |
|---|
| | 1572 | } |
|---|
| | 1573 | } |
|---|
| | 1574 | } |
|---|
| | 1575 | if (invalid == 1) { |
|---|
| | 1576 | NSLog(@"Illegal characters in ports!"); |
|---|
| | 1577 | [textFieldFirewallPortError setStringValue:@"Illegal characters in ports!"]; |
|---|
| | 1578 | [textFieldFirewallPortError setHidden:NO]; |
|---|
| | 1579 | return NO; |
|---|
| | 1580 | } else if(dcc > 0 && dhc > 0) { |
|---|
| | 1581 | // both comma and haifin found, not supported/allowed atm |
|---|
| | 1582 | NSLog(@"Combination of , and - not allowed."); |
|---|
| | 1583 | [textFieldFirewallPortError setStringValue:@"Combination of , and - not allowed."]; |
|---|
| | 1584 | [textFieldFirewallPortError setHidden:NO]; |
|---|
| | 1585 | return NO; |
|---|
| | 1586 | } |
|---|
| | 1587 | } |
|---|
| | 1588 | int i; |
|---|
| | 1589 | int found = 0; |
|---|
| | 1590 | if(newPort) { |
|---|
| | 1591 | // check for same name in all entries of current list |
|---|
| | 1592 | |
|---|
| | 1593 | for(i=0; i<=[firewallPortList count]-1; i++) { |
|---|
| | 1594 | if([[textFieldFirewallPortName stringValue] isEqualTo:[[firewallPortList objectAtIndex:i] objectForKey:@"Name"]]) { |
|---|
| | 1595 | found = 1; |
|---|
| | 1596 | } |
|---|
| | 1597 | } |
|---|
| | 1598 | } else { |
|---|
| | 1599 | // check for same name in fw-default entries of current list |
|---|
| | 1600 | for(i=0; i<=[[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]] count]-1; i++) { |
|---|
| | 1601 | if([[textFieldFirewallPortName stringValue] isEqualTo:[[firewallPortList objectAtIndex:i] objectForKey:@"Name"]]) { |
|---|
| | 1602 | found = 1; |
|---|
| | 1603 | } |
|---|
| | 1604 | } |
|---|
| | 1605 | } |
|---|
| | 1606 | if(found == 1) return NO; |
|---|
| | 1607 | return YES; |
|---|
| | 1608 | } |
|---|
| | 1609 | |
|---|
| | 1610 | - (IBAction) endEditPort:(id)sender |
|---|
| | 1611 | { |
|---|
| | 1612 | // reset |
|---|
| | 1613 | [textFieldFirewallPortName setStringValue:@""]; |
|---|
| | 1614 | [textFieldFirewallPortHostPorts setStringValue:@""]; |
|---|
| | 1615 | [textFieldFirewallPortGuestPorts setStringValue:@""]; |
|---|
| | 1616 | [popUpButtonFirewallServiceType selectItemAtIndex:0]; |
|---|
| | 1617 | [textFieldFirewallPortError setStringValue:@""]; |
|---|
| | 1618 | [textFieldFirewallPortError setHidden:YES]; |
|---|
| | 1619 | |
|---|
| | 1620 | [textFieldFirewallPortName setEnabled:YES]; |
|---|
| | 1621 | [textFieldFirewallPortHostPorts setEnabled:YES]; |
|---|
| | 1622 | [textFieldFirewallPortGuestPorts setEnabled:YES]; |
|---|
| | 1623 | [popUpButtonFirewallServiceType setEnabled:YES]; |
|---|
| | 1624 | |
|---|
| | 1625 | [firewallPortPanel setFrame:NSMakeRect( |
|---|
| | 1626 | [firewallPortPanel frame].origin.x, |
|---|
| | 1627 | [firewallPortPanel frame].origin.y + 263, |
|---|
| | 1628 | [firewallPortPanel frame].size.width, |
|---|
| | 1629 | [firewallPortPanel frame].size.height - 263 |
|---|
| | 1630 | ) display:YES animate:YES]; |
|---|
| | 1631 | |
|---|
| | 1632 | // enable new,edit,delete,ok,tableview |
|---|
| | 1633 | [buttonFirewallNewPort setEnabled:YES]; |
|---|
| | 1634 | [buttonFirewallEditPort setEnabled:YES]; |
|---|
| | 1635 | [buttonFirewallDeletePort setEnabled:YES]; |
|---|
| | 1636 | [buttonFirewallOk setKeyEquivalent:@"\r"]; |
|---|
| | 1637 | [buttonFirewallOk setEnabled:YES]; |
|---|
| | 1638 | [self disableTableView:NO]; |
|---|
| | 1639 | |
|---|
| | 1640 | [buttonFirewallSavePort setKeyEquivalent:@""]; |
|---|
| | 1641 | [firewallPortTable reloadData]; |
|---|
| | 1642 | } |
|---|
| | 1643 | |
|---|
| | 1644 | - (IBAction) closeFirewallPortList:(id)sender |
|---|
| | 1645 | { |
|---|
| | 1646 | // save the ports in configuration.plist |
|---|
| | 1647 | // enumerate through entries and check for defaults, when enabled => save |
|---|
| | 1648 | NSArray * firewallDefaults = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fw-defaults" ofType:@"plist"]]; |
|---|
| | 1649 | NSMutableArray * customPorts = [NSMutableArray arrayWithCapacity:10]; |
|---|
| | 1650 | int i; |
|---|
| | 1651 | int ii; |
|---|
| | 1652 | int found = 0; |
|---|
| | 1653 | for(i=0; i<=[firewallPortList count]-1; i++) { |
|---|
| | 1654 | for(ii=0; ii<=[firewallDefaults count]-1; ii++) { |
|---|
| | 1655 | if([[[firewallPortList objectAtIndex:i] objectForKey:@"Name"] isEqualTo:[[firewallDefaults objectAtIndex:ii] objectForKey:@"Name"]]) { |
|---|
| | 1656 | // found default port in customs, check for enabled status in firewallPortList |
|---|
| | 1657 | found = 1; |
|---|
| | 1658 | if([[[firewallPortList objectAtIndex:i] objectForKey:@"Enabled"] isEqualTo:[NSNumber numberWithBool:YES]]) { |
|---|
| | 1659 | // default port enabled => save to conf.plist |
|---|
| | 1660 | [customPorts addObject:[firewallPortList objectAtIndex:i]]; |
|---|
| | 1661 | } |
|---|
| | 1662 | } |
|---|
| | 1663 | } |
|---|
| | 1664 | if(found == 0) { |
|---|
| | 1665 | // port is not default port, save to conf.plist regardless of Enabled |
|---|
| | 1666 | [customPorts addObject:[firewallPortList objectAtIndex:i]]; |
|---|
| | 1667 | } |
|---|
| | 1668 | found = 0; |
|---|
| | 1669 | } |
|---|
| | 1670 | [thisPC setObject:[NSDictionary dictionaryWithObject:customPorts forKey:@"Redirect"] forKey:@"Network"]; |
|---|
| | 1671 | [NSApp endSheet:firewallPortPanel]; |
|---|
| | 1672 | [firewallPortPanel orderOut:self]; |
|---|
| | 1673 | } |
|---|
| | 1674 | |
|---|
| | 1675 | - (NSString *) constructFirewallArguments |
|---|
| | 1676 | { |
|---|
| | 1677 | NSArray * portlist = [[thisPC objectForKey:@"Network"] objectForKey:@"Redirect"]; |
|---|
| | 1678 | NSMutableString * arguments = [NSMutableString stringWithCapacity:10]; |
|---|
| | 1679 | |
|---|
| | 1680 | int i, ii, j, k; |
|---|
| | 1681 | for(i=0; i<[portlist count]; i++) { |
|---|
| | 1682 | // enumerate through portlist in conf.plist |
|---|
| | 1683 | if([[[portlist objectAtIndex:i] objectForKey:@"Enabled"] isEqualTo:[NSNumber numberWithBool:YES]]) { |
|---|
| | 1684 | NSArray * tcpHostComma = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Host"] componentsSeparatedByString:@","]; |
|---|
| | 1685 | NSArray * tcpHostHaifin = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Host"] componentsSeparatedByString:@"-"]; |
|---|
| | 1686 | NSArray * tcpGuestComma = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Guest"] componentsSeparatedByString:@","]; |
|---|
| | 1687 | NSArray * tcpGuestHaifin = [[[portlist objectAtIndex:i] valueForKey:@"TCP-Ports-Guest"] componentsSeparatedByString:@"-"]; |
|---|
| | 1688 | |
|---|
| | 1689 | NSArray * udpHostComma = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Host"] componentsSeparatedByString:@","]; |
|---|
| | 1690 | NSArray * udpHostHaifin = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Host"] componentsSeparatedByString:@"-"]; |
|---|
| | 1691 | NSArray * udpGuestComma = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Guest"] componentsSeparatedByString:@","]; |
|---|
| | 1692 | NSArray * udpGuestHaifin = [[[portlist objectAtIndex:i] valueForKey:@"UDP-Ports-Guest"] componentsSeparatedByString:@"-"]; |
|---|
| | 1693 | |
|---|
| | 1694 | NSArray * typeA = [NSArray arrayWithObjects:@"tcp",@"udp",nil]; |
|---|
| | 1695 | NSArray * seperatedA = [NSArray arrayWithObjects:[NSArray arrayWithObjects:tcpHostComma, tcpHostHaifin, tcpGuestComma, tcpGuestHaifin, nil], [NSArray arrayWithObjects:udpHostComma, udpHostHaifin, udpGuestComma, udpGuestHaifin, nil], nil]; |
|---|
| | 1696 | |
|---|
| | 1697 | for(ii=0; ii<[seperatedA count]; ii++) { |
|---|
| | 1698 | // tcp/udp |
|---|
| | 1699 | id tp = [typeA objectAtIndex:ii]; |
|---|
| | 1700 | id hc = [[seperatedA objectAtIndex:ii] objectAtIndex:0]; |
|---|
| | 1701 | id hh = [[seperatedA objectAtIndex:ii] objectAtIndex:1]; |
|---|
| | 1702 | id gc = [[seperatedA objectAtIndex:ii] objectAtIndex:2]; |
|---|
| | 1703 | id gh = [[seperatedA objectAtIndex:ii] objectAtIndex:3]; |
|---|
| | 1704 | |
|---|
| | 1705 | |
|---|
| | 1706 | /* comma code */ |
|---|
| | 1707 | if([hc count] > 1 && [gc count] > 1) { |
|---|
| | 1708 | // both seperated by comma |
|---|
| | 1709 | if([hc count] == [gc count]) { |
|---|
| | 1710 | // both have the same amount of ports |
|---|
| | 1711 | // redirect same=>same |
|---|
| | 1712 | for(j=0; j < [hc count]; j++) { |
|---|
| | 1713 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:j], [gc objectAtIndex:j]]]; |
|---|
| | 1714 | } |
|---|
| | 1715 | } else { |
|---|
| | 1716 | // both have a different amount of ports |
|---|
| | 1717 | // redirect every=>every |
|---|
| | 1718 | for(j=0; j < [hc count]; j++) { |
|---|
| | 1719 | for(k=0; k < [gc count]; k++) { |
|---|
| | 1720 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:j], [gc objectAtIndex:k]]]; |
|---|
| | 1721 | } |
|---|
| | 1722 | } |
|---|
| | 1723 | } |
|---|
| | 1724 | } else if([hc count] == 1 && [gc count] > 1) { |
|---|
| | 1725 | // only guest seperated by comma |
|---|
| | 1726 | // redirect one=>every |
|---|
| | 1727 | for(j=0; j < [gc count]; j++) { |
|---|
| | 1728 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:0], [gc objectAtIndex:j]]]; |
|---|
| | 1729 | } |
|---|
| | 1730 | } else if([hc count] > 1 && [gc count] == 1) { |
|---|
| | 1731 | // only host seperated by comma |
|---|
| | 1732 | // redirect one=>every |
|---|
| | 1733 | for(j=0; j < [hc count]; j++) { |
|---|
| | 1734 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:j], [gc objectAtIndex:0]]]; |
|---|
| | 1735 | } |
|---|
| | 1736 | } |
|---|
| | 1737 | |
|---|
| | 1738 | /* haifin code */ |
|---|
| | 1739 | if([hh count] > 1 && [gh count] > 1) { |
|---|
| | 1740 | // both seperated by haifin |
|---|
| | 1741 | // redirect same=>same |
|---|
| | 1742 | j=[[hh objectAtIndex:0] intValue]; |
|---|
| | 1743 | k=[[gh objectAtIndex:0] intValue]; |
|---|
| | 1744 | while(j <= [[hh objectAtIndex:1] intValue]) { |
|---|
| | 1745 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%d::%d",tp, j,k]]; |
|---|
| | 1746 | j++; |
|---|
| | 1747 | k++; |
|---|
| | 1748 | } |
|---|
| | 1749 | } else if([hh count] == 1 && [gh count] > 1) { |
|---|
| | 1750 | // only guest seperated by haifin |
|---|
| | 1751 | // redirect one=>every |
|---|
| | 1752 | j=[[gh objectAtIndex:0] intValue]; |
|---|
| | 1753 | while(j < [[gh objectAtIndex:1] intValue]) { |
|---|
| | 1754 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%d",tp, [hh objectAtIndex:0],j]]; |
|---|
| | 1755 | j++; |
|---|
| | 1756 | } |
|---|
| | 1757 | } else if([hh count] > 1 && [gh count] == 1) { |
|---|
| | 1758 | // only host seperated by haifin |
|---|
| | 1759 | // redirect one=>every |
|---|
| | 1760 | j=[[hh objectAtIndex:0] intValue]; |
|---|
| | 1761 | while(j < [[hh objectAtIndex:1] intValue]) { |
|---|
| | 1762 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%d::%@", j,[gh objectAtIndex:0]]]; |
|---|
| | 1763 | j++; |
|---|
| | 1764 | } |
|---|
| | 1765 | } |
|---|
| | 1766 | |
|---|
| | 1767 | /* only one=>one port code */ |
|---|
| | 1768 | // check also for empty port ranges, because componentsSeperatedByString: returns count 1 even from an empty string |
|---|
| | 1769 | if(([hh count] == 1 && [gh count] == 1) && ([hc count] == 1 && [gc count] == 1)) { |
|---|
| | 1770 | if(!([[hh objectAtIndex:0] isEqualTo:@""] && [[gh objectAtIndex:0] isEqualTo:@""]) && !([[hc objectAtIndex:0] isEqualTo:@""] && [[gc objectAtIndex:0] isEqualTo:@""])) { |
|---|
| | 1771 | // only one port |
|---|
| | 1772 | // redirect one=>one |
|---|
| | 1773 | [arguments appendString:[NSString stringWithFormat:@" -redir %@:%@::%@",tp, [hc objectAtIndex:0] ,[gc objectAtIndex:0]]]; |
|---|
| | 1774 | } |
|---|
| | 1775 | } // end if ([hh count == 1] ... |
|---|
| | 1776 | } // end tcp/udp |
|---|
| | 1777 | } // end if enabled |
|---|
| | 1778 | } // end for portlist |
|---|
| | 1779 | return arguments; |
|---|
| | 1780 | } |
|---|
| | 1781 | |
|---|