Changeset 119

Show
Ignore:
Timestamp:
08/22/07 18:55:19 (1 year ago)
Author:
eric
Message:

Handpatched from branches/eric since almost every file confliceted. Includes * rewritted screensaver check * rewritten key timeout * proper UTF8 handling with Keychain * removed unecessary thread spawn for add all keys without interaction.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/AgentController.m

    r118 r119  
    6565                selector:@selector(agentStatusChange:) name:@"AgentStopped" object:nil]; 
    6666 
    67         [NSThread detachNewThreadSelector:@selector(checkForScreenSaver:) 
    68                                                toTarget:self withObject:self]; 
     67        [[NSDistributedNotificationCenter defaultCenter] addObserver:self 
     68                selector:@selector(onScreenSaver:) name:@"com.apple.screensaver.didstart" object:nil]; 
    6969 
    7070        allKeysOnAgentLock = [[NSLock alloc] init]; 
     
    144144                if((status & 1) && ([agent isRunning])) 
    145145                { 
    146                         [NSThread detachNewThreadSelector:@selector(addKeysToAgentWithoutInteractionInNewThread) 
    147                                                  toTarget:self withObject:self]; 
     146                        [keychain addKeysToAgentWithInteraction:NO]; 
    148147                } 
    149148        }        
     
    223222 
    224223                [allKeysOnAgentLock unlock]; 
    225  
    226                 [NSThread detachNewThreadSelector:@selector(addKeysToAgentWithoutInteractionInNewThread) 
    227                                                                 toTarget:self withObject:self]; 
     224                 
     225                [keychain addKeysToAgentWithInteraction:NO]; 
    228226        } 
    229227} 
     
    282280                allKeysOnAgent = YES; 
    283281                [allKeysOnAgentLock unlock]; 
     282 
     283                if ([[NSUserDefaults standardUserDefaults] integerForKey:KeyTimeoutString] > 0) 
     284                { 
     285                        // Self firing timer with reset 
     286                        [[self class] cancelPreviousPerformRequestsWithTarget: self ]; 
     287                        [self performSelector: @selector(removeKeysFromAgent:)  
     288                                           withObject: nil 
     289                                           afterDelay: [[NSUserDefaults standardUserDefaults]  
     290                                           integerForKey:KeyTimeoutString] * 60.00 ]; 
     291                } 
    284292                 
    285293                [[Controller sharedController] setStatus:YES]; 
     
    337345                        && (![keychain addingKeys]) && (status & 1) && ([agent isRunning])) 
    338346                { 
    339                         [NSThread detachNewThreadSelector:@selector(addKeysToAgentWithoutInteractionInNewThread) 
    340                                 toTarget:self withObject:self]; 
     347                        [keychain addKeysToAgentWithInteraction:NO]; 
    341348                } 
    342349 
     
    466473                               inMainThread:YES]; 
    467474        } 
    468  
    469         [pool release]; 
    470 } 
    471  
    472 - (void)addKeysToAgentWithoutInteractionInNewThread 
    473 { 
    474         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    475  
    476         [keychain addKeysToAgentWithInteraction:NO]; 
    477475 
    478476        [pool release]; 
     
    681679} 
    682680 
    683 - (void)checkForScreenSaver:(id)object 
    684 
    685         NSAutoreleasePool *pool; 
    686         NSTask *task; 
    687         NSPipe *thePipe; 
    688         NSString *theOutput; 
    689         int interval; 
    690          
    691         while(1) 
    692         { 
    693                 pool = [[NSAutoreleasePool alloc] init]; 
    694                  
    695                 if(([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] > 1) 
    696                 && ([[NSFileManager defaultManager] isExecutableFileAtPath:@"/bin/ps"])) 
    697                 { 
    698                         task = [[[NSTask alloc] init] autorelease]; 
    699                         thePipe = [[[NSPipe alloc] init] autorelease]; 
    700                          
    701                         [task setLaunchPath:@"/bin/ps"]; 
    702                         [task setArguments:[NSArray arrayWithObject:@"wxo command"]]; 
    703                         [task setStandardOutput:thePipe]; 
    704  
    705                         [task launch]; 
    706                         [task waitUntilExit]; 
    707  
    708                         /* Put the data from thePipe to theOutput. */ 
    709                         theOutput = [[[NSString alloc] initWithData:[[thePipe fileHandleForReading] readDataToEndOfFile] encoding:NSASCIIStringEncoding] autorelease]; 
    710          
    711                         if ([theOutput rangeOfString:@"ScreenSaverEngine.app"].location != NSNotFound) 
    712                         { 
    713                                 if((([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 2) 
    714                                 || ([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 4)) 
    715                                 && ([[agent keysOnAgent] count] > 0)) 
    716                                 { 
    717                                         [object removeKeysFromAgent:nil]; 
    718                                 } 
    719  
    720                                 if(([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 3) 
    721                                 || ([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 4)) 
    722                                 { 
    723                                         SecKeychainLockAll(); 
    724                                 } 
    725  
    726                         } 
    727                 } 
    728                  
    729                 interval = [[NSUserDefaults standardUserDefaults] integerForKey:CheckScreensaverIntervalString]; 
    730                                  
    731                 if(interval < 5) 
    732                 { 
    733                         interval = 5; 
    734                 } 
    735                  
    736                 if(interval > 100) 
    737                 { 
    738                         interval = 100; 
    739                 } 
    740                  
    741                 sleep(interval); 
    742                 [pool release]; 
     681- (void)onScreenSaver:(NSNotification *)notification 
     682
     683        if((([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 2) 
     684                || ([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 4)) 
     685           && ([[agent keysOnAgent] count] > 0)) 
     686        { 
     687                [self removeKeysFromAgent:nil]; 
     688        } 
     689 
     690        if(([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 3) 
     691           || ([[NSUserDefaults standardUserDefaults] integerForKey:OnScreensaverString] == 4)) 
     692        { 
     693                SecKeychainLockAll(); 
    743694        } 
    744695} 
  • trunk/Controller.m

    r118 r119  
    256256                } 
    257257 
    258                 /* If ~/.MacOSX is a file, instead of a directory, remove it and create a directory. */ 
     258                /* If ~/.MacOSX is a file, log and error and return */ 
    259259                else if(isDirectory == NO) 
    260260                { 
    261                         [[NSFileManager defaultManager] removeFileAtPath:macOSXDir handler:nil]; 
    262                         [[NSFileManager defaultManager] createDirectoryAtPath:macOSXDir attributes:nil]; 
     261                        NSLog(@"~/.MacOSX is a file, can not create environemnt variables"); 
     262                        return; 
     263/*                      [[NSFileManager defaultManager] removeFileAtPath:macOSXDir handler:nil]; 
     264                        [[NSFileManager defaultManager] createDirectoryAtPath:macOSXDir attributes:nil]; */ 
    263265                } 
    264266 
     
    442444                                 
    443445                                if(keychainStatus & 1) { 
    444                                         returnStatus = SecKeychainFindGenericPassword(keychain, strlen(serviceName), serviceName, strlen(accountName), accountName, &passwordLength, (void **)&kcPassword, nil); 
     446                                        returnStatus = SecKeychainFindGenericPassword( 
     447                                                keychain, strlen(serviceName), serviceName,  
     448                                                strlen(accountName), accountName, &passwordLength,  
     449                                                (void **)&kcPassword, nil); 
    445450                                         
    446451                                        if(returnStatus == 0) { 
     
    455460                else 
    456461                { 
    457                         returnStatus = SecKeychainFindGenericPassword(nil, strlen(serviceName), serviceName, strlen(accountName), accountName, &passwordLength, (void **)&kcPassword, nil); 
     462                        returnStatus = SecKeychainFindGenericPassword( 
     463                                nil, strlen(serviceName), serviceName, strlen(accountName),  
     464                                accountName, &passwordLength, (void **)&kcPassword, nil); 
    458465                } 
    459466                 
     
    466473                if(returnStatus == 0) 
    467474                { 
    468                         kcPassword[passwordLength] = '\0'; 
    469  
    470                         NSString *returnString = [NSString stringWithCString:kcPassword]; 
    471  
    472                         SecKeychainItemFreeContent(NULL, kcPassword); 
     475                        NSString *returnString; 
     476                         
     477                        if ( kcPassword[passwordLength] != 0 ) { 
     478                                /* Don't trust memory allocated from system, copy it over 
     479                                First before making it a CString */ 
     480 
     481                                NSLog(@"Buggy password in keycahin workaround"); 
     482                                char * buffer = (char*)malloc((passwordLength+1)*sizeof(char)); 
     483                                strncpy(buffer, kcPassword, passwordLength); 
     484                                buffer[passwordLength] = '\0'; 
     485                         
     486 
     487                                returnString = [NSString stringWithUTF8String:buffer]; 
     488 
     489                                SecKeychainItemFreeContent(NULL, kcPassword); 
     490                                free(buffer); 
     491                        } else { 
     492                                returnString = [NSString stringWithUTF8String:kcPassword]; 
     493 
     494                                SecKeychainItemFreeContent(NULL, kcPassword); 
     495                        } 
    473496                         
    474497                        return returnString; 
     
    542565                                serviceName = "SSHKeychain"; 
    543566                                 
    544                                 SecKeychainAddGenericPassword(nil, strlen(serviceName), serviceName, strlen(accountName), accountName, [passphrase length], (const void *)[passphrase UTF8String], nil); 
     567                                const char * utf8password = [passphrase UTF8String]; 
     568                                 
     569                                SecKeychainAddGenericPassword(nil, strlen(serviceName),  
     570                                        serviceName, strlen(accountName), accountName,  
     571                                        strlen(utf8password) + 1,  
     572                                        (const void *)utf8password, nil); 
    545573                        } 
    546574                         
  • trunk/Libs/SSHKeychain.h

    r91 r119  
    1010        BOOL addingKeys; 
    1111         
    12         int lastScheduled; 
    13  
    1412        /* Locks */ 
    1513        NSLock *keychainLock; 
    1614        NSLock *addingKeysLock; 
    17         NSLock *lastScheduledLock; 
    1815} 
    1916 
     
    4037- (BOOL)addKeysToAgent; 
    4138- (BOOL)addKeysToAgentWithInteraction:(BOOL)interaction; 
    42 - (void)removeKeysAfterTimeout:(id)object; 
    4339- (BOOL)removeKeysFromAgent; 
    4440 
  • trunk/Libs/SSHKeychain.m

    r118 r119  
    55#import "SSHKey.h" 
    66#import "SSHTool.h" 
     7#import "SSHAgent.h" 
    78 
    89#include <unistd.h> 
     
    3435        keychainLock = [[NSLock alloc] init]; 
    3536        addingKeysLock = [[NSLock alloc] init]; 
    36         lastScheduledLock = [[NSLock alloc] init]; 
    37         lastScheduled = -1; 
    3837         
    3938        [self resetToKeysWithPaths:paths]; 
     
    5251        [keychainLock release]; 
    5352        [addingKeysLock release]; 
    54         [lastScheduledLock release]; 
    5553        [agentSocketPath release]; 
    5654         
     
    110108} 
    111109 
    112 - (int) lastScheduled 
    113 { 
    114         [lastScheduledLock lock]; 
    115         int returnInt = lastScheduled; 
    116         [lastScheduledLock unlock]; 
    117  
    118         return returnInt; 
    119 } 
    120  
    121 - (void) setLastScheduled:(int) scheduledTime 
    122 { 
    123         [lastScheduledLock lock]; 
    124         lastScheduled = scheduledTime; 
    125         [lastScheduledLock unlock]; 
    126 } 
    127  
    128110/* Returns the SSHKey at Index nr. */ 
    129111- (SSHKey *)keyAtIndex:(int)nr 
     
    209191                return YES; 
    210192 
    211         if (!agentSocketPath || ![[NSFileManager defaultManager] isReadableFileAtPath:agentSocketPath]) 
     193        if (![[SSHAgent currentAgent] isRunning]) 
    212194                return NO; 
    213195         
     
    255237        } 
    256238         
    257         if ([[NSUserDefaults standardUserDefaults] integerForKey:KeyTimeoutString] > 0) 
    258         { 
    259                 int timeScheduled = time(nil); 
    260                 [self setLastScheduled:timeScheduled]; 
    261                  
    262                 [NSThread detachNewThreadSelector:@selector(removeKeysAfterTimeout:) toTarget:self  
    263                                                                 withObject:[NSNumber numberWithInt:timeScheduled]]; 
    264         } 
    265  
    266239        [[NSNotificationCenter defaultCenter]  postNotificationName:@"AgentFilled" object:nil]; 
    267240         
    268241        [self setAddingKeys:NO]; 
    269242        return YES; 
    270 } 
    271  
    272 /* Remove all keys from the ssh-agent from a NSTimer object. */ 
    273 - (void)removeKeysAfterTimeout:(id)object 
    274 { 
    275         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    276         int timeScheduled = [object intValue]; 
    277          
    278         sleep([[NSUserDefaults standardUserDefaults] integerForKey:KeyTimeoutString] * 60); 
    279          
    280         /* If the time this timeout was scheduled is still the most recent, go ahead and remove the keys */ 
    281         if (timeScheduled == [self lastScheduled])  
    282                 [self removeKeysFromAgent]; 
    283          
    284         [pool release]; 
    285243} 
    286244 
     
    290248        SSHTool *theTool = [SSHTool toolWithName:@"ssh-add"]; 
    291249 
    292         [self setLastScheduled:-1]; 
    293  
    294         if (!agentSocketPath || ![[NSFileManager defaultManager] isReadableFileAtPath:agentSocketPath]) 
     250        if (![[SSHAgent currentAgent] isRunning]) 
    295251                return NO; 
    296252 
  • trunk/SSHKeychain.xcodeproj/project.pbxproj

    r118 r119  
    7979                CCFAAB480C7C870900AD9093 /* SSHToken.m in Sources */ = {isa = PBXBuildFile; fileRef = CCFAAB460C7C870900AD9093 /* SSHToken.m */; }; 
    8080/* End PBXBuildFile section */ 
    81  
    82 /* Begin PBXBuildStyle section */ 
    83                 CCE37CF00C606DDA0073E776 /* Development */ = { 
    84                         isa = PBXBuildStyle; 
    85                         buildSettings = { 
    86                                 COPY_PHASE_STRIP = NO; 
    87                         }; 
    88                         name = Development; 
    89                 }; 
    90                 CCE37CF10C606DDA0073E776 /* Deployment */ = { 
    91                         isa = PBXBuildStyle; 
    92                         buildSettings = { 
    93                                 COPY_PHASE_STRIP = YES; 
    94                         }; 
    95                         name = Deployment; 
    96                 }; 
    97 /* End PBXBuildStyle section */ 
    9881 
    9982/* Begin PBXContainerItemProxy section */ 
     
    498481                        isa = PBXProject; 
    499482                        buildConfigurationList = CC39D6370921118A00FE3BC5 /* Build configuration list for PBXProject "SSHKeychain" */; 
    500                         buildSettings = { 
    501                         }; 
    502                         buildStyles = ( 
    503                                 CCE37CF00C606DDA0073E776 /* Development */, 
    504                                 CCE37CF10C606DDA0073E776 /* Deployment */, 
    505                         ); 
    506483                        hasScannedForEncodings = 1; 
    507484                        knownRegions = ( 
  • trunk/TokenController.h

    r118 r119  
    11#import <Cocoa/Cocoa.h> 
    2 #import "SSHToken.h" 
     2#import "Libs/SSHToken.h" 
    33#import "SSHTool.h" 
    44