5 // Created by Claudio Bisegni on 10/05/07.
6 // Copyright (c) 2007 INFN - National Institute of Nuclear Physics. All rights reserved.
9 #import "AFSCommanderPref.h"
10 #import "IpConfiguratorCommander.h"
11 #import "TokenCredentialController.h"
12 #import "InfoController.h"
14 #import "PListManager.h"
15 #import "DialogUtility.h"
16 #import "NSString+search.h"
17 #include <sys/param.h>
20 #include <sys/types.h>
21 #include <sys/fcntl.h>
22 #include <sys/errno.h>
26 #import <CoreServices/CoreServices.h>
29 #define ADD_CELL_CONTROL_TAG 1
30 #define REMOVE_CELL_CONTROL_TAG 2
32 #define TABLE_TOKENS_LIST 1
33 #define TABLE_CELL_LIST 2
34 #define TABLE_LINK_LIST 3
37 #define TAB_CELL_SERV_DB 2
42 #define CELLSRVDB_TABLE_USR_DFLT_CHECK_COLUMN 0
43 #define CELLSRVDB_TABLE_DFLT_CHECK_COLUMN 1
44 #define CELLSRVDB_TABLE_NAME_COLUMN 2
45 #define CELLSRVDB_TABLE_DESCRIPTION_COLUMN 3
48 #define TABLE_COLUMN_LINK_NAME 0
49 #define TABLE_COLUMN_LINK_PATH 1
52 @implementation AFSCommanderPref
54 // -------------------------------------------------------------------------------
56 // -------------------------------------------------------------------------------
57 - (id)initWithBundle:(NSBundle *)bundle
59 if ( ( self = [super initWithBundle:bundle] ) != nil ) {
60 //appID = kAfsCommanderID;
66 // -------------------------------------------------------------------------------
68 // -------------------------------------------------------------------------------
69 - (NSView *) mainView {
70 if (prefStartUp == 1){
73 if (Gestalt(gestaltSystemVersionMajor, &osxMJVers) == noErr && Gestalt(gestaltSystemVersionMinor, &osxMnVers) == noErr) {
74 if (osxMJVers == 10 && osxMnVers>= 5) {
75 [afsCommanderView setFrameSize:NSMakeSize(668, [afsCommanderView frame].size.height)];
81 return afsCommanderView;
84 // -------------------------------------------------------------------------------
86 // -------------------------------------------------------------------------------
87 - (void) mainViewDidLoad
90 [((NSTableView*)cellList) setDelegate:self];
91 [((NSTableView*)cellList) setTarget:self];
92 [((NSTableView*)cellList) setDoubleAction:@selector(tableDoubleAction:)];
97 // -------------------------------------------------------------------------------
99 // -------------------------------------------------------------------------------
102 //try to install the launchd file for backgrounder
103 //Remove launchd ctrl file
105 [PListManager installBackgrounderLaunchdFile:YES
106 resourcePath:[[self bundle] resourcePath]];
108 @catch (NSException * e) {
109 NSDictionary *excecptDic = [e userInfo];
110 NSNumber *keyNum = [excecptDic objectForKey:@"agent_folder_error"];
111 if(keyNum && [keyNum boolValue]) {
112 // the dir HOME_LAUNCHD_AGENT_FOLDER (PListManager.h) must be created
113 NSBeginAlertSheet([[NSString stringWithString:kDoYouWantCreateTheDirectory] stringByAppendingString:HOME_LAUNCHD_AGENT_FOLDER],
114 @"Create", @"Cancel", nil,
115 [[self mainView] window], self, @selector(credentialAtLoginTimeEventCreationLaunchAgentDir:returnCode:contextInfo:), NULL,
124 // Set Developer info
125 [textFieldDevInfoLabel setStringValue:kDevelopInfo];
127 tokensLock = [[NSLock alloc] init];
129 //Initialization cellservdb and token list
130 filteredCellDB = nil;
133 [self readPreferenceFile];
135 // alloc the afs property mananger
136 afsProperty = [[AFSPropertyManager alloc] init];
138 // register preference pane to detect menuextra killed by user
139 [[NSDistributedNotificationCenter defaultCenter] addObserver:self
140 selector:@selector(refreshTokensNotify:)
142 object:kMExtraTokenOperation];
144 [[NSDistributedNotificationCenter defaultCenter] addObserver:self
145 selector:@selector(refreshGui:)
147 object:kMenuExtraEventOccured];
149 //Register for mount/unmount afs volume
150 [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
151 selector:@selector(afsVolumeMountChange:)
152 name:NSWorkspaceDidMountNotification object:nil];
154 [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
155 selector:@selector(afsVolumeMountChange:)
156 name:NSWorkspaceDidUnmountNotification object:nil];
158 // set self as table data source
159 [cellList setDataSource:self];
160 [tokensTable setDataSource:self];
161 //[tableViewLink setDataSource:self];
162 //check the afs state
165 // let show the configuration after prefpane is open
166 [self refreshConfiguration:nil];
168 // refresh the token list
169 //[self refreshTokens:nil];
171 //refresh table to reflect the NSSearchField contained text
172 [self searchCellTextEvent:nil];
175 // -------------------------------------------------------------------------------
176 // credentialAtLoginTimeEventCreationLaunchAgentDir:
177 // -------------------------------------------------------------------------------
178 - (void) credentialAtLoginTimeEventCreationLaunchAgentDir:(NSWindow*)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo {
180 switch (returnCode) {
182 if([[NSFileManager defaultManager] createDirectoryAtPath:[HOME_LAUNCHD_AGENT_FOLDER stringByExpandingTildeInPath]
183 withIntermediateDirectories:NO
188 [PListManager installBackgrounderLaunchdFile:YES
189 resourcePath:[[self bundle] resourcePath]];
190 [self showMessage:kDirectoryCreated];
192 [self showMessage:kErrorCreatingDirectory];
201 // -------------------------------------------------------------------------------
203 // -------------------------------------------------------------------------------
206 // remove self as datasource
207 [((NSTableView*)cellList) setDataSource:nil];
208 [((NSTableView*)tokensTable) setDataSource:nil];
210 //release the afs property manager
211 if(afsProperty) [afsProperty release];
212 //release tokens list
213 if(tokenList) [tokenList release];
214 //Remove the cell temp array
215 if(filteredCellDB) [filteredCellDB release];
217 [self writePreferenceFile];
219 // unregister preference pane to detect menuextra killed by user
220 [[NSDistributedNotificationCenter defaultCenter] removeObserver:self
222 object:kMExtraClosedNotification];
223 [[NSDistributedNotificationCenter defaultCenter] removeObserver:self
225 object:kMExtraTokenOperation];
226 [[NSDistributedNotificationCenter defaultCenter] removeObserver:self
228 object:kMenuExtraEventOccured];
229 [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self
230 name:NSWorkspaceDidMountNotification object:nil];
231 [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self
232 name:NSWorkspaceDidUnmountNotification object:nil];
235 [tokensLock release];
239 // -------------------------------------------------------------------------------
241 // -------------------------------------------------------------------------------
243 //start the time for check tokens validity
244 if(timerForCheckTokensList) return;
245 timerForCheckTokensList = [NSTimer scheduledTimerWithTimeInterval:TOKENS_REFRESH_TIME_IN_SEC
247 selector:@selector(refreshTokens:)
250 [timerForCheckTokensList fire];
253 // -------------------------------------------------------------------------------
255 // -------------------------------------------------------------------------------
257 if(!timerForCheckTokensList) return;
258 [timerForCheckTokensList invalidate];
259 timerForCheckTokensList = nil;
263 // -------------------------------------------------------------------------------
264 // readPreferenceFile:
265 // -------------------------------------------------------------------------------
266 - (void) readPreferenceFile
268 // read the preference for aklog use
269 NSNumber *useAklogPrefValue = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_AKLOG, (CFStringRef)kAfsCommanderID,
270 kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
271 NSNumber *aklogTokenAtLogin = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_AKLOG_TOKEN_AT_LOGIN, (CFStringRef)kAfsCommanderID,
272 kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
273 [useAklogCheck setState:[useAklogPrefValue intValue]];
274 [aklogCredentialAtLoginTime setEnabled:useAklogPrefValue && [useAklogPrefValue boolValue]];
275 [aklogCredentialAtLoginTime setState:aklogTokenAtLogin && [aklogTokenAtLogin boolValue]];
277 //check krb5 at login time
278 [installKRB5AuthAtLoginButton setState:[PListManager checkKrb5AtLoginTimeLaunchdEnable]];
280 //check for AFS enable at startup
281 NSNumber *afsEnableStartupTime = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_START_AFS_AT_STARTUP,
282 (CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost);
283 if(afsEnableStartupTime)
284 startAFSAtLogin = [afsEnableStartupTime boolValue];
286 startAFSAtLogin = false;
287 //set the check button state
288 [checkButtonAfsAtBootTime setState:startAFSAtLogin];
290 NSNumber *showStatusMenu = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_SHOW_STATUS_MENU, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
291 [(NSButton*)afsMenucheckBox setState: [showStatusMenu boolValue]];
294 [backgrounderActivationCheck setState:[PListManager launchdJobState:BACKGROUNDER_P_FILE]];
296 //link enabled status
297 NSNumber *linkEnabledStatus = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_LINK, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
298 [checkEnableLink setState:[linkEnabledStatus boolValue]];
300 //check the user preference for manage the renew
301 NSNumber *checkRenew = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_KRB5_CHECK_ENABLE, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
302 if(checkRenew)[nsButtonEnableDisableKrb5RenewCheck setState:[checkRenew intValue]];
304 NSNumber *renewTime = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_KRB5_RENEW_TIME, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
305 if(!renewTime) renewTime = [NSNumber numberWithInt:PREFERENCE_KRB5_RENEW_TIME_DEFAULT_VALUE];
308 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
309 NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)
310 fromDate:[NSDate dateWithTimeIntervalSince1970:[renewTime intValue]]];
311 [nsTextFieldKrb5RenewTimeD setIntValue:[weekdayComponents day]-1];
312 [nsTextFieldKrb5RenewTimeH setIntValue:[weekdayComponents hour]-1];
313 [nsTextFieldKrb5RenewTimeM setIntValue:[weekdayComponents minute]];
314 [nsTextFieldKrb5RenewTimeS setIntValue:[weekdayComponents second]];
315 [nsStepperKrb5RenewTimeD setIntValue:[weekdayComponents day]-1];
316 [nsStepperKrb5RenewTimeH setIntValue:[weekdayComponents hour]-1];
317 [nsStepperKrb5RenewTimeM setIntValue:[weekdayComponents minute]];
318 [nsStepperKrb5RenewTimeS setIntValue:[weekdayComponents second]];
320 NSNumber *renewCheckTimeInterval = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_KRB5_RENEW_CHECK_TIME_INTERVALL, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
321 if(renewCheckTimeInterval && [renewCheckTimeInterval intValue])[nsTextFieldKrb5RenewCheckIntervall setIntValue:[renewCheckTimeInterval intValue]];
322 else [nsTextFieldKrb5RenewCheckIntervall setIntValue:PREFERENCE_KRB5_RENEW_CHECK_TIME_INTERVALL_DEFAULT_VALUE];
324 NSNumber *expireTimeForRenew = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_KRB5_SEC_TO_EXPIRE_TIME_FOR_RENEW, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
325 if(expireTimeForRenew && [expireTimeForRenew intValue])[nsTextFieldKrb5SecToExpireDateForRenew setIntValue:[expireTimeForRenew intValue]];
326 else [nsTextFieldKrb5SecToExpireDateForRenew setIntValue:PREFERENCE_KRB5_SEC_TO_EXPIRE_TIME_FOR_RENEW_DEFAULT_VALUE];
329 NSData *prefData = (NSData*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
330 linkConfiguration = (NSMutableDictionary*)[NSPropertyListSerialization propertyListFromData:prefData
331 mutabilityOption:NSPropertyListMutableContainers
333 errorDescription:nil];
337 // -------------------------------------------------------------------------------
339 // -------------------------------------------------------------------------------
340 - (void) writePreferenceFile
342 //Set the preference for afs path
343 //Set the preference for aklog use
344 CFPreferencesSetValue((CFStringRef)PREFERENCE_USE_AKLOG,
345 (CFNumberRef)[NSNumber numberWithInt:[useAklogCheck state]],
346 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
348 //set AFS enable state at startup
349 CFPreferencesSetValue((CFStringRef)PREFERENCE_START_AFS_AT_STARTUP,
350 (CFNumberRef)[NSNumber numberWithBool:startAFSAtLogin],
351 (CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost);
354 CFPreferencesSetValue((CFStringRef)PREFERENCE_AKLOG_TOKEN_AT_LOGIN,
355 (CFNumberRef)[NSNumber numberWithBool:[aklogCredentialAtLoginTime state]],
356 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
359 CFPreferencesSetValue((CFStringRef)PREFERENCE_SHOW_STATUS_MENU,
360 (CFNumberRef)[NSNumber numberWithBool:[(NSButton*)afsMenucheckBox state]],
361 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
363 //preference for link
364 CFPreferencesSetValue((CFStringRef)PREFERENCE_USE_LINK,
365 (CFNumberRef)[NSNumber numberWithBool:[checkEnableLink state]],
366 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
368 //preference for renew time
369 NSLog(@"%d %d %d %d", [nsTextFieldKrb5RenewTimeD intValue],[nsTextFieldKrb5RenewTimeH intValue],[nsTextFieldKrb5RenewTimeM intValue],[nsTextFieldKrb5RenewTimeS intValue]);
370 NSInteger totalSeconds = ([nsTextFieldKrb5RenewTimeD intValue]*24*60*60)+
371 ([nsTextFieldKrb5RenewTimeH intValue]*60*60)+
372 ([nsTextFieldKrb5RenewTimeM intValue]*60)+
373 [nsTextFieldKrb5RenewTimeS intValue];
375 CFPreferencesSetValue((CFStringRef)PREFERENCE_KRB5_RENEW_TIME,
376 (CFNumberRef)[NSNumber numberWithInt:totalSeconds],
377 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
379 //expire time for renew
380 CFPreferencesSetValue((CFStringRef)PREFERENCE_KRB5_SEC_TO_EXPIRE_TIME_FOR_RENEW,
381 (CFNumberRef)[NSNumber numberWithInt:[nsTextFieldKrb5SecToExpireDateForRenew intValue]],
382 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
384 //sec to expiretime for renew job
385 CFPreferencesSetValue((CFStringRef)PREFERENCE_KRB5_RENEW_CHECK_TIME_INTERVALL,
386 (CFNumberRef)[NSNumber numberWithInt:[nsTextFieldKrb5RenewCheckIntervall intValue]],
387 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
389 CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost);
390 CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
391 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kPrefChangeNotification];
394 // -------------------------------------------------------------------------------
395 // saveConfiguration:
396 // -------------------------------------------------------------------------------
397 - (IBAction) saveConfiguration:(id) sender
401 //[afsProperty setCellName:[cellNameTextEdit stringValue]];
402 [afsProperty setCellName:[afsProperty getDefaultCellName]];
404 //save configurations
405 [afsProperty saveConfigurationFiles:YES];
408 //Reload all configuration
409 [self refreshConfiguration:nil];
411 //refresh table to reflect the NSSearchField contained text
412 [self searchCellTextEvent:nil];
414 //Show dialog for notifity al saving process ar gone ell
415 [self showMessage:kConfigurationSaved];
416 }@catch(NSException *e){
417 [self showMessage:[e reason]];
419 [((NSTableView*)cellList) reloadData];
424 // -------------------------------------------------------------------------------
425 // saveCacheManagerParam:
426 // -------------------------------------------------------------------------------
427 - (IBAction) saveCacheManagerParam:(id) sender
430 //Update the value form view to afs property manager class
431 [self updateCacheParamFromView];
432 [afsProperty saveCacheConfigurationFiles:YES];
433 [self showMessage:kSavedCacheConfiguration];
434 }@catch(NSException *e){
435 [self showMessage:[e reason]];
437 [((NSTableView*)cellList) reloadData];
441 // -------------------------------------------------------------------------------
442 // refreshConfiguration:
443 // -------------------------------------------------------------------------------
444 - (IBAction) refreshConfiguration:(id) sender
446 NSString *afsBasePath = PREFERENCE_AFS_SYS_PAT_STATIC;
449 [afsProperty setPath:afsBasePath];
451 // load configuration
452 [afsProperty loadConfiguration];
454 //set the afs version label
455 [afsVersionLabel setStringValue:[afsProperty getAfsVersion]];
457 //set the current default cell
458 [afsDefaultCellLabel setStringValue:[afsProperty getDefaultCellName]];
461 [self fillCacheParamView];
463 //Filter the cellServDb and allocate filtered array
464 [self filterCellServDB:nil];
466 }@catch(NSException *e){
467 [self showMessage:[e reason]];
469 [((NSTableView*)cellList) reloadData];
473 // -------------------------------------------------------------------------------
474 // fillCacheParamView:
475 // -------------------------------------------------------------------------------
476 -(void) fillCacheParamView
478 [dynRoot setState:[afsProperty dynRoot]?NSOnState:NSOffState];
479 [afsDB setState:[afsProperty afsDB]?NSOnState:NSOffState];
480 [statCacheEntry setIntValue:[afsProperty statCacheEntry]];
481 [dCacheDim setIntValue:[afsProperty dCacheDim]];
482 [cacheDimension setIntValue:[afsProperty cacheDimension]];
483 [daemonNumber setIntValue:[afsProperty daemonNumber]];
484 [afsRootMountPoint setStringValue:[afsProperty afsRootMountPoint]];
485 [nVolEntry setIntValue:[afsProperty nVolEntry]];
487 //new version property
488 //[verbose setEnabled:[afsProperty useAfsdConfConfigFile]];
489 [verbose setState:[afsProperty verbose]?NSOnState:NSOffState];
493 // -------------------------------------------------------------------------------
494 // updateCacheParamFromView:
495 // -------------------------------------------------------------------------------
496 -(void) updateCacheParamFromView
498 NSString *tmpAfsPath = [afsRootMountPoint stringValue];
499 if(!tmpAfsPath || ([tmpAfsPath length] == 0) || ([tmpAfsPath characterAtIndex:0] != '/'))
500 @throw [NSException exceptionWithName:@"updateCacheParamFromView"
501 reason:kBadAfsRootMountPoint
505 [afsProperty setDynRoot:[dynRoot state]==NSOnState];
506 [afsProperty setAfsDB:[afsDB state]==NSOnState];
507 [afsProperty setStatCacheEntry:[statCacheEntry intValue]];
508 [afsProperty setDCacheDim:[dCacheDim intValue]];
509 [afsProperty setCacheDimension:[cacheDimension intValue]];
510 [afsProperty setDaemonNumber:[daemonNumber intValue]];
511 [afsProperty setAfsRootMountPoint:tmpAfsPath];
512 [afsProperty setNVolEntry:[nVolEntry intValue]];
513 [afsProperty setVerbose:[verbose state]==NSOnState];
517 // -------------------------------------------------------------------------------
519 // -------------------------------------------------------------------------------
520 - (IBAction) showCellIP:(id) sender
522 int rowSelected = [((NSTableView *) cellList) selectedRow];
523 [self modifyCellByIDX:rowSelected];
526 // -------------------------------------------------------------------------------
528 // -------------------------------------------------------------------------------
529 -(void) modifyCellByIDX:(int) idx
531 [self modifyCell:[self getCellByIDX:idx]];
534 // -------------------------------------------------------------------------------
536 // -------------------------------------------------------------------------------
537 -(void) modifyCell:(DBCellElement*) cellElement
539 [NSBundle loadNibNamed:@"IpPanel" owner:self];
540 [((IpConfiguratorCommander*) ipConfControllerCommander) setWorkCell:cellElement];
541 [NSApp beginSheet: ipConfigurationSheet
542 modalForWindow: [[self mainView] window]
544 didEndSelector: @selector(didEndSheet:returnCode:contextInfo:)
548 // -------------------------------------------------------------------------------
550 // -------------------------------------------------------------------------------
551 - (IBAction) addRemoveCell:(id) sender
553 switch([((NSControl*) sender) tag]){
554 case ADD_CELL_CONTROL_TAG:
556 DBCellElement *newCell = [[DBCellElement alloc] init];
559 [newCell setCellName:kNewCellName];
560 [newCell setCellComment:kNewCellComment];
562 [[afsProperty getCellList] addObject:newCell];
566 [self modifyCell:newCell];
570 case REMOVE_CELL_CONTROL_TAG:
573 NSIndexSet *selectedIndex = [(NSTableView*)cellList selectedRowIndexes];
574 if( [selectedIndex count] > 0) {
575 index = [selectedIndex firstIndex];
577 DBCellElement *cellElement = (DBCellElement*)[filteredCellDB objectAtIndex:index];
578 [[afsProperty getCellList] removeObject:cellElement];
579 } while ((index = [selectedIndex indexGreaterThanIndex:index]) != NSNotFound);
584 //Filter the cellServDb and allocate filtered array
585 [self searchCellTextEvent:nil];
586 [(NSTableView*)cellList deselectAll:nil];
587 [(NSTableView*)cellList reloadData];
590 // -------------------------------------------------------------------------------
592 // -------------------------------------------------------------------------------
593 - (void) repairHelperTool
598 NSLog(@"repairHelperTool");
599 NSString *afshlpPath = [[self bundle] pathForResource:@"afshlp" ofType:nil];
603 // Open tool exclusively, so nobody can change it while we bless it.
604 fdTool = open([afshlpPath UTF8String], O_NONBLOCK | O_RDONLY | O_EXLOCK, 0);
608 NSLog(@"Exclusive open while repairing tool failed: %d.", errno);
612 if(fstat(fdTool, &st))
614 NSLog(@"fstat failed.");
620 status = [[AuthUtil shared] autorize];
622 fchown(fdTool, 0, st.st_gid);
624 // Disable group and world writability and make setuid root.
625 fchmod(fdTool, (st.st_mode & (~(S_IWGRP | S_IWOTH)))/* | S_ISUID*/);
626 const char *args[] = {"root", [afshlpPath UTF8String],0L};
627 [[AuthUtil shared] execUnixCommand:"/usr/sbin/chown"
630 [[AuthUtil shared] deautorize];
632 } else NSLog(@"st_uid = 0");
638 NSLog(@"Self-repair done.");
643 // -------------------------------------------------------------------------------
645 // -------------------------------------------------------------------------------
646 - (IBAction) startStopAfs:(id) sender
648 BOOL currentAfsState = NO;
650 currentAfsState = [afsProperty checkAfsStatus];
651 // make the parameter to call the root helper app
654 NSLog(@"Shutting down afs");
655 [afsProperty shutdown];
658 NSLog(@"Starting up afs");
659 [afsProperty startup];
661 [self refreshGui:nil];
663 @catch (NSException * e) {
664 [self showMessage:[e reason]];
667 [[AuthUtil shared] deautorize];
671 // -------------------------------------------------------------------------------
673 // -------------------------------------------------------------------------------
674 - (void) refreshGui:(NSNotification *)notification{
675 BOOL afsIsUp = [afsProperty checkAfsStatus];
677 [tokensButton setEnabled:afsIsUp];
678 [unlogButton setEnabled:afsIsUp];
682 // -------------------------------------------------------------------------------
683 // -(void) refreshTokensNotify:(NSNotification*)notification
684 // -------------------------------------------------------------------------------
685 -(void) refreshTokensNotify:(NSNotification*)notification {
686 [self refreshTokens:nil];
689 // -------------------------------------------------------------------------------
690 // afsVolumeMountChange: Track the afs volume state change
691 // -------------------------------------------------------------------------------
692 - (void) afsVolumeMountChange:(NSNotification *)notification{
693 // Cehck if is mounted or unmounted afs
694 if([[[notification userInfo] objectForKey:@"NSDevicePath"] isEqualToString:@"/afs"]){
696 [self refreshTokens:nil];
700 // -------------------------------------------------------------------------------
702 // -------------------------------------------------------------------------------
703 - (IBAction) info:(id) sender
705 [((InfoController*) infoController) showHtmlResource:[[self bundle] pathForResource:@"license" ofType:@"rtf"]];
707 [NSApp beginSheet: infoSheet
708 modalForWindow: [[self mainView] window]
710 didEndSelector: @selector(didEndInfoSheet:returnCode:contextInfo:)
714 // -------------------------------------------------------------------------------
715 // tableDoubleAction:
716 // -------------------------------------------------------------------------------
717 - (IBAction) tableDoubleAction:(id) sender
719 [self showCellIP:nil];
722 // -------------------------------------------------------------------------------
724 // -------------------------------------------------------------------------------
725 - (IBAction) getNewToken:(id) sender
727 BOOL useAklog = [useAklogCheck state] == NSOnState;
729 //[AFSPropertyManager aklog];
730 [afsProperty getTokens:false
733 [self refreshTokens:nil];
734 //Inform afs menuextra to updata afs status
735 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kMExtraAFSStateChange];
738 [NSBundle loadNibNamed:@"CredentialPanel" owner:self];
739 [NSApp beginSheet: credentialSheet
740 modalForWindow: [[self mainView] window]
742 didEndSelector: @selector(didEndCredentialSheet:returnCode:contextInfo:)
748 // -------------------------------------------------------------------------------
749 // getCurrentCellInDB:
750 // -------------------------------------------------------------------------------
751 - (IBAction) unlog:(id) sender
754 NSIndexSet *selectedIndex = [(NSTableView*)tokensTable selectedRowIndexes];
755 if( [selectedIndex count] > 0) {
756 index = [selectedIndex firstIndex];
758 NSString *tokenDesc = [tokenList objectAtIndex:index];
759 NSString *cellToUnlog = [tokenDesc estractTokenByDelimiter:@"afs@"
761 [afsProperty unlog:cellToUnlog];
762 } while ((index = [selectedIndex indexGreaterThanIndex: index]) != NSNotFound);
764 [afsProperty unlog:nil];
766 [self refreshTokens:nil];
767 //Inform afs menuextra to updata afs status
768 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kMExtraAFSStateChange];
773 // -------------------------------------------------------------------------------
775 // -------------------------------------------------------------------------------
776 - (IBAction) aklogSwitchEvent:(id) sender
778 //afs menu extra is loaded inform it to read preference
780 if(![useAklogCheck state]) {
781 //deselect the checkbox
782 [aklogCredentialAtLoginTime setState:NO];
785 [self writePreferenceFile];
787 //Enable disable aklog at login time checkbox according the useAklog checkbox
788 [aklogCredentialAtLoginTime setEnabled:[useAklogCheck state]];
791 @catch (NSException * e) {
792 [self showMessage:[e reason]];
798 // -------------------------------------------------------------------------------
799 // credentialAtLoginTimeEvent:
800 // -------------------------------------------------------------------------------
801 - (IBAction) credentialAtLoginTimeEvent:(id) sender {
802 [self writePreferenceFile];
805 // -------------------------------------------------------------------------------
806 // afsStartupSwitchEvent:
807 // -------------------------------------------------------------------------------
808 - (IBAction) afsStartupSwitchEvent:(id) sender {
809 NSString *rootHelperApp = [[self bundle] pathForResource:@"afshlp" ofType:@""];
811 startAFSAtLogin = [checkButtonAfsAtBootTime state];
812 const char *startupConfigureOption[] = {"start_afs_at_startup", startAFSAtLogin?"enable":"disable", 0L};
813 if([[AuthUtil shared] autorize] == noErr) {
814 //now disable the launchd configuration
815 [[AuthUtil shared] execUnixCommand:[rootHelperApp UTF8String]
816 args:startupConfigureOption
822 // -------------------------------------------------------------------------------
823 // afsMenuActivationEvent:
824 // -------------------------------------------------------------------------------
825 - (IBAction) krb5KredentialAtLoginTimeEvent:(id) sender {
827 NSString *rootHelperApp = [[self bundle] pathForResource:@"afshlp" ofType:@""];
828 const char *args[] = {"enable_krb5_startup", [[installKRB5AuthAtLoginButton stringValue] UTF8String], "", 0L};
831 [self repairHelperTool];
832 if([[AuthUtil shared] autorize] == noErr) {
833 [[AuthUtil shared] execUnixCommand:[rootHelperApp UTF8String]
837 //check if all is gone well
838 [installKRB5AuthAtLoginButton setState:[PListManager checkKrb5AtLoginTimeLaunchdEnable]];
842 // -------------------------------------------------------------------------------
843 // afsMenuActivationEvent:
844 // -------------------------------------------------------------------------------
845 -(IBAction) afsMenuActivationEvent:(id) sender
847 CFPreferencesSetValue((CFStringRef)PREFERENCE_SHOW_STATUS_MENU,
848 (CFNumberRef)[NSNumber numberWithBool:[(NSButton*)afsMenucheckBox state]],
849 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
851 CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost);
852 CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
854 //notify the backgrounder
855 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kMExtraAFSMenuChangeState];
858 // -------------------------------------------------------------------------------
859 // searchCellTextEvent:
860 // Fileter the CellServDB list according to NSSearch content
861 // -------------------------------------------------------------------------------
862 - (IBAction) searchCellTextEvent:(id) sender
865 NSString *searchText = [[textSearchField stringValue] lowercaseString]; //filter string
866 [self filterCellServDB:searchText];
867 [((NSTableView*)cellList) reloadData];
870 // -------------------------------------------------------------------------------
871 // clearCellServDBFiltering:
872 // clear the NSSearchField and showw all CellServDB table
873 // -------------------------------------------------------------------------------
874 - (void) clearCellServDBFiltering {
875 //Clear the text search
876 [textSearchField setStringValue:@""];
877 //load the temp array with all cell servdb
878 [self searchCellTextEvent:nil];
880 // --------------------------------------o-----------------------------------------
882 // make the NSMutableArray with all cellservdb or filtered element
883 // -------------------------------------------------------------------------------
884 - (void) filterCellServDB:(NSString*)textToFilter {
885 DBCellElement *cellElement; //Filtered element
886 BOOL doFilter = !(textToFilter == nil || ([textToFilter length] == 0));
888 // We can do filtering and make the temp array
890 [filteredCellDB release];
892 filteredCellDB = [[NSMutableArray alloc] init];
893 NSEnumerator *e = [[afsProperty getCellList] objectEnumerator];
894 while(cellElement = (DBCellElement*)[e nextObject]) {
895 // check if the element can be get
897 //Get the CellServDB array enumerator
898 NSRange rsltRng = [[[cellElement getCellName] lowercaseString] rangeOfString:textToFilter];
899 if(rsltRng.location != NSNotFound) {
900 //we can add this cell to filtered
901 [filteredCellDB addObject:[cellElement retain]];
904 [filteredCellDB addObject:[cellElement retain]];
910 // -------------------------------------------------------------------------------
911 // getCurrentCellInDB:
912 // -------------------------------------------------------------------------------
913 - (DBCellElement*) getCurrentCellInDB
915 int rowSelected = [((NSTableView *) cellList) selectedRow];
916 return [self getCellByIDX:rowSelected];
919 // -------------------------------------------------------------------------------
920 // getCurrentCellInDB:
921 // -------------------------------------------------------------------------------
922 - (DBCellElement*) getCellByIDX:(int) idx
924 //NSMutableArray *cellArray = [afsProperty getCellList];
925 DBCellElement *cellElement = (DBCellElement*)[filteredCellDB objectAtIndex:idx];
929 // -------------------------------------------------------------------------------
931 // -------------------------------------------------------------------------------
932 -(void) showMessage:(NSString*) message{
933 NSAlert *alert = [[NSAlert alloc] init];
935 [alert setMessageText:message];
936 [alert beginSheetModalForWindow:[[self mainView] window]
943 // -------------------------------------------------------------------------------
945 // -------------------------------------------------------------------------------
949 BOOL afsIsUp = [afsProperty checkAfsStatus];
950 BOOL afsEnabledAtStartup = NO;
952 NSMutableString *commandOutput = [NSMutableString stringWithCapacity:20];
953 NSString *rootHelperApp = [[self bundle] pathForResource:@"afshlp" ofType:@""];
956 // make the parameter to call the root helper app
957 const char *checkAFSDaemonParam[] = {"check_afs_daemon", 0L};
958 if([[AuthUtil shared] autorize] == noErr) {
959 //now disable the launchd configuration
960 [[AuthUtil shared] execUnixCommand:[rootHelperApp UTF8String]
961 args:checkAFSDaemonParam
962 output:commandOutput];
963 afsEnabledAtStartup = [commandOutput rangeOfString:@"afshlp:afs daemon registration result:1"].location!=NSNotFound;
966 afsEnabledAtStartup = 1;
972 [((NSButton *)startStopButton) setTitle: (afsIsUp?kAfsButtonShutdown:kAfsButtonStartup)];
974 NSMutableAttributedString *colorTitle =[[NSMutableAttributedString alloc] initWithAttributedString:[((NSButton *)startStopButton) attributedTitle]];
975 NSRange titleRange = NSMakeRange(0, [colorTitle length]);
977 [colorTitle addAttribute:NSForegroundColorAttributeName
978 value:(afsIsUp?[NSColor redColor]:[NSColor blackColor])
981 [((NSButton *)startStopButton) setAttributedTitle:colorTitle];
982 [checkButtonAfsAtBootTime setState:afsEnabledAtStartup];
990 // -------------------------------------------------------------------------------
992 // -------------------------------------------------------------------------------
993 - (void) refreshTokens:(NSTimer*)theTimer;
995 if(![tokensLock tryLock]) return;
1000 tokenList = [afsProperty getTokenList];
1001 [((NSTableView*)tokensTable) reloadData];
1002 [tokensLock unlock];
1005 // -------------------------------------------------------------------------------
1007 // -------------------------------------------------------------------------------
1008 - (IBAction) addLink:(id) sender {
1009 [NSBundle loadNibNamed:@"SymLinkEdit" owner:self];
1011 [NSApp beginSheet: lyncCreationSheet
1012 modalForWindow: [[self mainView] window]
1014 didEndSelector: @selector(didEndSymlinkSheet:returnCode:contextInfo:)
1019 // -------------------------------------------------------------------------------
1021 // -------------------------------------------------------------------------------
1022 - (IBAction) removeLink:(id) sender {
1023 if(!linkConfiguration) return;
1025 NSArray *keys = [linkConfiguration allKeys];
1026 NSIndexSet *linkToRemove = [tableViewLink selectedRowIndexes];
1027 if( [linkToRemove count] > 0) {
1028 index = [linkToRemove firstIndex];
1030 [linkConfiguration removeObjectForKey:[keys objectAtIndex:index]];
1031 } while ((index = [linkToRemove indexGreaterThanIndex:index]) != -1);
1034 //write the new configuration
1035 NSData *prefData = nil;
1036 if([linkConfiguration count] > 0) {
1037 prefData = [NSPropertyListSerialization dataWithPropertyList:linkConfiguration
1038 format:NSPropertyListXMLFormat_v1_0
1042 CFPreferencesSetValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION,
1043 (CFDataRef)prefData,
1044 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
1046 CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
1048 //reload the new data
1049 [tableViewLink reloadData];
1052 // -------------------------------------------------------------------------------
1054 // -------------------------------------------------------------------------------
1055 - (IBAction) enableLink:(id) sender {
1056 [self writePreferenceFile];
1059 // -------------------------------------------------------------------------------
1061 // -------------------------------------------------------------------------------
1062 - (IBAction) manageBackgrounderActivation:(id)sender {
1063 [PListManager launchctlCommand:[(NSButton*)sender state]
1065 option:[NSArray arrayWithObjects:@"-S", @"Aqua", nil]
1066 plistName:[NSString stringWithFormat:@"%@.plist", BACKGROUNDER_P_FILE]];
1067 //re ad the status to check taht all is gone well
1068 [backgrounderActivationCheck setState:[PListManager launchdJobState:BACKGROUNDER_P_FILE]];
1071 // -------------------------------------------------------------------------------
1072 // tableViewLinkPerformClick:
1073 // -------------------------------------------------------------------------------
1074 - (IBAction) tableViewLinkPerformClick:(id) sender {
1075 NSLog(@"tableViewLinkPerformClick");
1078 // -------------------------------------------------------------------------------
1079 // - (void)tabView:(NSTabView *)tabView willSelectTabViewItem: (NSTabViewItem *)tabViewItem
1080 // -------------------------------------------------------------------------------
1081 - (void)tabView:(NSTabView *)tabView willSelectTabViewItem: (NSTabViewItem *)tabViewItem
1083 //check to see if the cache param tab is the tab that will be selected
1084 if([((NSString*)[tabViewItem identifier]) intValue] == TAB_LINK)
1086 [tableViewLink reloadData];
1089 // -------------------------------------------------------------------------------
1090 // tableViewLinkPerformClick:
1091 // -------------------------------------------------------------------------------
1092 - (IBAction) enableDisableKrb5RenewCheck:(id) sender {
1093 //NSLog(@"enableDisableKrb5RenewCheck");
1094 CFPreferencesSetValue((CFStringRef)PREFERENCE_KRB5_CHECK_ENABLE,
1095 (CFNumberRef) [NSNumber numberWithInt:[(NSButton*)sender intValue]],
1096 (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
1097 CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
1098 //notify the backgrounder
1099 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kPrefChangeNotification];
1101 // -------------------------------------------------------------------------------
1102 // tableViewLinkPerformClick:
1103 // -------------------------------------------------------------------------------
1104 - (IBAction) krb5RenewParamChange:(id) sender {
1108 @implementation AFSCommanderPref (NSTableDataSource)
1111 // -------------------------------------------------------------------------------
1113 // Manage the checkbox of CellServDB Table
1115 // -------------------------------------------------------------------------------
1116 - (void)tableView:(NSTableView *)table
1117 setObjectValue:(id)data
1118 forTableColumn:(NSTableColumn *)col
1121 NSString *identifier = (NSString*)[col identifier];
1122 switch([table tag]){
1123 case TABLE_TOKENS_LIST:
1126 case TABLE_CELL_LIST:
1127 // we are editing checkbox for cellservdb table
1128 if([identifier intValue] == CELLSRVDB_TABLE_USR_DFLT_CHECK_COLUMN) {
1129 // set the user default cell
1130 DBCellElement *cellElement = (DBCellElement*)[filteredCellDB objectAtIndex:row];
1131 [afsProperty setDefaultCellByName:[cellElement getCellName]];
1132 //[afsDefaultCellLabel setStringValue:[afsProperty getDefaultCellName]];
1133 [((NSTableView*)cellList) reloadData];
1134 } else if([identifier intValue] == CELLSRVDB_TABLE_DFLT_CHECK_COLUMN) {
1135 // set the cell for wich the user want to get token
1136 DBCellElement *cellElement = (DBCellElement*)[filteredCellDB objectAtIndex:row];
1137 [cellElement setUserDefaultForToken:![cellElement userDefaultForToken]];
1145 // -------------------------------------------------------------------------------
1147 // refresh delegate method for two AFSCommander table
1148 // -------------------------------------------------------------------------------
1149 - (id) tableView:(NSTableView *) aTableView
1150 objectValueForTableColumn:(NSTableColumn *) aTableColumn
1155 NSString *identifier = (NSString*)[aTableColumn identifier];
1156 switch([aTableView tag]){
1157 case TABLE_TOKENS_LIST:
1158 //We are refreshing tokens table
1159 result = [self getTableTokensListValue:[identifier intValue] row:rowIndex];
1162 case TABLE_CELL_LIST:
1163 //We are refreshing cell db table
1164 result = [self getTableCelListValue:[identifier intValue] row:rowIndex];
1167 case TABLE_LINK_LIST:
1168 result = [self getTableLinkValue:[identifier intValue] row:rowIndex];
1177 // -------------------------------------------------------------------------------
1178 // getTableCelListValue:
1179 // -------------------------------------------------------------------------------
1180 - (id)getTableTokensListValue:(int) colId row:(int)row
1183 if(!tokenList) return nil;
1186 result = (NSString*)[tokenList objectAtIndex:row];
1193 // -------------------------------------------------------------------------------
1194 // getTableCelListValue:
1195 // -------------------------------------------------------------------------------
1196 - (id)getTableCelListValue:(int) colId row:(int)row
1199 //NSMutableArray *cellArray = [afsProperty getCellList];
1200 DBCellElement *cellElement = (DBCellElement*)[filteredCellDB objectAtIndex:row];
1202 case CELLSRVDB_TABLE_USR_DFLT_CHECK_COLUMN:
1203 result = [NSNumber numberWithInt:[cellElement userDefaultForCell]];
1206 case CELLSRVDB_TABLE_DFLT_CHECK_COLUMN:
1207 result = [NSNumber numberWithInt:[cellElement userDefaultForToken]];
1209 case CELLSRVDB_TABLE_NAME_COLUMN:
1210 result = [cellElement getCellName];
1213 case CELLSRVDB_TABLE_DESCRIPTION_COLUMN:
1214 result = [cellElement getCellComment];
1220 // -------------------------------------------------------------------------------
1221 // getTableCelListValue:
1222 // -------------------------------------------------------------------------------
1223 - (id)getTableLinkValue:(int) colId row:(int)row
1226 NSArray *allKey = [linkConfiguration allKeys];
1228 case TABLE_COLUMN_LINK_NAME:
1229 result = [allKey objectAtIndex:row];
1232 case TABLE_COLUMN_LINK_PATH:
1233 result = [linkConfiguration objectForKey:[allKey objectAtIndex:row]];
1240 // -------------------------------------------------------------------------------
1241 // numberOfRowsInTableView:
1242 // -------------------------------------------------------------------------------
1243 - (int)numberOfRowsInTableView:(NSTableView *)aTableView
1246 //NSMutableArray *cellArray = nil;
1247 switch([aTableView tag]){
1248 case TABLE_TOKENS_LIST:
1249 if(tokenList) rowCount = [tokenList count];
1252 case TABLE_CELL_LIST:
1253 //cellArray = [afsProperty getCellList];
1254 if(filteredCellDB) rowCount = [filteredCellDB count];
1257 case TABLE_LINK_LIST:
1258 if(linkConfiguration) rowCount = [linkConfiguration count];
1268 @implementation AFSCommanderPref (TableDelegate)
1269 // -------------------------------------------------------------------------------
1270 // selectionShouldChangeInTableView:
1271 // -------------------------------------------------------------------------------
1272 - (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTable
1274 switch([aTable tag]){
1275 case TABLE_TOKENS_LIST:
1279 case TABLE_CELL_LIST:
1280 [self tableViewCellmanageButtonState:[aTable selectedRow]];
1283 case TABLE_LINK_LIST:
1292 // -------------------------------------------------------------------------------
1294 // -------------------------------------------------------------------------------
1295 - (BOOL)tableView:(NSTableView *)aTable shouldSelectRow:(int)aRow
1297 switch([aTable tag]){
1298 case TABLE_TOKENS_LIST:
1302 case TABLE_CELL_LIST:
1303 [self tableViewCellmanageButtonState:aRow];
1306 case TABLE_LINK_LIST:
1315 // -------------------------------------------------------------------------------
1317 // -------------------------------------------------------------------------------
1318 - (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
1319 NSTableView *aTable = [aNotification object];
1320 switch([aTable tag]){
1321 case TABLE_TOKENS_LIST:
1324 case TABLE_CELL_LIST:
1327 case TABLE_LINK_LIST:
1328 [self tableViewLinkmanageButtonState:[aTable selectedRowIndexes]];
1334 // -------------------------------------------------------------------------------
1335 // manageButtonState:
1336 // -------------------------------------------------------------------------------
1337 -(void) tableViewCellmanageButtonState:(int) rowSelected {
1338 [((NSControl*) cellIpButton) setEnabled:rowSelected >= 0];
1339 [((NSControl*) removeCellButton) setEnabled:rowSelected >= 0];
1342 // -------------------------------------------------------------------------------
1343 // manageButtonState:
1344 // -------------------------------------------------------------------------------
1345 -(void) tableViewLinkmanageButtonState:(NSIndexSet *) rowsSelectedIndex {
1346 [buttonRemoveLink setEnabled:[rowsSelectedIndex count]>0];
1351 @implementation AFSCommanderPref (ModalDelegate)
1352 // -------------------------------------------------------------------------------
1354 // -------------------------------------------------------------------------------
1355 - (void)didEndSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
1357 [sheet orderOut:self];
1358 //Filter the cellServDb and allocate filtered array
1359 [self searchCellTextEvent:nil];
1360 [((NSTableView*)cellList) reloadData];
1363 // -------------------------------------------------------------------------------
1364 // Klog credential request
1365 // -------------------------------------------------------------------------------
1366 - (void)didEndCredentialSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
1368 if([((TokenCredentialController*)credentialCommander) takenToken] == YES){
1369 /*[AFSPropertyManager klog:[((TokenCredentialController*)credentialCommander) uName]
1370 uPwd:[((TokenCredentialController*)credentialCommander) uPwd] ];*/
1371 [afsProperty getTokens:true
1372 usr:[((TokenCredentialController*)credentialCommander) uName]
1373 pwd:[((TokenCredentialController*)credentialCommander) uPwd]];
1375 [sheet orderOut:self];
1376 [self refreshTokens:nil];
1377 //Inform afs menuextra to updata afs status
1378 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kMExtraAFSStateChange];
1382 // -------------------------------------------------------------------------------
1383 // Klog credential request
1384 // -------------------------------------------------------------------------------
1385 - (void)didEndInfoSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
1387 [sheet orderOut:self];
1390 // -------------------------------------------------------------------------------
1392 // -------------------------------------------------------------------------------
1393 - (void)didEndSymlinkSheet:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
1395 [lyncCreationSheet orderOut:self];
1396 [self readPreferenceFile];
1397 [tableViewLink reloadData];