Reformat.
This commit is contained in:
parent
c0d57b5561
commit
95d5d8b40c
2
External/Pearl
vendored
2
External/Pearl
vendored
@ -1 +1 @@
|
||||
Subproject commit 737b198043a3acb3a262a38a8b14e265801ce682
|
||||
Subproject commit affcd43c4e50b99f12da5b3cf342bc6fab6e0298
|
@ -24,8 +24,7 @@ id<MPAlgorithm> MPAlgorithmForVersion(NSUInteger version) {
|
||||
versionToAlgorithm = [NSMutableDictionary dictionary];
|
||||
|
||||
id<MPAlgorithm> algorithm = [versionToAlgorithm objectForKey:@(version)];
|
||||
if (!algorithm)
|
||||
if ((algorithm = [NSClassFromString(PearlString(@"MPAlgorithmV%lu", (unsigned long)version)) new]))
|
||||
if (!algorithm) if ((algorithm = [NSClassFromString( PearlString( @"MPAlgorithmV%lu", (unsigned long)version ) ) new]))
|
||||
[versionToAlgorithm setObject:algorithm forKey:@(version)];
|
||||
|
||||
return algorithm;
|
||||
|
@ -17,6 +17,5 @@
|
||||
|
||||
#import "MPAlgorithmV0.h"
|
||||
|
||||
|
||||
@interface MPAlgorithmV1 : MPAlgorithmV0
|
||||
@end
|
||||
|
@ -18,7 +18,6 @@
|
||||
#import "MPAlgorithmV1.h"
|
||||
#import "MPEntities.h"
|
||||
|
||||
|
||||
@implementation MPAlgorithmV1
|
||||
|
||||
- (NSUInteger)version {
|
||||
@ -92,5 +91,4 @@
|
||||
return content;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
@ -84,8 +84,7 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
||||
|
||||
// Method 1: When the user has no keyID set, set a new key from the given master password.
|
||||
if (!user.keyID) {
|
||||
if ([password length])
|
||||
if ((tryKey = [MPAlgorithmDefault keyForPassword:password ofUserNamed:user.name])) {
|
||||
if ([password length]) if ((tryKey = [MPAlgorithmDefault keyForPassword:password ofUserNamed:user.name])) {
|
||||
user.keyID = tryKey.keyID;
|
||||
|
||||
// Migrate existing elements.
|
||||
@ -98,11 +97,9 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
||||
// Key should not be stored in keychain. Delete it.
|
||||
[self forgetSavedKeyFor:user];
|
||||
|
||||
else
|
||||
if (!tryKey) {
|
||||
else if (!tryKey) {
|
||||
// Key should be saved in keychain. Load it.
|
||||
if ((tryKey = [self loadSavedKeyFor:user]))
|
||||
if (![user.keyID isEqual:tryKey.keyID]) {
|
||||
if ((tryKey = [self loadSavedKeyFor:user])) if (![user.keyID isEqual:tryKey.keyID]) {
|
||||
// Loaded password doesn't match user's keyID. Forget saved password: it is incorrect.
|
||||
inf(@"Saved password doesn't match keyID for: %@", user.userID);
|
||||
|
||||
@ -113,9 +110,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
||||
|
||||
// Method 3: Check the given master password string.
|
||||
if (!tryKey) {
|
||||
if ([password length])
|
||||
if ((tryKey = [MPAlgorithmDefault keyForPassword:password ofUserNamed:user.name]))
|
||||
if (![user.keyID isEqual:tryKey.keyID]) {
|
||||
if ([password length]) if ((tryKey = [MPAlgorithmDefault keyForPassword:password
|
||||
ofUserNamed:user.name])) if (![user.keyID isEqual:tryKey.keyID]) {
|
||||
inf(@"Key derived from password doesn't match keyID for: %@", user.userID);
|
||||
|
||||
tryKey = nil;
|
||||
|
@ -31,7 +31,8 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
||||
if ([[NSThread currentThread] isMainThread])
|
||||
return mainManagedObjectContext;
|
||||
|
||||
NSManagedObjectContext *threadManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
|
||||
NSManagedObjectContext
|
||||
*threadManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
|
||||
threadManagedObjectContext.parentContext = mainManagedObjectContext;
|
||||
|
||||
return threadManagedObjectContext;
|
||||
@ -338,7 +339,8 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
||||
} );
|
||||
|
||||
// Create our contexts.
|
||||
NSManagedObjectContext *privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||
NSManagedObjectContext
|
||||
*privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||
[privateManagedObjectContext performBlockAndWait:^{
|
||||
privateManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
|
||||
privateManagedObjectContext.persistentStoreCoordinator = coordinator;
|
||||
@ -531,8 +533,8 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
||||
if (!existingSites) {
|
||||
err(@"Lookup of existing sites failed for site: %@, user: %@, error: %@", name, user.userID, error);
|
||||
return MPImportResultInternalError;
|
||||
} else
|
||||
if (existingSites.count)
|
||||
}
|
||||
else if (existingSites.count)
|
||||
dbg(@"Existing sites: %@", existingSites);
|
||||
|
||||
[elementsToDelete addObjectsFromArray:existingSites];
|
||||
@ -580,7 +582,8 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
||||
NSString *exportContent = [siteElements objectAtIndex:5];
|
||||
|
||||
// Create new site.
|
||||
MPElementEntity *element = [NSEntityDescription insertNewObjectForEntityForName:[MPAlgorithmForVersion(version) classNameOfType:type]
|
||||
MPElementEntity
|
||||
*element = [NSEntityDescription insertNewObjectForEntityForName:[MPAlgorithmForVersion( version ) classNameOfType:type]
|
||||
inManagedObjectContext:moc];
|
||||
element.name = name;
|
||||
element.user = user;
|
||||
@ -655,8 +658,7 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
||||
if (!(type & MPElementFeatureDevicePrivate)) {
|
||||
if (showPasswords)
|
||||
content = element.content;
|
||||
else
|
||||
if (type & MPElementFeatureExportContent)
|
||||
else if (type & MPElementFeatureExportContent)
|
||||
content = element.exportContent;
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
#import "MPAppDelegate.h"
|
||||
|
||||
@implementation MPConfig
|
||||
|
||||
@dynamic sendInfo, rememberLogin, iCloudDecided;
|
||||
|
||||
- (id)init {
|
||||
@ -16,11 +17,13 @@
|
||||
if (!(self = [super init]))
|
||||
return nil;
|
||||
|
||||
[self.defaults registerDefaults:@{NSStringFromSelector(@selector(askForReviews)): @YES,
|
||||
[self.defaults registerDefaults:@{
|
||||
NSStringFromSelector( @selector(askForReviews) ) : @YES,
|
||||
|
||||
NSStringFromSelector( @selector(sendInfo) ) : @NO,
|
||||
NSStringFromSelector( @selector(rememberLogin) ) : @NO,
|
||||
NSStringFromSelector(@selector(iCloudDecided)): @NO}];
|
||||
NSStringFromSelector( @selector(iCloudDecided) ) : @NO
|
||||
}];
|
||||
|
||||
self.delegate = [MPAppDelegate get];
|
||||
|
||||
|
@ -7,8 +7,6 @@
|
||||
//
|
||||
|
||||
#import "MPElementEntity.h"
|
||||
#import "MPUserEntity.h"
|
||||
|
||||
|
||||
@implementation MPElementEntity
|
||||
|
||||
|
@ -10,7 +10,6 @@
|
||||
#import <CoreData/CoreData.h>
|
||||
#import "MPElementEntity.h"
|
||||
|
||||
|
||||
@interface MPElementGeneratedEntity : MPElementEntity
|
||||
|
||||
@property(nonatomic, retain) NSNumber *counter_;
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
#import "MPElementGeneratedEntity.h"
|
||||
|
||||
|
||||
@implementation MPElementGeneratedEntity
|
||||
|
||||
@dynamic counter_;
|
||||
|
@ -10,7 +10,6 @@
|
||||
#import <CoreData/CoreData.h>
|
||||
#import "MPElementEntity.h"
|
||||
|
||||
|
||||
@interface MPElementStoredEntity : MPElementEntity
|
||||
|
||||
@property(nonatomic, retain) id contentObject;
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
#import "MPElementStoredEntity.h"
|
||||
|
||||
|
||||
@implementation MPElementStoredEntity
|
||||
|
||||
@dynamic contentObject;
|
||||
|
@ -146,11 +146,9 @@
|
||||
}
|
||||
|
||||
- (void)importProtectedContent:(NSString *)protectedContent protectedByKey:(MPKey *)contentProtectionKey usingKey:(MPKey *)key {
|
||||
|
||||
}
|
||||
|
||||
- (void)importClearTextContent:(NSString *)clearContent usingKey:(MPKey *)key {
|
||||
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
@ -204,7 +202,6 @@
|
||||
return [self.algorithm generateContentForElement:self usingKey:key];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPElementStoredEntity(MP)
|
||||
@ -212,8 +209,10 @@
|
||||
+ (NSDictionary *)queryForDevicePrivateElementNamed:(NSString *)name {
|
||||
|
||||
return [PearlKeyChain createQueryForClass:kSecClassGenericPassword
|
||||
attributes:@{(__bridge id)kSecAttrService: @"DevicePrivate",
|
||||
(__bridge id)kSecAttrAccount: name}
|
||||
attributes:@{
|
||||
(__bridge id)kSecAttrService : @"DevicePrivate",
|
||||
(__bridge id)kSecAttrAccount : name
|
||||
}
|
||||
matches:nil];
|
||||
}
|
||||
|
||||
@ -263,7 +262,8 @@
|
||||
#endif
|
||||
nil]];
|
||||
self.contentObject = nil;
|
||||
} else
|
||||
}
|
||||
else
|
||||
self.contentObject = encryptedContent;
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
@protocol MPAlgorithm;
|
||||
|
||||
|
||||
@interface MPKey : NSObject
|
||||
|
||||
@property(nonatomic, readonly, strong) id<MPAlgorithm> algorithm;
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
#import "MPAlgorithm.h"
|
||||
|
||||
|
||||
@interface MPKey()
|
||||
|
||||
@property(nonatomic, readwrite, strong) id<MPAlgorithm> algorithm;
|
||||
@ -27,6 +26,7 @@
|
||||
@end
|
||||
|
||||
@implementation MPKey
|
||||
|
||||
@synthesize algorithm = _algorithm, keyData = _keyData, keyID = _keyID;
|
||||
|
||||
- (id)initWithKeyData:(NSData *)keyData algorithm:(id<MPAlgorithm>)algorithm {
|
||||
@ -61,5 +61,4 @@
|
||||
return [self isEqualToKey:object];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
@ -7,8 +7,6 @@
|
||||
//
|
||||
|
||||
#import "MPUserEntity.h"
|
||||
#import "MPElementEntity.h"
|
||||
|
||||
|
||||
@implementation MPUserEntity
|
||||
|
||||
|
@ -11,8 +11,8 @@
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import <Carbon/Carbon.h>
|
||||
|
||||
|
||||
@implementation MPAppDelegate
|
||||
|
||||
@synthesize statusItem;
|
||||
@synthesize lockItem;
|
||||
@synthesize showItem;
|
||||
@ -163,8 +163,8 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
|
||||
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue {
|
||||
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification
|
||||
object:NSStringFromSelector(configKey) userInfo:nil];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName:MPCheckConfigNotification object:NSStringFromSelector( configKey ) userInfo:nil];
|
||||
}
|
||||
|
||||
#pragma mark - NSApplicationDelegate
|
||||
@ -204,8 +204,8 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
^(NSNotification *note) {
|
||||
[self updateUsers];
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UbiquityManagedStoreDidImportChangesNotification object:nil queue:nil
|
||||
usingBlock:
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UbiquityManagedStoreDidImportChangesNotification object:nil queue:nil usingBlock:
|
||||
^(NSNotification *note) {
|
||||
[self updateUsers];
|
||||
}];
|
||||
@ -237,10 +237,12 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
if (!(self.showItem.enabled = ![self.passwordWindow.window isVisible])) {
|
||||
self.showItem.title = @"Show (Showing)";
|
||||
self.showItem.toolTip = @"Master Password is already showing.";
|
||||
} else if (!(self.showItem.enabled = (self.activeUser != nil))) {
|
||||
}
|
||||
else if (!(self.showItem.enabled = (self.activeUser != nil))) {
|
||||
self.showItem.title = @"Show (No user)";
|
||||
self.showItem.toolTip = @"First select the user to show passwords for.";
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
self.showItem.title = @"Show";
|
||||
self.showItem.toolTip = nil;
|
||||
}
|
||||
@ -249,7 +251,8 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
self.lockItem.title = @"Lock";
|
||||
self.lockItem.enabled = YES;
|
||||
self.lockItem.toolTip = nil;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
self.lockItem.title = @"Lock (Locked)";
|
||||
self.lockItem.enabled = NO;
|
||||
self.lockItem.toolTip = @"Master Password is currently locked.";
|
||||
@ -262,11 +265,13 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
self.savePasswordItem.title = @"Save Password (No user)";
|
||||
self.savePasswordItem.enabled = NO;
|
||||
self.savePasswordItem.toolTip = @"First select your user and unlock by showing the Master Password window.";
|
||||
} else if (!self.key) {
|
||||
}
|
||||
else if (!self.key) {
|
||||
self.savePasswordItem.title = @"Save Password (Locked)";
|
||||
self.savePasswordItem.enabled = NO;
|
||||
self.savePasswordItem.toolTip = @"First unlock by showing the Master Password window.";
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
self.savePasswordItem.title = @"Save Password";
|
||||
self.savePasswordItem.enabled = YES;
|
||||
self.savePasswordItem.toolTip = nil;
|
||||
|
@ -14,7 +14,6 @@
|
||||
#define MPAlertUnlockMP @"MPAlertUnlockMP"
|
||||
#define MPAlertIncorrectMP @"MPAlertIncorrectMP"
|
||||
|
||||
|
||||
@interface MPPasswordWindowController()
|
||||
|
||||
@property(nonatomic, strong) NSArray /* MPElementEntity */ *siteResults;
|
||||
@ -49,18 +48,18 @@
|
||||
[moc saveToStore];
|
||||
}];
|
||||
} forKeyPath:@"key" options:NSKeyValueObservingOptionInitial context:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:NSWindowDidBecomeKeyNotification object:self.window queue:nil usingBlock:^(NSNotification *note) {
|
||||
if (!self.inProgress)
|
||||
[self unlock];
|
||||
[self.siteField selectText:self];
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification object:self.window queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:NSWindowWillCloseNotification object:self.window queue:nil usingBlock:^(NSNotification *note) {
|
||||
[[NSApplication sharedApplication] hide:self];
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:MPSignedOutNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||
[self.window close];
|
||||
}];
|
||||
|
||||
@ -91,7 +90,8 @@
|
||||
|
||||
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%@", [MPAppDelegate get].activeUser.name];
|
||||
informativeTextWithFormat:@"The master password is required to unlock the application for:\n\n%@",
|
||||
[MPAppDelegate get].activeUser.name];
|
||||
NSSecureTextField *passwordField = [[NSSecureTextField alloc] initWithFrame:NSMakeRect( 0, 0, 200, 22 )];
|
||||
[alert setAccessoryView:passwordField];
|
||||
[alert layout];
|
||||
|
@ -4,7 +4,6 @@
|
||||
|
||||
#import "Pearl-Prefix.pch"
|
||||
|
||||
|
||||
#ifdef __OBJC__
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
@ -6,8 +6,6 @@
|
||||
// Copyright (c) 2012 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
return NSApplicationMain( argc, (const char **)argv );
|
||||
|
@ -1,12 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1171" systemVersion="11E53" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0"
|
||||
lastSavedToolsVersion="1171" systemVersion="11E53" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<entity name="MPElementEntity" representedClassName="MPElementEntity" isAbstract="YES" syncable="YES">
|
||||
<attribute name="content" optional="YES" transient="YES" attributeType="Transformable" syncable="YES"/>
|
||||
<attribute name="lastUsed" attributeType="Date" syncable="YES"/>
|
||||
<attribute name="name" attributeType="String" minValueString="1" indexed="YES" syncable="YES"/>
|
||||
<attribute name="type_" attributeType="Integer 16" defaultValueString="17" syncable="YES"/>
|
||||
<attribute name="uses_" attributeType="Integer 16" defaultValueString="0" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements" inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements"
|
||||
inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<entity name="MPElementGeneratedEntity" representedClassName="MPElementGeneratedEntity" parentEntity="MPElementEntity" syncable="YES">
|
||||
<attribute name="counter_" optional="YES" attributeType="Integer 32" defaultValueString="1" syncable="YES"/>
|
||||
@ -21,7 +23,8 @@
|
||||
<attribute name="lastUsed" optional="YES" attributeType="Date" syncable="YES"/>
|
||||
<attribute name="name" attributeType="String" syncable="YES"/>
|
||||
<attribute name="saveKey_" attributeType="Boolean" defaultValueString="NO"/>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity" inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity"
|
||||
inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<elements>
|
||||
<element name="MPElementEntity" positionX="160" positionY="192" width="128" height="135"/>
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="2057" systemVersion="12C60" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0"
|
||||
lastSavedToolsVersion="2057" systemVersion="12C60" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<entity name="MPElementEntity" representedClassName="MPElementEntity" isAbstract="YES" syncable="YES">
|
||||
<attribute name="content" optional="YES" transient="YES" attributeType="Transformable" syncable="YES"/>
|
||||
<attribute name="lastUsed" attributeType="Date" indexed="YES" syncable="YES"/>
|
||||
@ -11,7 +12,8 @@
|
||||
<attribute name="userName" optional="YES" attributeType="String" syncable="YES"/>
|
||||
<attribute name="uses_" attributeType="Integer 16" defaultValueString="0" indexed="YES" syncable="YES"/>
|
||||
<attribute name="version_" attributeType="Integer 16" minValueString="0" defaultValueString="0" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements" inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements"
|
||||
inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<entity name="MPElementGeneratedEntity" representedClassName="MPElementGeneratedEntity" parentEntity="MPElementEntity" syncable="YES">
|
||||
<attribute name="counter_" optional="YES" attributeType="Integer 32" defaultValueString="1" syncable="YES"/>
|
||||
@ -29,7 +31,8 @@
|
||||
<attribute name="saveKey_" attributeType="Boolean" defaultValueString="NO">
|
||||
<userInfo/>
|
||||
</attribute>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity" inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity"
|
||||
inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<elements>
|
||||
<element name="MPElementEntity" positionX="0" positionY="0" width="128" height="180"/>
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1810" systemVersion="12B19" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0"
|
||||
lastSavedToolsVersion="1810" systemVersion="12B19" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<entity name="MPElementEntity" representedClassName="MPElementEntity" isAbstract="YES" syncable="YES">
|
||||
<attribute name="content" optional="YES" transient="YES" attributeType="Transformable" syncable="YES"/>
|
||||
<attribute name="lastUsed" attributeType="Date" indexed="YES" syncable="YES"/>
|
||||
@ -11,7 +12,8 @@
|
||||
<attribute name="type_" attributeType="Integer 16" defaultValueString="17" syncable="YES"/>
|
||||
<attribute name="uses_" attributeType="Integer 16" defaultValueString="0" indexed="YES" syncable="YES"/>
|
||||
<attribute name="version_" attributeType="Integer 16" minValueString="0" defaultValueString="0" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements" inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements"
|
||||
inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<entity name="MPElementGeneratedEntity" representedClassName="MPElementGeneratedEntity" parentEntity="MPElementEntity" syncable="YES">
|
||||
<attribute name="counter_" optional="YES" attributeType="Integer 32" defaultValueString="1" syncable="YES"/>
|
||||
@ -29,7 +31,8 @@
|
||||
<attribute name="saveKey_" attributeType="Boolean" defaultValueString="NO">
|
||||
<userInfo/>
|
||||
</attribute>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity" inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity"
|
||||
inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<elements>
|
||||
<element name="MPElementEntity" positionX="-0" positionY="-286" width="128" height="178"/>
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="2057" systemVersion="12C60" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0"
|
||||
lastSavedToolsVersion="2057" systemVersion="12C60" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<entity name="MPElementEntity" representedClassName="MPElementEntity" isAbstract="YES" syncable="YES">
|
||||
<attribute name="content" optional="YES" transient="YES" attributeType="Transformable" syncable="YES"/>
|
||||
<attribute name="lastUsed" attributeType="Date" indexed="YES" syncable="YES"/>
|
||||
@ -11,7 +12,8 @@
|
||||
<attribute name="type_" attributeType="Integer 16" defaultValueString="17" syncable="YES"/>
|
||||
<attribute name="uses_" attributeType="Integer 16" defaultValueString="0" indexed="YES" syncable="YES"/>
|
||||
<attribute name="version_" attributeType="Integer 16" minValueString="0" defaultValueString="0" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements" inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
<relationship name="user" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="MPUserEntity" inverseName="elements"
|
||||
inverseEntity="MPUserEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<entity name="MPElementGeneratedEntity" representedClassName="MPElementGeneratedEntity" parentEntity="MPElementEntity" syncable="YES">
|
||||
<attribute name="counter_" optional="YES" attributeType="Integer 32" defaultValueString="1" syncable="YES"/>
|
||||
@ -28,7 +30,8 @@
|
||||
<attribute name="saveKey_" attributeType="Boolean" defaultValueString="NO">
|
||||
<userInfo/>
|
||||
</attribute>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity" inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
<relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MPElementEntity"
|
||||
inverseName="user" inverseEntity="MPElementEntity" syncable="YES"/>
|
||||
</entity>
|
||||
<elements>
|
||||
<element name="MPElementEntity" positionX="-0" positionY="-286" width="128" height="178"/>
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation MPAppDelegate
|
||||
|
||||
+ (void)initialize {
|
||||
@ -202,43 +201,47 @@
|
||||
[[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].firstRun boolValue] forKey:@"firstRun"];
|
||||
[[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].launchCount intValue] forKey:@"launchCount"];
|
||||
[[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].askForReviews boolValue] forKey:@"askForReviews"];
|
||||
[[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].reviewAfterLaunches intValue] forKey:@"reviewAfterLaunches"];
|
||||
[[Crashlytics sharedInstance]
|
||||
setIntValue:[[PearlConfig get].reviewAfterLaunches intValue] forKey:@"reviewAfterLaunches"];
|
||||
[[Crashlytics sharedInstance] setObjectValue:[PearlConfig get].reviewedVersion forKey:@"reviewedVersion"];
|
||||
|
||||
#ifdef TESTFLIGHT_SDK_VERSION
|
||||
[TestFlight addCustomEnvironmentInformation:[[MPConfig get].rememberLogin boolValue]? @"YES": @"NO" forKey:@"rememberLogin"];
|
||||
[TestFlight addCustomEnvironmentInformation:[self storeManager].cloudEnabled? @"YES": @"NO" forKey:@"iCloud"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[MPConfig get].iCloudDecided boolValue]? @"YES": @"NO" forKey:@"iCloudDecided"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[MPiOSConfig get].sendInfo boolValue]? @"YES": @"NO" forKey:@"sendInfo"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[MPiOSConfig get].helpHidden boolValue]? @"YES": @"NO" forKey:@"helpHidden"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[MPiOSConfig get].showSetup boolValue]? @"YES": @"NO"
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[MPConfig get].rememberLogin boolValue]) description]
|
||||
forKey:@"rememberLogin"];
|
||||
[TestFlight addCustomEnvironmentInformation:[@([self storeManager].cloudEnabled) description] forKey:@"iCloud"];
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[MPConfig get].iCloudDecided boolValue]) description]
|
||||
forKey:@"iCloudDecided"];
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[MPiOSConfig get].sendInfo boolValue]) description] forKey:@"sendInfo"];
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[MPiOSConfig get].helpHidden boolValue]) description]
|
||||
forKey:@"helpHidden"];
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[MPiOSConfig get].showSetup boolValue]) description]
|
||||
forKey:@"showQuickStart"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[PearlConfig get].firstRun boolValue]? @"YES": @"NO" forKey:@"firstRun"];
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[PearlConfig get].firstRun boolValue]) description] forKey:@"firstRun"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[PearlConfig get].launchCount description] forKey:@"launchCount"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[PearlConfig get].askForReviews boolValue]? @"YES": @"NO"
|
||||
[TestFlight addCustomEnvironmentInformation:[@([[PearlConfig get].askForReviews boolValue]) description]
|
||||
forKey:@"askForReviews"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[PearlConfig get].reviewAfterLaunches description] forKey:@"reviewAfterLaunches"];
|
||||
[TestFlight addCustomEnvironmentInformation:[[PearlConfig get].reviewAfterLaunches description]
|
||||
forKey:@"reviewAfterLaunches"];
|
||||
[TestFlight addCustomEnvironmentInformation:[PearlConfig get].reviewedVersion forKey:@"reviewedVersion"];
|
||||
#endif
|
||||
MPCheckpoint( MPCheckpointConfig, @{
|
||||
@"rememberLogin" : [[MPConfig get].rememberLogin boolValue]? @"YES": @"NO",
|
||||
@"iCloud" : [self storeManager].cloudEnabled? @"YES": @"NO",
|
||||
@"iCloudDecided" : [[MPConfig get].iCloudDecided boolValue]? @"YES": @"NO",
|
||||
@"sendInfo" : [[MPiOSConfig get].sendInfo boolValue]? @"YES": @"NO",
|
||||
@"helpHidden" : [[MPiOSConfig get].helpHidden boolValue]? @"YES": @"NO",
|
||||
@"showQuickStart" : [[MPiOSConfig get].showSetup boolValue]? @"YES": @"NO",
|
||||
@"firstRun" : [[PearlConfig get].firstRun boolValue]? @"YES": @"NO",
|
||||
@"rememberLogin" : @([[MPConfig get].rememberLogin boolValue]),
|
||||
@"iCloud" : @([self storeManager].cloudEnabled),
|
||||
@"iCloudDecided" : @([[MPConfig get].iCloudDecided boolValue]),
|
||||
@"sendInfo" : @([[MPiOSConfig get].sendInfo boolValue]),
|
||||
@"helpHidden" : @([[MPiOSConfig get].helpHidden boolValue]),
|
||||
@"showQuickStart" : @([[MPiOSConfig get].showSetup boolValue]),
|
||||
@"firstRun" : @([[PearlConfig get].firstRun boolValue]),
|
||||
@"launchCount" : NilToNSNull([[PearlConfig get].launchCount description]),
|
||||
@"askForReviews" : [[PearlConfig get].askForReviews boolValue]? @"YES": @"NO",
|
||||
@"askForReviews" : @([[PearlConfig get].askForReviews boolValue]),
|
||||
@"reviewAfterLaunches" : NilToNSNull([[PearlConfig get].reviewAfterLaunches description]),
|
||||
@"reviewedVersion" : NilToNSNull([PearlConfig get].reviewedVersion)
|
||||
} );
|
||||
}
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:kIASKAppSettingChanged object:nil queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification
|
||||
object:note userInfo:nil];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:kIASKAppSettingChanged object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification object:note userInfo:nil];
|
||||
}];
|
||||
|
||||
#ifdef ADHOC
|
||||
@ -411,8 +414,7 @@
|
||||
- (void)applicationDidBecomeActive:(UIApplication *)application {
|
||||
|
||||
inf(@"Re-activated");
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification
|
||||
object:application userInfo:nil];
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification object:application userInfo:nil];
|
||||
|
||||
[[LocalyticsSession sharedLocalyticsSession] resume];
|
||||
[[LocalyticsSession sharedLocalyticsSession] upload];
|
||||
@ -460,8 +462,7 @@
|
||||
initAlert:nil tappedButtonBlock:nil cancelTitle:[PearlStrings get].commonButtonOkay
|
||||
otherTitles:nil];
|
||||
|
||||
else
|
||||
if (logs)
|
||||
else if (logs)
|
||||
[PearlAlert showAlertWithTitle:@"Feedback"
|
||||
message:
|
||||
@"Have a question, comment, issue or just saying thanks?\n\n"
|
||||
@ -492,7 +493,9 @@
|
||||
[PearlInfoPlist get].CFBundleVersion )
|
||||
|
||||
attachments:(logs
|
||||
? [[PearlEMailAttachment alloc] initWithContent:[[[PearlLogger get] formatMessagesWithLevel:logLevel] dataUsingEncoding:NSUTF8StringEncoding]
|
||||
? [[PearlEMailAttachment alloc]
|
||||
initWithContent:[[[PearlLogger get] formatMessagesWithLevel:logLevel]
|
||||
dataUsingEncoding:NSUTF8StringEncoding]
|
||||
mimeType:@"text/plain"
|
||||
fileName:PearlString( @"%@-%@.log",
|
||||
[[NSDateFormatter rfc3339DateFormatter] stringFromDate:[NSDate date]],
|
||||
@ -566,7 +569,8 @@
|
||||
[PearlEMail sendEMailTo:nil subject:@"Master Password Export" body:message
|
||||
attachments:[[PearlEMailAttachment alloc] initWithContent:[exportedSites dataUsingEncoding:NSUTF8StringEncoding]
|
||||
mimeType:@"text/plain" fileName:
|
||||
PearlString(@"%@ (%@).mpsites", [self activeUserForThread].name, [exportDateFormatter stringFromDate:[NSDate date]])],
|
||||
PearlString( @"%@ (%@).mpsites", [self activeUserForThread].name,
|
||||
[exportDateFormatter stringFromDate:[NSDate date]] )],
|
||||
nil];
|
||||
}
|
||||
|
||||
@ -603,8 +607,8 @@
|
||||
|
||||
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)value {
|
||||
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification
|
||||
object:NSStringFromSelector(configKey) userInfo:nil];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName:MPCheckConfigNotification object:NSStringFromSelector( configKey ) userInfo:nil];
|
||||
}
|
||||
|
||||
#pragma mark - UbiquityStoreManagerDelegate
|
||||
@ -621,8 +625,7 @@
|
||||
[PearlAlert showAlertWithTitle:@"iCloud" message:
|
||||
@"iCloud is now disabled.\n\n"
|
||||
@"It is highly recommended you enable iCloud."
|
||||
viewStyle:UIAlertViewStyleDefault initAlert:nil
|
||||
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [alert firstOtherButtonIndex] + 0) {
|
||||
[PearlAlert showAlertWithTitle:@"About iCloud" message:
|
||||
@"iCloud is Apple's solution for saving your data in \"the cloud\" "
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface MPAppViewController : UIViewController
|
||||
|
||||
- (IBAction)gorillas:(UIButton *)sender;
|
||||
|
@ -17,12 +17,9 @@
|
||||
|
||||
#import "MPAppViewController.h"
|
||||
|
||||
|
||||
@implementation MPAppViewController {
|
||||
|
||||
}
|
||||
|
||||
|
||||
- (IBAction)gorillas:(UIButton *)sender {
|
||||
|
||||
MPCheckpoint( MPCheckpointApp, @{
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface MPAppsViewController : UIViewController<UIPageViewControllerDataSource, UIPageViewControllerDelegate>
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIImageView *pagePositionView;
|
||||
|
@ -17,23 +17,20 @@
|
||||
|
||||
#import "MPAppsViewController.h"
|
||||
|
||||
|
||||
@interface MPAppsViewController()
|
||||
|
||||
@property(nonatomic, strong) NSMutableArray *pageVCs;
|
||||
@property(nonatomic, strong) UIPageViewController *pageViewController;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPAppsViewController {
|
||||
|
||||
}
|
||||
|
||||
@synthesize pagePositionView = _pagePositionView;
|
||||
@synthesize pageVCs = _pageVCs;
|
||||
@synthesize pageViewController = _pageViewController;
|
||||
|
||||
|
||||
- (void)viewDidLoad {
|
||||
|
||||
self.pageVCs = [NSMutableArray array];
|
||||
@ -101,7 +98,6 @@
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
|
||||
viewControllerBeforeViewController:(UIViewController *)viewController {
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#import "MPElementListController.h"
|
||||
|
||||
@interface MPElementListAllViewController : MPElementListController
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UINavigationBar *navigationBar;
|
||||
|
||||
- (IBAction)close:(id)sender;
|
||||
|
@ -132,8 +132,7 @@
|
||||
message:PearlString( @"This upgrade has caused %d passwords to change.\n"
|
||||
@"To make updating the actual passwords of these accounts easier, "
|
||||
@"you can email a summary of these changes to yourself.", [changes count] )
|
||||
viewStyle:UIAlertViewStyleDefault initAlert:nil
|
||||
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [alert cancelButtonIndex])
|
||||
return;
|
||||
|
||||
|
@ -140,7 +140,6 @@
|
||||
}
|
||||
|
||||
- (void)customTableViewUpdates {
|
||||
|
||||
}
|
||||
|
||||
// See MP-14, also crashes easily on internal assertions etc..
|
||||
@ -226,7 +225,8 @@
|
||||
element.uses, [self.dateFormatter stringFromDate:element.lastUsed], [element.algorithm shortNameOfType:element.type] );
|
||||
}
|
||||
|
||||
- (NSIndexPath *)tableIndexPathForFetchController:(NSFetchedResultsController *)fetchedResultsController indexPath:(NSIndexPath *)indexPath {
|
||||
- (NSIndexPath *)tableIndexPathForFetchController:(NSFetchedResultsController *)fetchedResultsController
|
||||
indexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
if (fetchedResultsController == self.fetchedResultsControllerByLastUsed)
|
||||
return [NSIndexPath indexPathForRow:indexPath.row inSection:0];
|
||||
|
@ -17,6 +17,7 @@
|
||||
@end
|
||||
|
||||
@implementation MPElementListSearchController
|
||||
|
||||
@synthesize searchDisplayController;
|
||||
|
||||
- (id)init {
|
||||
@ -208,7 +209,8 @@
|
||||
}
|
||||
|
||||
// "New" section.
|
||||
NSString *siteName = [self.searchDisplayController.searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||
NSString *siteName
|
||||
= [self.searchDisplayController.searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||
|
||||
[PearlAlert showAlertWithTitle:@"New Site"
|
||||
message:PearlString( @"Do you want to create a new site named:\n%@", siteName )
|
||||
@ -240,5 +242,4 @@ forRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
[super tableView:tableView commitEditingStyle:editingStyle forRowAtIndexPath:indexPath];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
@ -49,7 +49,6 @@
|
||||
@property(weak, nonatomic) IBOutlet UIImageView *pullUpView;
|
||||
@property(weak, nonatomic) IBOutlet UIImageView *pullDownView;
|
||||
|
||||
|
||||
@property(copy, nonatomic) void (^contentTipCleanup)(BOOL finished);
|
||||
@property(copy, nonatomic) void (^toolTipCleanup)(BOOL finished);
|
||||
|
||||
|
@ -11,8 +11,8 @@
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPElementListAllViewController.h"
|
||||
|
||||
|
||||
@interface MPMainViewController()
|
||||
|
||||
@property(nonatomic) BOOL suppressOutdatedAlert;
|
||||
@end
|
||||
|
||||
@ -43,7 +43,6 @@
|
||||
[self updateUserHiddenAnimated:NO];
|
||||
}
|
||||
|
||||
|
||||
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
||||
|
||||
if ([[segue identifier] isEqualToString:@"MP_ChooseType"])
|
||||
@ -78,8 +77,8 @@
|
||||
self.alertBody.text = nil;
|
||||
self.toolTipEditIcon.hidden = YES;
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:self queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UIApplicationDidEnterBackgroundNotification object:self queue:nil usingBlock:^(NSNotification *note) {
|
||||
self.suppressOutdatedAlert = NO;
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPElementUpdatedNotification object:nil queue:nil usingBlock:
|
||||
@ -216,8 +215,8 @@
|
||||
if (activeElement.type & MPElementTypeClassGenerated) {
|
||||
self.passwordCounter.alpha = 0.5f;
|
||||
self.passwordIncrementer.alpha = 0.5f;
|
||||
} else
|
||||
if (activeElement.type & MPElementTypeClassStored)
|
||||
}
|
||||
else if (activeElement.type & MPElementTypeClassStored)
|
||||
self.passwordEdit.alpha = 0.5f;
|
||||
}
|
||||
|
||||
@ -273,7 +272,8 @@
|
||||
if ([[MPiOSConfig get].helpHidden boolValue]) {
|
||||
self.contentContainer.frame = CGRectSetHeight( self.contentContainer.frame, self.view.bounds.size.height - 44 /* search bar */);
|
||||
self.helpContainer.frame = CGRectSetY( self.helpContainer.frame, self.view.bounds.size.height - 20 /* pull-up */);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
self.contentContainer.frame = CGRectSetHeight( self.contentContainer.frame, 225 );
|
||||
[self.helpContainer setFrameFromCurrentSizeAndParentPaddingTop:CGFLOAT_MAX right:0 bottom:0 left:0];
|
||||
}
|
||||
@ -302,10 +302,10 @@
|
||||
|
||||
if (self.siteInfoHidden) {
|
||||
self.displayContainer.frame = CGRectSetHeight( self.displayContainer.frame, 87 );
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
self.displayContainer.frame = CGRectSetHeight( self.displayContainer.frame, 137 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void)setHelpChapter:(NSString *)chapter {
|
||||
@ -531,8 +531,8 @@
|
||||
// Not of a type that supports a password counter.
|
||||
err(@"Cannot reset password counter: Element is not generated: %@", activeElement.name);
|
||||
return;
|
||||
} else
|
||||
if (((MPElementGeneratedEntity *)activeElement).counter == 1)
|
||||
}
|
||||
else if (((MPElementGeneratedEntity *)activeElement).counter == 1)
|
||||
// Counter has initial value, no point resetting.
|
||||
return;
|
||||
|
||||
@ -625,7 +625,6 @@
|
||||
return activeElement;
|
||||
}
|
||||
|
||||
|
||||
- (IBAction)editPassword {
|
||||
|
||||
MPElementEntity *activeElement = [self activeElementForThread];
|
||||
@ -778,7 +777,8 @@
|
||||
do:^BOOL(MPElementEntity *activeElement) {
|
||||
if ([activeElement.algorithm classOfType:type] != activeElement.typeClass) {
|
||||
// Type requires a different class of element. Recreate the element.
|
||||
MPElementEntity *newElement = [NSEntityDescription insertNewObjectForEntityForName:[activeElement.algorithm classNameOfType:type]
|
||||
MPElementEntity *newElement
|
||||
= [NSEntityDescription insertNewObjectForEntityForName:[activeElement.algorithm classNameOfType:type]
|
||||
inManagedObjectContext:activeElement.managedObjectContext];
|
||||
newElement.name = activeElement.name;
|
||||
newElement.user = activeElement.user;
|
||||
@ -793,8 +793,8 @@
|
||||
}
|
||||
activeElement.type = type;
|
||||
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPElementUpdatedNotification
|
||||
object:activeElement.objectID];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName:MPElementUpdatedNotification object:activeElement.objectID];
|
||||
return YES;
|
||||
}];
|
||||
}
|
||||
@ -866,7 +866,8 @@
|
||||
// Not of a type whose content can be edited.
|
||||
err(@"Cannot update element content: Element is not stored: %@", activeElement.name);
|
||||
return;
|
||||
} else if ([((MPElementStoredEntity *)activeElement).content isEqual:self.contentField.text])
|
||||
}
|
||||
else if ([((MPElementStoredEntity *)activeElement).content isEqual:self.contentField.text])
|
||||
// Content hasn't changed.
|
||||
return;
|
||||
|
||||
|
@ -64,7 +64,8 @@
|
||||
[self.avatarsView autoSizeContent];
|
||||
[self.avatarsView enumerateSubviews:^(UIView *subview, BOOL *stop, BOOL *recurse) {
|
||||
if (subview.tag && ((UIControl *)subview).selected) {
|
||||
[self.avatarsView setContentOffset:CGPointMake(subview.center.x - self.avatarsView.bounds.size.width / 2, 0) animated:animated];
|
||||
[self.avatarsView setContentOffset:CGPointMake( subview.center.x - self.avatarsView.bounds.size.width / 2, 0 )
|
||||
animated:animated];
|
||||
}
|
||||
} recurse:NO];
|
||||
|
||||
@ -112,8 +113,7 @@
|
||||
if (cell == self.exportCell)
|
||||
[[MPAppDelegate get] export];
|
||||
|
||||
else
|
||||
if (cell == self.changeMPCell) {
|
||||
else if (cell == self.changeMPCell) {
|
||||
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||
[[MPAppDelegate get] changeMasterPasswordFor:activeUser inContext:activeUser.managedObjectContext didResetBlock:nil];
|
||||
}
|
||||
|
@ -10,7 +10,6 @@
|
||||
|
||||
#import "MPEntities.h"
|
||||
|
||||
|
||||
@protocol MPTypeDelegate<NSObject>
|
||||
|
||||
@required
|
||||
|
@ -9,8 +9,6 @@
|
||||
#import "MPTypeViewController.h"
|
||||
#import "MPAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPAppDelegate_Key.h"
|
||||
|
||||
|
||||
@interface MPTypeViewController()
|
||||
|
||||
|
@ -143,8 +143,10 @@
|
||||
} forControlEvents:UIControlEventValueChanged];
|
||||
self.emergencyContentTipContainer.alpha = 0;
|
||||
self.emergencyContentTipContainer.hidden = NO;
|
||||
self.marqueeTipTexts = @[ @"Tap and hold to delete or reset user.",
|
||||
@"Shake for emergency generator." ];
|
||||
self.marqueeTipTexts = @[
|
||||
@"Tap and hold to delete or reset user.",
|
||||
@"Shake for emergency generator."
|
||||
];
|
||||
|
||||
NSMutableArray *wordListLines = [NSMutableArray arrayWithCapacity:27413];
|
||||
[[[NSString alloc] initWithData:[NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"dictionary" withExtension:@"lst"]]
|
||||
@ -160,21 +162,21 @@
|
||||
[self initializeWordLabel:wordLabel];
|
||||
} recurse:NO];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UbiquityManagedStoreDidChangeNotification object:nil queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UbiquityManagedStoreDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||
[self updateUsers];
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UbiquityManagedStoreDidImportChangesNotification object:nil queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UbiquityManagedStoreDidImportChangesNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||
[self updateUsers];
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||
[self emergencyCloseAnimated:NO];
|
||||
self.uiContainer.alpha = 0;
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil
|
||||
usingBlock:^(NSNotification *note) {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
|
||||
[self updateLayoutAnimated:NO allowScroll:NO completion:nil];
|
||||
[UIView animateWithDuration:1 animations:^{
|
||||
self.uiContainer.alpha = 1;
|
||||
@ -257,6 +259,7 @@
|
||||
}
|
||||
|
||||
- (void)marqueeTip {
|
||||
|
||||
[UIView animateWithDuration:0.5 animations:^{
|
||||
self.tip.alpha = 0;
|
||||
} completion:^(BOOL finished) {
|
||||
@ -331,7 +334,8 @@
|
||||
if (!selected) {
|
||||
self.selectedUser = nil;
|
||||
[self didToggleUserSelection];
|
||||
} else if ((self.selectedUser = user))
|
||||
}
|
||||
else if ((self.selectedUser = user))
|
||||
[self didToggleUserSelection];
|
||||
else
|
||||
[self didSelectNewUserAvatar:avatar];
|
||||
@ -352,8 +356,7 @@
|
||||
MPUserEntity *selectedUser = self.selectedUser;
|
||||
if (!selectedUser)
|
||||
[self.passwordField resignFirstResponder];
|
||||
else
|
||||
if ([[MPAppDelegate get] signInAsUser:selectedUser usingMasterPassword:nil]) {
|
||||
else if ([[MPAppDelegate get] signInAsUser:selectedUser usingMasterPassword:nil]) {
|
||||
[self performSegueWithIdentifier:@"MP_Unlock" sender:self];
|
||||
return;
|
||||
}
|
||||
@ -367,7 +370,8 @@
|
||||
- (void)didSelectNewUserAvatar:(UIButton *)newUserAvatar {
|
||||
|
||||
[MPAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *moc) {
|
||||
MPUserEntity *newUser = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MPUserEntity class]) inManagedObjectContext:moc];
|
||||
MPUserEntity *newUser = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass( [MPUserEntity class] )
|
||||
inManagedObjectContext:moc];
|
||||
|
||||
[self showNewUserNameAlertFor:newUser inContext:moc completion:^(BOOL finished) {
|
||||
newUserAvatar.selected = NO;
|
||||
@ -481,8 +485,8 @@
|
||||
self.nameLabel.backgroundColor = [UIColor blackColor];
|
||||
self.oldNameLabel.center = self.nameLabel.center;
|
||||
self.avatarShadowColor = [UIColor whiteColor];
|
||||
} else
|
||||
if (!self.selectedUser && self.passwordView.alpha == 1) {
|
||||
}
|
||||
else if (!self.selectedUser && self.passwordView.alpha == 1) {
|
||||
// User was just deselected.
|
||||
self.passwordField.text = nil;
|
||||
self.passwordView.alpha = 0;
|
||||
@ -501,7 +505,8 @@
|
||||
self.wordWall.alpha = 0;
|
||||
self.createPasswordTipView.alpha = 0;
|
||||
self.wordWallAnimating = NO;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
self.passwordFieldLabel.text = @"Create your master password:";
|
||||
|
||||
if (!self.wordWallAnimating) {
|
||||
@ -676,7 +681,8 @@
|
||||
rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
|
||||
rotate.fromValue = [NSNumber numberWithFloat:0];
|
||||
rotate.repeatCount = MAXFLOAT;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
|
||||
rotate.repeatCount = 1;
|
||||
}
|
||||
@ -725,7 +731,8 @@
|
||||
[avatar.layer removeAnimationForKey:@"inactiveShadow"];
|
||||
[avatar.layer addAnimation:group forKey:@"targetedShadow"];
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
if ([avatar.layer animationForKey:@"targetedShadow"]) {
|
||||
CABasicAnimation *toShadowColorAnimation = [CABasicAnimation animationWithKeyPath:@"shadowColor"];
|
||||
toShadowColorAnimation.toValue = (__bridge id)[UIColor blackColor].CGColor;
|
||||
@ -1079,7 +1086,8 @@
|
||||
@"simplytweet:?link=http://twitter.com/%@", // SimplyTweet
|
||||
@"icebird://user?screen_name=%@", // IceBird
|
||||
@"fluttr://user/%@", // Fluttr
|
||||
@"http://twitter.com/%@"]) {
|
||||
@"http://twitter.com/%@"
|
||||
]) {
|
||||
NSURL *url = [NSURL URLWithString:PearlString( candidate, @"master_password" )];
|
||||
|
||||
if ([application canOpenURL:url]) {
|
||||
|
@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
@implementation MPiOSConfig
|
||||
|
||||
@dynamic sendInfo, helpHidden, siteInfoHidden, showSetup, actionsTipShown, typeTipShown, loginNameTipShown;
|
||||
|
||||
- (id)init {
|
||||
@ -14,13 +15,15 @@
|
||||
if (!(self = [super init]))
|
||||
return self;
|
||||
|
||||
[self.defaults registerDefaults:@{ NSStringFromSelector(@selector(helpHidden)): @NO,
|
||||
[self.defaults registerDefaults:@{
|
||||
NSStringFromSelector( @selector(helpHidden) ) : @NO,
|
||||
NSStringFromSelector( @selector(siteInfoHidden) ) : @YES,
|
||||
NSStringFromSelector( @selector(showSetup) ) : @YES,
|
||||
NSStringFromSelector( @selector(iTunesID) ) : @"510296984",
|
||||
NSStringFromSelector( @selector(actionsTipShown) ) : PearlBoolNot(self.firstRun),
|
||||
NSStringFromSelector( @selector(typeTipShown) ) : PearlBoolNot(self.firstRun),
|
||||
NSStringFromSelector(@selector(loginNameTipShown)): PearlBool(NO)}];
|
||||
NSStringFromSelector( @selector(loginNameTipShown) ) : PearlBool(NO)
|
||||
}];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
@ -6,7 +6,9 @@
|
||||
<array>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>If you're experiencing problems, enabling this will send us details that can help diagnose and resolve them. You will remain completely anonymous amongst the other thousands of users. No sensitive information is ever sent.</string>
|
||||
<string>If you're experiencing problems, enabling this will send us details that can help diagnose and resolve them.
|
||||
You will remain completely anonymous amongst the other thousands of users. No sensitive information is ever sent.
|
||||
</string>
|
||||
<key>Title</key>
|
||||
<string></string>
|
||||
<key>Type</key>
|
||||
@ -54,7 +56,9 @@
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>When enabled, closing the application will not log out the user. Similar to your phone's SIM lock, you only need to log in once after powering on.</string>
|
||||
<string>When enabled, closing the application will not log out the user. Similar to your phone's SIM lock, you only
|
||||
need to log in once after powering on.
|
||||
</string>
|
||||
<key>Title</key>
|
||||
<string>Master Password</string>
|
||||
<key>Type</key>
|
||||
@ -76,7 +80,9 @@
|
||||
<key>Title</key>
|
||||
<string></string>
|
||||
<key>FooterText</key>
|
||||
<string>Makes your sites available to all your Apple devices. This also works as a way of automatically keeping a back-up of your sites. Apple cannot see any of your passwords.</string>
|
||||
<string>Makes your sites available to all your Apple devices. This also works as a way of automatically keeping a back-up of
|
||||
your sites. Apple cannot see any of your passwords.
|
||||
</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
|
Loading…
Reference in New Issue
Block a user