From: Justin Anderson Date: Wed, 1 Oct 2008 20:38:26 +0000 (+0000) Subject: Update enterIdentity handler to support passing and setting ticket options. X-Git-Tag: krb5-1.7-alpha1~374 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=2d42fe9100d1f1565cb1876ebe01340e5280b7fa;p=krb5.git Update enterIdentity handler to support passing and setting ticket options. Readded ticket options sheet to Enter Identity dialog. Added helper methods to convert between kim_option and NSDictionary. ticket: 6055 git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20797 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/kim/agent/mac/AuthenticationController.h b/src/kim/agent/mac/AuthenticationController.h index 5fcb612c0..ed5d9d79a 100644 --- a/src/kim/agent/mac/AuthenticationController.h +++ b/src/kim/agent/mac/AuthenticationController.h @@ -54,6 +54,12 @@ IBOutlet NSButton *rememberPasswordInKeychainCheckBox; IBOutlet NSObjectController *glueController; + + IBOutlet NSWindow *ticketOptionsSheet; + IBOutlet NSObjectController *ticketOptionsController; + + IBOutlet NSSlider *validLifetimeSlider; + IBOutlet NSSlider *renewableLifetimeSlider; } @property (readwrite, retain) IPCClient *associatedClient; @@ -73,4 +79,14 @@ - (IBAction) changePassword: (id) sender; - (IBAction) showedError: (id) sender; +- (IBAction) sliderDidChange: (id) sender; + +- (IBAction) showTicketOptions: (id) sender; +- (IBAction) cancelTicketOptions: (id) sender; +- (IBAction) saveTicketOptions: (id) sender; + +- (void) sheetDidEnd: (NSWindow *) sheet + returnCode: (int) returnCode + contextInfo: (void *) contextInfo; + @end diff --git a/src/kim/agent/mac/AuthenticationController.m b/src/kim/agent/mac/AuthenticationController.m index 6a9b668bb..1756e5aab 100644 --- a/src/kim/agent/mac/AuthenticationController.m +++ b/src/kim/agent/mac/AuthenticationController.m @@ -72,17 +72,18 @@ #define enable_prompt_ok_keypath @"content.isPromptValid" #define change_password_ok_keypath @"content.isChangePasswordValid" +#define options_keypath @"content.options" + #define valid_lifetime_keypath @"content.valid_lifetime" #define renewal_lifetime_keypath @"content.renewal_lifetime" #define renewable_keypath @"content.renewable" #define addressless_keypath @"content.addressless" #define forwardable_keypath @"content.forwardable" -#define max_valid_lifetime_keypath @"content.max_valid_lifetime" -#define min_valid_lifetime_keypath @"content.min_valid_lifetime" -#define max_renewal_lifetime_keypath @"content.max_renewal_lifetime" -#define min_renewal_lifetime_keypath @"content.min_renewal_lifetime" - +#define min_valid_keypath @"content.minValidLifetime" +#define max_valid_keypath @"content.maxValidLifetime" +#define min_renewable_keypath @"content.minRenewableLifetime" +#define max_renewable_keypath @"content.maxRenewableLifetime" #define ACKVOContext @"authenticationController" @@ -109,6 +110,10 @@ - (void) awakeFromNib { + [[self window] center]; + // We need to float over the loginwindow and SecurityAgent so use its hardcoded level. + [[self window] setLevel:2003]; + [glueController addObserver:self forKeyPath:username_keypath options:NSKeyValueObservingOptionNew @@ -134,9 +139,6 @@ options:NSKeyValueObservingOptionNew context:ACKVOContext]; - [[self window] center]; - // We need to float over the loginwindow and SecurityAgent so use its hardcoded level. - [[self window] setLevel:2003]; } - (void) dealloc @@ -336,6 +338,79 @@ [self showWindow:nil]; } +- (IBAction) sliderDidChange: (id) sender +{ + NSInteger increment = 0; + NSInteger newValue = 0; + NSString *keyPath = nil; + if ([sender isEqual:validLifetimeSlider]) { + increment = VALID_LIFETIME_INCREMENT; + keyPath = valid_lifetime_keypath; + } + else if ([sender isEqual:renewableLifetimeSlider]) { + increment = RENEWABLE_LIFETIME_INCREMENT; + keyPath = renewal_lifetime_keypath; + } + if (increment > 0) { + newValue = ([sender integerValue] / increment) * increment; + [ticketOptionsController setValue:[NSNumber numberWithInteger:newValue] + forKeyPath:keyPath]; + } +} + +- (IBAction) showTicketOptions: (id) sender +{ + // use a copy of the current options + [ticketOptionsController setContent: + [[[glueController valueForKeyPath:options_keypath] mutableCopy] autorelease]]; + + [ticketOptionsController setValue:[NSNumber numberWithInteger:[KIMUtilities minValidLifetime]] + forKeyPath:min_valid_keypath]; + [ticketOptionsController setValue:[NSNumber numberWithInteger:[KIMUtilities maxValidLifetime]] + forKeyPath:max_valid_keypath]; + [ticketOptionsController setValue:[NSNumber numberWithInteger:[KIMUtilities minRenewableLifetime]] + forKeyPath:min_renewable_keypath]; + [ticketOptionsController setValue:[NSNumber numberWithInteger:[KIMUtilities maxRenewableLifetime]] + forKeyPath:max_renewable_keypath]; + + [validLifetimeSlider setIntegerValue: + [[ticketOptionsController valueForKeyPath:valid_lifetime_keypath] integerValue]]; + [renewableLifetimeSlider setIntegerValue: + [[ticketOptionsController valueForKeyPath:renewal_lifetime_keypath] integerValue]]; + [self sliderDidChange:validLifetimeSlider]; + [self sliderDidChange:renewableLifetimeSlider]; + + [NSApp beginSheet:ticketOptionsSheet + modalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) + contextInfo:NULL]; +} + +- (IBAction) cancelTicketOptions: (id) sender +{ + [NSApp endSheet:ticketOptionsSheet returnCode:NSUserCancelledError]; +} + +- (IBAction) saveTicketOptions: (id) sender +{ + [NSApp endSheet:ticketOptionsSheet]; +} + +- (void) sheetDidEnd: (NSWindow *) sheet + returnCode: (int) returnCode + contextInfo: (void *) contextInfo +{ + if (returnCode == NSUserCancelledError) { + // discard new options + [ticketOptionsController setContent:nil]; + } else { + // replace existing options with new + [glueController setValue:[ticketOptionsController content] forKeyPath:options_keypath]; + } + [ticketOptionsSheet orderOut:nil]; +} + - (IBAction) cancel: (id) sender { [associatedClient didCancel]; @@ -347,9 +422,11 @@ NSString *usernameString = [glueController valueForKeyPath:username_keypath]; NSString *realmString = [glueController valueForKeyPath:realm_keypath]; NSString *identityString = [NSString stringWithFormat:@"%@@%@", usernameString, realmString]; + NSDictionary *options = [glueController valueForKeyPath:options_keypath]; + NSLog(@"%s options == %@", __FUNCTION__, options); // the principal must already be valid to get this far - [associatedClient didEnterIdentity:identityString]; + [associatedClient didEnterIdentity:identityString options:options]; } - (IBAction) answerAuthPrompt: (id) sender diff --git a/src/kim/agent/mac/IPCClient.h b/src/kim/agent/mac/IPCClient.h index 531f7cbe4..6a0654e98 100644 --- a/src/kim/agent/mac/IPCClient.h +++ b/src/kim/agent/mac/IPCClient.h @@ -41,7 +41,7 @@ - (void) didCancel; - (void) didSelectIdentity: (NSString *) identityString; -- (void) didEnterIdentity: (NSString *) identityString; +- (void) didEnterIdentity: (NSString *) identityString options: (NSDictionary *) options; - (void) didPromptForAuth: (NSString *) responseString saveResponse: (NSNumber *) saveResponse; - (void) didChangePassword: (NSString *) oldPassword newPassword: (NSString *) newPassword diff --git a/src/kim/agent/mac/IPCClient.m b/src/kim/agent/mac/IPCClient.m index 4cb10fc27..c49e35d04 100644 --- a/src/kim/agent/mac/IPCClient.m +++ b/src/kim/agent/mac/IPCClient.m @@ -124,9 +124,10 @@ enum krb_agent_client_state { return 0; } -- (void) didEnterIdentity: (NSString *) identityString +- (void) didEnterIdentity: (NSString *) identityString options: (NSDictionary *) options { [self.currentInfo setObject:identityString forKey:@"identity_string"]; + [self.currentInfo setObject:options forKey:@"options"]; [KerberosAgentListener didEnterIdentity:self.currentInfo error:0]; } diff --git a/src/kim/agent/mac/Identities.m b/src/kim/agent/mac/Identities.m index 5dcd32939..2ead4e5e8 100644 --- a/src/kim/agent/mac/Identities.m +++ b/src/kim/agent/mac/Identities.m @@ -25,9 +25,6 @@ #import "Identities.h" #import -#define VALID_LIFETIME_INCREMENT (5 * 60) -#define RENEWABLE_LIFETIME_INCREMENT (15 * 60) - @interface Identity () - (NSString *)stringForLifetime:(NSUInteger)lifetime; diff --git a/src/kim/agent/mac/KIMUtilities.h b/src/kim/agent/mac/KIMUtilities.h index 9b735b3e2..49871d9e6 100644 --- a/src/kim/agent/mac/KIMUtilities.h +++ b/src/kim/agent/mac/KIMUtilities.h @@ -9,9 +9,12 @@ #import #import +#define VALID_LIFETIME_INCREMENT (5 * 60) +#define RENEWABLE_LIFETIME_INCREMENT (15 * 60) + #define log_kim_error_to_console(err)\ {\ -NSLog(@"%s got error %@", _cmd, [KIMUtilities stringForLastKIMError:err]);\ +NSLog(@"%s got error %@", __FUNCTION__, [KIMUtilities stringForLastKIMError:err]);\ } while (0); @interface KIMUtilities : NSObject @@ -21,4 +24,13 @@ NSLog(@"%s got error %@", _cmd, [KIMUtilities stringForLastKIMError:err]);\ + (BOOL) validatePrincipalWithName: (NSString *) name realm: (NSString *) realm; ++ (NSDictionary *) dictionaryForKimOptions: (kim_options) options; + ++ (kim_options) kimOptionsForDictionary: (NSDictionary *) aDict; + ++ (NSUInteger)minValidLifetime; ++ (NSUInteger)maxValidLifetime; ++ (NSUInteger)minRenewableLifetime; ++ (NSUInteger)maxRenewableLifetime; + @end diff --git a/src/kim/agent/mac/KIMUtilities.m b/src/kim/agent/mac/KIMUtilities.m index 1326c137f..9319e676a 100644 --- a/src/kim/agent/mac/KIMUtilities.m +++ b/src/kim/agent/mac/KIMUtilities.m @@ -48,4 +48,183 @@ return (err == KIM_NO_ERROR); } ++ (NSDictionary *) dictionaryForKimOptions: (kim_options) options +{ + kim_error err = KIM_NO_ERROR; + NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithCapacity:8]; + kim_boolean addressless = FALSE; + kim_boolean forwardable = FALSE; + kim_boolean proxiable = FALSE; + kim_boolean renewable = FALSE; + kim_lifetime valid_lifetime = 0; + kim_lifetime renewal_lifetime = 0; + kim_string service_name = NULL; + kim_time start_time = 0; + + if (!err) { + err = kim_options_get_addressless(options, &addressless); + } + if (!err) { + [newDict setValue:[NSNumber numberWithBool:addressless] + forKey:@"addressless"]; + } + if (!err) { + err = kim_options_get_forwardable(options, &forwardable); + } + if (!err) { + [newDict setValue:[NSNumber numberWithBool:forwardable] + forKey:@"forwardable"]; + } + if (!err) { + err = kim_options_get_proxiable(options, &proxiable); + } + if (!err) { + [newDict setValue:[NSNumber numberWithBool:proxiable] + forKey:@"proxiable"]; + } + if (!err) { + err = kim_options_get_renewable(options, &renewable); + } + if (!err) { + [newDict setValue:[NSNumber numberWithBool:renewable] + forKey:@"renewable"]; + } + if (!err) { + err = kim_options_get_lifetime(options, &valid_lifetime); + } + if (!err) { + [newDict setValue:[NSNumber numberWithInteger:valid_lifetime] + forKey:@"valid_lifetime"]; + } + if (!err) { + err = kim_options_get_renewal_lifetime(options, &renewal_lifetime); + } + if (!err) { + [newDict setValue:[NSNumber numberWithInteger:renewal_lifetime] + forKey:@"renewal_lifetime"]; + } + if (!err) { + err = kim_options_get_service_name(options, &service_name); + } + if (!err) { + [newDict setValue:(service_name) ? + [NSString stringWithUTF8String:service_name] : @"" + forKey:@"service_name"]; + } + if (!err) { + err = kim_options_get_start_time(options, &start_time); + } + if (!err) { + [newDict setValue:[NSNumber numberWithInteger:start_time] + forKey:@"start_time"]; + } + + return newDict; +} + ++ (kim_options) kimOptionsForDictionary: (NSDictionary *) aDict +{ + kim_error err = KIM_NO_ERROR; + kim_options options = NULL; + kim_boolean addressless = [[aDict valueForKey:@"addressless"] boolValue]; + kim_boolean forwardable = [[aDict valueForKey:@"forwardable"] boolValue]; + kim_boolean proxiable = [[aDict valueForKey:@"proxiable"] boolValue]; + kim_boolean renewable = [[aDict valueForKey:@"renewable"] boolValue]; + kim_lifetime valid_lifetime = [[aDict valueForKey:@"valid_lifetime"] integerValue]; + kim_lifetime renewal_lifetime = [[aDict valueForKey:@"renewal_lifetime"] integerValue]; + kim_string service_name = ([[aDict valueForKey:@"service_name"] length] > 0) ? + [[aDict valueForKey:@"service_name"] UTF8String] : NULL; + kim_time start_time = [[aDict valueForKey:@"start_time"] integerValue]; + + if (!err) { + err = kim_options_create (&options); + } + if (!err) { + err = kim_options_set_addressless(options, addressless); + } + if (!err) { + err = kim_options_set_forwardable(options, forwardable); + } + if (!err) { + err = kim_options_set_proxiable(options, proxiable); + } + if (!err) { + err = kim_options_set_renewable(options, renewable); + } + if (!err) { + err = kim_options_set_lifetime(options, valid_lifetime); + } + if (!err) { + err = kim_options_set_renewal_lifetime(options, renewal_lifetime); + } + if (!err) { + err = kim_options_set_service_name(options, service_name); + } + if (!err) { + err = kim_options_set_start_time(options, start_time); + } + + return options; +} + ++ (NSUInteger)minValidLifetime +{ + kim_error err = KIM_NO_ERROR; + kim_preferences prefs = NULL; + kim_lifetime value = 0; + + err = kim_preferences_create(&prefs); + + if (!err) { + kim_preferences_get_minimum_lifetime(prefs, &value); + } + + return (NSUInteger) value; +} + ++ (NSUInteger)maxValidLifetime +{ + kim_error err = KIM_NO_ERROR; + kim_preferences prefs = NULL; + kim_lifetime value = 0; + + err = kim_preferences_create(&prefs); + + if (!err) { + kim_preferences_get_maximum_lifetime(prefs, &value); + } + + return (NSUInteger) value; +} + ++ (NSUInteger)minRenewableLifetime +{ + kim_error err = KIM_NO_ERROR; + kim_preferences prefs = NULL; + kim_lifetime value = 0; + + err = kim_preferences_create(&prefs); + + if (!err) { + kim_preferences_get_minimum_renewal_lifetime(prefs, &value); + } + + return (NSUInteger) value; +} + ++ (NSUInteger)maxRenewableLifetime +{ + kim_error err = KIM_NO_ERROR; + kim_preferences prefs = NULL; + kim_lifetime value = 0; + + err = kim_preferences_create(&prefs); + + if (!err) { + kim_preferences_get_maximum_renewal_lifetime(prefs, &value); + } + + return (NSUInteger) value; +} + @end diff --git a/src/kim/agent/mac/KerberosAgentListener.h b/src/kim/agent/mac/KerberosAgentListener.h index f58ce3324..3c0fc8ee3 100644 --- a/src/kim/agent/mac/KerberosAgentListener.h +++ b/src/kim/agent/mac/KerberosAgentListener.h @@ -33,7 +33,8 @@ error: (int32_t) error; + (void) enterIdentityWithClientPort: (mach_port_t) client_port - replyPort: (mach_port_t) reply_port; + replyPort: (mach_port_t) reply_port + options: (kim_options) options; // contains reply_port, kim_identity + (void) didEnterIdentity: (NSDictionary *) info diff --git a/src/kim/agent/mac/KerberosAgentListener.m b/src/kim/agent/mac/KerberosAgentListener.m index cc634e2cf..fb87c02c3 100644 --- a/src/kim/agent/mac/KerberosAgentListener.m +++ b/src/kim/agent/mac/KerberosAgentListener.m @@ -131,10 +131,12 @@ static KerberosAgentListener *sharedListener = nil; + (void) enterIdentityWithClientPort: (mach_port_t) client_port replyPort: (mach_port_t) reply_port + options: (kim_options) options { NSDictionary *info = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInteger:client_port], @"client_port", [NSNumber numberWithInteger:reply_port], @"reply_port", + [KIMUtilities dictionaryForKimOptions:options], @"options", nil]; [[NSApp delegate] performSelectorOnMainThread:@selector(enterIdentity:) withObject:info @@ -149,16 +151,15 @@ static KerberosAgentListener *sharedListener = nil; mach_port_t reply_port = [[info objectForKey:@"reply_port"] integerValue]; kim_identity identity = NULL; kim_options options = NULL; + NSString *identityString = [info objectForKey:@"identity_string"]; - if (!err) { - err = kim_identity_create_from_string (&identity, [[info objectForKey:@"identity_string"] UTF8String]); + if (identityString) { + err = kim_identity_create_from_string (&identity, [identityString UTF8String]); } if (!err) { -#warning Placeholder for returning options - err = kim_options_create (&options); - } - + options = [KIMUtilities kimOptionsForDictionary:[info objectForKey:@"options"]]; + } if (!err) { err = kim_handle_reply_enter_identity(reply_port, identity, options, error); } @@ -198,13 +199,18 @@ static KerberosAgentListener *sharedListener = nil; mach_port_t reply_port = [portNumber integerValue]; kim_identity identity = NULL; kim_options options = NULL; - - err = kim_identity_create_from_string(&identity, (identityString) ? [identityString UTF8String] : ""); + NSLog(@"%s", __FUNCTION__); + + if (identityString) { + err = kim_identity_create_from_string(&identity, [identityString UTF8String]); + } if (!err) { -#warning Placeholder for returning options - err = kim_options_create (&options); + options = [KIMUtilities kimOptionsForDictionary:[info objectForKey:@"options"]]; } + + log_kim_error_to_console(err); + log_kim_error_to_console(error); if (!err) { err = kim_handle_reply_select_identity(reply_port, identity, options, error); diff --git a/src/kim/agent/mac/ServerDemux.m b/src/kim/agent/mac/ServerDemux.m index 3cda9be64..00b13c9c5 100644 --- a/src/kim/agent/mac/ServerDemux.m +++ b/src/kim/agent/mac/ServerDemux.m @@ -26,6 +26,7 @@ #import "kim_selection_hints_private.h" #import "kim_options_private.h" #import "KerberosAgentListener.h" +#import "KIMUtilities.h" // --------------------------------------------------------------------------- @@ -149,7 +150,8 @@ static int32_t kim_handle_request_enter_identity (mach_port_t in_client_port, if (!err) { // performs selector on main thread [KerberosAgentListener enterIdentityWithClientPort:in_client_port - replyPort:in_reply_port]; + replyPort:in_reply_port + options:options]; } return err; diff --git a/src/kim/agent/mac/resources/English.lproj/Authentication.xib b/src/kim/agent/mac/resources/English.lproj/Authentication.xib index 6b2aad9cd..06056ee68 100644 --- a/src/kim/agent/mac/resources/English.lproj/Authentication.xib +++ b/src/kim/agent/mac/resources/English.lproj/Authentication.xib @@ -8,11 +8,12 @@ 352.00 YES - - - + + + + YES @@ -62,6 +63,21 @@ YES + + + YES + maxValidLifetime + minValidLifetime + validLifetime + valid_lifetime + minRenewableLifetime + maxRenewableLifetime + renewa + renewal_lifetime + + YES + + 274 @@ -309,7 +325,7 @@ - -2147483356 + 292 {{20, 17}, {38, 26}} YES @@ -362,6 +378,16 @@ _popUpItemAction: + + + Q2hhbmdlIFBhc3N3b3Jk4oCmA + + 2147483647 + + + _popUpItemAction: + + YES @@ -964,7 +990,7 @@ {3.40282e+38, 3.40282e+38} {430, 283} - + 256 YES @@ -1178,6 +1204,7 @@ {430, 283} + {{0, 0}, {1440, 878}} {430, 305} @@ -1853,200 +1880,238 @@ 300417 - - takeObjectValueFrom: - - + + ticketOptionsSheet + + - 300441 + 300468 - - takeObjectValueFrom: - - + + ticketOptionsController + + - 300442 + 300470 - - delegate - - + + maxValue: selection.maxValidLifetime + + + + + + maxValue: selection.maxValidLifetime + maxValue + selection.maxValidLifetime + 2 + - 300443 + 300472 - - delegate - - + + minValue: selection.minValidLifetime + + + + + + minValue: selection.minValidLifetime + minValue + selection.minValidLifetime + + 2 + - 300444 + 300478 value: selection.forwardable - + - + value: selection.forwardable value selection.forwardable 2 - 300445 + 300481 value: selection.addressless - + - + value: selection.addressless value selection.addressless 2 - 300446 + 300482 value: selection.renewable - + - + value: selection.renewable value selection.renewable 2 - 300447 + 300483 - enabled: selection.renewable + maxValue: selection.maxRenewableLifetime - - + + - - enabled: selection.renewable - enabled - selection.renewable + + maxValue: selection.maxRenewableLifetime + maxValue + selection.maxRenewableLifetime 2 - 300450 + 300494 - maxValue: selection.max_renewal_lifetime + minValue: selection.minRenewableLifetime - - + + - - maxValue: selection.max_renewal_lifetime - maxValue - selection.max_renewal_lifetime + + minValue: selection.minRenewableLifetime + minValue + selection.minRenewableLifetime + 2 - 300453 + 300495 - minValue: selection.min_renewal_lifetime + enabled: selection.renewable - - + + - - minValue: selection.min_renewal_lifetime - minValue - selection.min_renewal_lifetime - + + enabled: selection.renewable + enabled + selection.renewable 2 - 300454 + 300497 value: selection.renewal_lifetime - - + + - - + + value: selection.renewal_lifetime value selection.renewal_lifetime - 2 - 300455 + 300500 - maxValue: selection.max_valid_lifetime - - - - - - maxValue: selection.max_valid_lifetime - maxValue - selection.max_valid_lifetime + value: selection.valid_lifetime + + + + + + value: selection.valid_lifetime + value + selection.valid_lifetime 2 - 300456 + 300501 - - minValue: selection.min_valid_lifetime - - - - - - minValue: selection.min_valid_lifetime - minValue - selection.min_valid_lifetime - - 2 - + + showTicketOptions: + + - 300458 + 300503 - - value: selection.valid_lifetime - - - - - - value: selection.valid_lifetime - value - selection.valid_lifetime - - 2 - + + saveTicketOptions: + + + + 300504 + + + + cancelTicketOptions: + + + + 300505 + + + + validLifetimeSlider + + + + 300506 + + + + renewableLifetimeSlider + + + + 300507 + + + + sliderDidChange: + + + + 300508 + + + + sliderDidChange: + + - 300459 + 300509 @@ -2573,6 +2638,7 @@ + @@ -2876,6 +2942,17 @@ + + 300469 + + + Ticket Options Controller + + + 300502 + + + @@ -3019,6 +3096,8 @@ 300430.IBPluginDependency 300430.ImportedFromIB2 300464.IBPluginDependency + 300469.IBPluginDependency + 300502.IBPluginDependency YES @@ -3104,7 +3183,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{611, 402}, {176, 73}} + {{611, 382}, {189, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3128,9 +3207,9 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{579, 449}, {430, 283}} + {{979, 209}, {430, 283}} com.apple.InterfaceBuilder.CocoaPlugin - {{579, 449}, {430, 283}} + {{979, 209}, {430, 283}} @@ -3159,6 +3238,8 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin @@ -3181,7 +3262,7 @@ - 300467 + 300509 @@ -3195,9 +3276,13 @@ YES answerAuthPrompt: cancel: + cancelTicketOptions: changePassword: enterIdentity: + saveTicketOptions: + showTicketOptions: showedError: + sliderDidChange: YES @@ -3206,6 +3291,10 @@ id id id + id + id + id + id @@ -3226,10 +3315,14 @@ passwordField passwordView rememberPasswordInKeychainCheckBox + renewableLifetimeSlider samBadge samPromptField samView + ticketOptionsController + ticketOptionsSheet usernameField + validLifetimeSlider YES @@ -3247,10 +3340,14 @@ NSTextField NSView NSButton + NSSlider BadgedImageView NSTextField NSView + NSObjectController + NSWindow NSTextField + NSSlider