From de90bb23b390da9d5adde5dffe92f0bd75dd5309 Mon Sep 17 00:00:00 2001 From: Jonathan Willing Date: Sat, 18 May 2013 20:47:25 -0500 Subject: store password in keychain on OS X demo, switch to bindings --- .../macExample.xcodeproj/project.pbxproj | 18 +++ example/mac/macExample/macExample/AppDelegate.h | 5 - example/mac/macExample/macExample/AppDelegate.m | 143 ++++++++++----------- 3 files changed, 84 insertions(+), 82 deletions(-) (limited to 'example/mac') diff --git a/example/mac/macExample/macExample.xcodeproj/project.pbxproj b/example/mac/macExample/macExample.xcodeproj/project.pbxproj index 3513d61e..baab11de 100644 --- a/example/mac/macExample/macExample.xcodeproj/project.pbxproj +++ b/example/mac/macExample/macExample.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + AB666C5917484E6200545290 /* FXKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = AB666C5817484E6200545290 /* FXKeychain.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + AB666C5B1748558000545290 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB666C5A1748558000545290 /* Security.framework */; }; C64FF38416AF97F400F8C162 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = C64FF38316AF97F400F8C162 /* main.mm */; }; C6BD2873170BC5C500A91AC1 /* MCOCIDURLProtocol.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6BD2870170BC5C500A91AC1 /* MCOCIDURLProtocol.mm */; }; C6BD2874170BC5C500A91AC1 /* MCOMessageView.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6BD2872170BC5C500A91AC1 /* MCOMessageView.mm */; }; @@ -65,6 +67,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + AB666C5717484E6200545290 /* FXKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FXKeychain.h; path = ../../../common/FXKeychain.h; sourceTree = ""; }; + AB666C5817484E6200545290 /* FXKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FXKeychain.m; path = ../../../common/FXKeychain.m; sourceTree = ""; }; + AB666C5A1748558000545290 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; C64FF38316AF97F400F8C162 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; C6BD286F170BC5C500A91AC1 /* MCOCIDURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOCIDURLProtocol.h; sourceTree = ""; }; C6BD2870170BC5C500A91AC1 /* MCOCIDURLProtocol.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOCIDURLProtocol.mm; sourceTree = ""; }; @@ -92,6 +97,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + AB666C5B1748558000545290 /* Security.framework in Frameworks */, C6BD28B4170BDFE500A91AC1 /* MailCore.framework in Frameworks */, C6D42BE516ABB511002BB4F9 /* WebKit.framework in Frameworks */, C6D42BB616ABB39A002BB4F9 /* Cocoa.framework in Frameworks */, @@ -101,6 +107,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + AB666C5217484E3100545290 /* External */ = { + isa = PBXGroup; + children = ( + AB666C5717484E6200545290 /* FXKeychain.h */, + AB666C5817484E6200545290 /* FXKeychain.m */, + ); + name = External; + sourceTree = ""; + }; C6BD286D170BC5C500A91AC1 /* ui */ = { isa = PBXGroup; children = ( @@ -171,6 +186,7 @@ C6D42BB416ABB39A002BB4F9 /* Frameworks */ = { isa = PBXGroup; children = ( + AB666C5A1748558000545290 /* Security.framework */, C6D42BE416ABB511002BB4F9 /* WebKit.framework */, C6D42BB516ABB39A002BB4F9 /* Cocoa.framework */, C6D42BB716ABB39A002BB4F9 /* Other Frameworks */, @@ -191,6 +207,7 @@ C6D42BBB16ABB39A002BB4F9 /* macExample */ = { isa = PBXGroup; children = ( + AB666C5217484E3100545290 /* External */, C6D42BBC16ABB39A002BB4F9 /* Supporting Files */, C6D42BC716ABB39A002BB4F9 /* AppDelegate.h */, C6D42BC816ABB39A002BB4F9 /* AppDelegate.m */, @@ -325,6 +342,7 @@ C64FF38416AF97F400F8C162 /* main.mm in Sources */, C6BD2873170BC5C500A91AC1 /* MCOCIDURLProtocol.mm in Sources */, C6BD2874170BC5C500A91AC1 /* MCOMessageView.mm in Sources */, + AB666C5917484E6200545290 /* FXKeychain.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/example/mac/macExample/macExample/AppDelegate.h b/example/mac/macExample/macExample/AppDelegate.h index 1d0ba332..baa48894 100644 --- a/example/mac/macExample/macExample/AppDelegate.h +++ b/example/mac/macExample/macExample/AppDelegate.h @@ -11,11 +11,6 @@ @class MCTMsgListViewController; @interface AppDelegate : NSObject { - IBOutlet NSButton * _loginButton; - IBOutlet NSButton * _cancelButton; - IBOutlet NSTextField * _loginTextField; - IBOutlet NSTextField * _passwordTextField; - IBOutlet NSProgressIndicator * _progressView; IBOutlet MCTMsgListViewController * _msgListViewController; IBOutlet NSWindow * _accountWindow; } diff --git a/example/mac/macExample/macExample/AppDelegate.m b/example/mac/macExample/macExample/AppDelegate.m index 12c744e8..8ba89c37 100644 --- a/example/mac/macExample/macExample/AppDelegate.m +++ b/example/mac/macExample/macExample/AppDelegate.m @@ -11,15 +11,20 @@ #import #import "MCTMsgListViewController.h" +#import "FXKeychain.h" @interface AppDelegate () +@property (nonatomic, copy) NSString *login; +@property (nonatomic, copy) NSString *hostname; +@property (nonatomic, copy) NSString *password; +@property (nonatomic, readonly) BOOL loginEnabled; +@property (nonatomic, readonly) BOOL loggingIn; +@property (nonatomic, retain) MCOIMAPSession *session; +@property (nonatomic, retain) MCOIMAPOperation *checkOp; @end -@implementation AppDelegate { - MCOIMAPSession * _session; - MCOIMAPOperation * _checkOp; -} +@implementation AppDelegate - (void) dealloc { @@ -28,61 +33,57 @@ - (void) awakeFromNib { - [_loginTextField setDelegate:self]; - [_passwordTextField setDelegate:self]; -} - -- (void) applicationDidFinishLaunching:(NSNotification *)aNotification -{ - [self _updateState]; - - NSString * login = [[NSUserDefaults standardUserDefaults] stringForKey:@"Login"]; - NSString * password = [[NSUserDefaults standardUserDefaults] stringForKey:@"Password"]; - - if (([login length] == 0) || ([password length] == 0)) { - [_accountWindow makeKeyAndOrderFront:nil]; - } - else { - [_loginTextField setStringValue:login]; - [_passwordTextField setStringValue:password]; - } + [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"Hostname": @"imap.gmail.com" }]; + + self.login = [[NSUserDefaults standardUserDefaults] stringForKey:@"Login"]; + self.hostname = [[NSUserDefaults standardUserDefaults] stringForKey:@"Hostname"]; + self.password = [[FXKeychain defaultKeychain] objectForKey:@"Password"]; + + if (self.login.length && self.password.length) { + [self accountLogin:nil]; + } else { + [_accountWindow makeKeyAndOrderFront:nil]; + } } - (void) accountLogin:(id)sender { - NSString * login = [_loginTextField stringValue]; - NSString * password = [_passwordTextField stringValue]; - NSLog(@"try login"); - _session = [[MCOIMAPSession alloc] init]; - [_session setHostname:@"imap.gmail.com"]; - [_session setPort:993]; - [_session setUsername:login]; - [_session setPassword:password]; - [_session setConnectionType:MCOConnectionTypeTLS]; - _checkOp = [[_session checkAccountOperation] retain]; - NSLog(@"start op"); - [_checkOp start:^(NSError * error) { + [[NSUserDefaults standardUserDefaults] setObject:self.login forKey:@"Login"]; + [[NSUserDefaults standardUserDefaults] setObject:self.hostname forKey:@"Hostname"]; + + if (![[[FXKeychain defaultKeychain] objectForKey:@"Password"] isEqualToString:self.password]) { + [[FXKeychain defaultKeychain] removeObjectForKey:@"Password"]; + [[FXKeychain defaultKeychain] setObject:self.password forKey:@"Password"]; + } + + self.session = [[MCOIMAPSession alloc] init]; + [self.session setHostname:self.hostname]; + [self.session setPort:993]; + [self.session setUsername:self.login]; + [self.session setPassword:self.password]; + [self.session setConnectionType:MCOConnectionTypeTLS]; + self.checkOp = [self.session checkAccountOperation]; + + NSLog(@"start op"); + [self.checkOp start:^(NSError * error) { [_accountWindow orderOut:nil]; - - NSString * login = [_loginTextField stringValue]; - NSString * password = [_passwordTextField stringValue]; - [[NSUserDefaults standardUserDefaults] setObject:login forKey:@"Login"]; - [[NSUserDefaults standardUserDefaults] setObject:password forKey:@"Password"]; - - [_checkOp release]; + + [self willChangeValueForKey:@"loggingIn"]; + + [self.checkOp release]; _checkOp = nil; - [_session release]; + [self.session release]; _session = nil; - - [self _updateState]; - - NSLog(@"op done %@", error); - - [_msgListViewController connect]; - }]; - - [self _updateState]; + + [self didChangeValueForKey:@"loggingIn"]; + + NSLog(@"op done (error: %@)", error); + if (error != nil) + [_accountWindow makeKeyAndOrderFront:nil]; + + [_msgListViewController connectWithHostname:self.hostname login:self.login password:self.password]; + }]; } - (void) accountCancel:(id)sender @@ -92,38 +93,26 @@ _checkOp = nil; [_session release]; _session = nil; - - [self _updateState]; } -- (void) _updateState ++ (NSSet *)keyPathsForValuesAffectingLoginEnabled +{ + return [NSSet setWithObjects:@"password", @"login", @"hostname", nil]; +} + ++ (NSSet *)keyPathsForValuesAffectingLoggingIn +{ + return [NSSet setWithObjects:@"checkOp", nil]; +} + +- (BOOL)loginEnabled { - if (_checkOp == nil) { - [_loginTextField setEnabled:YES]; - [_passwordTextField setEnabled:YES]; - NSString * login = [_loginTextField stringValue]; - NSString * password = [_passwordTextField stringValue]; - if (([login length] > 0) && ([password length] > 0)) { - [_loginButton setEnabled:YES]; - } - else { - [_loginButton setEnabled:NO]; - } - [_cancelButton setEnabled:NO]; - [_progressView stopAnimation:nil]; - } - else { - [_loginTextField setEnabled:NO]; - [_passwordTextField setEnabled:NO]; - [_loginButton setEnabled:NO]; - [_cancelButton setEnabled:YES]; - [_progressView startAnimation:nil]; - } + return self.password.length && self.login.length && self.hostname.length && _checkOp == nil; } -- (void) controlTextDidChange:(NSNotification *)aNotification +- (BOOL)loggingIn { - [self _updateState]; + return (self.checkOp != nil); } @end -- cgit v1.2.3