# HG changeset patch # User Michael Schloh von Bennewitz # Date 1248859397 -7200 # Node ID 1a5334dfb21def0f5807da4bc2df23c57b1745e3 # Parent e253b438313227778cc0afa44706d229b3c086fc Import package vendor original sources for necessary manipulations. diff -r e253b4383132 -r 1a5334dfb21d tunblick/MenuController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/MenuController.m Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,1077 @@ +/* + * Copyright (c) 2004 Angelo Laub + * Contributions by Dirk Theisen , + * Jens Ohlig, + * Waldemar Brodkorb + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#import "MenuController.h" +#import "NSApplication+NetworkNotifications.h" +#import "helper.h" + + +#define NSAppKitVersionNumber10_0 577 +#define NSAppKitVersionNumber10_1 620 +#define NSAppKitVersionNumber10_2 663 +#define NSAppKitVersionNumber10_3 743 + + + +BOOL systemIsTigerOrNewer() +{ + return (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_3) ; +} + +@interface NSStatusBar (NSStatusBar_Private) +- (id)_statusItemWithLength:(float)l withPriority:(int)p; +@end + + +@implementation MenuController + +- (void) createStatusItem +{ + NSStatusBar *bar = [NSStatusBar systemStatusBar]; + int priority = INT32_MAX; + if (systemIsTigerOrNewer()) { + priority = MIN(priority, 2147483646); // found by experimenting - dirk + } + + if (!theItem) { + theItem = [[bar _statusItemWithLength: NSVariableStatusItemLength withPriority: priority] retain]; + //theItem = [[bar _statusItemWithLength: NSVariableStatusItemLength withPriority: 0] retain]; + } + // Dirk: For Tiger and up, re-insert item to place it correctly. + if ([bar respondsToSelector: @selector(_insertStatusItem:withPriority:)]) { + [bar removeStatusItem: theItem]; + [bar _insertStatusItem: theItem withPriority: priority]; + } +} + +-(id) init +{ + if (self = [super init]) { + [self dmgCheck]; + + errorImage = [[NSImage imageNamed: @"error.tif"] retain]; + mainImage = [[NSImage imageNamed: @"00_closed.tif"] retain]; + connectedImage = [[NSImage imageNamed: @"connected.png"] retain]; + + + transitionalImage1 = [[NSImage imageNamed: @"01.tif"] retain]; + transitionalImage2 = [[NSImage imageNamed: @"02.tif"] retain]; + transitionalImage3 = [[NSImage imageNamed: @"03.tif"] retain]; + [NSApp setDelegate:self]; + + myVPNConnectionDictionary = [[NSMutableDictionary alloc] init]; + myVPNConnectionArray = [[[NSMutableArray alloc] init] retain]; + userDefaults = [[NSMutableDictionary alloc] init]; + + connectionArray = [[[NSMutableArray alloc] init] retain]; + appDefaults = [NSUserDefaults standardUserDefaults]; + [appDefaults registerDefaults:userDefaults]; + + + detailsItem = [[NSMenuItem alloc] init]; + [detailsItem setTitle: @"Details..."]; + [detailsItem setTarget: self]; + [detailsItem setAction: @selector(openLogWindow:)]; + + quitItem = [[NSMenuItem alloc] init]; + [quitItem setTitle: @"Quit"]; + [quitItem setTarget: self]; + [quitItem setAction: @selector(quit:)]; + + [self createStatusItem]; + + [self updateMenu]; + [self setState: @"EXITING"]; // synonym for "Disconnected" + + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(logNeedsScrolling:) + name: @"LogDidChange" + object: nil]; + + // In case the systemUIServer restarts, we observed this notification. + // We use it to prevent to end up with a statusItem right of Spotlight: + [[NSDistributedNotificationCenter defaultCenter] addObserver: self + selector: @selector(menuExtrasWereAdded:) + name: @"com.apple.menuextra.added" + object: nil]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(willGoToSleep) + name: @"NSWorkspaceWillSleepNotification" + object:nil]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(wokeUpFromSleep) + name: @"NSWorkspaceDidWakeNotification" + object:nil]; + + NSString* vpnDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn/"]; + + UKKQueue* myQueue = [UKKQueue sharedQueue]; + [myQueue addPathToQueue: vpnDirectory]; + [myQueue setDelegate: self]; + [myQueue setAlwaysNotify: YES]; + + [NSThread detachNewThreadSelector:@selector(moveAllWindowsToForegroundThread) toTarget:self withObject:nil]; + + updater = [[SUUpdater alloc] init]; + + } + return self; +} + +-(void)moveAllWindowsToForegroundThread { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + sleep(3); + [self moveAllWindowsToForeground]; +// [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self selector: @selector(moveAllWindowsToForeground) userInfo: nil repeats: YES]; + [pool release]; + +} + +- (void) menuExtrasWereAdded: (NSNotification*) n +{ + [self createStatusItem]; +} + + + +- (IBAction) quit: (id) sender +{ + // Remove us from the login items if terminates manually... + [NSApp setAutoLaunchOnLogin: NO]; + [NSApp terminate: sender]; +} + + + +- (void) awakeFromNib +{ + [self createDefaultConfig]; + [self initialiseAnim]; +} + +- (void) initialiseAnim +{ + NSAnimationProgress progMarks[] = { + 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 + }; + + int i, count = 8; + // theAnim is an NSAnimation instance variable + theAnim = [[NSAnimation alloc] initWithDuration:2.0 + animationCurve:NSAnimationLinear]; + [theAnim setFrameRate:8.0]; + [theAnim setDelegate:self]; + + for (i=0; i= 0 ) { + if ( cTimeL < 3600 ) { + cTimeS = [NSString stringWithFormat:@" %li:%02li", cTimeL/60, cTimeL%60]; + } else { + cTimeS = [NSString stringWithFormat:@" %li:%02li:%02li", cTimeL/3600, (cTimeL/60) % 60, cTimeL%60]; + } + } + } + NSString *label = [NSString stringWithFormat:@"%@ (%@%@)",[myConnection configName],local(cState), cTimeS]; + [[tabView tabViewItemAtIndex:i] setLabel:label]; + i++; + } +} + + +- (void) updateUI +{ + unsigned connectionNumber = [connectionArray count]; + NSString *myState; + if(connectionNumber == 1) { + myState = local(@"OpenVPN: 1 connection active."); + } else { + myState = [NSString stringWithFormat:local(@"OpenVPN: %d connections active."),connectionNumber]; + } + + [statusMenuItem setTitle: myState]; + [theItem setToolTip: myState]; + + if( (![lastState isEqualToString:@"EXITING"]) && (![lastState isEqualToString:@"CONNECTED"]) ) { + // override while in transitional state + // Any other state shows "transitional" image: + //[theItem setImage: transitionalImage]; + if (![theAnim isAnimating]) + { + //NSLog(@"Starting Animation"); + [theAnim startAnimation]; + } + } else + { + if ([theAnim isAnimating]) + { + [theAnim stopAnimation]; + } + } + if (connectionNumber > 0 ) { + [theItem setImage: connectedImage]; + } else { + [theItem setImage: mainImage]; + } +} + +- (void)animationDidEnd:(NSAnimation*)animation +{ + if ((![lastState isEqualToString:@"EXITING"]) && (![lastState isEqualToString:@"CONNECTED"])) + { + // NSLog(@"Starting Animation (2)"); + [theAnim startAnimation]; + } + if ([connectionArray count] > 0 ) { + [theItem setImage: connectedImage]; + } else { + [theItem setImage: mainImage]; + } +} + +- (void)animation:(NSAnimation *)animation + didReachProgressMark:(NSAnimationProgress)progress +{ + if (animation == theAnim) + { + // NSLog(@"progress is %f %i", progress, lround(progress * 8)); + // Do an effect appropriate to progress mark. + switch(lround(progress * 8)) + { + case 1: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:mainImage waitUntilDone:YES]; + break; + + case 2: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage1 waitUntilDone:YES]; + break; + + case 3: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage2 waitUntilDone:YES]; + break; + + case 4: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage3 waitUntilDone:YES]; + break; + + case 5: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:connectedImage waitUntilDone:YES]; + break; + + case 6: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage3 waitUntilDone:YES]; + break; + + case 7: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage2 waitUntilDone:YES]; + break; + + case 8: + [theItem performSelectorOnMainThread:@selector(setImage:) withObject:transitionalImage1 waitUntilDone:YES]; + break; + + default: + NSLog(@"Unknown progress mark %f selected by Tunnelblick animation", progress); + } + } +} + +- (void) tabView: (NSTabView*) inTabView willSelectTabViewItem: (NSTabViewItem*) tabViewItem +{ + NSView* view = [[inTabView selectedTabViewItem] view]; + [tabViewItem setView: view]; + [[[self selectedLogView] textStorage] setDelegate: nil]; +} + +- (void) tabView: (NSTabView*) inTabView didSelectTabViewItem: (NSTabViewItem*) tabViewItem +{ + VPNConnection* newConnection = [self selectedConnection]; + NSTextView* logView = [self selectedLogView]; + [[logView layoutManager] replaceTextStorage: [newConnection logStorage]]; + //[logView setSelectedRange: NSMakeRange([[logView textStorage] length],[[logView textStorage] length])]; + [logView scrollRangeToVisible: NSMakeRange([[logView string] length]-1, 0)]; + + [[logView textStorage] setDelegate: self]; + + [self validateLogButtons]; +} +- (void) textStorageDidProcessEditing: (NSNotification*) aNotification +{ + NSNotification *notification = [NSNotification notificationWithName: @"LogDidChange" + object: [self selectedLogView]]; + [[NSNotificationQueue defaultQueue] enqueueNotification: notification + postingStyle: NSPostWhenIdle + coalesceMask: NSNotificationCoalescingOnName | NSNotificationCoalescingOnSender + forModes: nil]; +} + +- (void) logNeedsScrolling: (NSNotification*) aNotification +{ + NSTextView* textView = [aNotification object]; + [textView scrollRangeToVisible: NSMakeRange([[textView string] length]-1, 0)]; +} + +- (NSTextView*) selectedLogView +{ + NSTextView* result = [[[[[tabView selectedTabViewItem] view] subviews] lastObject] documentView]; + return result; +} + +- (IBAction) clearLog: (id) sender +{ + NSString * versionInfo = [NSString stringWithFormat:local(@"Tunnelblick version %@"),[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]; + NSCalendarDate* date = [NSCalendarDate date]; + NSString *dateText = [NSString stringWithFormat:@"%@ %@\n",[date descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"],versionInfo]; + [[self selectedLogView] setString: [[[NSString alloc] initWithString: dateText] autorelease]]; +} + +- (VPNConnection*) selectedConnection + /*" Returns the connection associated with the currently selected log tab or nil on error. "*/ +{ + if (![tabView selectedTabViewItem]) { + [tabView selectFirstTabViewItem: nil]; + } + + NSString* configPath = [[tabView selectedTabViewItem] identifier]; + VPNConnection* connection = [myVPNConnectionDictionary objectForKey:configPath]; + NSArray *allConnections = [myVPNConnectionDictionary allValues]; + if(connection) return connection; + else if([allConnections count]) return [allConnections objectAtIndex:0] ; + else return nil; +} + + + + +- (IBAction)connect:(id)sender +{ + [[self selectedConnection] connect: sender]; +} + +- (IBAction)disconnect:(id)sender +{ + [[self selectedConnection] disconnect: sender]; +} + + +- (IBAction) openLogWindow: (id) sender +{ + if (logWindow != nil) { + [logWindow makeKeyAndOrderFront: self]; + [NSApp activateIgnoringOtherApps:YES]; + return; + } + + [NSBundle loadNibNamed: @"LogWindow" owner: self]; // also sets tabView etc. + + // Set the window's size and position from preferences (saved when window is closed) + // But only if the preference's version matches the TB version (since window size could be different in different versions of TB) + NSString * tbVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; + id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrameVersion"]; + if (tmp != nil) { + if ( [tbVersion isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrameVersion"]] ) { + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrame"]; + if(tmp != nil) { + NSString * frame = [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrame"]; + [logWindow setFrameFromString:frame]; + } + } + } + + [logWindow setDelegate:self]; + VPNConnection *myConnection = [self selectedConnection]; + NSTextStorage* store = [myConnection logStorage]; + [[[self selectedLogView] layoutManager] replaceTextStorage: store]; + + NSEnumerator* e = [[[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)] objectEnumerator]; + //id test = [[myVPNConnectionDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)]; + NSTabViewItem* initialItem; + VPNConnection* connection = [myVPNConnectionDictionary objectForKey: [e nextObject]]; + if (connection) { + initialItem = [tabView tabViewItemAtIndex: 0]; + [initialItem setIdentifier: [connection configPath]]; + [initialItem setLabel: [connection configName]]; + + int curTabIndex = 0; + [tabView selectTabViewItemAtIndex:0]; + BOOL haveOpenConnection = ! [connection isDisconnected]; + while (connection = [myVPNConnectionDictionary objectForKey: [e nextObject]]) { + NSTabViewItem* newItem = [[NSTabViewItem alloc] init]; + [newItem setIdentifier: [connection configPath]]; + [newItem setLabel: [connection configName]]; + [tabView addTabViewItem: newItem]; + ++curTabIndex; + if ( ( ! haveOpenConnection ) && ( ! [connection isDisconnected] ) ) { + [tabView selectTabViewItemAtIndex:curTabIndex]; + haveOpenConnection = YES; + } + } + } + [self tabView:tabView didSelectTabViewItem:initialItem]; + [self validateLogButtons]; + [self updateTabLabels]; + + // Set up a timer to update the tab labels with connections' duration times + BOOL showAllDurations = FALSE; + BOOL showConnectedDurations = TRUE; + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showAllDurations"]; + if(tmp != nil) { + showAllDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showAllDurations"]; + } + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"showConnectedDurations"]; + if(tmp != nil) { + showConnectedDurations = [[NSUserDefaults standardUserDefaults] boolForKey:@"showConnectedDurations"]; + } + + if ( (showDurationsTimer == nil) && (showAllDurations || showConnectedDurations) ) { + showDurationsTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 + target:self + selector:@selector(updateTabLabels) + userInfo:nil + repeats:YES] retain]; + } + + // Localize Buttons + [clearButton setTitle:local([clearButton title])]; + [editButton setTitle:local([editButton title])]; + [connectButton setTitle:local([connectButton title])]; + [disconnectButton setTitle:local([disconnectButton title])]; + [useNameserverCheckbox setTitle:local([useNameserverCheckbox title])]; + [autoLaunchCheckbox setTitle:local([autoLaunchCheckbox title])]; + + [logWindow makeKeyAndOrderFront: self]; + [NSApp activateIgnoringOtherApps:YES]; +} + +// Invoked when the Details... window (logWindow) will close +- (void)windowWillClose:(NSNotification *)n +{ + if ( [n object] == logWindow ) { + // Stop and release the timer used to update the duration displays + if (showDurationsTimer != nil) { + [showDurationsTimer invalidate]; + [showDurationsTimer release]; + showDurationsTimer = nil; + } + + // Save the window's size and position in the preferences and save the TB version that saved them, BUT ONLY IF anything has changed + NSString * frame = [logWindow stringWithSavedFrame]; + NSString * tbVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; + BOOL saveIt = TRUE; + id tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrame"]; + if(tmp != nil) { + tmp = [[NSUserDefaults standardUserDefaults] objectForKey:@"detailsWindowFrameVersion"]; + if (tmp != nil) { + if ( [tbVersion isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrameVersion"]] ) { + if ( [frame isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey:@"detailsWindowFrame"]] ) { + saveIt = FALSE; + } + } + } + } + + if (saveIt) { + [[NSUserDefaults standardUserDefaults] setObject: frame forKey: @"detailsWindowFrame"]; + [[NSUserDefaults standardUserDefaults] setObject: [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] + forKey: @"detailsWindowFrameVersion"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + } +} + +- (void) dealloc +{ + [lastState release]; + [theItem release]; + [myConfigArray release]; + +#warning todo: release non-IB ivars here! + [statusMenuItem release]; + [myVPNMenu release]; + [userDefaults release]; + [appDefaults release]; + [theItem release]; + + [mainImage release]; + [connectedImage release]; + [errorImage release]; + [transitionalImage release]; + [connectionArray release]; + + + [super dealloc]; +} + + +-(void)killAllConnections +{ + id connection; + NSEnumerator* e = [connectionArray objectEnumerator]; + + while (connection = [e nextObject]) { + [connection disconnect:self]; + if(NSDebugEnabled) NSLog(@"Killing connection.\n"); + } +} + +-(void)killAllOpenVPN +{ + NSString* path = [[NSBundle mainBundle] pathForResource: @"openvpnstart" + ofType: nil]; + NSTask* task = [[[NSTask alloc] init] autorelease]; + [task setLaunchPath: path]; + + NSArray *arguments = [NSArray arrayWithObjects:@"killall", nil]; + [task setArguments:arguments]; + [task launch]; + [task waitUntilExit]; +} + +-(void)resetActiveConnections { + VPNConnection *connection; + NSEnumerator* e = [connectionArray objectEnumerator]; + + while (connection = [e nextObject]) { + if (NSDebugEnabled) NSLog(@"Connection %@ is connected for %f seconds\n",[connection configName],[[connection connectedSinceDate] timeIntervalSinceNow]); + if ([[connection connectedSinceDate] timeIntervalSinceNow] < -5) { + if (NSDebugEnabled) NSLog(@"Resetting connection: %@\n",[connection configName]); + [connection disconnect:self]; + [connection connect:self]; + } + else { + if (NSDebugEnabled) NSLog(@"Not Resetting connection: %@\n, waiting...",[connection configName]); + } + } +} + +-(void)createDefaultConfig +{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn"]; + NSString *confResource = [[NSBundle mainBundle] pathForResource: @"openvpn" + ofType: @"conf"]; + + if([[self getConfigs] count] == 0) { // if there are no config files, create a default one + [NSApp activateIgnoringOtherApps:YES]; + 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) { + exit (1); + } + else { + [fileManager createDirectoryAtPath:directoryPath attributes:nil]; + [fileManager copyPath:confResource toPath:[directoryPath stringByAppendingPathComponent:@"/openvpn.conf"] handler:nil]; + [self editConfig:self]; + } + + + } +} + +-(IBAction)editConfig:(id)sender +{ + VPNConnection *connection = [self selectedConnection]; + NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/openvpn"]; + NSString *configPath = [connection configPath]; + if(configPath == nil) configPath = @"/openvpn.conf"; + + // NSString *helper = @"/usr/sbin/chown"; + // NSString *userString = [NSString stringWithFormat:@"%d",getuid()]; + // NSArray *arguments = [NSArray arrayWithObjects:userString,configPath,nil]; + // AuthorizationRef authRef = [NSApplication getAuthorizationRef]; + // [NSApplication executeAuthorized:helper withArguments:arguments withAuthorizationRef:authRef]; + // AuthorizationFree(authRef,kAuthorizationFlagDefaults); + + [[NSWorkspace sharedWorkspace] openFile:[directoryPath stringByAppendingPathComponent:configPath] withApplication:@"TextEdit"]; +} + + +- (void) networkConfigurationDidChange +{ + if (NSDebugEnabled) NSLog(@"Got networkConfigurationDidChange notification!!"); + [self resetActiveConnections]; +} + +- (void) applicationWillTerminate: (NSNotification*) notification +{ + if (NSDebugEnabled) NSLog(@"App will terminate...\n"); + [self cleanup]; +} + +-(void)cleanup +{ + [NSApp callDelegateOnNetworkChange: NO]; + [self killAllConnections]; + [self killAllOpenVPN]; + [[NSStatusBar systemStatusBar] removeStatusItem:theItem]; +} + +-(void)saveUseNameserverCheckboxState:(BOOL)inBool +{ + VPNConnection* connection = [self selectedConnection]; + if(connection != nil) { + NSString* key = [[connection configName] stringByAppendingString: @"useDNS"]; + [[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: inBool] forKey: key]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + +} +-(void)saveAutoLaunchCheckboxState:(BOOL)inBool +{ + VPNConnection* connection = [self selectedConnection]; + if(connection != nil) { + NSString* autoConnectKey = [[connection configName] stringByAppendingString: @"autoConnect"]; + [[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: inBool] forKey: autoConnectKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + +} + +-(BOOL)getCurrentAutoLaunchSetting +{ + VPNConnection *connection = [self selectedConnection]; + NSString *autoConnectKey = [[connection configName] stringByAppendingString:@"autoConnect"]; + return [[NSUserDefaults standardUserDefaults] boolForKey:autoConnectKey]; +} + +- (void) setState: (NSString*) newState + // Be sure to call this in main thread only +{ + [newState retain]; + [lastState release]; + lastState = newState; + //[self updateUI]; + [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO]; +} + +-(void)addConnection:(id)sender +{ + if(sender != nil) { + [connectionArray removeObject:sender]; + [connectionArray addObject:sender]; + } +} + +-(void)removeConnection:(id)sender +{ + if(sender != nil) [connectionArray removeObject:sender]; +} + +static void signal_handler(int signalNumber) +{ + printf("signal %d caught!\n",signalNumber); + + if (signalNumber == SIGHUP) { + printf("SIGHUP received. Restarting active connections...\n"); + [[NSApp delegate] resetActiveConnections]; + } else { + printf("Received fatal signal. Cleaning up...\n"); + [[NSApp delegate] cleanup]; + exit(0); + } +} + + +- (void) installSignalHandler +{ + struct sigaction action; + + action.sa_handler = signal_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + + if (sigaction(SIGHUP, &action, NULL) || + sigaction(SIGQUIT, &action, NULL) || + sigaction(SIGTERM, &action, NULL) || + sigaction(SIGBUS, &action, NULL) || + sigaction(SIGSEGV, &action, NULL) || + sigaction(SIGPIPE, &action, NULL)) { + NSLog(@"Warning: setting signal handler failed: %s", strerror(errno)); + } +} +- (void) applicationDidFinishLaunching: (NSNotification *)notification +{ + [NSApp callDelegateOnNetworkChange: NO]; + [self installSignalHandler]; + [NSApp setAutoLaunchOnLogin: YES]; + [self activateStatusMenu]; + if(needsRepair()){ + if ([self repairPermissions] != TRUE) { + [NSApp terminate:self]; + } + } + + [updater checkForUpdatesInBackground]; +} + +-(void) dmgCheck +{ + NSString *path = [[NSBundle mainBundle] bundlePath]; + if([path hasPrefix:@"/Volumes/Tunnelblick"]) { + 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); + [panel setLevel:NSStatusWindowLevel]; + [panel makeKeyAndOrderFront:nil]; + [NSApp runModalForWindow:panel]; + exit(2); + } +} + +-(void)moveAllWindowsToForeground +{ + NSArray *windows = [NSApp windows]; + NSEnumerator *e = [windows objectEnumerator]; + NSWindow *window = nil; + while(window = [e nextObject]) { + [window setLevel:NSStatusWindowLevel]; + } +} + +-(void) fileSystemHasChanged: (NSNotification*) n +{ + if(NSDebugEnabled) NSLog(@"FileSystem has changed."); + [self performSelectorOnMainThread: @selector(activateStatusMenu) withObject: nil waitUntilDone: YES]; +} +-(void) kqueue: (UKKQueue*) kq receivedNotification: (NSString*) nm forFile: (NSString*) fpath { + + [self fileSystemHasChanged: nil]; +} + +-(BOOL)repairPermissions +{ + NSBundle *thisBundle = [NSBundle mainBundle]; + NSString *installer = [thisBundle pathForResource:@"installer" ofType:nil]; + + AuthorizationRef authRef= [NSApplication getAuthorizationRef]; + + if(authRef == nil) + return FALSE; + + while(needsRepair()) { + NSLog(@"Repairing Application...\n"); + [NSApplication executeAuthorized:installer withArguments:nil withAuthorizationRef:authRef]; + sleep(1); + } + AuthorizationFree(authRef, kAuthorizationFlagDefaults); + return TRUE; +} + + + + +BOOL needsRepair() +{ + NSBundle *thisBundle = [NSBundle mainBundle]; + NSString *helperPath = [thisBundle pathForResource:@"openvpnstart" ofType:nil]; + NSString *tunPath = [thisBundle pathForResource:@"tun.kext" ofType:nil]; + NSString *tapPath = [thisBundle pathForResource:@"tap.kext" ofType:nil]; + + NSString *tunExecutable = [tunPath stringByAppendingPathComponent:@"/Contents/MacOS/tun"]; + NSString *tapExecutable = [tapPath stringByAppendingPathComponent:@"/Contents/MacOS/tap"]; + NSString *openvpnPath = [thisBundle pathForResource:@"openvpn" ofType:nil]; + + + // check setuid helper + const char *path = [helperPath UTF8String]; + struct stat sb; + if(stat(path,&sb)) runUnrecoverableErrorPanel(); + + if (!( (sb.st_mode & S_ISUID) // set uid bit is set + && (sb.st_mode & S_IXUSR) // owner may execute it + && (sb.st_uid == 0) // is owned by root + )) { + NSLog(@"openvpnstart helper has missing set uid bit"); + return YES; + } + + // check files which should be only accessible by root + NSArray *inaccessibleObjects = [NSArray arrayWithObjects:tunExecutable,tapExecutable,openvpnPath,nil]; + NSEnumerator *e = [inaccessibleObjects objectEnumerator]; + NSString *currentPath; + NSFileManager *fileManager = [NSFileManager defaultManager]; + while(currentPath = [e nextObject]) { + NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:currentPath traverseLink:YES]; + unsigned long perms = [fileAttributes filePosixPermissions]; + NSString *octalString = [NSString stringWithFormat:@"%o",perms]; + NSNumber *fileOwner = [fileAttributes fileOwnerAccountID]; + + if ( (![octalString isEqualToString:@"744"]) || (![fileOwner isEqualToNumber:[NSNumber numberWithInt:0]])) { + NSLog(@"File %@ has permissions: %@, is owned by %@ and needs repair...\n",currentPath,octalString,fileOwner); + return YES; + } + } + + // check tun and tap driver packages + NSArray *filesToCheck = [NSArray arrayWithObjects:tunPath,tapPath,nil]; + NSEnumerator *enumerator = [filesToCheck objectEnumerator]; + NSString *file; + while(file = [enumerator nextObject]) { + NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:file traverseLink:YES]; + unsigned long perms = [fileAttributes filePosixPermissions]; + NSString *octalString = [NSString stringWithFormat:@"%o",perms]; + if ( (![octalString isEqualToString:@"755"]) ) { + NSLog(@"File %@ has permissions: %@ and needs repair...\n",currentPath,octalString); + return YES; + } + } + return NO; +} + +-(void)willGoToSleep +{ + if(NSDebugEnabled) NSLog(@"Computer will go to sleep...\n"); + connectionsToRestore = [connectionArray mutableCopy]; + [self killAllConnections]; +} +-(void)wokeUpFromSleep +{ + if(NSDebugEnabled) NSLog(@"Computer just woke up from sleep...\n"); + + NSEnumerator *e = [connectionsToRestore objectEnumerator]; + VPNConnection *connection; + while(connection = [e nextObject]) { + if(NSDebugEnabled) NSLog(@"Restoring Connection %@",[connection configName]); + [connection connect:self]; + } +} +int runUnrecoverableErrorPanel(void) +{ + 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); + [panel setLevel:NSStatusWindowLevel]; + [panel makeKeyAndOrderFront:nil]; + if( [NSApp runModalForWindow:panel] != NSAlertDefaultReturn ) { + exit(2); + } else { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://tunnelblick.net/"]]; + exit(2); + } +} + +-(IBAction) autoLaunchPrefButtonWasClicked: (id) sender +{ + if([sender state]) { + [self saveAutoLaunchCheckboxState:TRUE]; + } else { + [self saveAutoLaunchCheckboxState:FALSE]; + } +} + +-(IBAction) nameserverPrefButtonWasClicked: (id) sender +{ + if([sender state]) { + [self saveUseNameserverCheckboxState:TRUE]; + } else { + [self saveUseNameserverCheckboxState:FALSE]; + } +} + + +@end diff -r e253b4383132 -r 1a5334dfb21d tunblick/Sparkle.xcodeproj/default.pbxuser --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/Sparkle.xcodeproj/default.pbxuser Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,245 @@ +// !$*UTF8*$! +{ + 0867D690FE84028FC02AAC07 /* Project object */ = { + activeArchitecture = i386; + activeBuildConfigurationName = Debug; + activeExecutable = FAEC981A0D94C8750008EDA9 /* Sparkle Test App */; + activeTarget = 61B5F90109C4CEE200B25A18 /* Sparkle Test App */; + codeSenseManager = FAEC98240D94C8760008EDA9 /* Code sense */; + executables = ( + FAEC981A0D94C8750008EDA9 /* Sparkle Test App */, + FAEC981B0D94C8750008EDA9 /* Relaunch Tool */, + ); + perUserDictionary = { + PBXPerProjectTemplateStateSaveDate = 227854453; + PBXWorkspaceStateSaveDate = 227854453; + }; + sourceControlManager = FAEC98230D94C8760008EDA9 /* Source Control */; + userBuildSettings = { + }; + }; + 61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = { + activeExec = 0; + executables = ( + FAEC981A0D94C8750008EDA9 /* Sparkle Test App */, + ); + }; + 8DC2EF4F0486A6940098B216 /* Sparkle */ = { + activeExec = 0; + }; + D1E42C2E0CE754AE00F50EB9 /* Relaunch Tool */ = { + activeExec = 0; + executables = ( + FAEC981B0D94C8750008EDA9 /* Relaunch Tool */, + ); + }; + FAEC981A0D94C8750008EDA9 /* Sparkle Test App */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 1; + configStateDict = { + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + { + active = YES; + name = MallocPreScribble; + value = 1; + }, + { + active = YES; + name = MallocScribble; + value = 1; + }, + { + active = YES; + name = MallocGuardEdges; + value = 1; + }, + { + active = YES; + name = MallocCheckHeapStart; + value = 1; + }, + { + active = YES; + name = MallocCheckHeapEach; + value = 100000; + }, + { + active = YES; + name = MallocStackLogging; + value = 1; + }, + { + active = NO; + name = MallocStackLoggingNoCompact; + value = 1; + }, + { + active = YES; + name = NSDebugEnabled; + value = YES; + }, + { + active = YES; + name = NSZombieEnabled; + value = YES; + }, + { + active = NO; + name = NSDeallocateZombies; + value = NO; + }, + { + active = YES; + name = NSAutoreleaseFreedObjectCheckEnabled; + value = YES; + }, + { + active = NO; + name = MALLOC_PROTECT_BEFORE; + value = 1; + }, + { + active = YES; + name = MALLOC_ALTIVEC_SIZE; + value = 1; + }, + { + active = YES; + name = MALLOC_FILL_SPACE; + value = 1; + }, + { + active = NO; + name = CFZombieLevel; + value = 65553; + }, + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = "Sparkle Test App"; + sourceDirectories = ( + ); + }; + FAEC981B0D94C8750008EDA9 /* Relaunch Tool */ = { + isa = PBXExecutable; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + breakpointsEnabled = 1; + configStateDict = { + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + { + active = YES; + name = MallocPreScribble; + value = 1; + }, + { + active = YES; + name = MallocScribble; + value = 1; + }, + { + active = YES; + name = MallocGuardEdges; + value = 1; + }, + { + active = YES; + name = MallocCheckHeapStart; + value = 1; + }, + { + active = YES; + name = MallocCheckHeapEach; + value = 100000; + }, + { + active = YES; + name = MallocStackLogging; + value = 1; + }, + { + active = NO; + name = MallocStackLoggingNoCompact; + value = 1; + }, + { + active = YES; + name = NSDebugEnabled; + value = YES; + }, + { + active = YES; + name = NSZombieEnabled; + value = YES; + }, + { + active = NO; + name = NSDeallocateZombies; + value = NO; + }, + { + active = YES; + name = NSAutoreleaseFreedObjectCheckEnabled; + value = YES; + }, + { + active = NO; + name = MALLOC_PROTECT_BEFORE; + value = 1; + }, + { + active = YES; + name = MALLOC_ALTIVEC_SIZE; + value = 1; + }, + { + active = YES; + name = MALLOC_FILL_SPACE; + value = 1; + }, + { + active = NO; + name = CFZombieLevel; + value = 65553; + }, + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = "Relaunch Tool"; + sourceDirectories = ( + ); + }; + FAEC98230D94C8760008EDA9 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + }; + FAEC98240D94C8760008EDA9 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; +} diff -r e253b4383132 -r 1a5334dfb21d tunblick/Sparkle.xcodeproj/project.pbxproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/Sparkle.xcodeproj/project.pbxproj Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,1203 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + +/* Begin PBXBuildFile section */ + 610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134710DD250470049ACDF /* SUUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 610134720DD250470049ACDF /* SUUpdateDriver.m */; }; + 6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */; }; + 6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; + 6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; + 6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */; }; + 6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */; settings = {ATTRIBUTES = (); }; }; + 6102FE5C0E08C7EC00F85D09 /* SUUnarchiver_Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */; }; + 610D5A1A0A1661B8004AAD9C /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; + 610D5A750A1670A4004AAD9C /* SUStatus.nib in Resources */ = {isa = PBXBuildFile; fileRef = 610D5A740A1670A4004AAD9C /* SUStatus.nib */; }; + 610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */; }; + 61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6117796E0D1112E000749C97 /* IOKit.framework */; }; + 61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 61180BC80D64138900B4E0D1 /* SUWindowController.h */; settings = {ATTRIBUTES = (); }; }; + 61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61180BC90D64138900B4E0D1 /* SUWindowController.m */; }; + 6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */; settings = {ATTRIBUTES = (); }; }; + 6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */; }; + 61227A160DB548B800AB99EA /* SUVersionComparisonTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */; }; + 61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */; settings = {ATTRIBUTES = (); }; }; + 61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */; }; + 61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */ = {isa = PBXBuildFile; fileRef = 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */; settings = {ATTRIBUTES = (); }; }; + 61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A5B09CA6D4500B7442F /* SUConstants.h */; settings = {ATTRIBUTES = (); }; }; + 61299A6009CA6EB100B7442F /* SUConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A5F09CA6EB100B7442F /* SUConstants.m */; }; + 61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299A8B09CA790200B7442F /* SUUnarchiver.h */; settings = {ATTRIBUTES = (); }; }; + 61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61299A8C09CA790200B7442F /* SUUnarchiver.m */; }; + 61299B3609CB04E000B7442F /* Sparkle.h in Headers */ = {isa = PBXBuildFile; fileRef = 61299B3509CB04E000B7442F /* Sparkle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */ = {isa = PBXBuildFile; fileRef = 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */; settings = {ATTRIBUTES = (); }; }; + 612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */ = {isa = PBXBuildFile; fileRef = 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */; }; + 61407C390A4099050009F71F /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; + 615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */; }; + 6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */; settings = {ATTRIBUTES = (); }; }; + 61699BCC0DDB92BD005878A4 /* SUVersionComparisonTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */; settings = {ATTRIBUTES = (); }; }; + 618E9CFD0E7328F1004646D8 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */; }; + 618FA5010DAE88B40026945C /* SUInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA4FF0DAE88B40026945C /* SUInstaller.h */; settings = {ATTRIBUTES = (); }; }; + 618FA5020DAE88B40026945C /* SUInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5000DAE88B40026945C /* SUInstaller.m */; }; + 618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */; settings = {ATTRIBUTES = (); }; }; + 618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */; }; + 618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */ = {isa = PBXBuildFile; fileRef = 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */; settings = {ATTRIBUTES = (); }; }; + 618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */ = {isa = PBXBuildFile; fileRef = 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */; }; + 6196CFF909C72148000DC222 /* SUStatusController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6196CFE309C71ADE000DC222 /* SUStatusController.h */; settings = {ATTRIBUTES = (); }; }; + 6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6196CFE409C71ADE000DC222 /* SUStatusController.m */; }; + 61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */; settings = {ATTRIBUTES = (); }; }; + 61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */; }; + 61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */; settings = {ATTRIBUTES = (); }; }; + 61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */; }; + 61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */; }; + 61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8220A321A7F00D8810D /* Sparkle.strings */; }; + 61AAE8290A321A8000D8810D /* SUAutomaticUpdateAlert.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */; }; + 61AAE82A0A321A8000D8810D /* SUUpdateAlert.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */; }; + 61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */; }; + 61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */; }; + 61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5F8F609C4CEB300B25A18 /* Security.framework */; }; + 61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; }; + 61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */; }; + 61B5F92F09C4CFD800B25A18 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */; }; + 61B5F93009C4CFDC00B25A18 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5F92409C4CFC900B25A18 /* main.m */; }; + 61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FB9509C4F04600B25A18 /* SUAppcast.m */; }; + 61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FB9409C4F04600B25A18 /* SUAppcast.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */; }; + 61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */; }; + 61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */; }; + 61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */; settings = {ATTRIBUTES = (); }; }; + 61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */; }; + 61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */; }; + 61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */; }; + 61BBDF820A49220C00378739 /* Sparkle.icns in Resources */ = {isa = PBXBuildFile; fileRef = 61BBDF810A49220C00378739 /* Sparkle.icns */; }; + 61C2680A0E2DB5D000175E6C /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 61C268090E2DB5D000175E6C /* License.txt */; }; + 61C46F340D9C54F300B06326 /* SUUpdatePermissionPrompt.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */; }; + 61CFB3290E385186007A1735 /* Sparkle.pch in Headers */ = {isa = PBXBuildFile; fileRef = 61CFB3280E385186007A1735 /* Sparkle.pch */; }; + 61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */; }; + 61EF67560E25B58D00F754E0 /* SUHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EF67550E25B58D00F754E0 /* SUHost.m */; }; + 61EF67590E25C5B400F754E0 /* SUHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 61EF67580E25C5B400F754E0 /* SUHost.h */; }; + 61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */; }; + 61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */; settings = {ATTRIBUTES = (); }; }; + 61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; settings = {ATTRIBUTES = (Required, ); }; }; + DAAEFC9B0DA5722F0051E0D0 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; + DAAEFD4E0DA572330051E0D0 /* relaunch.m in Sources */ = {isa = PBXBuildFile; fileRef = 613242130CD06CEF00106AA4 /* relaunch.m */; }; + DAAEFD510DA572550051E0D0 /* relaunch in Resources */ = {isa = PBXBuildFile; fileRef = DAAEFC960DA571DF0051E0D0 /* relaunch */; }; + FAEFA2F70D94AA7500472538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + FAEFA2F80D94AA7900472538 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; + FAEFA3040D94AB3400472538 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; + FAEFA3050D94AB3400472538 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 61227AB90DB5C4BB00AB99EA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 612279D80DB5470200AB99EA; + remoteInfo = "Sparkle Unit Tests"; + }; + 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = Sparkle; + }; + 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = Sparkle; + }; + DAAEFD4F0DA572460051E0D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DAAEFC950DA571DF0051E0D0; + remoteInfo = relaunch; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 61B5FB4D09C4E9FA00B25A18 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 61407C390A4099050009F71F /* Sparkle.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 610134710DD250470049ACDF /* SUUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateDriver.h; sourceTree = ""; }; + 610134720DD250470049ACDF /* SUUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateDriver.m; sourceTree = ""; }; + 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUProbingUpdateDriver.h; sourceTree = ""; }; + 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUProbingUpdateDriver.m; sourceTree = ""; }; + 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPipedUnarchiver.h; sourceTree = ""; }; + 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDiskImageUnarchiver.h; sourceTree = ""; }; + 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDiskImageUnarchiver.m; sourceTree = ""; }; + 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver_Private.h; sourceTree = ""; }; + 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver_Private.m; sourceTree = ""; }; + 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkReleaseGCSupport.xcconfig; sourceTree = ""; }; + 610D5A740A1670A4004AAD9C /* SUStatus.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = SUStatus.nib; sourceTree = ""; }; + 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NTSynchronousTask.m; sourceTree = ""; }; + 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NTSynchronousTask.h; sourceTree = ""; }; + 6117796E0D1112E000749C97 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; + 61180BC80D64138900B4E0D1 /* SUWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUWindowController.h; sourceTree = ""; }; + 61180BC90D64138900B4E0D1 /* SUWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUWindowController.m; sourceTree = ""; }; + 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateAlert.h; sourceTree = ""; }; + 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateAlert.m; sourceTree = ""; }; + 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Sparkle Unit Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonTest.h; path = Tests/SUVersionComparisonTest.h; sourceTree = ""; }; + 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SUVersionComparisonTest.m; path = Tests/SUVersionComparisonTest.m; sourceTree = ""; }; + 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstallerInternals.h; sourceTree = ""; }; + 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUDSAVerifier.h; sourceTree = ""; }; + 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUDSAVerifier.m; sourceTree = ""; }; + 61299A5B09CA6D4500B7442F /* SUConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUConstants.h; sourceTree = ""; }; + 61299A5F09CA6EB100B7442F /* SUConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUConstants.m; sourceTree = ""; }; + 61299A8B09CA790200B7442F /* SUUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUnarchiver.h; sourceTree = ""; }; + 61299A8C09CA790200B7442F /* SUUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUnarchiver.m; sourceTree = ""; }; + 61299B3509CB04E000B7442F /* Sparkle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.h; sourceTree = ""; }; + 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPipedUnarchiver.m; sourceTree = ""; }; + 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdatePermissionPrompt.h; sourceTree = ""; }; + 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdatePermissionPrompt.m; sourceTree = ""; }; + 613242130CD06CEF00106AA4 /* relaunch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = relaunch.m; sourceTree = ""; }; + 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SUModelTranslation.plist; sourceTree = ""; }; + 618915700E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 618915710E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 618915720E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = sv; path = sv.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 618915730E35937600B5E981 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Sparkle.strings; sourceTree = ""; }; + 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = dsa_pub.pem; path = "Test Application/dsa_pub.pem"; sourceTree = ""; }; + 618FA4FF0DAE88B40026945C /* SUInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUInstaller.h; sourceTree = ""; }; + 618FA5000DAE88B40026945C /* SUInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUInstaller.m; sourceTree = ""; }; + 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPlainInstaller.h; sourceTree = ""; }; + 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstaller.m; sourceTree = ""; }; + 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUPackageInstaller.h; sourceTree = ""; }; + 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUPackageInstaller.m; sourceTree = ""; }; + 6195D48F0E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 6195D4900E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 6195D4910E404AD600D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = ru; path = ru.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 6195D4920E404AD700D41A50 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Sparkle.strings; sourceTree = ""; }; + 6196CFE309C71ADE000DC222 /* SUStatusController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStatusController.h; sourceTree = ""; }; + 6196CFE409C71ADE000DC222 /* SUStatusController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStatusController.m; sourceTree = ""; }; + 619B17200E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Sparkle.strings; sourceTree = ""; }; + 619B17210E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 619B17220E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 619B17230E1E9D0800E72754 /* de */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = de; path = de.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUVersionComparisonProtocol.h; sourceTree = ""; }; + 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUStandardVersionComparator.h; sourceTree = ""; }; + 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUStandardVersionComparator.m; sourceTree = ""; }; + 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUSystemProfiler.h; sourceTree = ""; }; + 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUSystemProfiler.m; sourceTree = ""; }; + 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUserInitiatedUpdateDriver.h; sourceTree = ""; }; + 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUserInitiatedUpdateDriver.m; sourceTree = ""; }; + 61AAE8230A321A7F00D8810D /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Sparkle.strings; sourceTree = ""; }; + 61AAE8250A321A7F00D8810D /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 61AAE8270A321A7F00D8810D /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 61AAE84F0A321AF700D8810D /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Sparkle.strings; sourceTree = ""; }; + 61AAE8590A321B0400D8810D /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Sparkle.strings; sourceTree = ""; }; + 61AAE8710A321F7700D8810D /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Sparkle.strings; sourceTree = ""; }; + 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SUUpdater.h; sourceTree = ""; }; + 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUUpdater.m; sourceTree = ""; }; + 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUPlainInstallerInternals.m; sourceTree = ""; }; + 61B5F8F609C4CEB300B25A18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; + 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sparkle Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Test Application-Info.plist"; path = "Test Application/Test Application-Info.plist"; sourceTree = ""; }; + 61B5F92409C4CFC900B25A18 /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Test Application/main.m"; sourceTree = ""; }; + 61B5F92B09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = "Test Application/English.lproj/InfoPlist.strings"; sourceTree = ""; }; + 61B5F92D09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = "Test Application/English.lproj/MainMenu.nib"; sourceTree = ""; }; + 61B5FB9409C4F04600B25A18 /* SUAppcast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcast.h; sourceTree = ""; }; + 61B5FB9509C4F04600B25A18 /* SUAppcast.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcast.m; sourceTree = ""; }; + 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = ""; }; + 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAppcastItem.h; sourceTree = ""; }; + 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAppcastItem.m; sourceTree = ""; }; + 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUpdateAlert.h; sourceTree = ""; }; + 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUpdateAlert.m; sourceTree = ""; }; + 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUUIBasedUpdateDriver.h; sourceTree = ""; }; + 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUUIBasedUpdateDriver.m; sourceTree = ""; }; + 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUAutomaticUpdateDriver.h; sourceTree = ""; }; + 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUAutomaticUpdateDriver.m; sourceTree = ""; }; + 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUScheduledUpdateDriver.h; sourceTree = ""; }; + 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUScheduledUpdateDriver.m; sourceTree = ""; }; + 61BBDF810A49220C00378739 /* Sparkle.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Sparkle.icns; sourceTree = ""; }; + 61C268090E2DB5D000175E6C /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.txt; sourceTree = ""; }; + 61C46F350D9C54F300B06326 /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = en; path = en.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 61CFB3280E385186007A1735 /* Sparkle.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sparkle.pch; sourceTree = ""; }; + 61EF67550E25B58D00F754E0 /* SUHost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUHost.m; sourceTree = ""; }; + 61EF67580E25C5B400F754E0 /* SUHost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUHost.h; sourceTree = ""; }; + 61F3651A0E18987B007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 61F3652A0E189883007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 61F3652B0E189883007ECA02 /* es */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = es; path = es.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 61F3652E0E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 61F3652F0E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 61F365300E18988F007ECA02 /* fr */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = fr; path = fr.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 61F365330E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 61F365340E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 61F365350E1898A3007ECA02 /* nl */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = nl; path = nl.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 61F614540E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Sparkle.strings; sourceTree = ""; }; + 61F614550E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUAutomaticUpdateAlert.nib; sourceTree = ""; }; + 61F614560E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUUpdateAlert.nib; sourceTree = ""; }; + 61F614570E24A12D009F47E7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = it.lproj/SUUpdatePermissionPrompt.nib; sourceTree = ""; }; + 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SUBasicUpdateDriver.h; sourceTree = ""; }; + 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SUBasicUpdateDriver.m; sourceTree = ""; }; + 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8DC2EF5B0486A6940098B216 /* Sparkle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sparkle.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DAAEFC960DA571DF0051E0D0 /* relaunch */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = relaunch; sourceTree = BUILT_PRODUCTS_DIR; }; + FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkDebug.xcconfig; sourceTree = ""; }; + FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppDebug.xcconfig; sourceTree = ""; }; + FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonRelease.xcconfig; sourceTree = ""; }; + FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestApp.xcconfig; sourceTree = ""; }; + FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunch.xcconfig; sourceTree = ""; }; + FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommonDebug.xcconfig; sourceTree = ""; }; + FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigCommon.xcconfig; sourceTree = ""; }; + FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFramework.xcconfig; sourceTree = ""; }; + FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigTestAppRelease.xcconfig; sourceTree = ""; }; + FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchDebug.xcconfig; sourceTree = ""; }; + FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigRelaunchRelease.xcconfig; sourceTree = ""; }; + FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ConfigFrameworkRelease.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 612279D60DB5470200AB99EA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61FA52880E2D9EA400EF58AD /* Sparkle.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61B5F90009C4CEE200B25A18 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61B5F90F09C4CF3A00B25A18 /* Sparkle.framework in Frameworks */, + 610D5A1A0A1661B8004AAD9C /* Sparkle.framework in Frameworks */, + FAEFA3040D94AB3400472538 /* AppKit.framework in Frameworks */, + FAEFA3050D94AB3400472538 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF560486A6940098B216 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61B5F8F709C4CEB300B25A18 /* Security.framework in Frameworks */, + 61B5FC4C09C4FD5E00B25A18 /* WebKit.framework in Frameworks */, + 61177A1F0D1112E900749C97 /* IOKit.framework in Frameworks */, + FAEFA2F70D94AA7500472538 /* Foundation.framework in Frameworks */, + FAEFA2F80D94AA7900472538 /* AppKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DAAEFC940DA571DF0051E0D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DAAEFC9B0DA5722F0051E0D0 /* AppKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8DC2EF5B0486A6940098B216 /* Sparkle.framework */, + 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */, + DAAEFC960DA571DF0051E0D0 /* relaunch */, + 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* Sparkle */ = { + isa = PBXGroup; + children = ( + 61F83F6E0DBFE07A006FDD30 /* Update Control */, + 61299B3909CB055000B7442F /* Appcast Support */, + 618FA6DB0DB485440026945C /* Installation */, + 6101354A0DD25B7F0049ACDF /* Unarchiving */, + 61299B3A09CB056100B7442F /* User Interface */, + 61B5F8F309C4CE5900B25A18 /* Other Sources */, + 089C1665FE841158C02AAC07 /* Framework Resources */, + 61227A100DB5484000AB99EA /* Tests */, + 61B5F91D09C4CF7F00B25A18 /* Test Application Sources */, + 0867D69AFE84028FC02AAC07 /* Apple Frameworks and Libraries */, + FA1941C40D94A6EA00DD942E /* Configurations */, + 034768DFFF38A50411DB9C8B /* Products */, + ); + name = Sparkle; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* Apple Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 6117796E0D1112E000749C97 /* IOKit.framework */, + 61B5FC3F09C4FD4000B25A18 /* WebKit.framework */, + 61B5F8F609C4CEB300B25A18 /* Security.framework */, + 0867D6A5FE840307C02AAC07 /* AppKit.framework */, + 0867D69BFE84028FC02AAC07 /* Foundation.framework */, + ); + name = "Apple Frameworks and Libraries"; + sourceTree = ""; + }; + 089C1665FE841158C02AAC07 /* Framework Resources */ = { + isa = PBXGroup; + children = ( + 8DC2EF5A0486A6940098B216 /* Info.plist */, + 615AE3CF0D64DC40001CA7BD /* SUModelTranslation.plist */, + 61C268090E2DB5D000175E6C /* License.txt */, + 61AAE8220A321A7F00D8810D /* Sparkle.strings */, + 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */, + 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */, + 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */, + 610D5A740A1670A4004AAD9C /* SUStatus.nib */, + ); + name = "Framework Resources"; + sourceTree = ""; + }; + 6101354A0DD25B7F0049ACDF /* Unarchiving */ = { + isa = PBXGroup; + children = ( + 61299A8B09CA790200B7442F /* SUUnarchiver.h */, + 61299A8C09CA790200B7442F /* SUUnarchiver.m */, + 6102FE590E08C7EC00F85D09 /* SUUnarchiver_Private.h */, + 6102FE5A0E08C7EC00F85D09 /* SUUnarchiver_Private.m */, + 6102FE440E077FCE00F85D09 /* SUPipedUnarchiver.h */, + 6129C0B90E0B79810062CE76 /* SUPipedUnarchiver.m */, + 6102FE480E07803800F85D09 /* SUDiskImageUnarchiver.h */, + 6102FE490E07803800F85D09 /* SUDiskImageUnarchiver.m */, + 610EC1C00CF3914D00AE239E /* NTSynchronousTask.h */, + 610EC1BF0CF3914D00AE239E /* NTSynchronousTask.m */, + ); + name = Unarchiving; + sourceTree = ""; + }; + 6101355D0DD25BB70049ACDF /* Support */ = { + isa = PBXGroup; + children = ( + 613242130CD06CEF00106AA4 /* relaunch.m */, + ); + name = Support; + sourceTree = ""; + }; + 61227A100DB5484000AB99EA /* Tests */ = { + isa = PBXGroup; + children = ( + 61227A140DB548B800AB99EA /* SUVersionComparisonTest.h */, + 61227A150DB548B800AB99EA /* SUVersionComparisonTest.m */, + 612279DA0DB5470200AB99EA /* Sparkle Unit Tests-Info.plist */, + ); + name = Tests; + sourceTree = ""; + }; + 61299B3909CB055000B7442F /* Appcast Support */ = { + isa = PBXGroup; + children = ( + 61B5FB9409C4F04600B25A18 /* SUAppcast.h */, + 61B5FB9509C4F04600B25A18 /* SUAppcast.m */, + 61B5FC5309C5182000B25A18 /* SUAppcastItem.h */, + 61B5FC5409C5182000B25A18 /* SUAppcastItem.m */, + 61A2279A0D1CEE7600430CCD /* SUSystemProfiler.h */, + 61A2279B0D1CEE7600430CCD /* SUSystemProfiler.m */, + 61A2259C0D1C495D00430CCD /* SUVersionComparisonProtocol.h */, + 61A225A20D1C4AC000430CCD /* SUStandardVersionComparator.h */, + 61A225A30D1C4AC000430CCD /* SUStandardVersionComparator.m */, + ); + name = "Appcast Support"; + sourceTree = ""; + }; + 61299B3A09CB056100B7442F /* User Interface */ = { + isa = PBXGroup; + children = ( + 61B5FCA009C5228F00B25A18 /* SUUpdateAlert.h */, + 61B5FCA109C5228F00B25A18 /* SUUpdateAlert.m */, + 6120721009CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h */, + 6120721109CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m */, + 6196CFE309C71ADE000DC222 /* SUStatusController.h */, + 6196CFE409C71ADE000DC222 /* SUStatusController.m */, + 612DCBAD0D488BC60015DBEA /* SUUpdatePermissionPrompt.h */, + 612DCBAE0D488BC60015DBEA /* SUUpdatePermissionPrompt.m */, + 61180BC80D64138900B4E0D1 /* SUWindowController.h */, + 61180BC90D64138900B4E0D1 /* SUWindowController.m */, + ); + name = "User Interface"; + sourceTree = ""; + }; + 618FA6DB0DB485440026945C /* Installation */ = { + isa = PBXGroup; + children = ( + 618FA4FF0DAE88B40026945C /* SUInstaller.h */, + 618FA5000DAE88B40026945C /* SUInstaller.m */, + 618FA5030DAE8AB80026945C /* SUPlainInstaller.h */, + 618FA5040DAE8AB80026945C /* SUPlainInstaller.m */, + 6129984309C9E2DA00B7442F /* SUPlainInstallerInternals.h */, + 61B5F8E509C4CE3C00B25A18 /* SUPlainInstallerInternals.m */, + 618FA5200DAE8E8A0026945C /* SUPackageInstaller.h */, + 618FA5210DAE8E8A0026945C /* SUPackageInstaller.m */, + 6101355D0DD25BB70049ACDF /* Support */, + ); + name = Installation; + sourceTree = ""; + }; + 61B5F8F309C4CE5900B25A18 /* Other Sources */ = { + isa = PBXGroup; + children = ( + 61EF67580E25C5B400F754E0 /* SUHost.h */, + 61EF67550E25B58D00F754E0 /* SUHost.m */, + 61299B3509CB04E000B7442F /* Sparkle.h */, + 61CFB3280E385186007A1735 /* Sparkle.pch */, + 61299A5B09CA6D4500B7442F /* SUConstants.h */, + 61299A5F09CA6EB100B7442F /* SUConstants.m */, + ); + includeInIndex = 1; + name = "Other Sources"; + sourceTree = ""; + }; + 61B5F91D09C4CF7F00B25A18 /* Test Application Sources */ = { + isa = PBXGroup; + children = ( + 61BBDF810A49220C00378739 /* Sparkle.icns */, + 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */, + 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */, + 61B5F92409C4CFC900B25A18 /* main.m */, + 61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */, + 618E9CFC0E7328F1004646D8 /* dsa_pub.pem */, + ); + name = "Test Application Sources"; + sourceTree = ""; + }; + 61CFB2C10E384958007A1735 /* Support */ = { + isa = PBXGroup; + children = ( + 61299A2D09CA2DAB00B7442F /* SUDSAVerifier.h */, + 61299A2E09CA2DAB00B7442F /* SUDSAVerifier.m */, + ); + name = Support; + sourceTree = ""; + }; + 61CFB2C20E38496B007A1735 /* Drivers */ = { + isa = PBXGroup; + children = ( + 610134710DD250470049ACDF /* SUUpdateDriver.h */, + 610134720DD250470049ACDF /* SUUpdateDriver.m */, + 61F83F6F0DBFE137006FDD30 /* SUBasicUpdateDriver.h */, + 61F83F700DBFE137006FDD30 /* SUBasicUpdateDriver.m */, + 61B93A390DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.h */, + 61B93A3A0DD02D6400DCD2F8 /* SUUIBasedUpdateDriver.m */, + 61B93B250DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h */, + 61B93B260DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m */, + 61B93C070DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h */, + 61B93C080DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m */, + 610134790DD2541A0049ACDF /* SUProbingUpdateDriver.h */, + 6101347A0DD2541A0049ACDF /* SUProbingUpdateDriver.m */, + 61A354530DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h */, + 61A354540DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m */, + ); + name = Drivers; + sourceTree = ""; + }; + 61F83F6E0DBFE07A006FDD30 /* Update Control */ = { + isa = PBXGroup; + children = ( + 61B5F8E309C4CE3C00B25A18 /* SUUpdater.h */, + 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */, + 61CFB2C20E38496B007A1735 /* Drivers */, + 61CFB2C10E384958007A1735 /* Support */, + ); + name = "Update Control"; + sourceTree = ""; + }; + FA1941C40D94A6EA00DD942E /* Configurations */ = { + isa = PBXGroup; + children = ( + FA1941D00D94A70100DD942E /* ConfigCommon.xcconfig */, + FA1941CF0D94A70100DD942E /* ConfigCommonDebug.xcconfig */, + FA1941CC0D94A70100DD942E /* ConfigCommonRelease.xcconfig */, + FA1941D10D94A70100DD942E /* ConfigFramework.xcconfig */, + FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */, + FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */, + 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */, + FA1941CD0D94A70100DD942E /* ConfigTestApp.xcconfig */, + FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */, + FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */, + FA1941CE0D94A70100DD942E /* ConfigRelaunch.xcconfig */, + FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */, + FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */, + ); + path = Configurations; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8DC2EF500486A6940098B216 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 61B5F8ED09C4CE3C00B25A18 /* SUUpdater.h in Headers */, + 61B5FC0D09C4FC8200B25A18 /* SUAppcast.h in Headers */, + 61B5FC7009C51F4A00B25A18 /* SUAppcastItem.h in Headers */, + 61B5FCDF09C52A9F00B25A18 /* SUUpdateAlert.h in Headers */, + 6196CFF909C72148000DC222 /* SUStatusController.h in Headers */, + 61299A2F09CA2DAB00B7442F /* SUDSAVerifier.h in Headers */, + 61299A4A09CA2DD000B7442F /* SUPlainInstallerInternals.h in Headers */, + 61299A5C09CA6D4500B7442F /* SUConstants.h in Headers */, + 61299A8D09CA790200B7442F /* SUUnarchiver.h in Headers */, + 61299B3609CB04E000B7442F /* Sparkle.h in Headers */, + 6120721209CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.h in Headers */, + 61A2259E0D1C495D00430CCD /* SUVersionComparisonProtocol.h in Headers */, + 61A225A40D1C4AC000430CCD /* SUStandardVersionComparator.h in Headers */, + 61A2279C0D1CEE7600430CCD /* SUSystemProfiler.h in Headers */, + 6160E7E10D3B4A8800E9CD71 /* NTSynchronousTask.h in Headers */, + 612DCBAF0D488BC60015DBEA /* SUUpdatePermissionPrompt.h in Headers */, + 61180BCA0D64138900B4E0D1 /* SUWindowController.h in Headers */, + 618FA5010DAE88B40026945C /* SUInstaller.h in Headers */, + 618FA5050DAE8AB80026945C /* SUPlainInstaller.h in Headers */, + 618FA5220DAE8E8A0026945C /* SUPackageInstaller.h in Headers */, + 61F83F740DBFE141006FDD30 /* SUBasicUpdateDriver.h in Headers */, + 61B93A3C0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.h in Headers */, + 61B93B270DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.h in Headers */, + 61B93C090DD112FF00DCD2F8 /* SUScheduledUpdateDriver.h in Headers */, + 610134730DD250470049ACDF /* SUUpdateDriver.h in Headers */, + 6101347B0DD2541A0049ACDF /* SUProbingUpdateDriver.h in Headers */, + 61699BCC0DDB92BD005878A4 /* SUVersionComparisonTest.h in Headers */, + 61A354550DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.h in Headers */, + 6102FE460E077FCE00F85D09 /* SUPipedUnarchiver.h in Headers */, + 6102FE4A0E07803800F85D09 /* SUDiskImageUnarchiver.h in Headers */, + 6102FE5B0E08C7EC00F85D09 /* SUUnarchiver_Private.h in Headers */, + 61EF67590E25C5B400F754E0 /* SUHost.h in Headers */, + 61CFB3290E385186007A1735 /* Sparkle.pch in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 612279D80DB5470200AB99EA /* Sparkle Unit Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */; + buildPhases = ( + 612279D40DB5470200AB99EA /* Resources */, + 612279D50DB5470200AB99EA /* Sources */, + 612279D60DB5470200AB99EA /* Frameworks */, + 612279D70DB5470200AB99EA /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */, + ); + name = "Sparkle Unit Tests"; + productName = "Sparkle Unit Tests"; + productReference = 612279D90DB5470200AB99EA /* Sparkle Unit Tests.octest */; + productType = "com.apple.product-type.bundle"; + }; + 61B5F90109C4CEE200B25A18 /* Sparkle Test App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */; + buildPhases = ( + 61B5F8FE09C4CEE200B25A18 /* Resources */, + 61B5F8FF09C4CEE200B25A18 /* Sources */, + 61B5F90009C4CEE200B25A18 /* Frameworks */, + 61B5FB4D09C4E9FA00B25A18 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */, + 61227ABA0DB5C4BB00AB99EA /* PBXTargetDependency */, + ); + name = "Sparkle Test App"; + productName = "Test Application"; + productReference = 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */; + productType = "com.apple.product-type.application"; + }; + 8DC2EF4F0486A6940098B216 /* Sparkle */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */; + buildPhases = ( + 8DC2EF500486A6940098B216 /* Headers */, + 8DC2EF520486A6940098B216 /* Resources */, + 8DC2EF540486A6940098B216 /* Sources */, + 8DC2EF560486A6940098B216 /* Frameworks */, + 6131B1910DDCDE32005215F0 /* Run Script: Set Bzr Version Info */, + 6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */, + ); + buildRules = ( + ); + dependencies = ( + DAAEFD500DA572460051E0D0 /* PBXTargetDependency */, + ); + name = Sparkle; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = Sparkle; + productReference = 8DC2EF5B0486A6940098B216 /* Sparkle.framework */; + productType = "com.apple.product-type.framework"; + }; + DAAEFC950DA571DF0051E0D0 /* relaunch tool */ = { + isa = PBXNativeTarget; + buildConfigurationList = DAAEFC9A0DA571FD0051E0D0 /* Build configuration list for PBXNativeTarget "relaunch tool" */; + buildPhases = ( + DAAEFC930DA571DF0051E0D0 /* Sources */, + DAAEFC940DA571DF0051E0D0 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "relaunch tool"; + productName = relaunch; + productReference = DAAEFC960DA571DF0051E0D0 /* relaunch */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */; + compatibilityVersion = "Xcode 3.0"; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + Italian, + zh_TW, + en, + ca, + cs, + cy, + da, + de, + es, + fi, + fr, + he, + hu, + id, + is, + it, + ja, + ko, + nl, + no, + pl, + ru, + sk, + sv, + th, + tr, + zh_CN, + fr_ca, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* Sparkle */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DC2EF4F0486A6940098B216 /* Sparkle */, + 61B5F90109C4CEE200B25A18 /* Sparkle Test App */, + DAAEFC950DA571DF0051E0D0 /* relaunch tool */, + 612279D80DB5470200AB99EA /* Sparkle Unit Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 612279D40DB5470200AB99EA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61B5F8FE09C4CEE200B25A18 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61B5F92E09C4CFD800B25A18 /* InfoPlist.strings in Resources */, + 61B5F92F09C4CFD800B25A18 /* MainMenu.nib in Resources */, + 61BBDF820A49220C00378739 /* Sparkle.icns in Resources */, + 618E9CFD0E7328F1004646D8 /* dsa_pub.pem in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF520486A6940098B216 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61C2680A0E2DB5D000175E6C /* License.txt in Resources */, + DAAEFD510DA572550051E0D0 /* relaunch in Resources */, + 610D5A750A1670A4004AAD9C /* SUStatus.nib in Resources */, + 61AAE8280A321A7F00D8810D /* Sparkle.strings in Resources */, + 61AAE8290A321A8000D8810D /* SUAutomaticUpdateAlert.nib in Resources */, + 61AAE82A0A321A8000D8810D /* SUUpdateAlert.nib in Resources */, + 615AE3D00D64DC40001CA7BD /* SUModelTranslation.plist in Resources */, + 61C46F340D9C54F300B06326 /* SUUpdatePermissionPrompt.nib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 612279D70DB5470200AB99EA /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + showEnvVarsInLog = 0; + }; + 6131B1910DDCDE32005215F0 /* Run Script: Set Bzr Version Info */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 12; + files = ( + ); + inputPaths = ( + ); + name = "Run Script: Set Bzr Version Info"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = "/usr/bin/env ruby"; + 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 ]+CFBundleVersion<\\/key>\\n[\\t ]+).*?(<\\/string>)/, '\\1' + version + '\\2')\nSTDERR.print info_contents\nf = File.open(info, \"w\")\nf.write(info_contents)\nf.close"; + showEnvVarsInLog = 0; + }; + 6195D4B40E40505A00D41A50 /* Run Script: Link fr_CA to fr */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script: Link fr_CA to fr"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = "/usr/bin/env ruby"; + shellScript = "resources = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"WRAPPER_NAME\"]}/Resources\"\n`ln -s \"#{resources}/fr.lproj\" \"#{resources}/fr_CA.lproj\"`"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 612279D50DB5470200AB99EA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61227A160DB548B800AB99EA /* SUVersionComparisonTest.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61B5F8FF09C4CEE200B25A18 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61B5F93009C4CFDC00B25A18 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8DC2EF540486A6940098B216 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61B5F8EE09C4CE3C00B25A18 /* SUUpdater.m in Sources */, + 61B5F8EF09C4CE3C00B25A18 /* SUPlainInstallerInternals.m in Sources */, + 61B5FBB709C4FAFF00B25A18 /* SUAppcast.m in Sources */, + 61B5FC6F09C51F4900B25A18 /* SUAppcastItem.m in Sources */, + 61B5FCDE09C52A9F00B25A18 /* SUUpdateAlert.m in Sources */, + 6196CFFA09C72149000DC222 /* SUStatusController.m in Sources */, + 61299A3009CA2DAB00B7442F /* SUDSAVerifier.m in Sources */, + 61299A6009CA6EB100B7442F /* SUConstants.m in Sources */, + 61299A8E09CA790200B7442F /* SUUnarchiver.m in Sources */, + 6120721309CC5C4B007FE0F6 /* SUAutomaticUpdateAlert.m in Sources */, + 610EC1E00CF3A5FE00AE239E /* NTSynchronousTask.m in Sources */, + 61A225A50D1C4AC000430CCD /* SUStandardVersionComparator.m in Sources */, + 61A2279D0D1CEE7600430CCD /* SUSystemProfiler.m in Sources */, + 612DCBB00D488BC60015DBEA /* SUUpdatePermissionPrompt.m in Sources */, + 61180BCB0D64138900B4E0D1 /* SUWindowController.m in Sources */, + 618FA5020DAE88B40026945C /* SUInstaller.m in Sources */, + 618FA5060DAE8AB80026945C /* SUPlainInstaller.m in Sources */, + 618FA5230DAE8E8A0026945C /* SUPackageInstaller.m in Sources */, + 61F83F720DBFE140006FDD30 /* SUBasicUpdateDriver.m in Sources */, + 61B93A3D0DD02D7000DCD2F8 /* SUUIBasedUpdateDriver.m in Sources */, + 61B93B280DD0FDD300DCD2F8 /* SUAutomaticUpdateDriver.m in Sources */, + 61B93C0A0DD112FF00DCD2F8 /* SUScheduledUpdateDriver.m in Sources */, + 610134740DD250470049ACDF /* SUUpdateDriver.m in Sources */, + 6101347C0DD2541A0049ACDF /* SUProbingUpdateDriver.m in Sources */, + 61A354560DF113C70076ECB1 /* SUUserInitiatedUpdateDriver.m in Sources */, + 6102FE4B0E07803800F85D09 /* SUDiskImageUnarchiver.m in Sources */, + 6102FE5C0E08C7EC00F85D09 /* SUUnarchiver_Private.m in Sources */, + 61D85D6D0E10B2ED00F9B4A9 /* SUPipedUnarchiver.m in Sources */, + 61EF67560E25B58D00F754E0 /* SUHost.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DAAEFC930DA571DF0051E0D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DAAEFD4E0DA572330051E0D0 /* relaunch.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 61227ABA0DB5C4BB00AB99EA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 612279D80DB5470200AB99EA /* Sparkle Unit Tests */; + targetProxy = 61227AB90DB5C4BB00AB99EA /* PBXContainerItemProxy */; + }; + 61B5F91C09C4CF7200B25A18 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8DC2EF4F0486A6940098B216 /* Sparkle */; + targetProxy = 61B5F91B09C4CF7200B25A18 /* PBXContainerItemProxy */; + }; + 61FA528D0E2D9EB200EF58AD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8DC2EF4F0486A6940098B216 /* Sparkle */; + targetProxy = 61FA528C0E2D9EB200EF58AD /* PBXContainerItemProxy */; + }; + DAAEFD500DA572460051E0D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DAAEFC950DA571DF0051E0D0 /* relaunch tool */; + targetProxy = DAAEFD4F0DA572460051E0D0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 61AAE8220A321A7F00D8810D /* Sparkle.strings */ = { + isa = PBXVariantGroup; + children = ( + 61AAE8230A321A7F00D8810D /* en */, + 61AAE84F0A321AF700D8810D /* es */, + 61AAE8590A321B0400D8810D /* fr */, + 61AAE8710A321F7700D8810D /* nl */, + 619B17200E1E9D0800E72754 /* de */, + 61F614540E24A12D009F47E7 /* it */, + 618915730E35937600B5E981 /* sv */, + 6195D4920E404AD700D41A50 /* ru */, + ); + name = Sparkle.strings; + sourceTree = ""; + }; + 61AAE8240A321A7F00D8810D /* SUAutomaticUpdateAlert.nib */ = { + isa = PBXVariantGroup; + children = ( + 61AAE8250A321A7F00D8810D /* en */, + 61F3652B0E189883007ECA02 /* es */, + 61F365300E18988F007ECA02 /* fr */, + 61F365350E1898A3007ECA02 /* nl */, + 619B17210E1E9D0800E72754 /* de */, + 61F614550E24A12D009F47E7 /* it */, + 618915720E35937600B5E981 /* sv */, + 6195D4910E404AD600D41A50 /* ru */, + ); + name = SUAutomaticUpdateAlert.nib; + sourceTree = ""; + }; + 61AAE8260A321A7F00D8810D /* SUUpdateAlert.nib */ = { + isa = PBXVariantGroup; + children = ( + 61AAE8270A321A7F00D8810D /* en */, + 61F3652A0E189883007ECA02 /* es */, + 61F3652F0E18988F007ECA02 /* fr */, + 61F365340E1898A3007ECA02 /* nl */, + 619B17220E1E9D0800E72754 /* de */, + 61F614560E24A12D009F47E7 /* it */, + 618915710E35937600B5E981 /* sv */, + 6195D4900E404AD600D41A50 /* ru */, + ); + name = SUUpdateAlert.nib; + sourceTree = ""; + }; + 61B5F92A09C4CFD800B25A18 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 61B5F92B09C4CFD800B25A18 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 61B5F92C09C4CFD800B25A18 /* MainMenu.nib */ = { + isa = PBXVariantGroup; + children = ( + 61B5F92D09C4CFD800B25A18 /* English */, + ); + name = MainMenu.nib; + sourceTree = ""; + }; + 61C46F330D9C54F300B06326 /* SUUpdatePermissionPrompt.nib */ = { + isa = PBXVariantGroup; + children = ( + 61C46F350D9C54F300B06326 /* en */, + 61F3651A0E18987B007ECA02 /* es */, + 61F3652E0E18988F007ECA02 /* fr */, + 61F365330E1898A3007ECA02 /* nl */, + 619B17230E1E9D0800E72754 /* de */, + 61F614570E24A12D009F47E7 /* it */, + 618915700E35937600B5E981 /* sv */, + 6195D48F0E404AD600D41A50 /* ru */, + ); + name = SUUpdatePermissionPrompt.nib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1DEB91AE08733DA50010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941CA0D94A70100DD942E /* ConfigFrameworkDebug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 1DEB91AF08733DA50010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941D50D94A70100DD942E /* ConfigFrameworkRelease.xcconfig */; + buildSettings = { + GCC_DEBUGGING_SYMBOLS = full; + }; + name = Release; + }; + 1DEB91B208733DA50010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + WARNING_CFLAGS = "-Wundeclared-selector"; + }; + name = Debug; + }; + 1DEB91B308733DA50010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + WARNING_CFLAGS = "-Wundeclared-selector"; + }; + name = Release; + }; + 61072EAD0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_VERSION = ""; + WARNING_CFLAGS = "-Wundeclared-selector"; + }; + name = "Release (GC dual-mode; 10.5-only)"; + }; + 61072EAE0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 61072EB20DF2640C008FE88B /* ConfigFrameworkReleaseGCSupport.xcconfig */; + buildSettings = { + INSTALL_PATH = "@loader_path/../Frameworks"; + }; + name = "Release (GC dual-mode; 10.5-only)"; + }; + 61072EAF0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */; + buildSettings = { + }; + name = "Release (GC dual-mode; 10.5-only)"; + }; + 61072EB00DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */; + buildSettings = { + }; + name = "Release (GC dual-mode; 10.5-only)"; + }; + 61072EB10DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(NATIVE_ARCH)"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; + INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist"; + INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-framework", + Cocoa, + "-framework", + SenTestingKit, + ); + PREBINDING = NO; + PRODUCT_NAME = "Sparkle Unit Tests"; + WRAPPER_EXTENSION = octest; + ZERO_LINK = NO; + }; + name = "Release (GC dual-mode; 10.5-only)"; + }; + 612279DB0DB5470300AB99EA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; + INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist"; + INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-framework", + Cocoa, + "-framework", + SenTestingKit, + ); + PREBINDING = NO; + PRODUCT_NAME = "Sparkle Unit Tests"; + WRAPPER_EXTENSION = octest; + ZERO_LINK = NO; + }; + name = Debug; + }; + 612279DC0DB5470300AB99EA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(NATIVE_ARCH)"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; + INFOPLIST_FILE = "Tests/Sparkle Unit Tests-Info.plist"; + INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; + OTHER_LDFLAGS = ( + "-framework", + Cocoa, + "-framework", + SenTestingKit, + ); + PREBINDING = NO; + PRODUCT_NAME = "Sparkle Unit Tests"; + WRAPPER_EXTENSION = octest; + ZERO_LINK = NO; + }; + name = Release; + }; + 61B5F90609C4CEE300B25A18 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941CB0D94A70100DD942E /* ConfigTestAppDebug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 61B5F90709C4CEE300B25A18 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941D20D94A70100DD942E /* ConfigTestAppRelease.xcconfig */; + buildSettings = { + }; + name = Release; + }; + DAAEFC980DA571DF0051E0D0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941D30D94A70100DD942E /* ConfigRelaunchDebug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + DAAEFC990DA571DF0051E0D0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FA1941D40D94A70100DD942E /* ConfigRelaunchRelease.xcconfig */; + buildSettings = { + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Sparkle" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91AE08733DA50010E9CD /* Debug */, + 1DEB91AF08733DA50010E9CD /* Release */, + 61072EAE0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Sparkle" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91B208733DA50010E9CD /* Debug */, + 1DEB91B308733DA50010E9CD /* Release */, + 61072EAD0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 612279DD0DB5470300AB99EA /* Build configuration list for PBXNativeTarget "Sparkle Unit Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 612279DB0DB5470300AB99EA /* Debug */, + 612279DC0DB5470300AB99EA /* Release */, + 61072EB10DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 61B5F90509C4CEE300B25A18 /* Build configuration list for PBXNativeTarget "Sparkle Test App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 61B5F90609C4CEE300B25A18 /* Debug */, + 61B5F90709C4CEE300B25A18 /* Release */, + 61072EAF0DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DAAEFC9A0DA571FD0051E0D0 /* Build configuration list for PBXNativeTarget "relaunch tool" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DAAEFC980DA571DF0051E0D0 /* Debug */, + DAAEFC990DA571DF0051E0D0 /* Release */, + 61072EB00DF263BD008FE88B /* Release (GC dual-mode; 10.5-only) */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff -r e253b4383132 -r 1a5334dfb21d tunblick/Tunnelblick.xcodeproj/project.pbxproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/Tunnelblick.xcodeproj/project.pbxproj Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,735 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + +/* Begin PBXBuildFile section */ + 6140EF9A0E3C334E00C5B93A /* openvpn in CopyFiles */ = {isa = PBXBuildFile; fileRef = 6140EF990E3C334800C5B93A /* openvpn */; }; + 61492D380E38ED3400BC9C3F /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61492D370E38ED3400BC9C3F /* Sparkle.framework */; }; + 61492D3B0E38ED3900BC9C3F /* Sparkle.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 61492D370E38ED3400BC9C3F /* Sparkle.framework */; }; + 615F748A0ED3A4C2007F6F0A /* English.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74860ED3A4C2007F6F0A /* English.lproj */; }; + 615F748F0ED3A4E5007F6F0A /* French.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F748C0ED3A4E5007F6F0A /* French.lproj */; }; + 615F74990ED3A4FA007F6F0A /* German.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74900ED3A4FA007F6F0A /* German.lproj */; }; + 615F749A0ED3A4FA007F6F0A /* Japanese.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74930ED3A4FA007F6F0A /* Japanese.lproj */; }; + 615F749B0ED3A4FA007F6F0A /* Korean.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 615F74960ED3A4FA007F6F0A /* Korean.lproj */; }; + 6165CC8C0E9072A5007312DC /* RouteManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165CC8B0E9072A5007312DC /* RouteManager.m */; }; + 616A49190E38D0DE00477476 /* tap.kext in CopyFiles */ = {isa = PBXBuildFile; fileRef = 616A49090E38D0D400477476 /* tap.kext */; }; + 616A491A0E38D0DE00477476 /* tun.kext in CopyFiles */ = {isa = PBXBuildFile; fileRef = 616A490A0E38D0D400477476 /* tun.kext */; }; + 6185E7400E76045D0009C2FD /* helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6185E73F0E76045D0009C2FD /* helper.m */; }; + 61BC4B780E2F9EBC00F24255 /* VPNConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */; }; + 61BC4B7A0E2F9EBC00F24255 /* NSArray+cArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */; }; + 61BC4B7B0E2F9EBC00F24255 /* MenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */; }; + 61BC4B7C0E2F9EBC00F24255 /* NetSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */; }; + 61BC4B7D0E2F9EBC00F24255 /* NetSocket+Text.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */; }; + 61BC4B7E0E2F9EBC00F24255 /* NSApplication+LoginItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */; }; + 61BC4B7F0E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */; }; + 61BC4B800E2F9EBC00F24255 /* KeyChain.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B740E2F9EBC00F24255 /* KeyChain.m */; }; + 61BC4B810E2F9EBC00F24255 /* AuthAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */; }; + 61BC4B910E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */; }; + 61BC4B930E2F9EDA00F24255 /* UKKQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */; }; + 61BC4B940E2F9EDA00F24255 /* UKMainThreadProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */; }; + 61BC4CDF0E2F9FFA00F24255 /* openvpnstart.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */; }; + 61BC4CE10E2FA02800F24255 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; + 61BC4D8A0E2FA20800F24255 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */; }; + 61BC4D8B0E2FA20800F24255 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61BC4D890E2FA20800F24255 /* Security.framework */; }; + 61BC4D9E0E2FA2F300F24255 /* installer.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BC4D9D0E2FA2F300F24255 /* installer.m */; }; + 61BC4DA00E2FA31F00F24255 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; + 61BC4DAB0E2FA33C00F24255 /* installer in CopyFiles */ = {isa = PBXBuildFile; fileRef = 61BC4D6B0E2FA06900F24255 /* installer */; }; + 61BC4DAD0E2FA34100F24255 /* openvpnstart in CopyFiles */ = {isa = PBXBuildFile; fileRef = 61BC4BC10E2F9FE900F24255 /* openvpnstart */; }; + 61BC4DB30E2FA3C300F24255 /* LogWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */; }; + 61BC4DB40E2FA3C300F24255 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */; }; + 61BC4E6F0E2FA8A900F24255 /* 00_closed.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E690E2FA8A200F24255 /* 00_closed.tif */; }; + 61BC4E700E2FA8A900F24255 /* 01.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6A0E2FA8A200F24255 /* 01.tif */; }; + 61BC4E710E2FA8A900F24255 /* 02.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6B0E2FA8A200F24255 /* 02.tif */; }; + 61BC4E720E2FA8A900F24255 /* 03.tif in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6C0E2FA8A200F24255 /* 03.tif */; }; + 61BC4E730E2FA8A900F24255 /* connected.png in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6D0E2FA8A200F24255 /* connected.png */; }; + 61BC4E740E2FA8A900F24255 /* tunnelblick.icns in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */; }; + 61BC4E790E2FA8D600F24255 /* client.down.osx.sh in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */; }; + 61BC4E7A0E2FA8D600F24255 /* client.up.osx.sh in Resources */ = {isa = PBXBuildFile; fileRef = 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */; }; + 61C03B990ED4E42A00175F22 /* Norwegian.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 61C03B960ED4E42A00175F22 /* Norwegian.lproj */; }; + 61F294A60ED389520097DE94 /* openvpn.conf in Resources */ = {isa = PBXBuildFile; fileRef = 61F294A50ED389520097DE94 /* openvpn.conf */; }; + 6337527D101A1EBD00775AA2 /* TBTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6337527C101A1EBD00775AA2 /* TBTextView.m */; }; + 63E372680FEB3FF00012DDE7 /* leasewatch in Resources */ = {isa = PBXBuildFile; fileRef = 63E372660FEB3FF00012DDE7 /* leasewatch */; }; + 63E372690FEB3FF00012DDE7 /* LeaseWatch.plist.template in Resources */ = {isa = PBXBuildFile; fileRef = 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */; }; + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; + 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 61BC4D950E2FA28700F24255 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 61BC4BC00E2F9FE900F24255; + remoteInfo = openvpnstart; + }; + 61BC4D970E2FA28700F24255 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 61BC4D6A0E2FA06900F24255; + remoteInfo = installer; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 61BC4D930E2FA26E00F24255 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 7; + files = ( + 6140EF9A0E3C334E00C5B93A /* openvpn in CopyFiles */, + 616A49190E38D0DE00477476 /* tap.kext in CopyFiles */, + 616A491A0E38D0DE00477476 /* tun.kext in CopyFiles */, + 61BC4DAD0E2FA34100F24255 /* openvpnstart in CopyFiles */, + 61BC4DAB0E2FA33C00F24255 /* installer in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61C8B0AB0E38E3C100696EE9 /* Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 61492D3B0E38ED3900BC9C3F /* Sparkle.framework in Copy Files */, + ); + name = "Copy Files"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 32CA4F630368D1EE00C91783 /* Tunnelblick_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tunnelblick_Prefix.pch; sourceTree = ""; }; + 6140EF990E3C334800C5B93A /* openvpn */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = openvpn; path = ../third_party/openvpn/openvpn; sourceTree = SOURCE_ROOT; }; + 61492D370E38ED3400BC9C3F /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = ../third_party/Sparkle.framework; sourceTree = SOURCE_ROOT; }; + 615F74860ED3A4C2007F6F0A /* English.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = English.lproj; sourceTree = ""; }; + 615F748C0ED3A4E5007F6F0A /* French.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = French.lproj; sourceTree = ""; }; + 615F74900ED3A4FA007F6F0A /* German.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = German.lproj; sourceTree = ""; }; + 615F74930ED3A4FA007F6F0A /* Japanese.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Japanese.lproj; sourceTree = ""; }; + 615F74960ED3A4FA007F6F0A /* Korean.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Korean.lproj; sourceTree = ""; }; + 6165CC8A0E9072A5007312DC /* RouteManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RouteManager.h; sourceTree = ""; }; + 6165CC8B0E9072A5007312DC /* RouteManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RouteManager.m; sourceTree = ""; }; + 616A44E10E38CAA700477476 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = ""; }; + 616A49090E38D0D400477476 /* tap.kext */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.kernel-extension"; name = tap.kext; path = ../third_party/tuntap/tap.kext; sourceTree = SOURCE_ROOT; }; + 616A490A0E38D0D400477476 /* tun.kext */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.kernel-extension"; name = tun.kext; path = ../third_party/tuntap/tun.kext; sourceTree = SOURCE_ROOT; }; + 6185E73E0E76045D0009C2FD /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = ""; }; + 6185E73F0E76045D0009C2FD /* helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = helper.m; sourceTree = ""; }; + 61BC4B650E2F9EBC00F24255 /* VPNConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VPNConnection.h; sourceTree = ""; }; + 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VPNConnection.m; sourceTree = ""; }; + 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = openvpnstart.m; sourceTree = ""; }; + 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+cArray.m"; sourceTree = ""; }; + 61BC4B690E2F9EBC00F24255 /* MenuController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MenuController.h; sourceTree = ""; }; + 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuController.m; sourceTree = ""; }; + 61BC4B6B0E2F9EBC00F24255 /* NetSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetSocket.h; sourceTree = ""; }; + 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetSocket.m; sourceTree = ""; }; + 61BC4B6D0E2F9EBC00F24255 /* NetSocket+Text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NetSocket+Text.h"; sourceTree = ""; }; + 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NetSocket+Text.m"; sourceTree = ""; }; + 61BC4B6F0E2F9EBC00F24255 /* NSApplication+LoginItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+LoginItem.h"; sourceTree = ""; }; + 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+LoginItem.m"; sourceTree = ""; }; + 61BC4B710E2F9EBC00F24255 /* NSApplication+NetworkNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+NetworkNotifications.h"; sourceTree = ""; }; + 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+NetworkNotifications.m"; sourceTree = ""; }; + 61BC4B730E2F9EBC00F24255 /* NSArray+cArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+cArray.h"; sourceTree = ""; }; + 61BC4B740E2F9EBC00F24255 /* KeyChain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KeyChain.m; sourceTree = ""; }; + 61BC4B750E2F9EBC00F24255 /* KeyChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyChain.h; sourceTree = ""; }; + 61BC4B760E2F9EBC00F24255 /* AuthAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuthAgent.h; sourceTree = ""; }; + 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AuthAgent.m; sourceTree = ""; }; + 61BC4B890E2F9EDA00F24255 /* UKFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKFileWatcher.h; sourceTree = ""; }; + 61BC4B8A0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKFNSubscribeFileWatcher.h; sourceTree = ""; }; + 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKFNSubscribeFileWatcher.m; sourceTree = ""; }; + 61BC4B8C0E2F9EDA00F24255 /* UKKQueue Readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "UKKQueue Readme.txt"; sourceTree = ""; }; + 61BC4B8D0E2F9EDA00F24255 /* UKKQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKKQueue.h; sourceTree = ""; }; + 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKKQueue.m; sourceTree = ""; }; + 61BC4B8F0E2F9EDA00F24255 /* UKMainThreadProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UKMainThreadProxy.h; sourceTree = ""; }; + 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UKMainThreadProxy.m; sourceTree = ""; }; + 61BC4BC10E2F9FE900F24255 /* openvpnstart */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = openvpnstart; sourceTree = BUILT_PRODUCTS_DIR; }; + 61BC4D6B0E2FA06900F24255 /* installer */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = installer; sourceTree = BUILT_PRODUCTS_DIR; }; + 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 61BC4D890E2FA20800F24255 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; + 61BC4D9C0E2FA2F300F24255 /* installer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = installer.h; sourceTree = ""; }; + 61BC4D9D0E2FA2F300F24255 /* installer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = installer.m; sourceTree = ""; }; + 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = LogWindow.nib; sourceTree = ""; }; + 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = MainMenu.nib; sourceTree = ""; }; + 61BC4DCA0E2FA51E00F24255 /* tun-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "tun-Info.plist"; sourceTree = ""; }; + 61BC4DD30E2FA52900F24255 /* tap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "tap-Info.plist"; sourceTree = ""; }; + 61BC4E690E2FA8A200F24255 /* 00_closed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 00_closed.tif; sourceTree = ""; }; + 61BC4E6A0E2FA8A200F24255 /* 01.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 01.tif; sourceTree = ""; }; + 61BC4E6B0E2FA8A200F24255 /* 02.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 02.tif; sourceTree = ""; }; + 61BC4E6C0E2FA8A200F24255 /* 03.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = 03.tif; sourceTree = ""; }; + 61BC4E6D0E2FA8A200F24255 /* connected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = connected.png; sourceTree = ""; }; + 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = tunnelblick.icns; sourceTree = ""; }; + 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = client.down.osx.sh; sourceTree = ""; }; + 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = client.up.osx.sh; sourceTree = ""; }; + 61C03B960ED4E42A00175F22 /* Norwegian.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Norwegian.lproj; sourceTree = ""; }; + 61F294A50ED389520097DE94 /* openvpn.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = openvpn.conf; sourceTree = ""; }; + 6337527B101A1EBD00775AA2 /* TBTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBTextView.h; sourceTree = ""; }; + 6337527C101A1EBD00775AA2 /* TBTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBTextView.m; sourceTree = ""; }; + 63E372660FEB3FF00012DDE7 /* leasewatch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = leasewatch; sourceTree = ""; }; + 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = LeaseWatch.plist.template; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* Tunnelblick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tunnelblick.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 61BC4BBF0E2F9FE900F24255 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61BC4CE10E2FA02800F24255 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61BC4D690E2FA06900F24255 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61BC4DA00E2FA31F00F24255 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + 61BC4D8A0E2FA20800F24255 /* CoreFoundation.framework in Frameworks */, + 61BC4D8B0E2FA20800F24255 /* Security.framework in Frameworks */, + 61492D380E38ED3400BC9C3F /* Sparkle.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + 61BC4B670E2F9EBC00F24255 /* openvpnstart.m */, + 6337527B101A1EBD00775AA2 /* TBTextView.h */, + 6337527C101A1EBD00775AA2 /* TBTextView.m */, + 61BC4D9C0E2FA2F300F24255 /* installer.h */, + 61BC4D9D0E2FA2F300F24255 /* installer.m */, + 61BC4B880E2F9EDA00F24255 /* UKKQueue */, + 61BC4B650E2F9EBC00F24255 /* VPNConnection.h */, + 61BC4B660E2F9EBC00F24255 /* VPNConnection.m */, + 61BC4B680E2F9EBC00F24255 /* NSArray+cArray.m */, + 61BC4B690E2F9EBC00F24255 /* MenuController.h */, + 61BC4B6A0E2F9EBC00F24255 /* MenuController.m */, + 61BC4B6B0E2F9EBC00F24255 /* NetSocket.h */, + 61BC4B6C0E2F9EBC00F24255 /* NetSocket.m */, + 61BC4B6D0E2F9EBC00F24255 /* NetSocket+Text.h */, + 61BC4B6E0E2F9EBC00F24255 /* NetSocket+Text.m */, + 61BC4B6F0E2F9EBC00F24255 /* NSApplication+LoginItem.h */, + 61BC4B700E2F9EBC00F24255 /* NSApplication+LoginItem.m */, + 61BC4B710E2F9EBC00F24255 /* NSApplication+NetworkNotifications.h */, + 61BC4B720E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m */, + 61BC4B730E2F9EBC00F24255 /* NSArray+cArray.h */, + 61BC4B740E2F9EBC00F24255 /* KeyChain.m */, + 61BC4B750E2F9EBC00F24255 /* KeyChain.h */, + 61BC4B760E2F9EBC00F24255 /* AuthAgent.h */, + 61BC4B770E2F9EBC00F24255 /* AuthAgent.m */, + 6185E73E0E76045D0009C2FD /* helper.h */, + 6185E73F0E76045D0009C2FD /* helper.m */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 61492D370E38ED3400BC9C3F /* Sparkle.framework */, + 616A44E10E38CAA700477476 /* Kernel.framework */, + 61BC4D880E2FA20800F24255 /* CoreFoundation.framework */, + 61BC4D890E2FA20800F24255 /* Security.framework */, + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* Tunnelblick.app */, + 61BC4BC10E2F9FE900F24255 /* openvpnstart */, + 61BC4D6B0E2FA06900F24255 /* installer */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* Tunnelblick */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + 61BC4DCA0E2FA51E00F24255 /* tun-Info.plist */, + 61BC4DD30E2FA52900F24255 /* tap-Info.plist */, + 6165CC8A0E9072A5007312DC /* RouteManager.h */, + 6165CC8B0E9072A5007312DC /* RouteManager.m */, + ); + name = Tunnelblick; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + 61F294A50ED389520097DE94 /* openvpn.conf */, + 6140EF990E3C334800C5B93A /* openvpn */, + 61BC4E770E2FA8D000F24255 /* client.down.osx.sh */, + 61BC4E780E2FA8D000F24255 /* client.up.osx.sh */, + 32CA4F630368D1EE00C91783 /* Tunnelblick_Prefix.pch */, + 29B97316FDCFA39411CA2CEA /* main.m */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 63E372660FEB3FF00012DDE7 /* leasewatch */, + 63E372670FEB3FF00012DDE7 /* LeaseWatch.plist.template */, + 616A49090E38D0D400477476 /* tap.kext */, + 616A490A0E38D0D400477476 /* tun.kext */, + 61C03B960ED4E42A00175F22 /* Norwegian.lproj */, + 615F74900ED3A4FA007F6F0A /* German.lproj */, + 615F74930ED3A4FA007F6F0A /* Japanese.lproj */, + 615F74960ED3A4FA007F6F0A /* Korean.lproj */, + 615F748C0ED3A4E5007F6F0A /* French.lproj */, + 615F74860ED3A4C2007F6F0A /* English.lproj */, + 61BC4E690E2FA8A200F24255 /* 00_closed.tif */, + 61BC4E6A0E2FA8A200F24255 /* 01.tif */, + 61BC4E6B0E2FA8A200F24255 /* 02.tif */, + 61BC4E6C0E2FA8A200F24255 /* 03.tif */, + 61BC4E6D0E2FA8A200F24255 /* connected.png */, + 61BC4E6E0E2FA8A200F24255 /* tunnelblick.icns */, + 61BC4DB10E2FA3C300F24255 /* LogWindow.nib */, + 61BC4DB20E2FA3C300F24255 /* MainMenu.nib */, + 8D1107310486CEB800E47090 /* Info.plist */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 61BC4B880E2F9EDA00F24255 /* UKKQueue */ = { + isa = PBXGroup; + children = ( + 61BC4B890E2F9EDA00F24255 /* UKFileWatcher.h */, + 61BC4B8A0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.h */, + 61BC4B8B0E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m */, + 61BC4B8C0E2F9EDA00F24255 /* UKKQueue Readme.txt */, + 61BC4B8D0E2F9EDA00F24255 /* UKKQueue.h */, + 61BC4B8E0E2F9EDA00F24255 /* UKKQueue.m */, + 61BC4B8F0E2F9EDA00F24255 /* UKMainThreadProxy.h */, + 61BC4B900E2F9EDA00F24255 /* UKMainThreadProxy.m */, + ); + path = UKKQueue; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 61BC4BC00E2F9FE900F24255 /* openvpnstart */ = { + isa = PBXNativeTarget; + buildConfigurationList = 61BC4CDE0E2F9FF400F24255 /* Build configuration list for PBXNativeTarget "openvpnstart" */; + buildPhases = ( + 61BC4BBE0E2F9FE900F24255 /* Sources */, + 61BC4BBF0E2F9FE900F24255 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = openvpnstart; + productName = openvpnstart; + productReference = 61BC4BC10E2F9FE900F24255 /* openvpnstart */; + productType = "com.apple.product-type.tool"; + }; + 61BC4D6A0E2FA06900F24255 /* installer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 61BC4D6F0E2FA08700F24255 /* Build configuration list for PBXNativeTarget "installer" */; + buildPhases = ( + 61BC4D680E2FA06900F24255 /* Sources */, + 61BC4D690E2FA06900F24255 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = installer; + productName = installer; + productReference = 61BC4D6B0E2FA06900F24255 /* installer */; + productType = "com.apple.product-type.tool"; + }; + 8D1107260486CEB800E47090 /* Tunnelblick */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Tunnelblick" */; + buildPhases = ( + 616A49200E38D17500477476 /* ShellScript */, + 8D1107290486CEB800E47090 /* Resources */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + 61BC4D930E2FA26E00F24255 /* CopyFiles */, + 61C8B0AB0E38E3C100696EE9 /* Copy Files */, + 610AEAE70E2FE63900EA3C79 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 61BC4D960E2FA28700F24255 /* PBXTargetDependency */, + 61BC4D980E2FA28700F24255 /* PBXTargetDependency */, + ); + name = Tunnelblick; + productInstallPath = "$(HOME)/Applications"; + productName = Tunnelblick; + productReference = 8D1107320486CEB800E47090 /* Tunnelblick.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Tunnelblick" */; + compatibilityVersion = "Xcode 3.0"; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + Korean, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* Tunnelblick */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D1107260486CEB800E47090 /* Tunnelblick */, + 61BC4BC00E2F9FE900F24255 /* openvpnstart */, + 61BC4D6A0E2FA06900F24255 /* installer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61BC4E790E2FA8D600F24255 /* client.down.osx.sh in Resources */, + 61BC4E7A0E2FA8D600F24255 /* client.up.osx.sh in Resources */, + 61BC4E6F0E2FA8A900F24255 /* 00_closed.tif in Resources */, + 61BC4E700E2FA8A900F24255 /* 01.tif in Resources */, + 61BC4E710E2FA8A900F24255 /* 02.tif in Resources */, + 61BC4E720E2FA8A900F24255 /* 03.tif in Resources */, + 61BC4E730E2FA8A900F24255 /* connected.png in Resources */, + 61BC4E740E2FA8A900F24255 /* tunnelblick.icns in Resources */, + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, + 61BC4DB30E2FA3C300F24255 /* LogWindow.nib in Resources */, + 61BC4DB40E2FA3C300F24255 /* MainMenu.nib in Resources */, + 61F294A60ED389520097DE94 /* openvpn.conf in Resources */, + 615F748A0ED3A4C2007F6F0A /* English.lproj in Resources */, + 615F748F0ED3A4E5007F6F0A /* French.lproj in Resources */, + 615F74990ED3A4FA007F6F0A /* German.lproj in Resources */, + 615F749A0ED3A4FA007F6F0A /* Japanese.lproj in Resources */, + 615F749B0ED3A4FA007F6F0A /* Korean.lproj in Resources */, + 61C03B990ED4E42A00175F22 /* Norwegian.lproj in Resources */, + 63E372680FEB3FF00012DDE7 /* leasewatch in Resources */, + 63E372690FEB3FF00012DDE7 /* LeaseWatch.plist.template in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 610AEAE70E2FE63900EA3C79 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + }; + 616A49200E38D17500477476 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "BUILDDIR=../third_party/\ncd $BUILDDIR\n\nif [ -e built ]; then\n\texit 0\nfi\n\nmake clean\nmake\n\ntouch built"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 61BC4BBE0E2F9FE900F24255 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61BC4CDF0E2F9FFA00F24255 /* openvpnstart.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 61BC4D680E2FA06900F24255 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61BC4D9E0E2FA2F300F24255 /* installer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072D0486CEB800E47090 /* main.m in Sources */, + 61BC4B780E2F9EBC00F24255 /* VPNConnection.m in Sources */, + 61BC4B7A0E2F9EBC00F24255 /* NSArray+cArray.m in Sources */, + 61BC4B7B0E2F9EBC00F24255 /* MenuController.m in Sources */, + 61BC4B7C0E2F9EBC00F24255 /* NetSocket.m in Sources */, + 61BC4B7D0E2F9EBC00F24255 /* NetSocket+Text.m in Sources */, + 61BC4B7E0E2F9EBC00F24255 /* NSApplication+LoginItem.m in Sources */, + 61BC4B7F0E2F9EBC00F24255 /* NSApplication+NetworkNotifications.m in Sources */, + 61BC4B800E2F9EBC00F24255 /* KeyChain.m in Sources */, + 61BC4B810E2F9EBC00F24255 /* AuthAgent.m in Sources */, + 61BC4B910E2F9EDA00F24255 /* UKFNSubscribeFileWatcher.m in Sources */, + 61BC4B930E2F9EDA00F24255 /* UKKQueue.m in Sources */, + 61BC4B940E2F9EDA00F24255 /* UKMainThreadProxy.m in Sources */, + 6185E7400E76045D0009C2FD /* helper.m in Sources */, + 6165CC8C0E9072A5007312DC /* RouteManager.m in Sources */, + 6337527D101A1EBD00775AA2 /* TBTextView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 61BC4D960E2FA28700F24255 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 61BC4BC00E2F9FE900F24255 /* openvpnstart */; + targetProxy = 61BC4D950E2FA28700F24255 /* PBXContainerItemProxy */; + }; + 61BC4D980E2FA28700F24255 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 61BC4D6A0E2FA06900F24255 /* installer */; + targetProxy = 61BC4D970E2FA28700F24255 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 61BC4BC30E2F9FE900F24255 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = openvpnstart; + ZERO_LINK = YES; + }; + name = Debug; + }; + 61BC4BC40E2F9FE900F24255 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = openvpnstart; + ZERO_LINK = NO; + }; + name = Release; + }; + 61BC4D6D0E2FA06900F24255 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = installer; + ZERO_LINK = YES; + }; + name = Debug; + }; + 61BC4D6E0E2FA06900F24255 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = installer; + ZERO_LINK = NO; + }; + name = Release; + }; + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../third_party\"", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Tunnelblick_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Tunnelblick; + WRAPPER_EXTENSION = app; + ZERO_LINK = YES; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../third_party\"", + ); + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Tunnelblick_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Tunnelblick; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 61BC4CDE0E2F9FF400F24255 /* Build configuration list for PBXNativeTarget "openvpnstart" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 61BC4BC30E2F9FE900F24255 /* Debug */, + 61BC4BC40E2F9FE900F24255 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 61BC4D6F0E2FA08700F24255 /* Build configuration list for PBXNativeTarget "installer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 61BC4D6D0E2FA06900F24255 /* Debug */, + 61BC4D6E0E2FA06900F24255 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Tunnelblick" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Tunnelblick" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff -r e253b4383132 -r 1a5334dfb21d tunblick/installer.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/installer.m Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2004 Angelo Laub + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "installer.h" + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + NSString *thisBundle = [[NSString stringWithUTF8String:argv[0]] stringByDeletingLastPathComponent]; + + NSString *tunPath = [thisBundle stringByAppendingPathComponent:@"/tun.kext"]; + NSString *tapPath = [thisBundle stringByAppendingPathComponent:@"/tap.kext"]; + + NSString *tunExecutable = [tunPath stringByAppendingPathComponent:@"/Contents/MacOS/tun"]; + NSString *tapExecutable = [tapPath stringByAppendingPathComponent:@"/Contents/MacOS/tap"]; + + NSString *helperPath = [thisBundle stringByAppendingPathComponent:@"/openvpnstart"]; + NSString *openvpnPath = [thisBundle stringByAppendingPathComponent:@"/openvpn"]; + + runTask( + @"/usr/sbin/chown", + [NSArray arrayWithObjects:@"-R",@"root:wheel",thisBundle,nil] + ); + + + runTask( + @"/bin/chmod", + [NSArray arrayWithObjects:@"-R",@"755",tunPath,tapPath,nil] + ); + + runTask( + @"/bin/chmod", + [NSArray arrayWithObjects:@"744", + tunExecutable, + tapExecutable, + helperPath, + openvpnPath, + nil] + ); + runTask( + @"/bin/chmod", + [NSArray arrayWithObjects:@"4111",helperPath,nil] + ); + [pool release]; + return 0; +} + +void runTask(NSString *launchPath,NSArray *arguments) +{ + NSTask* task = [[[NSTask alloc] init] autorelease]; + [task setArguments:arguments]; + [task setLaunchPath:launchPath]; + + NS_DURING { + [task launch]; + } NS_HANDLER { + NSLog(@"Exception raised while executing helper %@: %@",launchPath, localException); + exit(EXIT_FAILURE); + } + NS_ENDHANDLER + [task waitUntilExit]; +} diff -r e253b4383132 -r 1a5334dfb21d tunblick/openvpnstart.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/openvpnstart.m Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2004-2006 Angelo Laub + * Contributions by Dirk Theisen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#import +#import +#import +#import +#import +#import +#import + +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 +void killOneOpenvpn (pid_t pid); //Returns having killed an openvpn process, or complains and exits +int killAllOpenvpn (void); //Kills all openvpn processes and returns the number of processes that were killed. May complain and exit + +void loadKexts (void); //Tries to load kexts -- no indication of failure. May complain and exit if can't become root +void becomeRoot (void); //Returns as root, having setuid(0) if necessary; complains and exits if can't become root + +void getProcesses (struct kinfo_proc** procs, int* number); //Fills in process information +BOOL isOpenvpn (pid_t pid); //Returns TRUE if process is an openvpn process (i.e., process name = "openvpn") +BOOL configNeedsRepair (void); //Returns NO if configuration file is secure, otherwise complains and exits + +NSString* execPath; //Path to folder containing this executable, openvpn, tap.kext, tun.kext, client.up.osx.sh, and client.down.osx.sh +NSString* configPath; //Path to configuration file (in ~/Library/openvpn) +NSAutoreleasePool* pool; + +int main(int argc, char* argv[]) +{ + pool = [[NSAutoreleasePool alloc] init]; + + BOOL syntaxError = TRUE; + + if (argc > 1) { + char* command = argv[1]; + if( strcmp(command, "killall") == 0 ) { + if (argc == 2) { + int nKilled; + nKilled = killAllOpenvpn(); + if (nKilled) { + printf("%d openvpn processes killed\n", nKilled); + } else { + fprintf(stderr, "%d openvpn processes killed\n", nKilled); + } + syntaxError = FALSE; + } + } else if( strcmp(command, "kill") == 0 ) { + if (argc == 3) { + pid_t pid = (pid_t) atoi(argv[2]); + killOneOpenvpn(pid); + syntaxError = FALSE; + } + } else if( strcmp(command, "start") == 0 ) { + if ( (argc > 3) && (argc < 7) ) { + NSString* configFile = [NSString stringWithUTF8String:argv[2]]; + execPath = [[NSString stringWithUTF8String:argv[0]] stringByDeletingLastPathComponent]; + if(strlen(argv[3]) < 6 ) { + unsigned int port = atoi(argv[3]); + if (port<=65535) { + BOOL useScripts = FALSE; if( (argc > 4) && (atoi(argv[4]) == 1) ) useScripts = TRUE; + BOOL skipCheck = FALSE; if( (argc > 5) && (atoi(argv[5]) == 1) ) skipCheck = TRUE; + startVPN(configFile, port, useScripts, skipCheck); + syntaxError = FALSE; + } + } + } + } + } + + if (syntaxError) { + fprintf(stderr, "Error: Syntax error. Usage:\n\n" + + "\t./openvpnstart killall\n" + "\t./openvpnstart kill processId\n" + "\t./openvpnstart start configName mgtPort [useScripts [skipCheck] ]\n\n" + + "Where:\n" + "\tprocessId is the process ID of the openvpn process to kill\n" + "\tconfigName is the name of the configuration file (which must be in ~/Library/openvpn)\n" + "\tmgtPort is the port number (0-65535) to use for managing the connection\n" + "\tuseScripts is 1 to run the client.up.osx.sh script before connecting, and client.down.osx.sh after disconnecting\n" + "\t (The scripts are in Tunnelblick.app/Contents/Resources/)\n" + "\tskipCheck is 1 to skip checking ownership and permissions of the configuration file\n\n" + + "useScripts and skipCheck each default to 0.\n\n" + + "The normal return code is 0. If an error occurs a message is sent to stderr and a code of 2 is returned.\n" + + "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" + + "Tunnelblick must have been run and an administrator password entered at least once before openvpnstart can be used." + ); + [pool drain]; + exit(2); + } + + [pool drain]; + exit(0); +} + +//Tries to start an openvpn connection -- no indication of failure. May complain and exit if can't become root +void startVPN(NSString* configFile, int port, BOOL useScripts, BOOL skipCheck) +{ + NSString* directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/openvpn"]; + configPath = [directoryPath stringByAppendingPathComponent:configFile]; + NSString* openvpnPath = [execPath stringByAppendingPathComponent: @"openvpn"]; + NSMutableString* upscriptPath = [[execPath stringByAppendingPathComponent: @"client.up.osx.sh"] mutableCopy]; + NSMutableString* downscriptPath = [[execPath stringByAppendingPathComponent: @"client.down.osx.sh"] mutableCopy]; + [upscriptPath replaceOccurrencesOfString:@" " withString:@"\\ " options:NSLiteralSearch range:NSMakeRange(0, [upscriptPath length])]; + [downscriptPath replaceOccurrencesOfString:@" " withString:@"\\ " options:NSLiteralSearch range:NSMakeRange(0, [downscriptPath length])]; + + if ( ! skipCheck ) { + if(configNeedsRepair()) { + [pool drain]; + exit(2); + } + } + + // default arguments to openvpn command line + NSMutableArray* arguments = [NSMutableArray arrayWithObjects: + @"--management-query-passwords", + @"--cd", directoryPath, + @"--daemon", + @"--management-hold", + @"--management", @"127.0.0.1", [NSString stringWithFormat:@"%d", port], + @"--config", configPath, + @"--script-security", @"2", // allow us to call the up and down scripts or scripts defined in config + nil + ]; + + // conditionally push additional arguments to array + if(useScripts) { + [arguments addObjectsFromArray: + [NSArray arrayWithObjects: + @"--up", upscriptPath, + @"--down", downscriptPath, + @"--up-restart", + nil + ] + ]; + } + + loadKexts(); + + NSTask* task = [[[NSTask alloc] init] autorelease]; + [task setLaunchPath:openvpnPath]; + [task setArguments:arguments]; + + becomeRoot(); + [task launch]; + [task waitUntilExit]; + + [upscriptPath release]; + [downscriptPath release]; +} + +//Returns having killed an openvpn process, or complains and exits +void killOneOpenvpn(pid_t pid) +{ + int didnotKill; + + if(isOpenvpn(pid)) { + becomeRoot(); + didnotKill = kill(pid, SIGTERM); + if (didnotKill) { + fprintf(stderr, "Error: Unable to kill openvpn process %d\n", pid); + [pool drain]; + exit(2); + } + } else { + fprintf(stderr, "Error: Process %d is not an openvpn process\n", pid); + [pool drain]; + exit(2); + } +} + +//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 +int killAllOpenvpn(void) +{ + int count = 0, + i = 0, + nKilled = 0, //# of openvpn processes succesfully killed + nNotKilled = 0, //# of openvpn processes not killed + didnotKill; //return value from kill() -- zero indicates killed successfully + + struct kinfo_proc* info = NULL; + + getProcesses(&info, &count); + + for (i = 0; i < count; i++) { + char* process_name = info[i].kp_proc.p_comm; + pid_t pid = info[i].kp_proc.p_pid; + if(strcmp(process_name, "openvpn") == 0) { + becomeRoot(); + didnotKill = kill(pid, SIGTERM); + if (didnotKill) { + fprintf(stderr, "Error: Unable to kill openvpn process %d\n", pid); + nNotKilled++; + } else { + nKilled++; + } + } + } + + free(info); + + if (nNotKilled) { + // An error message for each openvpn process that wasn't killed has already been output + [pool drain]; + exit(2); + } + + return(nKilled); +} + +//Tries to load kexts -- no indication of failure. May complain and exit if can't become root +void loadKexts(void) +{ + NSString* tapPath = [execPath stringByAppendingPathComponent: @"tap.kext"]; + NSString* tunPath = [execPath stringByAppendingPathComponent: @"tun.kext"]; + NSTask* task = [[[NSTask alloc] init] autorelease]; + NSArray* arguments = [NSArray arrayWithObjects:tapPath, tunPath, nil]; + + [task setLaunchPath:@"/sbin/kextload"]; + + [task setArguments:arguments]; + + becomeRoot(); + [task launch]; + [task waitUntilExit]; +} + +//Returns as root, having setuid(0) if necessary; complains and exits if can't become root +void becomeRoot(void) +{ + if (getuid() != 0) { + if ( setuid(0) ) { + fprintf(stderr, "Error: Unable to become root\n" + "You must have run Tunnelblick and entered an administrator password at least once to use openvpnstart\n"); + [pool drain]; + exit(2); + } + } +} + +//Fills in process information +void getProcesses(struct kinfo_proc** procs, int* number) +{ + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; + struct kinfo_proc* info; + size_t length; + int level = 3; + + if (sysctl(mib, level, NULL, &length, NULL, 0) < 0) return; + if (!(info = malloc(length))) return; + if (sysctl(mib, level, info, &length, NULL, 0) < 0) { + free(info); + return; + } + *procs = info; + *number = length / sizeof(struct kinfo_proc); +} + +//Returns TRUE if process is an openvpn process (i.e., process name = "openvpn"), otherwise returns FALSE +BOOL isOpenvpn(pid_t pid) +{ + BOOL is_openvpn = FALSE; + int count = 0, + i = 0; + struct kinfo_proc* info = NULL; + + getProcesses(&info, &count); + for (i = 0; i < count; i++) { + char* process_name = info[i].kp_proc.p_comm; + pid_t thisPid = info[i].kp_proc.p_pid; + if (pid == thisPid) { + if (strcmp(process_name, "openvpn")==0) { + is_openvpn = TRUE; + } else { + is_openvpn = FALSE; + } + break; + } + } + free(info); + return is_openvpn; +} + +//Returns NO if configuration file is secure, otherwise complains and exits +BOOL configNeedsRepair(void) +{ + NSFileManager* fileManager = [NSFileManager defaultManager]; + NSDictionary* fileAttributes = [fileManager fileAttributesAtPath:configPath traverseLink:YES]; + + if (fileAttributes == nil) { + fprintf(stderr, "Error: %s does not exist\n", [configPath UTF8String]); + [pool drain]; + exit(2); + } + + unsigned long perms = [fileAttributes filePosixPermissions]; + NSString* octalString = [NSString stringWithFormat:@"%o", perms]; + NSNumber* fileOwner = [fileAttributes fileOwnerAccountID]; + + if ( (![octalString isEqualToString:@"644"]) || (![fileOwner isEqualToNumber:[NSNumber numberWithInt:0]])) { + NSString* errMsg = [NSString stringWithFormat:@"Error: File %@ is owned by %@ and has permissions %@\n" + "Configuration files must be owned by root:wheel with permissions 0644\n" + "To skip this check, use 'skipCheck' -- type './openvpnstart' (with no arguments) for details)\n", + configPath, fileOwner, octalString]; + fprintf(stderr, [errMsg UTF8String]); + [pool drain]; + exit(2); + } + return NO; +} diff -r e253b4383132 -r 1a5334dfb21d tunblick/third_party/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tunblick/third_party/Makefile Wed Jul 29 11:23:17 2009 +0200 @@ -0,0 +1,86 @@ +# This Makefile builds all the third_party code +# It shouldn't be called by anything other than automated scripts + +# Both lzo and openvpn should be built universally + +LZO_DIR=lzo-2.02 +PKCS11_DIR=pkcs11-helper-1.07 + +all: tuntap lzo openvpn + +pkcs11-helper:: + @for a in ppc i686; do \ + echo Configure PKCS11-Helper for $$a; \ + cd $(PKCS11_DIR); \ + echo Forcefully be clean; \ + $(MAKE) clean; \ + 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/; \ + echo Build PKCS11-Helper; \ + $(MAKE); \ + echo Install to third_party/$(PKCS11_DIR)/staging_$$a; \ + $(MAKE) install; \ + cd ../; \ + done + mkdir -p $(PKCS11_DIR)/staging/lib + lipo $(PKCS11_DIR)/staging_*/lib/libpkcs11-helper.a -create -output $(PKCS11_DIR)/staging/lib/libpkcs11-helper.a + cp $(PKCS11_DIR)/staging_i686/lib/libpkcs11-helper.la $(PKCS11_DIR)/staging/lib/ + +lzo:: + @for a in ppc i686; do \ + echo Configure LZO for $$a; \ + cd $(LZO_DIR); \ + echo Forcefully be clean; \ + $(MAKE) clean; \ + 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/; \ + echo Build LZO; \ + $(MAKE); \ + echo Install to third_party/$(LZO_DIR)/staging_$$a; \ + $(MAKE) install; \ + cd ../; \ + done + + # Use lipo to create a universal library + mkdir -p $(LZO_DIR)/staging/lib + lipo $(LZO_DIR)/staging_*/lib/liblzo2.a -create -output $(LZO_DIR)/staging/lib/liblzo2.a + cp $(LZO_DIR)/staging_i686/lib/liblzo2.la $(LZO_DIR)/staging/lib/ + + # wtf? library was renamed??? move it back so openvpn will build correctly + cd $(LZO_DIR)/staging/lib/; mv liblzo2.a liblzo.a; mv liblzo2.la liblzo.la + +lzo-clean: + $(MAKE) -C $(LZO_DIR) clean + rm -rf $(LZO_DIR)/staging* + +openvpn: lzo pkcs11-helper + @for a in ppc i686; do \ + echo Configure OpenVPN for $$a; \ + cd openvpn/; \ + echo Forcefully be clean; \ + $(MAKE) clean; \ + autoreconf -i -v; \ + 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; \ + echo Build OpenVPN; \ + $(MAKE); \ + mv openvpn openvpn_tblk_$$a; \ + cd ../; \ + done + + # Use lipo to create a universal library + lipo openvpn/openvpn_tblk_* -create -output openvpn/openvpn + +openvpn-clean: + $(MAKE) -C openvpn/ clean + rm -f openvpn/openvpn_tblk_* + +.PHONY : tuntap + +tuntap: + # Now we'll build the tun/tap driver + $(MAKE) -C tuntap/ + +tuntap-clean: + $(MAKE) -C tuntap/ clean + + + +clean: lzo-clean tuntap-clean openvpn-clean