2
0

Deprecating iCloud on Mac.

This commit is contained in:
Maarten Billemont 2014-07-18 22:04:10 -04:00
parent 82195ee090
commit 512f6faf84
10 changed files with 82 additions and 180 deletions

View File

@ -136,8 +136,7 @@ PearlAssociatedObjectProperty( NSManagedObjectContext*, MainManagedObjectContext
^(NSNotification *note) { ^(NSNotification *note) {
[[self mainManagedObjectContext] saveToStore]; [[self mainManagedObjectContext] saveToStore];
}]; }];
[[NSNotificationCenter defaultCenter] [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:UIApp
addObserverForName:UIApplicationWillResignActiveNotification object:UIApp
queue:[NSOperationQueue mainQueue] usingBlock: queue:[NSOperationQueue mainQueue] usingBlock:
^(NSNotification *note) { ^(NSNotification *note) {
[[self mainManagedObjectContext] saveToStore]; [[self mainManagedObjectContext] saveToStore];

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment defaultVersion="1080" identifier="macosx"/> <deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
@ -7,7 +7,6 @@
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPInitialWindowController"> <customObject id="-2" userLabel="File's Owner" customClass="MPInitialWindowController">
<connections> <connections>
<outlet property="enableCloudButton" destination="409" id="572"/>
<outlet property="openAtLoginButton" destination="508" id="571"/> <outlet property="openAtLoginButton" destination="508" id="571"/>
<outlet property="window" destination="1" id="ngh-EA-JYN"/> <outlet property="window" destination="1" id="ngh-EA-JYN"/>
</connections> </connections>
@ -17,26 +16,23 @@
<window title="Welcome to Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" animationBehavior="default" id="1"> <window title="Welcome to Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES"/> <windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES"/>
<rect key="contentRect" x="196" y="240" width="833" height="540"/> <rect key="contentRect" x="196" y="240" width="1000" height="640"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/>
<view key="contentView" id="2" userLabel="Container"> <view key="contentView" id="2" userLabel="Container">
<rect key="frame" x="0.0" y="0.0" width="833" height="540"/> <rect key="frame" x="0.0" y="0.0" width="1000" height="640"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<customView wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="369"> <customView wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="369">
<rect key="frame" x="0.0" y="40" width="833" height="500"/> <rect key="frame" x="0.0" y="40" width="1000" height="600"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="3" userLabel="Image"> <imageView translatesAutoresizingMaskIntoConstraints="NO" id="3" userLabel="Image">
<rect key="frame" x="0.0" y="0.0" width="833" height="500"/> <rect key="frame" x="0.0" y="0.0" width="1000" height="600"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="height" constant="500" id="396"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="shot-laptop-leaning-iphone" id="4"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="shot-laptop-leaning-iphone" id="4"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="268"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="268">
<rect key="frame" x="18" y="402" width="797" height="78"/> <rect key="frame" x="18" y="502" width="964" height="78"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<shadow key="shadow" blurRadius="1"> <shadow key="shadow" blurRadius="1">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
@ -51,7 +47,7 @@ from anywhere.</string>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="283"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="283">
<rect key="frame" x="245" y="72" width="344" height="29"/> <rect key="frame" x="328" y="72" width="344" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<shadow key="shadow" blurRadius="1"> <shadow key="shadow" blurRadius="1">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
@ -64,7 +60,7 @@ from anywhere.</string>
</textFieldCell> </textFieldCell>
</textField> </textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="173" userLabel="Store"> <button translatesAutoresizingMaskIntoConstraints="NO" id="173" userLabel="Store">
<rect key="frame" x="342" y="20" width="150" height="44"/> <rect key="frame" x="425" y="20" width="150" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<shadow key="shadow" blurRadius="1"> <shadow key="shadow" blurRadius="1">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
@ -93,22 +89,8 @@ from anywhere.</string>
<constraint firstItem="283" firstAttribute="centerX" secondItem="268" secondAttribute="centerX" id="544"/> <constraint firstItem="283" firstAttribute="centerX" secondItem="268" secondAttribute="centerX" id="544"/>
</constraints> </constraints>
</customView> </customView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="409">
<rect key="frame" x="691" y="8" width="122" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="122" id="444"/>
</constraints>
<buttonCell key="cell" type="roundTextured" title="Use iCloud" bezelStyle="texturedRounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="410">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="togglePreference:" target="-2" id="573"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="508"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="508">
<rect key="frame" x="561" y="8" width="122" height="25"/> <rect key="frame" x="858" y="8" width="122" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="122" id="509"/> <constraint firstAttribute="width" constant="122" id="509"/>
@ -122,11 +104,8 @@ from anywhere.</string>
</connections> </connections>
</button> </button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="562"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="562">
<rect key="frame" x="21" y="13" width="534" height="17"/> <rect key="frame" x="21" y="13" width="831" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="530" id="566"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="To begin, hold: command, control and P (⌘⌃P) or access the ●●●| menu icon." id="563"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="To begin, hold: command, control and P (⌘⌃P) or access the ●●●| menu icon." id="563">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -137,16 +116,13 @@ from anywhere.</string>
<constraints> <constraints>
<constraint firstItem="369" firstAttribute="top" secondItem="2" secondAttribute="top" id="374"/> <constraint firstItem="369" firstAttribute="top" secondItem="2" secondAttribute="top" id="374"/>
<constraint firstItem="369" firstAttribute="leading" secondItem="2" secondAttribute="leading" id="375"/> <constraint firstItem="369" firstAttribute="leading" secondItem="2" secondAttribute="leading" id="375"/>
<constraint firstAttribute="trailing" secondItem="409" secondAttribute="trailing" constant="20" symbolic="YES" id="507"/>
<constraint firstItem="508" firstAttribute="baseline" secondItem="409" secondAttribute="baseline" id="513"/>
<constraint firstItem="508" firstAttribute="top" secondItem="369" secondAttribute="bottom" constant="8" symbolic="YES" id="514"/> <constraint firstItem="508" firstAttribute="top" secondItem="369" secondAttribute="bottom" constant="8" symbolic="YES" id="514"/>
<constraint firstItem="409" firstAttribute="leading" secondItem="508" secondAttribute="trailing" constant="8" symbolic="YES" id="515"/>
<constraint firstAttribute="bottom" secondItem="508" secondAttribute="bottom" constant="10" id="545"/> <constraint firstAttribute="bottom" secondItem="508" secondAttribute="bottom" constant="10" id="545"/>
<constraint firstAttribute="bottom" secondItem="409" secondAttribute="bottom" constant="10" id="546"/>
<constraint firstItem="562" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="23" id="565"/> <constraint firstItem="562" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="23" id="565"/>
<constraint firstItem="369" firstAttribute="trailing" secondItem="2" secondAttribute="trailing" id="567"/> <constraint firstItem="369" firstAttribute="trailing" secondItem="2" secondAttribute="trailing" id="567"/>
<constraint firstItem="508" firstAttribute="leading" secondItem="562" secondAttribute="trailing" constant="8" symbolic="YES" id="568"/> <constraint firstItem="508" firstAttribute="leading" secondItem="562" secondAttribute="trailing" constant="8" symbolic="YES" id="568"/>
<constraint firstItem="562" firstAttribute="baseline" secondItem="508" secondAttribute="baseline" id="569"/> <constraint firstItem="562" firstAttribute="baseline" secondItem="508" secondAttribute="baseline" id="569"/>
<constraint firstAttribute="trailing" secondItem="508" secondAttribute="trailing" constant="20" symbolic="YES" id="nH9-cd-trF"/>
</constraints> </constraints>
</view> </view>
</window> </window>

View File

@ -21,7 +21,6 @@
@interface MPInitialWindowController : NSWindowController @interface MPInitialWindowController : NSWindowController
@property(nonatomic, weak) IBOutlet NSButton *openAtLoginButton; @property(nonatomic, weak) IBOutlet NSButton *openAtLoginButton;
@property(nonatomic, weak) IBOutlet NSButton *enableCloudButton;
- (IBAction)iphoneAppStore:(id)sender; - (IBAction)iphoneAppStore:(id)sender;
- (IBAction)togglePreference:(id)sender; - (IBAction)togglePreference:(id)sender;

View File

@ -44,15 +44,6 @@
- (IBAction)togglePreference:(id)sender { - (IBAction)togglePreference:(id)sender {
if (sender == self.enableCloudButton) {
if (([MPMacAppDelegate get].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.openAtLoginButton) if (sender == self.openAtLoginButton)
[[MPMacAppDelegate get] setLoginItemEnabled:self.openAtLoginButton.state == NSOnState]; [[MPMacAppDelegate get] setLoginItemEnabled:self.openAtLoginButton.state == NSOnState];
} }

View File

@ -20,7 +20,6 @@
@property(nonatomic, weak) IBOutlet NSMenuItem *lockItem; @property(nonatomic, weak) IBOutlet NSMenuItem *lockItem;
@property(nonatomic, weak) IBOutlet NSMenuItem *showItem; @property(nonatomic, weak) IBOutlet NSMenuItem *showItem;
@property(nonatomic, strong) IBOutlet NSMenu *statusMenu; @property(nonatomic, strong) IBOutlet NSMenu *statusMenu;
@property(nonatomic, weak) IBOutlet NSMenuItem *useCloudItem;
@property(nonatomic, weak) IBOutlet NSMenuItem *hidePasswordsItem; @property(nonatomic, weak) IBOutlet NSMenuItem *hidePasswordsItem;
@property(nonatomic, weak) IBOutlet NSMenuItem *rememberPasswordItem; @property(nonatomic, weak) IBOutlet NSMenuItem *rememberPasswordItem;
@property(nonatomic, weak) IBOutlet NSMenuItem *openAtLoginItem; @property(nonatomic, weak) IBOutlet NSMenuItem *openAtLoginItem;
@ -34,8 +33,6 @@
- (IBAction)togglePreference:(id)sender; - (IBAction)togglePreference:(id)sender;
- (IBAction)newUser:(NSMenuItem *)sender; - (IBAction)newUser:(NSMenuItem *)sender;
- (IBAction)lock:(id)sender; - (IBAction)lock:(id)sender;
- (IBAction)rebuildCloud:(id)sender;
- (IBAction)corruptCloud:(id)sender;
- (IBAction)terminate:(id)sender; - (IBAction)terminate:(id)sender;
- (IBAction)showPopup:(id)sender; - (IBAction)showPopup:(id)sender;

View File

@ -16,12 +16,6 @@
#define LOGIN_HELPER_BUNDLE_ID @"com.lyndir.lhunath.MasterPassword.Mac.LoginHelper" #define LOGIN_HELPER_BUNDLE_ID @"com.lyndir.lhunath.MasterPassword.Mac.LoginHelper"
@interface UbiquityStoreManager(Private)
- (void)markCloudStoreCorrupted;
@end
@implementation MPMacAppDelegate @implementation MPMacAppDelegate
#pragma clang diagnostic push #pragma clang diagnostic push
@ -79,11 +73,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
[weakSelf updateMenuItems]; [weakSelf updateMenuItems];
} ); } );
} forKeyPath:@"activeUser" options:0 context:nil]; } forKeyPath:@"activeUser" options:0 context:nil];
[self addObserverBlock:^(NSString *keyPath, id object, NSDictionary *change, void *context) {
dispatch_async( dispatch_get_main_queue(), ^{
[weakSelf updateMenuItems];
} );
} forKeyPath:@"storeManager.cloudAvailable" options:0 context:nil];
// Status item. // Status item.
self.statusView = [[RHStatusItemView alloc] initWithStatusBarItem: self.statusView = [[RHStatusItemView alloc] initWithStatusBarItem:
@ -126,8 +115,9 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
err( @"Error registering 'lock' hotkey: %i", (int)status ); err( @"Error registering 'lock' hotkey: %i", (int)status );
// Initial display. // Initial display.
if ([[MPMacConfig get].firstRun boolValue]){ if ([[MPMacConfig get].firstRun boolValue]) {
[(self.initialWindowController = [[MPInitialWindowController alloc] initWithWindowNibName:@"MPInitialWindow"]).window makeKeyAndOrderFront:self]; [(self.initialWindowController = [[MPInitialWindowController alloc] initWithWindowNibName:@"MPInitialWindow"])
.window makeKeyAndOrderFront:self];
[NSApp activateIgnoringOtherApps:YES]; [NSApp activateIgnoringOtherApps:YES];
} }
} }
@ -314,8 +304,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
- (IBAction)togglePreference:(id)sender { - (IBAction)togglePreference:(id)sender {
if (sender == self.useCloudItem)
[self storeManager].cloudEnabled = self.useCloudItem.state != NSOnState;
if (sender == self.hidePasswordsItem) if (sender == self.hidePasswordsItem)
[MPConfig get].hidePasswords = [NSNumber numberWithBool:![[MPConfig get].hidePasswords boolValue]]; [MPConfig get].hidePasswords = [NSNumber numberWithBool:![[MPConfig get].hidePasswords boolValue]];
if (sender == self.rememberPasswordItem) if (sender == self.rememberPasswordItem)
@ -393,26 +381,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
self.key = nil; self.key = nil;
} }
- (IBAction)rebuildCloud:(id)sender {
if ([[NSAlert alertWithMessageText:@"iCloud Truth Push" defaultButton:@"Continue"
alternateButton:nil otherButton:@"Cancel"
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 { - (IBAction)terminate:(id)sender {
[self.passwordWindowController close]; [self.passwordWindowController close];
@ -547,8 +515,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
if (![users count]) { if (![users count]) {
NSMenuItem *noUsersItem = [self.usersItem.submenu addItemWithTitle:@"No users" action:NULL keyEquivalent:@""]; NSMenuItem *noUsersItem = [self.usersItem.submenu addItemWithTitle:@"No users" action:NULL keyEquivalent:@""];
noUsersItem.enabled = NO; noUsersItem.enabled = NO;
noUsersItem.toolTip = @"Use the iOS app to create users and make sure iCloud is enabled in its preferences as well. " noUsersItem.toolTip = @"Begin by creating a user.";
@"Then give iCloud some time to sync the new user to your Mac.";
} }
self.usersItem.state = NSMixedState; self.usersItem.state = NSMixedState;
@ -627,17 +594,29 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
self.savePasswordItem.enabled = YES; self.savePasswordItem.enabled = YES;
self.savePasswordItem.toolTip = nil; self.savePasswordItem.toolTip = nil;
} }
}
self.useCloudItem.state = self.storeManager.cloudEnabled? NSOnState: NSOffState; #pragma mark - UbiquityStoreManagerDelegate
self.initialWindowController.enableCloudButton.state = self.storeManager.cloudEnabled? NSOnState: NSOffState;
self.useCloudItem.enabled = self.storeManager.cloudAvailable; - (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didLoadStoreForCoordinator:(NSPersistentStoreCoordinator *)coordinator
if (self.storeManager.cloudAvailable) { isCloud:(BOOL)isCloudStore {
self.useCloudItem.title = @"Use iCloud";
self.useCloudItem.toolTip = nil; [super ubiquityStoreManager:manager didLoadStoreForCoordinator:coordinator isCloud:isCloudStore];
}
else { if (isCloudStore) {
self.useCloudItem.title = @"Use iCloud (Unavailable)"; NSAlert *alert = [NSAlert new];
self.useCloudItem.toolTip = @"iCloud is not set up for your Mac user."; alert.messageText = @"iCloud Support Deprecated";
alert.informativeText = @"Master Password is moving away from iCloud due to limited platform support and reliability issues. "
@"\n\nMaster Password's generated passwords do not require syncing. "
@"Your sites will always have the same passwords on all your devices. "
@"\n\niCloud continues to work for now but will be deactivated in a future update. "
@"Disable iCloud now to copy your iCloud sites to your device and avoid losing them when iCloud becomes discontinued.";
[alert addButtonWithTitle:@"Disable iCloud"];
[alert addButtonWithTitle:@"Ignore For Now"];
NSInteger response = [alert runModal];
if (response == NSAlertFirstButtonReturn)
[[self storeManager] migrateCloudToLocal];
} }
} }

View File

@ -28,6 +28,7 @@
@property(nonatomic) NSString *masterPassword; @property(nonatomic) NSString *masterPassword;
@property(nonatomic) BOOL alternatePressed; @property(nonatomic) BOOL alternatePressed;
@property(nonatomic) BOOL locked; @property(nonatomic) BOOL locked;
@property(nonatomic) BOOL newUser;
@property(nonatomic, weak) IBOutlet NSArrayController *elementsController; @property(nonatomic, weak) IBOutlet NSArrayController *elementsController;
@property(nonatomic, weak) IBOutlet NSImageView *blurView; @property(nonatomic, weak) IBOutlet NSImageView *blurView;

View File

@ -476,12 +476,15 @@
[MPMacAppDelegate managedObjectContextForMainThreadPerformBlock:^(NSManagedObjectContext *mainContext) { [MPMacAppDelegate managedObjectContextForMainThreadPerformBlock:^(NSManagedObjectContext *mainContext) {
self.locked = YES; self.locked = YES;
self.newUser = YES;
self.inputLabel.stringValue = @""; self.inputLabel.stringValue = @"";
self.siteField.stringValue = @""; self.siteField.stringValue = @"";
MPUserEntity *mainActiveUser = [[MPMacAppDelegate get] activeUserInContext:mainContext]; MPUserEntity *mainActiveUser = [[MPMacAppDelegate get] activeUserInContext:mainContext];
if (mainActiveUser) { if (mainActiveUser) {
self.newUser = mainActiveUser.keyID == nil;
if ([MPMacAppDelegate get].key) { if ([MPMacAppDelegate get].key) {
self.inputLabel.stringValue = strf( @"%@'s password for:", mainActiveUser.name ); self.inputLabel.stringValue = strf( @"%@'s password for:", mainActiveUser.name );
self.locked = NO; self.locked = NO;

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment defaultVersion="1080" identifier="macosx"/> <deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
@ -86,7 +86,6 @@
</secureTextField> </secureTextField>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="v80-wd-hUR" userLabel="Reveal Master Password"> <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="v80-wd-hUR" userLabel="Reveal Master Password">
<rect key="frame" x="18" y="258" width="604" height="44"/> <rect key="frame" x="18" y="258" width="604" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<shadow key="shadow" blurRadius="1"> <shadow key="shadow" blurRadius="1">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
@ -139,13 +138,13 @@
</binding> </binding>
</connections> </connections>
</button> </button>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="Bme-XK-MMc" userLabel="Sites Table"> <scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="35" horizontalPageScroll="10" verticalLineScroll="35" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="Bme-XK-MMc" userLabel="Sites Table">
<rect key="frame" x="64" y="80" width="512" height="147"/> <rect key="frame" x="64" y="80" width="512" height="147"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="e11-59-xSS"> <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="e11-59-xSS">
<rect key="frame" x="0.0" y="0.0" width="512" height="147"/> <rect key="frame" x="0.0" y="0.0" width="512" height="147"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="sourceList" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" floatsGroupRows="NO" id="xvJ-5c-vDp" customClass="MPElementsTableView"> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="sourceList" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="33" rowSizeStyle="automatic" viewBased="YES" floatsGroupRows="NO" id="xvJ-5c-vDp" customClass="MPElementsTableView">
<rect key="frame" x="0.0" y="0.0" width="515" height="147"/> <rect key="frame" x="0.0" y="0.0" width="515" height="147"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/> <size key="intercellSpacing" width="3" height="2"/>
@ -450,12 +449,8 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
<connections> <connections>
<binding destination="mcS-ik-b0n" name="hidden2" keyPath="selection.stored" previousBinding="hIV-Oj-0k4" id="ejq-kZ-id9"> <binding destination="mcS-ik-b0n" name="hidden" keyPath="canRemove" id="hIV-Oj-0k4">
<dictionary key="options"> <dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string> <string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary> </dictionary>
</binding> </binding>
@ -467,8 +462,12 @@
<integer key="NSNullPlaceholder" value="0"/> <integer key="NSNullPlaceholder" value="0"/>
</dictionary> </dictionary>
</binding> </binding>
<binding destination="mcS-ik-b0n" name="hidden" keyPath="canRemove" id="hIV-Oj-0k4"> <binding destination="mcS-ik-b0n" name="hidden2" keyPath="selection.stored" previousBinding="hIV-Oj-0k4" id="ejq-kZ-id9">
<dictionary key="options"> <dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string> <string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary> </dictionary>
</binding> </binding>
@ -486,6 +485,15 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
<connections> <connections>
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="I7S-x6-XZk" id="yjF-57-SD5">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="-2" name="hidden" keyPath="locked" id="I7S-x6-XZk"> <binding destination="-2" name="hidden" keyPath="locked" id="I7S-x6-XZk">
<dictionary key="options"> <dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string> <string key="NSValueTransformerName">NSNegateBoolean</string>
@ -510,6 +518,15 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
<connections> <connections>
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="yDL-cR-bDf" id="fus-M7-S1J">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="-2" name="hidden" keyPath="locked" id="yDL-cR-bDf"> <binding destination="-2" name="hidden" keyPath="locked" id="yDL-cR-bDf">
<dictionary key="options"> <dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string> <string key="NSValueTransformerName">NSNegateBoolean</string>
@ -529,7 +546,7 @@
<constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/> <constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/>
</constraints> </constraints>
</customView> </customView>
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="npC-Kk-gUM"> <textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="npC-Kk-gUM">
<rect key="frame" x="140" y="235" width="359" height="15"/> <rect key="frame" x="140" y="235" width="359" height="15"/>
<shadow key="shadow" blurRadius="1"> <shadow key="shadow" blurRadius="1">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
@ -740,6 +757,7 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
<connections> <connections>
<binding destination="-2" name="hidden" keyPath="alternatePressed" id="WYo-IW-qdh"/>
<binding destination="mcS-ik-b0n" name="hidden2" keyPath="canRemove" previousBinding="WYo-IW-qdh" id="C3l-ng-Hqh"> <binding destination="mcS-ik-b0n" name="hidden2" keyPath="canRemove" previousBinding="WYo-IW-qdh" id="C3l-ng-Hqh">
<dictionary key="options"> <dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/> <integer key="NSMultipleValuesPlaceholder" value="-1"/>
@ -749,15 +767,6 @@
<string key="NSValueTransformerName">NSNegateBoolean</string> <string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary> </dictionary>
</binding> </binding>
<binding destination="mcS-ik-b0n" name="hidden3" keyPath="selection.stored" previousBinding="C3l-ng-Hqh" id="83Q-cv-B55">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="mcS-ik-b0n" name="hidden4" keyPath="selection.content.length" previousBinding="83Q-cv-B55" id="ywp-JP-ogX"> <binding destination="mcS-ik-b0n" name="hidden4" keyPath="selection.content.length" previousBinding="83Q-cv-B55" id="ywp-JP-ogX">
<dictionary key="options"> <dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/> <integer key="NSMultipleValuesPlaceholder" value="-1"/>
@ -766,7 +775,15 @@
<integer key="NSNullPlaceholder" value="0"/> <integer key="NSNullPlaceholder" value="0"/>
</dictionary> </dictionary>
</binding> </binding>
<binding destination="-2" name="hidden" keyPath="alternatePressed" id="WYo-IW-qdh"/> <binding destination="mcS-ik-b0n" name="hidden3" keyPath="selection.stored" previousBinding="C3l-ng-Hqh" id="83Q-cv-B55">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections> </connections>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gAU-xs-aae"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gAU-xs-aae">
@ -912,7 +929,6 @@
</matrix> </matrix>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kCO-1M-Wz1"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kCO-1M-Wz1">
<rect key="frame" x="16" y="14" width="382" height="56"/> <rect key="frame" x="16" y="14" width="382" height="56"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="kl0-P1-6ZY"> <textFieldCell key="cell" sendsActionOnEndEditing="YES" id="kl0-P1-6ZY">
<font key="font" metaFont="toolTip"/> <font key="font" metaFont="toolTip"/>
<string key="title">"Personal password" allows you to store your own password. It cannot be regenerated in the event of loss. "Device private password" is similar but will never leave your device: it cannot be synced, backed up or exported.</string> <string key="title">"Personal password" allows you to store your own password. It cannot be regenerated in the event of loss. "Device private password" is similar but will never leave your device: it cannot be synced, backed up or exported.</string>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment version="1070" defaultVersion="1080" identifier="macosx"/> <deployment version="1070" defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
@ -24,7 +24,6 @@
<outlet property="savePasswordItem" destination="747" id="751"/> <outlet property="savePasswordItem" destination="747" id="751"/>
<outlet property="showItem" destination="719" id="783"/> <outlet property="showItem" destination="719" id="783"/>
<outlet property="statusMenu" destination="716" id="731"/> <outlet property="statusMenu" destination="716" id="731"/>
<outlet property="useCloudItem" destination="743" id="749"/>
<outlet property="usersItem" destination="755" id="762"/> <outlet property="usersItem" destination="755" id="762"/>
</connections> </connections>
</customObject> </customObject>
@ -55,23 +54,6 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Preferences" autoenablesItems="NO" id="742"> <menu key="submenu" title="Preferences" autoenablesItems="NO" id="742">
<items> <items>
<menuItem title="Use iCloud" id="743">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="togglePreference:" target="494" id="752"/>
</connections>
</menuItem>
<menuItem title="Synchronize available sites from your iCloud account." enabled="NO" id="746">
<attributedString key="attributedTitle">
<fragment content="Synchronize available sites from your iCloud account.">
<attributes>
<font key="NSFont" size="12" name="Helvetica"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural"/>
</attributes>
</fragment>
</attributedString>
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Open At Login" id="785"> <menuItem title="Open At Login" id="785">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
@ -199,47 +181,6 @@
<action selector="importSites:" target="494" id="CNv-4j-036"/> <action selector="importSites:" target="494" id="CNv-4j-036"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Advanced" id="776">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Advanced" id="777">
<items>
<menuItem title="iCloud Truth Push" id="778">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="rebuildCloud:" target="494" id="780"/>
</connections>
</menuItem>
<menuItem title="Force this device's version of the truth upon all others." enabled="NO" id="779">
<attributedString key="attributedTitle">
<fragment content="Force this device's version of the truth upon all others.">
<attributes>
<font key="NSFont" size="12" name="Helvetica"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural"/>
</attributes>
</fragment>
</attributedString>
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="iCloud Truth Pull" id="cLQ-kc-cYN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="corruptCloud:" target="494" id="asr-sb-Zkz"/>
</connections>
</menuItem>
<menuItem title="Force this device's version of the truth upon all others." enabled="NO" id="6NL-ki-Jff">
<attributedString key="attributedTitle">
<fragment content="Force this device's version of the truth upon all others.">
<attributes>
<font key="NSFont" size="12" name="Helvetica"/>
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural"/>
</attributes>
</fragment>
</attributedString>
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
</menu>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>