Merge branch 'master' of github.com:Lyndir/MasterPassword
This commit is contained in:
commit
942d10e7a2
2
External/InAppSettingsKit
vendored
2
External/InAppSettingsKit
vendored
@ -1 +1 @@
|
||||
Subproject commit fcc72db0d54cd181f27b71e81901fc66958d71bf
|
||||
Subproject commit b58b72563acecb727da1f7ca151798a911229593
|
2
External/Pearl
vendored
2
External/Pearl
vendored
@ -1 +1 @@
|
||||
Subproject commit bde28af789996972e55a4398b7034088de14d6d8
|
||||
Subproject commit a4c734e07c7441b4a49e83ae0a5de02158095ed7
|
Binary file not shown.
@ -15,13 +15,13 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.2.1</string>
|
||||
<string>2.2.2</string>
|
||||
<key>CFBundleSupportedPlatforms</key>
|
||||
<array>
|
||||
<string>iPhoneOS</string>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>35</string>
|
||||
<string>36</string>
|
||||
<key>DTPlatformName</key>
|
||||
<string>iphoneos</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
|
BIN
External/iOS/Crashlytics.framework/run
vendored
BIN
External/iOS/Crashlytics.framework/run
vendored
Binary file not shown.
BIN
External/iOS/Crashlytics.framework/submit
vendored
BIN
External/iOS/Crashlytics.framework/submit
vendored
Binary file not shown.
@ -22,6 +22,23 @@
|
||||
#define MPAlgorithmDefaultVersion 1
|
||||
#define MPAlgorithmDefault MPAlgorithmForVersion(MPAlgorithmDefaultVersion)
|
||||
|
||||
id<MPAlgorithm> MPAlgorithmForVersion(NSUInteger version);
|
||||
id<MPAlgorithm> MPAlgorithmDefaultForBundleVersion(NSString *bundleVersion);
|
||||
|
||||
PearlEnum( MPAttacker,
|
||||
MPAttacker1, MPAttacker5K, MPAttacker20M, MPAttacker5B );
|
||||
|
||||
typedef struct TimeToCrack {
|
||||
unsigned long long hours;
|
||||
unsigned long long days;
|
||||
unsigned long long weeks;
|
||||
unsigned long long months;
|
||||
unsigned long long years;
|
||||
unsigned long long universes;
|
||||
} TimeToCrack;
|
||||
|
||||
NSString *NSStringFromTimeToCrack(TimeToCrack timeToCrack);
|
||||
|
||||
@protocol MPAlgorithm<NSObject>
|
||||
|
||||
@required
|
||||
@ -56,7 +73,7 @@
|
||||
usingKey:(MPKey *)elementKey;
|
||||
- (NSString *)exportContentForElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey;
|
||||
|
||||
@end
|
||||
- (BOOL)timeToCrack:(out TimeToCrack *)timeToCrack passwordOfType:(MPElementType)type byAttacker:(MPAttacker)attacker;
|
||||
- (BOOL)timeToCrack:(out TimeToCrack *)timeToCrack passwordString:(NSString *)password byAttacker:(MPAttacker)attacker;
|
||||
|
||||
id<MPAlgorithm> MPAlgorithmForVersion(NSUInteger version);
|
||||
id<MPAlgorithm> MPAlgorithmDefaultForBundleVersion(NSString *bundleVersion);
|
||||
@end
|
||||
|
@ -38,3 +38,21 @@ id<MPAlgorithm> MPAlgorithmDefaultForBundleVersion(NSString *bundleVersion) {
|
||||
|
||||
return MPAlgorithmDefault;
|
||||
}
|
||||
|
||||
NSString *NSStringFromTimeToCrack(TimeToCrack timeToCrack) {
|
||||
|
||||
if (timeToCrack.universes > 1)
|
||||
return strl( @"> age of the universe" );
|
||||
else if (timeToCrack.years > 1)
|
||||
return strl( @"%d years", timeToCrack.years );
|
||||
else if (timeToCrack.months > 1)
|
||||
return strl( @"%d months", timeToCrack.months );
|
||||
else if (timeToCrack.weeks > 1)
|
||||
return strl( @"%d weeks", timeToCrack.weeks );
|
||||
else if (timeToCrack.days > 1)
|
||||
return strl( @"%d days", timeToCrack.days );
|
||||
else if (timeToCrack.hours > 1)
|
||||
return strl( @"%d hours", timeToCrack.hours );
|
||||
else
|
||||
return strl( @"trivial" );
|
||||
}
|
||||
|
@ -18,4 +18,11 @@
|
||||
#import "MPAlgorithm.h"
|
||||
|
||||
@interface MPAlgorithmV0 : NSObject<MPAlgorithm>
|
||||
|
||||
- (NSDictionary *)allCiphers;
|
||||
- (NSArray *)ciphersForType:(MPElementType)type;
|
||||
- (NSArray *)cipherClasses;
|
||||
- (NSArray *)cipherClassCharacters;
|
||||
- (NSString *)charactersForCipherClass:(NSString *)cipherClass;
|
||||
|
||||
@end
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#import "MPAlgorithmV0.h"
|
||||
#import "MPEntities.h"
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
#define MP_N 32768
|
||||
#define MP_r 8
|
||||
@ -24,7 +26,29 @@
|
||||
#define MP_dkLen 64
|
||||
#define MP_hash PearlHashSHA256
|
||||
|
||||
@implementation MPAlgorithmV0
|
||||
/* An AMD HD 7970 calculates 2495M SHA-1 hashes per second at a cost of ~350$ per GPU */
|
||||
#define CRACKING_PER_SECOND 2495000000UL
|
||||
#define CRACKING_PRICE 350
|
||||
|
||||
@implementation MPAlgorithmV0 {
|
||||
BN_CTX *ctx;
|
||||
}
|
||||
|
||||
- (id)init {
|
||||
|
||||
if (!(self = [super init]))
|
||||
return nil;
|
||||
|
||||
ctx = BN_CTX_new();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
|
||||
BN_CTX_free( ctx );
|
||||
ctx = NULL;
|
||||
}
|
||||
|
||||
- (NSUInteger)version {
|
||||
|
||||
@ -239,21 +263,21 @@
|
||||
|
||||
switch (type) {
|
||||
case MPElementTypeGeneratedMaximum:
|
||||
return MPElementTypeStoredDevicePrivate;
|
||||
case MPElementTypeGeneratedLong:
|
||||
return MPElementTypeGeneratedMaximum;
|
||||
case MPElementTypeGeneratedMedium:
|
||||
return MPElementTypeGeneratedLong;
|
||||
case MPElementTypeGeneratedBasic:
|
||||
case MPElementTypeGeneratedLong:
|
||||
return MPElementTypeGeneratedMedium;
|
||||
case MPElementTypeGeneratedShort:
|
||||
case MPElementTypeGeneratedMedium:
|
||||
return MPElementTypeGeneratedBasic;
|
||||
case MPElementTypeGeneratedPIN:
|
||||
case MPElementTypeGeneratedBasic:
|
||||
return MPElementTypeGeneratedShort;
|
||||
case MPElementTypeStoredPersonal:
|
||||
case MPElementTypeGeneratedShort:
|
||||
return MPElementTypeGeneratedPIN;
|
||||
case MPElementTypeStoredDevicePrivate:
|
||||
case MPElementTypeGeneratedPIN:
|
||||
return MPElementTypeStoredPersonal;
|
||||
case MPElementTypeStoredPersonal:
|
||||
return MPElementTypeStoredDevicePrivate;
|
||||
case MPElementTypeStoredDevicePrivate:
|
||||
return MPElementTypeGeneratedMaximum;
|
||||
default:
|
||||
return MPElementTypeGeneratedLong;
|
||||
}
|
||||
@ -268,12 +292,41 @@
|
||||
return previousType;
|
||||
}
|
||||
|
||||
- (NSString *)generateContentNamed:(NSString *)name ofType:(MPElementType)type withCounter:(NSUInteger)counter usingKey:(MPKey *)key {
|
||||
- (NSDictionary *)allCiphers {
|
||||
|
||||
static NSDictionary *MPTypes_ciphers = nil;
|
||||
if (MPTypes_ciphers == nil)
|
||||
MPTypes_ciphers = [NSDictionary dictionaryWithContentsOfURL:
|
||||
static NSDictionary *ciphers = nil;
|
||||
static dispatch_once_t once = 0;
|
||||
dispatch_once( &once, ^{
|
||||
ciphers = [NSDictionary dictionaryWithContentsOfURL:
|
||||
[[NSBundle mainBundle] URLForResource:@"ciphers" withExtension:@"plist"]];
|
||||
} );
|
||||
|
||||
return ciphers;
|
||||
}
|
||||
|
||||
- (NSArray *)ciphersForType:(MPElementType)type {
|
||||
|
||||
NSString *typeClass = [self classNameOfType:type];
|
||||
NSString *typeName = [self nameOfType:type];
|
||||
return [[[self allCiphers] valueForKey:typeClass] valueForKey:typeName];
|
||||
}
|
||||
|
||||
- (NSArray *)cipherClasses {
|
||||
|
||||
return [[[self allCiphers] valueForKey:@"MPCharacterClasses"] allKeys];
|
||||
}
|
||||
|
||||
- (NSArray *)cipherClassCharacters {
|
||||
|
||||
return [[[self allCiphers] valueForKey:@"MPCharacterClasses"] allValues];
|
||||
}
|
||||
|
||||
- (NSString *)charactersForCipherClass:(NSString *)cipherClass {
|
||||
|
||||
return [NSNullToNil( [NSNullToNil( [[self allCiphers] valueForKey:@"MPCharacterClasses"] ) valueForKey:cipherClass] ) copy];
|
||||
}
|
||||
|
||||
- (NSString *)generateContentNamed:(NSString *)name ofType:(MPElementType)type withCounter:(NSUInteger)counter usingKey:(MPKey *)key {
|
||||
|
||||
// Determine the seed whose bytes will be used for calculating a password
|
||||
uint32_t ncounter = htonl( counter ), nnameLength = htonl( name.length );
|
||||
@ -291,12 +344,9 @@
|
||||
|
||||
// Determine the cipher from the first seed byte.
|
||||
NSAssert( [seed length], @"Missing seed." );
|
||||
NSString *typeClass = [self classNameOfType:type];
|
||||
NSString *typeName = [self nameOfType:type];
|
||||
id classCiphers = [MPTypes_ciphers valueForKey:typeClass];
|
||||
NSArray *typeCiphers = [classCiphers valueForKey:typeName];
|
||||
NSArray *typeCiphers = [self ciphersForType:type];
|
||||
NSString *cipher = typeCiphers[htons( seedBytes[0] ) % [typeCiphers count]];
|
||||
trc( @"type %@, ciphers: %@, selected: %@", typeName, typeCiphers, cipher );
|
||||
trc( @"type %@, ciphers: %@, selected: %@", [self nameOfType:type], typeCiphers, cipher );
|
||||
|
||||
// Encode the content, character by character, using subsequent seed bytes and the cipher.
|
||||
NSAssert( [seed length] >= [cipher length] + 1, @"Insufficient seed bytes to encode cipher." );
|
||||
@ -304,7 +354,7 @@
|
||||
for (NSUInteger c = 0; c < [cipher length]; ++c) {
|
||||
uint16_t keyByte = htons( seedBytes[c + 1] );
|
||||
NSString *cipherClass = [cipher substringWithRange:NSMakeRange( c, 1 )];
|
||||
NSString *cipherClassCharacters = [[MPTypes_ciphers valueForKey:@"MPCharacterClasses"] valueForKey:cipherClass];
|
||||
NSString *cipherClassCharacters = [self charactersForCipherClass:cipherClass];
|
||||
NSString *character = [cipherClassCharacters substringWithRange:NSMakeRange( keyByte % [cipherClassCharacters length], 1 )];
|
||||
|
||||
trc( @"class %@ has characters: %@, index: %u, selected: %@", cipherClass, cipherClassCharacters, keyByte, character );
|
||||
@ -334,9 +384,11 @@
|
||||
}
|
||||
|
||||
case MPElementTypeStoredPersonal: {
|
||||
NSAssert( [element isKindOfClass:[MPElementStoredEntity class]],
|
||||
@"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type,
|
||||
[element class] );
|
||||
if (![element isKindOfClass:[MPElementStoredEntity class]]) {
|
||||
wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.",
|
||||
(long)element.type, [element class] );
|
||||
break;
|
||||
}
|
||||
|
||||
NSData *encryptedContent = [[clearContent dataUsingEncoding:NSUTF8StringEncoding]
|
||||
encryptWithSymmetricKey:[elementKey subKeyOfLength:PearlCryptKeySize].keyData padding:YES];
|
||||
@ -344,9 +396,11 @@
|
||||
break;
|
||||
}
|
||||
case MPElementTypeStoredDevicePrivate: {
|
||||
NSAssert( [element isKindOfClass:[MPElementStoredEntity class]],
|
||||
@"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type,
|
||||
[element class] );
|
||||
if (![element isKindOfClass:[MPElementStoredEntity class]]) {
|
||||
wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.",
|
||||
(long)element.type, [element class] );
|
||||
break;
|
||||
}
|
||||
|
||||
NSData *encryptedContent = [[clearContent dataUsingEncoding:NSUTF8StringEncoding]
|
||||
encryptWithSymmetricKey:[elementKey subKeyOfLength:PearlCryptKeySize].keyData padding:YES];
|
||||
@ -355,7 +409,7 @@
|
||||
[PearlKeyChain deleteItemForQuery:elementQuery];
|
||||
else
|
||||
[PearlKeyChain addOrUpdateItemForQuery:elementQuery withAttributes:@{
|
||||
(__bridge id)kSecValueData : encryptedContent,
|
||||
(__bridge id)kSecValueData : encryptedContent,
|
||||
#if TARGET_OS_IPHONE
|
||||
(__bridge id)kSecAttrAccessible : (__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
|
||||
#endif
|
||||
@ -390,9 +444,11 @@
|
||||
case MPElementTypeGeneratedBasic:
|
||||
case MPElementTypeGeneratedShort:
|
||||
case MPElementTypeGeneratedPIN: {
|
||||
NSAssert( [element isKindOfClass:[MPElementGeneratedEntity class]],
|
||||
@"Element with generated type %lu is not an MPElementGeneratedEntity, but a %@.", (long)element.type,
|
||||
[element class] );
|
||||
if (![element isKindOfClass:[MPElementGeneratedEntity class]]) {
|
||||
wrn( @"Element with generated type %lu is not an MPElementGeneratedEntity, but a %@.",
|
||||
(long)element.type, [element class] );
|
||||
break;
|
||||
}
|
||||
|
||||
NSString *name = element.name;
|
||||
MPElementType type = element.type;
|
||||
@ -413,9 +469,11 @@
|
||||
}
|
||||
|
||||
case MPElementTypeStoredPersonal: {
|
||||
NSAssert( [element isKindOfClass:[MPElementStoredEntity class]],
|
||||
@"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type,
|
||||
[element class] );
|
||||
if (![element isKindOfClass:[MPElementStoredEntity class]]) {
|
||||
wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.",
|
||||
(long)element.type, [element class] );
|
||||
break;
|
||||
}
|
||||
|
||||
NSData *encryptedContent = ((MPElementStoredEntity *)element).contentObject;
|
||||
|
||||
@ -456,9 +514,11 @@
|
||||
break;
|
||||
|
||||
case MPElementTypeStoredPersonal: {
|
||||
NSAssert( [element isKindOfClass:[MPElementStoredEntity class]],
|
||||
@"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type,
|
||||
[element class] );
|
||||
if (![element isKindOfClass:[MPElementStoredEntity class]]) {
|
||||
wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.",
|
||||
(long)element.type, [element class] );
|
||||
break;
|
||||
}
|
||||
if ([importKey.keyID isEqualToData:elementKey.keyID])
|
||||
((MPElementStoredEntity *)element).contentObject = [protectedContent decodeBase64];
|
||||
|
||||
@ -515,9 +575,11 @@
|
||||
}
|
||||
|
||||
case MPElementTypeStoredPersonal: {
|
||||
NSAssert( [element isKindOfClass:[MPElementStoredEntity class]],
|
||||
@"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type,
|
||||
[element class] );
|
||||
if (![element isKindOfClass:[MPElementStoredEntity class]]) {
|
||||
wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.",
|
||||
(long)element.type, [element class] );
|
||||
break;
|
||||
}
|
||||
result = [((MPElementStoredEntity *)element).contentObject encodeBase64];
|
||||
break;
|
||||
}
|
||||
@ -557,4 +619,145 @@
|
||||
return [[NSString alloc] initWithBytes:decryptedContent.bytes length:decryptedContent.length encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
- (BOOL)timeToCrack:(out TimeToCrack *)timeToCrack passwordOfType:(MPElementType)type byAttacker:(MPAttacker)attacker {
|
||||
|
||||
if (!type)
|
||||
return NO;
|
||||
NSArray *ciphers = [self ciphersForType:type];
|
||||
if (!ciphers)
|
||||
return NO;
|
||||
|
||||
BIGNUM *permutations = BN_new(), *cipherPermutations = BN_new();
|
||||
for (NSString *cipher in ciphers) {
|
||||
BN_one( cipherPermutations );
|
||||
|
||||
for (NSUInteger c = 0; c < [cipher length]; ++c)
|
||||
BN_mul_word( cipherPermutations,
|
||||
(BN_ULONG)[[self charactersForCipherClass:[cipher substringWithRange:NSMakeRange( c, 1 )]] length] );
|
||||
|
||||
BN_add( permutations, permutations, cipherPermutations );
|
||||
}
|
||||
BN_free( cipherPermutations );
|
||||
|
||||
return [self timeToCrack:timeToCrack permutations:permutations forAttacker:attacker];
|
||||
}
|
||||
|
||||
- (BOOL)timeToCrack:(out TimeToCrack *)timeToCrack passwordString:(NSString *)password byAttacker:(MPAttacker)attacker {
|
||||
|
||||
BIGNUM *permutations = BN_new();
|
||||
BN_one( permutations );
|
||||
|
||||
NSMutableString *cipher = [NSMutableString new];
|
||||
for (NSUInteger c = 0; c < [password length]; ++c) {
|
||||
NSString *passwordCharacter = [password substringWithRange:NSMakeRange( c, 1 )];
|
||||
|
||||
unsigned int characterEntropy = 0;
|
||||
for (NSString *cipherClass in @[ @"v", @"c", @"a", @"x" ]) {
|
||||
NSString *charactersForClass = [self charactersForCipherClass:cipherClass];
|
||||
|
||||
if ([charactersForClass rangeOfString:passwordCharacter].location != NSNotFound) {
|
||||
// Found class for password character.
|
||||
characterEntropy = (BN_ULONG)[charactersForClass length];
|
||||
[cipher appendString:cipherClass];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!characterEntropy) {
|
||||
[cipher appendString:@"b"];
|
||||
characterEntropy = 256 /* a byte */;
|
||||
}
|
||||
|
||||
BN_mul_word( permutations, characterEntropy );
|
||||
}
|
||||
|
||||
return [self timeToCrack:timeToCrack permutations:permutations forAttacker:attacker];
|
||||
}
|
||||
|
||||
- (BOOL)timeToCrack:(out TimeToCrack *)timeToCrack permutations:(BIGNUM *)permutations forAttacker:(MPAttacker)attacker {
|
||||
|
||||
// Determine base seconds needed to calculate the permutations.
|
||||
BIGNUM *secondsToCrack = BN_dup( permutations );
|
||||
BN_div_word( secondsToCrack, CRACKING_PER_SECOND );
|
||||
|
||||
// Modify seconds needed by applying our hardware budget.
|
||||
switch (attacker) {
|
||||
case MPAttacker1:
|
||||
break;
|
||||
case MPAttacker5K:
|
||||
BN_mul_word( secondsToCrack, CRACKING_PRICE );
|
||||
BN_div_word( secondsToCrack, 5000 );
|
||||
break;
|
||||
case MPAttacker20M:
|
||||
BN_mul_word( secondsToCrack, CRACKING_PRICE );
|
||||
BN_div_word( secondsToCrack, 20000000 );
|
||||
break;
|
||||
case MPAttacker5B:
|
||||
BN_mul_word( secondsToCrack, CRACKING_PRICE );
|
||||
BN_div_word( secondsToCrack, 5000 );
|
||||
BN_div_word( secondsToCrack, 1000000 );
|
||||
break;
|
||||
}
|
||||
|
||||
BIGNUM *max = BN_new();
|
||||
BN_set_word( max, (BN_ULONG)-1 );
|
||||
|
||||
BIGNUM *hoursToCrack = BN_dup( secondsToCrack );
|
||||
BN_div_word( hoursToCrack, 3600 );
|
||||
if (BN_cmp( hoursToCrack, max ) < 0)
|
||||
timeToCrack->hours = BN_get_word( hoursToCrack );
|
||||
else
|
||||
timeToCrack->hours = (BN_ULONG)-1;
|
||||
|
||||
BIGNUM *daysToCrack = BN_dup( hoursToCrack );
|
||||
BN_div_word( daysToCrack, 24 );
|
||||
if (BN_cmp( daysToCrack, max ) < 0)
|
||||
timeToCrack->days = BN_get_word( daysToCrack );
|
||||
else
|
||||
timeToCrack->days = (BN_ULONG)-1;
|
||||
|
||||
BIGNUM *weeksToCrack = BN_dup( daysToCrack );
|
||||
BN_div_word( weeksToCrack, 7 );
|
||||
if (BN_cmp( weeksToCrack, max ) < 0)
|
||||
timeToCrack->weeks = BN_get_word( weeksToCrack );
|
||||
else
|
||||
timeToCrack->weeks = (BN_ULONG)-1;
|
||||
|
||||
BIGNUM *monthsToCrack = BN_dup( daysToCrack );
|
||||
BN_div_word( monthsToCrack, 31 );
|
||||
if (BN_cmp( monthsToCrack, max ) < 0)
|
||||
timeToCrack->months = BN_get_word( monthsToCrack );
|
||||
else
|
||||
timeToCrack->months = (BN_ULONG)-1;
|
||||
|
||||
BIGNUM *yearsToCrack = BN_dup( daysToCrack );
|
||||
BN_div_word( yearsToCrack, 356 );
|
||||
if (BN_cmp( yearsToCrack, max ) < 0)
|
||||
timeToCrack->years = BN_get_word( yearsToCrack );
|
||||
else
|
||||
timeToCrack->years = (BN_ULONG)-1;
|
||||
|
||||
BIGNUM *universesToCrack = BN_dup( yearsToCrack );
|
||||
BN_div_word( universesToCrack, 14000 );
|
||||
BN_div_word( universesToCrack, 1000000 );
|
||||
if (BN_cmp( universesToCrack, max ) < 0)
|
||||
timeToCrack->universes = BN_get_word( universesToCrack );
|
||||
else
|
||||
timeToCrack->universes = (BN_ULONG)-1;
|
||||
|
||||
for (unsigned long error = ERR_get_error(); error; error = ERR_get_error())
|
||||
err( @"bignum error: %lu", error );
|
||||
|
||||
BN_free( max );
|
||||
BN_free( permutations );
|
||||
BN_free( secondsToCrack );
|
||||
BN_free( hoursToCrack );
|
||||
BN_free( daysToCrack );
|
||||
BN_free( weeksToCrack );
|
||||
BN_free( monthsToCrack );
|
||||
BN_free( yearsToCrack );
|
||||
BN_free( universesToCrack );
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -1,12 +1,12 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPAlgorithmV1
|
||||
@ -28,7 +28,7 @@
|
||||
- (BOOL)migrateElement:(MPElementEntity *)element explicit:(BOOL)explicit {
|
||||
|
||||
if (element.version != [self version] - 1)
|
||||
// Only migrate from previous version.
|
||||
// Only migrate from previous version.
|
||||
return NO;
|
||||
|
||||
if (!explicit) {
|
||||
@ -47,18 +47,12 @@
|
||||
|
||||
- (NSString *)generateContentNamed:(NSString *)name ofType:(MPElementType)type withCounter:(NSUInteger)counter usingKey:(MPKey *)key {
|
||||
|
||||
static __strong NSDictionary *MPTypes_ciphers = nil;
|
||||
static dispatch_once_t once = 0;
|
||||
dispatch_once(&once, ^{
|
||||
MPTypes_ciphers = [NSDictionary dictionaryWithContentsOfURL:
|
||||
[[NSBundle mainBundle] URLForResource:@"ciphers" withExtension:@"plist"]];
|
||||
});
|
||||
|
||||
// Determine the seed whose bytes will be used for calculating a password
|
||||
uint32_t ncounter = htonl(counter), nnameLength = htonl(name.length);
|
||||
NSData *counterBytes = [NSData dataWithBytes:&ncounter length:sizeof(ncounter)];
|
||||
NSData *nameLengthBytes = [NSData dataWithBytes:&nnameLength length:sizeof(nnameLength)];
|
||||
trc(@"seed from: hmac-sha256(%@, 'com.lyndir.masterpassword' | %@ | %@ | %@)", [key.keyData encodeBase64], [nameLengthBytes encodeHex], name, [counterBytes encodeHex]);
|
||||
uint32_t ncounter = htonl( counter ), nnameLength = htonl( name.length );
|
||||
NSData *counterBytes = [NSData dataWithBytes:&ncounter length:sizeof( ncounter )];
|
||||
NSData *nameLengthBytes = [NSData dataWithBytes:&nnameLength length:sizeof( nnameLength )];
|
||||
trc( @"seed from: hmac-sha256(%@, 'com.lyndir.masterpassword' | %@ | %@ | %@)", [key.keyData encodeBase64], [nameLengthBytes encodeHex],
|
||||
name, [counterBytes encodeHex] );
|
||||
NSData *seed = [[NSData dataByConcatenatingDatas:
|
||||
[@"com.lyndir.masterpassword" dataUsingEncoding:NSUTF8StringEncoding],
|
||||
nameLengthBytes,
|
||||
@ -66,25 +60,25 @@
|
||||
counterBytes,
|
||||
nil]
|
||||
hmacWith:PearlHashSHA256 key:key.keyData];
|
||||
trc(@"seed is: %@", [seed encodeBase64]);
|
||||
trc( @"seed is: %@", [seed encodeBase64] );
|
||||
const unsigned char *seedBytes = seed.bytes;
|
||||
|
||||
// Determine the cipher from the first seed byte.
|
||||
NSAssert([seed length], @"Missing seed.");
|
||||
NSArray *typeCiphers = [[MPTypes_ciphers valueForKey:[self classNameOfType:type]] valueForKey:[self nameOfType:type]];
|
||||
NSAssert( [seed length], @"Missing seed." );
|
||||
NSArray *typeCiphers = [self ciphersForType:type];
|
||||
NSString *cipher = typeCiphers[seedBytes[0] % [typeCiphers count]];
|
||||
trc(@"type %@, ciphers: %@, selected: %@", [self nameOfType:type], typeCiphers, cipher);
|
||||
trc( @"type %@, ciphers: %@, selected: %@", [self nameOfType:type], typeCiphers, cipher );
|
||||
|
||||
// Encode the content, character by character, using subsequent seed bytes and the cipher.
|
||||
NSAssert([seed length] >= [cipher length] + 1, @"Insufficient seed bytes to encode cipher.");
|
||||
NSAssert( [seed length] >= [cipher length] + 1, @"Insufficient seed bytes to encode cipher." );
|
||||
NSMutableString *content = [NSMutableString stringWithCapacity:[cipher length]];
|
||||
for (NSUInteger c = 0; c < [cipher length]; ++c) {
|
||||
uint16_t keyByte = seedBytes[c + 1];
|
||||
NSString *cipherClass = [cipher substringWithRange:NSMakeRange( c, 1 )];
|
||||
NSString *cipherClassCharacters = [[MPTypes_ciphers valueForKey:@"MPCharacterClasses"] valueForKey:cipherClass];
|
||||
NSString *cipherClassCharacters = [self charactersForCipherClass:cipherClass];
|
||||
NSString *character = [cipherClassCharacters substringWithRange:NSMakeRange( keyByte % [cipherClassCharacters length], 1 )];
|
||||
|
||||
trc(@"class %@ has characters: %@, index: %u, selected: %@", cipherClass, cipherClassCharacters, keyByte, character);
|
||||
trc( @"class %@ has characters: %@, index: %u, selected: %@", cipherClass, cipherClassCharacters, keyByte, character );
|
||||
[content appendString:character];
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ typedef NS_ENUM( NSUInteger, MPImportResult ) {
|
||||
- (MPFixableResult)findAndFixInconsistenciesSaveInContext:(NSManagedObjectContext *)context;
|
||||
|
||||
/** @param completion The block to execute after adding the element, executed from the main thread with the new element in the main MOC. */
|
||||
- (void)addElementNamed:(NSString *)siteName completion:(void (^)(MPElementEntity *element))completion;
|
||||
- (void)addElementNamed:(NSString *)siteName completion:(void ( ^ )(MPElementEntity *element, NSManagedObjectContext *context))completion;
|
||||
- (MPElementEntity *)changeElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context toType:(MPElementType)type;
|
||||
- (MPImportResult)importSites:(NSString *)importedSitesString
|
||||
askImportPassword:(NSString *(^)(NSString *userName))importPassword
|
||||
|
@ -136,9 +136,8 @@ PearlAssociatedObjectProperty( NSManagedObjectContext*, MainManagedObjectContext
|
||||
^(NSNotification *note) {
|
||||
[[self mainManagedObjectContext] saveToStore];
|
||||
}];
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UIApplicationWillResignActiveNotification object:UIApp
|
||||
queue:[NSOperationQueue mainQueue] usingBlock:
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:UIApp
|
||||
queue:[NSOperationQueue mainQueue] usingBlock:
|
||||
^(NSNotification *note) {
|
||||
[[self mainManagedObjectContext] saveToStore];
|
||||
}];
|
||||
@ -436,10 +435,10 @@ PearlAssociatedObjectProperty( NSManagedObjectContext*, MainManagedObjectContext
|
||||
|
||||
#pragma mark - Utilities
|
||||
|
||||
- (void)addElementNamed:(NSString *)siteName completion:(void ( ^ )(MPElementEntity *element))completion {
|
||||
- (void)addElementNamed:(NSString *)siteName completion:(void ( ^ )(MPElementEntity *element, NSManagedObjectContext *context))completion {
|
||||
|
||||
if (![siteName length]) {
|
||||
completion( nil );
|
||||
completion( nil, nil );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -447,7 +446,7 @@ PearlAssociatedObjectProperty( NSManagedObjectContext*, MainManagedObjectContext
|
||||
MPUserEntity *activeUser = [self activeUserInContext:context];
|
||||
NSAssert( activeUser, @"Missing user." );
|
||||
if (!activeUser) {
|
||||
completion( nil );
|
||||
completion( nil, nil );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -467,7 +466,7 @@ PearlAssociatedObjectProperty( NSManagedObjectContext*, MainManagedObjectContext
|
||||
|
||||
[context saveToStore];
|
||||
|
||||
completion( element );
|
||||
completion( element, context );
|
||||
}];
|
||||
}
|
||||
|
||||
|
@ -17,4 +17,6 @@
|
||||
@property(nonatomic, retain) NSNumber *iCloudDecided;
|
||||
@property(nonatomic, retain) NSNumber *checkInconsistency;
|
||||
|
||||
@property(nonatomic, strong) NSNumber *siteAttacker;
|
||||
|
||||
@end
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
@implementation MPConfig
|
||||
|
||||
@dynamic sendInfo, rememberLogin, iCloudDecided, checkInconsistency, hidePasswords;
|
||||
@dynamic sendInfo, rememberLogin, iCloudDecided, checkInconsistency, hidePasswords, siteAttacker;
|
||||
|
||||
- (id)init {
|
||||
|
||||
@ -24,7 +24,8 @@
|
||||
NSStringFromSelector( @selector( rememberLogin ) ) : @NO,
|
||||
NSStringFromSelector( @selector( hidePasswords ) ) : @NO,
|
||||
NSStringFromSelector( @selector( iCloudDecided ) ) : @NO,
|
||||
NSStringFromSelector( @selector( checkInconsistency ) ) : @NO
|
||||
NSStringFromSelector( @selector( checkInconsistency ) ) : @NO,
|
||||
NSStringFromSelector( @selector( siteAttacker ) ) : @(MPAttacker1),
|
||||
}];
|
||||
|
||||
self.delegate = [MPAppDelegate_Shared get];
|
||||
|
@ -20,11 +20,11 @@
|
||||
@try {
|
||||
NSError *error = nil;
|
||||
if (!(success = [self save:&error]))
|
||||
err(@"While saving: %@", error);
|
||||
err( @"While saving: %@", error );
|
||||
}
|
||||
@catch (NSException *exception) {
|
||||
success = NO;
|
||||
err(@"While saving: %@", exception);
|
||||
err( @"While saving: %@", exception );
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -115,7 +115,8 @@
|
||||
- (NSString *)debugDescription {
|
||||
|
||||
return strf( @"{%@: name=%@, user=%@, type=%lu, uses=%ld, lastUsed=%@, version=%ld, loginName=%@, requiresExplicitMigration=%d}",
|
||||
NSStringFromClass( [self class] ), self.name, self.user.name, (long)self.type, (long)self.uses, self.lastUsed, (long)self.version,
|
||||
NSStringFromClass( [self class] ), self.name, self.user.name, (long)self.type, (long)self.uses, self.lastUsed,
|
||||
(long)self.version,
|
||||
self.loginName, self.requiresExplicitMigration );
|
||||
}
|
||||
|
||||
@ -123,9 +124,11 @@
|
||||
|
||||
while (self.version < MPAlgorithmDefaultVersion)
|
||||
if ([MPAlgorithmForVersion( self.version + 1 ) migrateElement:self explicit:explicit])
|
||||
inf(@"%@ migration to version: %ld succeeded for element: %@", explicit? @"Explicit": @"Automatic", (long)self.version + 1, self);
|
||||
inf( @"%@ migration to version: %ld succeeded for element: %@",
|
||||
explicit? @"Explicit": @"Automatic", (long)self.version + 1, self );
|
||||
else {
|
||||
wrn(@"%@ migration to version: %ld failed for element: %@", explicit? @"Explicit": @"Automatic", (long)self.version + 1, self);
|
||||
wrn( @"%@ migration to version: %ld failed for element: %@",
|
||||
explicit? @"Explicit": @"Automatic", (long)self.version + 1, self );
|
||||
return NO;
|
||||
}
|
||||
|
||||
@ -137,7 +140,7 @@
|
||||
return [self.algorithm resolveContentForElement:self usingKey:key];
|
||||
}
|
||||
|
||||
- (void)resolveContentUsingKey:(MPKey *)key result:(void (^)(NSString *))result {
|
||||
- (void)resolveContentUsingKey:(MPKey *)key result:(void ( ^ )(NSString *))result {
|
||||
|
||||
[self.algorithm resolveContentForElement:self usingKey:key result:result];
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?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>
|
||||
<deployment defaultVersion="1080" identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
|
||||
@ -7,7 +7,6 @@
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MPInitialWindowController">
|
||||
<connections>
|
||||
<outlet property="enableCloudButton" destination="409" id="572"/>
|
||||
<outlet property="openAtLoginButton" destination="508" id="571"/>
|
||||
<outlet property="window" destination="1" id="ngh-EA-JYN"/>
|
||||
</connections>
|
||||
@ -17,26 +16,23 @@
|
||||
<window title="Welcome to Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" animationBehavior="default" id="1">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="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"/>
|
||||
<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"/>
|
||||
<subviews>
|
||||
<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"/>
|
||||
<subviews>
|
||||
<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"/>
|
||||
<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"/>
|
||||
</imageView>
|
||||
<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"/>
|
||||
<shadow key="shadow" blurRadius="1">
|
||||
<size key="offset" width="0.0" height="1"/>
|
||||
@ -51,7 +47,7 @@ from anywhere.</string>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<shadow key="shadow" blurRadius="1">
|
||||
<size key="offset" width="0.0" height="1"/>
|
||||
@ -64,7 +60,7 @@ from anywhere.</string>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<shadow key="shadow" blurRadius="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"/>
|
||||
</constraints>
|
||||
</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">
|
||||
<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"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="122" id="509"/>
|
||||
@ -122,11 +104,8 @@ from anywhere.</string>
|
||||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<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">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@ -137,16 +116,13 @@ from anywhere.</string>
|
||||
<constraints>
|
||||
<constraint firstItem="369" firstAttribute="top" secondItem="2" secondAttribute="top" id="374"/>
|
||||
<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="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="409" secondAttribute="bottom" constant="10" id="546"/>
|
||||
<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="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 firstAttribute="trailing" secondItem="508" secondAttribute="trailing" constant="20" symbolic="YES" id="nH9-cd-trF"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</window>
|
||||
|
@ -21,7 +21,6 @@
|
||||
@interface MPInitialWindowController : NSWindowController
|
||||
|
||||
@property(nonatomic, weak) IBOutlet NSButton *openAtLoginButton;
|
||||
@property(nonatomic, weak) IBOutlet NSButton *enableCloudButton;
|
||||
|
||||
- (IBAction)iphoneAppStore:(id)sender;
|
||||
- (IBAction)togglePreference:(id)sender;
|
||||
|
@ -44,15 +44,6 @@
|
||||
|
||||
- (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)
|
||||
[[MPMacAppDelegate get] setLoginItemEnabled:self.openAtLoginButton.state == NSOnState];
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
@property(nonatomic, weak) IBOutlet NSMenuItem *lockItem;
|
||||
@property(nonatomic, weak) IBOutlet NSMenuItem *showItem;
|
||||
@property(nonatomic, strong) IBOutlet NSMenu *statusMenu;
|
||||
@property(nonatomic, weak) IBOutlet NSMenuItem *useCloudItem;
|
||||
@property(nonatomic, weak) IBOutlet NSMenuItem *hidePasswordsItem;
|
||||
@property(nonatomic, weak) IBOutlet NSMenuItem *rememberPasswordItem;
|
||||
@property(nonatomic, weak) IBOutlet NSMenuItem *openAtLoginItem;
|
||||
@ -34,8 +33,6 @@
|
||||
- (IBAction)togglePreference:(id)sender;
|
||||
- (IBAction)newUser:(NSMenuItem *)sender;
|
||||
- (IBAction)lock:(id)sender;
|
||||
- (IBAction)rebuildCloud:(id)sender;
|
||||
- (IBAction)corruptCloud:(id)sender;
|
||||
- (IBAction)terminate:(id)sender;
|
||||
- (IBAction)showPopup:(id)sender;
|
||||
|
||||
|
@ -16,12 +16,6 @@
|
||||
|
||||
#define LOGIN_HELPER_BUNDLE_ID @"com.lyndir.lhunath.MasterPassword.Mac.LoginHelper"
|
||||
|
||||
@interface UbiquityStoreManager(Private)
|
||||
|
||||
- (void)markCloudStoreCorrupted;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPMacAppDelegate
|
||||
|
||||
#pragma clang diagnostic push
|
||||
@ -32,8 +26,8 @@ static EventHotKeyID MPLockHotKey = { .signature = 'lock', .id = 1 };
|
||||
|
||||
+ (void)initialize {
|
||||
|
||||
static dispatch_once_t initialize = 0;
|
||||
dispatch_once( &initialize, ^{
|
||||
static dispatch_once_t once = 0;
|
||||
dispatch_once( &once, ^{
|
||||
[MPMacConfig get];
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -79,11 +73,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
[weakSelf updateMenuItems];
|
||||
} );
|
||||
} 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.
|
||||
self.statusView = [[RHStatusItemView alloc] initWithStatusBarItem:
|
||||
@ -126,8 +115,9 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
err( @"Error registering 'lock' hotkey: %i", (int)status );
|
||||
|
||||
// Initial display.
|
||||
if ([[MPMacConfig get].firstRun boolValue]){
|
||||
[(self.initialWindowController = [[MPInitialWindowController alloc] initWithWindowNibName:@"MPInitialWindow"]).window makeKeyAndOrderFront:self];
|
||||
if ([[MPMacConfig get].firstRun boolValue]) {
|
||||
[(self.initialWindowController = [[MPInitialWindowController alloc] initWithWindowNibName:@"MPInitialWindow"])
|
||||
.window makeKeyAndOrderFront:self];
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
}
|
||||
@ -314,8 +304,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
|
||||
- (IBAction)togglePreference:(id)sender {
|
||||
|
||||
if (sender == self.useCloudItem)
|
||||
[self storeManager].cloudEnabled = self.useCloudItem.state != NSOnState;
|
||||
if (sender == self.hidePasswordsItem)
|
||||
[MPConfig get].hidePasswords = [NSNumber numberWithBool:![[MPConfig get].hidePasswords boolValue]];
|
||||
if (sender == self.rememberPasswordItem)
|
||||
@ -393,26 +381,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
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 {
|
||||
|
||||
[self.passwordWindowController close];
|
||||
@ -547,8 +515,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
if (![users count]) {
|
||||
NSMenuItem *noUsersItem = [self.usersItem.submenu addItemWithTitle:@"No users" action:NULL keyEquivalent:@""];
|
||||
noUsersItem.enabled = NO;
|
||||
noUsersItem.toolTip = @"Use the iOS app to create users and make sure iCloud is enabled in its preferences as well. "
|
||||
@"Then give iCloud some time to sync the new user to your Mac.";
|
||||
noUsersItem.toolTip = @"Begin by creating a user.";
|
||||
}
|
||||
|
||||
self.usersItem.state = NSMixedState;
|
||||
@ -627,17 +594,29 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
||||
self.savePasswordItem.enabled = YES;
|
||||
self.savePasswordItem.toolTip = nil;
|
||||
}
|
||||
}
|
||||
|
||||
self.useCloudItem.state = self.storeManager.cloudEnabled? NSOnState: NSOffState;
|
||||
self.initialWindowController.enableCloudButton.state = self.storeManager.cloudEnabled? NSOnState: NSOffState;
|
||||
self.useCloudItem.enabled = self.storeManager.cloudAvailable;
|
||||
if (self.storeManager.cloudAvailable) {
|
||||
self.useCloudItem.title = @"Use iCloud";
|
||||
self.useCloudItem.toolTip = nil;
|
||||
}
|
||||
else {
|
||||
self.useCloudItem.title = @"Use iCloud (Unavailable)";
|
||||
self.useCloudItem.toolTip = @"iCloud is not set up for your Mac user.";
|
||||
#pragma mark - UbiquityStoreManagerDelegate
|
||||
|
||||
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didLoadStoreForCoordinator:(NSPersistentStoreCoordinator *)coordinator
|
||||
isCloud:(BOOL)isCloudStore {
|
||||
|
||||
[super ubiquityStoreManager:manager didLoadStoreForCoordinator:coordinator isCloud:isCloudStore];
|
||||
|
||||
if (isCloudStore) {
|
||||
NSAlert *alert = [NSAlert new];
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
@property(nonatomic) NSString *masterPassword;
|
||||
@property(nonatomic) BOOL alternatePressed;
|
||||
@property(nonatomic) BOOL locked;
|
||||
@property(nonatomic) BOOL newUser;
|
||||
|
||||
@property(nonatomic, weak) IBOutlet NSArrayController *elementsController;
|
||||
@property(nonatomic, weak) IBOutlet NSImageView *blurView;
|
||||
|
@ -229,7 +229,7 @@
|
||||
switch (returnCode) {
|
||||
case NSAlertFirstButtonReturn: {
|
||||
// "Create" button.
|
||||
[[MPMacAppDelegate get] addElementNamed:[self.siteField stringValue] completion:^(MPElementEntity *element) {
|
||||
[[MPMacAppDelegate get] addElementNamed:[self.siteField stringValue] completion:^(MPElementEntity *element, NSManagedObjectContext *context) {
|
||||
if (element)
|
||||
PearlMainQueue( ^{ [self updateElements]; } );
|
||||
}];
|
||||
@ -476,12 +476,15 @@
|
||||
|
||||
[MPMacAppDelegate managedObjectContextForMainThreadPerformBlock:^(NSManagedObjectContext *mainContext) {
|
||||
self.locked = YES;
|
||||
self.newUser = YES;
|
||||
|
||||
self.inputLabel.stringValue = @"";
|
||||
self.siteField.stringValue = @"";
|
||||
|
||||
MPUserEntity *mainActiveUser = [[MPMacAppDelegate get] activeUserInContext:mainContext];
|
||||
if (mainActiveUser) {
|
||||
self.newUser = mainActiveUser.keyID == nil;
|
||||
|
||||
if ([MPMacAppDelegate get].key) {
|
||||
self.inputLabel.stringValue = strf( @"%@'s password for:", mainActiveUser.name );
|
||||
self.locked = NO;
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?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>
|
||||
<deployment defaultVersion="1080" identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
|
||||
@ -86,7 +86,6 @@
|
||||
</secureTextField>
|
||||
<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"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<shadow key="shadow" blurRadius="1">
|
||||
<size key="offset" width="0.0" height="1"/>
|
||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
@ -139,13 +138,13 @@
|
||||
</binding>
|
||||
</connections>
|
||||
</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"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="e11-59-xSS">
|
||||
<rect key="frame" x="0.0" y="0.0" width="512" height="147"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<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"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<size key="intercellSpacing" width="3" height="2"/>
|
||||
@ -450,12 +449,8 @@
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<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">
|
||||
<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>
|
||||
@ -467,8 +462,12 @@
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
</dictionary>
|
||||
</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">
|
||||
<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>
|
||||
@ -486,6 +485,15 @@
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="I7S-x6-XZk" id="HKK-Eu-1qV">
|
||||
<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">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||
@ -510,6 +518,15 @@
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<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">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||
@ -529,7 +546,7 @@
|
||||
<constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/>
|
||||
</constraints>
|
||||
</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"/>
|
||||
<shadow key="shadow" blurRadius="1">
|
||||
<size key="offset" width="0.0" height="1"/>
|
||||
@ -740,6 +757,7 @@
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<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">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||
@ -749,15 +767,6 @@
|
||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||
</dictionary>
|
||||
</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">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||
@ -766,7 +775,15 @@
|
||||
<integer key="NSNullPlaceholder" value="0"/>
|
||||
</dictionary>
|
||||
</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>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gAU-xs-aae">
|
||||
@ -912,7 +929,6 @@
|
||||
</matrix>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kCO-1M-Wz1">
|
||||
<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">
|
||||
<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>
|
||||
|
@ -137,87 +137,7 @@
|
||||
DACA299A1705E2BD002C6C22 /* JRSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA298C1705E2BD002C6C22 /* JRSwizzle.m */; };
|
||||
DAD9B5F01762CAA4001835F9 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD9B5EF1762CAA4001835F9 /* ServiceManagement.framework */; };
|
||||
DAD9B5F11762CAB9001835F9 /* MasterPassword-Mac-LoginHelper.app in Copy LoginHelper */ = {isa = PBXBuildFile; fileRef = DAD9B5E6176299BA001835F9 /* MasterPassword-Mac-LoginHelper.app */; };
|
||||
DAEB93D918AB0FFD000490CC /* aes.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938718AB0FFD000490CC /* aes.h */; };
|
||||
DAEB93DA18AB0FFD000490CC /* asn1.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938818AB0FFD000490CC /* asn1.h */; };
|
||||
DAEB93DB18AB0FFD000490CC /* asn1_mac.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938918AB0FFD000490CC /* asn1_mac.h */; };
|
||||
DAEB93DC18AB0FFD000490CC /* asn1t.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938A18AB0FFD000490CC /* asn1t.h */; };
|
||||
DAEB93DD18AB0FFD000490CC /* bio.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938B18AB0FFD000490CC /* bio.h */; };
|
||||
DAEB93DE18AB0FFD000490CC /* blowfish.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938C18AB0FFD000490CC /* blowfish.h */; };
|
||||
DAEB93DF18AB0FFD000490CC /* bn.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938D18AB0FFD000490CC /* bn.h */; };
|
||||
DAEB93E018AB0FFD000490CC /* buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938E18AB0FFD000490CC /* buffer.h */; };
|
||||
DAEB93E118AB0FFD000490CC /* camellia.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB938F18AB0FFD000490CC /* camellia.h */; };
|
||||
DAEB93E218AB0FFD000490CC /* cast.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939018AB0FFD000490CC /* cast.h */; };
|
||||
DAEB93E318AB0FFD000490CC /* cms.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939118AB0FFD000490CC /* cms.h */; };
|
||||
DAEB93E418AB0FFD000490CC /* comp.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939218AB0FFD000490CC /* comp.h */; };
|
||||
DAEB93E518AB0FFD000490CC /* conf.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939318AB0FFD000490CC /* conf.h */; };
|
||||
DAEB93E618AB0FFD000490CC /* conf_api.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939418AB0FFD000490CC /* conf_api.h */; };
|
||||
DAEB93E718AB0FFD000490CC /* crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939518AB0FFD000490CC /* crypto.h */; };
|
||||
DAEB93E818AB0FFD000490CC /* des.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939618AB0FFD000490CC /* des.h */; };
|
||||
DAEB93E918AB0FFD000490CC /* des_old.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939718AB0FFD000490CC /* des_old.h */; };
|
||||
DAEB93EA18AB0FFD000490CC /* dh.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939818AB0FFD000490CC /* dh.h */; };
|
||||
DAEB93EB18AB0FFD000490CC /* dsa.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939918AB0FFD000490CC /* dsa.h */; };
|
||||
DAEB93EC18AB0FFD000490CC /* dso.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939A18AB0FFD000490CC /* dso.h */; };
|
||||
DAEB93ED18AB0FFD000490CC /* dtls1.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939B18AB0FFD000490CC /* dtls1.h */; };
|
||||
DAEB93EE18AB0FFD000490CC /* e_os2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939C18AB0FFD000490CC /* e_os2.h */; };
|
||||
DAEB93EF18AB0FFD000490CC /* ebcdic.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939D18AB0FFD000490CC /* ebcdic.h */; };
|
||||
DAEB93F018AB0FFD000490CC /* ec.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939E18AB0FFD000490CC /* ec.h */; };
|
||||
DAEB93F118AB0FFD000490CC /* ecdh.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB939F18AB0FFD000490CC /* ecdh.h */; };
|
||||
DAEB93F218AB0FFD000490CC /* ecdsa.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A018AB0FFD000490CC /* ecdsa.h */; };
|
||||
DAEB93F318AB0FFD000490CC /* engine.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A118AB0FFD000490CC /* engine.h */; };
|
||||
DAEB93F418AB0FFD000490CC /* err.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A218AB0FFD000490CC /* err.h */; };
|
||||
DAEB93F518AB0FFD000490CC /* evp.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A318AB0FFD000490CC /* evp.h */; };
|
||||
DAEB93F618AB0FFD000490CC /* hmac.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A418AB0FFD000490CC /* hmac.h */; };
|
||||
DAEB93F718AB0FFD000490CC /* idea.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A518AB0FFD000490CC /* idea.h */; };
|
||||
DAEB93F818AB0FFD000490CC /* krb5_asn.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A618AB0FFD000490CC /* krb5_asn.h */; };
|
||||
DAEB93F918AB0FFD000490CC /* kssl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A718AB0FFD000490CC /* kssl.h */; };
|
||||
DAEB93FA18AB0FFD000490CC /* lhash.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A818AB0FFD000490CC /* lhash.h */; };
|
||||
DAEB93FB18AB0FFD000490CC /* md4.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93A918AB0FFD000490CC /* md4.h */; };
|
||||
DAEB93FC18AB0FFD000490CC /* md5.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93AA18AB0FFD000490CC /* md5.h */; };
|
||||
DAEB93FD18AB0FFD000490CC /* mdc2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93AB18AB0FFD000490CC /* mdc2.h */; };
|
||||
DAEB93FE18AB0FFD000490CC /* modes.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93AC18AB0FFD000490CC /* modes.h */; };
|
||||
DAEB93FF18AB0FFD000490CC /* obj_mac.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93AD18AB0FFD000490CC /* obj_mac.h */; };
|
||||
DAEB940018AB0FFD000490CC /* objects.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93AE18AB0FFD000490CC /* objects.h */; };
|
||||
DAEB940118AB0FFD000490CC /* ocsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93AF18AB0FFD000490CC /* ocsp.h */; };
|
||||
DAEB940218AB0FFD000490CC /* opensslconf.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B018AB0FFD000490CC /* opensslconf.h */; };
|
||||
DAEB940318AB0FFD000490CC /* opensslv.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B118AB0FFD000490CC /* opensslv.h */; };
|
||||
DAEB940418AB0FFD000490CC /* ossl_typ.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B218AB0FFD000490CC /* ossl_typ.h */; };
|
||||
DAEB940518AB0FFD000490CC /* pem.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B318AB0FFD000490CC /* pem.h */; };
|
||||
DAEB940618AB0FFD000490CC /* pem2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B418AB0FFD000490CC /* pem2.h */; };
|
||||
DAEB940718AB0FFD000490CC /* pkcs12.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B518AB0FFD000490CC /* pkcs12.h */; };
|
||||
DAEB940818AB0FFD000490CC /* pkcs7.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B618AB0FFD000490CC /* pkcs7.h */; };
|
||||
DAEB940918AB0FFD000490CC /* pqueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B718AB0FFD000490CC /* pqueue.h */; };
|
||||
DAEB940A18AB0FFD000490CC /* rand.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B818AB0FFD000490CC /* rand.h */; };
|
||||
DAEB940B18AB0FFD000490CC /* rc2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93B918AB0FFD000490CC /* rc2.h */; };
|
||||
DAEB940C18AB0FFD000490CC /* rc4.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93BA18AB0FFD000490CC /* rc4.h */; };
|
||||
DAEB940D18AB0FFD000490CC /* ripemd.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93BB18AB0FFD000490CC /* ripemd.h */; };
|
||||
DAEB940E18AB0FFD000490CC /* rsa.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93BC18AB0FFD000490CC /* rsa.h */; };
|
||||
DAEB940F18AB0FFD000490CC /* safestack.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93BD18AB0FFD000490CC /* safestack.h */; };
|
||||
DAEB941018AB0FFD000490CC /* seed.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93BE18AB0FFD000490CC /* seed.h */; };
|
||||
DAEB941118AB0FFD000490CC /* sha.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93BF18AB0FFD000490CC /* sha.h */; };
|
||||
DAEB941218AB0FFD000490CC /* ssl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C018AB0FFD000490CC /* ssl.h */; };
|
||||
DAEB941318AB0FFD000490CC /* ssl2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C118AB0FFD000490CC /* ssl2.h */; };
|
||||
DAEB941418AB0FFD000490CC /* ssl23.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C218AB0FFD000490CC /* ssl23.h */; };
|
||||
DAEB941518AB0FFD000490CC /* ssl3.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C318AB0FFD000490CC /* ssl3.h */; };
|
||||
DAEB941618AB0FFD000490CC /* stack.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C418AB0FFD000490CC /* stack.h */; };
|
||||
DAEB941718AB0FFD000490CC /* symhacks.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C518AB0FFD000490CC /* symhacks.h */; };
|
||||
DAEB941818AB0FFD000490CC /* tls1.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C618AB0FFD000490CC /* tls1.h */; };
|
||||
DAEB941918AB0FFD000490CC /* ts.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C718AB0FFD000490CC /* ts.h */; };
|
||||
DAEB941A18AB0FFD000490CC /* txt_db.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C818AB0FFD000490CC /* txt_db.h */; };
|
||||
DAEB941B18AB0FFD000490CC /* ui.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93C918AB0FFD000490CC /* ui.h */; };
|
||||
DAEB941C18AB0FFD000490CC /* ui_compat.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93CA18AB0FFD000490CC /* ui_compat.h */; };
|
||||
DAEB941D18AB0FFD000490CC /* whrlpool.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93CB18AB0FFD000490CC /* whrlpool.h */; };
|
||||
DAEB941E18AB0FFD000490CC /* x509.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93CC18AB0FFD000490CC /* x509.h */; };
|
||||
DAEB941F18AB0FFD000490CC /* x509_vfy.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93CD18AB0FFD000490CC /* x509_vfy.h */; };
|
||||
DAEB942018AB0FFD000490CC /* x509v3.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93CE18AB0FFD000490CC /* x509v3.h */; };
|
||||
DAEB942118AB0FFD000490CC /* crypto_aesctr.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D018AB0FFD000490CC /* crypto_aesctr.h */; };
|
||||
DAEB942218AB0FFD000490CC /* crypto_scrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D118AB0FFD000490CC /* crypto_scrypt.h */; };
|
||||
DAEB942318AB0FFD000490CC /* memlimit.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D218AB0FFD000490CC /* memlimit.h */; };
|
||||
DAEB942418AB0FFD000490CC /* readpass.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D318AB0FFD000490CC /* readpass.h */; };
|
||||
DAEB942518AB0FFD000490CC /* scryptenc.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D418AB0FFD000490CC /* scryptenc.h */; };
|
||||
DAEB942618AB0FFD000490CC /* scryptenc_cpuperf.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D518AB0FFD000490CC /* scryptenc_cpuperf.h */; };
|
||||
DAEB942718AB0FFD000490CC /* sha256.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D618AB0FFD000490CC /* sha256.h */; };
|
||||
DAEB942818AB0FFD000490CC /* sysendian.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D718AB0FFD000490CC /* sysendian.h */; };
|
||||
DAEB942918AB0FFD000490CC /* warn.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB93D818AB0FFD000490CC /* warn.h */; };
|
||||
DAE8E65519867AE200416A0F /* libopensslcrypto-osx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE8E65319867ADA00416A0F /* libopensslcrypto-osx.a */; };
|
||||
DAEB942E18B47FB3000490CC /* MPInitialWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA0933C91747A56A00DE1CEF /* MPInitialWindow.xib */; };
|
||||
DAF4EF56190A828100023C90 /* Exo2.0-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = DAF4EF52190A828100023C90 /* Exo2.0-Thin.otf */; };
|
||||
DAF4EF57190A828100023C90 /* Exo2.0-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DAF4EF53190A828100023C90 /* Exo2.0-Regular.otf */; };
|
||||
@ -877,87 +797,9 @@
|
||||
DAD312C01552A20800A3F9ED /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
|
||||
DAD9B5E1176299B9001835F9 /* MasterPassword-Mac-LoginHelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "MasterPassword-Mac-LoginHelper.xcodeproj"; path = "MasterPassword-Mac-LoginHelper/MasterPassword-Mac-LoginHelper.xcodeproj"; sourceTree = "<group>"; };
|
||||
DAD9B5EF1762CAA4001835F9 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
|
||||
DAEB938718AB0FFD000490CC /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
|
||||
DAEB938818AB0FFD000490CC /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = "<group>"; };
|
||||
DAEB938918AB0FFD000490CC /* asn1_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1_mac.h; sourceTree = "<group>"; };
|
||||
DAEB938A18AB0FFD000490CC /* asn1t.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1t.h; sourceTree = "<group>"; };
|
||||
DAEB938B18AB0FFD000490CC /* bio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bio.h; sourceTree = "<group>"; };
|
||||
DAEB938C18AB0FFD000490CC /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = "<group>"; };
|
||||
DAEB938D18AB0FFD000490CC /* bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn.h; sourceTree = "<group>"; };
|
||||
DAEB938E18AB0FFD000490CC /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = "<group>"; };
|
||||
DAEB938F18AB0FFD000490CC /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = "<group>"; };
|
||||
DAEB939018AB0FFD000490CC /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = "<group>"; };
|
||||
DAEB939118AB0FFD000490CC /* cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cms.h; sourceTree = "<group>"; };
|
||||
DAEB939218AB0FFD000490CC /* comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comp.h; sourceTree = "<group>"; };
|
||||
DAEB939318AB0FFD000490CC /* conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; };
|
||||
DAEB939418AB0FFD000490CC /* conf_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf_api.h; sourceTree = "<group>"; };
|
||||
DAEB939518AB0FFD000490CC /* crypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = "<group>"; };
|
||||
DAEB939618AB0FFD000490CC /* des.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = "<group>"; };
|
||||
DAEB939718AB0FFD000490CC /* des_old.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des_old.h; sourceTree = "<group>"; };
|
||||
DAEB939818AB0FFD000490CC /* dh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dh.h; sourceTree = "<group>"; };
|
||||
DAEB939918AB0FFD000490CC /* dsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsa.h; sourceTree = "<group>"; };
|
||||
DAEB939A18AB0FFD000490CC /* dso.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dso.h; sourceTree = "<group>"; };
|
||||
DAEB939B18AB0FFD000490CC /* dtls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dtls1.h; sourceTree = "<group>"; };
|
||||
DAEB939C18AB0FFD000490CC /* e_os2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = e_os2.h; sourceTree = "<group>"; };
|
||||
DAEB939D18AB0FFD000490CC /* ebcdic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ebcdic.h; sourceTree = "<group>"; };
|
||||
DAEB939E18AB0FFD000490CC /* ec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ec.h; sourceTree = "<group>"; };
|
||||
DAEB939F18AB0FFD000490CC /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = "<group>"; };
|
||||
DAEB93A018AB0FFD000490CC /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = "<group>"; };
|
||||
DAEB93A118AB0FFD000490CC /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = "<group>"; };
|
||||
DAEB93A218AB0FFD000490CC /* err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = "<group>"; };
|
||||
DAEB93A318AB0FFD000490CC /* evp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evp.h; sourceTree = "<group>"; };
|
||||
DAEB93A418AB0FFD000490CC /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = "<group>"; };
|
||||
DAEB93A518AB0FFD000490CC /* idea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idea.h; sourceTree = "<group>"; };
|
||||
DAEB93A618AB0FFD000490CC /* krb5_asn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = krb5_asn.h; sourceTree = "<group>"; };
|
||||
DAEB93A718AB0FFD000490CC /* kssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kssl.h; sourceTree = "<group>"; };
|
||||
DAEB93A818AB0FFD000490CC /* lhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lhash.h; sourceTree = "<group>"; };
|
||||
DAEB93A918AB0FFD000490CC /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = "<group>"; };
|
||||
DAEB93AA18AB0FFD000490CC /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = "<group>"; };
|
||||
DAEB93AB18AB0FFD000490CC /* mdc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdc2.h; sourceTree = "<group>"; };
|
||||
DAEB93AC18AB0FFD000490CC /* modes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modes.h; sourceTree = "<group>"; };
|
||||
DAEB93AD18AB0FFD000490CC /* obj_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = obj_mac.h; sourceTree = "<group>"; };
|
||||
DAEB93AE18AB0FFD000490CC /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = "<group>"; };
|
||||
DAEB93AF18AB0FFD000490CC /* ocsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocsp.h; sourceTree = "<group>"; };
|
||||
DAEB93B018AB0FFD000490CC /* opensslconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf.h; sourceTree = "<group>"; };
|
||||
DAEB93B118AB0FFD000490CC /* opensslv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslv.h; sourceTree = "<group>"; };
|
||||
DAEB93B218AB0FFD000490CC /* ossl_typ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ossl_typ.h; sourceTree = "<group>"; };
|
||||
DAEB93B318AB0FFD000490CC /* pem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = "<group>"; };
|
||||
DAEB93B418AB0FFD000490CC /* pem2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem2.h; sourceTree = "<group>"; };
|
||||
DAEB93B518AB0FFD000490CC /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = "<group>"; };
|
||||
DAEB93B618AB0FFD000490CC /* pkcs7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs7.h; sourceTree = "<group>"; };
|
||||
DAEB93B718AB0FFD000490CC /* pqueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pqueue.h; sourceTree = "<group>"; };
|
||||
DAEB93B818AB0FFD000490CC /* rand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rand.h; sourceTree = "<group>"; };
|
||||
DAEB93B918AB0FFD000490CC /* rc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc2.h; sourceTree = "<group>"; };
|
||||
DAEB93BA18AB0FFD000490CC /* rc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc4.h; sourceTree = "<group>"; };
|
||||
DAEB93BB18AB0FFD000490CC /* ripemd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ripemd.h; sourceTree = "<group>"; };
|
||||
DAEB93BC18AB0FFD000490CC /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = "<group>"; };
|
||||
DAEB93BD18AB0FFD000490CC /* safestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safestack.h; sourceTree = "<group>"; };
|
||||
DAEB93BE18AB0FFD000490CC /* seed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seed.h; sourceTree = "<group>"; };
|
||||
DAEB93BF18AB0FFD000490CC /* sha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha.h; sourceTree = "<group>"; };
|
||||
DAEB93C018AB0FFD000490CC /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = "<group>"; };
|
||||
DAEB93C118AB0FFD000490CC /* ssl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl2.h; sourceTree = "<group>"; };
|
||||
DAEB93C218AB0FFD000490CC /* ssl23.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl23.h; sourceTree = "<group>"; };
|
||||
DAEB93C318AB0FFD000490CC /* ssl3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl3.h; sourceTree = "<group>"; };
|
||||
DAEB93C418AB0FFD000490CC /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = "<group>"; };
|
||||
DAEB93C518AB0FFD000490CC /* symhacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symhacks.h; sourceTree = "<group>"; };
|
||||
DAEB93C618AB0FFD000490CC /* tls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tls1.h; sourceTree = "<group>"; };
|
||||
DAEB93C718AB0FFD000490CC /* ts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ts.h; sourceTree = "<group>"; };
|
||||
DAEB93C818AB0FFD000490CC /* txt_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = txt_db.h; sourceTree = "<group>"; };
|
||||
DAEB93C918AB0FFD000490CC /* ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = "<group>"; };
|
||||
DAEB93CA18AB0FFD000490CC /* ui_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui_compat.h; sourceTree = "<group>"; };
|
||||
DAEB93CB18AB0FFD000490CC /* whrlpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = whrlpool.h; sourceTree = "<group>"; };
|
||||
DAEB93CC18AB0FFD000490CC /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = "<group>"; };
|
||||
DAEB93CD18AB0FFD000490CC /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = "<group>"; };
|
||||
DAEB93CE18AB0FFD000490CC /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = "<group>"; };
|
||||
DAEB93D018AB0FFD000490CC /* crypto_aesctr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto_aesctr.h; sourceTree = "<group>"; };
|
||||
DAEB93D118AB0FFD000490CC /* crypto_scrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto_scrypt.h; sourceTree = "<group>"; };
|
||||
DAEB93D218AB0FFD000490CC /* memlimit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memlimit.h; sourceTree = "<group>"; };
|
||||
DAEB93D318AB0FFD000490CC /* readpass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readpass.h; sourceTree = "<group>"; };
|
||||
DAEB93D418AB0FFD000490CC /* scryptenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scryptenc.h; sourceTree = "<group>"; };
|
||||
DAEB93D518AB0FFD000490CC /* scryptenc_cpuperf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scryptenc_cpuperf.h; sourceTree = "<group>"; };
|
||||
DAEB93D618AB0FFD000490CC /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha256.h; sourceTree = "<group>"; };
|
||||
DAEB93D718AB0FFD000490CC /* sysendian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysendian.h; sourceTree = "<group>"; };
|
||||
DAEB93D818AB0FFD000490CC /* warn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = warn.h; sourceTree = "<group>"; };
|
||||
DAE8E65319867ADA00416A0F /* libopensslcrypto-osx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libopensslcrypto-osx.a"; sourceTree = "<group>"; };
|
||||
DAE8E65619867AF500416A0F /* scrypt */ = {isa = PBXFileReference; lastKnownFileType = folder; path = scrypt; sourceTree = "<group>"; };
|
||||
DAE8E65719867AF500416A0F /* openssl */ = {isa = PBXFileReference; lastKnownFileType = folder; path = openssl; sourceTree = "<group>"; };
|
||||
DAEBC45214F6364500987BF6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
DAF4EF52190A828100023C90 /* Exo2.0-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Thin.otf"; sourceTree = "<group>"; };
|
||||
DAF4EF53190A828100023C90 /* Exo2.0-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Regular.otf"; sourceTree = "<group>"; };
|
||||
@ -1062,6 +904,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DAE8E65519867AE200416A0F /* libopensslcrypto-osx.a in Frameworks */,
|
||||
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */,
|
||||
DAC77CAE148291A600BCF976 /* Foundation.framework in Frameworks */,
|
||||
DA5E5C9417248AA1003798D8 /* libscryptenc-osx.a in Frameworks */,
|
||||
@ -1149,8 +992,9 @@
|
||||
DA5E5C7917248AA1003798D8 /* lib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB938518AB0FFD000490CC /* include */,
|
||||
DA5E5C8717248AA1003798D8 /* libscryptenc-osx.a */,
|
||||
DAE8E65319867ADA00416A0F /* libopensslcrypto-osx.a */,
|
||||
DAEB938518AB0FFD000490CC /* include */,
|
||||
);
|
||||
path = lib;
|
||||
sourceTree = "<group>";
|
||||
@ -1822,107 +1666,12 @@
|
||||
DAEB938518AB0FFD000490CC /* include */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB938618AB0FFD000490CC /* openssl */,
|
||||
DAEB93CF18AB0FFD000490CC /* scrypt */,
|
||||
DAE8E65619867AF500416A0F /* scrypt */,
|
||||
DAE8E65719867AF500416A0F /* openssl */,
|
||||
);
|
||||
path = include;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DAEB938618AB0FFD000490CC /* openssl */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB938718AB0FFD000490CC /* aes.h */,
|
||||
DAEB938818AB0FFD000490CC /* asn1.h */,
|
||||
DAEB938918AB0FFD000490CC /* asn1_mac.h */,
|
||||
DAEB938A18AB0FFD000490CC /* asn1t.h */,
|
||||
DAEB938B18AB0FFD000490CC /* bio.h */,
|
||||
DAEB938C18AB0FFD000490CC /* blowfish.h */,
|
||||
DAEB938D18AB0FFD000490CC /* bn.h */,
|
||||
DAEB938E18AB0FFD000490CC /* buffer.h */,
|
||||
DAEB938F18AB0FFD000490CC /* camellia.h */,
|
||||
DAEB939018AB0FFD000490CC /* cast.h */,
|
||||
DAEB939118AB0FFD000490CC /* cms.h */,
|
||||
DAEB939218AB0FFD000490CC /* comp.h */,
|
||||
DAEB939318AB0FFD000490CC /* conf.h */,
|
||||
DAEB939418AB0FFD000490CC /* conf_api.h */,
|
||||
DAEB939518AB0FFD000490CC /* crypto.h */,
|
||||
DAEB939618AB0FFD000490CC /* des.h */,
|
||||
DAEB939718AB0FFD000490CC /* des_old.h */,
|
||||
DAEB939818AB0FFD000490CC /* dh.h */,
|
||||
DAEB939918AB0FFD000490CC /* dsa.h */,
|
||||
DAEB939A18AB0FFD000490CC /* dso.h */,
|
||||
DAEB939B18AB0FFD000490CC /* dtls1.h */,
|
||||
DAEB939C18AB0FFD000490CC /* e_os2.h */,
|
||||
DAEB939D18AB0FFD000490CC /* ebcdic.h */,
|
||||
DAEB939E18AB0FFD000490CC /* ec.h */,
|
||||
DAEB939F18AB0FFD000490CC /* ecdh.h */,
|
||||
DAEB93A018AB0FFD000490CC /* ecdsa.h */,
|
||||
DAEB93A118AB0FFD000490CC /* engine.h */,
|
||||
DAEB93A218AB0FFD000490CC /* err.h */,
|
||||
DAEB93A318AB0FFD000490CC /* evp.h */,
|
||||
DAEB93A418AB0FFD000490CC /* hmac.h */,
|
||||
DAEB93A518AB0FFD000490CC /* idea.h */,
|
||||
DAEB93A618AB0FFD000490CC /* krb5_asn.h */,
|
||||
DAEB93A718AB0FFD000490CC /* kssl.h */,
|
||||
DAEB93A818AB0FFD000490CC /* lhash.h */,
|
||||
DAEB93A918AB0FFD000490CC /* md4.h */,
|
||||
DAEB93AA18AB0FFD000490CC /* md5.h */,
|
||||
DAEB93AB18AB0FFD000490CC /* mdc2.h */,
|
||||
DAEB93AC18AB0FFD000490CC /* modes.h */,
|
||||
DAEB93AD18AB0FFD000490CC /* obj_mac.h */,
|
||||
DAEB93AE18AB0FFD000490CC /* objects.h */,
|
||||
DAEB93AF18AB0FFD000490CC /* ocsp.h */,
|
||||
DAEB93B018AB0FFD000490CC /* opensslconf.h */,
|
||||
DAEB93B118AB0FFD000490CC /* opensslv.h */,
|
||||
DAEB93B218AB0FFD000490CC /* ossl_typ.h */,
|
||||
DAEB93B318AB0FFD000490CC /* pem.h */,
|
||||
DAEB93B418AB0FFD000490CC /* pem2.h */,
|
||||
DAEB93B518AB0FFD000490CC /* pkcs12.h */,
|
||||
DAEB93B618AB0FFD000490CC /* pkcs7.h */,
|
||||
DAEB93B718AB0FFD000490CC /* pqueue.h */,
|
||||
DAEB93B818AB0FFD000490CC /* rand.h */,
|
||||
DAEB93B918AB0FFD000490CC /* rc2.h */,
|
||||
DAEB93BA18AB0FFD000490CC /* rc4.h */,
|
||||
DAEB93BB18AB0FFD000490CC /* ripemd.h */,
|
||||
DAEB93BC18AB0FFD000490CC /* rsa.h */,
|
||||
DAEB93BD18AB0FFD000490CC /* safestack.h */,
|
||||
DAEB93BE18AB0FFD000490CC /* seed.h */,
|
||||
DAEB93BF18AB0FFD000490CC /* sha.h */,
|
||||
DAEB93C018AB0FFD000490CC /* ssl.h */,
|
||||
DAEB93C118AB0FFD000490CC /* ssl2.h */,
|
||||
DAEB93C218AB0FFD000490CC /* ssl23.h */,
|
||||
DAEB93C318AB0FFD000490CC /* ssl3.h */,
|
||||
DAEB93C418AB0FFD000490CC /* stack.h */,
|
||||
DAEB93C518AB0FFD000490CC /* symhacks.h */,
|
||||
DAEB93C618AB0FFD000490CC /* tls1.h */,
|
||||
DAEB93C718AB0FFD000490CC /* ts.h */,
|
||||
DAEB93C818AB0FFD000490CC /* txt_db.h */,
|
||||
DAEB93C918AB0FFD000490CC /* ui.h */,
|
||||
DAEB93CA18AB0FFD000490CC /* ui_compat.h */,
|
||||
DAEB93CB18AB0FFD000490CC /* whrlpool.h */,
|
||||
DAEB93CC18AB0FFD000490CC /* x509.h */,
|
||||
DAEB93CD18AB0FFD000490CC /* x509_vfy.h */,
|
||||
DAEB93CE18AB0FFD000490CC /* x509v3.h */,
|
||||
);
|
||||
path = openssl;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DAEB93CF18AB0FFD000490CC /* scrypt */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB93D018AB0FFD000490CC /* crypto_aesctr.h */,
|
||||
DAEB93D118AB0FFD000490CC /* crypto_scrypt.h */,
|
||||
DAEB93D218AB0FFD000490CC /* memlimit.h */,
|
||||
DAEB93D318AB0FFD000490CC /* readpass.h */,
|
||||
DAEB93D418AB0FFD000490CC /* scryptenc.h */,
|
||||
DAEB93D518AB0FFD000490CC /* scryptenc_cpuperf.h */,
|
||||
DAEB93D618AB0FFD000490CC /* sha256.h */,
|
||||
DAEB93D718AB0FFD000490CC /* sysendian.h */,
|
||||
DAEB93D818AB0FFD000490CC /* warn.h */,
|
||||
);
|
||||
path = scrypt;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DAFE45D715039823003ABA7C /* Pearl */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -2044,120 +1793,39 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DAEB941818AB0FFD000490CC /* tls1.h in Headers */,
|
||||
DAEB940C18AB0FFD000490CC /* rc4.h in Headers */,
|
||||
DAEB93F418AB0FFD000490CC /* err.h in Headers */,
|
||||
DAEB93F118AB0FFD000490CC /* ecdh.h in Headers */,
|
||||
DAEB93FD18AB0FFD000490CC /* mdc2.h in Headers */,
|
||||
DAEB942718AB0FFD000490CC /* sha256.h in Headers */,
|
||||
DAEB940818AB0FFD000490CC /* pkcs7.h in Headers */,
|
||||
DA2CA4F218D323D3007798F8 /* NSTimer+PearlBlock.h in Headers */,
|
||||
DAEB93DF18AB0FFD000490CC /* bn.h in Headers */,
|
||||
DAEB940718AB0FFD000490CC /* pkcs12.h in Headers */,
|
||||
DAEB941A18AB0FFD000490CC /* txt_db.h in Headers */,
|
||||
DAFE4A1315039824003ABA7C /* NSObject+PearlExport.h in Headers */,
|
||||
DAFE4A1515039824003ABA7C /* NSString+PearlNSArrayFormat.h in Headers */,
|
||||
DAEB942218AB0FFD000490CC /* crypto_scrypt.h in Headers */,
|
||||
DAEB941018AB0FFD000490CC /* seed.h in Headers */,
|
||||
DAEB942618AB0FFD000490CC /* scryptenc_cpuperf.h in Headers */,
|
||||
DAFE4A1715039824003ABA7C /* NSString+PearlSEL.h in Headers */,
|
||||
DA3B8453190FC86F00246EEA /* NSManagedObject+Pearl.h in Headers */,
|
||||
DAEB93F518AB0FFD000490CC /* evp.h in Headers */,
|
||||
DAEB941918AB0FFD000490CC /* ts.h in Headers */,
|
||||
DA8ED897192906920099B726 /* map-macro.h in Headers */,
|
||||
DAEB93F818AB0FFD000490CC /* krb5_asn.h in Headers */,
|
||||
DAFE4A1915039824003ABA7C /* Pearl.h in Headers */,
|
||||
DAEB93F318AB0FFD000490CC /* engine.h in Headers */,
|
||||
DAFE4A1A15039824003ABA7C /* PearlAbstractStrings.h in Headers */,
|
||||
DAFE4A1E15039824003ABA7C /* PearlCodeUtils.h in Headers */,
|
||||
DAEB940918AB0FFD000490CC /* pqueue.h in Headers */,
|
||||
DAFE4A2015039824003ABA7C /* PearlConfig.h in Headers */,
|
||||
DAEB941B18AB0FFD000490CC /* ui.h in Headers */,
|
||||
DAEB941D18AB0FFD000490CC /* whrlpool.h in Headers */,
|
||||
DAEB940418AB0FFD000490CC /* ossl_typ.h in Headers */,
|
||||
DAEB93DC18AB0FFD000490CC /* asn1t.h in Headers */,
|
||||
DAFE4A2215039824003ABA7C /* PearlDeviceUtils.h in Headers */,
|
||||
DA8ED896192906920099B726 /* PearlTween.h in Headers */,
|
||||
DAEB93E518AB0FFD000490CC /* conf.h in Headers */,
|
||||
DAFE4A2415039824003ABA7C /* PearlInfoPlist.h in Headers */,
|
||||
DAEB940618AB0FFD000490CC /* pem2.h in Headers */,
|
||||
DAFE4A2615039824003ABA7C /* PearlLogger.h in Headers */,
|
||||
DA2CA4F018D323D3007798F8 /* NSArray+Pearl.h in Headers */,
|
||||
DAEB93FC18AB0FFD000490CC /* md5.h in Headers */,
|
||||
DAFE4A2815039824003ABA7C /* PearlMathUtils.h in Headers */,
|
||||
DAFE4A2A15039824003ABA7C /* PearlObjectUtils.h in Headers */,
|
||||
DAEB93E318AB0FFD000490CC /* cms.h in Headers */,
|
||||
DAEB942518AB0FFD000490CC /* scryptenc.h in Headers */,
|
||||
DAEB93FA18AB0FFD000490CC /* lhash.h in Headers */,
|
||||
DAFE4A2C15039824003ABA7C /* PearlResettable.h in Headers */,
|
||||
DAEB940B18AB0FFD000490CC /* rc2.h in Headers */,
|
||||
DAFE4A2D15039824003ABA7C /* PearlStrings.h in Headers */,
|
||||
DAEB93DA18AB0FFD000490CC /* asn1.h in Headers */,
|
||||
DAEB93EA18AB0FFD000490CC /* dh.h in Headers */,
|
||||
DAEB93F918AB0FFD000490CC /* kssl.h in Headers */,
|
||||
DAFE4A2F15039824003ABA7C /* PearlStringUtils.h in Headers */,
|
||||
DAEB940318AB0FFD000490CC /* opensslv.h in Headers */,
|
||||
DAEB93ED18AB0FFD000490CC /* dtls1.h in Headers */,
|
||||
DAEB93E018AB0FFD000490CC /* buffer.h in Headers */,
|
||||
DAEB940218AB0FFD000490CC /* opensslconf.h in Headers */,
|
||||
DAEB93E918AB0FFD000490CC /* des_old.h in Headers */,
|
||||
DAFE4A3315039824003ABA7C /* Pearl-Crypto.h in Headers */,
|
||||
DAEB941C18AB0FFD000490CC /* ui_compat.h in Headers */,
|
||||
DAEB93E218AB0FFD000490CC /* cast.h in Headers */,
|
||||
DAEB942318AB0FFD000490CC /* memlimit.h in Headers */,
|
||||
DAFE4A3415039824003ABA7C /* PearlCryptUtils.h in Headers */,
|
||||
DAEB940018AB0FFD000490CC /* objects.h in Headers */,
|
||||
DAEB93E818AB0FFD000490CC /* des.h in Headers */,
|
||||
DAEB941418AB0FFD000490CC /* ssl23.h in Headers */,
|
||||
DAEB93EB18AB0FFD000490CC /* dsa.h in Headers */,
|
||||
DAEB941218AB0FFD000490CC /* ssl.h in Headers */,
|
||||
DAEB93FE18AB0FFD000490CC /* modes.h in Headers */,
|
||||
DAEB940A18AB0FFD000490CC /* rand.h in Headers */,
|
||||
DAEB93EE18AB0FFD000490CC /* e_os2.h in Headers */,
|
||||
DAEB940E18AB0FFD000490CC /* rsa.h in Headers */,
|
||||
DAEB93E618AB0FFD000490CC /* conf_api.h in Headers */,
|
||||
DAFE4A3615039824003ABA7C /* PearlKeyChain.h in Headers */,
|
||||
DAEB941518AB0FFD000490CC /* ssl3.h in Headers */,
|
||||
DAEB941618AB0FFD000490CC /* stack.h in Headers */,
|
||||
DAFE4A3815039824003ABA7C /* PearlRSAKey.h in Headers */,
|
||||
DAEB93DD18AB0FFD000490CC /* bio.h in Headers */,
|
||||
DAEB942418AB0FFD000490CC /* readpass.h in Headers */,
|
||||
DAEB93F018AB0FFD000490CC /* ec.h in Headers */,
|
||||
DAEB93E418AB0FFD000490CC /* comp.h in Headers */,
|
||||
DAFE4A3A15039824003ABA7C /* PearlSCrypt.h in Headers */,
|
||||
DAEB93D918AB0FFD000490CC /* aes.h in Headers */,
|
||||
DA30E9CE15722ECA00A68B4C /* NSBundle+PearlMutableInfo.h in Headers */,
|
||||
DAEB93FB18AB0FFD000490CC /* md4.h in Headers */,
|
||||
DAEB941118AB0FFD000490CC /* sha.h in Headers */,
|
||||
DAEB941F18AB0FFD000490CC /* x509_vfy.h in Headers */,
|
||||
DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */,
|
||||
DAEB93EC18AB0FFD000490CC /* dso.h in Headers */,
|
||||
DAEB940118AB0FFD000490CC /* ocsp.h in Headers */,
|
||||
DAFE4A63150399FF003ABA88 /* NSObject+PearlKVO.h in Headers */,
|
||||
DAFE4A63150399FF003ABA94 /* NSDateFormatter+RFC3339.h in Headers */,
|
||||
DAEB93F718AB0FFD000490CC /* idea.h in Headers */,
|
||||
DAEB940F18AB0FFD000490CC /* safestack.h in Headers */,
|
||||
DAEB941E18AB0FFD000490CC /* x509.h in Headers */,
|
||||
DAEB93EF18AB0FFD000490CC /* ebcdic.h in Headers */,
|
||||
DAEB93DE18AB0FFD000490CC /* blowfish.h in Headers */,
|
||||
DAEB941718AB0FFD000490CC /* symhacks.h in Headers */,
|
||||
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */,
|
||||
DAEB942118AB0FFD000490CC /* crypto_aesctr.h in Headers */,
|
||||
DAEB93F218AB0FFD000490CC /* ecdsa.h in Headers */,
|
||||
DAEB942018AB0FFD000490CC /* x509v3.h in Headers */,
|
||||
DAEB93E118AB0FFD000490CC /* camellia.h in Headers */,
|
||||
DAEB93F618AB0FFD000490CC /* hmac.h in Headers */,
|
||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */,
|
||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
||||
DAEB942918AB0FFD000490CC /* warn.h in Headers */,
|
||||
DAEB93DB18AB0FFD000490CC /* asn1_mac.h in Headers */,
|
||||
DAEB940518AB0FFD000490CC /* pem.h in Headers */,
|
||||
DAEB942818AB0FFD000490CC /* sysendian.h in Headers */,
|
||||
DA2CA4EE18D323D3007798F8 /* NSError+PearlFullDescription.h in Headers */,
|
||||
DAEB93FF18AB0FFD000490CC /* obj_mac.h in Headers */,
|
||||
DAEB93E718AB0FFD000490CC /* crypto.h in Headers */,
|
||||
DAEB941318AB0FFD000490CC /* ssl2.h in Headers */,
|
||||
DAEB940D18AB0FFD000490CC /* ripemd.h in Headers */,
|
||||
93D39D304F73B3BBA031522A /* PearlProfiler.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@ -2789,6 +2457,10 @@
|
||||
);
|
||||
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
|
||||
INFOPLIST_FILE = "MasterPassword-Info.plist";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
PROVISIONING_PROFILE = "0FAB9494-7BD5-4638-9B60-66DED5D23B9A";
|
||||
SKIP_INSTALL = NO;
|
||||
WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}";
|
||||
@ -2808,6 +2480,10 @@
|
||||
);
|
||||
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
|
||||
INFOPLIST_FILE = "MasterPassword-Info.plist";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
PROVISIONING_PROFILE = "0FAB9494-7BD5-4638-9B60-66DED5D23B9A";
|
||||
SKIP_INSTALL = NO;
|
||||
WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}";
|
||||
@ -2906,6 +2582,10 @@
|
||||
);
|
||||
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
|
||||
INFOPLIST_FILE = "MasterPassword-Info.plist";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
PROVISIONING_PROFILE = "16F3EA2E-5241-42F7-8F39-125ED9FCD536";
|
||||
SKIP_INSTALL = NO;
|
||||
WRAPPER_NAME = "Master Password.${WRAPPER_EXTENSION}";
|
||||
@ -2922,6 +2602,7 @@
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto\"",
|
||||
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto/lib\"",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@ -2993,6 +2674,7 @@
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto\"",
|
||||
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto/lib\"",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@ -3010,6 +2692,7 @@
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto\"",
|
||||
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto/lib\"",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?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>
|
||||
<deployment version="1070" defaultVersion="1080" identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
|
||||
@ -24,7 +24,6 @@
|
||||
<outlet property="savePasswordItem" destination="747" id="751"/>
|
||||
<outlet property="showItem" destination="719" id="783"/>
|
||||
<outlet property="statusMenu" destination="716" id="731"/>
|
||||
<outlet property="useCloudItem" destination="743" id="749"/>
|
||||
<outlet property="usersItem" destination="755" id="762"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
@ -55,23 +54,6 @@
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Preferences" autoenablesItems="NO" id="742">
|
||||
<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">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
@ -199,47 +181,6 @@
|
||||
<action selector="importSites:" target="494" id="CNv-4j-036"/>
|
||||
</connections>
|
||||
</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>
|
||||
</menu>
|
||||
</menuItem>
|
||||
|
@ -17,7 +17,6 @@
|
||||
//
|
||||
|
||||
#import "MPAvatarCell.h"
|
||||
#import "MPPasswordLargeCell.h"
|
||||
|
||||
const long MPAvatarAdd = 10000;
|
||||
|
||||
@ -207,10 +206,10 @@ const long MPAvatarAdd = 10000;
|
||||
|
||||
switch (self.mode) {
|
||||
case MPAvatarModeLowered: {
|
||||
[self.avatarSizeConstraint layoutWithConstant:self.avatarImageView.image.size.height];
|
||||
[self.avatarRaisedConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[self.avatarToTopConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[self.nameToCenterConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height] layoutIfNeeded];
|
||||
[[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
[[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
[[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
self.nameContainer.alpha = self.visibility;
|
||||
self.nameContainer.backgroundColor = [UIColor clearColor];
|
||||
self.avatarImageView.alpha = self.visibility / 0.7f + 0.3f;
|
||||
@ -218,10 +217,10 @@ const long MPAvatarAdd = 10000;
|
||||
break;
|
||||
}
|
||||
case MPAvatarModeRaisedButInactive: {
|
||||
[self.avatarSizeConstraint layoutWithConstant:self.avatarImageView.image.size.height];
|
||||
[self.avatarRaisedConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[self.avatarToTopConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[self.nameToCenterConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height] layoutIfNeeded];
|
||||
[[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
[[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
[[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
self.nameContainer.alpha = self.visibility;
|
||||
self.nameContainer.backgroundColor = [UIColor clearColor];
|
||||
self.avatarImageView.alpha = 0;
|
||||
@ -229,10 +228,10 @@ const long MPAvatarAdd = 10000;
|
||||
break;
|
||||
}
|
||||
case MPAvatarModeRaisedAndActive: {
|
||||
[self.avatarSizeConstraint layoutWithConstant:self.avatarImageView.image.size.height];
|
||||
[self.avatarRaisedConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[self.avatarToTopConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[self.nameToCenterConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height] layoutIfNeeded];
|
||||
[[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
[[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
[[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
self.nameContainer.alpha = self.visibility;
|
||||
self.nameContainer.backgroundColor = [UIColor blackColor];
|
||||
self.avatarImageView.alpha = 1;
|
||||
@ -240,10 +239,10 @@ const long MPAvatarAdd = 10000;
|
||||
break;
|
||||
}
|
||||
case MPAvatarModeRaisedAndHidden: {
|
||||
[self.avatarSizeConstraint layoutWithConstant:self.avatarImageView.image.size.height];
|
||||
[self.avatarRaisedConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[self.avatarToTopConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[self.nameToCenterConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height] layoutIfNeeded];
|
||||
[[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
[[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
[[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
self.nameContainer.alpha = 0;
|
||||
self.nameContainer.backgroundColor = [UIColor blackColor];
|
||||
self.avatarImageView.alpha = 0;
|
||||
@ -251,10 +250,10 @@ const long MPAvatarAdd = 10000;
|
||||
break;
|
||||
}
|
||||
case MPAvatarModeRaisedAndMinimized: {
|
||||
[self.avatarSizeConstraint layoutWithConstant:36];
|
||||
[self.avatarRaisedConstraint layoutWithPriority:UILayoutPriorityDefaultLow];
|
||||
[self.avatarToTopConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[self.nameToCenterConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[[self.avatarSizeConstraint updateConstant:36] layoutIfNeeded];
|
||||
[[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultLow] layoutIfNeeded];
|
||||
[[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
[[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
self.nameContainer.alpha = 0;
|
||||
self.nameContainer.backgroundColor = [UIColor blackColor];
|
||||
self.avatarImageView.alpha = 1;
|
||||
|
@ -20,9 +20,15 @@
|
||||
#import "MPEntities.h"
|
||||
#import "MPCell.h"
|
||||
|
||||
@interface MPPasswordCell : MPCell
|
||||
typedef NS_ENUM ( NSUInteger, MPPasswordCellMode ) {
|
||||
MPPasswordCellModePassword,
|
||||
MPPasswordCellModeSettings,
|
||||
};
|
||||
|
||||
/** Populate our UI to reflect the current state. */
|
||||
- (void)updateAnimated:(BOOL)animated;
|
||||
@interface MPPasswordCell : MPCell <UIScrollViewDelegate, UITextFieldDelegate>
|
||||
|
||||
- (void)setElement:(MPElementEntity *)element animated:(BOOL)animated;
|
||||
- (void)setTransientSite:(NSString *)siteName animated:(BOOL)animated;
|
||||
- (void)setMode:(MPPasswordCellMode)mode animated:(BOOL)animated;
|
||||
|
||||
@end
|
||||
|
@ -1,12 +1,12 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPAvatarCell.h
|
||||
@ -20,40 +20,336 @@
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
|
||||
@implementation MPPasswordCell
|
||||
@interface MPPasswordCell()
|
||||
|
||||
@property(nonatomic, strong) IBOutlet UILabel *siteNameLabel;
|
||||
@property(nonatomic, strong) IBOutlet UITextField *passwordField;
|
||||
@property(nonatomic, strong) IBOutlet UITextField *loginNameField;
|
||||
@property(nonatomic, strong) IBOutlet UIPageControl *pageControl;
|
||||
@property(nonatomic, strong) IBOutlet UILabel *strengthLabel;
|
||||
@property(nonatomic, strong) IBOutlet UILabel *counterLabel;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *counterButton;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *upgradeButton;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *modeButton;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *loginModeButton;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *editButton;
|
||||
@property(nonatomic, strong) IBOutlet UIScrollView *modeScrollView;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *selectionButton;
|
||||
|
||||
@property(nonatomic) MPPasswordCellMode mode;
|
||||
@property(nonatomic, copy) NSString *transientSite;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPPasswordCell {
|
||||
NSManagedObjectID *_elementOID;
|
||||
}
|
||||
|
||||
#pragma mark - Life cycle
|
||||
|
||||
- (void)awakeFromNib {
|
||||
|
||||
[super awakeFromNib];
|
||||
|
||||
[self addGestureRecognizer:
|
||||
[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector( doRevealPassword: )]];
|
||||
[self.counterButton addGestureRecognizer:
|
||||
[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector( doResetCounter: )]];
|
||||
|
||||
self.selectionButton.layer.cornerRadius = 5;
|
||||
self.selectionButton.layer.shadowOffset = CGSizeZero;
|
||||
self.selectionButton.layer.shadowRadius = 5;
|
||||
self.selectionButton.layer.shadowOpacity = 0;
|
||||
self.selectionButton.layer.shadowColor = [UIColor whiteColor].CGColor;
|
||||
|
||||
self.pageControl.transform = CGAffineTransformMakeScale( 0.4f, 0.4f );
|
||||
|
||||
[self.selectionButton observeKeyPath:@"highlighted"
|
||||
withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) {
|
||||
button.layer.shadowOpacity = button.selected? 1: button.highlighted? 0.3f: 0;
|
||||
}];
|
||||
[self.selectionButton observeKeyPath:@"selected"
|
||||
withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) {
|
||||
button.layer.shadowOpacity = button.selected? 1: button.highlighted? 0.3f: 0;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)prepareForReuse {
|
||||
|
||||
[super prepareForReuse];
|
||||
|
||||
_elementOID = nil;
|
||||
self.loginModeButton.selected = NO;
|
||||
self.mode = MPPasswordCellModePassword;
|
||||
[self updateAnimated:NO];
|
||||
}
|
||||
|
||||
// Unblocks animations for all CALayer properties (eg. shadowOpacity)
|
||||
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event {
|
||||
#pragma mark - State
|
||||
|
||||
id<CAAction> defaultAction = [super actionForLayer:layer forKey:event];
|
||||
if (defaultAction == (id)[NSNull null] && [event isEqualToString:@"position"])
|
||||
return defaultAction;
|
||||
- (void)setMode:(MPPasswordCellMode)mode animated:(BOOL)animated {
|
||||
|
||||
return NSNullToNil(defaultAction);
|
||||
if (mode == _mode)
|
||||
return;
|
||||
|
||||
_mode = mode;
|
||||
[self updateAnimated:animated];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
- (void)setElement:(MPElementEntity *)element animated:(BOOL)animated {
|
||||
|
||||
- (void)setSelected:(BOOL)selected {
|
||||
_elementOID = [element objectID];
|
||||
[self updateAnimated:animated];
|
||||
}
|
||||
|
||||
[super setSelected:selected];
|
||||
- (void)setTransientSite:(NSString *)siteName animated:(BOOL)animated {
|
||||
|
||||
self.transientSite = siteName;
|
||||
[self updateAnimated:animated];
|
||||
}
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
|
||||
[textField resignFirstResponder];
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)textFieldDidBeginEditing:(UITextField *)textField {
|
||||
|
||||
UICollectionView *collectionView = [UICollectionView findAsSuperviewOf:self];
|
||||
[collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self]
|
||||
atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
|
||||
}
|
||||
|
||||
- (IBAction)textFieldDidChange:(UITextField *)textField {
|
||||
|
||||
if (textField == self.passwordField) {
|
||||
NSString *password = self.passwordField.text;
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
TimeToCrack timeToCrack;
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
id<MPAlgorithm> algorithm = element.algorithm?: MPAlgorithmDefault;
|
||||
MPAttacker attackHardware = [[MPConfig get].siteAttacker unsignedIntegerValue];
|
||||
if ([algorithm timeToCrack:&timeToCrack passwordOfType:[self elementInContext:context].type byAttacker:attackHardware] ||
|
||||
[algorithm timeToCrack:&timeToCrack passwordString:password byAttacker:attackHardware])
|
||||
PearlMainQueue( ^{
|
||||
self.strengthLabel.text = NSStringFromTimeToCrack( timeToCrack );
|
||||
} );
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
||||
|
||||
if (textField == self.passwordField || textField == self.loginNameField) {
|
||||
NSString *text = textField.text;
|
||||
textField.enabled = NO;
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
if (!element)
|
||||
return;
|
||||
|
||||
if (textField == self.passwordField) {
|
||||
[element.algorithm saveContent:text toElement:element usingKey:[MPiOSAppDelegate get].key];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Password Updated" dismissAfter:2];
|
||||
}
|
||||
else if (textField == self.loginNameField) {
|
||||
element.loginName = text;
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Login Updated" dismissAfter:2];
|
||||
}
|
||||
|
||||
[context saveToStore];
|
||||
[self updateAnimated:YES];
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)doLoginMode:(UIButton *)sender {
|
||||
|
||||
self.loginModeButton.selected = !self.loginModeButton.selected;
|
||||
[self updateAnimated:YES];
|
||||
}
|
||||
|
||||
- (IBAction)doDelete:(UIButton *)sender {
|
||||
|
||||
MPElementEntity *element = [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]];
|
||||
if (!element)
|
||||
return;
|
||||
|
||||
[PearlSheet showSheetWithTitle:strf( @"Delete %@?", element.name ) viewStyle:UIActionSheetStyleAutomatic
|
||||
initSheet:nil tappedButtonBlock:^(UIActionSheet *sheet, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [sheet cancelButtonIndex])
|
||||
return;
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
[context deleteObject:[self elementInContext:context]];
|
||||
[context saveToStore];
|
||||
}];
|
||||
} cancelTitle:@"Cancel" destructiveTitle:@"Delete Site" otherTitles:nil];
|
||||
}
|
||||
|
||||
- (IBAction)doChangeType:(UIButton *)sender {
|
||||
|
||||
[self setMode:MPPasswordCellModePassword animated:YES];
|
||||
|
||||
[PearlSheet showSheetWithTitle:@"Change Password Type" viewStyle:UIActionSheetStyleAutomatic
|
||||
initSheet:^(UIActionSheet *sheet) {
|
||||
MPElementEntity *mainElement = [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]];
|
||||
for (NSNumber *typeNumber in [MPAlgorithmDefault allTypes]) {
|
||||
MPElementType type = [typeNumber unsignedIntegerValue];
|
||||
NSString *typeName = [MPAlgorithmDefault nameOfType:type];
|
||||
if (type == mainElement.type)
|
||||
[sheet addButtonWithTitle:strf( @"● %@", typeName )];
|
||||
else
|
||||
[sheet addButtonWithTitle:typeName];
|
||||
}
|
||||
} tappedButtonBlock:^(UIActionSheet *sheet, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [sheet cancelButtonIndex])
|
||||
return;
|
||||
|
||||
MPElementType type = [[MPAlgorithmDefault allTypes][buttonIndex] unsignedIntegerValue]?: MPElementTypeGeneratedLong;
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
element = [[MPiOSAppDelegate get] changeElement:element saveInContext:context toType:type];
|
||||
[self setElement:element animated:YES];
|
||||
}];
|
||||
} cancelTitle:@"Cancel" destructiveTitle:nil otherTitles:nil];
|
||||
}
|
||||
|
||||
- (IBAction)doEdit:(UIButton *)sender {
|
||||
|
||||
if (self.loginModeButton.selected) {
|
||||
self.loginNameField.enabled = YES;
|
||||
[self.loginNameField becomeFirstResponder];
|
||||
}
|
||||
else if ([self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]].type & MPElementTypeClassStored) {
|
||||
self.passwordField.enabled = YES;
|
||||
[self.passwordField becomeFirstResponder];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)doMode:(UIButton *)sender {
|
||||
|
||||
switch (self.mode) {
|
||||
case MPPasswordCellModePassword:
|
||||
[self setMode:MPPasswordCellModeSettings animated:YES];
|
||||
break;
|
||||
case MPPasswordCellModeSettings:
|
||||
[self setMode:MPPasswordCellModePassword animated:YES];
|
||||
break;
|
||||
}
|
||||
|
||||
[self updateAnimated:YES];
|
||||
}
|
||||
|
||||
- (void)setHighlighted:(BOOL)highlighted {
|
||||
- (IBAction)doUpgrade:(UIButton *)sender {
|
||||
|
||||
[super setHighlighted:highlighted];
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
if (![[self elementInContext:context] migrateExplicitly:YES]) {
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Couldn't Upgrade Site" dismissAfter:2];
|
||||
return;
|
||||
}
|
||||
|
||||
[self updateAnimated:YES];
|
||||
[context saveToStore];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Site Upgraded" dismissAfter:2];
|
||||
[self updateAnimated:YES];
|
||||
}];
|
||||
}
|
||||
|
||||
- (IBAction)doIncrementCounter:(UIButton *)sender {
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
if (!element || ![element isKindOfClass:[MPElementGeneratedEntity class]])
|
||||
return;
|
||||
|
||||
++((MPElementGeneratedEntity *)element).counter;
|
||||
[context saveToStore];
|
||||
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Generating New Password" dismissAfter:2];
|
||||
[self updateAnimated:YES];
|
||||
}];
|
||||
}
|
||||
|
||||
- (IBAction)doRevealPassword:(UILongPressGestureRecognizer *)recognizer {
|
||||
|
||||
if (recognizer.state != UIGestureRecognizerStateBegan)
|
||||
return;
|
||||
|
||||
if (self.passwordField.secureTextEntry) {
|
||||
self.passwordField.secureTextEntry = NO;
|
||||
|
||||
PearlMainQueueAfter( 3, ^{
|
||||
self.passwordField.secureTextEntry = [[MPiOSConfig get].hidePasswords boolValue];
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)doResetCounter:(UILongPressGestureRecognizer *)recognizer {
|
||||
|
||||
if (recognizer.state != UIGestureRecognizerStateBegan)
|
||||
return;
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
if (!element || ![element isKindOfClass:[MPElementGeneratedEntity class]])
|
||||
return;
|
||||
|
||||
((MPElementGeneratedEntity *)element).counter = 1;
|
||||
[context saveToStore];
|
||||
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Counter Reset" dismissAfter:2];
|
||||
[self updateAnimated:YES];
|
||||
}];
|
||||
}
|
||||
|
||||
- (IBAction)doUse:(id)sender {
|
||||
|
||||
self.selectionButton.selected = YES;
|
||||
|
||||
if (self.transientSite) {
|
||||
[[UIResponder findFirstResponder] resignFirstResponder];
|
||||
[PearlAlert showAlertWithTitle:@"Create Site"
|
||||
message:strf( @"Remember site named:\n%@", self.transientSite )
|
||||
viewStyle:UIAlertViewStyleDefault
|
||||
initAlert:nil tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [alert cancelButtonIndex]) {
|
||||
self.selectionButton.selected = NO;
|
||||
return;
|
||||
}
|
||||
|
||||
[[MPiOSAppDelegate get]
|
||||
addElementNamed:self.transientSite completion:^(MPElementEntity *element, NSManagedObjectContext *context) {
|
||||
[self copyContentOfElement:element saveInContext:context];
|
||||
PearlMainQueue( ^{
|
||||
self.selectionButton.selected = NO;
|
||||
} );
|
||||
}];
|
||||
} cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonYes, nil];
|
||||
return;
|
||||
}
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
[self copyContentOfElement:[self elementInContext:context] saveInContext:context];
|
||||
PearlMainQueue( ^{
|
||||
self.selectionButton.selected = NO;
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - UIScrollViewDelegate
|
||||
|
||||
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
|
||||
|
||||
if (roundf( (float)(scrollView.contentOffset.x / self.bounds.size.width) ) == 0.0f)
|
||||
[self setMode:MPPasswordCellModePassword animated:YES];
|
||||
else
|
||||
[self setMode:MPPasswordCellModeSettings animated:YES];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
@ -68,8 +364,107 @@
|
||||
}
|
||||
|
||||
[UIView animateWithDuration:animated? 0.3f: 0 animations:^{
|
||||
self.layer.shadowOpacity = self.selected? 1: self.highlighted? 0.3f: 0;
|
||||
MPElementEntity *mainElement = [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]];
|
||||
|
||||
// UI
|
||||
self.selectionButton.layer.shadowOpacity = self.selectionButton.selected? 1: self.selectionButton.highlighted? 0.3f: 0;
|
||||
self.upgradeButton.alpha = mainElement.requiresExplicitMigration? 1: 0;
|
||||
self.passwordField.alpha = self.loginModeButton.selected? 0: 1;
|
||||
self.loginNameField.alpha = self.loginModeButton.selected? 1: 0;
|
||||
self.modeButton.alpha = self.transientSite? 0: 1;
|
||||
self.counterLabel.alpha = self.counterButton.alpha = mainElement.type & MPElementTypeClassGenerated? 1: 0;
|
||||
self.modeButton.selected = self.mode == MPPasswordCellModeSettings;
|
||||
self.pageControl.currentPage = self.mode == MPPasswordCellModePassword? 0: 1;
|
||||
self.strengthLabel.alpha = self.mode == MPPasswordCellModePassword? 0: 1;
|
||||
self.editButton.enabled = self.loginModeButton.selected || mainElement.type & MPElementTypeClassStored;
|
||||
[self.modeScrollView setContentOffset:CGPointMake( self.mode * self.modeScrollView.frame.size.width, 0 ) animated:animated];
|
||||
|
||||
// Site Name
|
||||
self.siteNameLabel.text = strl( @"%@ - %@", self.transientSite?: mainElement.name,
|
||||
self.transientSite? @"Tap to create": [mainElement.algorithm shortNameOfType:mainElement.type] );
|
||||
|
||||
// Site Password
|
||||
self.passwordField.enabled = NO;
|
||||
self.passwordField.secureTextEntry = [[MPiOSConfig get].hidePasswords boolValue];
|
||||
self.passwordField.attributedPlaceholder = stra(
|
||||
mainElement.type & MPElementTypeClassStored? strl( @"No password" ):
|
||||
mainElement.type & MPElementTypeClassGenerated? strl( @"..." ): @"", @{
|
||||
NSForegroundColorAttributeName : [UIColor whiteColor]
|
||||
} );
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
NSString *password;
|
||||
if (self.transientSite)
|
||||
password = [MPAlgorithmDefault generateContentNamed:self.transientSite ofType:
|
||||
[[MPiOSAppDelegate get] activeUserInContext:context].defaultType?: MPElementTypeGeneratedLong
|
||||
withCounter:1 usingKey:[MPiOSAppDelegate get].key];
|
||||
else
|
||||
password = [[self elementInContext:context] resolveContentUsingKey:[MPiOSAppDelegate get].key];
|
||||
|
||||
TimeToCrack timeToCrack;
|
||||
NSString *timeToCrackString = nil;
|
||||
id<MPAlgorithm> algorithm = mainElement.algorithm?: MPAlgorithmDefault;
|
||||
MPAttacker attackHardware = [[MPConfig get].siteAttacker unsignedIntegerValue];
|
||||
if ([algorithm timeToCrack:&timeToCrack passwordOfType:[self elementInContext:context].type byAttacker:attackHardware] ||
|
||||
[algorithm timeToCrack:&timeToCrack passwordString:password byAttacker:attackHardware])
|
||||
timeToCrackString = NSStringFromTimeToCrack( timeToCrack );
|
||||
|
||||
PearlMainQueue( ^{
|
||||
self.passwordField.text = password;
|
||||
self.strengthLabel.text = timeToCrackString;
|
||||
} );
|
||||
}];
|
||||
|
||||
// Site Counter
|
||||
if ([mainElement isKindOfClass:[MPElementGeneratedEntity class]])
|
||||
self.counterLabel.text = strf( @"%lu", (unsigned long)((MPElementGeneratedEntity *)mainElement).counter );
|
||||
|
||||
// Site Login Name
|
||||
self.loginNameField.enabled = NO;
|
||||
self.loginNameField.text = mainElement.loginName;
|
||||
self.loginNameField.attributedPlaceholder = stra( strl( @"Set login name" ), @{
|
||||
NSForegroundColorAttributeName : [UIColor whiteColor]
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)copyContentOfElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
// Copy content.
|
||||
if (self.loginModeButton.selected) {
|
||||
// Login Mode
|
||||
inf( @"Copying login for: %@", element.name );
|
||||
NSString *loginName = element.loginName;
|
||||
if (![loginName length])
|
||||
return;
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:strl( @"Login Name Copied" ) dismissAfter:2];
|
||||
[UIPasteboard generalPasteboard].string = loginName;
|
||||
} );
|
||||
|
||||
[element use];
|
||||
[context saveToStore];
|
||||
}
|
||||
else {
|
||||
// Password Mode
|
||||
inf( @"Copying password for: %@", element.name );
|
||||
NSString *password = [element resolveContentUsingKey:[MPAppDelegate_Shared get].key];
|
||||
if (![password length])
|
||||
return;
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:strl( @"Password Copied" ) dismissAfter:2];
|
||||
[UIPasteboard generalPasteboard].string = password;
|
||||
} );
|
||||
|
||||
[element use];
|
||||
[context saveToStore];
|
||||
}
|
||||
}
|
||||
|
||||
- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [MPElementEntity existingObjectWithID:_elementOID inContext:context];
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -1,51 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPAvatarCell.h
|
||||
// MPAvatarCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-11.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MPEntities.h"
|
||||
#import "MPCell.h"
|
||||
#import "MPPasswordCell.h"
|
||||
|
||||
typedef NS_ENUM (NSUInteger, MPContentFieldMode) {
|
||||
MPContentFieldModePassword,
|
||||
MPContentFieldModeUser,
|
||||
};
|
||||
|
||||
@interface MPPasswordLargeCell : MPPasswordCell <UITextFieldDelegate>
|
||||
|
||||
@property(nonatomic) MPElementType type;
|
||||
@property(nonatomic) MPContentFieldMode contentFieldMode;
|
||||
@property(nonatomic, strong) IBOutlet UILabel *typeLabel;
|
||||
@property(nonatomic, strong) IBOutlet UITextField *contentField;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *upgradeButton;
|
||||
@property(nonatomic, strong) IBOutlet UILabel *nameLabel;
|
||||
@property(nonatomic, strong) IBOutlet UIButton *loginButton;
|
||||
|
||||
+ (instancetype)dequeueCellWithType:(MPElementType)type fromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath;
|
||||
|
||||
- (void)update;
|
||||
- (void)updateWithElement:(MPElementEntity *)mainElement;
|
||||
- (void)updateWithTransientSite:(NSString *)siteName;
|
||||
|
||||
- (void)resolveContentOfCellTypeForTransientSite:(NSString *)siteName usingKey:(MPKey *)key result:(void (^)(NSString *result))resultBlock;
|
||||
- (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void (^)(NSString *result))resultBlock;
|
||||
|
||||
- (void)willBeginDragging;
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context;
|
||||
|
||||
@end
|
@ -1,271 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPAvatarCell.h
|
||||
// MPAvatarCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-11.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPasswordLargeCell.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPPasswordLargeGeneratedCell.h"
|
||||
#import "MPPasswordLargeStoredCell.h"
|
||||
#import "MPPasswordTypesCell.h"
|
||||
|
||||
@implementation MPPasswordLargeCell
|
||||
|
||||
#pragma mark - Life
|
||||
|
||||
+ (instancetype)dequeueCellWithType:(MPElementType)type fromCollectionView:(UICollectionView *)collectionView
|
||||
atIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
NSAssert( type != 0 && type != (MPElementType)NSNotFound, @"Cannot dequeue a password cell without a type." );
|
||||
|
||||
NSString *reuseIdentifier;
|
||||
if (type & MPElementTypeClassGenerated)
|
||||
reuseIdentifier = NSStringFromClass( [MPPasswordLargeGeneratedCell class] );
|
||||
else if (type & MPElementTypeClassStored)
|
||||
reuseIdentifier = NSStringFromClass( [MPPasswordLargeStoredCell class] );
|
||||
else
|
||||
Throw( @"Unexpected password type: %@", [MPAlgorithmDefault nameOfType:type] );
|
||||
|
||||
MPPasswordLargeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
|
||||
cell.type = type;
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (void)awakeFromNib {
|
||||
|
||||
[super awakeFromNib];
|
||||
|
||||
self.layer.cornerRadius = 5;
|
||||
self.layer.shadowOffset = CGSizeZero;
|
||||
self.layer.shadowRadius = 5;
|
||||
self.layer.shadowOpacity = 0;
|
||||
self.layer.shadowColor = [UIColor whiteColor].CGColor;
|
||||
|
||||
[self addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector( didLongPress: )]];
|
||||
|
||||
[self prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)didLongPress:(UILongPressGestureRecognizer *)recognizer {
|
||||
|
||||
if (recognizer.state != UIGestureRecognizerStateBegan)
|
||||
return;
|
||||
|
||||
if (self.contentField.secureTextEntry) {
|
||||
self.contentField.secureTextEntry = NO;
|
||||
PearlMainQueueAfter( 3, ^{
|
||||
self.contentField.secureTextEntry = [[MPiOSConfig get].hidePasswords boolValue];
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
- (void)prepareForReuse {
|
||||
|
||||
_contentFieldMode = 0;
|
||||
self.contentField.text = nil;
|
||||
|
||||
[super prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)update {
|
||||
|
||||
self.loginButton.alpha = 0;
|
||||
self.upgradeButton.alpha = 0;
|
||||
self.nameLabel.text = @"";
|
||||
self.typeLabel.text = @"";
|
||||
self.contentField.text = @"";
|
||||
self.contentField.secureTextEntry = [[MPiOSConfig get].hidePasswords boolValue];
|
||||
self.contentField.attributedPlaceholder = nil;
|
||||
self.contentField.enabled = self.contentFieldMode == MPContentFieldModeUser;
|
||||
self.loginButton.selected = self.contentFieldMode == MPContentFieldModeUser;
|
||||
|
||||
switch (self.contentFieldMode) {
|
||||
case MPContentFieldModePassword: {
|
||||
self.contentField.keyboardType = UIKeyboardTypeDefault;
|
||||
if (self.type & MPElementTypeClassStored)
|
||||
self.contentField.attributedPlaceholder = stra( strl( @"Set custom password" ), @{
|
||||
NSForegroundColorAttributeName : [UIColor whiteColor]
|
||||
} );
|
||||
else if (self.type & MPElementTypeClassGenerated)
|
||||
self.contentField.attributedPlaceholder = stra( strl( @"Generating..." ), @{
|
||||
NSForegroundColorAttributeName : [UIColor whiteColor]
|
||||
} );
|
||||
break;
|
||||
}
|
||||
case MPContentFieldModeUser: {
|
||||
self.contentField.keyboardType = UIKeyboardTypeEmailAddress;
|
||||
self.contentField.attributedPlaceholder = stra( strl( @"Enter your login name" ), @{
|
||||
NSForegroundColorAttributeName : [UIColor whiteColor]
|
||||
} );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)updateWithTransientSite:(NSString *)siteName {
|
||||
|
||||
[self update];
|
||||
|
||||
self.nameLabel.text = strl( @"%@ - Tap to create", siteName );
|
||||
self.typeLabel.text = [MPAlgorithmDefault nameOfType:self.type];
|
||||
|
||||
[self resolveContentOfCellTypeForTransientSite:siteName usingKey:[MPiOSAppDelegate get].key result:^(NSString *result) {
|
||||
PearlMainQueue( ^{ self.contentField.text = result; } );
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)updateWithElement:(MPElementEntity *)mainElement {
|
||||
|
||||
[self update];
|
||||
|
||||
if (!mainElement)
|
||||
return;
|
||||
|
||||
self.loginButton.alpha = 1;
|
||||
if (mainElement.requiresExplicitMigration)
|
||||
self.upgradeButton.alpha = 1;
|
||||
|
||||
self.nameLabel.text = mainElement.name;
|
||||
if (self.type == (MPElementType)NSNotFound)
|
||||
self.typeLabel.text = @"Delete";
|
||||
else
|
||||
self.typeLabel.text = [mainElement.algorithm nameOfType:self.type];
|
||||
|
||||
switch (self.contentFieldMode) {
|
||||
case MPContentFieldModePassword: {
|
||||
MPKey *key = [MPiOSAppDelegate get].key;
|
||||
if (self.type == mainElement.type)
|
||||
[mainElement resolveContentUsingKey:key result:^(NSString *result) {
|
||||
PearlMainQueue( ^{ self.contentField.text = result; } );
|
||||
}];
|
||||
else
|
||||
[self resolveContentOfCellTypeForElement:mainElement usingKey:key result:^(NSString *result) {
|
||||
PearlMainQueue( ^{ self.contentField.text = result; } );
|
||||
}];
|
||||
break;
|
||||
}
|
||||
case MPContentFieldModeUser: {
|
||||
self.contentField.text = mainElement.loginName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForTransientSite:(NSString *)siteName usingKey:(MPKey *)key result:(void ( ^ )(NSString *))resultBlock {
|
||||
|
||||
resultBlock( nil );
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void ( ^ )(NSString *))resultBlock {
|
||||
|
||||
resultBlock( nil );
|
||||
}
|
||||
|
||||
- (void)willBeginDragging {
|
||||
}
|
||||
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [[MPiOSAppDelegate get] changeElement:element saveInContext:context toType:self.type];
|
||||
}
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
|
||||
[textField resignFirstResponder];
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)textFieldDidBeginEditing:(UITextField *)textField {
|
||||
|
||||
UICollectionView *collectionView = [UICollectionView findAsSuperviewOf:self];
|
||||
[collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self]
|
||||
atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
|
||||
}
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
||||
|
||||
if (textField == self.contentField) {
|
||||
NSString *newContent = textField.text;
|
||||
textField.enabled = NO;
|
||||
|
||||
if (self.contentFieldMode == MPContentFieldModeUser)
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementEntity *element = [[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context];
|
||||
if (!element)
|
||||
return;
|
||||
|
||||
element.loginName = newContent;
|
||||
[context saveToStore];
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[self updateAnimated:YES];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Login Updated" dismissAfter:2];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)doUser:(id)sender {
|
||||
|
||||
switch (self.contentFieldMode) {
|
||||
case MPContentFieldModePassword: {
|
||||
self.contentFieldMode = MPContentFieldModeUser;
|
||||
break;
|
||||
}
|
||||
case MPContentFieldModeUser: {
|
||||
self.contentFieldMode = MPContentFieldModePassword;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)doUpgrade:(UIButton *)sender {
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
if ([[[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context] migrateExplicitly:YES]) {
|
||||
[context saveToStore];
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[[MPPasswordTypesCell findAsSuperviewOf:self] reloadData];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Site Upgraded" dismissAfter:2];
|
||||
} );
|
||||
}
|
||||
else
|
||||
PearlMainQueue( ^{
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Site Not Upgraded" dismissAfter:2];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setContentFieldMode:(MPContentFieldMode)contentFieldMode {
|
||||
|
||||
if (_contentFieldMode == contentFieldMode)
|
||||
return;
|
||||
|
||||
_contentFieldMode = contentFieldMode;
|
||||
|
||||
[[MPPasswordTypesCell findAsSuperviewOf:self] reloadData:self];
|
||||
}
|
||||
|
||||
@end
|
@ -1,25 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordLargeDeleteCell.h
|
||||
// MPPasswordLargeDeleteCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-19.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MPPasswordLargeCell.h"
|
||||
|
||||
@interface MPPasswordLargeDeleteCell : MPPasswordLargeCell
|
||||
|
||||
+ (MPPasswordLargeCell *)dequeueCellFromCollectionView:(UICollectionView *)view atIndexPath:(NSIndexPath *)path;
|
||||
@end
|
@ -1,39 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordLargeDeleteCell.h
|
||||
// MPPasswordLargeDeleteCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-19.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPasswordLargeDeleteCell.h"
|
||||
|
||||
@implementation MPPasswordLargeDeleteCell
|
||||
|
||||
#pragma mark - Lifecycle
|
||||
|
||||
+ (MPPasswordLargeCell *)dequeueCellFromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
MPPasswordLargeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass( [self class] )
|
||||
forIndexPath:indexPath];
|
||||
cell.type = (MPElementType)NSNotFound;
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
@end
|
@ -1,28 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordLargeGeneratedCell.h
|
||||
// MPPasswordLargeGeneratedCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-19.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MPPasswordLargeCell.h"
|
||||
|
||||
@interface MPPasswordLargeGeneratedCell : MPPasswordLargeCell
|
||||
|
||||
@property(strong, nonatomic) IBOutlet UILabel *strengthLabel;
|
||||
@property(strong, nonatomic) IBOutlet UILabel *counterLabel;
|
||||
@property(strong, nonatomic) IBOutlet UIButton *counterButton;
|
||||
|
||||
@end
|
@ -1,200 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordLargeGeneratedCell.h
|
||||
// MPPasswordLargeGeneratedCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-19.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPasswordLargeGeneratedCell.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPPasswordTypesCell.h"
|
||||
|
||||
@interface MPPasswordLargeGeneratedCell()
|
||||
|
||||
@property(nonatomic, weak) NSTimer *hideStrengthTimer;
|
||||
@end
|
||||
|
||||
@implementation MPPasswordLargeGeneratedCell
|
||||
|
||||
- (void)awakeFromNib {
|
||||
|
||||
[super awakeFromNib];
|
||||
|
||||
UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc]
|
||||
initWithTarget:self action:@selector( doResetCounterRecognizer: )];
|
||||
[self.counterButton addGestureRecognizer:gestureRecognizer];
|
||||
}
|
||||
|
||||
- (void)prepareForReuse {
|
||||
|
||||
[super prepareForReuse];
|
||||
|
||||
self.strengthLabel.alpha = 0;
|
||||
}
|
||||
|
||||
- (void)willBeginDragging {
|
||||
|
||||
[super willBeginDragging];
|
||||
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
self.strengthLabel.alpha = 1;
|
||||
}];
|
||||
|
||||
[self.hideStrengthTimer invalidate];
|
||||
self.hideStrengthTimer = [NSTimer scheduledTimerWithTimeInterval:1 block:^(NSTimer *timer) {
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
self.strengthLabel.alpha = 0;
|
||||
}];
|
||||
} repeats:NO];
|
||||
}
|
||||
|
||||
- (void)update {
|
||||
|
||||
[super update];
|
||||
|
||||
self.counterLabel.alpha = self.counterButton.alpha = 0;
|
||||
}
|
||||
|
||||
- (void)updateWithElement:(MPElementEntity *)mainElement {
|
||||
|
||||
[super updateWithElement:mainElement];
|
||||
|
||||
MPElementGeneratedEntity *generatedElement = [self generatedElement:mainElement];
|
||||
if (generatedElement)
|
||||
self.counterLabel.text = strf( @"%lu", (unsigned long)generatedElement.counter );
|
||||
else
|
||||
self.counterLabel.text = @"1";
|
||||
|
||||
if (mainElement && !mainElement.requiresExplicitMigration)
|
||||
self.counterLabel.alpha = self.counterButton.alpha = 1;
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForTransientSite:(NSString *)siteName usingKey:(MPKey *)key result:(void ( ^ )(NSString *))resultBlock {
|
||||
|
||||
PearlNotMainQueue( ^{
|
||||
resultBlock( [MPAlgorithmDefault generateContentNamed:siteName ofType:self.type withCounter:1 usingKey:key] );
|
||||
} );
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void ( ^ )(NSString *))resultBlock {
|
||||
|
||||
id<MPAlgorithm> algorithm = element.algorithm;
|
||||
NSString *siteName = element.name;
|
||||
|
||||
PearlNotMainQueue( ^{
|
||||
resultBlock( [algorithm generateContentNamed:siteName ofType:self.type withCounter:1 usingKey:key] );
|
||||
} );
|
||||
}
|
||||
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
element = [super saveContentTypeWithElement:element saveInContext:context];
|
||||
|
||||
MPElementGeneratedEntity *generatedElement = [self generatedElement:element];
|
||||
if (generatedElement) {
|
||||
generatedElement.counter = [self.counterLabel.text intValue];
|
||||
[context saveToStore];
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)doIncrementCounter:(UIButton *)sender {
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementGeneratedEntity *generatedElement = [self generatedElementInContext:context];
|
||||
if (!generatedElement)
|
||||
return;
|
||||
|
||||
++generatedElement.counter;
|
||||
[context saveToStore];
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[self updateAnimated:YES];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Counter Incremented" dismissAfter:2];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)doResetCounterRecognizer:(UILongPressGestureRecognizer *)gestureRecognizer {
|
||||
|
||||
if (gestureRecognizer.state != UIGestureRecognizerStateBegan)
|
||||
return;
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementGeneratedEntity *generatedElement = [self generatedElementInContext:context];
|
||||
if (!generatedElement)
|
||||
return;
|
||||
|
||||
generatedElement.counter = 1;
|
||||
[context saveToStore];
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[self updateAnimated:YES];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Counter Reset" dismissAfter:2];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setType:(MPElementType)type {
|
||||
|
||||
[super setType:type];
|
||||
|
||||
switch (type) {
|
||||
case MPElementTypeGeneratedMaximum:
|
||||
self.strengthLabel.text = @"422 quintillion years";
|
||||
break;
|
||||
case MPElementTypeGeneratedLong:
|
||||
self.strengthLabel.text = @"1.4 years";
|
||||
break;
|
||||
case MPElementTypeGeneratedMedium:
|
||||
self.strengthLabel.text = @"2 seconds";
|
||||
break;
|
||||
case MPElementTypeGeneratedBasic:
|
||||
self.strengthLabel.text = @"trivial";
|
||||
break;
|
||||
case MPElementTypeGeneratedShort:
|
||||
self.strengthLabel.text = @"trivial";
|
||||
break;
|
||||
case MPElementTypeGeneratedPIN:
|
||||
self.strengthLabel.text = @"trivial";
|
||||
break;
|
||||
case MPElementTypeStoredPersonal:
|
||||
self.strengthLabel.text = @"";
|
||||
break;
|
||||
case MPElementTypeStoredDevicePrivate:
|
||||
self.strengthLabel.text = @"";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (MPElementGeneratedEntity *)generatedElementInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [self generatedElement:[[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context]];
|
||||
}
|
||||
|
||||
- (MPElementGeneratedEntity *)generatedElement:(MPElementEntity *)element {
|
||||
|
||||
if (![element isKindOfClass:[MPElementGeneratedEntity class]])
|
||||
return nil;
|
||||
|
||||
return (MPElementGeneratedEntity *)element;
|
||||
}
|
||||
|
||||
@end
|
@ -1,24 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordLargeStoredCell.h
|
||||
// MPPasswordLargeStoredCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-19.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MPPasswordLargeCell.h"
|
||||
|
||||
@interface MPPasswordLargeStoredCell : MPPasswordLargeCell
|
||||
|
||||
@end
|
@ -1,102 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordLargeGeneratedCell.h
|
||||
// MPPasswordLargeGeneratedCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-19.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPasswordLargeStoredCell.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPPasswordTypesCell.h"
|
||||
|
||||
@interface MPPasswordLargeStoredCell()
|
||||
|
||||
@property(strong, nonatomic) IBOutlet UIButton *editButton;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPPasswordLargeStoredCell
|
||||
|
||||
#pragma mark - Lifecycle
|
||||
|
||||
- (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void ( ^ )(NSString *))resultBlock {
|
||||
|
||||
if (element.type & MPElementTypeClassStored)
|
||||
[element resolveContentUsingKey:key result:resultBlock];
|
||||
else
|
||||
[super resolveContentOfCellTypeForElement:element usingKey:key result:resultBlock];
|
||||
}
|
||||
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
element = [super saveContentTypeWithElement:element saveInContext:context];
|
||||
MPElementStoredEntity *storedElement = [self storedElement:element];
|
||||
[storedElement.algorithm saveContent:self.contentField.text toElement:storedElement usingKey:[MPiOSAppDelegate get].key];
|
||||
[context saveToStore];
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)doEditContent:(UIButton *)sender {
|
||||
|
||||
UITextField *textField = self.contentField;
|
||||
textField.enabled = YES;
|
||||
[textField becomeFirstResponder];
|
||||
}
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
||||
|
||||
[super textFieldDidEndEditing:textField];
|
||||
|
||||
if (textField == self.contentField) {
|
||||
NSString *newContent = textField.text;
|
||||
|
||||
if (self.contentFieldMode == MPContentFieldModePassword)
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPElementStoredEntity *storedElement = [self storedElementInContext:context];
|
||||
if (!storedElement)
|
||||
return;
|
||||
|
||||
[storedElement.algorithm saveContent:newContent toElement:storedElement usingKey:[MPiOSAppDelegate get].key];
|
||||
[context saveToStore];
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[self updateAnimated:YES];
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Password Updated" dismissAfter:2];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (MPElementStoredEntity *)storedElementInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [self storedElement:[[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context]];
|
||||
}
|
||||
|
||||
- (MPElementStoredEntity *)storedElement:(MPElementEntity *)element {
|
||||
|
||||
if (![element isKindOfClass:[MPElementStoredEntity class]])
|
||||
return nil;
|
||||
|
||||
return (MPElementStoredEntity *)element;
|
||||
}
|
||||
|
||||
@end
|
@ -1,46 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordTypesCell.h
|
||||
// MPPasswordTypesCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-27.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MPCell.h"
|
||||
#import "MPPasswordCell.h"
|
||||
#import "MPPasswordsViewController.h"
|
||||
#import "MPPasswordLargeCell.h"
|
||||
|
||||
@interface MPPasswordTypesCell : MPPasswordCell <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
|
||||
|
||||
@property(nonatomic, strong) IBOutlet UICollectionView *contentCollectionView;
|
||||
|
||||
@property(nonatomic, weak) MPPasswordsViewController *passwordsViewController;
|
||||
@property(nonatomic, copy) NSString *transientSite;
|
||||
|
||||
@property(nonatomic, strong) id<MPAlgorithm> algorithm;
|
||||
@property(nonatomic) MPElementType activeType;
|
||||
|
||||
- (MPElementEntity *)mainElement;
|
||||
- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context;
|
||||
- (void)setElement:(MPElementEntity *)element;
|
||||
- (void)reloadData;
|
||||
- (void)reloadData:(MPPasswordLargeCell *)cell;
|
||||
|
||||
+ (instancetype)dequeueCellForElement:(MPElementEntity *)element
|
||||
fromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath;
|
||||
+ (instancetype)dequeueCellForTransientSite:(NSString *)siteName
|
||||
fromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath;
|
||||
|
||||
@end
|
@ -1,411 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordTypesCell.h
|
||||
// MPPasswordTypesCell
|
||||
//
|
||||
// Created by lhunath on 2014-03-27.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPasswordTypesCell.h"
|
||||
#import "MPPasswordLargeCell.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPPasswordLargeDeleteCell.h"
|
||||
|
||||
@implementation MPPasswordTypesCell {
|
||||
NSManagedObjectID *_elementOID;
|
||||
BOOL _scrolling;
|
||||
}
|
||||
|
||||
#pragma mark - Lifecycle
|
||||
|
||||
+ (instancetype)dequeueCellForTransientSite:(NSString *)siteName fromCollectionView:(UICollectionView *)collectionView
|
||||
atIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
MPPasswordTypesCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass( [MPPasswordTypesCell class] )
|
||||
forIndexPath:indexPath];
|
||||
[cell setTransientSite:siteName];
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
+ (instancetype)dequeueCellForElement:(MPElementEntity *)element fromCollectionView:(UICollectionView *)collectionView
|
||||
atIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
MPPasswordTypesCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass( [MPPasswordTypesCell class] )
|
||||
forIndexPath:indexPath];
|
||||
[cell setElement:element];
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (void)awakeFromNib {
|
||||
|
||||
[super awakeFromNib];
|
||||
|
||||
self.backgroundColor = [UIColor clearColor];
|
||||
self.layer.shadowColor = [UIColor clearColor].CGColor;
|
||||
|
||||
[self prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)prepareForReuse {
|
||||
|
||||
_elementOID = nil;
|
||||
_transientSite = nil;
|
||||
_activeType = 0;
|
||||
_algorithm = MPAlgorithmDefault;
|
||||
|
||||
[super prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
|
||||
|
||||
[super applyLayoutAttributes:layoutAttributes];
|
||||
|
||||
[self.contentCollectionView.collectionViewLayout invalidateLayout];
|
||||
[self scrollToActiveType];
|
||||
}
|
||||
|
||||
#pragma mark - UICollectionViewDataSource
|
||||
|
||||
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout
|
||||
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
return collectionView.bounds.size;
|
||||
}
|
||||
|
||||
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
|
||||
|
||||
if (!self.algorithm)
|
||||
return 0;
|
||||
|
||||
if (self.transientSite)
|
||||
return [[self.algorithm allTypes] count];
|
||||
|
||||
return [[self.algorithm allTypes] count] + 1 /* Delete */;
|
||||
}
|
||||
|
||||
- (MPPasswordLargeCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
MPPasswordLargeCell *cell;
|
||||
if (!self.transientSite && indexPath.item == 0) {
|
||||
cell = [MPPasswordLargeDeleteCell dequeueCellFromCollectionView:collectionView atIndexPath:indexPath];
|
||||
[cell updateWithElement:self.mainElement];
|
||||
}
|
||||
else {
|
||||
cell = [MPPasswordLargeCell dequeueCellWithType:[self typeForContentIndexPath:indexPath] fromCollectionView:collectionView
|
||||
atIndexPath:indexPath];
|
||||
|
||||
[cell prepareForReuse];
|
||||
|
||||
if (self.transientSite)
|
||||
[cell updateWithTransientSite:self.transientSite];
|
||||
else
|
||||
[cell updateWithElement:self.mainElement];
|
||||
}
|
||||
|
||||
if (_scrolling)
|
||||
[cell willBeginDragging];
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
#pragma mark - UICollectionViewDelegateFlowLayout
|
||||
|
||||
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
NSString *newSiteName = self.transientSite;
|
||||
if (newSiteName) {
|
||||
[[UIResponder findFirstResponder] resignFirstResponder];
|
||||
[PearlAlert showAlertWithTitle:@"Create Site"
|
||||
message:strf( @"Do you want to create a new site named:\n%@", newSiteName )
|
||||
viewStyle:UIAlertViewStyleDefault
|
||||
initAlert:nil tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [alert cancelButtonIndex]) {
|
||||
// Cancel
|
||||
for (NSIndexPath *selectedIndexPath in [collectionView indexPathsForSelectedItems])
|
||||
[collectionView deselectItemAtIndexPath:selectedIndexPath animated:YES];
|
||||
return;
|
||||
}
|
||||
|
||||
// Create
|
||||
[[MPiOSAppDelegate get] addElementNamed:newSiteName completion:^(MPElementEntity *element) {
|
||||
[self copyContentOfElement:element inCell:nil];
|
||||
PearlMainQueue( ^{
|
||||
[self.passwordsViewController updatePasswords];
|
||||
} );
|
||||
}];
|
||||
} cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonYes, nil];
|
||||
return;
|
||||
}
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
BOOL used = NO;
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
MPPasswordLargeCell *cell = (MPPasswordLargeCell *)[self.contentCollectionView cellForItemAtIndexPath:indexPath];
|
||||
if (!element)
|
||||
wrn( @"No element to use for: %@", self );
|
||||
else if (indexPath.item == 0) {
|
||||
[context deleteObject:element];
|
||||
[context saveToStore];
|
||||
}
|
||||
else
|
||||
used = [self copyContentOfElement:element inCell:cell];
|
||||
|
||||
PearlMainQueueAfter( 0.2f, ^{
|
||||
for (NSIndexPath *selectedIndexPath in [collectionView indexPathsForSelectedItems])
|
||||
[collectionView deselectItemAtIndexPath:selectedIndexPath animated:YES];
|
||||
|
||||
if (used)
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context_) {
|
||||
[[self elementInContext:context_] use];
|
||||
[context_ saveToStore];
|
||||
}];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
- (BOOL)copyContentOfElement:(MPElementEntity *)element inCell:(MPPasswordLargeCell *)cell {
|
||||
|
||||
NSString *used, *pasteboardContent;
|
||||
switch (cell.contentFieldMode) {
|
||||
case MPContentFieldModePassword:
|
||||
inf( @"Copying password for: %@", element.name );
|
||||
used = strl( @"Password" );
|
||||
pasteboardContent = [element resolveContentUsingKey:[MPAppDelegate_Shared get].key];
|
||||
break;
|
||||
case MPContentFieldModeUser:
|
||||
inf( @"Copying login for: %@", element.name );
|
||||
used = strl( @"Login" );
|
||||
pasteboardContent = element.loginName;
|
||||
break;
|
||||
}
|
||||
|
||||
if ([pasteboardContent length]) {
|
||||
[UIPasteboard generalPasteboard].string = pasteboardContent;
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:strl(@"%@ Copied", used) dismissAfter:2];
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
#pragma mark - UIScrollViewDelegate
|
||||
|
||||
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
|
||||
|
||||
_scrolling = YES;
|
||||
for (MPPasswordLargeCell *cell in [self.contentCollectionView visibleCells])
|
||||
[cell willBeginDragging];
|
||||
}
|
||||
|
||||
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity
|
||||
targetContentOffset:(inout CGPoint *)targetContentOffset {
|
||||
|
||||
if (scrollView == self.contentCollectionView) {
|
||||
NSIndexPath *targetIndexPath = [self.contentCollectionView indexPathForItemAtPoint:
|
||||
CGPointPlusCGPoint( *targetContentOffset, self.contentCollectionView.center )];
|
||||
*targetContentOffset = CGRectGetTopLeft(
|
||||
[self.contentCollectionView layoutAttributesForItemAtIndexPath:targetIndexPath].frame );
|
||||
}
|
||||
}
|
||||
|
||||
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
|
||||
|
||||
_scrolling = NO;
|
||||
if (scrollView == self.contentCollectionView && !decelerate)
|
||||
[self saveContentType];
|
||||
}
|
||||
|
||||
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
|
||||
|
||||
_scrolling = NO;
|
||||
if (scrollView == self.contentCollectionView)
|
||||
[self saveContentType];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)reloadData {
|
||||
|
||||
if (self.transientSite)
|
||||
PearlMainQueue( ^{
|
||||
self.algorithm = MPAlgorithmDefault;
|
||||
self.activeType = [[MPiOSAppDelegate get] activeUserForMainThread].defaultType?: MPElementTypeGeneratedLong;
|
||||
|
||||
for (NSInteger section = 0; section < [self.contentCollectionView numberOfSections]; ++section)
|
||||
for (NSInteger item = 0; item < [self.contentCollectionView numberOfItemsInSection:section]; ++item)
|
||||
[(MPPasswordLargeCell *)[self.contentCollectionView cellForItemAtIndexPath:
|
||||
[NSIndexPath indexPathForItem:item inSection:section]] updateWithTransientSite:self.transientSite];
|
||||
} );
|
||||
else
|
||||
[MPiOSAppDelegate managedObjectContextForMainThreadPerformBlockAndWait:^(NSManagedObjectContext *mainContext) {
|
||||
MPElementEntity *mainElement = self.transientSite? nil: [self elementInContext:mainContext];
|
||||
|
||||
self.algorithm = mainElement.algorithm?: MPAlgorithmDefault;
|
||||
self.activeType = mainElement.type?: [[MPiOSAppDelegate get] activeUserInContext:mainContext].defaultType?:
|
||||
MPElementTypeGeneratedLong;
|
||||
|
||||
for (NSInteger section = 0; section < [self.contentCollectionView numberOfSections]; ++section)
|
||||
for (NSInteger item = 0; item < [self.contentCollectionView numberOfItemsInSection:section]; ++item) {
|
||||
MPPasswordLargeCell *cell = (MPPasswordLargeCell *)[self.contentCollectionView cellForItemAtIndexPath:
|
||||
[NSIndexPath indexPathForItem:item inSection:section]];
|
||||
[self reloadData:cell withElement:mainElement];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)reloadData:(MPPasswordLargeCell *)cell {
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextForMainThreadPerformBlockAndWait:^(NSManagedObjectContext *mainContext) {
|
||||
[self reloadData:cell withElement:[self elementInContext:mainContext]];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)reloadData:(MPPasswordLargeCell *)cell withElement:(MPElementEntity *)element {
|
||||
|
||||
if (element)
|
||||
[cell updateWithElement:element];
|
||||
else
|
||||
[cell updateWithTransientSite:self.transientSite];
|
||||
}
|
||||
|
||||
- (void)scrollToActiveType {
|
||||
|
||||
if (self.activeType && self.activeType != (MPElementType)NSNotFound)
|
||||
[self.contentCollectionView scrollToItemAtIndexPath:[self contentIndexPathForType:self.activeType]
|
||||
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
|
||||
}
|
||||
|
||||
- (MPElementType)typeForContentIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
if (self.transientSite)
|
||||
return [[self.algorithm allTypesStartingWith:MPElementTypeGeneratedPIN][indexPath.item] unsignedIntegerValue];
|
||||
|
||||
if (indexPath.item == 0)
|
||||
return (MPElementType)NSNotFound;
|
||||
|
||||
return [[self.algorithm allTypesStartingWith:MPElementTypeGeneratedPIN][indexPath.item - 1] unsignedIntegerValue];
|
||||
}
|
||||
|
||||
- (NSIndexPath *)contentIndexPathForType:(MPElementType)type {
|
||||
|
||||
NSArray *types = [self.algorithm allTypesStartingWith:MPElementTypeGeneratedPIN];
|
||||
for (NSInteger t = 0; t < [types count]; ++t)
|
||||
if ([types[t] unsignedIntegerValue] == type) {
|
||||
if (self.transientSite)
|
||||
return [NSIndexPath indexPathForItem:t inSection:0];
|
||||
else
|
||||
return [NSIndexPath indexPathForItem:t + 1 inSection:0];
|
||||
}
|
||||
|
||||
Throw( @"Unsupported type: %lud", (long)type );
|
||||
}
|
||||
|
||||
- (void)saveContentType {
|
||||
|
||||
CGPoint centerPoint = CGRectGetCenter( self.contentCollectionView.bounds );
|
||||
NSIndexPath *centerIndexPath = [self.contentCollectionView indexPathForItemAtPoint:centerPoint];
|
||||
MPElementType type = [self typeForContentIndexPath:centerIndexPath];
|
||||
if (type == ((MPElementType)NSNotFound))
|
||||
// Active cell is not a type cell.
|
||||
return;
|
||||
|
||||
self.activeType = type;
|
||||
|
||||
if (self.transientSite)
|
||||
return;
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPPasswordLargeCell *cell = (MPPasswordLargeCell *)[self.contentCollectionView cellForItemAtIndexPath:centerIndexPath];
|
||||
if (!cell) {
|
||||
err( @"Couldn't find cell to change type: centerIndexPath=%@", centerIndexPath );
|
||||
return;
|
||||
}
|
||||
|
||||
MPElementEntity *element = [self elementInContext:context];
|
||||
if (!element || element.type == cell.type)
|
||||
// Nothing changed.
|
||||
return;
|
||||
|
||||
self.element = [cell saveContentTypeWithElement:element saveInContext:context];
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - State
|
||||
|
||||
- (void)setTransientSite:(NSString *)transientSite {
|
||||
|
||||
if ([_transientSite isEqualToString:transientSite])
|
||||
return;
|
||||
|
||||
dbg( @"transientSite: %@ -> %@", _transientSite, transientSite );
|
||||
|
||||
_transientSite = transientSite;
|
||||
_elementOID = nil;
|
||||
|
||||
[self updateAnimated:YES];
|
||||
[self reloadData];
|
||||
}
|
||||
|
||||
- (void)setElement:(MPElementEntity *)element {
|
||||
|
||||
NSManagedObjectID *newElementOID = element.objectID;
|
||||
NSAssert( !newElementOID.isTemporaryID, @"Element doesn't have a permanent objectID: %@", element );
|
||||
if ([_elementOID isEqual:newElementOID])
|
||||
return;
|
||||
|
||||
dbg( @"element: %@ -> %@", _elementOID, newElementOID );
|
||||
|
||||
_transientSite = nil;
|
||||
_elementOID = newElementOID;
|
||||
|
||||
[self updateAnimated:YES];
|
||||
[self reloadData];
|
||||
}
|
||||
|
||||
- (MPElementEntity *)mainElement {
|
||||
|
||||
return [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]];
|
||||
}
|
||||
|
||||
- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [MPElementEntity existingObjectWithID:_elementOID inContext:context];
|
||||
}
|
||||
|
||||
- (void)setActiveType:(MPElementType)activeType {
|
||||
|
||||
_activeType = activeType;
|
||||
|
||||
[self scrollToActiveType];
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)selected {
|
||||
|
||||
[super setSelected:selected];
|
||||
|
||||
if (!selected)
|
||||
for (NSIndexPath *indexPath in [self.contentCollectionView indexPathsForSelectedItems])
|
||||
[self.contentCollectionView deselectItemAtIndexPath:indexPath animated:YES];
|
||||
}
|
||||
|
||||
- (void)setAlgorithm:(id<MPAlgorithm>)algorithm {
|
||||
|
||||
_algorithm = algorithm;
|
||||
|
||||
[self.contentCollectionView reloadData];
|
||||
}
|
||||
|
||||
@end
|
@ -1,23 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordsCoachmarkViewController.h
|
||||
// MPPasswordsCoachmarkViewController
|
||||
//
|
||||
// Created by lhunath on 2014-04-23.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "MPCoachmarkViewController.h"
|
||||
|
||||
@interface MPPasswordsCoachmarkViewController : MPCoachmarkViewController <UICollectionViewDataSource>
|
||||
@end
|
@ -1,51 +0,0 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordsCoachmarkViewController.h
|
||||
// MPPasswordsCoachmarkViewController
|
||||
//
|
||||
// Created by lhunath on 2014-04-23.
|
||||
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPasswordsCoachmarkViewController.h"
|
||||
#import "MPPasswordLargeGeneratedCell.h"
|
||||
#import "MPPasswordLargeStoredCell.h"
|
||||
|
||||
@implementation MPPasswordsCoachmarkViewController
|
||||
|
||||
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
if (indexPath.item == 0) {
|
||||
MPPasswordLargeGeneratedCell *cell = [MPPasswordLargeGeneratedCell dequeueCellWithType:MPElementTypeGeneratedLong
|
||||
fromCollectionView:collectionView atIndexPath:indexPath];
|
||||
[cell updateWithTransientSite:@"apple.com"];
|
||||
|
||||
return cell;
|
||||
}
|
||||
else if (indexPath.item == 1) {
|
||||
MPPasswordLargeStoredCell *cell = [MPPasswordLargeStoredCell dequeueCellWithType:MPElementTypeStoredPersonal
|
||||
fromCollectionView:collectionView atIndexPath:indexPath];
|
||||
[cell updateWithTransientSite:@"gmail.com"];
|
||||
[cell.contentField setText:@"PaS$w0rD"];
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
Throw(@"Unexpected item for indexPath: %@", indexPath);
|
||||
}
|
||||
|
||||
@end
|
@ -1,12 +1,12 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPPasswordsViewController.h
|
||||
@ -19,11 +19,9 @@
|
||||
#import "MPPasswordsViewController.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPPasswordLargeCell.h"
|
||||
#import "MPPasswordTypesCell.h"
|
||||
#import "MPPopdownSegue.h"
|
||||
#import "MPAppDelegate_Key.h"
|
||||
#import "MPCoachmarkViewController.h"
|
||||
#import "MPPasswordCell.h"
|
||||
|
||||
@interface MPPasswordsViewController()<NSFetchedResultsControllerDelegate>
|
||||
|
||||
@ -58,7 +56,7 @@
|
||||
[self.passwordsSearchBar enumerateViews:^(UIView *subview, BOOL *stop, BOOL *recurse) {
|
||||
if ([subview isKindOfClass:[UITextField class]])
|
||||
((UITextField *)subview).keyboardAppearance = UIKeyboardAppearanceDark;
|
||||
} recurse:YES];
|
||||
} recurse:YES];
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
@ -103,54 +101,34 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout
|
||||
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
if (collectionView == self.passwordCollectionView) {
|
||||
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)collectionViewLayout;
|
||||
CGFloat itemWidth = UIEdgeInsetsInsetRect(self.passwordCollectionView.bounds, layout.sectionInset).size.width;
|
||||
return CGSizeMake( itemWidth, 100 );
|
||||
}
|
||||
|
||||
Throw(@"Unexpected collection view: %@", collectionView);
|
||||
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)collectionViewLayout;
|
||||
CGFloat itemWidth = UIEdgeInsetsInsetRect( self.passwordCollectionView.bounds, layout.sectionInset ).size.width;
|
||||
return CGSizeMake( itemWidth, 100 );
|
||||
}
|
||||
|
||||
#pragma mark - UICollectionViewDataSource
|
||||
|
||||
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
|
||||
|
||||
if (collectionView == self.passwordCollectionView)
|
||||
return [self.fetchedResultsController.sections count];
|
||||
|
||||
Throw(@"Unexpected collection view: %@", collectionView);
|
||||
return [self.fetchedResultsController.sections count];
|
||||
}
|
||||
|
||||
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
|
||||
|
||||
if (collectionView == self.passwordCollectionView)
|
||||
return ![MPiOSAppDelegate get].activeUserOID? 0:
|
||||
((id<NSFetchedResultsSectionInfo>)self.fetchedResultsController.sections[section]).numberOfObjects +
|
||||
(!_exactMatch && [[self query] length]? 1: 0);
|
||||
|
||||
Throw(@"Unexpected collection view: %@", collectionView);
|
||||
return ![MPiOSAppDelegate get].activeUserOID? 0:
|
||||
((id<NSFetchedResultsSectionInfo>)self.fetchedResultsController.sections[section]).numberOfObjects +
|
||||
(!_exactMatch && [[self query] length]? 1: 0);
|
||||
}
|
||||
|
||||
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
if (collectionView == self.passwordCollectionView) {
|
||||
[UIView setAnimationsEnabled:NO];
|
||||
MPPasswordTypesCell *cell;
|
||||
if (indexPath.item < ((id<NSFetchedResultsSectionInfo>)self.fetchedResultsController.sections[indexPath.section]).numberOfObjects) {
|
||||
MPElementEntity *element = [self.fetchedResultsController objectAtIndexPath:indexPath];
|
||||
cell = [MPPasswordTypesCell dequeueCellForElement:element fromCollectionView:collectionView atIndexPath:indexPath];
|
||||
}
|
||||
else
|
||||
// New Site.
|
||||
cell = [MPPasswordTypesCell dequeueCellForTransientSite:self.query fromCollectionView:collectionView atIndexPath:indexPath];
|
||||
cell.passwordsViewController = self;
|
||||
MPPasswordCell *cell = [MPPasswordCell dequeueCellFromCollectionView:collectionView indexPath:indexPath];
|
||||
if (indexPath.item < ((id<NSFetchedResultsSectionInfo>)self.fetchedResultsController.sections[indexPath.section]).numberOfObjects)
|
||||
[cell setElement:[self.fetchedResultsController objectAtIndexPath:indexPath] animated:NO];
|
||||
else
|
||||
[cell setTransientSite:self.query animated:NO];
|
||||
|
||||
[UIView setAnimationsEnabled:YES];
|
||||
return cell;
|
||||
}
|
||||
|
||||
Throw(@"Unexpected collection view: %@", collectionView);
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind
|
||||
@ -159,15 +137,35 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"MPPasswordHeader" forIndexPath:indexPath];
|
||||
}
|
||||
|
||||
#pragma mark - UIScrollDelegate
|
||||
|
||||
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
|
||||
|
||||
if (scrollView == self.passwordCollectionView)
|
||||
for (MPPasswordCell *cell in [self.passwordCollectionView visibleCells])
|
||||
[cell setMode:MPPasswordCellModePassword animated:YES];
|
||||
}
|
||||
|
||||
#pragma mark - NSFetchedResultsControllerDelegate
|
||||
|
||||
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath
|
||||
forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
|
||||
|
||||
if (controller == _fetchedResultsController) {
|
||||
[self.passwordCollectionView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section]];
|
||||
if (![newIndexPath isEqual:indexPath])
|
||||
[self.passwordCollectionView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section]];
|
||||
switch (type) {
|
||||
case NSFetchedResultsChangeInsert:
|
||||
[self.passwordCollectionView insertItemsAtIndexPaths:@[ newIndexPath ]];
|
||||
break;
|
||||
case NSFetchedResultsChangeDelete:
|
||||
[self.passwordCollectionView deleteItemsAtIndexPaths:@[ indexPath ]];
|
||||
break;
|
||||
case NSFetchedResultsChangeMove:
|
||||
[self.passwordCollectionView moveItemAtIndexPath:indexPath toIndexPath:newIndexPath];
|
||||
break;
|
||||
case NSFetchedResultsChangeUpdate:
|
||||
[self.passwordCollectionView reloadItemsAtIndexPaths:@[ indexPath ]];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,7 +227,6 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
[self updatePasswords];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)registerObservers {
|
||||
@ -237,19 +234,19 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
if ([_notificationObservers count])
|
||||
return;
|
||||
|
||||
Weakify(self);
|
||||
Weakify( self );
|
||||
_notificationObservers = @[
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UIApplicationWillResignActiveNotification object:nil
|
||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||
Strongify(self);
|
||||
Strongify( self );
|
||||
|
||||
self.passwordSelectionContainer.alpha = 0;
|
||||
}],
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:MPSignedOutNotification object:nil
|
||||
queue:nil usingBlock:^(NSNotification *note) {
|
||||
Strongify(self);
|
||||
Strongify( self );
|
||||
|
||||
_fetchedResultsController = nil;
|
||||
self.passwordsSearchBar.text = nil;
|
||||
@ -258,7 +255,7 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:UIApplicationDidBecomeActiveNotification object:nil
|
||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||
Strongify(self);
|
||||
Strongify( self );
|
||||
|
||||
[self updatePasswords];
|
||||
[UIView animateWithDuration:1 animations:^{
|
||||
@ -282,7 +279,7 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
|
||||
- (void)observeStore {
|
||||
|
||||
Weakify(self);
|
||||
Weakify( self );
|
||||
|
||||
NSManagedObjectContext *mainContext = [MPiOSAppDelegate managedObjectContextForMainThreadIfReady];
|
||||
if (!_mocObserver && mainContext)
|
||||
@ -296,7 +293,7 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
_storeObserver = [[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:USMStoreDidChangeNotification object:nil
|
||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||
Strongify(self);
|
||||
Strongify( self );
|
||||
_fetchedResultsController = nil;
|
||||
[self updatePasswords];
|
||||
}];
|
||||
@ -312,9 +309,9 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
|
||||
- (void)updateConfigKey:(NSString *)key {
|
||||
|
||||
if (!key || [key isEqualToString:NSStringFromSelector( @selector(dictationSearch) )])
|
||||
if (!key || [key isEqualToString:NSStringFromSelector( @selector( dictationSearch ) )])
|
||||
self.passwordsSearchBar.keyboardType = [[MPiOSConfig get].dictationSearch boolValue]? UIKeyboardTypeDefault: UIKeyboardTypeURL;
|
||||
if (!key || [key isEqualToString:NSStringFromSelector( @selector(hidePasswords) )])
|
||||
if (!key || [key isEqualToString:NSStringFromSelector( @selector( hidePasswords ) )])
|
||||
[self updatePasswords];
|
||||
}
|
||||
|
||||
@ -338,7 +335,7 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
[NSPredicate predicateWithFormat:@"user == %@ AND name BEGINSWITH[cd] %@", activeUserOID, query]:
|
||||
[NSPredicate predicateWithFormat:@"user == %@", activeUserOID];
|
||||
if (![self.fetchedResultsController performFetch:&error])
|
||||
err(@"Couldn't fetch elements: %@", error);
|
||||
err( @"Couldn't fetch elements: %@", error );
|
||||
|
||||
_exactMatch = NO;
|
||||
for (MPElementEntity *entity in self.fetchedResultsController.fetchedObjects)
|
||||
@ -351,17 +348,17 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
[self.passwordCollectionView performBatchUpdates:^{
|
||||
NSInteger fromSections = self.passwordCollectionView.numberOfSections;
|
||||
NSInteger toSections = [self numberOfSectionsInCollectionView:self.passwordCollectionView];
|
||||
for (int section = 0; section < MAX(toSections, fromSections); section++) {
|
||||
for (int section = 0; section < MAX( toSections, fromSections ); section++) {
|
||||
if (section >= fromSections) {
|
||||
dbg(@"insertSections:%d", section);
|
||||
dbg( @"insertSections:%d", section );
|
||||
[self.passwordCollectionView insertSections:[NSIndexSet indexSetWithIndex:section]];
|
||||
}
|
||||
else if (section >= toSections) {
|
||||
dbg(@"deleteSections:%d", section);
|
||||
dbg( @"deleteSections:%d", section );
|
||||
[self.passwordCollectionView deleteSections:[NSIndexSet indexSetWithIndex:section]];
|
||||
}
|
||||
else {
|
||||
dbg(@"reloadSections:%d", section);
|
||||
dbg( @"reloadSections:%d", section );
|
||||
[self.passwordCollectionView reloadSections:[NSIndexSet indexSetWithIndex:section]];
|
||||
}
|
||||
}
|
||||
@ -387,7 +384,7 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
[MPiOSAppDelegate managedObjectContextForMainThreadPerformBlockAndWait:^(NSManagedObjectContext *mainContext) {
|
||||
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPElementEntity class] )];
|
||||
fetchRequest.sortDescriptors = @[
|
||||
[[NSSortDescriptor alloc] initWithKey:NSStringFromSelector( @selector(lastUsed) ) ascending:NO]
|
||||
[[NSSortDescriptor alloc] initWithKey:NSStringFromSelector( @selector( lastUsed ) ) ascending:NO]
|
||||
];
|
||||
fetchRequest.fetchBatchSize = 10;
|
||||
_fetchedResultsController = [[NSFetchedResultsController alloc]
|
||||
@ -405,13 +402,13 @@ referenceSizeForHeaderInSection:(NSInteger)section {
|
||||
[self setActive:active animated:NO completion:nil];
|
||||
}
|
||||
|
||||
- (void)setActive:(BOOL)active animated:(BOOL)animated completion:(void (^)(BOOL finished))completion {
|
||||
- (void)setActive:(BOOL)active animated:(BOOL)animated completion:(void ( ^ )(BOOL finished))completion {
|
||||
|
||||
_active = active;
|
||||
|
||||
[UIView animateWithDuration:animated? 0.4f: 0 animations:^{
|
||||
[self.navigationBarToTopConstraint layoutWithPriority:active? 1: UILayoutPriorityDefaultHigh];
|
||||
[self.passwordsToBottomConstraint layoutWithPriority:active? 1: UILayoutPriorityDefaultHigh];
|
||||
[[self.navigationBarToTopConstraint updatePriority:active? 1: UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
[[self.passwordsToBottomConstraint updatePriority:active? 1: UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
} completion:completion];
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
||||
metrics:nil views:NSDictionaryOfVariableBindings(popdownView)];
|
||||
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
[passwordsVC.popdownToTopConstraint layoutWithPriority:1];
|
||||
[[passwordsVC.popdownToTopConstraint updatePriority:1] layoutIfNeeded];
|
||||
} completion:^(BOOL finished) {
|
||||
[popdownVC didMoveToParentViewController:passwordsVC];
|
||||
}];
|
||||
@ -49,7 +49,7 @@
|
||||
|
||||
[popdownVC willMoveToParentViewController:nil];
|
||||
[UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionOverrideInheritedDuration animations:^{
|
||||
[passwordsVC.popdownToTopConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[[passwordsVC.popdownToTopConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
} completion:^(BOOL finished) {
|
||||
[popdownVC.view removeFromSuperview];
|
||||
[popdownVC removeFromParentViewController];
|
||||
|
@ -786,7 +786,7 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
// Manage the entry container depending on whether a user is activate or not.
|
||||
switch (activeUserState) {
|
||||
case MPActiveUserStateNone: {
|
||||
self.navigationBarToTopConstraint.priority = UILayoutPriorityDefaultHigh;
|
||||
[[self.navigationBarToTopConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
self.avatarCollectionView.scrollEnabled = YES;
|
||||
self.entryContainer.alpha = 0;
|
||||
self.footerContainer.alpha = 1;
|
||||
@ -796,7 +796,7 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
case MPActiveUserStateUserName:
|
||||
case MPActiveUserStateMasterPasswordChoice:
|
||||
case MPActiveUserStateMasterPasswordConfirmation: {
|
||||
[self.navigationBarToTopConstraint layoutWithPriority:UILayoutPriorityDefaultHigh];
|
||||
[[self.navigationBarToTopConstraint updatePriority:UILayoutPriorityDefaultHigh] layoutIfNeeded];
|
||||
self.avatarCollectionView.scrollEnabled = NO;
|
||||
self.entryContainer.alpha = 1;
|
||||
self.footerContainer.alpha = 1;
|
||||
@ -804,7 +804,7 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
break;
|
||||
}
|
||||
case MPActiveUserStateMinimized: {
|
||||
[self.navigationBarToTopConstraint layoutWithPriority:1];
|
||||
[[self.navigationBarToTopConstraint updatePriority:1] layoutIfNeeded];
|
||||
self.avatarCollectionView.scrollEnabled = NO;
|
||||
self.entryContainer.alpha = 0;
|
||||
self.footerContainer.alpha = 0;
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
[super viewDidLoad];
|
||||
|
||||
[self.view adjustContentInsets];
|
||||
[self.webView.scrollView insetOcclusion];
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
|
@ -7,7 +7,6 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
93D391C07818F4C2DC1B6956 /* MPPasswordsCoachmarkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D397E3650384498E7E53C4 /* MPPasswordsCoachmarkViewController.m */; };
|
||||
93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39156E806BB78E04F78B9 /* PearlSizedTextView.m */; };
|
||||
93D391ED37C9F687FA51EAA1 /* MPEmergencySegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3937712BF1B67623E5764 /* MPEmergencySegue.m */; };
|
||||
93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D390FADEB325D8D54A957D /* PearlOverlay.m */; };
|
||||
@ -19,7 +18,6 @@
|
||||
93D393DB5325820241BA90A7 /* PearlSizedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39A4759186F6D2D34AA6B /* PearlSizedTextView.h */; };
|
||||
93D394982CBD25D46692DD7C /* MPWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */; };
|
||||
93D394B5036C882B33C71872 /* MPPasswordsSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39E7A12CC352B2825AA66 /* MPPasswordsSegue.m */; };
|
||||
93D394F6D3F6E2553AA0D684 /* MPPasswordLargeStoredCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3947F6BB69CA9A9124A5D /* MPPasswordLargeStoredCell.m */; };
|
||||
93D39536EB550E811CCD04BC /* UIResponder+PearlFirstResponder.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D394482BB07F90E8FD1314 /* UIResponder+PearlFirstResponder.h */; };
|
||||
93D3954E96236384AFA00453 /* UIScrollView+PearlAdjustInsets.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D390FB3110DCCE68E600DC /* UIScrollView+PearlAdjustInsets.m */; };
|
||||
93D3954FCE045A3CC7E804B7 /* MPUsersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D399E571F61E50A9BF8FAF /* MPUsersViewController.m */; };
|
||||
@ -31,10 +29,8 @@
|
||||
93D396D8B67DA6522CDBA142 /* MPCoachmarkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3995B1D4DCE5A30D882BA /* MPCoachmarkViewController.m */; };
|
||||
93D397952F5635C793C24DF1 /* NSError+PearlFullDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */; };
|
||||
93D3980046016EFD05B35BC5 /* PearlUICollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39B1D8177A86C5B9EDDE3 /* PearlUICollectionView.h */; };
|
||||
93D398BD8B83FEE8BE4EFFFC /* MPPasswordLargeDeleteCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39EFBC4D6BA3C8581865F /* MPPasswordLargeDeleteCell.m */; };
|
||||
93D398ECD7D1A0DEDDADF516 /* MPEmergencyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39ACBA9F4878B6A1CC33B /* MPEmergencyViewController.m */; };
|
||||
93D399246DC90F50913A1287 /* UIResponder+PearlFirstResponder.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */; };
|
||||
93D399278165FD6D950F0025 /* MPPasswordTypesCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39097C0AAE62C1C321BFC /* MPPasswordTypesCell.m */; };
|
||||
93D3992FA1546E01F498F665 /* PearlNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */; };
|
||||
93D399433EA75E50656040CB /* Twitter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93D394077F8FAB8167647187 /* Twitter.framework */; };
|
||||
93D399BBC0A7EC746CB1B19B /* MPLogsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D391943675426839501BB8 /* MPLogsViewController.h */; };
|
||||
@ -45,14 +41,12 @@
|
||||
93D39B8F90F58A5D158DDBA3 /* MPPasswordsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3924EE15017F8A12CB436 /* MPPasswordsViewController.m */; };
|
||||
93D39BA1EA3CAAC8A220B4A6 /* MPAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3916C1D8F1427DFBDEBCA /* MPAppSettingsViewController.m */; };
|
||||
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D396D04E57792A54D437AC /* NSArray+Indexing.h */; };
|
||||
93D39CB5E2EC1078E898F46A /* MPPasswordLargeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3937863061C3916AF7AD2 /* MPPasswordLargeCell.m */; };
|
||||
93D39D596A2E376D6F6F5DA1 /* MPCombinedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D393310223DDB35218467A /* MPCombinedViewController.m */; };
|
||||
93D39D8F78978196D6ABDEDE /* MPNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39CC01630D0421205C4C4 /* MPNavigationController.m */; };
|
||||
93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */; };
|
||||
93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */; };
|
||||
93D39EAA4D064193074D3021 /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A813CA9D7E192261ED2 /* MPFixable.m */; };
|
||||
93D39F8A9254177891F38705 /* MPSetupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A28369954D147E239BA /* MPSetupViewController.m */; };
|
||||
93D39FA97F4C3F69A75D5A03 /* MPPasswordLargeGeneratedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3993422E207BF0B21D089 /* MPPasswordLargeGeneratedCell.m */; };
|
||||
DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */; };
|
||||
DA071BF3190187FE00179766 /* empty@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF1190187FE00179766 /* empty@2x.png */; };
|
||||
DA071BF4190187FE00179766 /* empty.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF2190187FE00179766 /* empty.png */; };
|
||||
@ -85,6 +79,18 @@
|
||||
DA250A18195665A100AC23F1 /* UITableView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */; };
|
||||
DA250A19195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */; };
|
||||
DA250A1A195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA250A16195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h */; };
|
||||
DA25C5F8197AFFB40046CDCF /* icon_tools.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD384C1711E29700CF925C /* icon_tools.png */; };
|
||||
DA25C5F9197AFFB40046CDCF /* icon_tools@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD384D1711E29700CF925C /* icon_tools@2x.png */; };
|
||||
DA25C5FA197CCAE00046CDCF /* icon_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37541711E29500CF925C /* icon_delete.png */; };
|
||||
DA25C5FB197CCAE00046CDCF /* icon_delete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37551711E29500CF925C /* icon_delete@2x.png */; };
|
||||
DA25C5FC197CCAF70046CDCF /* icon_list-names.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37A61711E29600CF925C /* icon_list-names.png */; };
|
||||
DA25C5FD197CCAF70046CDCF /* icon_list-names@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37A71711E29600CF925C /* icon_list-names@2x.png */; };
|
||||
DA25C5FE197DBF200046CDCF /* icon_thumbs-up.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD384A1711E29700CF925C /* icon_thumbs-up.png */; };
|
||||
DA25C5FF197DBF200046CDCF /* icon_thumbs-up@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD384B1711E29700CF925C /* icon_thumbs-up@2x.png */; };
|
||||
DA25C600197DBF260046CDCF /* icon_trash.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD38501711E29700CF925C /* icon_trash.png */; };
|
||||
DA25C601197DBF260046CDCF /* icon_trash@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD38511711E29700CF925C /* icon_trash@2x.png */; };
|
||||
DA25C6B41980D3C50046CDCF /* openssl in Headers */ = {isa = PBXBuildFile; fileRef = DA25C6B31980D3C10046CDCF /* openssl */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
DA25C6B61980D3DF0046CDCF /* scrypt in Headers */ = {isa = PBXBuildFile; fileRef = DA25C6B51980D3DD0046CDCF /* scrypt */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
DA2CA4DD18D28859007798F8 /* NSArray+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */; };
|
||||
DA2CA4DE18D28859007798F8 /* NSArray+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */; };
|
||||
DA2CA4DF18D28859007798F8 /* NSTimer+PearlBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */; };
|
||||
@ -265,92 +271,12 @@
|
||||
DACA29BF1705E2DE002C6C22 /* UIColor+HSV.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA29BB1705E2DE002C6C22 /* UIColor+HSV.m */; };
|
||||
DAD312C21552A22700A3F9ED /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD312C01552A20800A3F9ED /* libsqlite3.dylib */; };
|
||||
DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = DAE1EF2417E942DE00BC0086 /* Localizable.strings */; };
|
||||
DAEB933318AA537D000490CC /* crypto_aesctr.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E118AA537D000490CC /* crypto_aesctr.h */; };
|
||||
DAEB933418AA537D000490CC /* crypto_scrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E218AA537D000490CC /* crypto_scrypt.h */; };
|
||||
DAEB933518AA537D000490CC /* memlimit.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E318AA537D000490CC /* memlimit.h */; };
|
||||
DAEB933618AA537D000490CC /* readpass.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E418AA537D000490CC /* readpass.h */; };
|
||||
DAEB933718AA537D000490CC /* scryptenc.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E518AA537D000490CC /* scryptenc.h */; };
|
||||
DAEB933818AA537D000490CC /* scryptenc_cpuperf.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E618AA537D000490CC /* scryptenc_cpuperf.h */; };
|
||||
DAEB933918AA537D000490CC /* sha256.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E718AA537D000490CC /* sha256.h */; };
|
||||
DAEB933A18AA537D000490CC /* sysendian.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E818AA537D000490CC /* sysendian.h */; };
|
||||
DAEB933B18AA537D000490CC /* warn.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92E918AA537D000490CC /* warn.h */; };
|
||||
DAEB933C18AA537D000490CC /* aes.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92EB18AA537D000490CC /* aes.h */; };
|
||||
DAEB933D18AA537D000490CC /* asn1.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92EC18AA537D000490CC /* asn1.h */; };
|
||||
DAEB933E18AA537D000490CC /* asn1_mac.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92ED18AA537D000490CC /* asn1_mac.h */; };
|
||||
DAEB933F18AA537D000490CC /* asn1t.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92EE18AA537D000490CC /* asn1t.h */; };
|
||||
DAEB934018AA537D000490CC /* bio.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92EF18AA537D000490CC /* bio.h */; };
|
||||
DAEB934118AA537D000490CC /* blowfish.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F018AA537D000490CC /* blowfish.h */; };
|
||||
DAEB934218AA537D000490CC /* bn.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F118AA537D000490CC /* bn.h */; };
|
||||
DAEB934318AA537D000490CC /* buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F218AA537D000490CC /* buffer.h */; };
|
||||
DAEB934418AA537D000490CC /* camellia.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F318AA537D000490CC /* camellia.h */; };
|
||||
DAEB934518AA537D000490CC /* cast.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F418AA537D000490CC /* cast.h */; };
|
||||
DAEB934618AA537D000490CC /* cms.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F518AA537D000490CC /* cms.h */; };
|
||||
DAEB934718AA537D000490CC /* comp.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F618AA537D000490CC /* comp.h */; };
|
||||
DAEB934818AA537D000490CC /* conf.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F718AA537D000490CC /* conf.h */; };
|
||||
DAEB934918AA537D000490CC /* conf_api.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F818AA537D000490CC /* conf_api.h */; };
|
||||
DAEB934A18AA537D000490CC /* crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92F918AA537D000490CC /* crypto.h */; };
|
||||
DAEB934B18AA537D000490CC /* des.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92FA18AA537D000490CC /* des.h */; };
|
||||
DAEB934C18AA537D000490CC /* des_old.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92FB18AA537D000490CC /* des_old.h */; };
|
||||
DAEB934D18AA537D000490CC /* dh.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92FC18AA537D000490CC /* dh.h */; };
|
||||
DAEB934E18AA537D000490CC /* dsa.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92FD18AA537D000490CC /* dsa.h */; };
|
||||
DAEB934F18AA537D000490CC /* dso.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92FE18AA537D000490CC /* dso.h */; };
|
||||
DAEB935018AA537D000490CC /* dtls1.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB92FF18AA537D000490CC /* dtls1.h */; };
|
||||
DAEB935118AA537D000490CC /* e_os2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930018AA537D000490CC /* e_os2.h */; };
|
||||
DAEB935218AA537D000490CC /* ebcdic.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930118AA537D000490CC /* ebcdic.h */; };
|
||||
DAEB935318AA537D000490CC /* ec.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930218AA537D000490CC /* ec.h */; };
|
||||
DAEB935418AA537D000490CC /* ecdh.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930318AA537D000490CC /* ecdh.h */; };
|
||||
DAEB935518AA537D000490CC /* ecdsa.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930418AA537D000490CC /* ecdsa.h */; };
|
||||
DAEB935618AA537D000490CC /* engine.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930518AA537D000490CC /* engine.h */; };
|
||||
DAEB935718AA537D000490CC /* err.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930618AA537D000490CC /* err.h */; };
|
||||
DAEB935818AA537D000490CC /* evp.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930718AA537D000490CC /* evp.h */; };
|
||||
DAEB935918AA537D000490CC /* hmac.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930818AA537D000490CC /* hmac.h */; };
|
||||
DAEB935A18AA537D000490CC /* idea.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930918AA537D000490CC /* idea.h */; };
|
||||
DAEB935B18AA537D000490CC /* krb5_asn.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930A18AA537D000490CC /* krb5_asn.h */; };
|
||||
DAEB935C18AA537D000490CC /* kssl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930B18AA537D000490CC /* kssl.h */; };
|
||||
DAEB935D18AA537D000490CC /* lhash.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930C18AA537D000490CC /* lhash.h */; };
|
||||
DAEB935E18AA537D000490CC /* md4.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930D18AA537D000490CC /* md4.h */; };
|
||||
DAEB935F18AA537D000490CC /* md5.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930E18AA537D000490CC /* md5.h */; };
|
||||
DAEB936018AA537D000490CC /* mdc2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB930F18AA537D000490CC /* mdc2.h */; };
|
||||
DAEB936118AA537D000490CC /* modes.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931018AA537D000490CC /* modes.h */; };
|
||||
DAEB936218AA537D000490CC /* obj_mac.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931118AA537D000490CC /* obj_mac.h */; };
|
||||
DAEB936318AA537D000490CC /* objects.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931218AA537D000490CC /* objects.h */; };
|
||||
DAEB936418AA537D000490CC /* ocsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931318AA537D000490CC /* ocsp.h */; };
|
||||
DAEB936518AA537D000490CC /* opensslconf.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931418AA537D000490CC /* opensslconf.h */; };
|
||||
DAEB936618AA537D000490CC /* opensslv.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931518AA537D000490CC /* opensslv.h */; };
|
||||
DAEB936718AA537D000490CC /* ossl_typ.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931618AA537D000490CC /* ossl_typ.h */; };
|
||||
DAEB936818AA537D000490CC /* pem.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931718AA537D000490CC /* pem.h */; };
|
||||
DAEB936918AA537D000490CC /* pem2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931818AA537D000490CC /* pem2.h */; };
|
||||
DAEB936A18AA537D000490CC /* pkcs12.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931918AA537D000490CC /* pkcs12.h */; };
|
||||
DAEB936B18AA537D000490CC /* pkcs7.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931A18AA537D000490CC /* pkcs7.h */; };
|
||||
DAEB936C18AA537D000490CC /* pqueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931B18AA537D000490CC /* pqueue.h */; };
|
||||
DAEB936D18AA537D000490CC /* rand.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931C18AA537D000490CC /* rand.h */; };
|
||||
DAEB936E18AA537D000490CC /* rc2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931D18AA537D000490CC /* rc2.h */; };
|
||||
DAEB936F18AA537D000490CC /* rc4.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931E18AA537D000490CC /* rc4.h */; };
|
||||
DAEB937018AA537D000490CC /* ripemd.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB931F18AA537D000490CC /* ripemd.h */; };
|
||||
DAEB937118AA537D000490CC /* rsa.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932018AA537D000490CC /* rsa.h */; };
|
||||
DAEB937218AA537D000490CC /* safestack.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932118AA537D000490CC /* safestack.h */; };
|
||||
DAEB937318AA537D000490CC /* seed.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932218AA537D000490CC /* seed.h */; };
|
||||
DAEB937418AA537D000490CC /* sha.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932318AA537D000490CC /* sha.h */; };
|
||||
DAEB937518AA537D000490CC /* ssl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932418AA537D000490CC /* ssl.h */; };
|
||||
DAEB937618AA537D000490CC /* ssl2.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932518AA537D000490CC /* ssl2.h */; };
|
||||
DAEB937718AA537D000490CC /* ssl23.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932618AA537D000490CC /* ssl23.h */; };
|
||||
DAEB937818AA537D000490CC /* ssl3.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932718AA537D000490CC /* ssl3.h */; };
|
||||
DAEB937918AA537D000490CC /* stack.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932818AA537D000490CC /* stack.h */; };
|
||||
DAEB937A18AA537D000490CC /* symhacks.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932918AA537D000490CC /* symhacks.h */; };
|
||||
DAEB937B18AA537D000490CC /* tls1.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932A18AA537D000490CC /* tls1.h */; };
|
||||
DAEB937C18AA537D000490CC /* ts.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932B18AA537D000490CC /* ts.h */; };
|
||||
DAEB937D18AA537D000490CC /* txt_db.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932C18AA537D000490CC /* txt_db.h */; };
|
||||
DAEB937E18AA537D000490CC /* ui.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932D18AA537D000490CC /* ui.h */; };
|
||||
DAEB937F18AA537D000490CC /* ui_compat.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932E18AA537D000490CC /* ui_compat.h */; };
|
||||
DAEB938018AA537D000490CC /* whrlpool.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB932F18AA537D000490CC /* whrlpool.h */; };
|
||||
DAEB938118AA537D000490CC /* x509.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB933018AA537D000490CC /* x509.h */; };
|
||||
DAEB938218AA537D000490CC /* x509_vfy.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB933118AA537D000490CC /* x509_vfy.h */; };
|
||||
DAEB938318AA537D000490CC /* x509v3.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEB933218AA537D000490CC /* x509v3.h */; };
|
||||
DAE8E65219867AB500416A0F /* libopensslcrypto-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAE8E65119867AB500416A0F /* libopensslcrypto-ios.a */; };
|
||||
DAEBC45314F6364500987BF6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEBC45214F6364500987BF6 /* QuartzCore.framework */; };
|
||||
DAEC85B518E3DD9A007FC0DF /* PearlUIView.m in Sources */ = {isa = PBXBuildFile; fileRef = DAEC85B118E3DD9A007FC0DF /* PearlUIView.m */; };
|
||||
DAEC85B518E3DD9A007FC0DF /* UIView+Touches.m in Sources */ = {isa = PBXBuildFile; fileRef = DAEC85B118E3DD9A007FC0DF /* UIView+Touches.m */; };
|
||||
DAEC85B618E3DD9A007FC0DF /* PearlUINavigationBar.m in Sources */ = {isa = PBXBuildFile; fileRef = DAEC85B218E3DD9A007FC0DF /* PearlUINavigationBar.m */; };
|
||||
DAEC85B718E3DD9A007FC0DF /* PearlUINavigationBar.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEC85B318E3DD9A007FC0DF /* PearlUINavigationBar.h */; };
|
||||
DAEC85B818E3DD9A007FC0DF /* PearlUIView.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEC85B418E3DD9A007FC0DF /* PearlUIView.h */; };
|
||||
DAEC85B818E3DD9A007FC0DF /* UIView+Touches.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEC85B418E3DD9A007FC0DF /* UIView+Touches.h */; };
|
||||
DAF4EF50190A81E400023C90 /* NSManagedObject+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF4EF4E190A81E400023C90 /* NSManagedObject+Pearl.m */; };
|
||||
DAF4EF51190A81E400023C90 /* NSManagedObject+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAF4EF4F190A81E400023C90 /* NSManagedObject+Pearl.h */; };
|
||||
DAFC5656172C573B00CB5CC5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
||||
@ -455,11 +381,8 @@
|
||||
/* Begin PBXFileReference section */
|
||||
93D390519405B76CC6A57C4F /* MPCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCell.h; sourceTree = "<group>"; };
|
||||
93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Indexing.m"; sourceTree = "<group>"; };
|
||||
93D39097C0AAE62C1C321BFC /* MPPasswordTypesCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordTypesCell.m; sourceTree = "<group>"; };
|
||||
93D390FADEB325D8D54A957D /* PearlOverlay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlOverlay.m; sourceTree = "<group>"; };
|
||||
93D390FB3110DCCE68E600DC /* UIScrollView+PearlAdjustInsets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+PearlAdjustInsets.m"; sourceTree = "<group>"; };
|
||||
93D390FD93EFCFECB5193DEF /* MPPasswordsCoachmarkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordsCoachmarkViewController.h; sourceTree = "<group>"; };
|
||||
93D391243F64A77798B4D6A4 /* MPPasswordTypesCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordTypesCell.h; sourceTree = "<group>"; };
|
||||
93D3914D7597F9A28DB9D85E /* MPPasswordsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordsViewController.h; sourceTree = "<group>"; };
|
||||
93D39156E806BB78E04F78B9 /* PearlSizedTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlSizedTextView.m; sourceTree = "<group>"; };
|
||||
93D3916C1D8F1427DFBDEBCA /* MPAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppSettingsViewController.m; sourceTree = "<group>"; };
|
||||
@ -468,27 +391,21 @@
|
||||
93D392876BE5C011DE73B43F /* MPPopdownSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopdownSegue.h; sourceTree = "<group>"; };
|
||||
93D393310223DDB35218467A /* MPCombinedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCombinedViewController.m; sourceTree = "<group>"; };
|
||||
93D3937712BF1B67623E5764 /* MPEmergencySegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEmergencySegue.m; sourceTree = "<group>"; };
|
||||
93D3937863061C3916AF7AD2 /* MPPasswordLargeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeCell.m; sourceTree = "<group>"; };
|
||||
93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = "<group>"; };
|
||||
93D393BB973253D4BAAC84AA /* PearlEMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlEMail.m; sourceTree = "<group>"; };
|
||||
93D394077F8FAB8167647187 /* Twitter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Twitter.framework; path = System/Library/Frameworks/Twitter.framework; sourceTree = SDKROOT; };
|
||||
93D3942A356B639724157982 /* PearlOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlOverlay.h; sourceTree = "<group>"; };
|
||||
93D394482BB07F90E8FD1314 /* UIResponder+PearlFirstResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+PearlFirstResponder.h"; sourceTree = "<group>"; };
|
||||
93D3947F6BB69CA9A9124A5D /* MPPasswordLargeStoredCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeStoredCell.m; sourceTree = "<group>"; };
|
||||
93D3956915634581E737B38C /* PearlNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlNavigationController.m; sourceTree = "<group>"; };
|
||||
93D395BA6B2CFF5F49A4D25F /* MPPasswordLargeStoredCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordLargeStoredCell.h; sourceTree = "<group>"; };
|
||||
93D3966B527CA47A0A661CE2 /* MPPasswordLargeDeleteCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordLargeDeleteCell.h; sourceTree = "<group>"; };
|
||||
93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = "<group>"; };
|
||||
93D3970502644794E8A027BE /* MPNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNavigationController.h; sourceTree = "<group>"; };
|
||||
93D3971FE104BB4052484151 /* MPUsersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUsersViewController.h; sourceTree = "<group>"; };
|
||||
93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = "<group>"; };
|
||||
93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+PearlAttributes.m"; sourceTree = "<group>"; };
|
||||
93D3979190DACEBD1F6AE9F4 /* MPLogsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLogsViewController.m; sourceTree = "<group>"; };
|
||||
93D397E3650384498E7E53C4 /* MPPasswordsCoachmarkViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordsCoachmarkViewController.m; sourceTree = "<group>"; };
|
||||
93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlNavigationController.h; sourceTree = "<group>"; };
|
||||
93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+PearlFullDescription.h"; sourceTree = "<group>"; };
|
||||
93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPWebViewController.m; sourceTree = "<group>"; };
|
||||
93D3993422E207BF0B21D089 /* MPPasswordLargeGeneratedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeGeneratedCell.m; sourceTree = "<group>"; };
|
||||
93D3995B1D4DCE5A30D882BA /* MPCoachmarkViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCoachmarkViewController.m; sourceTree = "<group>"; };
|
||||
93D39975CE5AEC99E3F086C7 /* MPPasswordCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordCell.h; sourceTree = "<group>"; };
|
||||
93D3999693660C89A7465F4E /* MPCoachmarkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCoachmarkViewController.h; sourceTree = "<group>"; };
|
||||
@ -510,15 +427,12 @@
|
||||
93D39C86E984EC65DA5ACB1D /* MPAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppSettingsViewController.h; sourceTree = "<group>"; };
|
||||
93D39CC01630D0421205C4C4 /* MPNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNavigationController.m; sourceTree = "<group>"; };
|
||||
93D39CDD434AFD6E1B0DA359 /* MPEmergencyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEmergencyViewController.h; sourceTree = "<group>"; };
|
||||
93D39CE1138FDA4D3D1B847A /* MPPasswordLargeGeneratedCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordLargeGeneratedCell.h; sourceTree = "<group>"; };
|
||||
93D39CF8ADF4542CDC4CD385 /* MPCombinedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCombinedViewController.h; sourceTree = "<group>"; };
|
||||
93D39D8A953779B35403AF6E /* PearlUICollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlUICollectionView.m; sourceTree = "<group>"; };
|
||||
93D39DA27D768B53C8B1330C /* MPAvatarCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAvatarCell.h; sourceTree = "<group>"; };
|
||||
93D39DE2CB351D4E3789462B /* UIScrollView+PearlAdjustInsets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+PearlAdjustInsets.h"; sourceTree = "<group>"; };
|
||||
93D39DEA995041A13DC9CAF7 /* MPPasswordCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordCell.m; sourceTree = "<group>"; };
|
||||
93D39E02F69CACAB61C056F8 /* MPPasswordLargeCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordLargeCell.h; sourceTree = "<group>"; };
|
||||
93D39E7A12CC352B2825AA66 /* MPPasswordsSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordsSegue.m; sourceTree = "<group>"; };
|
||||
93D39EFBC4D6BA3C8581865F /* MPPasswordLargeDeleteCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeDeleteCell.m; sourceTree = "<group>"; };
|
||||
93D39F556F2F142740A65E59 /* MPWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPWebViewController.h; sourceTree = "<group>"; };
|
||||
93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlEMail.h; sourceTree = "<group>"; };
|
||||
93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+PearlFullDescription.m"; sourceTree = "<group>"; };
|
||||
@ -553,6 +467,8 @@
|
||||
DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+PearlReloadFromArray.h"; sourceTree = "<group>"; };
|
||||
DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UICollectionReusableView+PearlDequeue.m"; sourceTree = "<group>"; };
|
||||
DA250A16195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UICollectionReusableView+PearlDequeue.h"; sourceTree = "<group>"; };
|
||||
DA25C6B31980D3C10046CDCF /* openssl */ = {isa = PBXFileReference; lastKnownFileType = folder; path = openssl; sourceTree = "<group>"; };
|
||||
DA25C6B51980D3DD0046CDCF /* scrypt */ = {isa = PBXFileReference; lastKnownFileType = folder; path = scrypt; sourceTree = "<group>"; };
|
||||
DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Pearl.m"; sourceTree = "<group>"; };
|
||||
DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Pearl.h"; sourceTree = "<group>"; };
|
||||
DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+PearlBlock.m"; sourceTree = "<group>"; };
|
||||
@ -1272,7 +1188,6 @@
|
||||
DABD3BF91711E2DC00CF925C /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||
DABD3BFB1711E2DC00CF925C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
DABD3BFC1711E2DC00CF925C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
DABD3FC617122ADD00CF925C /* libscrypt-bin-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libscrypt-bin-ios.a"; path = "../../../External/Pearl/External/iOSPorts/ports/security/scrypt/build/Release-iphoneos/libscrypt-bin-ios.a"; sourceTree = "<group>"; };
|
||||
DABD3FC81712446200CF925C /* cloud.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cloud.png; sourceTree = "<group>"; };
|
||||
DABD3FC91712446200CF925C /* cloud@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cloud@2x.png"; sourceTree = "<group>"; };
|
||||
DABD3FCC1714F45B00CF925C /* identity.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = identity.png; sourceTree = "<group>"; };
|
||||
@ -1298,92 +1213,12 @@
|
||||
DAD312C01552A20800A3F9ED /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
|
||||
DADBB55918DB0CFC00D099FE /* keyboard-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keyboard-dark@2x.png"; sourceTree = "<group>"; };
|
||||
DAE1EF2317E942DE00BC0086 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
DAEB92E118AA537D000490CC /* crypto_aesctr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto_aesctr.h; sourceTree = "<group>"; };
|
||||
DAEB92E218AA537D000490CC /* crypto_scrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto_scrypt.h; sourceTree = "<group>"; };
|
||||
DAEB92E318AA537D000490CC /* memlimit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memlimit.h; sourceTree = "<group>"; };
|
||||
DAEB92E418AA537D000490CC /* readpass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readpass.h; sourceTree = "<group>"; };
|
||||
DAEB92E518AA537D000490CC /* scryptenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scryptenc.h; sourceTree = "<group>"; };
|
||||
DAEB92E618AA537D000490CC /* scryptenc_cpuperf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scryptenc_cpuperf.h; sourceTree = "<group>"; };
|
||||
DAEB92E718AA537D000490CC /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha256.h; sourceTree = "<group>"; };
|
||||
DAEB92E818AA537D000490CC /* sysendian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysendian.h; sourceTree = "<group>"; };
|
||||
DAEB92E918AA537D000490CC /* warn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = warn.h; sourceTree = "<group>"; };
|
||||
DAEB92EB18AA537D000490CC /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
|
||||
DAEB92EC18AA537D000490CC /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = "<group>"; };
|
||||
DAEB92ED18AA537D000490CC /* asn1_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1_mac.h; sourceTree = "<group>"; };
|
||||
DAEB92EE18AA537D000490CC /* asn1t.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1t.h; sourceTree = "<group>"; };
|
||||
DAEB92EF18AA537D000490CC /* bio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bio.h; sourceTree = "<group>"; };
|
||||
DAEB92F018AA537D000490CC /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = "<group>"; };
|
||||
DAEB92F118AA537D000490CC /* bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn.h; sourceTree = "<group>"; };
|
||||
DAEB92F218AA537D000490CC /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = "<group>"; };
|
||||
DAEB92F318AA537D000490CC /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = "<group>"; };
|
||||
DAEB92F418AA537D000490CC /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = "<group>"; };
|
||||
DAEB92F518AA537D000490CC /* cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cms.h; sourceTree = "<group>"; };
|
||||
DAEB92F618AA537D000490CC /* comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comp.h; sourceTree = "<group>"; };
|
||||
DAEB92F718AA537D000490CC /* conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; };
|
||||
DAEB92F818AA537D000490CC /* conf_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf_api.h; sourceTree = "<group>"; };
|
||||
DAEB92F918AA537D000490CC /* crypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = "<group>"; };
|
||||
DAEB92FA18AA537D000490CC /* des.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = "<group>"; };
|
||||
DAEB92FB18AA537D000490CC /* des_old.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des_old.h; sourceTree = "<group>"; };
|
||||
DAEB92FC18AA537D000490CC /* dh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dh.h; sourceTree = "<group>"; };
|
||||
DAEB92FD18AA537D000490CC /* dsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsa.h; sourceTree = "<group>"; };
|
||||
DAEB92FE18AA537D000490CC /* dso.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dso.h; sourceTree = "<group>"; };
|
||||
DAEB92FF18AA537D000490CC /* dtls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dtls1.h; sourceTree = "<group>"; };
|
||||
DAEB930018AA537D000490CC /* e_os2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = e_os2.h; sourceTree = "<group>"; };
|
||||
DAEB930118AA537D000490CC /* ebcdic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ebcdic.h; sourceTree = "<group>"; };
|
||||
DAEB930218AA537D000490CC /* ec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ec.h; sourceTree = "<group>"; };
|
||||
DAEB930318AA537D000490CC /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = "<group>"; };
|
||||
DAEB930418AA537D000490CC /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = "<group>"; };
|
||||
DAEB930518AA537D000490CC /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = "<group>"; };
|
||||
DAEB930618AA537D000490CC /* err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = "<group>"; };
|
||||
DAEB930718AA537D000490CC /* evp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evp.h; sourceTree = "<group>"; };
|
||||
DAEB930818AA537D000490CC /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = "<group>"; };
|
||||
DAEB930918AA537D000490CC /* idea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idea.h; sourceTree = "<group>"; };
|
||||
DAEB930A18AA537D000490CC /* krb5_asn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = krb5_asn.h; sourceTree = "<group>"; };
|
||||
DAEB930B18AA537D000490CC /* kssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kssl.h; sourceTree = "<group>"; };
|
||||
DAEB930C18AA537D000490CC /* lhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lhash.h; sourceTree = "<group>"; };
|
||||
DAEB930D18AA537D000490CC /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = "<group>"; };
|
||||
DAEB930E18AA537D000490CC /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = "<group>"; };
|
||||
DAEB930F18AA537D000490CC /* mdc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdc2.h; sourceTree = "<group>"; };
|
||||
DAEB931018AA537D000490CC /* modes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modes.h; sourceTree = "<group>"; };
|
||||
DAEB931118AA537D000490CC /* obj_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = obj_mac.h; sourceTree = "<group>"; };
|
||||
DAEB931218AA537D000490CC /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = "<group>"; };
|
||||
DAEB931318AA537D000490CC /* ocsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocsp.h; sourceTree = "<group>"; };
|
||||
DAEB931418AA537D000490CC /* opensslconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf.h; sourceTree = "<group>"; };
|
||||
DAEB931518AA537D000490CC /* opensslv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslv.h; sourceTree = "<group>"; };
|
||||
DAEB931618AA537D000490CC /* ossl_typ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ossl_typ.h; sourceTree = "<group>"; };
|
||||
DAEB931718AA537D000490CC /* pem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = "<group>"; };
|
||||
DAEB931818AA537D000490CC /* pem2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem2.h; sourceTree = "<group>"; };
|
||||
DAEB931918AA537D000490CC /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = "<group>"; };
|
||||
DAEB931A18AA537D000490CC /* pkcs7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs7.h; sourceTree = "<group>"; };
|
||||
DAEB931B18AA537D000490CC /* pqueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pqueue.h; sourceTree = "<group>"; };
|
||||
DAEB931C18AA537D000490CC /* rand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rand.h; sourceTree = "<group>"; };
|
||||
DAEB931D18AA537D000490CC /* rc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc2.h; sourceTree = "<group>"; };
|
||||
DAEB931E18AA537D000490CC /* rc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc4.h; sourceTree = "<group>"; };
|
||||
DAEB931F18AA537D000490CC /* ripemd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ripemd.h; sourceTree = "<group>"; };
|
||||
DAEB932018AA537D000490CC /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = "<group>"; };
|
||||
DAEB932118AA537D000490CC /* safestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safestack.h; sourceTree = "<group>"; };
|
||||
DAEB932218AA537D000490CC /* seed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seed.h; sourceTree = "<group>"; };
|
||||
DAEB932318AA537D000490CC /* sha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha.h; sourceTree = "<group>"; };
|
||||
DAEB932418AA537D000490CC /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = "<group>"; };
|
||||
DAEB932518AA537D000490CC /* ssl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl2.h; sourceTree = "<group>"; };
|
||||
DAEB932618AA537D000490CC /* ssl23.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl23.h; sourceTree = "<group>"; };
|
||||
DAEB932718AA537D000490CC /* ssl3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl3.h; sourceTree = "<group>"; };
|
||||
DAEB932818AA537D000490CC /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = "<group>"; };
|
||||
DAEB932918AA537D000490CC /* symhacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symhacks.h; sourceTree = "<group>"; };
|
||||
DAEB932A18AA537D000490CC /* tls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tls1.h; sourceTree = "<group>"; };
|
||||
DAEB932B18AA537D000490CC /* ts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ts.h; sourceTree = "<group>"; };
|
||||
DAEB932C18AA537D000490CC /* txt_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = txt_db.h; sourceTree = "<group>"; };
|
||||
DAEB932D18AA537D000490CC /* ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = "<group>"; };
|
||||
DAEB932E18AA537D000490CC /* ui_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui_compat.h; sourceTree = "<group>"; };
|
||||
DAEB932F18AA537D000490CC /* whrlpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = whrlpool.h; sourceTree = "<group>"; };
|
||||
DAEB933018AA537D000490CC /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = "<group>"; };
|
||||
DAEB933118AA537D000490CC /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = "<group>"; };
|
||||
DAEB933218AA537D000490CC /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = "<group>"; };
|
||||
DAE8E65119867AB500416A0F /* libopensslcrypto-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libopensslcrypto-ios.a"; sourceTree = "<group>"; };
|
||||
DAEBC45214F6364500987BF6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
DAEC85B118E3DD9A007FC0DF /* PearlUIView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlUIView.m; sourceTree = "<group>"; };
|
||||
DAEC85B118E3DD9A007FC0DF /* UIView+Touches.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Touches.m"; sourceTree = "<group>"; };
|
||||
DAEC85B218E3DD9A007FC0DF /* PearlUINavigationBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlUINavigationBar.m; sourceTree = "<group>"; };
|
||||
DAEC85B318E3DD9A007FC0DF /* PearlUINavigationBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUINavigationBar.h; sourceTree = "<group>"; };
|
||||
DAEC85B418E3DD9A007FC0DF /* PearlUIView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUIView.h; sourceTree = "<group>"; };
|
||||
DAEC85B418E3DD9A007FC0DF /* UIView+Touches.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Touches.h"; sourceTree = "<group>"; };
|
||||
DAF4EF4E190A81E400023C90 /* NSManagedObject+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+Pearl.m"; sourceTree = "<group>"; };
|
||||
DAF4EF4F190A81E400023C90 /* NSManagedObject+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+Pearl.h"; sourceTree = "<group>"; };
|
||||
DAFC5655172C573B00CB5CC5 /* libInAppSettingsKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libInAppSettingsKit.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -1524,6 +1359,7 @@
|
||||
DABB981615100B4000B05417 /* SystemConfiguration.framework in Frameworks */,
|
||||
DA672D3014F9413D004A189C /* libPearl.a in Frameworks */,
|
||||
DA672D2F14F92C6B004A189C /* libz.dylib in Frameworks */,
|
||||
DAE8E65219867AB500416A0F /* libopensslcrypto-ios.a in Frameworks */,
|
||||
DAEBC45314F6364500987BF6 /* QuartzCore.framework in Frameworks */,
|
||||
DA95D5F214DF0B2C008D1B94 /* MessageUI.framework in Frameworks */,
|
||||
DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */,
|
||||
@ -1614,8 +1450,6 @@
|
||||
DACA22121705DDC5002C6C22 /* External */,
|
||||
DA5BFA47147E415C00F98B1E /* Frameworks */,
|
||||
DA5BFA45147E415C00F98B1E /* Products */,
|
||||
93D3966B527CA47A0A661CE2 /* MPPasswordLargeDeleteCell.h */,
|
||||
93D39EFBC4D6BA3C8581865F /* MPPasswordLargeDeleteCell.m */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -1637,7 +1471,6 @@
|
||||
children = (
|
||||
DA3B844D190FC5DF00246EEA /* Crashlytics.framework */,
|
||||
DA70EC7F1811B13C00F65DB2 /* StoreKit.framework */,
|
||||
DABD3FC617122ADD00CF925C /* libscrypt-bin-ios.a */,
|
||||
DA6701DF16406BB400B61001 /* AdSupport.framework */,
|
||||
DA6701DD16406B7300B61001 /* Social.framework */,
|
||||
DA6701B716406A4100B61001 /* Accounts.framework */,
|
||||
@ -1661,6 +1494,7 @@
|
||||
DA5E5C6317248959003798D8 /* lib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAE8E65119867AB500416A0F /* libopensslcrypto-ios.a */,
|
||||
DAFFC63E17EDDA7C007BB020 /* libscryptenc-ios.a */,
|
||||
DA5E5C6417248959003798D8 /* include */,
|
||||
);
|
||||
@ -1670,8 +1504,8 @@
|
||||
DA5E5C6417248959003798D8 /* include */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB92E018AA537D000490CC /* scrypt */,
|
||||
DAEB92EA18AA537D000490CC /* openssl */,
|
||||
DA25C6B51980D3DD0046CDCF /* scrypt */,
|
||||
DA25C6B31980D3C10046CDCF /* openssl */,
|
||||
);
|
||||
path = include;
|
||||
sourceTree = "<group>";
|
||||
@ -2441,6 +2275,7 @@
|
||||
DABD3BD71711E2DC00CF925C /* iOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */,
|
||||
93D39975CE5AEC99E3F086C7 /* MPPasswordCell.h */,
|
||||
93D39DEA995041A13DC9CAF7 /* MPPasswordCell.m */,
|
||||
93D39ACBA9F4878B6A1CC33B /* MPEmergencyViewController.m */,
|
||||
@ -2469,21 +2304,12 @@
|
||||
93D3914D7597F9A28DB9D85E /* MPPasswordsViewController.h */,
|
||||
93D393310223DDB35218467A /* MPCombinedViewController.m */,
|
||||
93D39CF8ADF4542CDC4CD385 /* MPCombinedViewController.h */,
|
||||
DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */,
|
||||
93D39B381350802A194BF332 /* MPAvatarCell.m */,
|
||||
93D39DA27D768B53C8B1330C /* MPAvatarCell.h */,
|
||||
93D3993422E207BF0B21D089 /* MPPasswordLargeGeneratedCell.m */,
|
||||
93D39CE1138FDA4D3D1B847A /* MPPasswordLargeGeneratedCell.h */,
|
||||
93D399E571F61E50A9BF8FAF /* MPUsersViewController.m */,
|
||||
93D3971FE104BB4052484151 /* MPUsersViewController.h */,
|
||||
93D39E02F69CACAB61C056F8 /* MPPasswordLargeCell.h */,
|
||||
93D3937863061C3916AF7AD2 /* MPPasswordLargeCell.m */,
|
||||
93D395BA6B2CFF5F49A4D25F /* MPPasswordLargeStoredCell.h */,
|
||||
93D3947F6BB69CA9A9124A5D /* MPPasswordLargeStoredCell.m */,
|
||||
93D39BAA71DE51B4D8A1286C /* MPCell.m */,
|
||||
93D390519405B76CC6A57C4F /* MPCell.h */,
|
||||
93D39097C0AAE62C1C321BFC /* MPPasswordTypesCell.m */,
|
||||
93D391243F64A77798B4D6A4 /* MPPasswordTypesCell.h */,
|
||||
93D3937712BF1B67623E5764 /* MPEmergencySegue.m */,
|
||||
93D39A41340CF778E00D0E6D /* MPEmergencySegue.h */,
|
||||
93D39E7A12CC352B2825AA66 /* MPPasswordsSegue.m */,
|
||||
@ -2494,8 +2320,6 @@
|
||||
93D39C86E984EC65DA5ACB1D /* MPAppSettingsViewController.h */,
|
||||
93D3995B1D4DCE5A30D882BA /* MPCoachmarkViewController.m */,
|
||||
93D3999693660C89A7465F4E /* MPCoachmarkViewController.h */,
|
||||
93D397E3650384498E7E53C4 /* MPPasswordsCoachmarkViewController.m */,
|
||||
93D390FD93EFCFECB5193DEF /* MPPasswordsCoachmarkViewController.h */,
|
||||
93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */,
|
||||
93D39F556F2F142740A65E59 /* MPWebViewController.h */,
|
||||
93D39CC01630D0421205C4C4 /* MPNavigationController.m */,
|
||||
@ -2593,101 +2417,6 @@
|
||||
path = "External/uicolor-utilities";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DAEB92E018AA537D000490CC /* scrypt */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB92E118AA537D000490CC /* crypto_aesctr.h */,
|
||||
DAEB92E218AA537D000490CC /* crypto_scrypt.h */,
|
||||
DAEB92E318AA537D000490CC /* memlimit.h */,
|
||||
DAEB92E418AA537D000490CC /* readpass.h */,
|
||||
DAEB92E518AA537D000490CC /* scryptenc.h */,
|
||||
DAEB92E618AA537D000490CC /* scryptenc_cpuperf.h */,
|
||||
DAEB92E718AA537D000490CC /* sha256.h */,
|
||||
DAEB92E818AA537D000490CC /* sysendian.h */,
|
||||
DAEB92E918AA537D000490CC /* warn.h */,
|
||||
);
|
||||
path = scrypt;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DAEB92EA18AA537D000490CC /* openssl */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAEB92EB18AA537D000490CC /* aes.h */,
|
||||
DAEB92EC18AA537D000490CC /* asn1.h */,
|
||||
DAEB92ED18AA537D000490CC /* asn1_mac.h */,
|
||||
DAEB92EE18AA537D000490CC /* asn1t.h */,
|
||||
DAEB92EF18AA537D000490CC /* bio.h */,
|
||||
DAEB92F018AA537D000490CC /* blowfish.h */,
|
||||
DAEB92F118AA537D000490CC /* bn.h */,
|
||||
DAEB92F218AA537D000490CC /* buffer.h */,
|
||||
DAEB92F318AA537D000490CC /* camellia.h */,
|
||||
DAEB92F418AA537D000490CC /* cast.h */,
|
||||
DAEB92F518AA537D000490CC /* cms.h */,
|
||||
DAEB92F618AA537D000490CC /* comp.h */,
|
||||
DAEB92F718AA537D000490CC /* conf.h */,
|
||||
DAEB92F818AA537D000490CC /* conf_api.h */,
|
||||
DAEB92F918AA537D000490CC /* crypto.h */,
|
||||
DAEB92FA18AA537D000490CC /* des.h */,
|
||||
DAEB92FB18AA537D000490CC /* des_old.h */,
|
||||
DAEB92FC18AA537D000490CC /* dh.h */,
|
||||
DAEB92FD18AA537D000490CC /* dsa.h */,
|
||||
DAEB92FE18AA537D000490CC /* dso.h */,
|
||||
DAEB92FF18AA537D000490CC /* dtls1.h */,
|
||||
DAEB930018AA537D000490CC /* e_os2.h */,
|
||||
DAEB930118AA537D000490CC /* ebcdic.h */,
|
||||
DAEB930218AA537D000490CC /* ec.h */,
|
||||
DAEB930318AA537D000490CC /* ecdh.h */,
|
||||
DAEB930418AA537D000490CC /* ecdsa.h */,
|
||||
DAEB930518AA537D000490CC /* engine.h */,
|
||||
DAEB930618AA537D000490CC /* err.h */,
|
||||
DAEB930718AA537D000490CC /* evp.h */,
|
||||
DAEB930818AA537D000490CC /* hmac.h */,
|
||||
DAEB930918AA537D000490CC /* idea.h */,
|
||||
DAEB930A18AA537D000490CC /* krb5_asn.h */,
|
||||
DAEB930B18AA537D000490CC /* kssl.h */,
|
||||
DAEB930C18AA537D000490CC /* lhash.h */,
|
||||
DAEB930D18AA537D000490CC /* md4.h */,
|
||||
DAEB930E18AA537D000490CC /* md5.h */,
|
||||
DAEB930F18AA537D000490CC /* mdc2.h */,
|
||||
DAEB931018AA537D000490CC /* modes.h */,
|
||||
DAEB931118AA537D000490CC /* obj_mac.h */,
|
||||
DAEB931218AA537D000490CC /* objects.h */,
|
||||
DAEB931318AA537D000490CC /* ocsp.h */,
|
||||
DAEB931418AA537D000490CC /* opensslconf.h */,
|
||||
DAEB931518AA537D000490CC /* opensslv.h */,
|
||||
DAEB931618AA537D000490CC /* ossl_typ.h */,
|
||||
DAEB931718AA537D000490CC /* pem.h */,
|
||||
DAEB931818AA537D000490CC /* pem2.h */,
|
||||
DAEB931918AA537D000490CC /* pkcs12.h */,
|
||||
DAEB931A18AA537D000490CC /* pkcs7.h */,
|
||||
DAEB931B18AA537D000490CC /* pqueue.h */,
|
||||
DAEB931C18AA537D000490CC /* rand.h */,
|
||||
DAEB931D18AA537D000490CC /* rc2.h */,
|
||||
DAEB931E18AA537D000490CC /* rc4.h */,
|
||||
DAEB931F18AA537D000490CC /* ripemd.h */,
|
||||
DAEB932018AA537D000490CC /* rsa.h */,
|
||||
DAEB932118AA537D000490CC /* safestack.h */,
|
||||
DAEB932218AA537D000490CC /* seed.h */,
|
||||
DAEB932318AA537D000490CC /* sha.h */,
|
||||
DAEB932418AA537D000490CC /* ssl.h */,
|
||||
DAEB932518AA537D000490CC /* ssl2.h */,
|
||||
DAEB932618AA537D000490CC /* ssl23.h */,
|
||||
DAEB932718AA537D000490CC /* ssl3.h */,
|
||||
DAEB932818AA537D000490CC /* stack.h */,
|
||||
DAEB932918AA537D000490CC /* symhacks.h */,
|
||||
DAEB932A18AA537D000490CC /* tls1.h */,
|
||||
DAEB932B18AA537D000490CC /* ts.h */,
|
||||
DAEB932C18AA537D000490CC /* txt_db.h */,
|
||||
DAEB932D18AA537D000490CC /* ui.h */,
|
||||
DAEB932E18AA537D000490CC /* ui_compat.h */,
|
||||
DAEB932F18AA537D000490CC /* whrlpool.h */,
|
||||
DAEB933018AA537D000490CC /* x509.h */,
|
||||
DAEB933118AA537D000490CC /* x509_vfy.h */,
|
||||
DAEB933218AA537D000490CC /* x509v3.h */,
|
||||
);
|
||||
path = openssl;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -2846,10 +2575,10 @@
|
||||
DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */,
|
||||
DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */,
|
||||
DA250A16195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h */,
|
||||
DAEC85B118E3DD9A007FC0DF /* PearlUIView.m */,
|
||||
DAEC85B118E3DD9A007FC0DF /* UIView+Touches.m */,
|
||||
DAEC85B218E3DD9A007FC0DF /* PearlUINavigationBar.m */,
|
||||
DAEC85B318E3DD9A007FC0DF /* PearlUINavigationBar.h */,
|
||||
DAEC85B418E3DD9A007FC0DF /* PearlUIView.h */,
|
||||
DAEC85B418E3DD9A007FC0DF /* UIView+Touches.h */,
|
||||
DA2CA4E518D2AC10007798F8 /* NSLayoutConstraint+PearlUIKit.m */,
|
||||
DA2CA4E218D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h */,
|
||||
93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */,
|
||||
@ -2954,146 +2683,67 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DAEB938118AA537D000490CC /* x509.h in Headers */,
|
||||
DA25C6B61980D3DF0046CDCF /* scrypt in Headers */,
|
||||
DA25C6B41980D3C50046CDCF /* openssl in Headers */,
|
||||
DAFE4A1315039824003ABA7C /* NSObject+PearlExport.h in Headers */,
|
||||
DAEB936118AA537D000490CC /* modes.h in Headers */,
|
||||
DAFE4A1515039824003ABA7C /* NSString+PearlNSArrayFormat.h in Headers */,
|
||||
DAFE4A1715039824003ABA7C /* NSString+PearlSEL.h in Headers */,
|
||||
DAEB936F18AA537D000490CC /* rc4.h in Headers */,
|
||||
DAEB933318AA537D000490CC /* crypto_aesctr.h in Headers */,
|
||||
DAEB936718AA537D000490CC /* ossl_typ.h in Headers */,
|
||||
DA250A1A195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h in Headers */,
|
||||
DAEB937018AA537D000490CC /* ripemd.h in Headers */,
|
||||
DAEB933F18AA537D000490CC /* asn1t.h in Headers */,
|
||||
DAEB936418AA537D000490CC /* ocsp.h in Headers */,
|
||||
DAEB934518AA537D000490CC /* cast.h in Headers */,
|
||||
DAEB936E18AA537D000490CC /* rc2.h in Headers */,
|
||||
DAEB937718AA537D000490CC /* ssl23.h in Headers */,
|
||||
DAEB937918AA537D000490CC /* stack.h in Headers */,
|
||||
DAEB936B18AA537D000490CC /* pkcs7.h in Headers */,
|
||||
DAFE4A1915039824003ABA7C /* Pearl.h in Headers */,
|
||||
DAFE4A1A15039824003ABA7C /* PearlAbstractStrings.h in Headers */,
|
||||
DAEB938218AA537D000490CC /* x509_vfy.h in Headers */,
|
||||
DAEB937118AA537D000490CC /* rsa.h in Headers */,
|
||||
DAEB936318AA537D000490CC /* objects.h in Headers */,
|
||||
DAFE4A1E15039824003ABA7C /* PearlCodeUtils.h in Headers */,
|
||||
DAEB935018AA537D000490CC /* dtls1.h in Headers */,
|
||||
DAFE4A2015039824003ABA7C /* PearlConfig.h in Headers */,
|
||||
DAFE4A2215039824003ABA7C /* PearlDeviceUtils.h in Headers */,
|
||||
DAEB934E18AA537D000490CC /* dsa.h in Headers */,
|
||||
DAEB935A18AA537D000490CC /* idea.h in Headers */,
|
||||
DAEB933A18AA537D000490CC /* sysendian.h in Headers */,
|
||||
DAFE4A2415039824003ABA7C /* PearlInfoPlist.h in Headers */,
|
||||
DA2CA4E418D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h in Headers */,
|
||||
DAFE4A2615039824003ABA7C /* PearlLogger.h in Headers */,
|
||||
DAFE4A2815039824003ABA7C /* PearlMathUtils.h in Headers */,
|
||||
DAEB934418AA537D000490CC /* camellia.h in Headers */,
|
||||
DAFE4A2A15039824003ABA7C /* PearlObjectUtils.h in Headers */,
|
||||
DA250A18195665A100AC23F1 /* UITableView+PearlReloadFromArray.h in Headers */,
|
||||
DAEB936D18AA537D000490CC /* rand.h in Headers */,
|
||||
DAFE4A2C15039824003ABA7C /* PearlResettable.h in Headers */,
|
||||
DAFE4A2D15039824003ABA7C /* PearlStrings.h in Headers */,
|
||||
DAFE4A2F15039824003ABA7C /* PearlStringUtils.h in Headers */,
|
||||
DAEB935318AA537D000490CC /* ec.h in Headers */,
|
||||
DAEB937818AA537D000490CC /* ssl3.h in Headers */,
|
||||
DAEB935E18AA537D000490CC /* md4.h in Headers */,
|
||||
DA2CA4E018D28859007798F8 /* NSTimer+PearlBlock.h in Headers */,
|
||||
DAEB933518AA537D000490CC /* memlimit.h in Headers */,
|
||||
DAFE4A3315039824003ABA7C /* Pearl-Crypto.h in Headers */,
|
||||
DAEB937318AA537D000490CC /* seed.h in Headers */,
|
||||
DAEB935918AA537D000490CC /* hmac.h in Headers */,
|
||||
DAEB936018AA537D000490CC /* mdc2.h in Headers */,
|
||||
DAFE4A3415039824003ABA7C /* PearlCryptUtils.h in Headers */,
|
||||
DAEB933918AA537D000490CC /* sha256.h in Headers */,
|
||||
DAFE4A3615039824003ABA7C /* PearlKeyChain.h in Headers */,
|
||||
DAEB936818AA537D000490CC /* pem.h in Headers */,
|
||||
DAFE4A3815039824003ABA7C /* PearlRSAKey.h in Headers */,
|
||||
DAEB934618AA537D000490CC /* cms.h in Headers */,
|
||||
DAEB935F18AA537D000490CC /* md5.h in Headers */,
|
||||
DAEB934B18AA537D000490CC /* des.h in Headers */,
|
||||
DAEB934018AA537D000490CC /* bio.h in Headers */,
|
||||
DAFE4A3A15039824003ABA7C /* PearlSCrypt.h in Headers */,
|
||||
DAEB933C18AA537D000490CC /* aes.h in Headers */,
|
||||
DAEB937618AA537D000490CC /* ssl2.h in Headers */,
|
||||
DAFE4A3C15039824003ABA7C /* Pearl-UIKit-Dependencies.h in Headers */,
|
||||
DAEC85B818E3DD9A007FC0DF /* PearlUIView.h in Headers */,
|
||||
DAEB935B18AA537D000490CC /* krb5_asn.h in Headers */,
|
||||
DAEB935818AA537D000490CC /* evp.h in Headers */,
|
||||
DAEB934118AA537D000490CC /* blowfish.h in Headers */,
|
||||
DAEB935218AA537D000490CC /* ebcdic.h in Headers */,
|
||||
DAEB937218AA537D000490CC /* safestack.h in Headers */,
|
||||
DAEC85B818E3DD9A007FC0DF /* UIView+Touches.h in Headers */,
|
||||
DAFE4A3D15039824003ABA7C /* Pearl-UIKit.h in Headers */,
|
||||
DAFE4A3E15039824003ABA7C /* PearlAlert.h in Headers */,
|
||||
DAFE4A4015039824003ABA7C /* PearlArrayTVC.h in Headers */,
|
||||
DAEB934718AA537D000490CC /* comp.h in Headers */,
|
||||
DAEB933E18AA537D000490CC /* asn1_mac.h in Headers */,
|
||||
DAFE4A4215039824003ABA7C /* PearlBoxView.h in Headers */,
|
||||
DAEB936618AA537D000490CC /* opensslv.h in Headers */,
|
||||
DAEB936518AA537D000490CC /* opensslconf.h in Headers */,
|
||||
DAEB935D18AA537D000490CC /* lhash.h in Headers */,
|
||||
DAEB937E18AA537D000490CC /* ui.h in Headers */,
|
||||
DAEB935518AA537D000490CC /* ecdsa.h in Headers */,
|
||||
DAEB935718AA537D000490CC /* err.h in Headers */,
|
||||
DAFE4A4415039824003ABA7C /* PearlGradientView.h in Headers */,
|
||||
DAEB937C18AA537D000490CC /* ts.h in Headers */,
|
||||
DAFE4A4615039824003ABA7C /* PearlLayout.h in Headers */,
|
||||
DAEB937A18AA537D000490CC /* symhacks.h in Headers */,
|
||||
DAFE4A4815039824003ABA7C /* PearlLayoutView.h in Headers */,
|
||||
DAEB933618AA537D000490CC /* readpass.h in Headers */,
|
||||
DAFE4A4A15039824003ABA7C /* PearlMessageView.h in Headers */,
|
||||
DAEB934818AA537D000490CC /* conf.h in Headers */,
|
||||
DAFE4A4C15039824003ABA7C /* PearlRootViewController.h in Headers */,
|
||||
DAFE4A4E15039824003ABA7C /* PearlSheet.h in Headers */,
|
||||
DAFE4A5015039824003ABA7C /* PearlUIDebug.h in Headers */,
|
||||
DAFE4A5215039824003ABA7C /* PearlUIUtils.h in Headers */,
|
||||
DAEB937418AA537D000490CC /* sha.h in Headers */,
|
||||
DAEB938018AA537D000490CC /* whrlpool.h in Headers */,
|
||||
DAEB933718AA537D000490CC /* scryptenc.h in Headers */,
|
||||
DAFE4A5415039824003ABA7C /* PearlValidatingTextField.h in Headers */,
|
||||
DAEB933D18AA537D000490CC /* asn1.h in Headers */,
|
||||
DAEB933B18AA537D000490CC /* warn.h in Headers */,
|
||||
DAFE4A5615039824003ABA7C /* PearlWebViewController.h in Headers */,
|
||||
DAEB934318AA537D000490CC /* buffer.h in Headers */,
|
||||
DAEB936A18AA537D000490CC /* pkcs12.h in Headers */,
|
||||
DAFE4A5815039824003ABA7C /* UIImage+PearlScaling.h in Headers */,
|
||||
DAFE4A63150399FF003ABA7C /* PearlAppDelegate.h in Headers */,
|
||||
DA30E9CE15722ECA00A68B4C /* NSBundle+PearlMutableInfo.h in Headers */,
|
||||
DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */,
|
||||
DAEB936918AA537D000490CC /* pem2.h in Headers */,
|
||||
DAEB937F18AA537D000490CC /* ui_compat.h in Headers */,
|
||||
DAA141211922FF020032B392 /* PearlTween.h in Headers */,
|
||||
DAFE4A63150399FF003ABA84 /* UIControl+PearlBlocks.h in Headers */,
|
||||
DAEB934A18AA537D000490CC /* crypto.h in Headers */,
|
||||
DAEB935618AA537D000490CC /* engine.h in Headers */,
|
||||
DAEB935118AA537D000490CC /* e_os2.h in Headers */,
|
||||
DAFE4A63150399FF003ABA88 /* NSObject+PearlKVO.h in Headers */,
|
||||
DAFE4A63150399FF003ABA8C /* UIControl+PearlSelect.h in Headers */,
|
||||
DAFE4A63150399FF003ABA90 /* UIScrollView+PearlFlashingIndicators.h in Headers */,
|
||||
DAEB934F18AA537D000490CC /* dso.h in Headers */,
|
||||
DAFE4A63150399FF003ABA94 /* NSDateFormatter+RFC3339.h in Headers */,
|
||||
DAEB934C18AA537D000490CC /* des_old.h in Headers */,
|
||||
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */,
|
||||
DAEB936C18AA537D000490CC /* pqueue.h in Headers */,
|
||||
DAEB937B18AA537D000490CC /* tls1.h in Headers */,
|
||||
DAEB933818AA537D000490CC /* scryptenc_cpuperf.h in Headers */,
|
||||
DA2CA4DE18D28859007798F8 /* NSArray+Pearl.h in Headers */,
|
||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */,
|
||||
DAEB935418AA537D000490CC /* ecdh.h in Headers */,
|
||||
DAEB937D18AA537D000490CC /* txt_db.h in Headers */,
|
||||
93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */,
|
||||
DAEB934D18AA537D000490CC /* dh.h in Headers */,
|
||||
DAEB938318AA537D000490CC /* x509v3.h in Headers */,
|
||||
DAEB935C18AA537D000490CC /* kssl.h in Headers */,
|
||||
DAEB933418AA537D000490CC /* crypto_scrypt.h in Headers */,
|
||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
||||
DAEC85B718E3DD9A007FC0DF /* PearlUINavigationBar.h in Headers */,
|
||||
DAEB934918AA537D000490CC /* conf_api.h in Headers */,
|
||||
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */,
|
||||
DAEB937518AA537D000490CC /* ssl.h in Headers */,
|
||||
93D3992FA1546E01F498F665 /* PearlNavigationController.h in Headers */,
|
||||
93D39B842AB9A5D072810D76 /* NSError+PearlFullDescription.h in Headers */,
|
||||
DAEB936218AA537D000490CC /* obj_mac.h in Headers */,
|
||||
DAEB934218AA537D000490CC /* bn.h in Headers */,
|
||||
DAF4EF51190A81E400023C90 /* NSManagedObject+Pearl.h in Headers */,
|
||||
DAA141221922FF020032B392 /* map-macro.h in Headers */,
|
||||
93D39B76DD5AB108BA8928E8 /* UIScrollView+PearlAdjustInsets.h in Headers */,
|
||||
@ -3181,9 +2831,10 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = DAC77CB7148291A600BCF976 /* Build configuration list for PBXNativeTarget "Pearl" */;
|
||||
buildPhases = (
|
||||
DA25C6C91983702E0046CDCF /* ShellScript */,
|
||||
DAC77CAB148291A600BCF976 /* Headers */,
|
||||
DAC77CA9148291A600BCF976 /* Sources */,
|
||||
DAC77CAA148291A600BCF976 /* Frameworks */,
|
||||
DAC77CAB148291A600BCF976 /* Headers */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -3360,6 +3011,7 @@
|
||||
DABD39371711E29700CF925C /* avatar-0.png in Resources */,
|
||||
DABD39381711E29700CF925C /* avatar-0@2x.png in Resources */,
|
||||
DA250A041956484D00AC23F1 /* image-7.png in Resources */,
|
||||
DA25C5FC197CCAF70046CDCF /* icon_list-names.png in Resources */,
|
||||
DABD39391711E29700CF925C /* avatar-1.png in Resources */,
|
||||
DA7304E5194E025900E72520 /* tip_basic_black.png in Resources */,
|
||||
DABD393A1711E29700CF925C /* avatar-10.png in Resources */,
|
||||
@ -3384,6 +3036,7 @@
|
||||
DA250A091956484D00AC23F1 /* image-4@2x.png in Resources */,
|
||||
DABD39481711E29700CF925C /* avatar-17.png in Resources */,
|
||||
DABD39491711E29700CF925C /* avatar-17@2x.png in Resources */,
|
||||
DA25C5FD197CCAF70046CDCF /* icon_list-names@2x.png in Resources */,
|
||||
DAC8DF47192831E100BA7D71 /* icon_key.png in Resources */,
|
||||
DA250A071956484D00AC23F1 /* image-5@2x.png in Resources */,
|
||||
DAC8DF48192831E100BA7D71 /* icon_key@2x.png in Resources */,
|
||||
@ -3398,6 +3051,7 @@
|
||||
DABD394F1711E29700CF925C /* avatar-3.png in Resources */,
|
||||
DA67460F18DE7F0C00DFE240 /* Exo2.0-ExtraBold.otf in Resources */,
|
||||
DABD39501711E29700CF925C /* avatar-3@2x.png in Resources */,
|
||||
DA25C600197DBF260046CDCF /* icon_trash.png in Resources */,
|
||||
DABD39511711E29700CF925C /* avatar-4.png in Resources */,
|
||||
DA2509FD1956484D00AC23F1 /* image-10@2x.png in Resources */,
|
||||
DABD39521711E29700CF925C /* avatar-4@2x.png in Resources */,
|
||||
@ -3405,6 +3059,8 @@
|
||||
DA73049E194E022700E72520 /* ui_spinner@2x.png in Resources */,
|
||||
DABD39541711E29700CF925C /* avatar-5@2x.png in Resources */,
|
||||
DA250A031956484D00AC23F1 /* image-7@2x.png in Resources */,
|
||||
DA25C5FA197CCAE00046CDCF /* icon_delete.png in Resources */,
|
||||
DA25C601197DBF260046CDCF /* icon_trash@2x.png in Resources */,
|
||||
DABD39551711E29700CF925C /* avatar-6.png in Resources */,
|
||||
DABD39561711E29700CF925C /* avatar-6@2x.png in Resources */,
|
||||
DABD39571711E29700CF925C /* avatar-7.png in Resources */,
|
||||
@ -3420,12 +3076,14 @@
|
||||
DABD395E1711E29700CF925C /* background@2x.png in Resources */,
|
||||
DA945C8717E3F3FD0053236B /* Images.xcassets in Resources */,
|
||||
DA250A101956484D00AC23F1 /* image-1.png in Resources */,
|
||||
DA25C5FE197DBF200046CDCF /* icon_thumbs-up.png in Resources */,
|
||||
DABD39871711E29700CF925C /* SourceCodePro-Black.otf in Resources */,
|
||||
DA2509FE1956484D00AC23F1 /* image-10.png in Resources */,
|
||||
DABD39881711E29700CF925C /* SourceCodePro-ExtraLight.otf in Resources */,
|
||||
DABD39A01711E29700CF925C /* icon_action.png in Resources */,
|
||||
DABD39A11711E29700CF925C /* icon_action@2x.png in Resources */,
|
||||
DABD39F21711E29700CF925C /* icon_cancel.png in Resources */,
|
||||
DA25C5FB197CCAE00046CDCF /* icon_delete@2x.png in Resources */,
|
||||
DA73049F194E022B00E72520 /* ui_textfield.png in Resources */,
|
||||
DABD39F31711E29700CF925C /* icon_cancel@2x.png in Resources */,
|
||||
DA250A0C1956484D00AC23F1 /* image-3.png in Resources */,
|
||||
@ -3452,6 +3110,7 @@
|
||||
DABD3B8D1711E29800CF925C /* keypad.png in Resources */,
|
||||
DABD3B8E1711E29800CF925C /* logo-bare.png in Resources */,
|
||||
DA7304E6194E025900E72520 /* tip_basic_black@2x.png in Resources */,
|
||||
DA25C5F9197AFFB40046CDCF /* icon_tools@2x.png in Resources */,
|
||||
DABD3B8F1711E29800CF925C /* menu-icon.png in Resources */,
|
||||
DABD3B901711E29800CF925C /* menu-icon@2x.png in Resources */,
|
||||
DABD3B951711E29800CF925C /* pull-down.png in Resources */,
|
||||
@ -3466,6 +3125,7 @@
|
||||
DABD3C241711E2DC00CF925C /* MasterPassword.entitlements in Resources */,
|
||||
DABD3C251711E2DC00CF925C /* Settings.bundle in Resources */,
|
||||
DABD3C261711E2DC00CF925C /* InfoPlist.strings in Resources */,
|
||||
DA25C5F8197AFFB40046CDCF /* icon_tools.png in Resources */,
|
||||
DA2509FB1956484D00AC23F1 /* image-11@2x.png in Resources */,
|
||||
DA250A0B1956484D00AC23F1 /* image-3@2x.png in Resources */,
|
||||
DABD3FCA1712446200CF925C /* cloud.png in Resources */,
|
||||
@ -3473,6 +3133,7 @@
|
||||
DABD3FCE1714F45C00CF925C /* identity.png in Resources */,
|
||||
DABD3FCF1714F45C00CF925C /* identity@2x.png in Resources */,
|
||||
DA45224B190628B2008F650A /* icon_gear.png in Resources */,
|
||||
DA25C5FF197DBF200046CDCF /* icon_thumbs-up@2x.png in Resources */,
|
||||
DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */,
|
||||
DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */,
|
||||
DA250A021956484D00AC23F1 /* image-8.png in Resources */,
|
||||
@ -3489,6 +3150,19 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
DA25C6C91983702E0046CDCF /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = ":";
|
||||
};
|
||||
DA6556E314D55F3000841C99 /* Run Script: GIT version -> Info.plist */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@ -3560,11 +3234,7 @@
|
||||
93D3957237D303DE2D38C267 /* MPAvatarCell.m in Sources */,
|
||||
93D39B8F90F58A5D158DDBA3 /* MPPasswordsViewController.m in Sources */,
|
||||
93D3954FCE045A3CC7E804B7 /* MPUsersViewController.m in Sources */,
|
||||
93D39CB5E2EC1078E898F46A /* MPPasswordLargeCell.m in Sources */,
|
||||
93D39FA97F4C3F69A75D5A03 /* MPPasswordLargeGeneratedCell.m in Sources */,
|
||||
93D394F6D3F6E2553AA0D684 /* MPPasswordLargeStoredCell.m in Sources */,
|
||||
93D39392DEDA376F93C6C718 /* MPCell.m in Sources */,
|
||||
93D399278165FD6D950F0025 /* MPPasswordTypesCell.m in Sources */,
|
||||
93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */,
|
||||
93D398ECD7D1A0DEDDADF516 /* MPEmergencyViewController.m in Sources */,
|
||||
93D391ED37C9F687FA51EAA1 /* MPEmergencySegue.m in Sources */,
|
||||
@ -3572,10 +3242,8 @@
|
||||
93D39673DDC085BE72C34D7C /* MPPopdownSegue.m in Sources */,
|
||||
93D39BA1EA3CAAC8A220B4A6 /* MPAppSettingsViewController.m in Sources */,
|
||||
93D396D8B67DA6522CDBA142 /* MPCoachmarkViewController.m in Sources */,
|
||||
93D391C07818F4C2DC1B6956 /* MPPasswordsCoachmarkViewController.m in Sources */,
|
||||
93D39EAA4D064193074D3021 /* MPFixable.m in Sources */,
|
||||
93D394982CBD25D46692DD7C /* MPWebViewController.m in Sources */,
|
||||
93D398BD8B83FEE8BE4EFFFC /* MPPasswordLargeDeleteCell.m in Sources */,
|
||||
93D39D8F78978196D6ABDEDE /* MPNavigationController.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@ -3643,7 +3311,7 @@
|
||||
DA30E9D815723E6900A68B4C /* PearlLazy.m in Sources */,
|
||||
DAFE4A63150399FF003ABA82 /* UIControl+PearlBlocks.m in Sources */,
|
||||
DAFE4A63150399FF003ABA86 /* NSObject+PearlKVO.m in Sources */,
|
||||
DAEC85B518E3DD9A007FC0DF /* PearlUIView.m in Sources */,
|
||||
DAEC85B518E3DD9A007FC0DF /* UIView+Touches.m in Sources */,
|
||||
DA2CA4DD18D28859007798F8 /* NSArray+Pearl.m in Sources */,
|
||||
DAFE4A63150399FF003ABA8A /* UIControl+PearlSelect.m in Sources */,
|
||||
DAFE4A63150399FF003ABA8E /* UIScrollView+PearlFlashingIndicators.m in Sources */,
|
||||
@ -3925,13 +3593,17 @@
|
||||
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
|
||||
INFOPLIST_FILE = "MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-framework",
|
||||
Reveal,
|
||||
);
|
||||
PROVISIONING_PROFILE = "";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "1F49F193-0915-40B1-8792-BBDE74185E45";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "94333D7F-68F7-473D-B3B1-86AA41F33449";
|
||||
SKIP_INSTALL = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
@ -3953,6 +3625,10 @@
|
||||
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
|
||||
INFOPLIST_FILE = "MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
PROVISIONING_PROFILE = "";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "6407ECED-9FF3-4F04-B40E-5B3E771D603D";
|
||||
SKIP_INSTALL = NO;
|
||||
@ -4065,6 +3741,10 @@
|
||||
GCC_PREFIX_HEADER = "MasterPassword-Prefix.pch";
|
||||
INFOPLIST_FILE = "MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/Users/lhunath/Documents/workspace/lyndir/MasterPassword/External/Pearl/Pearl-Crypto/lib",
|
||||
);
|
||||
PROVISIONING_PROFILE = "";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "36641E9D-D5E0-4E80-94F4-B2CF898CFE10";
|
||||
SKIP_INSTALL = NO;
|
||||
@ -4081,6 +3761,7 @@
|
||||
GCC_PREFIX_HEADER = "../Pearl/Pearl-Prefix.pch";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PUBLIC_HEADERS_FOLDER_PATH = "../../BuildProductsPath/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/include";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = "AppStore-iOS";
|
||||
@ -4165,6 +3846,7 @@
|
||||
GCC_PREFIX_HEADER = "../Pearl/Pearl-Prefix.pch";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PUBLIC_HEADERS_FOLDER_PATH = "../../BuildProductsPath/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/include";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = "Debug-iOS";
|
||||
@ -4177,6 +3859,7 @@
|
||||
GCC_PREFIX_HEADER = "../Pearl/Pearl-Prefix.pch";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PUBLIC_HEADERS_FOLDER_PATH = "../../BuildProductsPath/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/include";
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = "AdHoc-iOS";
|
||||
@ -4184,6 +3867,7 @@
|
||||
DAFC565F172C573B00CB5CC5 /* Debug-iOS */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_WARN_INHIBIT_ALL_WARNINGS = YES;
|
||||
};
|
||||
name = "Debug-iOS";
|
||||
@ -4191,6 +3875,7 @@
|
||||
DAFC5660172C573B00CB5CC5 /* AdHoc-iOS */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_WARN_INHIBIT_ALL_WARNINGS = YES;
|
||||
};
|
||||
name = "AdHoc-iOS";
|
||||
@ -4198,6 +3883,7 @@
|
||||
DAFC5661172C573B00CB5CC5 /* AppStore-iOS */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_WARN_INHIBIT_ALL_WARNINGS = YES;
|
||||
};
|
||||
name = "AppStore-iOS";
|
||||
|
@ -108,6 +108,44 @@ To see a site's password anyway, tap and hold your finger down for a while
|
||||
<key>Type</key>
|
||||
<string>PSToggleSwitchSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>The password strength indicator estimates the time necessary to break the password from a stolen database of SHA-1 hashes. Use this setting to choose the budget the attacker is willing to devote to breaking your site password.</string>
|
||||
<key>Title</key>
|
||||
<string></string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>DefaultValue</key>
|
||||
<integer>0</integer>
|
||||
<key>Key</key>
|
||||
<string>siteAttacker</string>
|
||||
<key>Title</key>
|
||||
<string>Attacker Budget</string>
|
||||
<key>Type</key>
|
||||
<string>PSMultiValueSpecifier</string>
|
||||
<key>Titles</key>
|
||||
<array>
|
||||
<string>Regular Hardware</string>
|
||||
<string>Dedicated GPUs, 5000 $ US</string>
|
||||
<string>Large Organization, 20 M$ US</string>
|
||||
<string>State Department, 5 B$ US</string>
|
||||
</array>
|
||||
<key>ShortTitles</key>
|
||||
<array>
|
||||
<string>Regular</string>
|
||||
<string>5k $</string>
|
||||
<string>20M $</string>
|
||||
<string>5B $</string>
|
||||
</array>
|
||||
<key>Values</key>
|
||||
<array>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13D65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="Q1S-vU-GGO">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="Q1S-vU-GGO">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1792" identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
|
||||
@ -150,7 +150,7 @@
|
||||
<action selector="changeAvatar:" destination="S8q-YF-Kt9" eventType="touchUpInside" id="kL5-zV-zbb"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qp1-nX-o4i" userLabel="Entry" customClass="PearlUIView">
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qp1-nX-o4i" userLabel="Entry" customClass="UIView+Touches">
|
||||
<rect key="frame" x="20" y="255" width="280" height="68"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
@ -236,7 +236,7 @@
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XEP-O3-ayG" userLabel="Footer" customClass="PearlUIView">
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XEP-O3-ayG" userLabel="Footer" customClass="UIView+Touches">
|
||||
<rect key="frame" x="0.0" y="477" width="320" height="71"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
@ -483,8 +483,8 @@
|
||||
</tabBar>
|
||||
<connections>
|
||||
<segue destination="JFc-sj-awD" kind="relationship" relationship="viewControllers" id="bwn-ao-Y5g"/>
|
||||
<segue destination="IJT-xV-jHt" kind="relationship" relationship="viewControllers" id="MMX-ly-cXu"/>
|
||||
<segue destination="C0Q-RC-szS" kind="relationship" relationship="viewControllers" id="wap-5K-BMD"/>
|
||||
<segue destination="LBn-EA-NAH" kind="relationship" relationship="viewControllers" id="sGh-gf-eKK"/>
|
||||
</connections>
|
||||
</tabBarController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="4Z1-Y7-eUn" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
@ -980,11 +980,11 @@
|
||||
<viewControllerLayoutGuide type="top" id="S9X-2T-e1e"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="c12-XI-Rv9"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="MSX-uI-cwS" userLabel="Root" customClass="PearlUIView">
|
||||
<view key="view" contentMode="scaleToFill" id="MSX-uI-cwS" userLabel="Root" customClass="UIView+Touches">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tI8-OT-LrO" userLabel="Passwords Root" customClass="PearlUIView">
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tI8-OT-LrO" userLabel="Passwords Root" customClass="UIView+Touches">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
@ -1004,371 +1004,349 @@
|
||||
<inset key="sectionInset" minX="10" minY="10" maxX="10" maxY="10"/>
|
||||
</collectionViewFlowLayout>
|
||||
<cells>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="MPPasswordTypesCell" id="vMF-fk-FYX" userLabel="Large" customClass="MPPasswordTypesCell">
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="MPPasswordCell" id="W2g-yv-V3V" customClass="MPPasswordCell">
|
||||
<rect key="frame" x="10" y="118" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<collectionView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="7vV-gu-BNS" userLabel="Type Collection">
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xph-TW-9QO" userLabel="Content">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="ap6-LM-04C">
|
||||
<size key="itemSize" width="300" height="100"/>
|
||||
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
||||
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
||||
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
</collectionViewFlowLayout>
|
||||
<cells>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="MPPasswordLargeDeleteCell" id="GAB-fT-EFv" userLabel="Delete" customClass="MPPasswordLargeDeleteCell">
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" pagingEnabled="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bff-RU-OcY">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.029999999999999999" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delete" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AAG-mH-nNg" userLabel="Type">
|
||||
<rect key="frame" x="-10" y="19" width="261" height="101"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Bold" family="Exo 2.0" pointSize="84"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delete Site" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="y9p-dE-unH" userLabel="Delete">
|
||||
<rect key="frame" x="8" y="20" width="284" height="31"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="24"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="apple.com" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="VNc-fL-Vfa" userLabel="Site Name">
|
||||
<rect key="frame" x="8" y="71" width="284" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" label="">
|
||||
<accessibilityTraits key="traits" none="YES" staticText="YES" summaryElement="YES"/>
|
||||
</accessibility>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" red="0.50196081399917603" green="0.0" blue="0.0" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aDw-qY-VjU">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" red="0.18431372549019609" green="0.15686274509803921" blue="0.15686274509803921" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<connections>
|
||||
<action selector="doUse:" destination="W2g-yv-V3V" eventType="touchUpInside" id="ukg-D8-8O3"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="3" contentMode="left" text="> age of the universe" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="wfM-xz-roR" userLabel="Strength">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="12"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="10"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<textField opaque="NO" clipsSubviews="YES" alpha="0.0" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="CuzaSasy3*Rimo" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="blw-Ou-8I8" userLabel="Password">
|
||||
<rect key="frame" x="8" y="20" width="284" height="31"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="textColor" red="0.40000000600000002" green="0.80000001190000003" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="24"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="alphabet" keyboardAppearance="alert" returnKeyType="done"/>
|
||||
<connections>
|
||||
<action selector="textFieldDidChange:" destination="W2g-yv-V3V" eventType="editingChanged" id="gTE-0d-r2l"/>
|
||||
<outlet property="delegate" destination="W2g-yv-V3V" id="YKp-IE-zEQ"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="lhunath" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3I9-vf-IZK" userLabel="Login">
|
||||
<rect key="frame" x="8" y="20" width="284" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="0.10000000000000001" colorSpace="calibratedRGB"/>
|
||||
<color key="textColor" red="0.40000000600000002" green="0.80000001190000003" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="24"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="alphabet" keyboardAppearance="alert" returnKeyType="done"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="W2g-yv-V3V" id="z8b-Vd-dWe"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tl3-hd-x35" userLabel="Main">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="apple.com - long" lineBreakMode="tailTruncation" minimumFontSize="8" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OwP-sb-Wxl" userLabel="Site Name">
|
||||
<rect key="frame" x="8" y="71" width="204" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" label="">
|
||||
<accessibilityTraits key="traits" none="YES" staticText="YES" summaryElement="YES"/>
|
||||
</accessibility>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Agd-0J-z5o" userLabel="Field Mode">
|
||||
<rect key="frame" x="212" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Edits the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="6Pa-21-Lwi"/>
|
||||
<constraint firstAttribute="width" constant="44" id="WTe-56-pc7"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_person.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="selected" image="icon_key.png"/>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doLoginMode:" destination="W2g-yv-V3V" eventType="touchUpInside" id="CbH-c0-CJe"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="Agd-0J-z5o" secondAttribute="trailing" constant="44" id="3Pc-mp-S6g"/>
|
||||
<constraint firstItem="OwP-sb-Wxl" firstAttribute="leading" secondItem="tl3-hd-x35" secondAttribute="leading" constant="8" id="ec1-f1-mud"/>
|
||||
<constraint firstItem="Agd-0J-z5o" firstAttribute="leading" secondItem="OwP-sb-Wxl" secondAttribute="trailing" id="wRj-23-2nN"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LvK-28-fbm" userLabel="Settings">
|
||||
<rect key="frame" x="300" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vGk-t6-hZn" userLabel="Upgrade">
|
||||
<rect key="frame" x="25" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Upgrades the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="8gK-8v-Q0K"/>
|
||||
<constraint firstAttribute="height" constant="44" id="hQh-jZ-41x"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_up.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doUpgrade:" destination="W2g-yv-V3V" eventType="touchUpInside" id="H3Y-gA-0MY"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="1" textAlignment="right" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="PKP-M9-T8E" userLabel="Counter">
|
||||
<rect key="frame" x="69" y="69" width="11" height="19"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Site's counter."/>
|
||||
<fontDescription key="fontDescription" name="Copperplate-Bold" family="Copperplate" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uZi-FT-Fe8" userLabel="Incrementer">
|
||||
<rect key="frame" x="80" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Increments the site counter."/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="DWo-8r-QIJ"/>
|
||||
<constraint firstAttribute="height" constant="44" id="GQS-qz-ufK"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_plus.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doIncrementCounter:" destination="W2g-yv-V3V" eventType="touchUpInside" id="eos-wE-4xq"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qBo-Kw-vN9" userLabel="Edit">
|
||||
<rect key="frame" x="124" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Edits the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="j1z-K8-OXJ"/>
|
||||
<constraint firstAttribute="height" constant="44" id="mEK-dW-ATd"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_edit.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doEdit:" destination="W2g-yv-V3V" eventType="touchUpInside" id="iDD-3T-sqw"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="I0v-ou-hDb" userLabel="Delete">
|
||||
<rect key="frame" x="168" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Edits the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="XvV-Lr-Z21"/>
|
||||
<constraint firstAttribute="width" constant="44" id="YNx-Nc-IYW"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_trash.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doDelete:" destination="W2g-yv-V3V" eventType="touchUpInside" id="Zm4-e2-SCp"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="K8q-bM-tzh" userLabel="Type">
|
||||
<rect key="frame" x="212" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Edits the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="K3c-Ok-krB"/>
|
||||
<constraint firstAttribute="width" constant="44" id="wtJ-zb-FNx"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_list-names.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doChangeType:" destination="W2g-yv-V3V" eventType="touchUpInside" id="TVb-JM-x9H"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="PKP-M9-T8E" firstAttribute="leading" secondItem="vGk-t6-hZn" secondAttribute="trailing" id="47y-gh-Ibs"/>
|
||||
<constraint firstItem="PKP-M9-T8E" firstAttribute="centerY" secondItem="uZi-FT-Fe8" secondAttribute="centerY" id="KEK-0r-cob"/>
|
||||
<constraint firstItem="qBo-Kw-vN9" firstAttribute="leading" secondItem="uZi-FT-Fe8" secondAttribute="trailing" id="LLk-5B-1g9"/>
|
||||
<constraint firstItem="K8q-bM-tzh" firstAttribute="leading" secondItem="I0v-ou-hDb" secondAttribute="trailing" id="il2-7H-Hgk"/>
|
||||
<constraint firstItem="I0v-ou-hDb" firstAttribute="leading" secondItem="qBo-Kw-vN9" secondAttribute="trailing" id="myx-31-6tz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="K8q-bM-tzh" secondAttribute="trailing" constant="44" id="qQK-ts-seh"/>
|
||||
<constraint firstItem="uZi-FT-Fe8" firstAttribute="leading" secondItem="PKP-M9-T8E" secondAttribute="trailing" id="xFJ-GZ-jp9"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="b5f-wN-2xb" userLabel="Site Mode">
|
||||
<rect key="frame" x="256" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Upgrades the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="I1C-Ok-DUv"/>
|
||||
<constraint firstAttribute="height" constant="44" id="ZU3-Sg-was"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_tools.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="selected" image="icon_thumbs-up.png"/>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doMode:" destination="W2g-yv-V3V" eventType="touchUpInside" id="72U-sh-nce"/>
|
||||
</connections>
|
||||
</button>
|
||||
<pageControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" numberOfPages="2" translatesAutoresizingMaskIntoConstraints="NO" id="5SS-x0-icl">
|
||||
<rect key="frame" x="138" y="77" width="23" height="37"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="currentPageIndicatorTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</pageControl>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="y9p-dE-unH" firstAttribute="leading" secondItem="GAB-fT-EFv" secondAttribute="leading" constant="8" id="1pO-PG-Rci"/>
|
||||
<constraint firstItem="AAG-mH-nNg" firstAttribute="leading" secondItem="GAB-fT-EFv" secondAttribute="leading" constant="-10" id="4XF-xn-KAY"/>
|
||||
<constraint firstItem="y9p-dE-unH" firstAttribute="top" secondItem="GAB-fT-EFv" secondAttribute="top" constant="20" id="6Nq-f6-G38"/>
|
||||
<constraint firstAttribute="bottom" secondItem="VNc-fL-Vfa" secondAttribute="bottom" constant="15" id="6kW-B3-DMz"/>
|
||||
<constraint firstItem="VNc-fL-Vfa" firstAttribute="leading" secondItem="GAB-fT-EFv" secondAttribute="leading" constant="8" id="6xg-dp-fSn"/>
|
||||
<constraint firstAttribute="trailing" secondItem="y9p-dE-unH" secondAttribute="trailing" constant="8" id="CCh-3r-ImT"/>
|
||||
<constraint firstAttribute="bottom" secondItem="AAG-mH-nNg" secondAttribute="bottom" constant="-20" id="btx-g1-Jei"/>
|
||||
<constraint firstAttribute="trailing" secondItem="VNc-fL-Vfa" secondAttribute="trailing" constant="8" id="k3u-1Q-cKf"/>
|
||||
<constraint firstAttribute="bottom" secondItem="tl3-hd-x35" secondAttribute="bottom" id="2x2-iA-utK"/>
|
||||
<constraint firstItem="b5f-wN-2xb" firstAttribute="centerY" secondItem="I0v-ou-hDb" secondAttribute="centerY" id="KPv-e0-uR0"/>
|
||||
<constraint firstItem="LvK-28-fbm" firstAttribute="leading" secondItem="tl3-hd-x35" secondAttribute="trailing" id="NXL-Fd-whf"/>
|
||||
<constraint firstItem="b5f-wN-2xb" firstAttribute="centerY" secondItem="Agd-0J-z5o" secondAttribute="centerY" id="W01-oa-2rY"/>
|
||||
<constraint firstAttribute="bottom" secondItem="LvK-28-fbm" secondAttribute="bottom" id="ZBx-Lf-XHF"/>
|
||||
<constraint firstItem="b5f-wN-2xb" firstAttribute="centerY" secondItem="vGk-t6-hZn" secondAttribute="centerY" id="fGB-8g-u5b"/>
|
||||
<constraint firstItem="tl3-hd-x35" firstAttribute="leading" secondItem="bff-RU-OcY" secondAttribute="leading" id="fx5-KQ-LSM"/>
|
||||
<constraint firstItem="tl3-hd-x35" firstAttribute="top" secondItem="bff-RU-OcY" secondAttribute="top" id="jc9-39-FY3"/>
|
||||
<constraint firstItem="OwP-sb-Wxl" firstAttribute="centerY" secondItem="b5f-wN-2xb" secondAttribute="centerY" id="m22-uE-sVm"/>
|
||||
<constraint firstItem="K8q-bM-tzh" firstAttribute="centerY" secondItem="b5f-wN-2xb" secondAttribute="centerY" id="ofO-r3-bjz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="LvK-28-fbm" secondAttribute="trailing" id="r9d-ym-Frs"/>
|
||||
<constraint firstItem="LvK-28-fbm" firstAttribute="top" secondItem="bff-RU-OcY" secondAttribute="top" id="uqb-hB-Iq8"/>
|
||||
<constraint firstItem="b5f-wN-2xb" firstAttribute="centerY" secondItem="uZi-FT-Fe8" secondAttribute="centerY" id="xz2-kK-B4g"/>
|
||||
<constraint firstItem="b5f-wN-2xb" firstAttribute="centerY" secondItem="qBo-Kw-vN9" secondAttribute="centerY" id="zaR-iF-Hea"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="nameLabel" destination="VNc-fL-Vfa" id="kMh-xS-U1W"/>
|
||||
<outlet property="typeLabel" destination="AAG-mH-nNg" id="bBz-CA-Frx"/>
|
||||
<outlet property="delegate" destination="W2g-yv-V3V" id="HgX-fq-za5"/>
|
||||
</connections>
|
||||
</collectionViewCell>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="MPPasswordLargeStoredCell" id="W2g-yv-V3V" userLabel="Stored" customClass="MPPasswordLargeStoredCell">
|
||||
<rect key="frame" x="310" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.029999999329447746" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Personal Password" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ESK-hm-pVB" userLabel="Type">
|
||||
<rect key="frame" x="-10" y="19" width="763" height="101"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Bold" family="Exo 2.0" pointSize="84"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="SadwGafy7^Sidu" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="blw-Ou-8I8" userLabel="Content">
|
||||
<rect key="frame" x="8" y="20" width="284" height="31"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="textColor" red="0.40000000600000002" green="0.80000001190000003" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="24"/>
|
||||
<textInputTraits key="textInputTraits" keyboardAppearance="alert"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="W2g-yv-V3V" id="YKp-IE-zEQ"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="apple.com" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="OwP-sb-Wxl" userLabel="Site Name">
|
||||
<rect key="frame" x="8" y="71" width="284" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" label="">
|
||||
<accessibilityTraits key="traits" none="YES" staticText="YES" summaryElement="YES"/>
|
||||
</accessibility>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="KLg-Jf-XRN" userLabel="Upgrade">
|
||||
<rect key="frame" x="221" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Upgrades the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="jRK-Pe-SFL"/>
|
||||
<constraint firstAttribute="height" constant="44" id="mD9-bz-EEd"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_up.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doUpgrade:" destination="W2g-yv-V3V" eventType="touchUpInside" id="ALE-Na-KIS"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="b7E-cU-HB7" userLabel="Edit">
|
||||
<rect key="frame" x="221" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Edits the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="dfA-95-6Om"/>
|
||||
<constraint firstAttribute="width" constant="44" id="pQu-rk-Nay"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_edit.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doEditContent:" destination="W2g-yv-V3V" eventType="touchUpInside" id="N6m-Ib-LQO"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="SfG-nt-NyC" userLabel="User">
|
||||
<rect key="frame" x="256" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Upgrades the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="Am1-08-Pzm"/>
|
||||
<constraint firstAttribute="width" constant="44" id="Jnj-oo-enC"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_person.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="selected" image="icon_key.png"/>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doUser:" destination="W2g-yv-V3V" eventType="touchUpInside" id="jAs-zj-Nf9"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" red="0.18823529410000001" green="0.15686274510000001" blue="0.15686274510000001" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="b7E-cU-HB7" firstAttribute="centerX" secondItem="KLg-Jf-XRN" secondAttribute="centerX" id="34H-Ho-xNc"/>
|
||||
<constraint firstItem="ESK-hm-pVB" firstAttribute="leading" secondItem="W2g-yv-V3V" secondAttribute="leading" constant="-10" id="A0R-lu-9BO"/>
|
||||
<constraint firstItem="b7E-cU-HB7" firstAttribute="centerY" secondItem="SfG-nt-NyC" secondAttribute="centerY" id="ARa-xU-exW"/>
|
||||
<constraint firstItem="OwP-sb-Wxl" firstAttribute="centerY" secondItem="SfG-nt-NyC" secondAttribute="centerY" id="BcZ-r6-Kxd"/>
|
||||
<constraint firstAttribute="trailing" secondItem="OwP-sb-Wxl" secondAttribute="trailing" constant="8" id="GGB-WN-PVI"/>
|
||||
<constraint firstAttribute="trailing" secondItem="SfG-nt-NyC" secondAttribute="trailing" id="N2W-3R-jtc"/>
|
||||
<constraint firstItem="b7E-cU-HB7" firstAttribute="centerY" secondItem="KLg-Jf-XRN" secondAttribute="centerY" id="RAk-vW-n5T"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="leading" secondItem="W2g-yv-V3V" secondAttribute="leading" constant="8" id="SNn-Z2-i9J"/>
|
||||
<constraint firstAttribute="bottom" secondItem="ESK-hm-pVB" secondAttribute="bottom" constant="-20" id="UNw-PQ-JMk"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="top" secondItem="W2g-yv-V3V" secondAttribute="top" constant="20" id="d5v-RM-TKj"/>
|
||||
<constraint firstItem="OwP-sb-Wxl" firstAttribute="leading" secondItem="W2g-yv-V3V" secondAttribute="leading" constant="8" id="mWV-lg-EAZ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="blw-Ou-8I8" secondAttribute="trailing" constant="8" id="qKQ-q9-lWu"/>
|
||||
<constraint firstAttribute="bottom" secondItem="SfG-nt-NyC" secondAttribute="bottom" id="v0g-dJ-tbc"/>
|
||||
<constraint firstItem="SfG-nt-NyC" firstAttribute="leading" secondItem="b7E-cU-HB7" secondAttribute="trailing" constant="-9" id="zdQ-SJ-Cff"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="contentField" destination="blw-Ou-8I8" id="bov-At-Wpd"/>
|
||||
<outlet property="editButton" destination="b7E-cU-HB7" id="0de-kq-frx"/>
|
||||
<outlet property="loginButton" destination="SfG-nt-NyC" id="hAn-7S-u9n"/>
|
||||
<outlet property="nameLabel" destination="OwP-sb-Wxl" id="Q6M-zX-g1z"/>
|
||||
<outlet property="typeLabel" destination="ESK-hm-pVB" id="w6J-OT-wfC"/>
|
||||
<outlet property="upgradeButton" destination="KLg-Jf-XRN" id="YtO-4G-lml"/>
|
||||
</connections>
|
||||
</collectionViewCell>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="MPPasswordLargeGeneratedCell" id="302-fI-maQ" userLabel="Generated" customClass="MPPasswordLargeGeneratedCell">
|
||||
<rect key="frame" x="620" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="100"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="3" contentMode="left" text="> age of the universe" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="GrV-gX-eCo" userLabel="Strength">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="12"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="10"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.029999999999999999" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Long Password" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qAD-3v-3aq" userLabel="Type">
|
||||
<rect key="frame" x="-10" y="19" width="604" height="101"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Bold" family="Exo 2.0" pointSize="84"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="SadwGafy7^Sidu" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="q75-Uz-86O" userLabel="Content">
|
||||
<rect key="frame" x="8" y="20" width="284" height="31"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="textColor" red="0.40000000600000002" green="0.80000001190000003" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="24"/>
|
||||
<textInputTraits key="textInputTraits" keyboardAppearance="alert"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="302-fI-maQ" id="vji-9t-frp"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="apple.com" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="qek-2l-YQf" userLabel="Site Name">
|
||||
<rect key="frame" x="8" y="71" width="284" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" label="">
|
||||
<accessibilityTraits key="traits" none="YES" staticText="YES" summaryElement="YES"/>
|
||||
</accessibility>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="1" textAlignment="right" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="I2J-B6-5rE" userLabel="Counter">
|
||||
<rect key="frame" x="216" y="69" width="11" height="19"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Site's counter."/>
|
||||
<fontDescription key="fontDescription" name="Copperplate-Bold" family="Copperplate" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iLD-rv-uZZ" userLabel="Upgrade">
|
||||
<rect key="frame" x="221" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Upgrades the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="1B8-GB-TBc"/>
|
||||
<constraint firstAttribute="width" constant="44" id="b9e-xF-5OF"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_up.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doUpgrade:" destination="302-fI-maQ" eventType="touchUpInside" id="iaP-5Y-5re"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fQc-Fn-JDq" userLabel="Incrementer">
|
||||
<rect key="frame" x="221" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Increments the site counter."/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="1j5-Ke-znk"/>
|
||||
<constraint firstAttribute="height" constant="44" id="BWc-06-jSP"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_plus.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doIncrementCounter:" destination="302-fI-maQ" eventType="touchUpInside" id="Aa1-tk-whD"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cOv-2G-EAP" userLabel="User">
|
||||
<rect key="frame" x="256" y="56" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="Upgrades the password."/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="63k-ii-B9M"/>
|
||||
<constraint firstAttribute="width" constant="44" id="ovE-9u-ASE"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="6" minY="6" maxX="6" maxY="6"/>
|
||||
<state key="normal" image="icon_person.png">
|
||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="selected" image="icon_key.png"/>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="doUser:" destination="302-fI-maQ" eventType="touchUpInside" id="Fp9-L4-hlU"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" red="0.18823529411764706" green="0.18823529411764706" blue="0.18823529411764706" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="q75-Uz-86O" firstAttribute="top" secondItem="302-fI-maQ" secondAttribute="top" constant="20" id="4NG-CG-tXA"/>
|
||||
<constraint firstAttribute="bottom" secondItem="cOv-2G-EAP" secondAttribute="bottom" id="7S8-gd-JGz"/>
|
||||
<constraint firstItem="iLD-rv-uZZ" firstAttribute="centerY" secondItem="fQc-Fn-JDq" secondAttribute="centerY" id="B7r-cy-SEz"/>
|
||||
<constraint firstItem="fQc-Fn-JDq" firstAttribute="leading" secondItem="I2J-B6-5rE" secondAttribute="trailing" constant="-6" id="BP2-UH-wUX"/>
|
||||
<constraint firstItem="qAD-3v-3aq" firstAttribute="leading" secondItem="302-fI-maQ" secondAttribute="leading" constant="-10" id="BxY-uQ-3gc"/>
|
||||
<constraint firstAttribute="trailing" secondItem="qek-2l-YQf" secondAttribute="trailing" constant="8" id="MpX-WR-hsJ"/>
|
||||
<constraint firstItem="qek-2l-YQf" firstAttribute="centerY" secondItem="I2J-B6-5rE" secondAttribute="centerY" id="TlY-I8-4hD"/>
|
||||
<constraint firstAttribute="bottom" secondItem="qAD-3v-3aq" secondAttribute="bottom" constant="-20" id="Yc1-x1-kYs"/>
|
||||
<constraint firstItem="iLD-rv-uZZ" firstAttribute="centerX" secondItem="fQc-Fn-JDq" secondAttribute="centerX" id="Yiw-hl-6Vx"/>
|
||||
<constraint firstAttribute="trailing" secondItem="q75-Uz-86O" secondAttribute="trailing" constant="8" id="ZsY-wg-aJt"/>
|
||||
<constraint firstItem="q75-Uz-86O" firstAttribute="leading" secondItem="302-fI-maQ" secondAttribute="leading" constant="8" id="cee-Hz-2IS"/>
|
||||
<constraint firstAttribute="trailing" secondItem="cOv-2G-EAP" secondAttribute="trailing" id="fNx-v1-XM3"/>
|
||||
<constraint firstItem="GrV-gX-eCo" firstAttribute="leading" secondItem="302-fI-maQ" secondAttribute="leading" id="hX4-Yf-rzp"/>
|
||||
<constraint firstItem="cOv-2G-EAP" firstAttribute="leading" secondItem="fQc-Fn-JDq" secondAttribute="trailing" constant="-9" id="hqr-ru-rB7"/>
|
||||
<constraint firstItem="GrV-gX-eCo" firstAttribute="top" secondItem="302-fI-maQ" secondAttribute="top" id="ptG-Jr-1R8"/>
|
||||
<constraint firstItem="cOv-2G-EAP" firstAttribute="centerY" secondItem="fQc-Fn-JDq" secondAttribute="centerY" id="rrx-LF-Hk9"/>
|
||||
<constraint firstItem="fQc-Fn-JDq" firstAttribute="centerY" secondItem="I2J-B6-5rE" secondAttribute="centerY" id="uR7-lg-A9q"/>
|
||||
<constraint firstItem="qek-2l-YQf" firstAttribute="leading" secondItem="302-fI-maQ" secondAttribute="leading" constant="8" id="wUJ-7N-Z1z"/>
|
||||
<constraint firstAttribute="trailing" secondItem="GrV-gX-eCo" secondAttribute="trailing" id="yDV-ZB-a8l"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="contentField" destination="q75-Uz-86O" id="nbM-vd-uZi"/>
|
||||
<outlet property="counterButton" destination="fQc-Fn-JDq" id="1QL-JK-tHn"/>
|
||||
<outlet property="counterLabel" destination="I2J-B6-5rE" id="C4b-gE-XHW"/>
|
||||
<outlet property="loginButton" destination="cOv-2G-EAP" id="WoR-eP-Ztq"/>
|
||||
<outlet property="nameLabel" destination="qek-2l-YQf" id="CcC-PM-kMx"/>
|
||||
<outlet property="strengthLabel" destination="GrV-gX-eCo" id="e6J-5c-Dln"/>
|
||||
<outlet property="typeLabel" destination="qAD-3v-3aq" id="rAM-Kf-5xO"/>
|
||||
<outlet property="upgradeButton" destination="iLD-rv-uZZ" id="OKi-9X-R6F"/>
|
||||
</connections>
|
||||
</collectionViewCell>
|
||||
</cells>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="vMF-fk-FYX" id="gLv-f4-PXT"/>
|
||||
<outlet property="delegate" destination="vMF-fk-FYX" id="ch2-2f-37e"/>
|
||||
</connections>
|
||||
</collectionView>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" secondItem="tl3-hd-x35" secondAttribute="height" id="52G-c7-hIf"/>
|
||||
<constraint firstItem="wfM-xz-roR" firstAttribute="leading" secondItem="xph-TW-9QO" secondAttribute="leading" id="6kW-om-vdj"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="top" secondItem="xph-TW-9QO" secondAttribute="top" constant="20" id="9Op-Su-ydb"/>
|
||||
<constraint firstAttribute="trailing" secondItem="blw-Ou-8I8" secondAttribute="trailing" constant="8" id="9sz-Xs-Vd4"/>
|
||||
<constraint firstItem="aDw-qY-VjU" firstAttribute="leading" secondItem="xph-TW-9QO" secondAttribute="leading" id="CD9-Oa-unh"/>
|
||||
<constraint firstAttribute="bottom" secondItem="b5f-wN-2xb" secondAttribute="bottom" id="G0H-PL-lee"/>
|
||||
<constraint firstItem="bff-RU-OcY" firstAttribute="leading" secondItem="xph-TW-9QO" secondAttribute="leading" id="HqJ-3D-UKp"/>
|
||||
<constraint firstAttribute="bottom" secondItem="bff-RU-OcY" secondAttribute="bottom" id="LdO-Uh-meg"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="leading" secondItem="xph-TW-9QO" secondAttribute="leading" constant="8" id="OFb-yO-Tz5"/>
|
||||
<constraint firstItem="LvK-28-fbm" firstAttribute="width" secondItem="xph-TW-9QO" secondAttribute="width" id="SI5-t4-8N0"/>
|
||||
<constraint firstItem="wfM-xz-roR" firstAttribute="top" secondItem="xph-TW-9QO" secondAttribute="top" id="SRE-Mi-f2h"/>
|
||||
<constraint firstAttribute="width" secondItem="tl3-hd-x35" secondAttribute="width" id="W1t-9b-nDP"/>
|
||||
<constraint firstAttribute="bottom" secondItem="5SS-x0-icl" secondAttribute="centerY" constant="4" id="WQK-m9-V2t"/>
|
||||
<constraint firstAttribute="trailing" secondItem="b5f-wN-2xb" secondAttribute="trailing" id="WgC-8z-VnB"/>
|
||||
<constraint firstItem="aDw-qY-VjU" firstAttribute="top" secondItem="xph-TW-9QO" secondAttribute="top" id="YVH-Wj-Ese"/>
|
||||
<constraint firstAttribute="bottom" secondItem="aDw-qY-VjU" secondAttribute="bottom" id="aQ3-1j-L38"/>
|
||||
<constraint firstAttribute="centerX" secondItem="5SS-x0-icl" secondAttribute="centerX" id="bGC-IS-Y3g"/>
|
||||
<constraint firstItem="bff-RU-OcY" firstAttribute="top" secondItem="xph-TW-9QO" secondAttribute="top" id="hCs-ZY-tmo"/>
|
||||
<constraint firstAttribute="trailing" secondItem="aDw-qY-VjU" secondAttribute="trailing" id="hsj-QF-2Oh"/>
|
||||
<constraint firstAttribute="trailing" secondItem="wfM-xz-roR" secondAttribute="trailing" id="jgh-K9-x5e"/>
|
||||
<constraint firstItem="3I9-vf-IZK" firstAttribute="top" secondItem="xph-TW-9QO" secondAttribute="top" constant="20" id="m75-b3-V0O"/>
|
||||
<constraint firstItem="3I9-vf-IZK" firstAttribute="leading" secondItem="xph-TW-9QO" secondAttribute="leading" constant="8" id="nQM-Be-y0N"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bff-RU-OcY" secondAttribute="trailing" id="o6W-1a-ia7"/>
|
||||
<constraint firstItem="LvK-28-fbm" firstAttribute="height" secondItem="xph-TW-9QO" secondAttribute="height" id="viy-di-Nag"/>
|
||||
<constraint firstAttribute="trailing" secondItem="3I9-vf-IZK" secondAttribute="trailing" constant="8" id="wJ9-tT-6BH"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" red="0.18823529411764706" green="0.25098039215686274" blue="0.18823529411764706" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="xph-TW-9QO" secondAttribute="trailing" id="Fmt-yZ-Vjo"/>
|
||||
<constraint firstItem="xph-TW-9QO" firstAttribute="leading" secondItem="W2g-yv-V3V" secondAttribute="leading" id="IsM-Br-kMe"/>
|
||||
<constraint firstItem="xph-TW-9QO" firstAttribute="top" secondItem="W2g-yv-V3V" secondAttribute="top" id="KDo-0Z-mc1"/>
|
||||
<constraint firstAttribute="bottom" secondItem="xph-TW-9QO" secondAttribute="bottom" id="W1r-47-bqe"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="contentCollectionView" destination="7vV-gu-BNS" id="8KS-Ep-xTu"/>
|
||||
<outlet property="counterButton" destination="uZi-FT-Fe8" id="oaF-bB-Sgc"/>
|
||||
<outlet property="counterLabel" destination="PKP-M9-T8E" id="m9u-Qx-Z9N"/>
|
||||
<outlet property="editButton" destination="qBo-Kw-vN9" id="g0S-0o-e3D"/>
|
||||
<outlet property="loginModeButton" destination="Agd-0J-z5o" id="VQI-nl-5Yh"/>
|
||||
<outlet property="loginNameField" destination="3I9-vf-IZK" id="jK4-LI-4ST"/>
|
||||
<outlet property="modeButton" destination="b5f-wN-2xb" id="m2X-BZ-Lbv"/>
|
||||
<outlet property="modeScrollView" destination="bff-RU-OcY" id="Mdp-fj-00L"/>
|
||||
<outlet property="pageControl" destination="5SS-x0-icl" id="IGN-yI-5s0"/>
|
||||
<outlet property="passwordField" destination="blw-Ou-8I8" id="bov-At-Wpd"/>
|
||||
<outlet property="selectionButton" destination="aDw-qY-VjU" id="R3R-kq-XMd"/>
|
||||
<outlet property="siteNameLabel" destination="OwP-sb-Wxl" id="6GN-Ou-K0F"/>
|
||||
<outlet property="strengthLabel" destination="wfM-xz-roR" id="dzk-dB-OfP"/>
|
||||
<outlet property="upgradeButton" destination="vGk-t6-hZn" id="m2T-CA-HmJ"/>
|
||||
</connections>
|
||||
</collectionViewCell>
|
||||
</cells>
|
||||
@ -1527,7 +1505,7 @@
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="APh-u5-vFI" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1350" y="1200"/>
|
||||
<point key="canvasLocation" x="1355" y="1200"/>
|
||||
</scene>
|
||||
<!--Emergency View Controller-->
|
||||
<scene sceneID="c0a-VZ-JJf">
|
||||
@ -1817,6 +1795,22 @@
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1350" y="-272"/>
|
||||
</scene>
|
||||
<!--Navigation Controller - Settings-->
|
||||
<scene sceneID="jGj-Je-kyC">
|
||||
<objects>
|
||||
<navigationController definesPresentationContext="YES" id="LBn-EA-NAH" sceneMemberID="viewController">
|
||||
<tabBarItem key="tabBarItem" title="Settings" image="icon_gears.png" id="6n3-Ay-Knn"/>
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="h6j-1o-LHf">
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</navigationBar>
|
||||
<connections>
|
||||
<segue destination="IJT-xV-jHt" kind="relationship" relationship="rootViewController" id="ymU-OE-v4t"/>
|
||||
</connections>
|
||||
</navigationController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="PQz-c8-3Ww" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="2424" y="464"/>
|
||||
</scene>
|
||||
<!--App Settings View Controller - Settings-->
|
||||
<scene sceneID="fmc-CS-nuo">
|
||||
<objects>
|
||||
@ -1850,7 +1844,7 @@
|
||||
</tableViewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="sDE-fE-FNc" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="2424" y="464"/>
|
||||
<point key="canvasLocation" x="2961" y="464"/>
|
||||
</scene>
|
||||
<!--Guide View Controller - Usage-->
|
||||
<scene sceneID="9SY-7D-CE9">
|
||||
@ -1996,7 +1990,7 @@ CgoKCgoKCgoKCgoKCg
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="OKk-Ht-Uzq" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="2961" y="-272"/>
|
||||
<point key="canvasLocation" x="2424" y="-272"/>
|
||||
</scene>
|
||||
<!--Logs View Controller - Logbook-->
|
||||
<scene sceneID="cks-mO-kuy">
|
||||
@ -2529,7 +2523,7 @@ See </string>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="6di-Zc-lpO" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="3498" y="-272"/>
|
||||
<point key="canvasLocation" x="2961" y="-272"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
@ -2541,8 +2535,12 @@ See </string>
|
||||
<image name="icon_edit.png" width="32" height="32"/>
|
||||
<image name="icon_gears.png" width="32" height="32"/>
|
||||
<image name="icon_key.png" width="32" height="32"/>
|
||||
<image name="icon_list-names.png" width="32" height="32"/>
|
||||
<image name="icon_person.png" width="32" height="32"/>
|
||||
<image name="icon_plus.png" width="32" height="32"/>
|
||||
<image name="icon_thumbs-up.png" width="32" height="32"/>
|
||||
<image name="icon_tools.png" width="32" height="32"/>
|
||||
<image name="icon_trash.png" width="32" height="32"/>
|
||||
<image name="icon_up.png" width="32" height="32"/>
|
||||
<image name="identity.png" width="82" height="80"/>
|
||||
<image name="image-0.png" width="256" height="384"/>
|
||||
|
Loading…
Reference in New Issue
Block a user