Wed, 29 Jul 2009 11:23:17 +0200
Import package vendor original sources for necessary manipulations.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/tunblick/MenuController.m Wed Jul 29 11:23:17 2009 +0200 1.3 @@ -0,0 +1,1077 @@ 1.4 +/* 1.5 + * Copyright (c) 2004 Angelo Laub 1.6 + * Contributions by Dirk Theisen <dirk@objectpark.org>, 1.7 + * Jens Ohlig, 1.8 + * Waldemar Brodkorb 1.9 + * 1.10 + * This program is free software; you can redistribute it and/or modify 1.11 + * it under the terms of the GNU General Public License version 2 1.12 + * as published by the Free Software Foundation. 1.13 + * 1.14 + * This program is distributed in the hope that it will be useful, 1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1.17 + * GNU General Public License for more details. 1.18 + * 1.19 + * You should have received a copy of the GNU General Public License 1.20 + * along with this program (see the file COPYING included with this 1.21 + * distribution); if not, write to the Free Software Foundation, Inc., 1.22 + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1.23 + */ 1.24 + 1.25 + 1.26 +#import "MenuController.h" 1.27 +#import "NSApplication+NetworkNotifications.h" 1.28 +#import "helper.h" 1.29 + 1.30 + 1.31 +#define NSAppKitVersionNumber10_0 577 1.32 +#define NSAppKitVersionNumber10_1 620 1.33 +#define NSAppKitVersionNumber10_2 663 1.34 +#define NSAppKitVersionNumber10_3 743 1.35 + 1.36 + 1.37 + 1.38 +BOOL systemIsTigerOrNewer() 1.39 +{ 1.40 + return (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_3) ; 1.41 +} 1.42 + 1.43 +@interface NSStatusBar (NSStatusBar_Private) 1.44 +- (id)_statusItemWithLength:(float)l withPriority:(int)p; 1.45 +@end 1.46 + 1.47 + 1.48 +@implementation MenuController 1.49 + 1.50 +- (void) createStatusItem 1.51 +{ 1.52 + NSStatusBar *bar = [NSStatusBar systemStatusBar]; 1.53 + int priority = INT32_MAX; 1.54 + if (systemIsTigerOrNewer()) { 1.55 + priority = MIN(priority, 2147483646); // found by experimenting - dirk 1.56 + } 1.57 + 1.58 + if (!theItem) { 1.59 + theItem = [[bar _statusItemWithLength: NSVariableStatusItemLength withPriority: priority] retain]; 1.60 + //theItem = [[bar _statusItemWithLength: NSVariableStatusItemLength withPriority: 0] retain]; 1.61 + } 1.62 + // Dirk: For Tiger and up, re-insert item to place it correctly. 1.63 + if ([bar respondsToSelector: @selector(_insertStatusItem:withPriority:)]) { 1.64 + [bar removeStatusItem: theItem]; 1.65 + [bar _insertStatusItem: theItem withPriority: priority]; 1.66 + } 1.67 +} 1.68 + 1.69 +-(id) init 1.70 +{ 1.71 + if (self = [super init]) { 1.72 + [self dmgCheck]; 1.73 + 1.74 + errorImage = [[NSImage imageNamed: @"error.tif"] retain]; 1.75 + mainImage = [[NSImage imageNamed: @"00_closed.tif"] retain]; 1.76 + connectedImage = [[NSImage imageNamed: @"connected.png"] retain]; 1.77 + 1.78 + 1.79 + transitionalImage1 = [[NSImage imageNamed: @"01.tif"] retain]; 1.80 + transitionalImage2 = [[NSImage imageNamed: @"02.tif"] retain]; 1.81 + transitionalImage3 = [[NSImage imageNamed: @"03.tif"] retain]; 1.82 + [NSApp setDelegate:self]; 1.83 + 1.84 + myVPNConnectionDictionary = [[NSMutableDictionary alloc] init]; 1.85 + myVPNConnectionArray = [[[NSMutableArray alloc] init] retain]; 1.86 + userDefaults = [[NSMutableDictionary alloc] init]; 1.87 + 1.88 + connectionArray = [[[NSMutableArray alloc] init] retain]; 1.89 + appDefaults = [NSUserDefaults standardUserDefaults]; 1.90 + [appDefaults registerDefaults:userDefaults]; 1.91 + 1.92 + 1.93 + detailsItem = [[NSMenuItem alloc] init]; 1.94 + [detailsItem setTitle: @"Details..."]; 1.95 + [detailsItem setTarget: self]; 1.96 + [detailsItem setAction: @selector(openLogWindow:)]; 1.97 + 1.98 + quitItem = [[NSMenuItem alloc] init]; 1.99 + [quitItem setTitle: @"Quit"]; 1.100 + [quitItem setTarget: self]; 1.101 + [quitItem setAction: @selector(quit:)]; 1.102 + 1.103 + [self createStatusItem]; 1.104 + 1.105 + [self updateMenu]; 1.106 + [self setState: @"EXITING"]; // synonym for "Disconnected" 1.107 + 1.108 + [[NSNotificationCenter defaultCenter] addObserver: self 1.109 + selector: @selector(logNeedsScrolling:) 1.110 + name: @"LogDidChange" 1.111 + object: nil]; 1.112 + 1.113 + // In case the systemUIServer restarts, we observed this notification. 1.114 + // We use it to prevent to end up with a statusItem right of Spotlight: 1.115 + [[NSDistributedNotificationCenter defaultCenter] addObserver: self 1.116 + selector: @selector(menuExtrasWereAdded:) 1.117 + name: @"com.apple.menuextra.added" 1.118 + object: nil]; 1.119 + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self 1.120 + selector: @selector(willGoToSleep) 1.121 + name: @"NSWorkspaceWillSleepNotification" 1.122 + object:nil]; 1.123 + 1.124 + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self 1.125 + selector: @selector(wokeUpFromSleep) 1.126 + name: @"NSWorkspaceDidWakeNotification" 1.127 + object:nil]; 1.128 + 1.129 + NSString* vpnDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn/"]; 1.130 + 1.131 + UKKQueue* myQueue = [UKKQueue sharedQueue]; 1.132 + [myQueue addPathToQueue: vpnDirectory]; 1.133 + [myQueue setDelegate: self]; 1.134 + [myQueue setAlwaysNotify: YES]; 1.135 + 1.136 + [NSThread detachNewThreadSelector:@selector(moveAllWindowsToForegroundThread) toTarget:self withObject:nil]; 1.137 + 1.138 + updater = [[SUUpdater alloc] init]; 1.139 + 1.140 + } 1.141 + return self; 1.142 +} 1.143 + 1.144 +-(void)moveAllWindowsToForegroundThread { 1.145 + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 1.146 + sleep(3); 1.147 + [self moveAllWindowsToForeground]; 1.148 +// [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self selector: @selector(moveAllWindowsToForeground) userInfo: nil repeats: YES]; 1.149 + [pool release]; 1.150 + 1.151 +} 1.152 + 1.153 +- (void) menuExtrasWereAdded: (NSNotification*) n 1.154 +{ 1.155 + [self createStatusItem]; 1.156 +} 1.157 + 1.158 + 1.159 + 1.160 +- (IBAction) quit: (id) sender 1.161 +{ 1.162 + // Remove us from the login items if terminates manually... 1.163 + [NSApp setAutoLaunchOnLogin: NO]; 1.164 + [NSApp terminate: sender]; 1.165 +} 1.166 + 1.167 + 1.168 + 1.169 +- (void) awakeFromNib 1.170 +{ 1.171 + [self createDefaultConfig]; 1.172 + [self initialiseAnim]; 1.173 +} 1.174 + 1.175 +- (void) initialiseAnim 1.176 +{ 1.177 + NSAnimationProgress progMarks[] = { 1.178 + 1.0/8.0, 2.0/8.0, 3.0/8.0, 4.0/8.0, 5.0/8.0, 6.0/8.0, 7.0/8.0, 8.0/8.0 1.179 + }; 1.180 + 1.181 + int i, count = 8; 1.182 + // theAnim is an NSAnimation instance variable 1.183 + theAnim = [[NSAnimation alloc] initWithDuration:2.0 1.184 + animationCurve:NSAnimationLinear]; 1.185 + [theAnim setFrameRate:8.0]; 1.186 + [theAnim setDelegate:self]; 1.187 + 1.188 + for (i=0; i<count; i++) 1.189 + [theAnim addProgressMark:progMarks[i]]; 1.190 + 1.191 + [theAnim setAnimationBlockingMode: NSAnimationNonblocking]; 1.192 +} 1.193 + 1.194 +-(void) updateMenu 1.195 +{ 1.196 + [theItem setHighlightMode:YES]; 1.197 + [theItem setMenu:nil]; 1.198 + [myVPNMenu dealloc]; myVPNMenu = nil; 1.199 + [[myVPNConnectionDictionary allValues] makeObjectsPerformSelector:@selector(disconnect:) withObject:self]; 1.200 + [myVPNConnectionDictionary removeAllObjects]; 1.201 + 1.202 + myVPNMenu = [[NSMenu alloc] init]; 1.203 + [myVPNMenu setDelegate:self]; 1.204 + 1.205 + [theItem setMenu: myVPNMenu]; 1.206 + 1.207 + statusMenuItem = [[NSMenuItem alloc] init]; 1.208 + [myVPNMenu addItem:statusMenuItem]; 1.209 + [myVPNMenu addItem:[NSMenuItem separatorItem]]; 1.210 + 1.211 + [myConfigArray release]; 1.212 + myConfigArray = [[[self getConfigs] sortedArrayUsingSelector:@selector(compare:)] retain]; 1.213 + [myConfigModDatesArray release]; 1.214 + myConfigModDatesArray = [[self getModDates:myConfigArray] retain]; 1.215 + 1.216 + NSEnumerator *m = [myConfigArray objectEnumerator]; 1.217 + NSString *configString; 1.218 + int i = 2; // we start at MenuItem #2 1.219 + 1.220 + while (configString = [m nextObject]) 1.221 + { 1.222 + NSMenuItem *connectionItem = [[[NSMenuItem alloc] init] autorelease]; 1.223 + 1.224 + // configure connection object: 1.225 + VPNConnection* myConnection = [[VPNConnection alloc] initWithConfig: configString]; // initialize VPN Connection with config 1.226 + [myConnection setState:@"EXITING"]; 1.227 + [myConnection setDelegate:self]; 1.228 + 1.229 + // handle autoconnection: 1.230 + NSString *autoConnectKey = [[myConnection configName] stringByAppendingString: @"autoConnect"]; 1.231 + if([[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey]) 1.232 + { 1.233 + if(![myConnection isConnected]) [myConnection connect:self]; 1.234 + } 1.235 + 1.236 + [myVPNConnectionDictionary setObject: myConnection forKey:configString]; 1.237 + 1.238 + // Note: The item's title will be set on demand in -validateMenuItem 1.239 + [connectionItem setTarget:myConnection]; 1.240 + [connectionItem setAction:@selector(toggle:)]; 1.241 + 1.242 + [myVPNMenu insertItem:connectionItem atIndex:i]; 1.243 + i++; 1.244 + } 1.245 + 1.246 + [myVPNMenu addItem: [NSMenuItem separatorItem]]; 1.247 + [myVPNMenu addItem: detailsItem]; 1.248 + [myVPNMenu addItem: quitItem]; 1.249 + 1.250 + // Localize all menu items: 1.251 + NSMenuItem *item; 1.252 + NSEnumerator *e = [[myVPNMenu itemArray] objectEnumerator]; 1.253 + 1.254 + while (item = [e nextObject]) 1.255 + { 1.256 + [item setTitle:local([item title])]; 1.257 + } 1.258 +} 1.259 + 1.260 +- (void)activateStatusMenu 1.261 +{ 1.262 + //[theItem retain]; 1.263 + [self updateUI]; 1.264 + 1.265 + // If any config files were changed/added/deleted, update the menu 1.266 + // We don't do it UNLESS files were changed/added/deleted because all connections are reset when the menu is updated. 1.267 + // activateStatusMenu is called whenever anything changes in the config directory, even the file-accessed date, 1.268 + // so a backup of the directory, for example, would cause disconnects if we always updated the menu. 1.269 + NSArray * curConfigsArray = [[self getConfigs] sortedArrayUsingSelector:@selector(compare:)]; 1.270 + NSArray * curModDatesArray = [self getModDates:curConfigsArray]; 1.271 + 1.272 + if ( ! ( [myConfigArray isEqualToArray:curConfigsArray] 1.273 + && [myConfigModDatesArray isEqualToArray:curModDatesArray] ) ) { 1.274 + NSLog(@"One or more configuration files were changed, added, or deleted. All connections will be closed.\n"); 1.275 + [self updateMenu]; 1.276 + } 1.277 +} 1.278 + 1.279 +- (void)connectionStateDidChange:(id)connection 1.280 +{ 1.281 + [self updateTabLabels]; 1.282 + if (connection == [self selectedConnection]) 1.283 + { 1.284 + [self validateLogButtons]; 1.285 + } 1.286 +} 1.287 + 1.288 +-(NSArray *)getConfigs { 1.289 + int i = 0; 1.290 + NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease]; 1.291 + NSString *file; 1.292 + NSString *confDir = [NSHomeDirectory() stringByAppendingPathComponent: @"/Library/openvpn"]; 1.293 + NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath: confDir]; 1.294 + while (file = [dirEnum nextObject]) { 1.295 + if ([[file pathExtension] isEqualToString: @"conf"] || [[file pathExtension] isEqualToString: @"ovpn"]) { 1.296 + [array insertObject:file atIndex:i]; 1.297 + //if(NSDebugEnabled) NSLog(@"Object: %@ atIndex: %d\n",file,i); 1.298 + i++; 1.299 + } 1.300 + } 1.301 + return array; 1.302 +} 1.303 + 1.304 +// Returns an array of modification date strings 1.305 +// Each entry in the array is the modification date of the file in the corresponding entry in fileArray 1.306 +-(NSArray *)getModDates:(NSArray *)fileArray { 1.307 + int i; 1.308 + NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease]; 1.309 + NSString *file; 1.310 + NSString *cfgDirSlash = [NSHomeDirectory() stringByAppendingString: @"/Library/openvpn/"]; 1.311 + NSString *filePath; 1.312 + NSDate *modDate; 1.313 + NSString *modDateS; 1.314 + NSFileManager *fileManager = [NSFileManager defaultManager]; 1.315 + for (i=0; i<[fileArray count]; i++) { 1.316 + file = [fileArray objectAtIndex:i]; 1.317 + filePath = [cfgDirSlash stringByAppendingString:file]; 1.318 + modDate = [[fileManager fileAttributesAtPath:filePath traverseLink:YES] fileModificationDate]; 1.319 + if (modDate == nil) { 1.320 + modDateS = @""; 1.321 + } else if ( (modDateS = [modDate description]) == nil ) { 1.322 + modDateS = @""; 1.323 + } 1.324 + [array insertObject:modDateS atIndex:i]; 1.325 + } 1.326 + return array; 1.327 +} 1.328 + 1.329 +- (IBAction)validateLogButtons 1.330 +{ 1.331 + //NSLog(@"validating log buttons"); 1.332 + VPNConnection* connection = [self selectedConnection]; 1.333 + [connectButton setEnabled:[connection isDisconnected]]; 1.334 + [disconnectButton setEnabled:(![connection isDisconnected])]; 1.335 + [[NSUserDefaults standardUserDefaults] synchronize]; 1.336 + NSString *autoConnectKey = [[connection configName] stringByAppendingString:@"autoConnect"]; 1.337 + if([[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey]) { 1.338 + [autoLaunchCheckbox setState:NSOnState]; 1.339 + } else { 1.340 + [autoLaunchCheckbox setState:NSOffState]; 1.341 + } 1.342 + 1.343 + BOOL lol = useDNSStatus(connection); 1.344 + if(lol) { 1.345 + [useNameserverCheckbox setState:NSOnState]; 1.346 + } else { 1.347 + [useNameserverCheckbox setState:NSOffState]; 1.348 + } 1.349 +} 1.350 + 1.351 +-(void)updateTabLabels 1.352 +{ 1.353 + NSArray *keyArray = [[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)]; 1.354 + NSArray *myConnectionArray = [myVPNConnectionDictionary objectsForKeys:keyArray notFoundMarker:[NSNull null]]; 1.355 + NSEnumerator *connectionEnumerator = [myConnectionArray objectEnumerator]; 1.356 + VPNConnection *myConnection; 1.357 + 1.358 + // Get preferences for showing duration times 1.359 + BOOL showAllDurations = FALSE; 1.360 + BOOL showConnectedDurations = TRUE; 1.361 + id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showAllDurations"]; 1.362 + if(tmp != nil) { 1.363 + showAllDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showAllDurations"]; 1.364 + } 1.365 + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showConnectedDurations"]; 1.366 + if(tmp != nil) { 1.367 + showConnectedDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showConnectedDurations"]; 1.368 + } 1.369 + 1.370 + int i = 0; 1.371 + while(myConnection = [connectionEnumerator nextObject]) { 1.372 + //NSLog(@"configName: %@\nconnectionState: %@\n",[myConnection configName],[myConnection state]); 1.373 + NSString * cState = [myConnection state]; 1.374 + NSString * cTimeS = @""; 1.375 + 1.376 + // Get connection duration if preferences say to 1.377 + if ( showAllDurations || ( showConnectedDurations && [cState isEqualToString: @"CONNECTED"] ) ) { 1.378 + NSDate * csd = [myConnection connectedSinceDate]; 1.379 + NSTimeInterval ti = [csd timeIntervalSinceNow]; 1.380 + long cTimeL = (long) round(-ti); 1.381 + if ( cTimeL >= 0 ) { 1.382 + if ( cTimeL < 3600 ) { 1.383 + cTimeS = [NSString stringWithFormat:@" %li:%02li", cTimeL/60, cTimeL%60]; 1.384 + } else { 1.385 + cTimeS = [NSString stringWithFormat:@" %li:%02li:%02li", cTimeL/3600, (cTimeL/60) % 60, cTimeL%60]; 1.386 + } 1.387 + } 1.388 + } 1.389 + NSString *label = [NSString stringWithFormat:@"%@ (%@%@)",[myConnection configName],local(cState), cTimeS]; 1.390 + [[tabView tabViewItemAtIndex:i] setLabel:label]; 1.391 + i++; 1.392 + } 1.393 +} 1.394 + 1.395 + 1.396 +- (void) updateUI 1.397 +{ 1.398 + unsigned connectionNumber = [connectionArray count]; 1.399 + NSString *myState; 1.400 + if(connectionNumber == 1) { 1.401 + myState = local(@"OpenVPN: 1 connection active."); 1.402 + } else { 1.403 + myState = [NSString stringWithFormat:local(@"OpenVPN: %d connections active."),connectionNumber]; 1.404 + } 1.405 + 1.406 + [statusMenuItem setTitle: myState]; 1.407 + [theItem setToolTip: myState]; 1.408 + 1.409 + if( (![lastState isEqualToString:@"EXITING"]) && (![lastState isEqualToString:@"CONNECTED"]) ) { 1.410 + // override while in transitional state 1.411 + // Any other state shows "transitional" image: 1.412 + //[theItem setImage: transitionalImage]; 1.413 + if (![theAnim isAnimating]) 1.414 + { 1.415 + //NSLog(@"Starting Animation"); 1.416 + [theAnim startAnimation]; 1.417 + } 1.418 + } else 1.419 + { 1.420 + if ([theAnim isAnimating]) 1.421 + { 1.422 + [theAnim stopAnimation]; 1.423 + } 1.424 + } 1.425 + if (connectionNumber > 0 ) { 1.426 + [theItem setImage: connectedImage]; 1.427 + } else { 1.428 + [theItem setImage: mainImage]; 1.429 + } 1.430 +} 1.431 + 1.432 +- (void)animationDidEnd:(NSAnimation*)animation 1.433 +{ 1.434 + if ((![lastState isEqualToString:@"EXITING"]) && (![lastState isEqualToString:@"CONNECTED"])) 1.435 + { 1.436 + // NSLog(@"Starting Animation (2)"); 1.437 + [theAnim startAnimation]; 1.438 + } 1.439 + if ([connectionArray count] > 0 ) { 1.440 + [theItem setImage: connectedImage]; 1.441 + } else { 1.442 + [theItem setImage: mainImage]; 1.443 + } 1.444 +} 1.445 + 1.446 +- (void)animation:(NSAnimation *)animation 1.447 + didReachProgressMark:(NSAnimationProgress)progress 1.448 +{ 1.449 + if (animation == theAnim) 1.450 + { 1.451 + // NSLog(@"progress is %f %i", progress, lround(progress * 8)); 1.452 + // Do an effect appropriate to progress mark. 1.453 + switch(lround(progress * 8)) 1.454 + { 1.455 + case 1: 1.456 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:mainImage waitUntilDone:YES]; 1.457 + break; 1.458 + 1.459 + case 2: 1.460 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage1 waitUntilDone:YES]; 1.461 + break; 1.462 + 1.463 + case 3: 1.464 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage2 waitUntilDone:YES]; 1.465 + break; 1.466 + 1.467 + case 4: 1.468 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage3 waitUntilDone:YES]; 1.469 + break; 1.470 + 1.471 + case 5: 1.472 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:connectedImage waitUntilDone:YES]; 1.473 + break; 1.474 + 1.475 + case 6: 1.476 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage3 waitUntilDone:YES]; 1.477 + break; 1.478 + 1.479 + case 7: 1.480 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage2 waitUntilDone:YES]; 1.481 + break; 1.482 + 1.483 + case 8: 1.484 + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage1 waitUntilDone:YES]; 1.485 + break; 1.486 + 1.487 + default: 1.488 + NSLog(@"Unknown progress mark %f selected by Tunnelblick animation", progress); 1.489 + } 1.490 + } 1.491 +} 1.492 + 1.493 +- (void) tabView: (NSTabView*) inTabView willSelectTabViewItem: (NSTabViewItem*) tabViewItem 1.494 +{ 1.495 + NSView* view = [[inTabView selectedTabViewItem] view]; 1.496 + [tabViewItem setView: view]; 1.497 + [[[self selectedLogView] textStorage] setDelegate: nil]; 1.498 +} 1.499 + 1.500 +- (void) tabView: (NSTabView*) inTabView didSelectTabViewItem: (NSTabViewItem*) tabViewItem 1.501 +{ 1.502 + VPNConnection* newConnection = [self selectedConnection]; 1.503 + NSTextView* logView = [self selectedLogView]; 1.504 + [[logView layoutManager] replaceTextStorage: [newConnection logStorage]]; 1.505 + //[logView setSelectedRange: NSMakeRange([[logView textStorage] length],[[logView textStorage] length])]; 1.506 + [logView scrollRangeToVisible: NSMakeRange([[logView string] length]-1, 0)]; 1.507 + 1.508 + [[logView textStorage] setDelegate: self]; 1.509 + 1.510 + [self validateLogButtons]; 1.511 +} 1.512 +- (void) textStorageDidProcessEditing: (NSNotification*) aNotification 1.513 +{ 1.514 + NSNotification *notification = [NSNotification notificationWithName: @"LogDidChange" 1.515 + object: [self selectedLogView]]; 1.516 + [[NSNotificationQueue defaultQueue] enqueueNotification: notification 1.517 + postingStyle: NSPostWhenIdle 1.518 + coalesceMask: NSNotificationCoalescingOnName | NSNotificationCoalescingOnSender 1.519 + forModes: nil]; 1.520 +} 1.521 + 1.522 +- (void) logNeedsScrolling: (NSNotification*) aNotification 1.523 +{ 1.524 + NSTextView* textView = [aNotification object]; 1.525 + [textView scrollRangeToVisible: NSMakeRange([[textView string] length]-1, 0)]; 1.526 +} 1.527 + 1.528 +- (NSTextView*) selectedLogView 1.529 +{ 1.530 + NSTextView* result = [[[[[tabView selectedTabViewItem] view] subviews] lastObject] documentView]; 1.531 + return result; 1.532 +} 1.533 + 1.534 +- (IBAction) clearLog: (id) sender 1.535 +{ 1.536 + NSString * versionInfo = [NSString stringWithFormat:local(@"Tunnelblick version %@"),[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]; 1.537 + NSCalendarDate* date = [NSCalendarDate date]; 1.538 + NSString *dateText = [NSString stringWithFormat:@"%@ %@\n",[date descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"],versionInfo]; 1.539 + [[self selectedLogView] setString: [[[NSString alloc] initWithString: dateText] autorelease]]; 1.540 +} 1.541 + 1.542 +- (VPNConnection*) selectedConnection 1.543 + /*" Returns the connection associated with the currently selected log tab or nil on error. "*/ 1.544 +{ 1.545 + if (![tabView selectedTabViewItem]) { 1.546 + [tabView selectFirstTabViewItem: nil]; 1.547 + } 1.548 + 1.549 + NSString* configPath = [[tabView selectedTabViewItem] identifier]; 1.550 + VPNConnection* connection = [myVPNConnectionDictionary objectForKey:configPath]; 1.551 + NSArray *allConnections = [myVPNConnectionDictionary allValues]; 1.552 + if(connection) return connection; 1.553 + else if([allConnections count]) return [allConnections objectAtIndex:0] ; 1.554 + else return nil; 1.555 +} 1.556 + 1.557 + 1.558 + 1.559 + 1.560 +- (IBAction)connect:(id)sender 1.561 +{ 1.562 + [[self selectedConnection] connect: sender]; 1.563 +} 1.564 + 1.565 +- (IBAction)disconnect:(id)sender 1.566 +{ 1.567 + [[self selectedConnection] disconnect: sender]; 1.568 +} 1.569 + 1.570 + 1.571 +- (IBAction) openLogWindow: (id) sender 1.572 +{ 1.573 + if (logWindow != nil) { 1.574 + [logWindow makeKeyAndOrderFront: self]; 1.575 + [NSApp activateIgnoringOtherApps:YES]; 1.576 + return; 1.577 + } 1.578 + 1.579 + [NSBundle loadNibNamed: @"LogWindow" owner: self]; // also sets tabView etc. 1.580 + 1.581 + // Set the window's size and position from preferences (saved when window is closed) 1.582 + // But only if the preference's version matches the TB version (since window size could be different in different versions of TB) 1.583 + NSString * tbVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; 1.584 + id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrameVersion"]; 1.585 + if (tmp != nil) { 1.586 + if ( [tbVersion isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrameVersion"]] ) { 1.587 + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrame"]; 1.588 + if(tmp != nil) { 1.589 + NSString * frame = [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrame"]; 1.590 + [logWindow setFrameFromString:frame]; 1.591 + } 1.592 + } 1.593 + } 1.594 + 1.595 + [logWindow setDelegate:self]; 1.596 + VPNConnection *myConnection = [self selectedConnection]; 1.597 + NSTextStorage* store = [myConnection logStorage]; 1.598 + [[[self selectedLogView] layoutManager] replaceTextStorage: store]; 1.599 + 1.600 + NSEnumerator* e = [[[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)] objectEnumerator]; 1.601 + //id test = [[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)]; 1.602 + NSTabViewItem* initialItem; 1.603 + VPNConnection* connection = [myVPNConnectionDictionary objectForKey: [e nextObject]]; 1.604 + if (connection) { 1.605 + initialItem = [tabView tabViewItemAtIndex: 0]; 1.606 + [initialItem setIdentifier: [connection configPath]]; 1.607 + [initialItem setLabel: [connection configName]]; 1.608 + 1.609 + int curTabIndex = 0; 1.610 + [tabView selectTabViewItemAtIndex:0]; 1.611 + BOOL haveOpenConnection = ! [connection isDisconnected]; 1.612 + while (connection = [myVPNConnectionDictionary objectForKey: [e nextObject]]) { 1.613 + NSTabViewItem* newItem = [[NSTabViewItem alloc] init]; 1.614 + [newItem setIdentifier: [connection configPath]]; 1.615 + [newItem setLabel: [connection configName]]; 1.616 + [tabView addTabViewItem: newItem]; 1.617 + ++curTabIndex; 1.618 + if ( ( ! haveOpenConnection ) && ( ! [connection isDisconnected] ) ) { 1.619 + [tabView selectTabViewItemAtIndex:curTabIndex]; 1.620 + haveOpenConnection = YES; 1.621 + } 1.622 + } 1.623 + } 1.624 + [self tabView:tabView didSelectTabViewItem:initialItem]; 1.625 + [self validateLogButtons]; 1.626 + [self updateTabLabels]; 1.627 + 1.628 + // Set up a timer to update the tab labels with connections' duration times 1.629 + BOOL showAllDurations = FALSE; 1.630 + BOOL showConnectedDurations = TRUE; 1.631 + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showAllDurations"]; 1.632 + if(tmp != nil) { 1.633 + showAllDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showAllDurations"]; 1.634 + } 1.635 + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showConnectedDurations"]; 1.636 + if(tmp != nil) { 1.637 + showConnectedDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showConnectedDurations"]; 1.638 + } 1.639 + 1.640 + if ( (showDurationsTimer == nil) && (showAllDurations || showConnectedDurations) ) { 1.641 + showDurationsTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 1.642 + target:self 1.643 + selector:@selector(updateTabLabels) 1.644 + userInfo:nil 1.645 + repeats:YES] retain]; 1.646 + } 1.647 + 1.648 + // Localize Buttons 1.649 + [clearButton setTitle:local([clearButton title])]; 1.650 + [editButton setTitle:local([editButton title])]; 1.651 + [connectButton setTitle:local([connectButton title])]; 1.652 + [disconnectButton setTitle:local([disconnectButton title])]; 1.653 + [useNameserverCheckbox setTitle:local([useNameserverCheckbox title])]; 1.654 + [autoLaunchCheckbox setTitle:local([autoLaunchCheckbox title])]; 1.655 + 1.656 + [logWindow makeKeyAndOrderFront: self]; 1.657 + [NSApp activateIgnoringOtherApps:YES]; 1.658 +} 1.659 + 1.660 +// Invoked when the Details... window (logWindow) will close 1.661 +- (void)windowWillClose:(NSNotification *)n 1.662 +{ 1.663 + if ( [n object] == logWindow ) { 1.664 + // Stop and release the timer used to update the duration displays 1.665 + if (showDurationsTimer != nil) { 1.666 + [showDurationsTimer invalidate]; 1.667 + [showDurationsTimer release]; 1.668 + showDurationsTimer = nil; 1.669 + } 1.670 + 1.671 + // Save the window's size and position in the preferences and save the TB version that saved them, BUT ONLY IF anything has changed 1.672 + NSString * frame = [logWindow stringWithSavedFrame]; 1.673 + NSString * tbVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; 1.674 + BOOL saveIt = TRUE; 1.675 + id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrame"]; 1.676 + if(tmp != nil) { 1.677 + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrameVersion"]; 1.678 + if (tmp != nil) { 1.679 + if ( [tbVersion isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrameVersion"]] ) { 1.680 + if ( [frame isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrame"]] ) { 1.681 + saveIt = FALSE; 1.682 + } 1.683 + } 1.684 + } 1.685 + } 1.686 + 1.687 + if (saveIt) { 1.688 + [[NSUserDefaults standardUserDefaults] setObject: frame forKey: @"detailsWindowFrame"]; 1.689 + [[NSUserDefaults standardUserDefaults] setObject: [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] 1.690 + forKey: @"detailsWindowFrameVersion"]; 1.691 + [[NSUserDefaults standardUserDefaults] synchronize]; 1.692 + } 1.693 + } 1.694 +} 1.695 + 1.696 +- (void) dealloc 1.697 +{ 1.698 + [lastState release]; 1.699 + [theItem release]; 1.700 + [myConfigArray release]; 1.701 + 1.702 +#warning todo: release non-IB ivars here! 1.703 + [statusMenuItem release]; 1.704 + [myVPNMenu release]; 1.705 + [userDefaults release]; 1.706 + [appDefaults release]; 1.707 + [theItem release]; 1.708 + 1.709 + [mainImage release]; 1.710 + [connectedImage release]; 1.711 + [errorImage release]; 1.712 + [transitionalImage release]; 1.713 + [connectionArray release]; 1.714 + 1.715 + 1.716 + [super dealloc]; 1.717 +} 1.718 + 1.719 + 1.720 +-(void)killAllConnections 1.721 +{ 1.722 + id connection; 1.723 + NSEnumerator* e = [connectionArray objectEnumerator]; 1.724 + 1.725 + while (connection = [e nextObject]) { 1.726 + [connection disconnect:self]; 1.727 + if(NSDebugEnabled) NSLog(@"Killing connection.\n"); 1.728 + } 1.729 +} 1.730 + 1.731 +-(void)killAllOpenVPN 1.732 +{ 1.733 + NSString* path = [[NSBundle mainBundle] pathForResource: @"openvpnstart" 1.734 + ofType: nil]; 1.735 + NSTask* task = [[[NSTask alloc] init] autorelease]; 1.736 + [task setLaunchPath: path]; 1.737 + 1.738 + NSArray *arguments = [NSArray arrayWithObjects:@"killall", nil]; 1.739 + [task setArguments:arguments]; 1.740 + [task launch]; 1.741 + [task waitUntilExit]; 1.742 +} 1.743 + 1.744 +-(void)resetActiveConnections { 1.745 + VPNConnection *connection; 1.746 + NSEnumerator* e = [connectionArray objectEnumerator]; 1.747 + 1.748 + while (connection = [e nextObject]) { 1.749 + if (NSDebugEnabled) NSLog(@"Connection %@ is connected for %f seconds\n",[connection configName],[[connection connectedSinceDate] timeIntervalSinceNow]); 1.750 + if ([[connection connectedSinceDate] timeIntervalSinceNow] < -5) { 1.751 + if (NSDebugEnabled) NSLog(@"Resetting connection: %@\n",[connection configName]); 1.752 + [connection disconnect:self]; 1.753 + [connection connect:self]; 1.754 + } 1.755 + else { 1.756 + if (NSDebugEnabled) NSLog(@"Not Resetting connection: %@\n, waiting...",[connection configName]); 1.757 + } 1.758 + } 1.759 +} 1.760 + 1.761 +-(void)createDefaultConfig 1.762 +{ 1.763 + NSFileManager *fileManager = [NSFileManager defaultManager]; 1.764 + NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn"]; 1.765 + NSString *confResource = [[NSBundle mainBundle] pathForResource: @"openvpn" 1.766 + ofType: @"conf"]; 1.767 + 1.768 + if([[self getConfigs] count] == 0) { // if there are no config files, create a default one 1.769 + [NSApp activateIgnoringOtherApps:YES]; 1.770 + if(NSRunCriticalAlertPanel(local(@"Welcome to OpenVPN on Mac OS X: Please put your config file (e.g. openvpn.conf) to '~/Library/openvpn/'."), local(@"You can also continue and Tunnelblick will create an example config at the right place that you can customize or replace."),local(@"Quit"),local(@"Continue"),nil) == NSAlertDefaultReturn) { 1.771 + exit (1); 1.772 + } 1.773 + else { 1.774 + [fileManager createDirectoryAtPath:directoryPath attributes:nil]; 1.775 + [fileManager copyPath:confResource toPath:[directoryPath stringByAppendingPathComponent:@"/openvpn.conf"] handler:nil]; 1.776 + [self editConfig:self]; 1.777 + } 1.778 + 1.779 + 1.780 + } 1.781 +} 1.782 + 1.783 +-(IBAction)editConfig:(id)sender 1.784 +{ 1.785 + VPNConnection *connection = [self selectedConnection]; 1.786 + NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn"]; 1.787 + NSString *configPath = [connection configPath]; 1.788 + if(configPath == nil) configPath = @"/openvpn.conf"; 1.789 + 1.790 + // NSString *helper = @"/usr/sbin/chown"; 1.791 + // NSString *userString = [NSString stringWithFormat:@"%d",getuid()]; 1.792 + // NSArray *arguments = [NSArray arrayWithObjects:userString,configPath,nil]; 1.793 + // AuthorizationRef authRef = [NSApplication getAuthorizationRef]; 1.794 + // [NSApplication executeAuthorized:helper withArguments:arguments withAuthorizationRef:authRef]; 1.795 + // AuthorizationFree(authRef,kAuthorizationFlagDefaults); 1.796 + 1.797 + [[NSWorkspace sharedWorkspace] openFile:[directoryPath stringByAppendingPathComponent:configPath] withApplication:@"TextEdit"]; 1.798 +} 1.799 + 1.800 + 1.801 +- (void) networkConfigurationDidChange 1.802 +{ 1.803 + if (NSDebugEnabled) NSLog(@"Got networkConfigurationDidChange notification!!"); 1.804 + [self resetActiveConnections]; 1.805 +} 1.806 + 1.807 +- (void) applicationWillTerminate: (NSNotification*) notification 1.808 +{ 1.809 + if (NSDebugEnabled) NSLog(@"App will terminate...\n"); 1.810 + [self cleanup]; 1.811 +} 1.812 + 1.813 +-(void)cleanup 1.814 +{ 1.815 + [NSApp callDelegateOnNetworkChange: NO]; 1.816 + [self killAllConnections]; 1.817 + [self killAllOpenVPN]; 1.818 + [[NSStatusBar systemStatusBar] removeStatusItem:theItem]; 1.819 +} 1.820 + 1.821 +-(void)saveUseNameserverCheckboxState:(BOOL)inBool 1.822 +{ 1.823 + VPNConnection* connection = [self selectedConnection]; 1.824 + if(connection != nil) { 1.825 + NSString* key = [[connection configName] stringByAppendingString: @"useDNS"]; 1.826 + [[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: inBool] forKey: key]; 1.827 + [[NSUserDefaults standardUserDefaults] synchronize]; 1.828 + } 1.829 + 1.830 +} 1.831 +-(void)saveAutoLaunchCheckboxState:(BOOL)inBool 1.832 +{ 1.833 + VPNConnection* connection = [self selectedConnection]; 1.834 + if(connection != nil) { 1.835 + NSString* autoConnectKey = [[connection configName] stringByAppendingString: @"autoConnect"]; 1.836 + [[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: inBool] forKey: autoConnectKey]; 1.837 + [[NSUserDefaults standardUserDefaults] synchronize]; 1.838 + } 1.839 + 1.840 +} 1.841 + 1.842 +-(BOOL)getCurrentAutoLaunchSetting 1.843 +{ 1.844 + VPNConnection *connection = [self selectedConnection]; 1.845 + NSString *autoConnectKey = [[connection configName] stringByAppendingString:@"autoConnect"]; 1.846 + return [[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey]; 1.847 +} 1.848 + 1.849 +- (void) setState: (NSString*) newState 1.850 + // Be sure to call this in main thread only 1.851 +{ 1.852 + [newState retain]; 1.853 + [lastState release]; 1.854 + lastState = newState; 1.855 + //[self updateUI]; 1.856 + [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO]; 1.857 +} 1.858 + 1.859 +-(void)addConnection:(id)sender 1.860 +{ 1.861 + if(sender != nil) { 1.862 + [connectionArray removeObject:sender]; 1.863 + [connectionArray addObject:sender]; 1.864 + } 1.865 +} 1.866 + 1.867 +-(void)removeConnection:(id)sender 1.868 +{ 1.869 + if(sender != nil) [connectionArray removeObject:sender]; 1.870 +} 1.871 + 1.872 +static void signal_handler(int signalNumber) 1.873 +{ 1.874 + printf("signal %d caught!\n",signalNumber); 1.875 + 1.876 + if (signalNumber == SIGHUP) { 1.877 + printf("SIGHUP received. Restarting active connections...\n"); 1.878 + [[NSApp delegate] resetActiveConnections]; 1.879 + } else { 1.880 + printf("Received fatal signal. Cleaning up...\n"); 1.881 + [[NSApp delegate] cleanup]; 1.882 + exit(0); 1.883 + } 1.884 +} 1.885 + 1.886 + 1.887 +- (void) installSignalHandler 1.888 +{ 1.889 + struct sigaction action; 1.890 + 1.891 + action.sa_handler = signal_handler; 1.892 + sigemptyset(&action.sa_mask); 1.893 + action.sa_flags = 0; 1.894 + 1.895 + if (sigaction(SIGHUP, &action, NULL) || 1.896 + sigaction(SIGQUIT, &action, NULL) || 1.897 + sigaction(SIGTERM, &action, NULL) || 1.898 + sigaction(SIGBUS, &action, NULL) || 1.899 + sigaction(SIGSEGV, &action, NULL) || 1.900 + sigaction(SIGPIPE, &action, NULL)) { 1.901 + NSLog(@"Warning: setting signal handler failed: %s", strerror(errno)); 1.902 + } 1.903 +} 1.904 +- (void) applicationDidFinishLaunching: (NSNotification *)notification 1.905 +{ 1.906 + [NSApp callDelegateOnNetworkChange: NO]; 1.907 + [self installSignalHandler]; 1.908 + [NSApp setAutoLaunchOnLogin: YES]; 1.909 + [self activateStatusMenu]; 1.910 + if(needsRepair()){ 1.911 + if ([self repairPermissions] != TRUE) { 1.912 + [NSApp terminate:self]; 1.913 + } 1.914 + } 1.915 + 1.916 + [updater checkForUpdatesInBackground]; 1.917 +} 1.918 + 1.919 +-(void) dmgCheck 1.920 +{ 1.921 + NSString *path = [[NSBundle mainBundle] bundlePath]; 1.922 + if([path hasPrefix:@"/Volumes/Tunnelblick"]) { 1.923 + NSPanel *panel = NSGetAlertPanel(local(@"You're trying to launch Tunnelblick from the disk image"),local(@"Please copy Tunnelblick.app to your Harddisk before launching it."),local(@"Cancel"),nil,nil); 1.924 + [panel setLevel:NSStatusWindowLevel]; 1.925 + [panel makeKeyAndOrderFront:nil]; 1.926 + [NSApp runModalForWindow:panel]; 1.927 + exit(2); 1.928 + } 1.929 +} 1.930 + 1.931 +-(void)moveAllWindowsToForeground 1.932 +{ 1.933 + NSArray *windows = [NSApp windows]; 1.934 + NSEnumerator *e = [windows objectEnumerator]; 1.935 + NSWindow *window = nil; 1.936 + while(window = [e nextObject]) { 1.937 + [window setLevel:NSStatusWindowLevel]; 1.938 + } 1.939 +} 1.940 + 1.941 +-(void) fileSystemHasChanged: (NSNotification*) n 1.942 +{ 1.943 + if(NSDebugEnabled) NSLog(@"FileSystem has changed."); 1.944 + [self performSelectorOnMainThread: @selector(activateStatusMenu) withObject: nil waitUntilDone: YES]; 1.945 +} 1.946 +-(void) kqueue: (UKKQueue*) kq receivedNotification: (NSString*) nm forFile: (NSString*) fpath { 1.947 + 1.948 + [self fileSystemHasChanged: nil]; 1.949 +} 1.950 + 1.951 +-(BOOL)repairPermissions 1.952 +{ 1.953 + NSBundle *thisBundle = [NSBundle mainBundle]; 1.954 + NSString *installer = [thisBundle pathForResource:@"installer" ofType:nil]; 1.955 + 1.956 + AuthorizationRef authRef= [NSApplication getAuthorizationRef]; 1.957 + 1.958 + if(authRef == nil) 1.959 + return FALSE; 1.960 + 1.961 + while(needsRepair()) { 1.962 + NSLog(@"Repairing Application...\n"); 1.963 + [NSApplication executeAuthorized:installer withArguments:nil withAuthorizationRef:authRef]; 1.964 + sleep(1); 1.965 + } 1.966 + AuthorizationFree(authRef, kAuthorizationFlagDefaults); 1.967 + return TRUE; 1.968 +} 1.969 + 1.970 + 1.971 + 1.972 + 1.973 +BOOL needsRepair() 1.974 +{ 1.975 + NSBundle *thisBundle = [NSBundle mainBundle]; 1.976 + NSString *helperPath = [thisBundle pathForResource:@"openvpnstart" ofType:nil]; 1.977 + NSString *tunPath = [thisBundle pathForResource:@"tun.kext" ofType:nil]; 1.978 + NSString *tapPath = [thisBundle pathForResource:@"tap.kext" ofType:nil]; 1.979 + 1.980 + NSString *tunExecutable = [tunPath stringByAppendingPathComponent:@"/Contents/MacOS/tun"]; 1.981 + NSString *tapExecutable = [tapPath stringByAppendingPathComponent:@"/Contents/MacOS/tap"]; 1.982 + NSString *openvpnPath = [thisBundle pathForResource:@"openvpn" ofType:nil]; 1.983 + 1.984 + 1.985 + // check setuid helper 1.986 + const char *path = [helperPath UTF8String]; 1.987 + struct stat sb; 1.988 + if(stat(path,&sb)) runUnrecoverableErrorPanel(); 1.989 + 1.990 + if (!( (sb.st_mode & S_ISUID) // set uid bit is set 1.991 + && (sb.st_mode & S_IXUSR) // owner may execute it 1.992 + && (sb.st_uid == 0) // is owned by root 1.993 + )) { 1.994 + NSLog(@"openvpnstart helper has missing set uid bit"); 1.995 + return YES; 1.996 + } 1.997 + 1.998 + // check files which should be only accessible by root 1.999 + NSArray *inaccessibleObjects = [NSArray arrayWithObjects:tunExecutable,tapExecutable,openvpnPath,nil]; 1.1000 + NSEnumerator *e = [inaccessibleObjects objectEnumerator]; 1.1001 + NSString *currentPath; 1.1002 + NSFileManager *fileManager = [NSFileManager defaultManager]; 1.1003 + while(currentPath = [e nextObject]) { 1.1004 + NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:currentPath traverseLink:YES]; 1.1005 + unsigned long perms = [fileAttributes filePosixPermissions]; 1.1006 + NSString *octalString = [NSString stringWithFormat:@"%o",perms]; 1.1007 + NSNumber *fileOwner = [fileAttributes fileOwnerAccountID]; 1.1008 + 1.1009 + if ( (![octalString isEqualToString:@"744"]) || (![fileOwner isEqualToNumber:[NSNumber numberWithInt:0]])) { 1.1010 + NSLog(@"File %@ has permissions: %@, is owned by %@ and needs repair...\n",currentPath,octalString,fileOwner); 1.1011 + return YES; 1.1012 + } 1.1013 + } 1.1014 + 1.1015 + // check tun and tap driver packages 1.1016 + NSArray *filesToCheck = [NSArray arrayWithObjects:tunPath,tapPath,nil]; 1.1017 + NSEnumerator *enumerator = [filesToCheck objectEnumerator]; 1.1018 + NSString *file; 1.1019 + while(file = [enumerator nextObject]) { 1.1020 + NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:file traverseLink:YES]; 1.1021 + unsigned long perms = [fileAttributes filePosixPermissions]; 1.1022 + NSString *octalString = [NSString stringWithFormat:@"%o",perms]; 1.1023 + if ( (![octalString isEqualToString:@"755"]) ) { 1.1024 + NSLog(@"File %@ has permissions: %@ and needs repair...\n",currentPath,octalString); 1.1025 + return YES; 1.1026 + } 1.1027 + } 1.1028 + return NO; 1.1029 +} 1.1030 + 1.1031 +-(void)willGoToSleep 1.1032 +{ 1.1033 + if(NSDebugEnabled) NSLog(@"Computer will go to sleep...\n"); 1.1034 + connectionsToRestore = [connectionArray mutableCopy]; 1.1035 + [self killAllConnections]; 1.1036 +} 1.1037 +-(void)wokeUpFromSleep 1.1038 +{ 1.1039 + if(NSDebugEnabled) NSLog(@"Computer just woke up from sleep...\n"); 1.1040 + 1.1041 + NSEnumerator *e = [connectionsToRestore objectEnumerator]; 1.1042 + VPNConnection *connection; 1.1043 + while(connection = [e nextObject]) { 1.1044 + if(NSDebugEnabled) NSLog(@"Restoring Connection %@",[connection configName]); 1.1045 + [connection connect:self]; 1.1046 + } 1.1047 +} 1.1048 +int runUnrecoverableErrorPanel(void) 1.1049 +{ 1.1050 + NSPanel *panel = NSGetAlertPanel(local(@"Tunnelblick Error"),local(@"It seems like you need to reinstall Tunnelblick. Please move Tunnelblick to the Trash and download a fresh copy."),local(@"Download"),local(@"Quit"),nil); 1.1051 + [panel setLevel:NSStatusWindowLevel]; 1.1052 + [panel makeKeyAndOrderFront:nil]; 1.1053 + if( [NSApp runModalForWindow:panel] != NSAlertDefaultReturn ) { 1.1054 + exit(2); 1.1055 + } else { 1.1056 + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://tunnelblick.net/"]]; 1.1057 + exit(2); 1.1058 + } 1.1059 +} 1.1060 + 1.1061 +-(IBAction) autoLaunchPrefButtonWasClicked: (id) sender 1.1062 +{ 1.1063 + if([sender state]) { 1.1064 + [self saveAutoLaunchCheckboxState:TRUE]; 1.1065 + } else { 1.1066 + [self saveAutoLaunchCheckboxState:FALSE]; 1.1067 + } 1.1068 +} 1.1069 + 1.1070 +-(IBAction) nameserverPrefButtonWasClicked: (id) sender 1.1071 +{ 1.1072 + if([sender state]) { 1.1073 + [self saveUseNameserverCheckboxState:TRUE]; 1.1074 + } else { 1.1075 + [self saveUseNameserverCheckboxState:FALSE]; 1.1076 + } 1.1077 +} 1.1078 + 1.1079 + 1.1080 +@end
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/tunblick/Sparkle.xcodeproj/default.pbxuser Wed Jul 29 11:23:17 2009 +0200 2.3 @@ -0,0 +1,245 @@ 2.4 +// !$*UTF8*$! 2.5 +{ 2.6 + 0867D690FE84028FC02AAC07 /* Project object */ = { 2.7 + activeArchitecture = i386; 2.8 + activeBuildConfigurationName = Debug; 2.9 + activeExecutable = FAEC981A0D94C8750008EDA9 /* Sparkle Test App */; 2.10 + activeTarget = 61B5F90109C4CEE200B25A18 /* Sparkle Test App */; 2.11 + codeSenseManager = FAEC98240D94C8760008EDA9 /* Code sense */; 2.12 + executables = ( 2.13 + FAEC981A0D94C8750008EDA9 /* Sparkle Test App */, 2.14 + FAEC981B0D94C8750008EDA9 /* Relaunch Tool */, 2.15 + ); 2.16 + perUserDictionary = { 2.17 + PBXPerProjectTemplateStateSaveDate = 227854453; 2.18 + PBXWorkspaceStateSaveDate = 227854453; 2.19 + }; 2.20 + sourceControlManager = FAEC98230D94C8760008EDA9 /* Source Control */; 2.21 + userBuildSettings = { 2.22 + }; 2.23 + }; 2.24 + 61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = { 2.25 + activeExec = 0; 2.26 + executables = ( 2.27 + FAEC981A0D94C8750008EDA9 /* Sparkle Test App */, 2.28 + ); 2.29 + }; 2.30 + 8DC2EF4F0486A6940098B216 /* Sparkle */ = { 2.31 + activeExec = 0; 2.32 + }; 2.33 + D1E42C2E0CE754AE00F50EB9 /* Relaunch Tool */ = { 2.34 + activeExec = 0; 2.35 + executables = ( 2.36 + FAEC981B0D94C8750008EDA9 /* Relaunch Tool */, 2.37 + ); 2.38 + }; 2.39 + FAEC981A0D94C8750008EDA9 /* Sparkle Test App */ = { 2.40 + isa = PBXExecutable; 2.41 + activeArgIndices = ( 2.42 + ); 2.43 + argumentStrings = ( 2.44 + ); 2.45 + autoAttachOnCrash = 1; 2.46 + breakpointsEnabled = 1; 2.47 + configStateDict = { 2.48 + }; 2.49 + customDataFormattersEnabled = 1; 2.50 + debuggerPlugin = GDBDebugging; 2.51 + disassemblyDisplayState = 0; 2.52 + dylibVariantSuffix = ""; 2.53 + enableDebugStr = 1; 2.54 + environmentEntries = ( 2.55 + { 2.56 + active = YES; 2.57 + name = MallocPreScribble; 2.58 + value = 1; 2.59 + }, 2.60 + { 2.61 + active = YES; 2.62 + name = MallocScribble; 2.63 + value = 1; 2.64 + }, 2.65 + { 2.66 + active = YES; 2.67 + name = MallocGuardEdges; 2.68 + value = 1; 2.69 + }, 2.70 + { 2.71 + active = YES; 2.72 + name = MallocCheckHeapStart; 2.73 + value = 1; 2.74 + }, 2.75 + { 2.76 + active = YES; 2.77 + name = MallocCheckHeapEach; 2.78 + value = 100000; 2.79 + }, 2.80 + { 2.81 + active = YES; 2.82 + name = MallocStackLogging; 2.83 + value = 1; 2.84 + }, 2.85 + { 2.86 + active = NO; 2.87 + name = MallocStackLoggingNoCompact; 2.88 + value = 1; 2.89 + }, 2.90 + { 2.91 + active = YES; 2.92 + name = NSDebugEnabled; 2.93 + value = YES; 2.94 + }, 2.95 + { 2.96 + active = YES; 2.97 + name = NSZombieEnabled; 2.98 + value = YES; 2.99 + }, 2.100 + { 2.101 + active = NO; 2.102 + name = NSDeallocateZombies; 2.103 + value = NO; 2.104 + }, 2.105 + { 2.106 + active = YES; 2.107 + name = NSAutoreleaseFreedObjectCheckEnabled; 2.108 + value = YES; 2.109 + }, 2.110 + { 2.111 + active = NO; 2.112 + name = MALLOC_PROTECT_BEFORE; 2.113 + value = 1; 2.114 + }, 2.115 + { 2.116 + active = YES; 2.117 + name = MALLOC_ALTIVEC_SIZE; 2.118 + value = 1; 2.119 + }, 2.120 + { 2.121 + active = YES; 2.122 + name = MALLOC_FILL_SPACE; 2.123 + value = 1; 2.124 + }, 2.125 + { 2.126 + active = NO; 2.127 + name = CFZombieLevel; 2.128 + value = 65553; 2.129 + }, 2.130 + ); 2.131 + executableSystemSymbolLevel = 0; 2.132 + executableUserSymbolLevel = 0; 2.133 + libgmallocEnabled = 0; 2.134 + name = "Sparkle Test App"; 2.135 + sourceDirectories = ( 2.136 + ); 2.137 + }; 2.138 + FAEC981B0D94C8750008EDA9 /* Relaunch Tool */ = { 2.139 + isa = PBXExecutable; 2.140 + activeArgIndices = ( 2.141 + ); 2.142 + argumentStrings = ( 2.143 + ); 2.144 + autoAttachOnCrash = 1; 2.145 + breakpointsEnabled = 1; 2.146 + configStateDict = { 2.147 + }; 2.148 + customDataFormattersEnabled = 1; 2.149 + debuggerPlugin = GDBDebugging; 2.150 + disassemblyDisplayState = 0; 2.151 + dylibVariantSuffix = ""; 2.152 + enableDebugStr = 1; 2.153 + environmentEntries = ( 2.154 + { 2.155 + active = YES; 2.156 + name = MallocPreScribble; 2.157 + value = 1; 2.158 + }, 2.159 + { 2.160 + active = YES; 2.161 + name = MallocScribble; 2.162 + value = 1; 2.163 + }, 2.164 + { 2.165 + active = YES; 2.166 + name = MallocGuardEdges; 2.167 + value = 1; 2.168 + }, 2.169 + { 2.170 + active = YES; 2.171 + name = MallocCheckHeapStart; 2.172 + value = 1; 2.173 + }, 2.174 + { 2.175 + active = YES; 2.176 + name = MallocCheckHeapEach; 2.177 + value = 100000; 2.178 + }, 2.179 + { 2.180 + active = YES; 2.181 + name = MallocStackLogging; 2.182 + value = 1; 2.183 + }, 2.184 + { 2.185 + active = NO; 2.186 + name = MallocStackLoggingNoCompact; 2.187 + value = 1; 2.188 + }, 2.189 + { 2.190 + active = YES; 2.191 + name = NSDebugEnabled; 2.192 + value = YES; 2.193 + }, 2.194 + { 2.195 + active = YES; 2.196 + name = NSZombieEnabled; 2.197 + value = YES; 2.198 + }, 2.199 + { 2.200 + active = NO; 2.201 + name = NSDeallocateZombies; 2.202 + value = NO; 2.203 + }, 2.204 + { 2.205 + active = YES; 2.206 + name = NSAutoreleaseFreedObjectCheckEnabled; 2.207 + value = YES; 2.208 + }, 2.209 + { 2.210 + active = NO; 2.211 + name = MALLOC_PROTECT_BEFORE; 2.212 + value = 1; 2.213 + }, 2.214 + { 2.215 + active = YES; 2.216 + name = MALLOC_ALTIVEC_SIZE; 2.217 + value = 1; 2.218 + }, 2.219 + { 2.220 + active = YES; 2.221 + name = MALLOC_FILL_SPACE; 2.222 + value = 1; 2.223 + }, 2.224 + { 2.225 + active = NO; 2.226 + name = CFZombieLevel; 2.227 + value = 65553; 2.228 + }, 2.229 + ); 2.230 + executableSystemSymbolLevel = 0; 2.231 + executableUserSymbolLevel = 0; 2.232 + libgmallocEnabled = 0; 2.233 + name = "Relaunch Tool"; 2.234 + sourceDirectories = ( 2.235 + ); 2.236 + }; 2.237 + FAEC98230D94C8760008EDA9 /* Source Control */ = { 2.238 + isa = PBXSourceControlManager; 2.239 + fallbackIsa = XCSourceControlManager; 2.240 + isSCMEnabled = 0; 2.241 + scmConfiguration = { 2.242 + }; 2.243 + }; 2.244 + FAEC98240D94C8760008EDA9 /* Code sense */ = { 2.245 + isa = PBXCodeSenseManager; 2.246 + indexTemplatePath = ""; 2.247 + }; 2.248 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/tunblick/Sparkle.xcodeproj/project.pbxproj Wed Jul 29 11:23:17 2009 +0200 3.3 @@ -0,0 +1,1203 @@ 3.4 +// !$*UTF8*$! 3.5 +{ 3.6 + archiveVersion = 1; 3.7 + classes = { 3.8 + }; 3.9 + objectVersion = 44; 3.10 + objects = { 3.11 + 3.12 +/* Begin PBXBuildFile section */ 3.13 + 610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134710DD250470049ACDF /* SUUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.14 + 610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 610134720DD250470049ACDF /* SUUpdateDriver.m */; }; 3.15 + 6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.16 + 6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */; }; 3.17 + 6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; 3.18 + 6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; 3.19 + 6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */; }; 3.20 + 6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */; settings = {ATTRIBUTES = (); }; }; 3.21 + 6102FE5C0E08C7EC00F85D09 /* SUUnarchiver_Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */; }; 3.22 + 610D5A1A0A1661B8004AAD9C /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; 3.23 + 610D5A750A1670A4004AAD9C /* SUStatus.nib in Resources */ = {isa = PBXBuildFile; fileRef = 610D5A740A1670A4004AAD9C /* SUStatus.nib */; }; 3.24 + 610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */; }; 3.25 + 61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6117796E0D1112E000749C97 /* IOKit.framework */; }; 3.26 + 61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 61180BC80D64138900B4E0D1 /* SUWindowController.h */; settings = {ATTRIBUTES = (); }; }; 3.27 + 61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61180BC90D64138900B4E0D1 /* SUWindowController.m */; }; 3.28 + 6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */; settings = {ATTRIBUTES = (); }; }; 3.29 + 6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */; }; 3.30 + 61227A160DB548B800AB99EA /* SUVersionComparisonTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */; }; 3.31 + 61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */; settings = {ATTRIBUTES = (); }; }; 3.32 + 61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */; }; 3.33 + 61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */ = {isa = PBXBuildFile; fileRef = 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */; settings = {ATTRIBUTES = (); }; }; 3.34 + 61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A5B09CA6D4500B7442F /* SUConstants.h */; settings = {ATTRIBUTES = (); }; }; 3.35 + 61299A6009CA6EB100B7442F /* SUConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A5F09CA6EB100B7442F /* SUConstants.m */; }; 3.36 + 61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A8B09CA790200B7442F /* SUUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; 3.37 + 61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A8C09CA790200B7442F /* SUUnarchiver.m */; }; 3.38 + 61299B3609CB04E000B7442F /* Sparkle.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299B3509CB04E000B7442F /* Sparkle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3.39 + 612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */ = {isa = PBXBuildFile; fileRef = 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */; settings = {ATTRIBUTES = (); }; }; 3.40 + 612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */ = {isa = PBXBuildFile; fileRef = 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */; }; 3.41 + 61407C390A4099050009F71F /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; 3.42 + 615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */; }; 3.43 + 6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */; settings = {ATTRIBUTES = (); }; }; 3.44 + 61699BCC0DDB92BD005878A4 /* SUVersionComparisonTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */; settings = {ATTRIBUTES = (); }; }; 3.45 + 618E9CFD0E7328F1004646D8 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */; }; 3.46 + 618FA5010DAE88B40026945C /* SUInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA4FF0DAE88B40026945C /* SUInstaller.h */; settings = {ATTRIBUTES = (); }; }; 3.47 + 618FA5020DAE88B40026945C /* SUInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5000DAE88B40026945C /* SUInstaller.m */; }; 3.48 + 618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */; settings = {ATTRIBUTES = (); }; }; 3.49 + 618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */; }; 3.50 + 618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */; settings = {ATTRIBUTES = (); }; }; 3.51 + 618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */; }; 3.52 + 6196CFF909C72148000DC222 /* SUStatusController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6196CFE309C71ADE000DC222 /* SUStatusController.h */; settings = {ATTRIBUTES = (); }; }; 3.53 + 6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6196CFE409C71ADE000DC222 /* SUStatusController.m */; }; 3.54 + 61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3.55 + 61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */; settings = {ATTRIBUTES = (); }; }; 3.56 + 61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */; }; 3.57 + 61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */; settings = {ATTRIBUTES = (); }; }; 3.58 + 61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */; }; 3.59 + 61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.60 + 61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */; }; 3.61 + 61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8220A321A7F00D8810D /* Sparkle.strings */; }; 3.62 + 61AAE8290A321A8000D8810D /* SUAutomaticUpdateAlert.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */; }; 3.63 + 61AAE82A0A321A8000D8810D /* SUUpdateAlert.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */; }; 3.64 + 61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3.65 + 61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */; }; 3.66 + 61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */; }; 3.67 + 61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5F8F609C4CEB300B25A18 /* Security.framework */; }; 3.68 + 61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; 3.69 + 61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */; }; 3.70 + 61B5F92F09C4CFD800B25A18 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */; }; 3.71 + 61B5F93009C4CFDC00B25A18 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F92409C4CFC900B25A18 /* main.m */; }; 3.72 + 61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FB9509C4F04600B25A18 /* SUAppcast.m */; }; 3.73 + 61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FB9409C4F04600B25A18 /* SUAppcast.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3.74 + 61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */; }; 3.75 + 61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */; }; 3.76 + 61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3.77 + 61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */; }; 3.78 + 61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */; settings = {ATTRIBUTES = (); }; }; 3.79 + 61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.80 + 61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */; }; 3.81 + 61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.82 + 61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */; }; 3.83 + 61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.84 + 61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */; }; 3.85 + 61BBDF820A49220C00378739 /* Sparkle.icns in Resources */ = {isa = PBXBuildFile; fileRef = 61BBDF810A49220C00378739 /* Sparkle.icns */; }; 3.86 + 61C2680A0E2DB5D000175E6C /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 61C268090E2DB5D000175E6C /* License.txt */; }; 3.87 + 61C46F340D9C54F300B06326 /* SUUpdatePermissionPrompt.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */; }; 3.88 + 61CFB3290E385186007A1735 /* Sparkle.pch in Headers */ = {isa = PBXBuildFile; fileRef = 61CFB3280E385186007A1735 /* Sparkle.pch */; }; 3.89 + 61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */; }; 3.90 + 61EF67560E25B58D00F754E0 /* SUHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EF67550E25B58D00F754E0 /* SUHost.m */; }; 3.91 + 61EF67590E25C5B400F754E0 /* SUHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 61EF67580E25C5B400F754E0 /* SUHost.h */; }; 3.92 + 61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */; }; 3.93 + 61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; 3.94 + 61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 3.95 + DAAEFC9B0DA5722F0051E0D0 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; 3.96 + DAAEFD4E0DA572330051E0D0 /* relaunch.m in Sources */ = {isa = PBXBuildFile; fileRef = 613242130CD06CEF00106AA4 /* relaunch.m */; }; 3.97 + DAAEFD510DA572550051E0D0 /* relaunch in Resources */ = {isa = PBXBuildFile; fileRef = DAAEFC960DA571DF0051E0D0 /* relaunch */; }; 3.98 + FAEFA2F70D94AA7500472538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; 3.99 + FAEFA2F80D94AA7900472538 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; 3.100 + FAEFA3040D94AB3400472538 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; 3.101 + FAEFA3050D94AB3400472538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; 3.102 +/* End PBXBuildFile section */ 3.103 + 3.104 +/* Begin PBXContainerItemProxy section */ 3.105 + 61227AB90DB5C4BB00AB99EA /* PBXContainerItemProxy */ = { 3.106 + isa = PBXContainerItemProxy; 3.107 + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 3.108 + proxyType = 1; 3.109 + remoteGlobalIDString = 612279D80DB5470200AB99EA; 3.110 + remoteInfo = "Sparkle Unit Tests"; 3.111 + }; 3.112 + 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */ = { 3.113 + isa = PBXContainerItemProxy; 3.114 + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 3.115 + proxyType = 1; 3.116 + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; 3.117 + remoteInfo = Sparkle; 3.118 + }; 3.119 + 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */ = { 3.120 + isa = PBXContainerItemProxy; 3.121 + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 3.122 + proxyType = 1; 3.123 + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; 3.124 + remoteInfo = Sparkle; 3.125 + }; 3.126 + DAAEFD4F0DA572460051E0D0 /* PBXContainerItemProxy */ = { 3.127 + isa = PBXContainerItemProxy; 3.128 + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 3.129 + proxyType = 1; 3.130 + remoteGlobalIDString = DAAEFC950DA571DF0051E0D0; 3.131 + remoteInfo = relaunch; 3.132 + }; 3.133 +/* End PBXContainerItemProxy section */ 3.134 + 3.135 +/* Begin PBXCopyFilesBuildPhase section */ 3.136 + 61B5FB4D09C4E9FA00B25A18 /* CopyFiles */ = { 3.137 + isa = PBXCopyFilesBuildPhase; 3.138 + buildActionMask = 2147483647; 3.139 + dstPath = ""; 3.140 + dstSubfolderSpec = 10; 3.141 + files = ( 3.142 + 61407C390A4099050009F71F /* Sparkle.framework in CopyFiles */, 3.143 + ); 3.144 + runOnlyForDeploymentPostprocessing = 0; 3.145 + }; 3.146 +/* End PBXCopyFilesBuildPhase section */ 3.147 + 3.148 +/* Begin PBXFileReference section */ 3.149 + 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; 3.150 + 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; 3.151 + 610134710DD250470049ACDF /* SUUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateDriver.h; sourceTree = "<group>"; }; 3.152 + 610134720DD250470049ACDF /* SUUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateDriver.m; sourceTree = "<group>"; }; 3.153 + 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUProbingUpdateDriver.h; sourceTree = "<group>"; }; 3.154 + 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUProbingUpdateDriver.m; sourceTree = "<group>"; }; 3.155 + 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPipedUnarchiver.h; sourceTree = "<group>"; }; 3.156 + 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDiskImageUnarchiver.h; sourceTree = "<group>"; }; 3.157 + 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDiskImageUnarchiver.m; sourceTree = "<group>"; }; 3.158 + 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver_Private.h; sourceTree = "<group>"; }; 3.159 + 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver_Private.m; sourceTree = "<group>"; }; 3.160 + 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkReleaseGCSupport.xcconfig; sourceTree = "<group>"; }; 3.161 + 610D5A740A1670A4004AAD9C /* SUStatus.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = SUStatus.nib; sourceTree = "<group>"; }; 3.162 + 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NTSynchronousTask.m; sourceTree = "<group>"; }; 3.163 + 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NTSynchronousTask.h; sourceTree = "<group>"; }; 3.164 + 6117796E0D1112E000749C97 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; }; 3.165 + 61180BC80D64138900B4E0D1 /* SUWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUWindowController.h; sourceTree = "<group>"; }; 3.166 + 61180BC90D64138900B4E0D1 /* SUWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUWindowController.m; sourceTree = "<group>"; }; 3.167 + 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateAlert.h; sourceTree = "<group>"; }; 3.168 + 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateAlert.m; sourceTree = "<group>"; }; 3.169 + 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Sparkle Unit Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; 3.170 + 612279DA0DB5470200AB99EA /* Sparkle Unit Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Sparkle Unit Tests-Info.plist"; path = "Tests/Sparkle Unit Tests-Info.plist"; sourceTree = "<group>"; }; 3.171 + 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonTest.h; path = Tests/SUVersionComparisonTest.h; sourceTree = "<group>"; }; 3.172 + 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SUVersionComparisonTest.m; path = Tests/SUVersionComparisonTest.m; sourceTree = "<group>"; }; 3.173 + 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstallerInternals.h; sourceTree = "<group>"; }; 3.174 + 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDSAVerifier.h; sourceTree = "<group>"; }; 3.175 + 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDSAVerifier.m; sourceTree = "<group>"; }; 3.176 + 61299A5B09CA6D4500B7442F /* SUConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUConstants.h; sourceTree = "<group>"; }; 3.177 + 61299A5F09CA6EB100B7442F /* SUConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUConstants.m; sourceTree = "<group>"; }; 3.178 + 61299A8B09CA790200B7442F /* SUUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver.h; sourceTree = "<group>"; }; 3.179 + 61299A8C09CA790200B7442F /* SUUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver.m; sourceTree = "<group>"; }; 3.180 + 61299B3509CB04E000B7442F /* Sparkle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.h; sourceTree = "<group>"; }; 3.181 + 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPipedUnarchiver.m; sourceTree = "<group>"; }; 3.182 + 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdatePermissionPrompt.h; sourceTree = "<group>"; }; 3.183 + 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdatePermissionPrompt.m; sourceTree = "<group>"; }; 3.184 + 613242130CD06CEF00106AA4 /* relaunch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = relaunch.m; sourceTree = "<group>"; }; 3.185 + 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SUModelTranslation.plist; sourceTree = "<group>"; }; 3.186 + 618915700E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.187 + 618915710E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.188 + 618915720E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.189 + 618915730E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.190 + 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = "Test Application/dsa_pub.pem"; sourceTree = "<group>"; }; 3.191 + 618FA4FF0DAE88B40026945C /* SUInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUInstaller.h; sourceTree = "<group>"; }; 3.192 + 618FA5000DAE88B40026945C /* SUInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUInstaller.m; sourceTree = "<group>"; }; 3.193 + 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstaller.h; sourceTree = "<group>"; }; 3.194 + 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstaller.m; sourceTree = "<group>"; }; 3.195 + 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPackageInstaller.h; sourceTree = "<group>"; }; 3.196 + 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPackageInstaller.m; sourceTree = "<group>"; }; 3.197 + 6195D48F0E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.198 + 6195D4900E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.199 + 6195D4910E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.200 + 6195D4920E404AD700D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.201 + 6196CFE309C71ADE000DC222 /* SUStatusController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStatusController.h; sourceTree = "<group>"; }; 3.202 + 6196CFE409C71ADE000DC222 /* SUStatusController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStatusController.m; sourceTree = "<group>"; }; 3.203 + 619B17200E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.204 + 619B17210E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.205 + 619B17220E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.206 + 619B17230E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.207 + 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUVersionComparisonProtocol.h; sourceTree = "<group>"; }; 3.208 + 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStandardVersionComparator.h; sourceTree = "<group>"; }; 3.209 + 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStandardVersionComparator.m; sourceTree = "<group>"; }; 3.210 + 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUSystemProfiler.h; sourceTree = "<group>"; }; 3.211 + 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUSystemProfiler.m; sourceTree = "<group>"; }; 3.212 + 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUserInitiatedUpdateDriver.h; sourceTree = "<group>"; }; 3.213 + 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUserInitiatedUpdateDriver.m; sourceTree = "<group>"; }; 3.214 + 61AAE8230A321A7F00D8810D /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.215 + 61AAE8250A321A7F00D8810D /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.216 + 61AAE8270A321A7F00D8810D /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.217 + 61AAE84F0A321AF700D8810D /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.218 + 61AAE8590A321B0400D8810D /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.219 + 61AAE8710A321F7700D8810D /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.220 + 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SUUpdater.h; sourceTree = "<group>"; }; 3.221 + 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUUpdater.m; sourceTree = "<group>"; }; 3.222 + 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstallerInternals.m; sourceTree = "<group>"; }; 3.223 + 61B5F8F609C4CEB300B25A18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; }; 3.224 + 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sparkle Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 3.225 + 61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Test Application-Info.plist"; path = "Test Application/Test Application-Info.plist"; sourceTree = "<group>"; }; 3.226 + 61B5F92409C4CFC900B25A18 /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Test Application/main.m"; sourceTree = "<group>"; }; 3.227 + 61B5F92B09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = "Test Application/English.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; 3.228 + 61B5F92D09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = "Test Application/English.lproj/MainMenu.nib"; sourceTree = "<group>"; }; 3.229 + 61B5FB9409C4F04600B25A18 /* SUAppcast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcast.h; sourceTree = "<group>"; }; 3.230 + 61B5FB9509C4F04600B25A18 /* SUAppcast.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcast.m; sourceTree = "<group>"; }; 3.231 + 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = "<absolute>"; }; 3.232 + 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcastItem.h; sourceTree = "<group>"; }; 3.233 + 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcastItem.m; sourceTree = "<group>"; }; 3.234 + 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateAlert.h; sourceTree = "<group>"; }; 3.235 + 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateAlert.m; sourceTree = "<group>"; }; 3.236 + 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUIBasedUpdateDriver.h; sourceTree = "<group>"; }; 3.237 + 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUIBasedUpdateDriver.m; sourceTree = "<group>"; }; 3.238 + 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateDriver.h; sourceTree = "<group>"; }; 3.239 + 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateDriver.m; sourceTree = "<group>"; }; 3.240 + 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUScheduledUpdateDriver.h; sourceTree = "<group>"; }; 3.241 + 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUScheduledUpdateDriver.m; sourceTree = "<group>"; }; 3.242 + 61BBDF810A49220C00378739 /* Sparkle.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Sparkle.icns; sourceTree = "<group>"; }; 3.243 + 61C268090E2DB5D000175E6C /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.txt; sourceTree = "<group>"; }; 3.244 + 61C46F350D9C54F300B06326 /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.245 + 61CFB3280E385186007A1735 /* Sparkle.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.pch; sourceTree = "<group>"; }; 3.246 + 61EF67550E25B58D00F754E0 /* SUHost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUHost.m; sourceTree = "<group>"; }; 3.247 + 61EF67580E25C5B400F754E0 /* SUHost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUHost.h; sourceTree = "<group>"; }; 3.248 + 61F3651A0E18987B007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.249 + 61F3652A0E189883007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.250 + 61F3652B0E189883007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.251 + 61F3652E0E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.252 + 61F3652F0E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.253 + 61F365300E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.254 + 61F365330E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.255 + 61F365340E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.256 + 61F365350E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.257 + 61F614540E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Sparkle.strings; sourceTree = "<group>"; }; 3.258 + 61F614550E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUAutomaticUpdateAlert.nib; sourceTree = "<group>"; }; 3.259 + 61F614560E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUUpdateAlert.nib; sourceTree = "<group>"; }; 3.260 + 61F614570E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUUpdatePermissionPrompt.nib; sourceTree = "<group>"; }; 3.261 + 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBasicUpdateDriver.h; sourceTree = "<group>"; }; 3.262 + 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBasicUpdateDriver.m; sourceTree = "<group>"; }; 3.263 + 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 3.264 + 8DC2EF5B0486A6940098B216 /* Sparkle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sparkle.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3.265 + DAAEFC960DA571DF0051E0D0 /* relaunch */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = relaunch; sourceTree = BUILT_PRODUCTS_DIR; }; 3.266 + FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkDebug.xcconfig; sourceTree = "<group>"; }; 3.267 + FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppDebug.xcconfig; sourceTree = "<group>"; }; 3.268 + FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonRelease.xcconfig; sourceTree = "<group>"; }; 3.269 + FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestApp.xcconfig; sourceTree = "<group>"; }; 3.270 + FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunch.xcconfig; sourceTree = "<group>"; }; 3.271 + FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonDebug.xcconfig; sourceTree = "<group>"; }; 3.272 + FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommon.xcconfig; sourceTree = "<group>"; }; 3.273 + FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFramework.xcconfig; sourceTree = "<group>"; }; 3.274 + FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppRelease.xcconfig; sourceTree = "<group>"; }; 3.275 + FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchDebug.xcconfig; sourceTree = "<group>"; }; 3.276 + FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchRelease.xcconfig; sourceTree = "<group>"; }; 3.277 + FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkRelease.xcconfig; sourceTree = "<group>"; }; 3.278 +/* End PBXFileReference section */ 3.279 + 3.280 +/* Begin PBXFrameworksBuildPhase section */ 3.281 + 612279D60DB5470200AB99EA /* Frameworks */ = { 3.282 + isa = PBXFrameworksBuildPhase; 3.283 + buildActionMask = 2147483647; 3.284 + files = ( 3.285 + 61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */, 3.286 + ); 3.287 + runOnlyForDeploymentPostprocessing = 0; 3.288 + }; 3.289 + 61B5F90009C4CEE200B25A18 /* Frameworks */ = { 3.290 + isa = PBXFrameworksBuildPhase; 3.291 + buildActionMask = 2147483647; 3.292 + files = ( 3.293 + 61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */, 3.294 + 610D5A1A0A1661B8004AAD9C /* Sparkle.framework in Frameworks */, 3.295 + FAEFA3040D94AB3400472538 /* AppKit.framework in Frameworks */, 3.296 + FAEFA3050D94AB3400472538 /* Foundation.framework in Frameworks */, 3.297 + ); 3.298 + runOnlyForDeploymentPostprocessing = 0; 3.299 + }; 3.300 + 8DC2EF560486A6940098B216 /* Frameworks */ = { 3.301 + isa = PBXFrameworksBuildPhase; 3.302 + buildActionMask = 2147483647; 3.303 + files = ( 3.304 + 61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */, 3.305 + 61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */, 3.306 + 61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */, 3.307 + FAEFA2F70D94AA7500472538 /* Foundation.framework in Frameworks */, 3.308 + FAEFA2F80D94AA7900472538 /* AppKit.framework in Frameworks */, 3.309 + ); 3.310 + runOnlyForDeploymentPostprocessing = 0; 3.311 + }; 3.312 + DAAEFC940DA571DF0051E0D0 /* Frameworks */ = { 3.313 + isa = PBXFrameworksBuildPhase; 3.314 + buildActionMask = 2147483647; 3.315 + files = ( 3.316 + DAAEFC9B0DA5722F0051E0D0 /* AppKit.framework in Frameworks */, 3.317 + ); 3.318 + runOnlyForDeploymentPostprocessing = 0; 3.319 + }; 3.320 +/* End PBXFrameworksBuildPhase section */ 3.321 + 3.322 +/* Begin PBXGroup section */ 3.323 + 034768DFFF38A50411DB9C8B /* Products */ = { 3.324 + isa = PBXGroup; 3.325 + children = ( 3.326 + 8DC2EF5B0486A6940098B216 /* Sparkle.framework */, 3.327 + 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */, 3.328 + DAAEFC960DA571DF0051E0D0 /* relaunch */, 3.329 + 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */, 3.330 + ); 3.331 + name = Products; 3.332 + sourceTree = "<group>"; 3.333 + }; 3.334 + 0867D691FE84028FC02AAC07 /* Sparkle */ = { 3.335 + isa = PBXGroup; 3.336 + children = ( 3.337 + 61F83F6E0DBFE07A006FDD30 /* Update Control */, 3.338 + 61299B3909CB055000B7442F /* Appcast Support */, 3.339 + 618FA6DB0DB485440026945C /* Installation */, 3.340 + 6101354A0DD25B7F0049ACDF /* Unarchiving */, 3.341 + 61299B3A09CB056100B7442F /* User Interface */, 3.342 + 61B5F8F309C4CE5900B25A18 /* Other Sources */, 3.343 + 089C1665FE841158C02AAC07 /* Framework Resources */, 3.344 + 61227A100DB5484000AB99EA /* Tests */, 3.345 + 61B5F91D09C4CF7F00B25A18 /* Test Application Sources */, 3.346 + 0867D69AFE84028FC02AAC07 /* Apple Frameworks and Libraries */, 3.347 + FA1941C40D94A6EA00DD942E /* Configurations */, 3.348 + 034768DFFF38A50411DB9C8B /* Products */, 3.349 + ); 3.350 + name = Sparkle; 3.351 + sourceTree = "<group>"; 3.352 + }; 3.353 + 0867D69AFE84028FC02AAC07 /* Apple Frameworks and Libraries */ = { 3.354 + isa = PBXGroup; 3.355 + children = ( 3.356 + 6117796E0D1112E000749C97 /* IOKit.framework */, 3.357 + 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */, 3.358 + 61B5F8F609C4CEB300B25A18 /* Security.framework */, 3.359 + 0867D6A5FE840307C02AAC07 /* AppKit.framework */, 3.360 + 0867D69BFE84028FC02AAC07 /* Foundation.framework */, 3.361 + ); 3.362 + name = "Apple Frameworks and Libraries"; 3.363 + sourceTree = "<group>"; 3.364 + }; 3.365 + 089C1665FE841158C02AAC07 /* Framework Resources */ = { 3.366 + isa = PBXGroup; 3.367 + children = ( 3.368 + 8DC2EF5A0486A6940098B216 /* Info.plist */, 3.369 + 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */, 3.370 + 61C268090E2DB5D000175E6C /* License.txt */, 3.371 + 61AAE8220A321A7F00D8810D /* Sparkle.strings */, 3.372 + 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */, 3.373 + 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */, 3.374 + 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */, 3.375 + 610D5A740A1670A4004AAD9C /* SUStatus.nib */, 3.376 + ); 3.377 + name = "Framework Resources"; 3.378 + sourceTree = "<group>"; 3.379 + }; 3.380 + 6101354A0DD25B7F0049ACDF /* Unarchiving */ = { 3.381 + isa = PBXGroup; 3.382 + children = ( 3.383 + 61299A8B09CA790200B7442F /* SUUnarchiver.h */, 3.384 + 61299A8C09CA790200B7442F /* SUUnarchiver.m */, 3.385 + 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */, 3.386 + 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */, 3.387 + 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */, 3.388 + 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */, 3.389 + 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */, 3.390 + 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */, 3.391 + 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */, 3.392 + 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */, 3.393 + ); 3.394 + name = Unarchiving; 3.395 + sourceTree = "<group>"; 3.396 + }; 3.397 + 6101355D0DD25BB70049ACDF /* Support */ = { 3.398 + isa = PBXGroup; 3.399 + children = ( 3.400 + 613242130CD06CEF00106AA4 /* relaunch.m */, 3.401 + ); 3.402 + name = Support; 3.403 + sourceTree = "<group>"; 3.404 + }; 3.405 + 61227A100DB5484000AB99EA /* Tests */ = { 3.406 + isa = PBXGroup; 3.407 + children = ( 3.408 + 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */, 3.409 + 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */, 3.410 + 612279DA0DB5470200AB99EA /* Sparkle Unit Tests-Info.plist */, 3.411 + ); 3.412 + name = Tests; 3.413 + sourceTree = "<group>"; 3.414 + }; 3.415 + 61299B3909CB055000B7442F /* Appcast Support */ = { 3.416 + isa = PBXGroup; 3.417 + children = ( 3.418 + 61B5FB9409C4F04600B25A18 /* SUAppcast.h */, 3.419 + 61B5FB9509C4F04600B25A18 /* SUAppcast.m */, 3.420 + 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */, 3.421 + 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */, 3.422 + 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */, 3.423 + 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */, 3.424 + 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */, 3.425 + 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */, 3.426 + 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */, 3.427 + ); 3.428 + name = "Appcast Support"; 3.429 + sourceTree = "<group>"; 3.430 + }; 3.431 + 61299B3A09CB056100B7442F /* User Interface */ = { 3.432 + isa = PBXGroup; 3.433 + children = ( 3.434 + 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */, 3.435 + 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */, 3.436 + 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */, 3.437 + 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */, 3.438 + 6196CFE309C71ADE000DC222 /* SUStatusController.h */, 3.439 + 6196CFE409C71ADE000DC222 /* SUStatusController.m */, 3.440 + 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */, 3.441 + 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */, 3.442 + 61180BC80D64138900B4E0D1 /* SUWindowController.h */, 3.443 + 61180BC90D64138900B4E0D1 /* SUWindowController.m */, 3.444 + ); 3.445 + name = "User Interface"; 3.446 + sourceTree = "<group>"; 3.447 + }; 3.448 + 618FA6DB0DB485440026945C /* Installation */ = { 3.449 + isa = PBXGroup; 3.450 + children = ( 3.451 + 618FA4FF0DAE88B40026945C /* SUInstaller.h */, 3.452 + 618FA5000DAE88B40026945C /* SUInstaller.m */, 3.453 + 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */, 3.454 + 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */, 3.455 + 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */, 3.456 + 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */, 3.457 + 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */, 3.458 + 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */, 3.459 + 6101355D0DD25BB70049ACDF /* Support */, 3.460 + ); 3.461 + name = Installation; 3.462 + sourceTree = "<group>"; 3.463 + }; 3.464 + 61B5F8F309C4CE5900B25A18 /* Other Sources */ = { 3.465 + isa = PBXGroup; 3.466 + children = ( 3.467 + 61EF67580E25C5B400F754E0 /* SUHost.h */, 3.468 + 61EF67550E25B58D00F754E0 /* SUHost.m */, 3.469 + 61299B3509CB04E000B7442F /* Sparkle.h */, 3.470 + 61CFB3280E385186007A1735 /* Sparkle.pch */, 3.471 + 61299A5B09CA6D4500B7442F /* SUConstants.h */, 3.472 + 61299A5F09CA6EB100B7442F /* SUConstants.m */, 3.473 + ); 3.474 + includeInIndex = 1; 3.475 + name = "Other Sources"; 3.476 + sourceTree = "<group>"; 3.477 + }; 3.478 + 61B5F91D09C4CF7F00B25A18 /* Test Application Sources */ = { 3.479 + isa = PBXGroup; 3.480 + children = ( 3.481 + 61BBDF810A49220C00378739 /* Sparkle.icns */, 3.482 + 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */, 3.483 + 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */, 3.484 + 61B5F92409C4CFC900B25A18 /* main.m */, 3.485 + 61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */, 3.486 + 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */, 3.487 + ); 3.488 + name = "Test Application Sources"; 3.489 + sourceTree = "<group>"; 3.490 + }; 3.491 + 61CFB2C10E384958007A1735 /* Support */ = { 3.492 + isa = PBXGroup; 3.493 + children = ( 3.494 + 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */, 3.495 + 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */, 3.496 + ); 3.497 + name = Support; 3.498 + sourceTree = "<group>"; 3.499 + }; 3.500 + 61CFB2C20E38496B007A1735 /* Drivers */ = { 3.501 + isa = PBXGroup; 3.502 + children = ( 3.503 + 610134710DD250470049ACDF /* SUUpdateDriver.h */, 3.504 + 610134720DD250470049ACDF /* SUUpdateDriver.m */, 3.505 + 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */, 3.506 + 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */, 3.507 + 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */, 3.508 + 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */, 3.509 + 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */, 3.510 + 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */, 3.511 + 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */, 3.512 + 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */, 3.513 + 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */, 3.514 + 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */, 3.515 + 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */, 3.516 + 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */, 3.517 + ); 3.518 + name = Drivers; 3.519 + sourceTree = "<group>"; 3.520 + }; 3.521 + 61F83F6E0DBFE07A006FDD30 /* Update Control */ = { 3.522 + isa = PBXGroup; 3.523 + children = ( 3.524 + 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */, 3.525 + 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */, 3.526 + 61CFB2C20E38496B007A1735 /* Drivers */, 3.527 + 61CFB2C10E384958007A1735 /* Support */, 3.528 + ); 3.529 + name = "Update Control"; 3.530 + sourceTree = "<group>"; 3.531 + }; 3.532 + FA1941C40D94A6EA00DD942E /* Configurations */ = { 3.533 + isa = PBXGroup; 3.534 + children = ( 3.535 + FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */, 3.536 + FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */, 3.537 + FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */, 3.538 + FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */, 3.539 + FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */, 3.540 + FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */, 3.541 + 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */, 3.542 + FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */, 3.543 + FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */, 3.544 + FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */, 3.545 + FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */, 3.546 + FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */, 3.547 + FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */, 3.548 + ); 3.549 + path = Configurations; 3.550 + sourceTree = "<group>"; 3.551 + }; 3.552 +/* End PBXGroup section */ 3.553 + 3.554 +/* Begin PBXHeadersBuildPhase section */ 3.555 + 8DC2EF500486A6940098B216 /* Headers */ = { 3.556 + isa = PBXHeadersBuildPhase; 3.557 + buildActionMask = 2147483647; 3.558 + files = ( 3.559 + 61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */, 3.560 + 61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */, 3.561 + 61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */, 3.562 + 61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */, 3.563 + 6196CFF909C72148000DC222 /* SUStatusController.h in Headers */, 3.564 + 61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */, 3.565 + 61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */, 3.566 + 61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */, 3.567 + 61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */, 3.568 + 61299B3609CB04E000B7442F /* Sparkle.h in Headers */, 3.569 + 6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */, 3.570 + 61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */, 3.571 + 61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */, 3.572 + 61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */, 3.573 + 6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */, 3.574 + 612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */, 3.575 + 61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */, 3.576 + 618FA5010DAE88B40026945C /* SUInstaller.h in Headers */, 3.577 + 618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */, 3.578 + 618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */, 3.579 + 61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */, 3.580 + 61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */, 3.581 + 61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */, 3.582 + 61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */, 3.583 + 610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */, 3.584 + 6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */, 3.585 + 61699BCC0DDB92BD005878A4 /* SUVersionComparisonTest.h in Headers */, 3.586 + 61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */, 3.587 + 6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */, 3.588 + 6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */, 3.589 + 6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */, 3.590 + 61EF67590E25C5B400F754E0 /* SUHost.h in Headers */, 3.591 + 61CFB3290E385186007A1735 /* Sparkle.pch in Headers */, 3.592 + ); 3.593 + runOnlyForDeploymentPostprocessing = 0; 3.594 + }; 3.595 +/* End PBXHeadersBuildPhase section */ 3.596 + 3.597 +/* Begin PBXNativeTarget section */ 3.598 + 612279D80DB5470200AB99EA /* Sparkle Unit Tests */ = { 3.599 + isa = PBXNativeTarget; 3.600 + buildConfigurationList = 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */; 3.601 + buildPhases = ( 3.602 + 612279D40DB5470200AB99EA /* Resources */, 3.603 + 612279D50DB5470200AB99EA /* Sources */, 3.604 + 612279D60DB5470200AB99EA /* Frameworks */, 3.605 + 612279D70DB5470200AB99EA /* ShellScript */, 3.606 + ); 3.607 + buildRules = ( 3.608 + ); 3.609 + dependencies = ( 3.610 + 61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */, 3.611 + ); 3.612 + name = "Sparkle Unit Tests"; 3.613 + productName = "Sparkle Unit Tests"; 3.614 + productReference = 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */; 3.615 + productType = "com.apple.product-type.bundle"; 3.616 + }; 3.617 + 61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = { 3.618 + isa = PBXNativeTarget; 3.619 + buildConfigurationList = 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */; 3.620 + buildPhases = ( 3.621 + 61B5F8FE09C4CEE200B25A18 /* Resources */, 3.622 + 61B5F8FF09C4CEE200B25A18 /* Sources */, 3.623 + 61B5F90009C4CEE200B25A18 /* Frameworks */, 3.624 + 61B5FB4D09C4E9FA00B25A18 /* CopyFiles */, 3.625 + ); 3.626 + buildRules = ( 3.627 + ); 3.628 + dependencies = ( 3.629 + 61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */, 3.630 + 61227ABA0DB5C4BB00AB99EA /* PBXTargetDependency */, 3.631 + ); 3.632 + name = "Sparkle Test App"; 3.633 + productName = "Test Application"; 3.634 + productReference = 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */; 3.635 + productType = "com.apple.product-type.application"; 3.636 + }; 3.637 + 8DC2EF4F0486A6940098B216 /* Sparkle */ = { 3.638 + isa = PBXNativeTarget; 3.639 + buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */; 3.640 + buildPhases = ( 3.641 + 8DC2EF500486A6940098B216 /* Headers */, 3.642 + 8DC2EF520486A6940098B216 /* Resources */, 3.643 + 8DC2EF540486A6940098B216 /* Sources */, 3.644 + 8DC2EF560486A6940098B216 /* Frameworks */, 3.645 + 6131B1910DDCDE32005215F0 /* Run Script: Set Bzr Version Info */, 3.646 + 6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */, 3.647 + ); 3.648 + buildRules = ( 3.649 + ); 3.650 + dependencies = ( 3.651 + DAAEFD500DA572460051E0D0 /* PBXTargetDependency */, 3.652 + ); 3.653 + name = Sparkle; 3.654 + productInstallPath = "$(HOME)/Library/Frameworks"; 3.655 + productName = Sparkle; 3.656 + productReference = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; 3.657 + productType = "com.apple.product-type.framework"; 3.658 + }; 3.659 + DAAEFC950DA571DF0051E0D0 /* relaunch tool */ = { 3.660 + isa = PBXNativeTarget; 3.661 + buildConfigurationList = DAAEFC9A0DA571FD0051E0D0 /* Build configuration list for PBXNativeTarget "relaunch tool" */; 3.662 + buildPhases = ( 3.663 + DAAEFC930DA571DF0051E0D0 /* Sources */, 3.664 + DAAEFC940DA571DF0051E0D0 /* Frameworks */, 3.665 + ); 3.666 + buildRules = ( 3.667 + ); 3.668 + dependencies = ( 3.669 + ); 3.670 + name = "relaunch tool"; 3.671 + productName = relaunch; 3.672 + productReference = DAAEFC960DA571DF0051E0D0 /* relaunch */; 3.673 + productType = "com.apple.product-type.tool"; 3.674 + }; 3.675 +/* End PBXNativeTarget section */ 3.676 + 3.677 +/* Begin PBXProject section */ 3.678 + 0867D690FE84028FC02AAC07 /* Project object */ = { 3.679 + isa = PBXProject; 3.680 + buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */; 3.681 + compatibilityVersion = "Xcode 3.0"; 3.682 + hasScannedForEncodings = 1; 3.683 + knownRegions = ( 3.684 + English, 3.685 + Japanese, 3.686 + French, 3.687 + German, 3.688 + Italian, 3.689 + zh_TW, 3.690 + en, 3.691 + ca, 3.692 + cs, 3.693 + cy, 3.694 + da, 3.695 + de, 3.696 + es, 3.697 + fi, 3.698 + fr, 3.699 + he, 3.700 + hu, 3.701 + id, 3.702 + is, 3.703 + it, 3.704 + ja, 3.705 + ko, 3.706 + nl, 3.707 + no, 3.708 + pl, 3.709 + ru, 3.710 + sk, 3.711 + sv, 3.712 + th, 3.713 + tr, 3.714 + zh_CN, 3.715 + fr_ca, 3.716 + ); 3.717 + mainGroup = 0867D691FE84028FC02AAC07 /* Sparkle */; 3.718 + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; 3.719 + projectDirPath = ""; 3.720 + projectRoot = ""; 3.721 + targets = ( 3.722 + 8DC2EF4F0486A6940098B216 /* Sparkle */, 3.723 + 61B5F90109C4CEE200B25A18 /* Sparkle Test App */, 3.724 + DAAEFC950DA571DF0051E0D0 /* relaunch tool */, 3.725 + 612279D80DB5470200AB99EA /* Sparkle Unit Tests */, 3.726 + ); 3.727 + }; 3.728 +/* End PBXProject section */ 3.729 + 3.730 +/* Begin PBXResourcesBuildPhase section */ 3.731 + 612279D40DB5470200AB99EA /* Resources */ = { 3.732 + isa = PBXResourcesBuildPhase; 3.733 + buildActionMask = 2147483647; 3.734 + files = ( 3.735 + ); 3.736 + runOnlyForDeploymentPostprocessing = 0; 3.737 + }; 3.738 + 61B5F8FE09C4CEE200B25A18 /* Resources */ = { 3.739 + isa = PBXResourcesBuildPhase; 3.740 + buildActionMask = 2147483647; 3.741 + files = ( 3.742 + 61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */, 3.743 + 61B5F92F09C4CFD800B25A18 /* MainMenu.nib in Resources */, 3.744 + 61BBDF820A49220C00378739 /* Sparkle.icns in Resources */, 3.745 + 618E9CFD0E7328F1004646D8 /* dsa_pub.pem in Resources */, 3.746 + ); 3.747 + runOnlyForDeploymentPostprocessing = 0; 3.748 + }; 3.749 + 8DC2EF520486A6940098B216 /* Resources */ = { 3.750 + isa = PBXResourcesBuildPhase; 3.751 + buildActionMask = 2147483647; 3.752 + files = ( 3.753 + 61C2680A0E2DB5D000175E6C /* License.txt in Resources */, 3.754 + DAAEFD510DA572550051E0D0 /* relaunch in Resources */, 3.755 + 610D5A750A1670A4004AAD9C /* SUStatus.nib in Resources */, 3.756 + 61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */, 3.757 + 61AAE8290A321A8000D8810D /* SUAutomaticUpdateAlert.nib in Resources */, 3.758 + 61AAE82A0A321A8000D8810D /* SUUpdateAlert.nib in Resources */, 3.759 + 615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */, 3.760 + 61C46F340D9C54F300B06326 /* SUUpdatePermissionPrompt.nib in Resources */, 3.761 + ); 3.762 + runOnlyForDeploymentPostprocessing = 0; 3.763 + }; 3.764 +/* End PBXResourcesBuildPhase section */ 3.765 + 3.766 +/* Begin PBXShellScriptBuildPhase section */ 3.767 + 612279D70DB5470200AB99EA /* ShellScript */ = { 3.768 + isa = PBXShellScriptBuildPhase; 3.769 + buildActionMask = 2147483647; 3.770 + files = ( 3.771 + ); 3.772 + inputPaths = ( 3.773 + ); 3.774 + outputPaths = ( 3.775 + ); 3.776 + runOnlyForDeploymentPostprocessing = 0; 3.777 + shellPath = /bin/sh; 3.778 + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; 3.779 + showEnvVarsInLog = 0; 3.780 + }; 3.781 + 6131B1910DDCDE32005215F0 /* Run Script: Set Bzr Version Info */ = { 3.782 + isa = PBXShellScriptBuildPhase; 3.783 + buildActionMask = 12; 3.784 + files = ( 3.785 + ); 3.786 + inputPaths = ( 3.787 + ); 3.788 + name = "Run Script: Set Bzr Version Info"; 3.789 + outputPaths = ( 3.790 + ); 3.791 + runOnlyForDeploymentPostprocessing = 0; 3.792 + shellPath = "/usr/bin/env ruby"; 3.793 + shellScript = "# Xcode auto-versioning script for Subversion\n# by Axel Andersson, modified by Daniel Jalkut to add\n# \"--revision HEAD\" to the svn info line, which allows\n# the latest revision to always be used.\n\nif ENV[\"BUILT_PRODUCTS_DIR\"].nil?\n\tSTDERR.print \"#{$0}: Must be run from Xcode!\"\n\texit(1)\nend\n\n# Get the current Bzr revision number and use it to set the CFBundleVersion value\nENV[\"PATH\"] = \"/bin:/sw/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/opt/local/bin\"\nexit(0) if `type bzr` == \"\"\nrev = `/usr/bin/env bzr revno`\ninfo = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"WRAPPER_NAME\"]}/Resources/Info.plist\"\nversion = rev[/[\\d.]+/]\n\nif version.nil?\n\tSTDERR.print \"#{$0}: Can't find a Bazaar revision!\"\n\texit(0)\nend\n\ninfo_contents = File.read(info)\nif info_contents.nil?\n\tSTDERR.print \"#{$0}: Can't read in the Info.plist file!\"\n\texit(1)\nend\n\ninfo_contents.sub!(/([\\t ]+<key>CFBundleVersion<\\/key>\\n[\\t ]+<string>).*?(<\\/string>)/, '\\1' + version + '\\2')\nSTDERR.print info_contents\nf = File.open(info, \"w\")\nf.write(info_contents)\nf.close"; 3.794 + showEnvVarsInLog = 0; 3.795 + }; 3.796 + 6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */ = { 3.797 + isa = PBXShellScriptBuildPhase; 3.798 + buildActionMask = 2147483647; 3.799 + files = ( 3.800 + ); 3.801 + inputPaths = ( 3.802 + ); 3.803 + name = "Run Script: Link fr_CA to fr"; 3.804 + outputPaths = ( 3.805 + ); 3.806 + runOnlyForDeploymentPostprocessing = 0; 3.807 + shellPath = "/usr/bin/env ruby"; 3.808 + shellScript = "resources = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"WRAPPER_NAME\"]}/Resources\"\n`ln -s \"#{resources}/fr.lproj\" \"#{resources}/fr_CA.lproj\"`"; 3.809 + }; 3.810 +/* End PBXShellScriptBuildPhase section */ 3.811 + 3.812 +/* Begin PBXSourcesBuildPhase section */ 3.813 + 612279D50DB5470200AB99EA /* Sources */ = { 3.814 + isa = PBXSourcesBuildPhase; 3.815 + buildActionMask = 2147483647; 3.816 + files = ( 3.817 + 61227A160DB548B800AB99EA /* SUVersionComparisonTest.m in Sources */, 3.818 + ); 3.819 + runOnlyForDeploymentPostprocessing = 0; 3.820 + }; 3.821 + 61B5F8FF09C4CEE200B25A18 /* Sources */ = { 3.822 + isa = PBXSourcesBuildPhase; 3.823 + buildActionMask = 2147483647; 3.824 + files = ( 3.825 + 61B5F93009C4CFDC00B25A18 /* main.m in Sources */, 3.826 + ); 3.827 + runOnlyForDeploymentPostprocessing = 0; 3.828 + }; 3.829 + 8DC2EF540486A6940098B216 /* Sources */ = { 3.830 + isa = PBXSourcesBuildPhase; 3.831 + buildActionMask = 2147483647; 3.832 + files = ( 3.833 + 61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */, 3.834 + 61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */, 3.835 + 61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */, 3.836 + 61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */, 3.837 + 61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */, 3.838 + 6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */, 3.839 + 61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */, 3.840 + 61299A6009CA6EB100B7442F /* SUConstants.m in Sources */, 3.841 + 61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */, 3.842 + 6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */, 3.843 + 610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */, 3.844 + 61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */, 3.845 + 61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */, 3.846 + 612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */, 3.847 + 61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */, 3.848 + 618FA5020DAE88B40026945C /* SUInstaller.m in Sources */, 3.849 + 618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */, 3.850 + 618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */, 3.851 + 61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */, 3.852 + 61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */, 3.853 + 61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */, 3.854 + 61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */, 3.855 + 610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */, 3.856 + 6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */, 3.857 + 61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */, 3.858 + 6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */, 3.859 + 6102FE5C0E08C7EC00F85D09 /* SUUnarchiver_Private.m in Sources */, 3.860 + 61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */, 3.861 + 61EF67560E25B58D00F754E0 /* SUHost.m in Sources */, 3.862 + ); 3.863 + runOnlyForDeploymentPostprocessing = 0; 3.864 + }; 3.865 + DAAEFC930DA571DF0051E0D0 /* Sources */ = { 3.866 + isa = PBXSourcesBuildPhase; 3.867 + buildActionMask = 2147483647; 3.868 + files = ( 3.869 + DAAEFD4E0DA572330051E0D0 /* relaunch.m in Sources */, 3.870 + ); 3.871 + runOnlyForDeploymentPostprocessing = 0; 3.872 + }; 3.873 +/* End PBXSourcesBuildPhase section */ 3.874 + 3.875 +/* Begin PBXTargetDependency section */ 3.876 + 61227ABA0DB5C4BB00AB99EA /* PBXTargetDependency */ = { 3.877 + isa = PBXTargetDependency; 3.878 + target = 612279D80DB5470200AB99EA /* Sparkle Unit Tests */; 3.879 + targetProxy = 61227AB90DB5C4BB00AB99EA /* PBXContainerItemProxy */; 3.880 + }; 3.881 + 61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */ = { 3.882 + isa = PBXTargetDependency; 3.883 + target = 8DC2EF4F0486A6940098B216 /* Sparkle */; 3.884 + targetProxy = 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */; 3.885 + }; 3.886 + 61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */ = { 3.887 + isa = PBXTargetDependency; 3.888 + target = 8DC2EF4F0486A6940098B216 /* Sparkle */; 3.889 + targetProxy = 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */; 3.890 + }; 3.891 + DAAEFD500DA572460051E0D0 /* PBXTargetDependency */ = { 3.892 + isa = PBXTargetDependency; 3.893 + target = DAAEFC950DA571DF0051E0D0 /* relaunch tool */; 3.894 + targetProxy = DAAEFD4F0DA572460051E0D0 /* PBXContainerItemProxy */; 3.895 + }; 3.896 +/* End PBXTargetDependency section */ 3.897 + 3.898 +/* Begin PBXVariantGroup section */ 3.899 + 61AAE8220A321A7F00D8810D /* Sparkle.strings */ = { 3.900 + isa = PBXVariantGroup; 3.901 + children = ( 3.902 + 61AAE8230A321A7F00D8810D /* en */, 3.903 + 61AAE84F0A321AF700D8810D /* es */, 3.904 + 61AAE8590A321B0400D8810D /* fr */, 3.905 + 61AAE8710A321F7700D8810D /* nl */, 3.906 + 619B17200E1E9D0800E72754 /* de */, 3.907 + 61F614540E24A12D009F47E7 /* it */, 3.908 + 618915730E35937600B5E981 /* sv */, 3.909 + 6195D4920E404AD700D41A50 /* ru */, 3.910 + ); 3.911 + name = Sparkle.strings; 3.912 + sourceTree = "<group>"; 3.913 + }; 3.914 + 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */ = { 3.915 + isa = PBXVariantGroup; 3.916 + children = ( 3.917 + 61AAE8250A321A7F00D8810D /* en */, 3.918 + 61F3652B0E189883007ECA02 /* es */, 3.919 + 61F365300E18988F007ECA02 /* fr */, 3.920 + 61F365350E1898A3007ECA02 /* nl */, 3.921 + 619B17210E1E9D0800E72754 /* de */, 3.922 + 61F614550E24A12D009F47E7 /* it */, 3.923 + 618915720E35937600B5E981 /* sv */, 3.924 + 6195D4910E404AD600D41A50 /* ru */, 3.925 + ); 3.926 + name = SUAutomaticUpdateAlert.nib; 3.927 + sourceTree = "<group>"; 3.928 + }; 3.929 + 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */ = { 3.930 + isa = PBXVariantGroup; 3.931 + children = ( 3.932 + 61AAE8270A321A7F00D8810D /* en */, 3.933 + 61F3652A0E189883007ECA02 /* es */, 3.934 + 61F3652F0E18988F007ECA02 /* fr */, 3.935 + 61F365340E1898A3007ECA02 /* nl */, 3.936 + 619B17220E1E9D0800E72754 /* de */, 3.937 + 61F614560E24A12D009F47E7 /* it */, 3.938 + 618915710E35937600B5E981 /* sv */, 3.939 + 6195D4900E404AD600D41A50 /* ru */, 3.940 + ); 3.941 + name = SUUpdateAlert.nib; 3.942 + sourceTree = "<group>"; 3.943 + }; 3.944 + 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */ = { 3.945 + isa = PBXVariantGroup; 3.946 + children = ( 3.947 + 61B5F92B09C4CFD800B25A18 /* English */, 3.948 + ); 3.949 + name = InfoPlist.strings; 3.950 + sourceTree = "<group>"; 3.951 + }; 3.952 + 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */ = { 3.953 + isa = PBXVariantGroup; 3.954 + children = ( 3.955 + 61B5F92D09C4CFD800B25A18 /* English */, 3.956 + ); 3.957 + name = MainMenu.nib; 3.958 + sourceTree = "<group>"; 3.959 + }; 3.960 + 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */ = { 3.961 + isa = PBXVariantGroup; 3.962 + children = ( 3.963 + 61C46F350D9C54F300B06326 /* en */, 3.964 + 61F3651A0E18987B007ECA02 /* es */, 3.965 + 61F3652E0E18988F007ECA02 /* fr */, 3.966 + 61F365330E1898A3007ECA02 /* nl */, 3.967 + 619B17230E1E9D0800E72754 /* de */, 3.968 + 61F614570E24A12D009F47E7 /* it */, 3.969 + 618915700E35937600B5E981 /* sv */, 3.970 + 6195D48F0E404AD600D41A50 /* ru */, 3.971 + ); 3.972 + name = SUUpdatePermissionPrompt.nib; 3.973 + sourceTree = "<group>"; 3.974 + }; 3.975 +/* End PBXVariantGroup section */ 3.976 + 3.977 +/* Begin XCBuildConfiguration section */ 3.978 + 1DEB91AE08733DA50010E9CD /* Debug */ = { 3.979 + isa = XCBuildConfiguration; 3.980 + baseConfigurationReference = FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */; 3.981 + buildSettings = { 3.982 + }; 3.983 + name = Debug; 3.984 + }; 3.985 + 1DEB91AF08733DA50010E9CD /* Release */ = { 3.986 + isa = XCBuildConfiguration; 3.987 + baseConfigurationReference = FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */; 3.988 + buildSettings = { 3.989 + GCC_DEBUGGING_SYMBOLS = full; 3.990 + }; 3.991 + name = Release; 3.992 + }; 3.993 + 1DEB91B208733DA50010E9CD /* Debug */ = { 3.994 + isa = XCBuildConfiguration; 3.995 + buildSettings = { 3.996 + WARNING_CFLAGS = "-Wundeclared-selector"; 3.997 + }; 3.998 + name = Debug; 3.999 + }; 3.1000 + 1DEB91B308733DA50010E9CD /* Release */ = { 3.1001 + isa = XCBuildConfiguration; 3.1002 + buildSettings = { 3.1003 + WARNING_CFLAGS = "-Wundeclared-selector"; 3.1004 + }; 3.1005 + name = Release; 3.1006 + }; 3.1007 + 61072EAD0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { 3.1008 + isa = XCBuildConfiguration; 3.1009 + buildSettings = { 3.1010 + GCC_VERSION = ""; 3.1011 + WARNING_CFLAGS = "-Wundeclared-selector"; 3.1012 + }; 3.1013 + name = "Release (GC dual-mode; 10.5-only)"; 3.1014 + }; 3.1015 + 61072EAE0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { 3.1016 + isa = XCBuildConfiguration; 3.1017 + baseConfigurationReference = 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */; 3.1018 + buildSettings = { 3.1019 + INSTALL_PATH = "@loader_path/../Frameworks"; 3.1020 + }; 3.1021 + name = "Release (GC dual-mode; 10.5-only)"; 3.1022 + }; 3.1023 + 61072EAF0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { 3.1024 + isa = XCBuildConfiguration; 3.1025 + baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */; 3.1026 + buildSettings = { 3.1027 + }; 3.1028 + name = "Release (GC dual-mode; 10.5-only)"; 3.1029 + }; 3.1030 + 61072EB00DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { 3.1031 + isa = XCBuildConfiguration; 3.1032 + baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */; 3.1033 + buildSettings = { 3.1034 + }; 3.1035 + name = "Release (GC dual-mode; 10.5-only)"; 3.1036 + }; 3.1037 + 61072EB10DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { 3.1038 + isa = XCBuildConfiguration; 3.1039 + buildSettings = { 3.1040 + ALWAYS_SEARCH_USER_PATHS = NO; 3.1041 + ARCHS = "$(NATIVE_ARCH)"; 3.1042 + COPY_PHASE_STRIP = YES; 3.1043 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 3.1044 + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; 3.1045 + GCC_ENABLE_FIX_AND_CONTINUE = NO; 3.1046 + GCC_ENABLE_OBJC_EXCEPTIONS = YES; 3.1047 + GCC_MODEL_TUNING = G5; 3.1048 + GCC_PRECOMPILE_PREFIX_HEADER = YES; 3.1049 + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; 3.1050 + INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist"; 3.1051 + INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; 3.1052 + OTHER_LDFLAGS = ( 3.1053 + "-framework", 3.1054 + Cocoa, 3.1055 + "-framework", 3.1056 + SenTestingKit, 3.1057 + ); 3.1058 + PREBINDING = NO; 3.1059 + PRODUCT_NAME = "Sparkle Unit Tests"; 3.1060 + WRAPPER_EXTENSION = octest; 3.1061 + ZERO_LINK = NO; 3.1062 + }; 3.1063 + name = "Release (GC dual-mode; 10.5-only)"; 3.1064 + }; 3.1065 + 612279DB0DB5470300AB99EA /* Debug */ = { 3.1066 + isa = XCBuildConfiguration; 3.1067 + buildSettings = { 3.1068 + ALWAYS_SEARCH_USER_PATHS = NO; 3.1069 + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; 3.1070 + COPY_PHASE_STRIP = NO; 3.1071 + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; 3.1072 + GCC_DYNAMIC_NO_PIC = NO; 3.1073 + GCC_ENABLE_FIX_AND_CONTINUE = NO; 3.1074 + GCC_ENABLE_OBJC_EXCEPTIONS = YES; 3.1075 + GCC_MODEL_TUNING = G5; 3.1076 + GCC_OPTIMIZATION_LEVEL = 0; 3.1077 + GCC_PRECOMPILE_PREFIX_HEADER = YES; 3.1078 + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; 3.1079 + INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist"; 3.1080 + INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; 3.1081 + OTHER_LDFLAGS = ( 3.1082 + "-framework", 3.1083 + Cocoa, 3.1084 + "-framework", 3.1085 + SenTestingKit, 3.1086 + ); 3.1087 + PREBINDING = NO; 3.1088 + PRODUCT_NAME = "Sparkle Unit Tests"; 3.1089 + WRAPPER_EXTENSION = octest; 3.1090 + ZERO_LINK = NO; 3.1091 + }; 3.1092 + name = Debug; 3.1093 + }; 3.1094 + 612279DC0DB5470300AB99EA /* Release */ = { 3.1095 + isa = XCBuildConfiguration; 3.1096 + buildSettings = { 3.1097 + ALWAYS_SEARCH_USER_PATHS = NO; 3.1098 + ARCHS = "$(NATIVE_ARCH)"; 3.1099 + COPY_PHASE_STRIP = YES; 3.1100 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 3.1101 + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; 3.1102 + GCC_ENABLE_FIX_AND_CONTINUE = NO; 3.1103 + GCC_ENABLE_OBJC_EXCEPTIONS = YES; 3.1104 + GCC_MODEL_TUNING = G5; 3.1105 + GCC_PRECOMPILE_PREFIX_HEADER = YES; 3.1106 + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; 3.1107 + INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist"; 3.1108 + INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; 3.1109 + OTHER_LDFLAGS = ( 3.1110 + "-framework", 3.1111 + Cocoa, 3.1112 + "-framework", 3.1113 + SenTestingKit, 3.1114 + ); 3.1115 + PREBINDING = NO; 3.1116 + PRODUCT_NAME = "Sparkle Unit Tests"; 3.1117 + WRAPPER_EXTENSION = octest; 3.1118 + ZERO_LINK = NO; 3.1119 + }; 3.1120 + name = Release; 3.1121 + }; 3.1122 + 61B5F90609C4CEE300B25A18 /* Debug */ = { 3.1123 + isa = XCBuildConfiguration; 3.1124 + baseConfigurationReference = FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */; 3.1125 + buildSettings = { 3.1126 + }; 3.1127 + name = Debug; 3.1128 + }; 3.1129 + 61B5F90709C4CEE300B25A18 /* Release */ = { 3.1130 + isa = XCBuildConfiguration; 3.1131 + baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */; 3.1132 + buildSettings = { 3.1133 + }; 3.1134 + name = Release; 3.1135 + }; 3.1136 + DAAEFC980DA571DF0051E0D0 /* Debug */ = { 3.1137 + isa = XCBuildConfiguration; 3.1138 + baseConfigurationReference = FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */; 3.1139 + buildSettings = { 3.1140 + }; 3.1141 + name = Debug; 3.1142 + }; 3.1143 + DAAEFC990DA571DF0051E0D0 /* Release */ = { 3.1144 + isa = XCBuildConfiguration; 3.1145 + baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */; 3.1146 + buildSettings = { 3.1147 + }; 3.1148 + name = Release; 3.1149 + }; 3.1150 +/* End XCBuildConfiguration section */ 3.1151 + 3.1152 +/* Begin XCConfigurationList section */ 3.1153 + 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */ = { 3.1154 + isa = XCConfigurationList; 3.1155 + buildConfigurations = ( 3.1156 + 1DEB91AE08733DA50010E9CD /* Debug */, 3.1157 + 1DEB91AF08733DA50010E9CD /* Release */, 3.1158 + 61072EAE0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, 3.1159 + ); 3.1160 + defaultConfigurationIsVisible = 0; 3.1161 + defaultConfigurationName = Release; 3.1162 + }; 3.1163 + 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */ = { 3.1164 + isa = XCConfigurationList; 3.1165 + buildConfigurations = ( 3.1166 + 1DEB91B208733DA50010E9CD /* Debug */, 3.1167 + 1DEB91B308733DA50010E9CD /* Release */, 3.1168 + 61072EAD0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, 3.1169 + ); 3.1170 + defaultConfigurationIsVisible = 0; 3.1171 + defaultConfigurationName = Release; 3.1172 + }; 3.1173 + 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */ = { 3.1174 + isa = XCConfigurationList; 3.1175 + buildConfigurations = ( 3.1176 + 612279DB0DB5470300AB99EA /* Debug */, 3.1177 + 612279DC0DB5470300AB99EA /* Release */, 3.1178 + 61072EB10DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, 3.1179 + ); 3.1180 + defaultConfigurationIsVisible = 0; 3.1181 + defaultConfigurationName = Release; 3.1182 + }; 3.1183 + 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */ = { 3.1184 + isa = XCConfigurationList; 3.1185 + buildConfigurations = ( 3.1186 + 61B5F90609C4CEE300B25A18 /* Debug */, 3.1187 + 61B5F90709C4CEE300B25A18 /* Release */, 3.1188 + 61072EAF0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, 3.1189 + ); 3.1190 + defaultConfigurationIsVisible = 0; 3.1191 + defaultConfigurationName = Release; 3.1192 + }; 3.1193 + DAAEFC9A0DA571FD0051E0D0 /* Build configuration list for PBXNativeTarget "relaunch tool" */ = { 3.1194 + isa = XCConfigurationList; 3.1195 + buildConfigurations = ( 3.1196 + DAAEFC980DA571DF0051E0D0 /* Debug */, 3.1197 + DAAEFC990DA571DF0051E0D0 /* Release */, 3.1198 + 61072EB00DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, 3.1199 + ); 3.1200 + defaultConfigurationIsVisible = 0; 3.1201 + defaultConfigurationName = Release; 3.1202 + }; 3.1203 +/* End XCConfigurationList section */ 3.1204 + }; 3.1205 + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; 3.1206 +}
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/tunblick/Tunnelblick.xcodeproj/project.pbxproj Wed Jul 29 11:23:17 2009 +0200 4.3 @@ -0,0 +1,735 @@ 4.4 +// !$*UTF8*$! 4.5 +{ 4.6 + archiveVersion = 1; 4.7 + classes = { 4.8 + }; 4.9 + objectVersion = 44; 4.10 + objects = { 4.11 + 4.12 +/* Begin PBXBuildFile section */ 4.13 + 6140EF9A0E3C334E00C5B93A /* openvpn in CopyFiles */ = {isa = PBXBuildFile; fileRef = 6140EF990E3C334800C5B93A /* openvpn */; }; 4.14 + 61492D380E38ED3400BC9C3F /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61492D370E38ED3400BC9C3F /* Sparkle.framework */; }; 4.15 + 61492D3B0E38ED3900BC9C3F /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 61492D370E38ED3400BC9C3F /* Sparkle.framework */; }; 4.16 + 615F748A0ED3A4C2007F6F0A /* English.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74860ED3A4C2007F6F0A /* English.lproj */; }; 4.17 + 615F748F0ED3A4E5007F6F0A /* French.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F748C0ED3A4E5007F6F0A /* French.lproj */; }; 4.18 + 615F74990ED3A4FA007F6F0A /* German.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74900ED3A4FA007F6F0A /* German.lproj */; }; 4.19 + 615F749A0ED3A4FA007F6F0A /* Japanese.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74930ED3A4FA007F6F0A /* Japanese.lproj */; }; 4.20 + 615F749B0ED3A4FA007F6F0A /* Korean.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74960ED3A4FA007F6F0A /* Korean.lproj */; }; 4.21 + 6165CC8C0E9072A5007312DC /* RouteManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165CC8B0E9072A5007312DC /* RouteManager.m */; }; 4.22 + 616A49190E38D0DE00477476 /* tap.kext in CopyFiles */ = {isa = PBXBuildFile; fileRef = 616A49090E38D0D400477476 /* tap.kext */; }; 4.23 + 616A491A0E38D0DE00477476 /* tun.kext in CopyFiles */ = {isa = PBXBuildFile; fileRef = 616A490A0E38D0D400477476 /* tun.kext */; }; 4.24 + 6185E7400E76045D0009C2FD /* helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6185E73F0E76045D0009C2FD /* helper.m */; }; 4.25 + 61BC4B780E2F9EBC00F24255 /* VPNConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */; }; 4.26 + 61BC4B7A0E2F9EBC00F24255 /* NSArray+cArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */; }; 4.27 + 61BC4B7B0E2F9EBC00F24255 /* MenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */; }; 4.28 + 61BC4B7C0E2F9EBC00F24255 /* NetSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */; }; 4.29 + 61BC4B7D0E2F9EBC00F24255 /* NetSocket+Text.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */; }; 4.30 + 61BC4B7E0E2F9EBC00F24255 /* NSApplication+LoginItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */; }; 4.31 + 61BC4B7F0E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */; }; 4.32 + 61BC4B800E2F9EBC00F24255 /* KeyChain.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B740E2F9EBC00F24255 /* KeyChain.m */; }; 4.33 + 61BC4B810E2F9EBC00F24255 /* AuthAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */; }; 4.34 + 61BC4B910E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */; }; 4.35 + 61BC4B930E2F9EDA00F24255 /* UKKQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */; }; 4.36 + 61BC4B940E2F9EDA00F24255 /* UKMainThreadProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */; }; 4.37 + 61BC4CDF0E2F9FFA00F24255 /* openvpnstart.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */; }; 4.38 + 61BC4CE10E2FA02800F24255 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; 4.39 + 61BC4D8A0E2FA20800F24255 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */; }; 4.40 + 61BC4D8B0E2FA20800F24255 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61BC4D890E2FA20800F24255 /* Security.framework */; }; 4.41 + 61BC4D9E0E2FA2F300F24255 /* installer.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4D9D0E2FA2F300F24255 /* installer.m */; }; 4.42 + 61BC4DA00E2FA31F00F24255 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; 4.43 + 61BC4DAB0E2FA33C00F24255 /* installer in CopyFiles */ = {isa = PBXBuildFile; fileRef = 61BC4D6B0E2FA06900F24255 /* installer */; }; 4.44 + 61BC4DAD0E2FA34100F24255 /* openvpnstart in CopyFiles */ = {isa = PBXBuildFile; fileRef = 61BC4BC10E2F9FE900F24255 /* openvpnstart */; }; 4.45 + 61BC4DB30E2FA3C300F24255 /* LogWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */; }; 4.46 + 61BC4DB40E2FA3C300F24255 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */; }; 4.47 + 61BC4E6F0E2FA8A900F24255 /* 00_closed.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E690E2FA8A200F24255 /* 00_closed.tif */; }; 4.48 + 61BC4E700E2FA8A900F24255 /* 01.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6A0E2FA8A200F24255 /* 01.tif */; }; 4.49 + 61BC4E710E2FA8A900F24255 /* 02.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6B0E2FA8A200F24255 /* 02.tif */; }; 4.50 + 61BC4E720E2FA8A900F24255 /* 03.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6C0E2FA8A200F24255 /* 03.tif */; }; 4.51 + 61BC4E730E2FA8A900F24255 /* connected.png in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6D0E2FA8A200F24255 /* connected.png */; }; 4.52 + 61BC4E740E2FA8A900F24255 /* tunnelblick.icns in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */; }; 4.53 + 61BC4E790E2FA8D600F24255 /* client.down.osx.sh in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */; }; 4.54 + 61BC4E7A0E2FA8D600F24255 /* client.up.osx.sh in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */; }; 4.55 + 61C03B990ED4E42A00175F22 /* Norwegian.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 61C03B960ED4E42A00175F22 /* Norwegian.lproj */; }; 4.56 + 61F294A60ED389520097DE94 /* openvpn.conf in Resources */ = {isa = PBXBuildFile; fileRef = 61F294A50ED389520097DE94 /* openvpn.conf */; }; 4.57 + 6337527D101A1EBD00775AA2 /* TBTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6337527C101A1EBD00775AA2 /* TBTextView.m */; }; 4.58 + 63E372680FEB3FF00012DDE7 /* leasewatch in Resources */ = {isa = PBXBuildFile; fileRef = 63E372660FEB3FF00012DDE7 /* leasewatch */; }; 4.59 + 63E372690FEB3FF00012DDE7 /* LeaseWatch.plist.template in Resources */ = {isa = PBXBuildFile; fileRef = 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */; }; 4.60 + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 4.61 + 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 4.62 + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 4.63 +/* End PBXBuildFile section */ 4.64 + 4.65 +/* Begin PBXContainerItemProxy section */ 4.66 + 61BC4D950E2FA28700F24255 /* PBXContainerItemProxy */ = { 4.67 + isa = PBXContainerItemProxy; 4.68 + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; 4.69 + proxyType = 1; 4.70 + remoteGlobalIDString = 61BC4BC00E2F9FE900F24255; 4.71 + remoteInfo = openvpnstart; 4.72 + }; 4.73 + 61BC4D970E2FA28700F24255 /* PBXContainerItemProxy */ = { 4.74 + isa = PBXContainerItemProxy; 4.75 + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; 4.76 + proxyType = 1; 4.77 + remoteGlobalIDString = 61BC4D6A0E2FA06900F24255; 4.78 + remoteInfo = installer; 4.79 + }; 4.80 +/* End PBXContainerItemProxy section */ 4.81 + 4.82 +/* Begin PBXCopyFilesBuildPhase section */ 4.83 + 61BC4D930E2FA26E00F24255 /* CopyFiles */ = { 4.84 + isa = PBXCopyFilesBuildPhase; 4.85 + buildActionMask = 2147483647; 4.86 + dstPath = ""; 4.87 + dstSubfolderSpec = 7; 4.88 + files = ( 4.89 + 6140EF9A0E3C334E00C5B93A /* openvpn in CopyFiles */, 4.90 + 616A49190E38D0DE00477476 /* tap.kext in CopyFiles */, 4.91 + 616A491A0E38D0DE00477476 /* tun.kext in CopyFiles */, 4.92 + 61BC4DAD0E2FA34100F24255 /* openvpnstart in CopyFiles */, 4.93 + 61BC4DAB0E2FA33C00F24255 /* installer in CopyFiles */, 4.94 + ); 4.95 + runOnlyForDeploymentPostprocessing = 0; 4.96 + }; 4.97 + 61C8B0AB0E38E3C100696EE9 /* Copy Files */ = { 4.98 + isa = PBXCopyFilesBuildPhase; 4.99 + buildActionMask = 2147483647; 4.100 + dstPath = ""; 4.101 + dstSubfolderSpec = 10; 4.102 + files = ( 4.103 + 61492D3B0E38ED3900BC9C3F /* Sparkle.framework in Copy Files */, 4.104 + ); 4.105 + name = "Copy Files"; 4.106 + runOnlyForDeploymentPostprocessing = 0; 4.107 + }; 4.108 +/* End PBXCopyFilesBuildPhase section */ 4.109 + 4.110 +/* Begin PBXFileReference section */ 4.111 + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 4.112 + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; 4.113 + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; }; 4.114 + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; 4.115 + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; 4.116 + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; 4.117 + 32CA4F630368D1EE00C91783 /* Tunnelblick_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tunnelblick_Prefix.pch; sourceTree = "<group>"; }; 4.118 + 6140EF990E3C334800C5B93A /* openvpn */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = openvpn; path = ../third_party/openvpn/openvpn; sourceTree = SOURCE_ROOT; }; 4.119 + 61492D370E38ED3400BC9C3F /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = ../third_party/Sparkle.framework; sourceTree = SOURCE_ROOT; }; 4.120 + 615F74860ED3A4C2007F6F0A /* English.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = English.lproj; sourceTree = "<group>"; }; 4.121 + 615F748C0ED3A4E5007F6F0A /* French.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = French.lproj; sourceTree = "<group>"; }; 4.122 + 615F74900ED3A4FA007F6F0A /* German.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = German.lproj; sourceTree = "<group>"; }; 4.123 + 615F74930ED3A4FA007F6F0A /* Japanese.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Japanese.lproj; sourceTree = "<group>"; }; 4.124 + 615F74960ED3A4FA007F6F0A /* Korean.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Korean.lproj; sourceTree = "<group>"; }; 4.125 + 6165CC8A0E9072A5007312DC /* RouteManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RouteManager.h; sourceTree = "<group>"; }; 4.126 + 6165CC8B0E9072A5007312DC /* RouteManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RouteManager.m; sourceTree = "<group>"; }; 4.127 + 616A44E10E38CAA700477476 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = "<absolute>"; }; 4.128 + 616A49090E38D0D400477476 /* tap.kext */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.kernel-extension"; name = tap.kext; path = ../third_party/tuntap/tap.kext; sourceTree = SOURCE_ROOT; }; 4.129 + 616A490A0E38D0D400477476 /* tun.kext */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.kernel-extension"; name = tun.kext; path = ../third_party/tuntap/tun.kext; sourceTree = SOURCE_ROOT; }; 4.130 + 6185E73E0E76045D0009C2FD /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = "<group>"; }; 4.131 + 6185E73F0E76045D0009C2FD /* helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = helper.m; sourceTree = "<group>"; }; 4.132 + 61BC4B650E2F9EBC00F24255 /* VPNConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNConnection.h; sourceTree = "<group>"; }; 4.133 + 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VPNConnection.m; sourceTree = "<group>"; }; 4.134 + 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = openvpnstart.m; sourceTree = "<group>"; }; 4.135 + 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+cArray.m"; sourceTree = "<group>"; }; 4.136 + 61BC4B690E2F9EBC00F24255 /* MenuController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuController.h; sourceTree = "<group>"; }; 4.137 + 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuController.m; sourceTree = "<group>"; }; 4.138 + 61BC4B6B0E2F9EBC00F24255 /* NetSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetSocket.h; sourceTree = "<group>"; }; 4.139 + 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetSocket.m; sourceTree = "<group>"; }; 4.140 + 61BC4B6D0E2F9EBC00F24255 /* NetSocket+Text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NetSocket+Text.h"; sourceTree = "<group>"; }; 4.141 + 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NetSocket+Text.m"; sourceTree = "<group>"; }; 4.142 + 61BC4B6F0E2F9EBC00F24255 /* NSApplication+LoginItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+LoginItem.h"; sourceTree = "<group>"; }; 4.143 + 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+LoginItem.m"; sourceTree = "<group>"; }; 4.144 + 61BC4B710E2F9EBC00F24255 /* NSApplication+NetworkNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+NetworkNotifications.h"; sourceTree = "<group>"; }; 4.145 + 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+NetworkNotifications.m"; sourceTree = "<group>"; }; 4.146 + 61BC4B730E2F9EBC00F24255 /* NSArray+cArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+cArray.h"; sourceTree = "<group>"; }; 4.147 + 61BC4B740E2F9EBC00F24255 /* KeyChain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KeyChain.m; sourceTree = "<group>"; }; 4.148 + 61BC4B750E2F9EBC00F24255 /* KeyChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyChain.h; sourceTree = "<group>"; }; 4.149 + 61BC4B760E2F9EBC00F24255 /* AuthAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuthAgent.h; sourceTree = "<group>"; }; 4.150 + 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AuthAgent.m; sourceTree = "<group>"; }; 4.151 + 61BC4B890E2F9EDA00F24255 /* UKFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKFileWatcher.h; sourceTree = "<group>"; }; 4.152 + 61BC4B8A0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKFNSubscribeFileWatcher.h; sourceTree = "<group>"; }; 4.153 + 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKFNSubscribeFileWatcher.m; sourceTree = "<group>"; }; 4.154 + 61BC4B8C0E2F9EDA00F24255 /* UKKQueue Readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "UKKQueue Readme.txt"; sourceTree = "<group>"; }; 4.155 + 61BC4B8D0E2F9EDA00F24255 /* UKKQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKKQueue.h; sourceTree = "<group>"; }; 4.156 + 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKKQueue.m; sourceTree = "<group>"; }; 4.157 + 61BC4B8F0E2F9EDA00F24255 /* UKMainThreadProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKMainThreadProxy.h; sourceTree = "<group>"; }; 4.158 + 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKMainThreadProxy.m; sourceTree = "<group>"; }; 4.159 + 61BC4BC10E2F9FE900F24255 /* openvpnstart */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = openvpnstart; sourceTree = BUILT_PRODUCTS_DIR; }; 4.160 + 61BC4D6B0E2FA06900F24255 /* installer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = installer; sourceTree = BUILT_PRODUCTS_DIR; }; 4.161 + 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; }; 4.162 + 61BC4D890E2FA20800F24255 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; }; 4.163 + 61BC4D9C0E2FA2F300F24255 /* installer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = installer.h; sourceTree = "<group>"; }; 4.164 + 61BC4D9D0E2FA2F300F24255 /* installer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = installer.m; sourceTree = "<group>"; }; 4.165 + 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = LogWindow.nib; sourceTree = "<group>"; }; 4.166 + 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = MainMenu.nib; sourceTree = "<group>"; }; 4.167 + 61BC4DCA0E2FA51E00F24255 /* tun-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "tun-Info.plist"; sourceTree = "<group>"; }; 4.168 + 61BC4DD30E2FA52900F24255 /* tap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "tap-Info.plist"; sourceTree = "<group>"; }; 4.169 + 61BC4E690E2FA8A200F24255 /* 00_closed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 00_closed.tif; sourceTree = "<group>"; }; 4.170 + 61BC4E6A0E2FA8A200F24255 /* 01.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 01.tif; sourceTree = "<group>"; }; 4.171 + 61BC4E6B0E2FA8A200F24255 /* 02.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 02.tif; sourceTree = "<group>"; }; 4.172 + 61BC4E6C0E2FA8A200F24255 /* 03.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 03.tif; sourceTree = "<group>"; }; 4.173 + 61BC4E6D0E2FA8A200F24255 /* connected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = connected.png; sourceTree = "<group>"; }; 4.174 + 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = tunnelblick.icns; sourceTree = "<group>"; }; 4.175 + 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = client.down.osx.sh; sourceTree = "<group>"; }; 4.176 + 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = client.up.osx.sh; sourceTree = "<group>"; }; 4.177 + 61C03B960ED4E42A00175F22 /* Norwegian.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Norwegian.lproj; sourceTree = "<group>"; }; 4.178 + 61F294A50ED389520097DE94 /* openvpn.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = openvpn.conf; sourceTree = "<group>"; }; 4.179 + 6337527B101A1EBD00775AA2 /* TBTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBTextView.h; sourceTree = "<group>"; }; 4.180 + 6337527C101A1EBD00775AA2 /* TBTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBTextView.m; sourceTree = "<group>"; }; 4.181 + 63E372660FEB3FF00012DDE7 /* leasewatch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = leasewatch; sourceTree = "<group>"; }; 4.182 + 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = LeaseWatch.plist.template; sourceTree = "<group>"; }; 4.183 + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 4.184 + 8D1107320486CEB800E47090 /* Tunnelblick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tunnelblick.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4.185 +/* End PBXFileReference section */ 4.186 + 4.187 +/* Begin PBXFrameworksBuildPhase section */ 4.188 + 61BC4BBF0E2F9FE900F24255 /* Frameworks */ = { 4.189 + isa = PBXFrameworksBuildPhase; 4.190 + buildActionMask = 2147483647; 4.191 + files = ( 4.192 + 61BC4CE10E2FA02800F24255 /* Foundation.framework in Frameworks */, 4.193 + ); 4.194 + runOnlyForDeploymentPostprocessing = 0; 4.195 + }; 4.196 + 61BC4D690E2FA06900F24255 /* Frameworks */ = { 4.197 + isa = PBXFrameworksBuildPhase; 4.198 + buildActionMask = 2147483647; 4.199 + files = ( 4.200 + 61BC4DA00E2FA31F00F24255 /* Foundation.framework in Frameworks */, 4.201 + ); 4.202 + runOnlyForDeploymentPostprocessing = 0; 4.203 + }; 4.204 + 8D11072E0486CEB800E47090 /* Frameworks */ = { 4.205 + isa = PBXFrameworksBuildPhase; 4.206 + buildActionMask = 2147483647; 4.207 + files = ( 4.208 + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 4.209 + 61BC4D8A0E2FA20800F24255 /* CoreFoundation.framework in Frameworks */, 4.210 + 61BC4D8B0E2FA20800F24255 /* Security.framework in Frameworks */, 4.211 + 61492D380E38ED3400BC9C3F /* Sparkle.framework in Frameworks */, 4.212 + ); 4.213 + runOnlyForDeploymentPostprocessing = 0; 4.214 + }; 4.215 +/* End PBXFrameworksBuildPhase section */ 4.216 + 4.217 +/* Begin PBXGroup section */ 4.218 + 080E96DDFE201D6D7F000001 /* Classes */ = { 4.219 + isa = PBXGroup; 4.220 + children = ( 4.221 + 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */, 4.222 + 6337527B101A1EBD00775AA2 /* TBTextView.h */, 4.223 + 6337527C101A1EBD00775AA2 /* TBTextView.m */, 4.224 + 61BC4D9C0E2FA2F300F24255 /* installer.h */, 4.225 + 61BC4D9D0E2FA2F300F24255 /* installer.m */, 4.226 + 61BC4B880E2F9EDA00F24255 /* UKKQueue */, 4.227 + 61BC4B650E2F9EBC00F24255 /* VPNConnection.h */, 4.228 + 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */, 4.229 + 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */, 4.230 + 61BC4B690E2F9EBC00F24255 /* MenuController.h */, 4.231 + 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */, 4.232 + 61BC4B6B0E2F9EBC00F24255 /* NetSocket.h */, 4.233 + 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */, 4.234 + 61BC4B6D0E2F9EBC00F24255 /* NetSocket+Text.h */, 4.235 + 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */, 4.236 + 61BC4B6F0E2F9EBC00F24255 /* NSApplication+LoginItem.h */, 4.237 + 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */, 4.238 + 61BC4B710E2F9EBC00F24255 /* NSApplication+NetworkNotifications.h */, 4.239 + 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */, 4.240 + 61BC4B730E2F9EBC00F24255 /* NSArray+cArray.h */, 4.241 + 61BC4B740E2F9EBC00F24255 /* KeyChain.m */, 4.242 + 61BC4B750E2F9EBC00F24255 /* KeyChain.h */, 4.243 + 61BC4B760E2F9EBC00F24255 /* AuthAgent.h */, 4.244 + 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */, 4.245 + 6185E73E0E76045D0009C2FD /* helper.h */, 4.246 + 6185E73F0E76045D0009C2FD /* helper.m */, 4.247 + ); 4.248 + name = Classes; 4.249 + sourceTree = "<group>"; 4.250 + }; 4.251 + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { 4.252 + isa = PBXGroup; 4.253 + children = ( 4.254 + 61492D370E38ED3400BC9C3F /* Sparkle.framework */, 4.255 + 616A44E10E38CAA700477476 /* Kernel.framework */, 4.256 + 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */, 4.257 + 61BC4D890E2FA20800F24255 /* Security.framework */, 4.258 + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 4.259 + ); 4.260 + name = "Linked Frameworks"; 4.261 + sourceTree = "<group>"; 4.262 + }; 4.263 + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { 4.264 + isa = PBXGroup; 4.265 + children = ( 4.266 + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 4.267 + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 4.268 + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 4.269 + ); 4.270 + name = "Other Frameworks"; 4.271 + sourceTree = "<group>"; 4.272 + }; 4.273 + 19C28FACFE9D520D11CA2CBB /* Products */ = { 4.274 + isa = PBXGroup; 4.275 + children = ( 4.276 + 8D1107320486CEB800E47090 /* Tunnelblick.app */, 4.277 + 61BC4BC10E2F9FE900F24255 /* openvpnstart */, 4.278 + 61BC4D6B0E2FA06900F24255 /* installer */, 4.279 + ); 4.280 + name = Products; 4.281 + sourceTree = "<group>"; 4.282 + }; 4.283 + 29B97314FDCFA39411CA2CEA /* Tunnelblick */ = { 4.284 + isa = PBXGroup; 4.285 + children = ( 4.286 + 080E96DDFE201D6D7F000001 /* Classes */, 4.287 + 29B97315FDCFA39411CA2CEA /* Other Sources */, 4.288 + 29B97317FDCFA39411CA2CEA /* Resources */, 4.289 + 29B97323FDCFA39411CA2CEA /* Frameworks */, 4.290 + 19C28FACFE9D520D11CA2CBB /* Products */, 4.291 + 61BC4DCA0E2FA51E00F24255 /* tun-Info.plist */, 4.292 + 61BC4DD30E2FA52900F24255 /* tap-Info.plist */, 4.293 + 6165CC8A0E9072A5007312DC /* RouteManager.h */, 4.294 + 6165CC8B0E9072A5007312DC /* RouteManager.m */, 4.295 + ); 4.296 + name = Tunnelblick; 4.297 + sourceTree = "<group>"; 4.298 + }; 4.299 + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 4.300 + isa = PBXGroup; 4.301 + children = ( 4.302 + 61F294A50ED389520097DE94 /* openvpn.conf */, 4.303 + 6140EF990E3C334800C5B93A /* openvpn */, 4.304 + 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */, 4.305 + 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */, 4.306 + 32CA4F630368D1EE00C91783 /* Tunnelblick_Prefix.pch */, 4.307 + 29B97316FDCFA39411CA2CEA /* main.m */, 4.308 + ); 4.309 + name = "Other Sources"; 4.310 + sourceTree = "<group>"; 4.311 + }; 4.312 + 29B97317FDCFA39411CA2CEA /* Resources */ = { 4.313 + isa = PBXGroup; 4.314 + children = ( 4.315 + 63E372660FEB3FF00012DDE7 /* leasewatch */, 4.316 + 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */, 4.317 + 616A49090E38D0D400477476 /* tap.kext */, 4.318 + 616A490A0E38D0D400477476 /* tun.kext */, 4.319 + 61C03B960ED4E42A00175F22 /* Norwegian.lproj */, 4.320 + 615F74900ED3A4FA007F6F0A /* German.lproj */, 4.321 + 615F74930ED3A4FA007F6F0A /* Japanese.lproj */, 4.322 + 615F74960ED3A4FA007F6F0A /* Korean.lproj */, 4.323 + 615F748C0ED3A4E5007F6F0A /* French.lproj */, 4.324 + 615F74860ED3A4C2007F6F0A /* English.lproj */, 4.325 + 61BC4E690E2FA8A200F24255 /* 00_closed.tif */, 4.326 + 61BC4E6A0E2FA8A200F24255 /* 01.tif */, 4.327 + 61BC4E6B0E2FA8A200F24255 /* 02.tif */, 4.328 + 61BC4E6C0E2FA8A200F24255 /* 03.tif */, 4.329 + 61BC4E6D0E2FA8A200F24255 /* connected.png */, 4.330 + 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */, 4.331 + 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */, 4.332 + 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */, 4.333 + 8D1107310486CEB800E47090 /* Info.plist */, 4.334 + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 4.335 + ); 4.336 + name = Resources; 4.337 + sourceTree = "<group>"; 4.338 + }; 4.339 + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 4.340 + isa = PBXGroup; 4.341 + children = ( 4.342 + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 4.343 + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, 4.344 + ); 4.345 + name = Frameworks; 4.346 + sourceTree = "<group>"; 4.347 + }; 4.348 + 61BC4B880E2F9EDA00F24255 /* UKKQueue */ = { 4.349 + isa = PBXGroup; 4.350 + children = ( 4.351 + 61BC4B890E2F9EDA00F24255 /* UKFileWatcher.h */, 4.352 + 61BC4B8A0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.h */, 4.353 + 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */, 4.354 + 61BC4B8C0E2F9EDA00F24255 /* UKKQueue Readme.txt */, 4.355 + 61BC4B8D0E2F9EDA00F24255 /* UKKQueue.h */, 4.356 + 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */, 4.357 + 61BC4B8F0E2F9EDA00F24255 /* UKMainThreadProxy.h */, 4.358 + 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */, 4.359 + ); 4.360 + path = UKKQueue; 4.361 + sourceTree = "<group>"; 4.362 + }; 4.363 +/* End PBXGroup section */ 4.364 + 4.365 +/* Begin PBXNativeTarget section */ 4.366 + 61BC4BC00E2F9FE900F24255 /* openvpnstart */ = { 4.367 + isa = PBXNativeTarget; 4.368 + buildConfigurationList = 61BC4CDE0E2F9FF400F24255 /* Build configuration list for PBXNativeTarget "openvpnstart" */; 4.369 + buildPhases = ( 4.370 + 61BC4BBE0E2F9FE900F24255 /* Sources */, 4.371 + 61BC4BBF0E2F9FE900F24255 /* Frameworks */, 4.372 + ); 4.373 + buildRules = ( 4.374 + ); 4.375 + dependencies = ( 4.376 + ); 4.377 + name = openvpnstart; 4.378 + productName = openvpnstart; 4.379 + productReference = 61BC4BC10E2F9FE900F24255 /* openvpnstart */; 4.380 + productType = "com.apple.product-type.tool"; 4.381 + }; 4.382 + 61BC4D6A0E2FA06900F24255 /* installer */ = { 4.383 + isa = PBXNativeTarget; 4.384 + buildConfigurationList = 61BC4D6F0E2FA08700F24255 /* Build configuration list for PBXNativeTarget "installer" */; 4.385 + buildPhases = ( 4.386 + 61BC4D680E2FA06900F24255 /* Sources */, 4.387 + 61BC4D690E2FA06900F24255 /* Frameworks */, 4.388 + ); 4.389 + buildRules = ( 4.390 + ); 4.391 + dependencies = ( 4.392 + ); 4.393 + name = installer; 4.394 + productName = installer; 4.395 + productReference = 61BC4D6B0E2FA06900F24255 /* installer */; 4.396 + productType = "com.apple.product-type.tool"; 4.397 + }; 4.398 + 8D1107260486CEB800E47090 /* Tunnelblick */ = { 4.399 + isa = PBXNativeTarget; 4.400 + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Tunnelblick" */; 4.401 + buildPhases = ( 4.402 + 616A49200E38D17500477476 /* ShellScript */, 4.403 + 8D1107290486CEB800E47090 /* Resources */, 4.404 + 8D11072C0486CEB800E47090 /* Sources */, 4.405 + 8D11072E0486CEB800E47090 /* Frameworks */, 4.406 + 61BC4D930E2FA26E00F24255 /* CopyFiles */, 4.407 + 61C8B0AB0E38E3C100696EE9 /* Copy Files */, 4.408 + 610AEAE70E2FE63900EA3C79 /* ShellScript */, 4.409 + ); 4.410 + buildRules = ( 4.411 + ); 4.412 + dependencies = ( 4.413 + 61BC4D960E2FA28700F24255 /* PBXTargetDependency */, 4.414 + 61BC4D980E2FA28700F24255 /* PBXTargetDependency */, 4.415 + ); 4.416 + name = Tunnelblick; 4.417 + productInstallPath = "$(HOME)/Applications"; 4.418 + productName = Tunnelblick; 4.419 + productReference = 8D1107320486CEB800E47090 /* Tunnelblick.app */; 4.420 + productType = "com.apple.product-type.application"; 4.421 + }; 4.422 +/* End PBXNativeTarget section */ 4.423 + 4.424 +/* Begin PBXProject section */ 4.425 + 29B97313FDCFA39411CA2CEA /* Project object */ = { 4.426 + isa = PBXProject; 4.427 + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Tunnelblick" */; 4.428 + compatibilityVersion = "Xcode 3.0"; 4.429 + hasScannedForEncodings = 1; 4.430 + knownRegions = ( 4.431 + English, 4.432 + Japanese, 4.433 + French, 4.434 + German, 4.435 + Korean, 4.436 + ); 4.437 + mainGroup = 29B97314FDCFA39411CA2CEA /* Tunnelblick */; 4.438 + projectDirPath = ""; 4.439 + projectRoot = ""; 4.440 + targets = ( 4.441 + 8D1107260486CEB800E47090 /* Tunnelblick */, 4.442 + 61BC4BC00E2F9FE900F24255 /* openvpnstart */, 4.443 + 61BC4D6A0E2FA06900F24255 /* installer */, 4.444 + ); 4.445 + }; 4.446 +/* End PBXProject section */ 4.447 + 4.448 +/* Begin PBXResourcesBuildPhase section */ 4.449 + 8D1107290486CEB800E47090 /* Resources */ = { 4.450 + isa = PBXResourcesBuildPhase; 4.451 + buildActionMask = 2147483647; 4.452 + files = ( 4.453 + 61BC4E790E2FA8D600F24255 /* client.down.osx.sh in Resources */, 4.454 + 61BC4E7A0E2FA8D600F24255 /* client.up.osx.sh in Resources */, 4.455 + 61BC4E6F0E2FA8A900F24255 /* 00_closed.tif in Resources */, 4.456 + 61BC4E700E2FA8A900F24255 /* 01.tif in Resources */, 4.457 + 61BC4E710E2FA8A900F24255 /* 02.tif in Resources */, 4.458 + 61BC4E720E2FA8A900F24255 /* 03.tif in Resources */, 4.459 + 61BC4E730E2FA8A900F24255 /* connected.png in Resources */, 4.460 + 61BC4E740E2FA8A900F24255 /* tunnelblick.icns in Resources */, 4.461 + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 4.462 + 61BC4DB30E2FA3C300F24255 /* LogWindow.nib in Resources */, 4.463 + 61BC4DB40E2FA3C300F24255 /* MainMenu.nib in Resources */, 4.464 + 61F294A60ED389520097DE94 /* openvpn.conf in Resources */, 4.465 + 615F748A0ED3A4C2007F6F0A /* English.lproj in Resources */, 4.466 + 615F748F0ED3A4E5007F6F0A /* French.lproj in Resources */, 4.467 + 615F74990ED3A4FA007F6F0A /* German.lproj in Resources */, 4.468 + 615F749A0ED3A4FA007F6F0A /* Japanese.lproj in Resources */, 4.469 + 615F749B0ED3A4FA007F6F0A /* Korean.lproj in Resources */, 4.470 + 61C03B990ED4E42A00175F22 /* Norwegian.lproj in Resources */, 4.471 + 63E372680FEB3FF00012DDE7 /* leasewatch in Resources */, 4.472 + 63E372690FEB3FF00012DDE7 /* LeaseWatch.plist.template in Resources */, 4.473 + ); 4.474 + runOnlyForDeploymentPostprocessing = 0; 4.475 + }; 4.476 +/* End PBXResourcesBuildPhase section */ 4.477 + 4.478 +/* Begin PBXShellScriptBuildPhase section */ 4.479 + 610AEAE70E2FE63900EA3C79 /* ShellScript */ = { 4.480 + isa = PBXShellScriptBuildPhase; 4.481 + buildActionMask = 2147483647; 4.482 + files = ( 4.483 + ); 4.484 + inputPaths = ( 4.485 + ); 4.486 + outputPaths = ( 4.487 + ); 4.488 + runOnlyForDeploymentPostprocessing = 0; 4.489 + shellPath = /bin/sh; 4.490 + shellScript = "TMPDMG=build/Release/Tunnelblick\nrm -rf $TMPDMG\nmkdir -p $TMPDMG\nmv build/Release/Tunnelblick.app $TMPDMG\nln -s /Applications/ $TMPDMG/Applications\ncp using-tunnelblick.html \"$TMPDMG/Using Tunnelblick.html\"\nmkdir $TMPDMG/using-tunnelblick-files\ncp using-tunnelblick-files/* $TMPDMG/using-tunnelblick-files\n# Here's where we'll make the dmg\nrm -rf build/Release/Tunnelblick.dmg\nhdiutil create -scrub -srcfolder $TMPDMG build/Release/Tunnelblick.dmg"; 4.491 + }; 4.492 + 616A49200E38D17500477476 /* ShellScript */ = { 4.493 + isa = PBXShellScriptBuildPhase; 4.494 + buildActionMask = 2147483647; 4.495 + files = ( 4.496 + ); 4.497 + inputPaths = ( 4.498 + ); 4.499 + outputPaths = ( 4.500 + ); 4.501 + runOnlyForDeploymentPostprocessing = 0; 4.502 + shellPath = /bin/sh; 4.503 + shellScript = "BUILDDIR=../third_party/\ncd $BUILDDIR\n\nif [ -e built ]; then\n\texit 0\nfi\n\nmake clean\nmake\n\ntouch built"; 4.504 + }; 4.505 +/* End PBXShellScriptBuildPhase section */ 4.506 + 4.507 +/* Begin PBXSourcesBuildPhase section */ 4.508 + 61BC4BBE0E2F9FE900F24255 /* Sources */ = { 4.509 + isa = PBXSourcesBuildPhase; 4.510 + buildActionMask = 2147483647; 4.511 + files = ( 4.512 + 61BC4CDF0E2F9FFA00F24255 /* openvpnstart.m in Sources */, 4.513 + ); 4.514 + runOnlyForDeploymentPostprocessing = 0; 4.515 + }; 4.516 + 61BC4D680E2FA06900F24255 /* Sources */ = { 4.517 + isa = PBXSourcesBuildPhase; 4.518 + buildActionMask = 2147483647; 4.519 + files = ( 4.520 + 61BC4D9E0E2FA2F300F24255 /* installer.m in Sources */, 4.521 + ); 4.522 + runOnlyForDeploymentPostprocessing = 0; 4.523 + }; 4.524 + 8D11072C0486CEB800E47090 /* Sources */ = { 4.525 + isa = PBXSourcesBuildPhase; 4.526 + buildActionMask = 2147483647; 4.527 + files = ( 4.528 + 8D11072D0486CEB800E47090 /* main.m in Sources */, 4.529 + 61BC4B780E2F9EBC00F24255 /* VPNConnection.m in Sources */, 4.530 + 61BC4B7A0E2F9EBC00F24255 /* NSArray+cArray.m in Sources */, 4.531 + 61BC4B7B0E2F9EBC00F24255 /* MenuController.m in Sources */, 4.532 + 61BC4B7C0E2F9EBC00F24255 /* NetSocket.m in Sources */, 4.533 + 61BC4B7D0E2F9EBC00F24255 /* NetSocket+Text.m in Sources */, 4.534 + 61BC4B7E0E2F9EBC00F24255 /* NSApplication+LoginItem.m in Sources */, 4.535 + 61BC4B7F0E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m in Sources */, 4.536 + 61BC4B800E2F9EBC00F24255 /* KeyChain.m in Sources */, 4.537 + 61BC4B810E2F9EBC00F24255 /* AuthAgent.m in Sources */, 4.538 + 61BC4B910E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m in Sources */, 4.539 + 61BC4B930E2F9EDA00F24255 /* UKKQueue.m in Sources */, 4.540 + 61BC4B940E2F9EDA00F24255 /* UKMainThreadProxy.m in Sources */, 4.541 + 6185E7400E76045D0009C2FD /* helper.m in Sources */, 4.542 + 6165CC8C0E9072A5007312DC /* RouteManager.m in Sources */, 4.543 + 6337527D101A1EBD00775AA2 /* TBTextView.m in Sources */, 4.544 + ); 4.545 + runOnlyForDeploymentPostprocessing = 0; 4.546 + }; 4.547 +/* End PBXSourcesBuildPhase section */ 4.548 + 4.549 +/* Begin PBXTargetDependency section */ 4.550 + 61BC4D960E2FA28700F24255 /* PBXTargetDependency */ = { 4.551 + isa = PBXTargetDependency; 4.552 + target = 61BC4BC00E2F9FE900F24255 /* openvpnstart */; 4.553 + targetProxy = 61BC4D950E2FA28700F24255 /* PBXContainerItemProxy */; 4.554 + }; 4.555 + 61BC4D980E2FA28700F24255 /* PBXTargetDependency */ = { 4.556 + isa = PBXTargetDependency; 4.557 + target = 61BC4D6A0E2FA06900F24255 /* installer */; 4.558 + targetProxy = 61BC4D970E2FA28700F24255 /* PBXContainerItemProxy */; 4.559 + }; 4.560 +/* End PBXTargetDependency section */ 4.561 + 4.562 +/* Begin PBXVariantGroup section */ 4.563 + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { 4.564 + isa = PBXVariantGroup; 4.565 + children = ( 4.566 + 089C165DFE840E0CC02AAC07 /* English */, 4.567 + ); 4.568 + name = InfoPlist.strings; 4.569 + sourceTree = "<group>"; 4.570 + }; 4.571 +/* End PBXVariantGroup section */ 4.572 + 4.573 +/* Begin XCBuildConfiguration section */ 4.574 + 61BC4BC30E2F9FE900F24255 /* Debug */ = { 4.575 + isa = XCBuildConfiguration; 4.576 + buildSettings = { 4.577 + COPY_PHASE_STRIP = NO; 4.578 + GCC_DYNAMIC_NO_PIC = NO; 4.579 + GCC_ENABLE_FIX_AND_CONTINUE = YES; 4.580 + GCC_MODEL_TUNING = G5; 4.581 + GCC_OPTIMIZATION_LEVEL = 0; 4.582 + INSTALL_PATH = /usr/local/bin; 4.583 + PREBINDING = NO; 4.584 + PRODUCT_NAME = openvpnstart; 4.585 + ZERO_LINK = YES; 4.586 + }; 4.587 + name = Debug; 4.588 + }; 4.589 + 61BC4BC40E2F9FE900F24255 /* Release */ = { 4.590 + isa = XCBuildConfiguration; 4.591 + buildSettings = { 4.592 + COPY_PHASE_STRIP = YES; 4.593 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 4.594 + GCC_ENABLE_FIX_AND_CONTINUE = NO; 4.595 + GCC_MODEL_TUNING = G5; 4.596 + INSTALL_PATH = /usr/local/bin; 4.597 + PREBINDING = NO; 4.598 + PRODUCT_NAME = openvpnstart; 4.599 + ZERO_LINK = NO; 4.600 + }; 4.601 + name = Release; 4.602 + }; 4.603 + 61BC4D6D0E2FA06900F24255 /* Debug */ = { 4.604 + isa = XCBuildConfiguration; 4.605 + buildSettings = { 4.606 + COPY_PHASE_STRIP = NO; 4.607 + GCC_DYNAMIC_NO_PIC = NO; 4.608 + GCC_ENABLE_FIX_AND_CONTINUE = YES; 4.609 + GCC_MODEL_TUNING = G5; 4.610 + GCC_OPTIMIZATION_LEVEL = 0; 4.611 + INSTALL_PATH = /usr/local/bin; 4.612 + PREBINDING = NO; 4.613 + PRODUCT_NAME = installer; 4.614 + ZERO_LINK = YES; 4.615 + }; 4.616 + name = Debug; 4.617 + }; 4.618 + 61BC4D6E0E2FA06900F24255 /* Release */ = { 4.619 + isa = XCBuildConfiguration; 4.620 + buildSettings = { 4.621 + COPY_PHASE_STRIP = YES; 4.622 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 4.623 + GCC_ENABLE_FIX_AND_CONTINUE = NO; 4.624 + GCC_MODEL_TUNING = G5; 4.625 + INSTALL_PATH = /usr/local/bin; 4.626 + PREBINDING = NO; 4.627 + PRODUCT_NAME = installer; 4.628 + ZERO_LINK = NO; 4.629 + }; 4.630 + name = Release; 4.631 + }; 4.632 + C01FCF4B08A954540054247B /* Debug */ = { 4.633 + isa = XCBuildConfiguration; 4.634 + buildSettings = { 4.635 + COPY_PHASE_STRIP = NO; 4.636 + FRAMEWORK_SEARCH_PATHS = ( 4.637 + "$(inherited)", 4.638 + "\"$(SRCROOT)/../third_party\"", 4.639 + ); 4.640 + GCC_DYNAMIC_NO_PIC = NO; 4.641 + GCC_ENABLE_FIX_AND_CONTINUE = YES; 4.642 + GCC_MODEL_TUNING = G5; 4.643 + GCC_OPTIMIZATION_LEVEL = 0; 4.644 + GCC_PRECOMPILE_PREFIX_HEADER = YES; 4.645 + GCC_PREFIX_HEADER = Tunnelblick_Prefix.pch; 4.646 + INFOPLIST_FILE = Info.plist; 4.647 + INSTALL_PATH = "$(HOME)/Applications"; 4.648 + PRODUCT_NAME = Tunnelblick; 4.649 + WRAPPER_EXTENSION = app; 4.650 + ZERO_LINK = YES; 4.651 + }; 4.652 + name = Debug; 4.653 + }; 4.654 + C01FCF4C08A954540054247B /* Release */ = { 4.655 + isa = XCBuildConfiguration; 4.656 + buildSettings = { 4.657 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 4.658 + FRAMEWORK_SEARCH_PATHS = ( 4.659 + "$(inherited)", 4.660 + "\"$(SRCROOT)/../third_party\"", 4.661 + ); 4.662 + GCC_MODEL_TUNING = G5; 4.663 + GCC_PRECOMPILE_PREFIX_HEADER = YES; 4.664 + GCC_PREFIX_HEADER = Tunnelblick_Prefix.pch; 4.665 + INFOPLIST_FILE = Info.plist; 4.666 + INSTALL_PATH = "$(HOME)/Applications"; 4.667 + PRODUCT_NAME = Tunnelblick; 4.668 + WRAPPER_EXTENSION = app; 4.669 + }; 4.670 + name = Release; 4.671 + }; 4.672 + C01FCF4F08A954540054247B /* Debug */ = { 4.673 + isa = XCBuildConfiguration; 4.674 + buildSettings = { 4.675 + GCC_WARN_ABOUT_RETURN_TYPE = YES; 4.676 + GCC_WARN_UNUSED_VARIABLE = YES; 4.677 + PREBINDING = NO; 4.678 + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; 4.679 + }; 4.680 + name = Debug; 4.681 + }; 4.682 + C01FCF5008A954540054247B /* Release */ = { 4.683 + isa = XCBuildConfiguration; 4.684 + buildSettings = { 4.685 + ARCHS = ( 4.686 + ppc, 4.687 + i386, 4.688 + ); 4.689 + GCC_WARN_ABOUT_RETURN_TYPE = YES; 4.690 + GCC_WARN_UNUSED_VARIABLE = YES; 4.691 + PREBINDING = NO; 4.692 + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; 4.693 + }; 4.694 + name = Release; 4.695 + }; 4.696 +/* End XCBuildConfiguration section */ 4.697 + 4.698 +/* Begin XCConfigurationList section */ 4.699 + 61BC4CDE0E2F9FF400F24255 /* Build configuration list for PBXNativeTarget "openvpnstart" */ = { 4.700 + isa = XCConfigurationList; 4.701 + buildConfigurations = ( 4.702 + 61BC4BC30E2F9FE900F24255 /* Debug */, 4.703 + 61BC4BC40E2F9FE900F24255 /* Release */, 4.704 + ); 4.705 + defaultConfigurationIsVisible = 0; 4.706 + defaultConfigurationName = Release; 4.707 + }; 4.708 + 61BC4D6F0E2FA08700F24255 /* Build configuration list for PBXNativeTarget "installer" */ = { 4.709 + isa = XCConfigurationList; 4.710 + buildConfigurations = ( 4.711 + 61BC4D6D0E2FA06900F24255 /* Debug */, 4.712 + 61BC4D6E0E2FA06900F24255 /* Release */, 4.713 + ); 4.714 + defaultConfigurationIsVisible = 0; 4.715 + defaultConfigurationName = Release; 4.716 + }; 4.717 + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Tunnelblick" */ = { 4.718 + isa = XCConfigurationList; 4.719 + buildConfigurations = ( 4.720 + C01FCF4B08A954540054247B /* Debug */, 4.721 + C01FCF4C08A954540054247B /* Release */, 4.722 + ); 4.723 + defaultConfigurationIsVisible = 0; 4.724 + defaultConfigurationName = Release; 4.725 + }; 4.726 + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Tunnelblick" */ = { 4.727 + isa = XCConfigurationList; 4.728 + buildConfigurations = ( 4.729 + C01FCF4F08A954540054247B /* Debug */, 4.730 + C01FCF5008A954540054247B /* Release */, 4.731 + ); 4.732 + defaultConfigurationIsVisible = 0; 4.733 + defaultConfigurationName = Release; 4.734 + }; 4.735 +/* End XCConfigurationList section */ 4.736 + }; 4.737 + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 4.738 +}
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/tunblick/installer.m Wed Jul 29 11:23:17 2009 +0200 5.3 @@ -0,0 +1,77 @@ 5.4 +/* 5.5 + * Copyright (c) 2004 Angelo Laub 5.6 + * 5.7 + * This program is free software; you can redistribute it and/or modify 5.8 + * it under the terms of the GNU General Public License version 2 5.9 + * as published by the Free Software Foundation. 5.10 + * 5.11 + * This program is distributed in the hope that it will be useful, 5.12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 5.13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 5.14 + * GNU General Public License for more details. 5.15 + * 5.16 + * You should have received a copy of the GNU General Public License 5.17 + * along with this program (see the file COPYING included with this 5.18 + * distribution); if not, write to the Free Software Foundation, Inc., 5.19 + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 5.20 + */ 5.21 + 5.22 +#include "installer.h" 5.23 + 5.24 +int main(int argc, char *argv[]) 5.25 +{ 5.26 + NSAutoreleasePool *pool = [NSAutoreleasePool new]; 5.27 + NSString *thisBundle = [[NSString stringWithUTF8String:argv[0]] stringByDeletingLastPathComponent]; 5.28 + 5.29 + NSString *tunPath = [thisBundle stringByAppendingPathComponent:@"/tun.kext"]; 5.30 + NSString *tapPath = [thisBundle stringByAppendingPathComponent:@"/tap.kext"]; 5.31 + 5.32 + NSString *tunExecutable = [tunPath stringByAppendingPathComponent:@"/Contents/MacOS/tun"]; 5.33 + NSString *tapExecutable = [tapPath stringByAppendingPathComponent:@"/Contents/MacOS/tap"]; 5.34 + 5.35 + NSString *helperPath = [thisBundle stringByAppendingPathComponent:@"/openvpnstart"]; 5.36 + NSString *openvpnPath = [thisBundle stringByAppendingPathComponent:@"/openvpn"]; 5.37 + 5.38 + runTask( 5.39 + @"/usr/sbin/chown", 5.40 + [NSArray arrayWithObjects:@"-R",@"root:wheel",thisBundle,nil] 5.41 + ); 5.42 + 5.43 + 5.44 + runTask( 5.45 + @"/bin/chmod", 5.46 + [NSArray arrayWithObjects:@"-R",@"755",tunPath,tapPath,nil] 5.47 + ); 5.48 + 5.49 + runTask( 5.50 + @"/bin/chmod", 5.51 + [NSArray arrayWithObjects:@"744", 5.52 + tunExecutable, 5.53 + tapExecutable, 5.54 + helperPath, 5.55 + openvpnPath, 5.56 + nil] 5.57 + ); 5.58 + runTask( 5.59 + @"/bin/chmod", 5.60 + [NSArray arrayWithObjects:@"4111",helperPath,nil] 5.61 + ); 5.62 + [pool release]; 5.63 + return 0; 5.64 +} 5.65 + 5.66 +void runTask(NSString *launchPath,NSArray *arguments) 5.67 +{ 5.68 + NSTask* task = [[[NSTask alloc] init] autorelease]; 5.69 + [task setArguments:arguments]; 5.70 + [task setLaunchPath:launchPath]; 5.71 + 5.72 + NS_DURING { 5.73 + [task launch]; 5.74 + } NS_HANDLER { 5.75 + NSLog(@"Exception raised while executing helper %@: %@",launchPath, localException); 5.76 + exit(EXIT_FAILURE); 5.77 + } 5.78 + NS_ENDHANDLER 5.79 + [task waitUntilExit]; 5.80 +}
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/tunblick/openvpnstart.m Wed Jul 29 11:23:17 2009 +0200 6.3 @@ -0,0 +1,330 @@ 6.4 +/* 6.5 + * Copyright (c) 2004-2006 Angelo Laub 6.6 + * Contributions by Dirk Theisen 6.7 + * 6.8 + * This program is free software; you can redistribute it and/or modify 6.9 + * it under the terms of the GNU General Public License version 2 6.10 + * as published by the Free Software Foundation. 6.11 + * 6.12 + * This program is distributed in the hope that it will be useful, 6.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 6.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 6.15 + * GNU General Public License for more details. 6.16 + * 6.17 + * You should have received a copy of the GNU General Public License 6.18 + * along with this program (see the file COPYING included with this 6.19 + * distribution); if not, write to the Free Software Foundation, Inc., 6.20 + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 6.21 + */ 6.22 + 6.23 +#import <Foundation/Foundation.h> 6.24 +#import <Foundation/NSDebug.h> 6.25 +#import <sys/types.h> 6.26 +#import <sys/stat.h> 6.27 +#import <unistd.h> 6.28 +#import <sys/sysctl.h> 6.29 +#import <signal.h> 6.30 + 6.31 +void startVPN (NSString* configFile, int port, BOOL useScripts, BOOL skipCheck); //Tries to start an openvpn connection. May complain and exit if can't become root 6.32 +void killOneOpenvpn (pid_t pid); //Returns having killed an openvpn process, or complains and exits 6.33 +int killAllOpenvpn (void); //Kills all openvpn processes and returns the number of processes that were killed. May complain and exit 6.34 + 6.35 +void loadKexts (void); //Tries to load kexts -- no indication of failure. May complain and exit if can't become root 6.36 +void becomeRoot (void); //Returns as root, having setuid(0) if necessary; complains and exits if can't become root 6.37 + 6.38 +void getProcesses (struct kinfo_proc** procs, int* number); //Fills in process information 6.39 +BOOL isOpenvpn (pid_t pid); //Returns TRUE if process is an openvpn process (i.e., process name = "openvpn") 6.40 +BOOL configNeedsRepair (void); //Returns NO if configuration file is secure, otherwise complains and exits 6.41 + 6.42 +NSString* execPath; //Path to folder containing this executable, openvpn, tap.kext, tun.kext, client.up.osx.sh, and client.down.osx.sh 6.43 +NSString* configPath; //Path to configuration file (in ~/Library/openvpn) 6.44 +NSAutoreleasePool* pool; 6.45 + 6.46 +int main(int argc, char* argv[]) 6.47 +{ 6.48 + pool = [[NSAutoreleasePool alloc] init]; 6.49 + 6.50 + BOOL syntaxError = TRUE; 6.51 + 6.52 + if (argc > 1) { 6.53 + char* command = argv[1]; 6.54 + if( strcmp(command, "killall") == 0 ) { 6.55 + if (argc == 2) { 6.56 + int nKilled; 6.57 + nKilled = killAllOpenvpn(); 6.58 + if (nKilled) { 6.59 + printf("%d openvpn processes killed\n", nKilled); 6.60 + } else { 6.61 + fprintf(stderr, "%d openvpn processes killed\n", nKilled); 6.62 + } 6.63 + syntaxError = FALSE; 6.64 + } 6.65 + } else if( strcmp(command, "kill") == 0 ) { 6.66 + if (argc == 3) { 6.67 + pid_t pid = (pid_t) atoi(argv[2]); 6.68 + killOneOpenvpn(pid); 6.69 + syntaxError = FALSE; 6.70 + } 6.71 + } else if( strcmp(command, "start") == 0 ) { 6.72 + if ( (argc > 3) && (argc < 7) ) { 6.73 + NSString* configFile = [NSString stringWithUTF8String:argv[2]]; 6.74 + execPath = [[NSString stringWithUTF8String:argv[0]] stringByDeletingLastPathComponent]; 6.75 + if(strlen(argv[3]) < 6 ) { 6.76 + unsigned int port = atoi(argv[3]); 6.77 + if (port<=65535) { 6.78 + BOOL useScripts = FALSE; if( (argc > 4) && (atoi(argv[4]) == 1) ) useScripts = TRUE; 6.79 + BOOL skipCheck = FALSE; if( (argc > 5) && (atoi(argv[5]) == 1) ) skipCheck = TRUE; 6.80 + startVPN(configFile, port, useScripts, skipCheck); 6.81 + syntaxError = FALSE; 6.82 + } 6.83 + } 6.84 + } 6.85 + } 6.86 + } 6.87 + 6.88 + if (syntaxError) { 6.89 + fprintf(stderr, "Error: Syntax error. Usage:\n\n" 6.90 + 6.91 + "\t./openvpnstart killall\n" 6.92 + "\t./openvpnstart kill processId\n" 6.93 + "\t./openvpnstart start configName mgtPort [useScripts [skipCheck] ]\n\n" 6.94 + 6.95 + "Where:\n" 6.96 + "\tprocessId is the process ID of the openvpn process to kill\n" 6.97 + "\tconfigName is the name of the configuration file (which must be in ~/Library/openvpn)\n" 6.98 + "\tmgtPort is the port number (0-65535) to use for managing the connection\n" 6.99 + "\tuseScripts is 1 to run the client.up.osx.sh script before connecting, and client.down.osx.sh after disconnecting\n" 6.100 + "\t (The scripts are in Tunnelblick.app/Contents/Resources/)\n" 6.101 + "\tskipCheck is 1 to skip checking ownership and permissions of the configuration file\n\n" 6.102 + 6.103 + "useScripts and skipCheck each default to 0.\n\n" 6.104 + 6.105 + "The normal return code is 0. If an error occurs a message is sent to stderr and a code of 2 is returned.\n" 6.106 + 6.107 + "This executable must be in the same folder as openvpn, tap.kext, and tun.kext (and client.up.osx.sh and client.down.osx.sh if they are used).\n\n" 6.108 + 6.109 + "Tunnelblick must have been run and an administrator password entered at least once before openvpnstart can be used." 6.110 + ); 6.111 + [pool drain]; 6.112 + exit(2); 6.113 + } 6.114 + 6.115 + [pool drain]; 6.116 + exit(0); 6.117 +} 6.118 + 6.119 +//Tries to start an openvpn connection -- no indication of failure. May complain and exit if can't become root 6.120 +void startVPN(NSString* configFile, int port, BOOL useScripts, BOOL skipCheck) 6.121 +{ 6.122 + NSString* directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/openvpn"]; 6.123 + configPath = [directoryPath stringByAppendingPathComponent:configFile]; 6.124 + NSString* openvpnPath = [execPath stringByAppendingPathComponent: @"openvpn"]; 6.125 + NSMutableString* upscriptPath = [[execPath stringByAppendingPathComponent: @"client.up.osx.sh"] mutableCopy]; 6.126 + NSMutableString* downscriptPath = [[execPath stringByAppendingPathComponent: @"client.down.osx.sh"] mutableCopy]; 6.127 + [upscriptPath replaceOccurrencesOfString:@" " withString:@"\\ " options:NSLiteralSearch range:NSMakeRange(0, [upscriptPath length])]; 6.128 + [downscriptPath replaceOccurrencesOfString:@" " withString:@"\\ " options:NSLiteralSearch range:NSMakeRange(0, [downscriptPath length])]; 6.129 + 6.130 + if ( ! skipCheck ) { 6.131 + if(configNeedsRepair()) { 6.132 + [pool drain]; 6.133 + exit(2); 6.134 + } 6.135 + } 6.136 + 6.137 + // default arguments to openvpn command line 6.138 + NSMutableArray* arguments = [NSMutableArray arrayWithObjects: 6.139 + @"--management-query-passwords", 6.140 + @"--cd", directoryPath, 6.141 + @"--daemon", 6.142 + @"--management-hold", 6.143 + @"--management", @"127.0.0.1", [NSString stringWithFormat:@"%d", port], 6.144 + @"--config", configPath, 6.145 + @"--script-security", @"2", // allow us to call the up and down scripts or scripts defined in config 6.146 + nil 6.147 + ]; 6.148 + 6.149 + // conditionally push additional arguments to array 6.150 + if(useScripts) { 6.151 + [arguments addObjectsFromArray: 6.152 + [NSArray arrayWithObjects: 6.153 + @"--up", upscriptPath, 6.154 + @"--down", downscriptPath, 6.155 + @"--up-restart", 6.156 + nil 6.157 + ] 6.158 + ]; 6.159 + } 6.160 + 6.161 + loadKexts(); 6.162 + 6.163 + NSTask* task = [[[NSTask alloc] init] autorelease]; 6.164 + [task setLaunchPath:openvpnPath]; 6.165 + [task setArguments:arguments]; 6.166 + 6.167 + becomeRoot(); 6.168 + [task launch]; 6.169 + [task waitUntilExit]; 6.170 + 6.171 + [upscriptPath release]; 6.172 + [downscriptPath release]; 6.173 +} 6.174 + 6.175 +//Returns having killed an openvpn process, or complains and exits 6.176 +void killOneOpenvpn(pid_t pid) 6.177 +{ 6.178 + int didnotKill; 6.179 + 6.180 + if(isOpenvpn(pid)) { 6.181 + becomeRoot(); 6.182 + didnotKill = kill(pid, SIGTERM); 6.183 + if (didnotKill) { 6.184 + fprintf(stderr, "Error: Unable to kill openvpn process %d\n", pid); 6.185 + [pool drain]; 6.186 + exit(2); 6.187 + } 6.188 + } else { 6.189 + fprintf(stderr, "Error: Process %d is not an openvpn process\n", pid); 6.190 + [pool drain]; 6.191 + exit(2); 6.192 + } 6.193 +} 6.194 + 6.195 +//Kills all openvpn processes and returns the number of processes that were killed. May complain and exit if can't become root or some openvpn processes can't be killed 6.196 +int killAllOpenvpn(void) 6.197 +{ 6.198 + int count = 0, 6.199 + i = 0, 6.200 + nKilled = 0, //# of openvpn processes succesfully killed 6.201 + nNotKilled = 0, //# of openvpn processes not killed 6.202 + didnotKill; //return value from kill() -- zero indicates killed successfully 6.203 + 6.204 + struct kinfo_proc* info = NULL; 6.205 + 6.206 + getProcesses(&info, &count); 6.207 + 6.208 + for (i = 0; i < count; i++) { 6.209 + char* process_name = info[i].kp_proc.p_comm; 6.210 + pid_t pid = info[i].kp_proc.p_pid; 6.211 + if(strcmp(process_name, "openvpn") == 0) { 6.212 + becomeRoot(); 6.213 + didnotKill = kill(pid, SIGTERM); 6.214 + if (didnotKill) { 6.215 + fprintf(stderr, "Error: Unable to kill openvpn process %d\n", pid); 6.216 + nNotKilled++; 6.217 + } else { 6.218 + nKilled++; 6.219 + } 6.220 + } 6.221 + } 6.222 + 6.223 + free(info); 6.224 + 6.225 + if (nNotKilled) { 6.226 + // An error message for each openvpn process that wasn't killed has already been output 6.227 + [pool drain]; 6.228 + exit(2); 6.229 + } 6.230 + 6.231 + return(nKilled); 6.232 +} 6.233 + 6.234 +//Tries to load kexts -- no indication of failure. May complain and exit if can't become root 6.235 +void loadKexts(void) 6.236 +{ 6.237 + NSString* tapPath = [execPath stringByAppendingPathComponent: @"tap.kext"]; 6.238 + NSString* tunPath = [execPath stringByAppendingPathComponent: @"tun.kext"]; 6.239 + NSTask* task = [[[NSTask alloc] init] autorelease]; 6.240 + NSArray* arguments = [NSArray arrayWithObjects:tapPath, tunPath, nil]; 6.241 + 6.242 + [task setLaunchPath:@"/sbin/kextload"]; 6.243 + 6.244 + [task setArguments:arguments]; 6.245 + 6.246 + becomeRoot(); 6.247 + [task launch]; 6.248 + [task waitUntilExit]; 6.249 +} 6.250 + 6.251 +//Returns as root, having setuid(0) if necessary; complains and exits if can't become root 6.252 +void becomeRoot(void) 6.253 +{ 6.254 + if (getuid() != 0) { 6.255 + if ( setuid(0) ) { 6.256 + fprintf(stderr, "Error: Unable to become root\n" 6.257 + "You must have run Tunnelblick and entered an administrator password at least once to use openvpnstart\n"); 6.258 + [pool drain]; 6.259 + exit(2); 6.260 + } 6.261 + } 6.262 +} 6.263 + 6.264 +//Fills in process information 6.265 +void getProcesses(struct kinfo_proc** procs, int* number) 6.266 +{ 6.267 + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; 6.268 + struct kinfo_proc* info; 6.269 + size_t length; 6.270 + int level = 3; 6.271 + 6.272 + if (sysctl(mib, level, NULL, &length, NULL, 0) < 0) return; 6.273 + if (!(info = malloc(length))) return; 6.274 + if (sysctl(mib, level, info, &length, NULL, 0) < 0) { 6.275 + free(info); 6.276 + return; 6.277 + } 6.278 + *procs = info; 6.279 + *number = length / sizeof(struct kinfo_proc); 6.280 +} 6.281 + 6.282 +//Returns TRUE if process is an openvpn process (i.e., process name = "openvpn"), otherwise returns FALSE 6.283 +BOOL isOpenvpn(pid_t pid) 6.284 +{ 6.285 + BOOL is_openvpn = FALSE; 6.286 + int count = 0, 6.287 + i = 0; 6.288 + struct kinfo_proc* info = NULL; 6.289 + 6.290 + getProcesses(&info, &count); 6.291 + for (i = 0; i < count; i++) { 6.292 + char* process_name = info[i].kp_proc.p_comm; 6.293 + pid_t thisPid = info[i].kp_proc.p_pid; 6.294 + if (pid == thisPid) { 6.295 + if (strcmp(process_name, "openvpn")==0) { 6.296 + is_openvpn = TRUE; 6.297 + } else { 6.298 + is_openvpn = FALSE; 6.299 + } 6.300 + break; 6.301 + } 6.302 + } 6.303 + free(info); 6.304 + return is_openvpn; 6.305 +} 6.306 + 6.307 +//Returns NO if configuration file is secure, otherwise complains and exits 6.308 +BOOL configNeedsRepair(void) 6.309 +{ 6.310 + NSFileManager* fileManager = [NSFileManager defaultManager]; 6.311 + NSDictionary* fileAttributes = [fileManager fileAttributesAtPath:configPath traverseLink:YES]; 6.312 + 6.313 + if (fileAttributes == nil) { 6.314 + fprintf(stderr, "Error: %s does not exist\n", [configPath UTF8String]); 6.315 + [pool drain]; 6.316 + exit(2); 6.317 + } 6.318 + 6.319 + unsigned long perms = [fileAttributes filePosixPermissions]; 6.320 + NSString* octalString = [NSString stringWithFormat:@"%o", perms]; 6.321 + NSNumber* fileOwner = [fileAttributes fileOwnerAccountID]; 6.322 + 6.323 + if ( (![octalString isEqualToString:@"644"]) || (![fileOwner isEqualToNumber:[NSNumber numberWithInt:0]])) { 6.324 + NSString* errMsg = [NSString stringWithFormat:@"Error: File %@ is owned by %@ and has permissions %@\n" 6.325 + "Configuration files must be owned by root:wheel with permissions 0644\n" 6.326 + "To skip this check, use 'skipCheck' -- type './openvpnstart' (with no arguments) for details)\n", 6.327 + configPath, fileOwner, octalString]; 6.328 + fprintf(stderr, [errMsg UTF8String]); 6.329 + [pool drain]; 6.330 + exit(2); 6.331 + } 6.332 + return NO; 6.333 +}
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/tunblick/third_party/Makefile Wed Jul 29 11:23:17 2009 +0200 7.3 @@ -0,0 +1,86 @@ 7.4 +# This Makefile builds all the third_party code 7.5 +# It shouldn't be called by anything other than automated scripts 7.6 + 7.7 +# Both lzo and openvpn should be built universally 7.8 + 7.9 +LZO_DIR=lzo-2.02 7.10 +PKCS11_DIR=pkcs11-helper-1.07 7.11 + 7.12 +all: tuntap lzo openvpn 7.13 + 7.14 +pkcs11-helper:: 7.15 + @for a in ppc i686; do \ 7.16 + echo Configure PKCS11-Helper for $$a; \ 7.17 + cd $(PKCS11_DIR); \ 7.18 + echo Forcefully be clean; \ 7.19 + $(MAKE) clean; \ 7.20 + OPENSSL_LIBS="-lcrypto" CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -Os -mmacosx-version-min=10.4 -arch $$a" ./configure --enable-static --disable-dependency-tracking --prefix=$$(pwd)/staging_$$a/ --includedir=$$(pwd)/staging/include/; \ 7.21 + echo Build PKCS11-Helper; \ 7.22 + $(MAKE); \ 7.23 + echo Install to third_party/$(PKCS11_DIR)/staging_$$a; \ 7.24 + $(MAKE) install; \ 7.25 + cd ../; \ 7.26 + done 7.27 + mkdir -p $(PKCS11_DIR)/staging/lib 7.28 + lipo $(PKCS11_DIR)/staging_*/lib/libpkcs11-helper.a -create -output $(PKCS11_DIR)/staging/lib/libpkcs11-helper.a 7.29 + cp $(PKCS11_DIR)/staging_i686/lib/libpkcs11-helper.la $(PKCS11_DIR)/staging/lib/ 7.30 + 7.31 +lzo:: 7.32 + @for a in ppc i686; do \ 7.33 + echo Configure LZO for $$a; \ 7.34 + cd $(LZO_DIR); \ 7.35 + echo Forcefully be clean; \ 7.36 + $(MAKE) clean; \ 7.37 + CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -Os -mmacosx-version-min=10.4 -arch $$a" ./configure --disable-dependency-tracking --disable-asm --prefix=$$(pwd)/staging_$$a/ --includedir=$$(pwd)/staging/include/; \ 7.38 + echo Build LZO; \ 7.39 + $(MAKE); \ 7.40 + echo Install to third_party/$(LZO_DIR)/staging_$$a; \ 7.41 + $(MAKE) install; \ 7.42 + cd ../; \ 7.43 + done 7.44 + 7.45 + # Use lipo to create a universal library 7.46 + mkdir -p $(LZO_DIR)/staging/lib 7.47 + lipo $(LZO_DIR)/staging_*/lib/liblzo2.a -create -output $(LZO_DIR)/staging/lib/liblzo2.a 7.48 + cp $(LZO_DIR)/staging_i686/lib/liblzo2.la $(LZO_DIR)/staging/lib/ 7.49 + 7.50 + # wtf? library was renamed??? move it back so openvpn will build correctly 7.51 + cd $(LZO_DIR)/staging/lib/; mv liblzo2.a liblzo.a; mv liblzo2.la liblzo.la 7.52 + 7.53 +lzo-clean: 7.54 + $(MAKE) -C $(LZO_DIR) clean 7.55 + rm -rf $(LZO_DIR)/staging* 7.56 + 7.57 +openvpn: lzo pkcs11-helper 7.58 + @for a in ppc i686; do \ 7.59 + echo Configure OpenVPN for $$a; \ 7.60 + cd openvpn/; \ 7.61 + echo Forcefully be clean; \ 7.62 + $(MAKE) clean; \ 7.63 + autoreconf -i -v; \ 7.64 + LDFLAGS="-L../$(PKCS11_DIR)/staging/lib/" CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -Os -mmacosx-version-min=10.4 -arch $$a" ./configure --with-lzo-headers=../$(LZO_DIR)/staging/include/ --with-lzo-lib=../$(LZO_DIR)/staging/lib/ --with-pkcs11-helper-headers=../$(PKCS11_DIR)/staging/include/ --with-pkcs11-helper-libs=../$(PKCS11_DIR)/staging/lib/ --disable-dependency-tracking; \ 7.65 + echo Build OpenVPN; \ 7.66 + $(MAKE); \ 7.67 + mv openvpn openvpn_tblk_$$a; \ 7.68 + cd ../; \ 7.69 + done 7.70 + 7.71 + # Use lipo to create a universal library 7.72 + lipo openvpn/openvpn_tblk_* -create -output openvpn/openvpn 7.73 + 7.74 +openvpn-clean: 7.75 + $(MAKE) -C openvpn/ clean 7.76 + rm -f openvpn/openvpn_tblk_* 7.77 + 7.78 +.PHONY : tuntap 7.79 + 7.80 +tuntap: 7.81 + # Now we'll build the tun/tap driver 7.82 + $(MAKE) -C tuntap/ 7.83 + 7.84 +tuntap-clean: 7.85 + $(MAKE) -C tuntap/ clean 7.86 + 7.87 + 7.88 + 7.89 +clean: lzo-clean tuntap-clean openvpn-clean