diff --git a/External/Crashlytics.framework/Versions/A/Crashlytics b/External/Crashlytics.framework/Versions/A/Crashlytics index 4701a362..1230b7e0 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 1290a7a3..60ba0760 100644 --- a/External/Crashlytics.framework/Versions/A/Resources/Info.plist +++ b/External/Crashlytics.framework/Versions/A/Resources/Info.plist @@ -15,13 +15,13 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.1.6 + 2.1.7 CFBundleSupportedPlatforms iPhoneOS CFBundleVersion - 21 + 26 DTPlatformName iphoneos MinimumOSVersion diff --git a/External/Crashlytics.framework/run b/External/Crashlytics.framework/run index 09c7c04a..d2c28068 100755 Binary files a/External/Crashlytics.framework/run and b/External/Crashlytics.framework/run differ diff --git a/External/LoveLyndir b/External/LoveLyndir index adab69df..97eafd9b 160000 --- a/External/LoveLyndir +++ b/External/LoveLyndir @@ -1 +1 @@ -Subproject commit adab69df05840d94a3f2f883251869d6cb352b0e +Subproject commit 97eafd9b59f84bd9e3fc3cb4313df8b3c034e766 diff --git a/External/Pearl b/External/Pearl index 081c2dec..9e41cebe 160000 --- a/External/Pearl +++ b/External/Pearl @@ -1 +1 @@ -Subproject commit 081c2dec20b3638694a5ad20cd2fddccdb298447 +Subproject commit 9e41cebeba085fce2bbae2592d52bbfd740f9ffb diff --git a/MasterPassword/ObjC/Mac/MPElementCollectionView.m b/MasterPassword/ObjC/Mac/MPElementCollectionView.m index 28b77868..d90c3c01 100644 --- a/MasterPassword/ObjC/Mac/MPElementCollectionView.m +++ b/MasterPassword/ObjC/Mac/MPElementCollectionView.m @@ -205,6 +205,8 @@ MPElementEntity *element = [self.representedObject entityInContext:context]; [context deleteObject:element]; [context saveToStore]; + + [((MPPasswordWindowController *)self.collectionView.window.windowController) updateElements]; }]; break; } diff --git a/MasterPassword/ObjC/Mac/MPPasswordWindowController.h b/MasterPassword/ObjC/Mac/MPPasswordWindowController.h index 649dc377..374b86a7 100644 --- a/MasterPassword/ObjC/Mac/MPPasswordWindowController.h +++ b/MasterPassword/ObjC/Mac/MPPasswordWindowController.h @@ -18,4 +18,6 @@ @property(nonatomic, weak) IBOutlet NSTextField *userLabel; @property(nonatomic, weak) IBOutlet NSCollectionView *siteCollectionView; +- (void)updateElements; + @end diff --git a/MasterPassword/ObjC/Mac/MPPasswordWindowController.m b/MasterPassword/ObjC/Mac/MPPasswordWindowController.m index b397e28a..bf450bfc 100644 --- a/MasterPassword/ObjC/Mac/MPPasswordWindowController.m +++ b/MasterPassword/ObjC/Mac/MPPasswordWindowController.m @@ -178,14 +178,17 @@ } if (contextInfo == MPAlertCreateSite) { switch (returnCode) { - case NSAlertDefaultReturn: { + case NSAlertFirstButtonReturn: { + // "Create" button. [[MPMacAppDelegate get] addElementNamed:[self.siteField stringValue] completion:^(MPElementEntity *element) { - if (element) { + if (element) [self updateElements]; - } }]; break; } + case NSAlertThirdButtonReturn: + // "Cancel" button. + break; default: break; } @@ -345,23 +348,35 @@ NSError *error = nil; NSArray *siteResults = [context executeFetchRequest:fetchRequest error:&error]; - if (!siteResults) - err(@"While fetching elements for completion: %@", error); - else if ([siteResults count]) { - NSMutableArray *newElements = [NSMutableArray arrayWithCapacity:[siteResults count]]; - for (MPElementEntity *element in siteResults) - [newElements addObject:[[MPElementModel alloc] initWithEntity:element]]; - self.elements = newElements; - if (!self.selectedElement && [newElements count]) - self.elementSelectionIndexes = [NSIndexSet indexSetWithIndex:0]; + if (!siteResults) { + err(@"While fetching elements for completion: %@", error); + return; } + + NSMutableArray *newElements = [NSMutableArray arrayWithCapacity:[siteResults count]]; + for (MPElementEntity *element in siteResults) + [newElements addObject:[[MPElementModel alloc] initWithEntity:element]]; + self.elements = newElements; + if (!self.selectedElement) + self.elementSelectionIndexes = [newElements count]? [NSIndexSet indexSetWithIndex:0]: nil; }]; } +- (NSUInteger)selectedIndex { + + if (!self.elementSelectionIndexes) + return NSNotFound; + NSUInteger selectedIndex = self.elementSelectionIndexes.firstIndex; + if (selectedIndex >= self.elements.count) + return NSNotFound; + + return selectedIndex; +} + - (NSBox *)selectedView { - NSUInteger selectedIndex = self.elementSelectionIndexes.firstIndex; - if (selectedIndex == NSNotFound || selectedIndex >= self.elements.count) + NSUInteger selectedIndex = [self selectedIndex]; + if (selectedIndex == NSNotFound) return nil; return (NSBox *)[self.siteCollectionView itemAtIndex:selectedIndex].view; @@ -369,10 +384,11 @@ - (MPElementModel *)selectedElement { - if (!self.elementSelectionIndexes.count) + NSUInteger selectedIndex = [self selectedIndex]; + if (selectedIndex == NSNotFound) return nil; - return (MPElementModel *)self.elements[self.elementSelectionIndexes.firstIndex]; + return (MPElementModel *)self.elements[selectedIndex]; } - (void)setSelectedElement:(MPElementModel *)element { diff --git a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj index 14ae6cd5..71e50721 100644 --- a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj @@ -1894,7 +1894,7 @@ CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; - CODE_SIGN_IDENTITY = "3rd Party Mac Developer Application"; + CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( @@ -1960,12 +1960,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = MasterPassword.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer: Maarten Billemont (DWGU95U4ZD)"; COMBINE_HIDPI_IMAGES = YES; GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch"; INFOPLIST_FILE = "MasterPassword-Info.plist"; - PROVISIONING_PROFILE = "9AEC6040-D157-4526-8CA9-FF0254B3A4A5"; SKIP_INSTALL = NO; WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}"; }; @@ -1977,12 +1974,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = MasterPassword.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; COMBINE_HIDPI_IMAGES = YES; GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch"; INFOPLIST_FILE = "MasterPassword-Info.plist"; - PROVISIONING_PROFILE = "2A46D0C9-E5F0-4C52-BCC6-96434A0D1C1B"; SKIP_INSTALL = NO; WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}"; }; @@ -2009,7 +2003,7 @@ CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; - CODE_SIGN_IDENTITY = "3rd Party Mac Developer Application"; + CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( @@ -2075,12 +2069,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = MasterPassword.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application: Maarten Billemont (HL3Q45LX9N)"; COMBINE_HIDPI_IMAGES = YES; GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch"; INFOPLIST_FILE = "MasterPassword-Info.plist"; - PROVISIONING_PROFILE = "170D83FD-18FE-4A05-B13C-8D16876480C6"; SKIP_INSTALL = NO; WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}"; }; diff --git a/MasterPassword/ObjC/Mac/MasterPassword.entitlements b/MasterPassword/ObjC/Mac/MasterPassword.entitlements index 4475482e..4965233b 100644 --- a/MasterPassword/ObjC/Mac/MasterPassword.entitlements +++ b/MasterPassword/ObjC/Mac/MasterPassword.entitlements @@ -4,11 +4,11 @@ com.apple.developer.ubiquity-container-identifiers - $(TeamIdentifierPrefix)com.lyndir.lhunath.MasterPassword.Mac - $(TeamIdentifierPrefix)com.lyndir.lhunath.MasterPassword.shared + HL3Q45LX9N.com.lyndir.lhunath.MasterPassword.Mac + HL3Q45LX9N.com.lyndir.lhunath.MasterPassword.shared com.apple.developer.ubiquity-kvstore-identifier - $(TeamIdentifierPrefix)com.lyndir.lhunath.MasterPassword.shared + HL3Q45LX9N.com.lyndir.lhunath.MasterPassword.shared com.apple.security.app-sandbox diff --git a/MasterPassword/ObjC/iOS/MPGuideViewController.h b/MasterPassword/ObjC/iOS/MPGuideViewController.h index c55481b0..e5d76e9c 100644 --- a/MasterPassword/ObjC/iOS/MPGuideViewController.h +++ b/MasterPassword/ObjC/iOS/MPGuideViewController.h @@ -10,6 +10,7 @@ @interface MPGuideViewController : UIViewController +@property(weak, nonatomic) IBOutlet UISearchBar *searchBar; @property(weak, nonatomic) IBOutlet UIView *siteNameTip; @property(weak, nonatomic) IBOutlet UIView *contentTip; @property(weak, nonatomic) IBOutlet UILabel *contentTipText; diff --git a/MasterPassword/ObjC/iOS/MPGuideViewController.m b/MasterPassword/ObjC/iOS/MPGuideViewController.m index 4eeeeec3..1d68c338 100644 --- a/MasterPassword/ObjC/iOS/MPGuideViewController.m +++ b/MasterPassword/ObjC/iOS/MPGuideViewController.m @@ -64,6 +64,7 @@ // Via setup self.smallPlayButton.hidden = YES; + self.searchBar.text = nil; self.siteNameTip.alpha = 0; self.content.alpha = 0; self.content.frame = CGRectSetHeight( self.content.frame, 180 ); @@ -81,6 +82,7 @@ // Via segue self.largePlayButton.hidden = YES; + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 1; self.content.alpha = 1; self.content.frame = CGRectSetHeight( self.content.frame, 231 ); @@ -147,6 +149,7 @@ if (self.currentTick < 5) { [UIView animateWithDuration:0.5 animations:^{ + self.searchBar.text = nil; self.siteNameTip.alpha = 1; self.content.alpha = 0; self.content.frame = CGRectSetHeight( self.content.frame, 180 ); @@ -159,6 +162,7 @@ } else if (self.currentTick < 10) { [UIView animateWithDuration:0.5 animations:^{ + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 0; self.content.alpha = 1; self.contentTip.alpha = 1; @@ -171,6 +175,7 @@ } else if (self.currentTick < 15) { [UIView animateWithDuration:0.5 animations:^{ + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 0; self.content.alpha = 1; self.contentTip.alpha = 1; @@ -185,6 +190,7 @@ } else if (self.currentTick < 20) { [UIView animateWithDuration:0.5 animations:^{ + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 0; self.content.alpha = 1; self.content.frame = CGRectSetHeight( self.content.frame, 231 ); @@ -199,6 +205,7 @@ } else if (self.currentTick < 25) { [UIView animateWithDuration:0.5 animations:^{ + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 0; self.content.alpha = 1; self.contentTip.alpha = 0; @@ -212,6 +219,7 @@ } else if (self.currentTick < 30) { [UIView animateWithDuration:0.5 animations:^{ + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 0; self.content.alpha = 1; self.contentTip.alpha = 0; @@ -230,6 +238,7 @@ self.currentTick = 0; [UIView animateWithDuration:0.5 animations:^{ [self.smallPlayButton setImage:[UIImage imageNamed:@"icon_play"] forState:UIControlStateNormal]; + self.searchBar.text = @"gmail.com"; self.siteNameTip.alpha = 1; self.content.alpha = 1; self.contentTip.alpha = 1; diff --git a/MasterPassword/ObjC/iOS/MPUnlockViewController.h b/MasterPassword/ObjC/iOS/MPUnlockViewController.h index a048c9e9..d8d236a5 100644 --- a/MasterPassword/ObjC/iOS/MPUnlockViewController.h +++ b/MasterPassword/ObjC/iOS/MPUnlockViewController.h @@ -7,6 +7,7 @@ // #import +#import "LLGitTip.h" @interface MPUnlockViewController : UIViewController @@ -26,6 +27,8 @@ @property(strong, nonatomic) IBOutlet UILongPressGestureRecognizer *targetedUserActionGesture; @property(weak, nonatomic) IBOutlet UIView *uiContainer; @property(weak, nonatomic) IBOutlet UIView *shareContainer; +@property(weak, nonatomic) IBOutlet UIView *tipsTipContainer; +@property(weak, nonatomic) IBOutlet LLGitTip *gitTipButton; @property(weak, nonatomic) IBOutlet UIWebView *newsView; @property(weak, nonatomic) IBOutlet UIView *emergencyGeneratorContainer; @property(weak, nonatomic) IBOutlet UITextField *emergencyName; diff --git a/MasterPassword/ObjC/iOS/MPUnlockViewController.m b/MasterPassword/ObjC/iOS/MPUnlockViewController.m index 282b71b3..58143131 100644 --- a/MasterPassword/ObjC/iOS/MPUnlockViewController.m +++ b/MasterPassword/ObjC/iOS/MPUnlockViewController.m @@ -12,6 +12,7 @@ #import "MPiOSAppDelegate.h" #import "MPAppDelegate_Key.h" #import "MPAppDelegate_Store.h" +#import "LLGitTip.h" @interface MPUnlockViewController() @@ -127,6 +128,7 @@ - (void)viewDidLoad { + self.gitTipButton.iTunesID = [MPConfig get].iTunesID; self.avatarToUserOID = [NSMutableDictionary dictionaryWithCapacity:3]; [self.avatarsView addGestureRecognizer:self.targetedUserActionGesture]; @@ -230,6 +232,7 @@ self.uiContainer.alpha = 0; self.shareContainer.alpha = 0; self.spinner.alpha = 0; + self.tipsTipContainer.alpha = 0; [super viewWillAppear:animated]; } @@ -249,6 +252,8 @@ if (finished) [UIView animateWithDuration:1 animations:^{ self.shareContainer.alpha = 1; + if ([MPConfig get].firstVersionRun) + self.tipsTipContainer.alpha = 1; }]; }]; diff --git a/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard b/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard index 1e3025f5..f34dfcd0 100644 --- a/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard +++ b/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard @@ -1,5 +1,5 @@ - + @@ -470,15 +470,15 @@ Your passwords will be AES-encrypted with your master password. - + - + - + 119-20:51:52 MPiOSAppDelegate.m:36 | INFO : Initializing TestFlight @@ -508,7 +508,7 @@ Your passwords will be AES-encrypted with your master password. - + @@ -524,7 +524,7 @@ Your passwords will be AES-encrypted with your master password. - + @@ -1575,182 +1575,34 @@ You can use the words in the background for inspiration in finding a memorable m - - - - - @@ -1772,6 +1624,7 @@ You can use the words in the background for inspiration in finding a memorable m + @@ -1783,12 +1636,180 @@ You can use the words in the background for inspiration in finding a memorable m + + @@ -1831,7 +1852,7 @@ You can use the words in the background for inspiration in finding a memorable m - + @@ -1849,20 +1870,21 @@ You can use the words in the background for inspiration in finding a memorable m - - + + - Enabling iCloud will keep all your iPhones, iPads and Macs nicely in-sync. Any site you add on this device will automatically appear on all your others as well. + Enabling iCloud will keep all your iPhones, iPads and Macs nicely in-sync. Any site you add on this device will automatically appear on all your others as well. -Thanks to the special way Master Password works, your site passwords don't need to be sent to Apple. -If you set a custom password, it will be encrypted before it is saved to the cloud. +Note that even without iCloud syncing, you can make your passwords available from any device by simply creating the same user on all your devices. Enabling iCloud is mainly benefitial to keep the list of sites you use in sync on all your devices. + +Only site names and custom passwords are sent to iCloud. Passwords are encrypted with your master password and illegible by Apple or any interceptor. - - + + @@ -2428,7 +2450,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo - + @@ -2701,7 +2723,7 @@ You can make passwords for anything, like email addresses, sites or real-world t - + @@ -2883,7 +2905,7 @@ You can make passwords for anything, like email addresses, sites or real-world t • Use the short site name (eg. apple.com), don't include the prefix (eg. www). - • Use generated passwords. If you ever lose your user or phone, recreating the user will resurrect them from thin air. + • Use generated passwords, avoid custom passwords. If you ever lose your user or phone, recreating the user will resurrect them from thin air. @@ -2910,6 +2932,7 @@ You can make passwords for anything, like email addresses, sites or real-world t + @@ -2937,7 +2960,7 @@ You can make passwords for anything, like email addresses, sites or real-world t - + @@ -2955,8 +2978,8 @@ You can make passwords for anything, like email addresses, sites or real-world t - - + + The right balance between security and convenience is often very personal. @@ -2968,8 +2991,8 @@ However, it means that anyone who finds your device unlocked can do the same. - - + + @@ -3038,9 +3061,9 @@ However, it means that anyone who finds your device unlocked can do the same. - + - + \ No newline at end of file