diff --git a/External/Crashlytics.framework/Versions/A/Crashlytics b/External/Crashlytics.framework/Versions/A/Crashlytics
index aa001c2b..4701a362 100644
Binary files a/External/Crashlytics.framework/Versions/A/Crashlytics and b/External/Crashlytics.framework/Versions/A/Crashlytics differ
diff --git a/External/Crashlytics.framework/Versions/A/Resources/Info.plist b/External/Crashlytics.framework/Versions/A/Resources/Info.plist
index bf21197c..1290a7a3 100644
--- a/External/Crashlytics.framework/Versions/A/Resources/Info.plist
+++ b/External/Crashlytics.framework/Versions/A/Resources/Info.plist
@@ -7,7 +7,7 @@
CFBundleExecutable
Crashlytics
CFBundleIdentifier
- com.crashlytics.sdk.mac
+ com.crashlytics.ios
CFBundleInfoDictionaryVersion
6.0
CFBundleName
@@ -15,16 +15,16 @@
CFBundlePackageType
FMWK
CFBundleShortVersionString
- 2.1.2
+ 2.1.6
CFBundleSupportedPlatforms
- macosx
+ iPhoneOS
CFBundleVersion
- 9
+ 21
DTPlatformName
- macosx
+ iphoneos
MinimumOSVersion
- 10.6
+ 4.0
diff --git a/External/Pearl b/External/Pearl
index 4a3c68dd..081c2dec 160000
--- a/External/Pearl
+++ b/External/Pearl
@@ -1 +1 @@
-Subproject commit 4a3c68dda957adba490aae9b56df018e935d6c84
+Subproject commit 081c2dec20b3638694a5ad20cd2fddccdb298447
diff --git a/External/UbiquityStoreManager b/External/UbiquityStoreManager
index a5ee62e1..ef9aa1c2 160000
--- a/External/UbiquityStoreManager
+++ b/External/UbiquityStoreManager
@@ -1 +1 @@
-Subproject commit a5ee62e1cca559e27aba92ac65ffc4da44827dfe
+Subproject commit ef9aa1c29ed6e1729be4d6a3dd65e2c8a289bf4c
diff --git a/MasterPassword/ObjC/MPAlgorithmV0.m b/MasterPassword/ObjC/MPAlgorithmV0.m
index 8693581a..03a2ed86 100644
--- a/MasterPassword/ObjC/MPAlgorithmV0.m
+++ b/MasterPassword/ObjC/MPAlgorithmV0.m
@@ -127,7 +127,7 @@
return @"Device Private Password";
}
- Throw(@"Type not supported: %lu", type);
+ Throw(@"Type not supported: %lu", (long)type);
}
- (NSString *)shortNameOfType:(MPElementType)type {
@@ -161,7 +161,7 @@
return @"Device";
}
- Throw(@"Type not supported: %lu", type);
+ Throw(@"Type not supported: %lu", (long)type);
}
- (NSString *)classNameOfType:(MPElementType)type {
@@ -200,7 +200,7 @@
return [MPElementStoredEntity class];
}
- Throw(@"Type not supported: %lu", type);
+ Throw(@"Type not supported: %lu", (long)type);
}
- (MPElementType)nextType:(MPElementType)type {
@@ -227,7 +227,7 @@
return MPElementTypeStoredPersonal;
}
- Throw(@"Type not supported: %lu", type);
+ Throw(@"Type not supported: %lu", (long)type);
}
- (MPElementType)previousType:(MPElementType)type {
@@ -300,13 +300,13 @@
case MPElementTypeGeneratedBasic:
case MPElementTypeGeneratedShort:
case MPElementTypeGeneratedPIN: {
- NSAssert(NO, @"Cannot save content to element with generated type %lu.", element.type);
+ NSAssert(NO, @"Cannot save content to element with generated type %lu.", (long)element.type);
break;
}
case MPElementTypeStoredPersonal: {
NSAssert([element isKindOfClass:[MPElementStoredEntity class]],
- @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", element.type, [element class]);
+ @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class]);
NSData *encryptedContent = [[clearContent dataUsingEncoding:NSUTF8StringEncoding]
encryptWithSymmetricKey:[elementKey subKeyOfLength:PearlCryptKeySize].keyData padding:YES];
@@ -315,7 +315,7 @@
}
case MPElementTypeStoredDevicePrivate: {
NSAssert([element isKindOfClass:[MPElementStoredEntity class]],
- @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", element.type, [element class]);
+ @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class]);
NSData *encryptedContent = [[clearContent dataUsingEncoding:NSUTF8StringEncoding]
encryptWithSymmetricKey:[elementKey subKeyOfLength:PearlCryptKeySize].keyData padding:YES];
@@ -360,7 +360,7 @@
case MPElementTypeGeneratedShort:
case MPElementTypeGeneratedPIN: {
NSAssert([element isKindOfClass:[MPElementGeneratedEntity class]],
- @"Element with generated type %lu is not an MPElementGeneratedEntity, but a %@.", element.type, [element class]);
+ @"Element with generated type %lu is not an MPElementGeneratedEntity, but a %@.", (long)element.type, [element class]);
NSString *name = element.name;
MPElementType type = element.type;
@@ -382,7 +382,7 @@
case MPElementTypeStoredPersonal: {
NSAssert([element isKindOfClass:[MPElementStoredEntity class]],
- @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", element.type, [element class]);
+ @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class]);
NSData *encryptedContent = ((MPElementStoredEntity *)element).contentObject;
@@ -394,7 +394,7 @@
}
case MPElementTypeStoredDevicePrivate: {
NSAssert([element isKindOfClass:[MPElementStoredEntity class]],
- @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", element.type, [element class]);
+ @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class]);
NSDictionary *elementQuery = [self queryForDevicePrivateElementNamed:element.name];
NSData *encryptedContent = [PearlKeyChain dataOfItemForQuery:elementQuery];
@@ -423,7 +423,7 @@
case MPElementTypeStoredPersonal: {
NSAssert([element isKindOfClass:[MPElementStoredEntity class]],
- @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", element.type, [element class]);
+ @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class]);
if ([importKey.keyID isEqualToData:elementKey.keyID])
((MPElementStoredEntity *)element).contentObject = [protectedContent decodeBase64];
@@ -481,7 +481,7 @@
case MPElementTypeStoredPersonal: {
NSAssert([element isKindOfClass:[MPElementStoredEntity class]],
- @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", element.type, [element class]);
+ @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class]);
result = [((MPElementStoredEntity *)element).contentObject encodeBase64];
break;
}
diff --git a/MasterPassword/ObjC/MPAppDelegate_Key.m b/MasterPassword/ObjC/MPAppDelegate_Key.m
index 7e119ec5..6c6e2737 100644
--- a/MasterPassword/ObjC/MPAppDelegate_Key.m
+++ b/MasterPassword/ObjC/MPAppDelegate_Key.m
@@ -75,6 +75,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
if (password)
NSAssert(![NSThread isMainThread], @"Computing key must not happen from the main thread.");
+ if (!user)
+ return NO;
MPKey *tryKey = nil;
diff --git a/MasterPassword/ObjC/MPAppDelegate_Store.m b/MasterPassword/ObjC/MPAppDelegate_Store.m
index 44427486..a381f758 100644
--- a/MasterPassword/ObjC/MPAppDelegate_Store.m
+++ b/MasterPassword/ObjC/MPAppDelegate_Store.m
@@ -701,7 +701,7 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
[export appendFormat:@"%@ %8ld %8s %20s\t%@\n",
[[NSDateFormatter rfc3339DateFormatter] stringFromDate:lastUsed], (long)uses,
- [PearlString( @"%lu:%lu", type, (unsigned long)version ) UTF8String], [name UTF8String], content
+ [PearlString( @"%lu:%lu", (long)type, (unsigned long)version ) UTF8String], [name UTF8String], content
? content: @""];
}
diff --git a/MasterPassword/ObjC/MPEntities.m b/MasterPassword/ObjC/MPEntities.m
index ebac71ac..5b5fbc32 100644
--- a/MasterPassword/ObjC/MPEntities.m
+++ b/MasterPassword/ObjC/MPEntities.m
@@ -54,7 +54,7 @@
if (!aType || aType == (MPElementType)NSNotFound)
aType = MPElementTypeGeneratedLong;
if (![self isKindOfClass:[self.algorithm classOfType:aType]])
- Throw(@"This object's class does not support the type: %lu", aType);
+ Throw(@"This object's class does not support the type: %lu", (long)aType);
self.type_ = @(aType);
}
@@ -128,7 +128,7 @@
- (NSString *)debugDescription {
return PearlString( @"{%@: name=%@, user=%@, type=%lu, uses=%ld, lastUsed=%@, version=%ld, loginName=%@, requiresExplicitMigration=%d}",
- NSStringFromClass( [self class] ), self.name, self.user.name, self.type, (long)self.uses, self.lastUsed, (long)self.version,
+ NSStringFromClass( [self class] ), self.name, self.user.name, (long)self.type, (long)self.uses, self.lastUsed, (long)self.version,
self.loginName, self.requiresExplicitMigration );
}
diff --git a/MasterPassword/ObjC/Mac/MPElementCollectionView.m b/MasterPassword/ObjC/Mac/MPElementCollectionView.m
index 24b2b2cd..28b77868 100644
--- a/MasterPassword/ObjC/Mac/MPElementCollectionView.m
+++ b/MasterPassword/ObjC/Mac/MPElementCollectionView.m
@@ -16,6 +16,7 @@
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
//
+#import
#import "MPElementCollectionView.h"
#import "MPElementModel.h"
#import "MPMacAppDelegate.h"
@@ -36,17 +37,24 @@
if (!(self = [super initWithCoder:coder]))
return nil;
- __weak MPElementCollectionView *wSelf = self;
- [self addObserverBlock:^(NSString *keyPath, id object, NSDictionary *change, void *context) {
- dispatch_async( dispatch_get_main_queue(), ^{
- wSelf.counterHidden = !(MPElementTypeClassGenerated & wSelf.representedObject.type);
- wSelf.updateContentHidden = !(MPElementTypeClassStored & wSelf.representedObject.type);
- } );
- } forKeyPath:@"representedObject" options:0 context:nil];
+ [self addObserver:self forKeyPath:@"representedObject" options:0 context:nil];
return self;
}
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
+
+ [[NSOperationQueue mainQueue] addOperationWithBlock:^{
+ self.counterHidden = !(MPElementTypeClassGenerated & self.representedObject.type);
+ self.updateContentHidden = !(MPElementTypeClassStored & self.representedObject.type);
+ }];
+}
+
+- (void)dealloc {
+
+ [self removeObserver:self forKeyPath:@"representedObject"];
+}
+
- (IBAction)toggleType:(id)sender {
id algorithm = self.representedObject.algorithm;
diff --git a/MasterPassword/ObjC/Mac/MPInitialWindow.xib b/MasterPassword/ObjC/Mac/MPInitialWindow.xib
index 0a97dac2..a13ff4c5 100644
--- a/MasterPassword/ObjC/Mac/MPInitialWindow.xib
+++ b/MasterPassword/ObjC/Mac/MPInitialWindow.xib
@@ -1,6 +1,7 @@
+
diff --git a/MasterPassword/ObjC/Mac/MPMacAppDelegate.h b/MasterPassword/ObjC/Mac/MPMacAppDelegate.h
index 6162e200..579e4425 100644
--- a/MasterPassword/ObjC/Mac/MPMacAppDelegate.h
+++ b/MasterPassword/ObjC/Mac/MPMacAppDelegate.h
@@ -34,6 +34,7 @@
- (IBAction)newUser:(NSMenuItem *)sender;
- (IBAction)lock:(id)sender;
- (IBAction)rebuildCloud:(id)sender;
+- (IBAction)corruptCloud:(id)sender;
- (IBAction)terminate:(id)sender;
- (IBAction)iphoneAppStore:(id)sender;
diff --git a/MasterPassword/ObjC/Mac/MPMacAppDelegate.m b/MasterPassword/ObjC/Mac/MPMacAppDelegate.m
index 18685cd8..c7fe0911 100644
--- a/MasterPassword/ObjC/Mac/MPMacAppDelegate.m
+++ b/MasterPassword/ObjC/Mac/MPMacAppDelegate.m
@@ -14,6 +14,12 @@
#define LOGIN_HELPER_BUNDLE_ID @"com.lyndir.lhunath.MasterPassword.Mac.LoginHelper"
+@interface UbiquityStoreManager (Private)
+
+- (void)markCloudStoreCorrupted;
+
+@end
+
@interface MPMacAppDelegate()
@property(nonatomic, strong) NSWindowController *initialWindow;
@@ -129,16 +135,23 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
- (IBAction)togglePreference:(id)sender {
- if (sender == self.enableCloudButton)
- [self storeManager].cloudEnabled = (self.enableCloudButton.state == NSOnState);
+ if (sender == self.enableCloudButton) {
+ if (([self storeManager].cloudEnabled = self.enableCloudButton.state == NSOnState)) {
+ NSAlert *alert = [NSAlert new];
+ alert.messageText = @"iCloud Enabled";
+ alert.informativeText = @"If you already have a user on another iCloud-enabled device, "
+ @"it may take a moment for that user to sync down to this device.";
+ [alert runModal];
+ }
+ }
if (sender == self.useCloudItem)
- [self storeManager].cloudEnabled = !(self.useCloudItem.state == NSOnState);
+ [self storeManager].cloudEnabled = self.useCloudItem.state != NSOnState;
if (sender == self.rememberPasswordItem)
[MPConfig get].rememberLogin = [NSNumber numberWithBool:![[MPConfig get].rememberLogin boolValue]];
if (sender == self.openAtLoginButton)
- [self setLoginItemEnabled:(self.openAtLoginButton.state == NSOnState)];
+ [self setLoginItemEnabled:self.openAtLoginButton.state == NSOnState];
if (sender == self.openAtLoginItem)
- [self setLoginItemEnabled:!(self.openAtLoginItem.state == NSOnState)];
+ [self setLoginItemEnabled:self.openAtLoginItem.state != NSOnState];
if (sender == self.savePasswordItem) {
[MPMacAppDelegate managedObjectContextPerformBlockAndWait:^(NSManagedObjectContext *context) {
MPUserEntity *activeUser = [[MPMacAppDelegate get] activeUserInContext:context];
@@ -194,14 +207,24 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
- (IBAction)rebuildCloud:(id)sender {
- if ([[NSAlert alertWithMessageText:@"iCloud Truth Sync" defaultButton:@"Continue"
+ if ([[NSAlert alertWithMessageText:@"iCloud Truth Push" defaultButton:@"Continue"
alternateButton:nil otherButton:@"Cancel"
- informativeTextWithFormat:@"This action will force all your iCloud enabled devices to revert to this device's version of the truth."
+ informativeTextWithFormat:@"This action will force all your iCloud enabled devices to switch to this device's version of the truth."
@"\n\nThis is only necessary if you notice that your devices aren't syncing properly anymore. "
"Any data on other devices not available from here will be lost."] runModal] == NSAlertDefaultReturn)
[self.storeManager rebuildCloudContentFromCloudStoreOrLocalStore:NO];
}
+- (IBAction)corruptCloud:(id)sender {
+
+ if ([[NSAlert alertWithMessageText:@"iCloud Truth Pull" defaultButton:@"Continue"
+ alternateButton:nil otherButton:@"Cancel"
+ informativeTextWithFormat:@"This action will force another iCloud enabled device to push their version of the truth on all."
+ @"\n\nThis is only necessary if you notice that your devices aren't syncing properly anymore. "
+ "Any data on this device not available from the other will be lost."] runModal] == NSAlertDefaultReturn)
+ [self.storeManager markCloudStoreCorrupted];
+}
+
- (IBAction)terminate:(id)sender {
[self.passwordWindow close];
@@ -301,8 +324,11 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
// Initial display.
[NSApp activateIgnoringOtherApps:YES];
- if ([[MPMacConfig get].firstRun boolValue])
- [self.initialWindow = [[NSWindowController alloc] initWithWindowNibName:@"MPInitialWindow" owner:self] showWindow:self];
+ if ([[MPMacConfig get].firstRun boolValue]) {
+ self.initialWindow = [[NSWindowController alloc] initWithWindowNibName:@"MPInitialWindow" owner:self];
+ [self.initialWindow.window setLevel:NSFloatingWindowLevel];
+ [self.initialWindow showWindow:self];
+ }
}
- (void)setActiveUser:(MPUserEntity *)activeUser {
diff --git a/MasterPassword/ObjC/Mac/MPPasswordWindowController.m b/MasterPassword/ObjC/Mac/MPPasswordWindowController.m
index bcfe8cad..b397e28a 100644
--- a/MasterPassword/ObjC/Mac/MPPasswordWindowController.m
+++ b/MasterPassword/ObjC/Mac/MPPasswordWindowController.m
@@ -44,7 +44,6 @@
self.backgroundQueue = [NSOperationQueue new];
self.backgroundQueue.maxConcurrentOperationCount = 1;
- [self.userLabel setStringValue:PearlString( @"%@'s password for:", [[MPMacAppDelegate get] activeUserForMainThread].name )];
[[MPMacAppDelegate get] addObserverBlock:^(NSString *keyPath, id object, NSDictionary *change, void *context) {
// [MPMacAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *moc) {
// if (![MPAlgorithmDefault migrateUser:[[MPMacAppDelegate get] activeUserInContext:moc]])
@@ -54,9 +53,9 @@
// @"their passwords to change. You'll need to update your profile for that site with the new password."];
// [moc saveToStore];
// }];
- dispatch_async( dispatch_get_main_queue(), ^{
+ [[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self ensureLoadedAndUnlockedOrCloseIfLoggedOut:YES];
- } );
+ }];
} forKeyPath:@"key" options:NSKeyValueObservingOptionInitial context:nil];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window
queue:[NSOperationQueue mainQueue] usingBlock:
@@ -77,11 +76,18 @@
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil
queue:[NSOperationQueue mainQueue] usingBlock:
^(NSNotification *note) {
+ self.userLabel.stringValue = @"";
self.siteField.stringValue = @"";
self.elements = nil;
[self ensureLoadedAndUnlockedOrCloseIfLoggedOut:YES];
}];
+ [[NSNotificationCenter defaultCenter] addObserverForName:MPSignedInNotification object:nil
+ queue:[NSOperationQueue mainQueue] usingBlock:
+ ^(NSNotification *note) {
+ self.userLabel.stringValue = PearlString( @"%@'s password for:",
+ [[MPMacAppDelegate get] activeUserForMainThread].name );
+ }];
[[NSNotificationCenter defaultCenter] addObserverForName:USMStoreDidChangeNotification object:nil
queue:[NSOperationQueue mainQueue] usingBlock:
^(NSNotification *note) {
@@ -107,37 +113,7 @@
}
if (contextInfo == MPAlertUnlockMP) {
switch (returnCode) {
- case NSAlertAlternateReturn: {
- // "Change" button.
- NSInteger returnCode_ = [[NSAlert
- alertWithMessageText:@"Changing Master Password" defaultButton:nil
- alternateButton:[PearlStrings get].commonButtonCancel otherButton:nil informativeTextWithFormat:
- @"This will allow you to log in with a different master password.\n\n"
- @"Note that you will only see the sites and passwords for the master password you log in with.\n"
- @"If you log in with a different master password, your current sites will be unavailable.\n\n"
- @"You can always change back to your current master password later.\n"
- @"Your current sites and passwords will then become available again."]
- runModal];
-
- if (returnCode_ == NSAlertDefaultReturn) {
- [MPMacAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
- MPUserEntity *activeUser = [[MPMacAppDelegate get] activeUserInContext:context];
- activeUser.keyID = nil;
- [[MPMacAppDelegate get] forgetSavedKeyFor:activeUser];
- [[MPMacAppDelegate get] signOutAnimated:YES];
- [context saveToStore];
- }];
- }
- break;
- }
-
- case NSAlertOtherReturn: {
- // "Cancel" button.
- [self close];
- break;
- }
-
- case NSAlertDefaultReturn: {
+ case NSAlertFirstButtonReturn: {
// "Unlock" button.
self.contentContainer.alphaValue = 0;
self.inProgress = YES;
@@ -150,7 +126,7 @@
usingMasterPassword:password];
self.inProgress = NO;
- dispatch_async( dispatch_get_current_queue(), ^{
+ [[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (success)
self.contentContainer.alphaValue = 1;
else {
@@ -159,11 +135,41 @@
}]] beginSheetModalForWindow:self.window modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:MPAlertIncorrectMP];
}
- } );
+ }];
}];
break;
}
+ case NSAlertSecondButtonReturn: {
+ // "Change" button.
+ NSAlert *alert_ = [NSAlert new];
+ [alert_ addButtonWithTitle:@"Update"];
+ [alert_ addButtonWithTitle:@"Cancel"];
+ [alert_ setMessageText:@"Changing Master Password"];
+ [alert_ setInformativeText:@"This will allow you to log in with a different master password.\n\n"
+ @"Note that you will only see the sites and passwords for the master password you log in with.\n"
+ @"If you log in with a different master password, your current sites will be unavailable.\n\n"
+ @"You can always change back to your current master password later.\n"
+ @"Your current sites and passwords will then become available again."];
+
+ if ([alert_ runModal] == NSAlertFirstButtonReturn) {
+ [MPMacAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
+ MPUserEntity *activeUser = [[MPMacAppDelegate get] activeUserInContext:context];
+ activeUser.keyID = nil;
+ [[MPMacAppDelegate get] forgetSavedKeyFor:activeUser];
+ [[MPMacAppDelegate get] signOutAnimated:YES];
+ [context saveToStore];
+ }];
+ }
+ break;
+ }
+
+ case NSAlertThirdButtonReturn: {
+ // "Cancel" button.
+ [self close];
+ break;
+ }
+
default:
break;
}
@@ -304,16 +310,19 @@
[self.siteField setStringValue:@""];
- NSAlert *alert = [NSAlert alertWithMessageText:@"Master Password is locked."
- defaultButton:@"Unlock" alternateButton:@"Change" otherButton:@"Cancel"
- informativeTextWithFormat:@"The master password is required to unlock the application for:\n\n%@",
- userName];
+ NSAlert *alert = [NSAlert new];
+ [alert addButtonWithTitle:@"Unlock"];
+ [alert addButtonWithTitle:@"Change"];
+ [alert addButtonWithTitle:@"Cancel"];
+ [alert setMessageText:@"Master Password is locked."];
+ [alert setInformativeText:PearlString( @"The master password is required to unlock the application for:\n\n%@", userName )];
+
NSSecureTextField *passwordField = [[NSSecureTextField alloc] initWithFrame:NSMakeRect( 0, 0, 200, 22 )];
[alert setAccessoryView:passwordField];
[alert layout];
- [passwordField becomeFirstResponder];
[alert beginSheetModalForWindow:self.window modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:MPAlertUnlockMP];
+ [passwordField becomeFirstResponder];
}];
}];
@@ -413,9 +422,11 @@
- (void)createNewSite:(NSString *)siteName {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
- NSAlert *alert = [NSAlert alertWithMessageText:@"Create site?"
- defaultButton:@"Create" alternateButton:nil otherButton:@"Cancel"
- informativeTextWithFormat:@"Do you want to create a new site named:\n\n%@", siteName];
+ NSAlert *alert = [NSAlert new];
+ [alert addButtonWithTitle:@"Create"];
+ [alert addButtonWithTitle:@"Cancel"];
+ [alert setMessageText:@"Create site?"];
+ [alert setInformativeText:PearlString( @"Do you want to create a new site named:\n\n%@", siteName )];
[alert beginSheetModalForWindow:self.window modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:MPAlertCreateSite];
}];
diff --git a/MasterPassword/ObjC/Mac/MasterPassword-Info.plist b/MasterPassword/ObjC/Mac/MasterPassword-Info.plist
index b70e62a7..765a5fb4 100644
--- a/MasterPassword/ObjC/Mac/MasterPassword-Info.plist
+++ b/MasterPassword/ObjC/Mac/MasterPassword-Info.plist
@@ -10,8 +10,8 @@
Master Password
CFBundleExecutable
${EXECUTABLE_NAME}
- CFBundleIconFile
- MasterPassword
+ CFBundleIconFile
+ MasterPassword
CFBundleIdentifier
com.lyndir.lhunath.MasterPassword.Mac
CFBundleInfoDictionaryVersion
diff --git a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj
index 93c93ab3..14ae6cd5 100644
--- a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj
+++ b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj
@@ -1982,7 +1982,7 @@
COMBINE_HIDPI_IMAGES = YES;
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
INFOPLIST_FILE = "MasterPassword-Info.plist";
- PROVISIONING_PROFILE = "";
+ PROVISIONING_PROFILE = "2A46D0C9-E5F0-4C52-BCC6-96434A0D1C1B";
SKIP_INSTALL = NO;
WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}";
};
diff --git a/MasterPassword/ObjC/Mac/en.lproj/MainMenu.xib b/MasterPassword/ObjC/Mac/en.lproj/MainMenu.xib
index 5215d27e..0f7e048a 100644
--- a/MasterPassword/ObjC/Mac/en.lproj/MainMenu.xib
+++ b/MasterPassword/ObjC/Mac/en.lproj/MainMenu.xib
@@ -140,13 +140,30 @@
-