UI improvements & security.
[ADDED] Settings for remembering and storing the master password. [ADDED] KeyChain used to store master password & hash. [IMPROVED] Remember whether help is hidden. [FIXED] Making passwords stored. [ADDED] Generated password counter. Edit stored passwords. [IMPROVED] UI prettier and better documented. [ADDED] Warnings when changing a site's password.
2
External/Pearl
vendored
@ -1 +1 @@
|
||||
Subproject commit 3cca78c6ebc874ef3168e674dbb7391f9a6dec52
|
||||
Subproject commit c4cd94ab7743a06a0173e3a93e6ea10ab7c7d7f5
|
BIN
OnePassword.sketch/Data
Normal file
BIN
OnePassword.sketch/QuickLook/Preview.pdf
Normal file
BIN
OnePassword.sketch/QuickLook/Thumbnail.jpg
Normal file
After Width: | Height: | Size: 20 KiB |
@ -11,6 +11,7 @@
|
||||
DA007F5514B25EE100251337 /* ciphers.plist in Resources */ = {isa = PBXBuildFile; fileRef = DA007F5414B25EE100251337 /* ciphers.plist */; };
|
||||
DA007F5614B26EFA00251337 /* Pearl.strings in Resources */ = {isa = PBXBuildFile; fileRef = DAC77CD41482AAD600BCF976 /* Pearl.strings */; };
|
||||
DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */; };
|
||||
DA0A848C14C4DFCB0090EA8E /* OPElementGeneratedEntity.m in Sources */ = {isa = PBXBuildFile; fileRef = DA0A848B14C4DFCB0090EA8E /* OPElementGeneratedEntity.m */; };
|
||||
DA0B951114C2D69E001D4EB1 /* help.html in Resources */ = {isa = PBXBuildFile; fileRef = DA0B951014C2D69E001D4EB1 /* help.html */; };
|
||||
DA0B966914C37487001D4EB1 /* addressbook-person@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0B951314C37486001D4EB1 /* addressbook-person@2x.png */; };
|
||||
DA0B966A14C37487001D4EB1 /* addressbook.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0B951414C37486001D4EB1 /* addressbook.png */; };
|
||||
@ -372,7 +373,8 @@
|
||||
DA5BFA67147E415C00F98B1E /* OPMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA66147E415C00F98B1E /* OPMainViewController.m */; };
|
||||
DA5DB7A614BE4B19002DD256 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5DB7A514BE4B19002DD256 /* Default.png */; };
|
||||
DA5DB7A814BE4B4B002DD256 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5DB7A714BE4B4B002DD256 /* Default@2x.png */; };
|
||||
DABF7DA514BE54E4007F3557 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DABF7DA414BE54E4007F3557 /* Default.png */; };
|
||||
DA7659AF14C5E22E00769249 /* Square-bottom.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7659AD14C5E22E00769249 /* Square-bottom.png */; };
|
||||
DA7659B014C5E22E00769249 /* Square-top.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7659AE14C5E22E00769249 /* Square-top.png */; };
|
||||
DAC6325E1486805C0075AEA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
||||
DAC6326D148680650075AEA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
||||
DAC63277148680700075AEA5 /* libuicolor-utilities.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6325D1486805C0075AEA5 /* libuicolor-utilities.a */; };
|
||||
@ -452,6 +454,7 @@
|
||||
DAC781321482AAD800BCF976 /* WebViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DAC780EF1482AAD700BCF976 /* WebViewController.h */; };
|
||||
DAC781331482AAD800BCF976 /* WebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAC780F01482AAD700BCF976 /* WebViewController.m */; };
|
||||
DAC781361482E67300BCF976 /* OPRecentViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAC781351482E67300BCF976 /* OPRecentViewController.m */; };
|
||||
DADC3C4D14C62B350091CB4D /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DADC3C4C14C62B350091CB4D /* Settings.bundle */; };
|
||||
DAE2C648148247E500BA6B10 /* OPTypeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE2C646148247E500BA6B10 /* OPTypeViewController.m */; };
|
||||
DAE998D214C1D2A0002D7C22 /* Content-Backdrop.png in Resources */ = {isa = PBXBuildFile; fileRef = DAE9987914C1D2A0002D7C22 /* Content-Backdrop.png */; };
|
||||
DAE998D314C1D2A0002D7C22 /* Content-Backdrop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAE9987A14C1D2A0002D7C22 /* Content-Backdrop@2x.png */; };
|
||||
@ -616,6 +619,8 @@
|
||||
DA007F5114B24DCD00251337 /* OPConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OPConfig.m; sourceTree = "<group>"; };
|
||||
DA007F5414B25EE100251337 /* ciphers.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ciphers.plist; sourceTree = "<group>"; };
|
||||
DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
|
||||
DA0A848A14C4DFCB0090EA8E /* OPElementGeneratedEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OPElementGeneratedEntity.h; sourceTree = "<group>"; };
|
||||
DA0A848B14C4DFCB0090EA8E /* OPElementGeneratedEntity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OPElementGeneratedEntity.m; sourceTree = "<group>"; };
|
||||
DA0B951014C2D69E001D4EB1 /* help.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = help.html; path = Resources/help.html; sourceTree = "<group>"; };
|
||||
DA0B951314C37486001D4EB1 /* addressbook-person@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "addressbook-person@2x.png"; sourceTree = "<group>"; };
|
||||
DA0B951414C37486001D4EB1 /* addressbook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = addressbook.png; sourceTree = "<group>"; };
|
||||
@ -987,7 +992,8 @@
|
||||
DA5BFA66147E415C00F98B1E /* OPMainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OPMainViewController.m; sourceTree = "<group>"; };
|
||||
DA5DB7A514BE4B19002DD256 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = ../Default.png; sourceTree = "<group>"; };
|
||||
DA5DB7A714BE4B4B002DD256 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = "<group>"; };
|
||||
DABF7DA414BE54E4007F3557 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = SOURCE_ROOT; };
|
||||
DA7659AD14C5E22E00769249 /* Square-bottom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Square-bottom.png"; sourceTree = "<group>"; };
|
||||
DA7659AE14C5E22E00769249 /* Square-top.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Square-top.png"; sourceTree = "<group>"; };
|
||||
DAC6325D1486805C0075AEA5 /* libuicolor-utilities.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libuicolor-utilities.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DAC6326C148680650075AEA5 /* libjrswizzle.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjrswizzle.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DAC632791486809A0075AEA5 /* JRSwizzle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JRSwizzle.h; path = External/Pearl/External/jrswizzle/JRSwizzle.h; sourceTree = SOURCE_ROOT; };
|
||||
@ -2070,6 +2076,7 @@
|
||||
DAC780F01482AAD700BCF976 /* WebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewController.m; sourceTree = "<group>"; };
|
||||
DAC781341482E67300BCF976 /* OPRecentViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OPRecentViewController.h; sourceTree = "<group>"; };
|
||||
DAC781351482E67300BCF976 /* OPRecentViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OPRecentViewController.m; sourceTree = "<group>"; };
|
||||
DADC3C4C14C62B350091CB4D /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||
DAE2C645148247E500BA6B10 /* OPTypeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OPTypeViewController.h; sourceTree = "<group>"; };
|
||||
DAE2C646148247E500BA6B10 /* OPTypeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OPTypeViewController.m; sourceTree = "<group>"; };
|
||||
DAE9987914C1D2A0002D7C22 /* Content-Backdrop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Content-Backdrop.png"; path = "Resources/Content-Backdrop.png"; sourceTree = "<group>"; };
|
||||
@ -2658,6 +2665,7 @@
|
||||
DA34DA1514B1BEA100F721C1 /* OPTypes.m */,
|
||||
DA007F5014B24DCC00251337 /* OPConfig.h */,
|
||||
DA007F5114B24DCD00251337 /* OPConfig.m */,
|
||||
DADC3C4C14C62B350091CB4D /* Settings.bundle */,
|
||||
);
|
||||
path = OnePassword;
|
||||
sourceTree = "<group>";
|
||||
@ -2704,6 +2712,8 @@
|
||||
children = (
|
||||
DA34DA0F14B1BC7E00F721C1 /* OPElementEntity.h */,
|
||||
DA34DA1014B1BC7E00F721C1 /* OPElementEntity.m */,
|
||||
DA0A848A14C4DFCB0090EA8E /* OPElementGeneratedEntity.h */,
|
||||
DA0A848B14C4DFCB0090EA8E /* OPElementGeneratedEntity.m */,
|
||||
DA34DA0B14B1BC7D00F721C1 /* OPElementStoredEntity.h */,
|
||||
DA34DA0C14B1BC7D00F721C1 /* OPElementStoredEntity.m */,
|
||||
);
|
||||
@ -2789,7 +2799,6 @@
|
||||
DAC77CD31482AAD600BCF976 /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DABF7DA414BE54E4007F3557 /* Default.png */,
|
||||
DAC77CD41482AAD600BCF976 /* Pearl.strings */,
|
||||
);
|
||||
path = Resources;
|
||||
@ -3878,6 +3887,8 @@
|
||||
DAE9987B14C1D2A0002D7C22 /* Dividers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DA7659AD14C5E22E00769249 /* Square-bottom.png */,
|
||||
DA7659AE14C5E22E00769249 /* Square-top.png */,
|
||||
DAE9987C14C1D2A0002D7C22 /* Bold_Lines.png */,
|
||||
DAE9987D14C1D2A0002D7C22 /* Box.png */,
|
||||
DAE9987E14C1D2A0002D7C22 /* Dashed_Divider.png */,
|
||||
@ -4192,7 +4203,6 @@
|
||||
DA007F5614B26EFA00251337 /* Pearl.strings in Resources */,
|
||||
DA5DB7A614BE4B19002DD256 /* Default.png in Resources */,
|
||||
DA5DB7A814BE4B4B002DD256 /* Default@2x.png in Resources */,
|
||||
DABF7DA514BE54E4007F3557 /* Default.png in Resources */,
|
||||
DAE998D214C1D2A0002D7C22 /* Content-Backdrop.png in Resources */,
|
||||
DAE998D314C1D2A0002D7C22 /* Content-Backdrop@2x.png in Resources */,
|
||||
DAE998D414C1D2A0002D7C22 /* Bold_Lines.png in Resources */,
|
||||
@ -4668,6 +4678,9 @@
|
||||
DA0B97BC14C37487001D4EB1 /* volume-mute@2x.png in Resources */,
|
||||
DA0B97BD14C37487001D4EB1 /* wrench.png in Resources */,
|
||||
DA0B97BE14C37487001D4EB1 /* wrench@2x.png in Resources */,
|
||||
DA7659AF14C5E22E00769249 /* Square-bottom.png in Resources */,
|
||||
DA7659B014C5E22E00769249 /* Square-top.png in Resources */,
|
||||
DADC3C4D14C62B350091CB4D /* Settings.bundle in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -4690,6 +4703,7 @@
|
||||
DA007F5214B24DCD00251337 /* OPConfig.m in Sources */,
|
||||
DA55B29E14B38272001131B7 /* OPContentViewController.m in Sources */,
|
||||
DA55B2A214B4EB47001131B7 /* OPSearchDelegate.m in Sources */,
|
||||
DA0A848C14C4DFCB0090EA8E /* OPElementGeneratedEntity.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -16,6 +16,7 @@
|
||||
@property (strong, nonatomic) NSString *keyPhrase;
|
||||
|
||||
+ (OPAppDelegate *)get;
|
||||
+ (NSManagedObjectContext *)managedObjectContext;
|
||||
|
||||
- (void)saveContext;
|
||||
- (NSURL *)applicationDocumentsDirectory;
|
||||
|
@ -10,6 +10,13 @@
|
||||
|
||||
#import "OPMainViewController.h"
|
||||
|
||||
@interface OPAppDelegate ()
|
||||
|
||||
+ (NSDictionary *)keyPhraseQuery;
|
||||
+ (NSDictionary *)keyPhraseHashQuery;
|
||||
|
||||
@end
|
||||
|
||||
@implementation OPAppDelegate
|
||||
|
||||
@synthesize managedObjectContext = __managedObjectContext;
|
||||
@ -22,26 +29,63 @@
|
||||
[Logger get].autoprintLevel = LogLevelDebug;
|
||||
}
|
||||
|
||||
- (void)applicationWillResignActive:(UIApplication *)application {
|
||||
+ (NSDictionary *)keyPhraseQuery {
|
||||
|
||||
if (![[OPConfig get].rememberKeyPhrase boolValue])
|
||||
self.keyPhrase = nil;
|
||||
static NSDictionary *OPKeyPhraseQuery = nil;
|
||||
if (!OPKeyPhraseQuery)
|
||||
OPKeyPhraseQuery = [KeyChain createQueryForClass:kSecClassGenericPassword
|
||||
attributes:[NSDictionary dictionaryWithObject:@"MasterKeyPhrase"
|
||||
forKey:(__bridge id)kSecAttrService]
|
||||
matches:nil];
|
||||
|
||||
return OPKeyPhraseQuery;
|
||||
}
|
||||
|
||||
+ (NSDictionary *)keyPhraseHashQuery {
|
||||
|
||||
static NSDictionary *OPKeyPhraseHashQuery = nil;
|
||||
if (!OPKeyPhraseHashQuery)
|
||||
OPKeyPhraseHashQuery = [KeyChain createQueryForClass:kSecClassGenericPassword
|
||||
attributes:[NSDictionary dictionaryWithObject:@"MasterKeyPhraseHash"
|
||||
forKey:(__bridge id)kSecAttrService]
|
||||
matches:nil];
|
||||
|
||||
return OPKeyPhraseHashQuery;
|
||||
}
|
||||
|
||||
- (void)applicationDidBecomeActive:(UIApplication *)application {
|
||||
|
||||
if (!self.keyPhrase)
|
||||
if ([[OPConfig get].storeKeyPhrase boolValue]) {
|
||||
// Key phrase is stored in keychain. Load it.
|
||||
dbg(@"Loading master key phrase from key chain.");
|
||||
NSData *keyPhraseData = [KeyChain dataOfItemForQuery:[OPAppDelegate keyPhraseQuery]];
|
||||
dbg(@" -> Master key phrase %@.", keyPhraseData? @"found": @"NOT found");
|
||||
|
||||
self.keyPhrase = keyPhraseData? [[NSString alloc] initWithBytes:keyPhraseData.bytes length:keyPhraseData.length
|
||||
encoding:NSUTF8StringEncoding]: nil;
|
||||
} else {
|
||||
// Key phrase should not be stored in keychain. Delete it.
|
||||
dbg(@"Deleting master key phrase from key chain.");
|
||||
[KeyChain deleteItemForQuery:[OPAppDelegate keyPhraseQuery]];
|
||||
}
|
||||
|
||||
if (!self.keyPhrase) {
|
||||
// Key phrase is not known. Ask user to set/specify it.
|
||||
dbg(@"Key phrase not known. Will ask user.");
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
NSString *keyPhraseHash = [OPConfig get].keyPhraseHash;
|
||||
NSData *keyPhraseHash = [KeyChain dataOfItemForQuery:[OPAppDelegate keyPhraseHashQuery]];
|
||||
dbg(@"Key phrase hash %@.", keyPhraseHash? @"known": @"NOT known");
|
||||
|
||||
AlertViewController *keyPhraseAlert = [[AlertViewController alloc] initQuestionWithTitle:@"One Password"
|
||||
message:keyPhraseHash? @"Unlock with your master password:": @"Choose your master password:"
|
||||
tappedButtonBlock:
|
||||
^(NSInteger buttonIndex, NSString *answer) {
|
||||
if (buttonIndex == 0)
|
||||
if (!buttonIndex)
|
||||
exit(0);
|
||||
|
||||
if (![answer length]) {
|
||||
// User didn't enter a key phrase.
|
||||
[AlertViewController showAlertWithTitle:[PearlStrings get].commonTitleError
|
||||
message:@"No master password entered."
|
||||
tappedButtonBlock:
|
||||
@ -50,9 +94,13 @@
|
||||
} cancelTitle:@"Quit" otherTitles:nil];
|
||||
}
|
||||
|
||||
NSString *answerHash = [[answer hashWith:PearlDigestSHA1] encodeHex];
|
||||
if (keyPhraseHash) {
|
||||
if (![keyPhraseHash isEqualToString:answerHash]) {
|
||||
NSData *answerHash = [answer hashWith:PearlDigestSHA512];
|
||||
if (keyPhraseHash)
|
||||
// A key phrase hash is known -> a key phrase is set.
|
||||
// Make sure the user's entered key phrase matches it.
|
||||
if (![keyPhraseHash isEqual:answerHash]) {
|
||||
dbg(@"Key phrase hash mismatch. Expected: %@, answer: %@.", keyPhraseHash, answerHash);
|
||||
|
||||
[AlertViewController showAlertWithTitle:[PearlStrings get].commonTitleError
|
||||
message:@"Incorrect master password."
|
||||
tappedButtonBlock:
|
||||
@ -62,16 +110,23 @@
|
||||
|
||||
return;
|
||||
}
|
||||
} else
|
||||
[OPConfig get].keyPhraseHash = answerHash;
|
||||
|
||||
self.keyPhrase = answer;
|
||||
} cancelTitle:@"Quit" otherTitles:@"Unlock", nil];
|
||||
keyPhraseAlert.alertField.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
||||
keyPhraseAlert.alertField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
keyPhraseAlert.alertField.enablesReturnKeyAutomatically = YES;
|
||||
keyPhraseAlert.alertField.returnKeyType = UIReturnKeyGo;
|
||||
keyPhraseAlert.alertField.secureTextEntry = YES;
|
||||
[keyPhraseAlert showAlert];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
- (void)applicationWillResignActive:(UIApplication *)application {
|
||||
|
||||
if (![[OPConfig get].rememberKeyPhrase boolValue])
|
||||
self.keyPhrase = nil;
|
||||
}
|
||||
|
||||
- (void)applicationWillTerminate:(UIApplication *)application
|
||||
@ -85,6 +140,11 @@
|
||||
return (OPAppDelegate *)[super get];
|
||||
}
|
||||
|
||||
+ (NSManagedObjectContext *)managedObjectContext{
|
||||
|
||||
return [(OPAppDelegate *)[UIApplication sharedApplication].delegate managedObjectContext];
|
||||
}
|
||||
|
||||
- (void)saveContext
|
||||
{
|
||||
NSError *error = nil;
|
||||
@ -99,6 +159,25 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setKeyPhrase:(NSString *)keyPhrase {
|
||||
|
||||
_keyPhrase = keyPhrase;
|
||||
|
||||
if (keyPhrase) {
|
||||
NSData *keyPhraseHash = [keyPhrase hashWith:PearlDigestSHA512];
|
||||
dbg(@"Updating master key phrase hash to: %@.", keyPhraseHash);
|
||||
[KeyChain addOrUpdateItemForQuery:[OPAppDelegate keyPhraseHashQuery]
|
||||
withAttributes:[NSDictionary dictionaryWithObject:keyPhraseHash
|
||||
forKey:(__bridge id)kSecValueData]];
|
||||
if ([[OPConfig get].storeKeyPhrase boolValue]) {
|
||||
dbg(@"Storing master key phrase in key chain.");
|
||||
[KeyChain addOrUpdateItemForQuery:[OPAppDelegate keyPhraseQuery]
|
||||
withAttributes:[NSDictionary dictionaryWithObject:[keyPhrase dataUsingEncoding:NSUTF8StringEncoding]
|
||||
forKey:(__bridge id)kSecValueData]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Core Data stack
|
||||
|
||||
/**
|
||||
|
@ -9,8 +9,9 @@
|
||||
@interface OPConfig : Config
|
||||
|
||||
@property (nonatomic, retain) NSNumber *dataStoreError;
|
||||
@property (nonatomic, retain) NSString *keyPhraseHash;
|
||||
@property (nonatomic, retain) NSNumber *storeKeyPhrase;
|
||||
@property (nonatomic, retain) NSNumber *rememberKeyPhrase;
|
||||
@property (nonatomic, retain) NSNumber *helpHidden;
|
||||
|
||||
+ (OPConfig *)get;
|
||||
|
||||
|
@ -10,18 +10,19 @@
|
||||
|
||||
@implementation OPConfig
|
||||
|
||||
@dynamic dataStoreError, keyPhraseHash, rememberKeyPhrase;
|
||||
@dynamic dataStoreError, storeKeyPhrase, rememberKeyPhrase, helpHidden;
|
||||
|
||||
|
||||
-(id) init {
|
||||
- (id)init {
|
||||
|
||||
if(!(self = [super init]))
|
||||
return self;
|
||||
|
||||
[self.defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSNumber numberWithBool:NO], NSStringFromSelector(@selector(dataStoreError)),
|
||||
[NSNumber numberWithBool:NO], NSStringFromSelector(@selector(storeKeyPhrase)),
|
||||
[NSNumber numberWithBool:NO], NSStringFromSelector(@selector(rememberKeyPhrase)),
|
||||
|
||||
[NSNumber numberWithBool:NO], NSStringFromSelector(@selector(helpHidden)),
|
||||
nil]];
|
||||
|
||||
return self;
|
||||
|
@ -7,7 +7,6 @@
|
||||
//
|
||||
|
||||
#import "OPElementEntity.h"
|
||||
#import "OPAppDelegate.h"
|
||||
|
||||
|
||||
@implementation OPElementEntity
|
||||
@ -27,14 +26,7 @@
|
||||
|
||||
- (id)content {
|
||||
|
||||
if (![self.name length])
|
||||
return nil;
|
||||
|
||||
if (self.type & OPElementTypeCalculated)
|
||||
return OPCalculateContent(self.type, self.name, [OPAppDelegate get].keyPhrase);
|
||||
|
||||
@throw [NSException exceptionWithName:NSInternalInconsistencyException
|
||||
reason:[NSString stringWithFormat:@"Unsupported type: %d", self.type] userInfo:nil];
|
||||
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Content implementation missing." userInfo:nil];
|
||||
}
|
||||
|
||||
- (NSString *)contentDescription {
|
||||
|
18
OnePassword/OPElementGeneratedEntity.h
Normal file
@ -0,0 +1,18 @@
|
||||
//
|
||||
// OPElementGeneratedEntity.h
|
||||
// OnePassword
|
||||
//
|
||||
// Created by Maarten Billemont on 16/01/12.
|
||||
// Copyright (c) 2012 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreData/CoreData.h>
|
||||
#import "OPElementEntity.h"
|
||||
|
||||
|
||||
@interface OPElementGeneratedEntity : OPElementEntity
|
||||
|
||||
@property (nonatomic) int16_t counter;
|
||||
|
||||
@end
|
29
OnePassword/OPElementGeneratedEntity.m
Normal file
@ -0,0 +1,29 @@
|
||||
//
|
||||
// OPElementGeneratedEntity.m
|
||||
// OnePassword
|
||||
//
|
||||
// Created by Maarten Billemont on 16/01/12.
|
||||
// Copyright (c) 2012 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OPElementGeneratedEntity.h"
|
||||
#import "OPAppDelegate.h"
|
||||
|
||||
|
||||
@implementation OPElementGeneratedEntity
|
||||
|
||||
@dynamic counter;
|
||||
|
||||
- (id)content {
|
||||
|
||||
if (![self.name length])
|
||||
return nil;
|
||||
|
||||
if (self.type & OPElementTypeCalculated)
|
||||
return OPCalculateContent(self.type, self.name, [OPAppDelegate get].keyPhrase, self.counter);
|
||||
|
||||
@throw [NSException exceptionWithName:NSInternalInconsistencyException
|
||||
reason:[NSString stringWithFormat:@"Unsupported type: %d", self.type] userInfo:nil];
|
||||
}
|
||||
|
||||
@end
|
@ -20,9 +20,14 @@
|
||||
@property (weak, nonatomic) IBOutlet UILabel *siteName;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *passwordCounter;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *passwordIncrementer;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *passwordEdit;
|
||||
@property (weak, nonatomic) IBOutlet UIView *contentContainer;
|
||||
@property (weak, nonatomic) IBOutlet UIView *helpContainer;
|
||||
|
||||
- (IBAction)didChangeContentType:(UISegmentedControl *)sender;
|
||||
- (IBAction)didTriggerContent;
|
||||
- (IBAction)didIncrementPasswordCounter;
|
||||
- (IBAction)copyContent;
|
||||
- (IBAction)incrementPasswordCounter;
|
||||
- (IBAction)editPassword;
|
||||
- (IBAction)toggleHelp;
|
||||
- (void)toggleHelp:(BOOL)hidden;
|
||||
|
||||
@end
|
||||
|
@ -9,6 +9,8 @@
|
||||
#import "OPMainViewController.h"
|
||||
#import "OPAppDelegate.h"
|
||||
#import "OPContentViewController.h"
|
||||
#import "OPElementGeneratedEntity.h"
|
||||
#import "OPElementStoredEntity.h"
|
||||
|
||||
#import <MobileCoreServices/MobileCoreServices.h>
|
||||
|
||||
@ -28,6 +30,9 @@
|
||||
@synthesize siteName = _siteName;
|
||||
@synthesize passwordCounter = _passwordCounter;
|
||||
@synthesize passwordIncrementer = _passwordIncrementer;
|
||||
@synthesize passwordEdit = _passwordEdit;
|
||||
@synthesize contentContainer = _contentContainer;
|
||||
@synthesize helpContainer = _helpContainer;
|
||||
@synthesize contentField = _contentField;
|
||||
|
||||
#pragma mark - View lifecycle
|
||||
@ -49,6 +54,7 @@
|
||||
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
[self toggleHelp:[[OPConfig get].helpHidden boolValue]];
|
||||
[self updateAnimated:NO];
|
||||
}
|
||||
|
||||
@ -56,7 +62,7 @@
|
||||
|
||||
// Because IB's edit button doesn't auto-toggle self.editable like editButtonItem does.
|
||||
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background"]];
|
||||
|
||||
|
||||
[super viewDidLoad];
|
||||
}
|
||||
|
||||
@ -69,6 +75,9 @@
|
||||
[self setSiteName:nil];
|
||||
[self setPasswordCounter:nil];
|
||||
[self setPasswordIncrementer:nil];
|
||||
[self setPasswordEdit:nil];
|
||||
[self setContentContainer:nil];
|
||||
[self setHelpContainer:nil];
|
||||
[super viewDidUnload];
|
||||
}
|
||||
|
||||
@ -80,7 +89,7 @@
|
||||
}
|
||||
|
||||
- (void)updateAnimated:(BOOL)animated {
|
||||
|
||||
|
||||
[[OPAppDelegate get] saveContext];
|
||||
|
||||
if (animated)
|
||||
@ -92,28 +101,27 @@
|
||||
}
|
||||
|
||||
- (void)updateWasAnimated:(BOOL)animated {
|
||||
|
||||
|
||||
NSUInteger chapter = self.activeElement? 2: 1;
|
||||
[self.helpView loadRequest:
|
||||
[NSURLRequest requestWithURL:
|
||||
[NSURL URLWithString:[NSString stringWithFormat:@"#%d", chapter] relativeToURL:
|
||||
[[NSBundle mainBundle] URLForResource:@"help" withExtension:@"html"]]]];
|
||||
|
||||
[NSURLRequest requestWithURL:
|
||||
[NSURL URLWithString:[NSString stringWithFormat:@"#%d", chapter] relativeToURL:
|
||||
[[NSBundle mainBundle] URLForResource:@"help" withExtension:@"html"]]]];
|
||||
|
||||
[self.navigationItem setRightBarButtonItem:self.activeElement.type & OPElementTypeStored? self.editButtonItem: nil animated:animated];
|
||||
|
||||
self.searchDisplayController.searchBar.placeholder = self.activeElement.name;
|
||||
|
||||
self.siteName.text = self.activeElement.name;
|
||||
|
||||
self.passwordCounter.alpha = self.activeElement.type & OPElementTypeCalculated? 1: 0;
|
||||
self.passwordIncrementer.alpha = self.activeElement.type & OPElementTypeCalculated? 1: 0;
|
||||
|
||||
self.passwordCounter.alpha = self.activeElement.type & OPElementTypeCalculated? 0.5f: 0;
|
||||
self.passwordIncrementer.alpha = self.activeElement.type & OPElementTypeCalculated? 0.5f: 0;
|
||||
self.passwordEdit.alpha = self.activeElement.type & OPElementTypeStored? 0.5f: 0;
|
||||
|
||||
[self.typeButton setTitle:NSStringFromOPElementType(self.activeElement.type)
|
||||
forState:UIControlStateNormal];
|
||||
|
||||
self.contentField.enabled = self.editing && self.activeElement.type & OPElementTypeStored;
|
||||
self.contentField.clearButtonMode = self.contentField.enabled? UITextFieldViewModeAlways: UITextFieldViewModeNever;
|
||||
self.contentField.text = @"...";
|
||||
|
||||
self.typeButton.alpha = NSStringFromOPElementType(self.activeElement.type).length? 1: 0;
|
||||
|
||||
self.contentField.enabled = NO;
|
||||
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
||||
NSString *contentDescription = self.activeElement.contentDescription;
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
@ -124,34 +132,103 @@
|
||||
|
||||
#pragma mark - Protocols
|
||||
|
||||
- (IBAction)didChangeContentType:(UISegmentedControl *)sender {
|
||||
|
||||
[self updateAnimated:YES];
|
||||
}
|
||||
|
||||
- (IBAction)didTriggerContent:(id)sender {
|
||||
- (IBAction)copyContent {
|
||||
|
||||
[[UIPasteboard generalPasteboard] setValue:self.activeElement.content
|
||||
forPasteboardType:self.activeElement.contentUTI];
|
||||
}
|
||||
|
||||
- (IBAction)didIncrementPasswordCounter {
|
||||
- (IBAction)incrementPasswordCounter {
|
||||
|
||||
if ([self.activeElement isKindOfClass:[OPElementGeneratedEntity class]])
|
||||
[AlertViewController showAlertWithTitle:@"Change Password"
|
||||
message:l(@"Setting a new password for %@.\n"
|
||||
@"Don't forget to update your password on the site as well!", self.activeElement.name)
|
||||
tappedButtonBlock:^(NSInteger buttonIndex) {
|
||||
if (!buttonIndex)
|
||||
return;
|
||||
|
||||
// Update password counter.
|
||||
if ([self.activeElement isKindOfClass:[OPElementGeneratedEntity class]]) {
|
||||
++((OPElementGeneratedEntity *) self.activeElement).counter;
|
||||
[self updateAnimated:YES];
|
||||
}
|
||||
} cancelTitle:[PearlStrings get].commonButtonAbort otherTitles:[PearlStrings get].commonButtonThanks, nil];
|
||||
}
|
||||
|
||||
- (IBAction)editPassword {
|
||||
|
||||
if (self.activeElement.type & OPElementTypeStored) {
|
||||
self.contentField.enabled = YES;
|
||||
[self.contentField becomeFirstResponder];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)toggleHelp {
|
||||
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
if (self.helpContainer.frame.origin.y < 400)
|
||||
[self toggleHelp:YES];
|
||||
else
|
||||
[self toggleHelp:NO];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)toggleHelp:(BOOL)hidden {
|
||||
|
||||
if (hidden) {
|
||||
self.contentContainer.frame = CGRectSetHeight(self.contentContainer.frame, 373);
|
||||
//self.helpContainer.frame = CGRectSetHeight(self.helpContainer.frame, 0);
|
||||
self.helpContainer.frame = CGRectSetY(self.helpContainer.frame, 414);
|
||||
[OPConfig get].helpHidden = [NSNumber numberWithBool:YES];
|
||||
} else {
|
||||
self.contentContainer.frame = CGRectSetHeight(self.contentContainer.frame, 155);
|
||||
//self.helpContainer.frame = CGRectSetHeight(self.helpContainer.frame, 219);
|
||||
self.helpContainer.frame = CGRectSetY(self.helpContainer.frame, 196);
|
||||
[OPConfig get].helpHidden = [NSNumber numberWithBool:NO];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)didSelectType:(OPElementType)type {
|
||||
|
||||
self.activeElement.type = type;
|
||||
[self updateAnimated:YES];
|
||||
[AlertViewController showAlertWithTitle:@"Change Password Type"
|
||||
message:l(@"Changing the type of %@'s password.\n"
|
||||
@"Don't forget to update your password on the site as well!", self.activeElement.name)
|
||||
tappedButtonBlock:^(NSInteger buttonIndex) {
|
||||
if (!buttonIndex)
|
||||
return;
|
||||
|
||||
// Update password type.
|
||||
if (ClassForOPElementType(type) != ClassForOPElementType(self.activeElement.type)) {
|
||||
// Type requires a different class of element. Recreate the element.
|
||||
OPElementEntity *newElement = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass(ClassForOPElementType(type))
|
||||
inManagedObjectContext:[OPAppDelegate managedObjectContext]];
|
||||
|
||||
newElement.name = self.activeElement.name;
|
||||
newElement.uses = self.activeElement.uses;
|
||||
newElement.lastUsed = self.activeElement.lastUsed;
|
||||
newElement.contentUTI = self.activeElement.contentUTI;
|
||||
newElement.contentType = self.activeElement.contentType;
|
||||
|
||||
[[OPAppDelegate managedObjectContext] deleteObject:self.activeElement];
|
||||
self.activeElement = newElement;
|
||||
}
|
||||
self.activeElement.type = type;
|
||||
|
||||
// Redraw.
|
||||
[self updateAnimated:YES];
|
||||
} cancelTitle:[PearlStrings get].commonButtonAbort otherTitles:[PearlStrings get].commonButtonThanks, nil];
|
||||
}
|
||||
|
||||
- (void)didSelectElement:(OPElementEntity *)element {
|
||||
|
||||
self.activeElement = element;
|
||||
[self.activeElement use];
|
||||
[self updateAnimated:YES];
|
||||
|
||||
self.searchDisplayController.searchBar.text = @"";
|
||||
|
||||
[self.searchDisplayController setActive:NO animated:YES];
|
||||
self.searchDisplayController.searchBar.text = self.activeElement.name;
|
||||
|
||||
[self updateAnimated:YES];
|
||||
}
|
||||
|
||||
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
|
||||
@ -159,4 +236,32 @@
|
||||
[self updateAnimated:YES];
|
||||
}
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
|
||||
if (textField == self.contentField)
|
||||
[self.contentField resignFirstResponder];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
||||
|
||||
if (textField == self.contentField) {
|
||||
self.contentField.enabled = NO;
|
||||
[AlertViewController showAlertWithTitle:@"Change Password"
|
||||
message:l(@"Setting a new password for %@.\n"
|
||||
@"Don't forget to update your password on the site as well!", self.activeElement.name)
|
||||
tappedButtonBlock:^(NSInteger buttonIndex) {
|
||||
if (buttonIndex) {
|
||||
// Update password content.
|
||||
if ([self.activeElement isKindOfClass:[OPElementStoredEntity class]])
|
||||
((OPElementStoredEntity *) self.activeElement).contentObject = self.contentField.text;
|
||||
}
|
||||
|
||||
// Redraw.
|
||||
[self updateAnimated:YES];
|
||||
} cancelTitle:[PearlStrings get].commonButtonAbort otherTitles:[PearlStrings get].commonButtonThanks, nil];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -8,10 +8,10 @@
|
||||
|
||||
#import "OPSearchDelegate.h"
|
||||
#import "OPAppDelegate.h"
|
||||
#import "OPElementGeneratedEntity.h"
|
||||
|
||||
@interface OPSearchDelegate (Private)
|
||||
|
||||
- (NSManagedObjectContext *)managedObjectContext;
|
||||
- (void)update;
|
||||
|
||||
@end
|
||||
@ -21,41 +21,47 @@
|
||||
@synthesize delegate;
|
||||
@synthesize searchDisplayController;
|
||||
|
||||
- (NSManagedObjectContext *)managedObjectContext {
|
||||
|
||||
return [(OPAppDelegate *)[UIApplication sharedApplication].delegate managedObjectContext];
|
||||
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
|
||||
|
||||
self.searchDisplayController.searchBar.text = @"";
|
||||
self.searchDisplayController.searchBar.prompt = @"Enter the site's domain name (eg. apple.com):";
|
||||
[self update];
|
||||
}
|
||||
|
||||
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
|
||||
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
|
||||
|
||||
self.searchDisplayController.searchBar.prompt = nil;
|
||||
}
|
||||
|
||||
[self.searchDisplayController.searchResultsTableView setEditing:self.searchDisplayController.searchContentsController.editing animated:NO];
|
||||
[self update];
|
||||
- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
|
||||
|
||||
[tableView setEditing:self.searchDisplayController.searchContentsController.editing animated:NO];
|
||||
}
|
||||
|
||||
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
|
||||
|
||||
|
||||
[self update];
|
||||
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)update {
|
||||
|
||||
|
||||
NSString *text = self.searchDisplayController.searchBar.text;
|
||||
if (!text)
|
||||
text = @"";
|
||||
|
||||
|
||||
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([OPElementEntity class])];
|
||||
[fetchRequest setSortDescriptors:
|
||||
[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"uses" ascending:NO]]];
|
||||
[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"uses" ascending:NO]]];
|
||||
[fetchRequest setPredicate:
|
||||
[NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", text]];
|
||||
|
||||
[NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", text]];
|
||||
|
||||
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
|
||||
managedObjectContext:[self managedObjectContext]
|
||||
managedObjectContext:[OPAppDelegate managedObjectContext]
|
||||
sectionNameKeyPath:nil cacheName:nil];
|
||||
self.fetchedResultsController.delegate = self;
|
||||
|
||||
|
||||
NSError *error;
|
||||
if (![self.fetchedResultsController performFetch:&error])
|
||||
err(@"Couldn't fetch elements: %@", error);
|
||||
@ -151,7 +157,7 @@
|
||||
cell.detailTextLabel.text = @"New";
|
||||
} else {
|
||||
OPElementEntity *element = [self.fetchedResultsController objectAtIndexPath:indexPath];
|
||||
|
||||
|
||||
cell.textLabel.text = element.name;
|
||||
cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", element.uses];
|
||||
}
|
||||
@ -162,8 +168,8 @@
|
||||
OPElementEntity *element;
|
||||
indexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section - 1];
|
||||
if (indexPath.section == -1) {
|
||||
element = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([OPElementEntity class])
|
||||
inManagedObjectContext:[self managedObjectContext]];
|
||||
element = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([OPElementGeneratedEntity class])
|
||||
inManagedObjectContext:[OPAppDelegate managedObjectContext]];
|
||||
element.name = self.searchDisplayController.searchBar.text;
|
||||
} else
|
||||
element = [self.fetchedResultsController objectAtIndexPath:indexPath];
|
||||
@ -190,13 +196,13 @@
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
|
||||
indexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section - 1];
|
||||
|
||||
|
||||
if (editingStyle == UITableViewCellEditingStyleDelete) {
|
||||
OPElementEntity *element = [self.fetchedResultsController objectAtIndexPath:indexPath];
|
||||
|
||||
[[self managedObjectContext] deleteObject:element];
|
||||
|
||||
[[OPAppDelegate managedObjectContext] deleteObject:element];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,4 +31,5 @@ typedef enum {
|
||||
} OPElementType;
|
||||
|
||||
NSString *NSStringFromOPElementType(OPElementType type);
|
||||
NSString *OPCalculateContent(OPElementType type, NSString *name, NSString *keyPhrase);
|
||||
Class ClassForOPElementType(OPElementType type);
|
||||
NSString *OPCalculateContent(OPElementType type, NSString *name, NSString *keyPhrase, int counter);
|
@ -7,6 +7,8 @@
|
||||
//
|
||||
|
||||
#import "OPTypes.h"
|
||||
#import "OPElementGeneratedEntity.h"
|
||||
#import "OPElementStoredEntity.h"
|
||||
|
||||
|
||||
NSString *NSStringFromOPElementType(OPElementType type) {
|
||||
@ -41,8 +43,40 @@ NSString *NSStringFromOPElementType(OPElementType type) {
|
||||
}
|
||||
}
|
||||
|
||||
Class ClassForOPElementType(OPElementType type) {
|
||||
|
||||
if (!type)
|
||||
return nil;
|
||||
|
||||
switch (type) {
|
||||
case OPElementTypeCalculatedLong:
|
||||
return [OPElementGeneratedEntity class];
|
||||
|
||||
case OPElementTypeCalculatedMedium:
|
||||
return [OPElementGeneratedEntity class];
|
||||
|
||||
case OPElementTypeCalculatedShort:
|
||||
return [OPElementGeneratedEntity class];
|
||||
|
||||
case OPElementTypeCalculatedBasic:
|
||||
return [OPElementGeneratedEntity class];
|
||||
|
||||
case OPElementTypeCalculatedPIN:
|
||||
return [OPElementGeneratedEntity class];
|
||||
|
||||
case OPElementTypeStoredPersonal:
|
||||
return [OPElementStoredEntity class];
|
||||
|
||||
case OPElementTypeStoredDevicePrivate:
|
||||
return [OPElementStoredEntity class];
|
||||
|
||||
default:
|
||||
[NSException raise:NSInternalInconsistencyException format:@"Type not supported: %d", type];
|
||||
}
|
||||
}
|
||||
|
||||
static NSDictionary *OPTypes_ciphers = nil;
|
||||
NSString *OPCalculateContent(OPElementType type, NSString *name, NSString *keyPhrase) {
|
||||
NSString *OPCalculateContent(OPElementType type, NSString *name, NSString *keyPhrase, int counter) {
|
||||
|
||||
assert(type & OPElementTypeCalculated);
|
||||
|
||||
@ -52,7 +86,7 @@ NSString *OPCalculateContent(OPElementType type, NSString *name, NSString *keyPh
|
||||
|
||||
// Determine the hash whose bytes will be used for calculating a password: md4(name-keyPhrase)
|
||||
assert(name && keyPhrase);
|
||||
NSData *keyHash = [[NSString stringWithFormat:@"%@-%@", name, keyPhrase] hashWith:PearlDigestMD4];
|
||||
NSData *keyHash = [[NSString stringWithFormat:@"%@-%@-%d", name, keyPhrase, counter] hashWith:PearlDigestMD4];
|
||||
const char *keyBytes = keyHash.bytes;
|
||||
|
||||
// Determine the cipher from the first hash byte.
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model name="" userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="872" systemVersion="11C74" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||
<entity name="OPElementEntity" representedClassName="OPElementEntity" syncable="YES">
|
||||
<entity name="OPElementEntity" representedClassName="OPElementEntity" isAbstract="YES" syncable="YES">
|
||||
<attribute name="contentType" optional="YES" attributeType="Integer 16" defaultValueString="0" syncable="YES"/>
|
||||
<attribute name="contentUTI" attributeType="String" defaultValueString="public.plain-text" syncable="YES"/>
|
||||
<attribute name="lastUsed" attributeType="Date" syncable="YES"/>
|
||||
@ -8,12 +8,16 @@
|
||||
<attribute name="type" attributeType="Integer 16" defaultValueString="257" syncable="YES"/>
|
||||
<attribute name="uses" attributeType="Integer 16" defaultValueString="0" syncable="YES"/>
|
||||
</entity>
|
||||
<entity name="OPElementGeneratedEntity" representedClassName="OPElementGeneratedEntity" parentEntity="OPElementEntity" syncable="YES">
|
||||
<attribute name="counter" optional="YES" attributeType="Integer 16" defaultValueString="1" syncable="YES"/>
|
||||
</entity>
|
||||
<entity name="OPElementStoredEntity" representedClassName="OPElementStoredEntity" parentEntity="OPElementEntity" syncable="YES">
|
||||
<attribute name="contentObject" attributeType="Transformable" storedInTruthFile="YES" syncable="YES"/>
|
||||
<attribute name="contentObject" optional="YES" attributeType="Transformable" storedInTruthFile="YES" syncable="YES"/>
|
||||
</entity>
|
||||
<fetchRequest name="OPSearchElement" entity="OPElementEntity" predicateString="name BEGINSWITH "$query""/>
|
||||
<elements>
|
||||
<element name="OPElementEntity" positionX="160" positionY="192" width="128" height="135"/>
|
||||
<element name="OPElementStoredEntity" positionX="160" positionY="192" width="128" height="75"/>
|
||||
<element name="OPElementGeneratedEntity" positionX="160" positionY="192" width="128" height="60"/>
|
||||
<element name="OPElementStoredEntity" positionX="160" positionY="192" width="128" height="60"/>
|
||||
</elements>
|
||||
</model>
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 475 KiB |
BIN
OnePassword/Resources/Dividers/Square-bottom.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
OnePassword/Resources/Dividers/Square-top.png
Normal file
After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
@ -8,17 +8,22 @@
|
||||
text-shadow: 0 1px black;
|
||||
font: 16px "Baskerville";
|
||||
}
|
||||
h1 {
|
||||
h1, h2 {
|
||||
margin-top: 1em;
|
||||
padding-top: 1em;
|
||||
|
||||
font: inherit;
|
||||
font-family: inherit;
|
||||
font-weight: bold;
|
||||
}
|
||||
h2 {
|
||||
font-size: inherit;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="1">— 1 —</h1>
|
||||
<h1>One Password</h1>
|
||||
<h2>by Lyndir</h2>
|
||||
|
||||
<h2 id="1">— 1 —</h2>
|
||||
<p>
|
||||
<b>Find the site</b> that you need a password for by entering it into the <i>search field</i>.
|
||||
</p>
|
||||
@ -27,19 +32,20 @@
|
||||
The counter shows how many times you've generated a password for the site.
|
||||
</p>
|
||||
|
||||
<h1 id="2">— 2 —</h1>
|
||||
<h2 id="2">— 2 —</h2>
|
||||
<p>
|
||||
<b>Your site</b>'s password is now displayed.
|
||||
<b>The site</b>'s password is now displayed.
|
||||
</p>
|
||||
<p>
|
||||
<b>Below it</b> you can set the <i>password type</i>. Some types <i>auto-generate</i> passwords,
|
||||
<b>Below it</b> you can set the site's <i>password type</i>. Some types <i>auto-generate</i> a password,
|
||||
others let you <i>choose your own</i>.
|
||||
</p>
|
||||
<p>
|
||||
<b>If your new password</b> is not deemed <q>valid</q> by the site, try changing the password type.
|
||||
</p>
|
||||
<p>
|
||||
<b>To generate a new password</b> for the site, you can increment its <i>password counter</i>.
|
||||
<b>To generate a new password</b> for the site, you can increment the site's <i>password counter</i>.
|
||||
Do this when, for instance, you've had to share the password with somebody else.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
61
OnePassword/Settings.bundle/Root.plist
Normal file
@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSTitleValueSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>Version</string>
|
||||
<key>Key</key>
|
||||
<string>version</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSTitleValueSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>Build</string>
|
||||
<key>Key</key>
|
||||
<string>build</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSTitleValueSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>Copyright</string>
|
||||
<key>Key</key>
|
||||
<string>copyright</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>Security</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>DefaultValue</key>
|
||||
<false/>
|
||||
<key>Key</key>
|
||||
<string>storeKeyPhrase</string>
|
||||
<key>Title</key>
|
||||
<string>Store master password</string>
|
||||
<key>Type</key>
|
||||
<string>PSToggleSwitchSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSToggleSwitchSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>Remember master password</string>
|
||||
<key>Key</key>
|
||||
<string>rememberKeyPhrase</string>
|
||||
<key>DefaultValue</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</array>
|
||||
<key>StringsTable</key>
|
||||
<string>Root</string>
|
||||
</dict>
|
||||
</plist>
|
BIN
OnePassword/Settings.bundle/en.lproj/Root.strings
Normal file
@ -5,141 +5,182 @@
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="933"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<scene sceneID="nft-Wn-UXE">
|
||||
<scene sceneID="WkW-SR-cr2">
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="XMe-hC-QeR" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
<tableViewController id="EH5-VR-7ME" customClass="OPTypeViewController" sceneMemberID="viewController">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="5fE-iM-7hQ">
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="jZj-N1-rhF" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
<tableViewController id="NKe-nv-566" customClass="OPTypeViewController" sceneMemberID="viewController">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="btl-G4-V0S">
|
||||
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<sections>
|
||||
<tableViewSection headerTitle="Calculated" footerTitle="Passwords of this type require no storage. You just need to remember the algorithm and the master password." id="5c3-j4-B1u">
|
||||
<tableViewSection id="gUv-FU-O36">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="jcy-wR-4m8" detailTextLabel="Wub-2m-j8S" style="IBUITableViewCellStyleSubtitle" id="BgN-Tv-ljC">
|
||||
<rect key="frame" x="0.0" y="46" width="320" height="45"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="144" id="NCB-rX-weq">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="144"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="143"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Long" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="jcy-wR-4m8">
|
||||
<rect key="frame" x="10" y="2" width="44" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Generated" lineBreakMode="tailTruncation" minimumFontSize="10" id="azh-GA-KA1">
|
||||
<rect key="frame" x="20" y="20" width="280" height="21"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Bold" family="Gill Sans" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Word-like, 14 characters, contains symbols." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Wub-2m-j8S">
|
||||
<rect key="frame" x="10" y="24" width="271" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_first.png" highlightedImage="list_first_active.png" id="WXs-ZQ-JuJ">
|
||||
<rect key="frame" x="10" y="100" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Long" lineBreakMode="tailTruncation" minimumFontSize="10" id="QIm-RX-xY7">
|
||||
<rect key="frame" x="20" y="100" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Word-like, 14 characters, contains symbols." lineBreakMode="tailTruncation" minimumFontSize="10" id="6iu-aM-lJA">
|
||||
<rect key="frame" x="20" y="124" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="These types need only your master password. Nothing is stored, so nothing to loose or have stolen." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="E4a-XS-Qlz">
|
||||
<rect key="frame" x="23" y="49" width="280" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-LightItalic" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="iIk-OH-TES" detailTextLabel="ReE-4p-4QZ" style="IBUITableViewCellStyleSubtitle" id="x9Q-MJ-FBh">
|
||||
<rect key="frame" x="0.0" y="91" width="320" height="44"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="re0-ZT-bnP">
|
||||
<rect key="frame" x="0.0" y="144" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Medium" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="iIk-OH-TES">
|
||||
<rect key="frame" x="10" y="2" width="69" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_middle.png" highlightedImage="list_middle_active.png" id="EWy-Eb-L5p">
|
||||
<rect key="frame" x="10" y="0.0" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Medium" lineBreakMode="tailTruncation" minimumFontSize="10" id="5NA-XX-th4">
|
||||
<rect key="frame" x="20" y="0.0" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Word-like, 8 characters." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ReE-4p-4QZ">
|
||||
<rect key="frame" x="10" y="24" width="148" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Word-like, 8 characters." lineBreakMode="tailTruncation" minimumFontSize="10" id="MI2-JM-j4b">
|
||||
<rect key="frame" x="20" y="24" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="PT4-ef-gLz" detailTextLabel="UUf-NB-sXL" style="IBUITableViewCellStyleSubtitle" id="1cu-IG-tcm">
|
||||
<rect key="frame" x="0.0" y="135" width="320" height="44"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="4pb-c9-i2D">
|
||||
<rect key="frame" x="0.0" y="188" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Short" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="PT4-ef-gLz">
|
||||
<rect key="frame" x="10" y="2" width="47" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_middle.png" highlightedImage="list_middle_active.png" id="Jqw-h1-g2X">
|
||||
<rect key="frame" x="10" y="0.0" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Short" lineBreakMode="tailTruncation" minimumFontSize="10" id="iqW-mf-H1R">
|
||||
<rect key="frame" x="20" y="0.0" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Word-like, 4 characters." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="UUf-NB-sXL">
|
||||
<rect key="frame" x="10" y="24" width="148" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Word-like, 4 characters." lineBreakMode="tailTruncation" minimumFontSize="10" id="Zi3-26-3iq">
|
||||
<rect key="frame" x="20" y="24" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="6UM-nv-bxT" detailTextLabel="EgK-4z-FiS" style="IBUITableViewCellStyleSubtitle" id="REJ-kM-5fD">
|
||||
<rect key="frame" x="0.0" y="179" width="320" height="44"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="ywW-4w-Wej">
|
||||
<rect key="frame" x="0.0" y="232" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Basic" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6UM-nv-bxT">
|
||||
<rect key="frame" x="10" y="2" width="49" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_middle.png" highlightedImage="list_middle_active.png" id="Son-EL-Drx">
|
||||
<rect key="frame" x="10" y="0.0" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Basic" lineBreakMode="tailTruncation" minimumFontSize="10" id="Pim-A8-aib">
|
||||
<rect key="frame" x="20" y="0.0" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="8 characters." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="EgK-4z-FiS">
|
||||
<rect key="frame" x="10" y="24" width="81" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="8 characters." lineBreakMode="tailTruncation" minimumFontSize="10" id="CYQ-D8-vNS">
|
||||
<rect key="frame" x="20" y="24" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="Bg6-Wr-csR" detailTextLabel="gOV-2T-gk5" style="IBUITableViewCellStyleSubtitle" id="L9G-Jl-syJ">
|
||||
<rect key="frame" x="0.0" y="223" width="320" height="45"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="5p5-OD-zpn">
|
||||
<rect key="frame" x="0.0" y="276" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="PIN" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Bg6-Wr-csR">
|
||||
<rect key="frame" x="10" y="2" width="31" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_last.png" highlightedImage="list_last_active.png" id="5nI-rL-CoO">
|
||||
<rect key="frame" x="10" y="0.0" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="PIN" lineBreakMode="tailTruncation" minimumFontSize="10" id="Yu2-5k-AwW">
|
||||
<rect key="frame" x="20" y="0.0" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="4 numbers." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="gOV-2T-gk5">
|
||||
<rect key="frame" x="10" y="24" width="71" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="4 numbers." lineBreakMode="tailTruncation" minimumFontSize="10" id="5Zm-AH-bAe">
|
||||
<rect key="frame" x="20" y="24" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
@ -148,55 +189,162 @@
|
||||
</tableViewCell>
|
||||
</cells>
|
||||
</tableViewSection>
|
||||
<tableViewSection headerTitle="Stored" id="ItS-Cm-TBz">
|
||||
<string key="footerTitle">Passwords of this type are encrypted and stored. They are not tied to a certain algorithm but if you loose the storage, you loose the passwords.</string>
|
||||
<tableViewSection id="Jqk-Jl-vVm">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="Bco-yP-qms" detailTextLabel="NXj-vT-H4k" style="IBUITableViewCellStyleSubtitle" id="GA7-CK-MnU">
|
||||
<rect key="frame" x="0.0" y="373" width="320" height="45"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="144" id="OK2-fa-fDw">
|
||||
<rect key="frame" x="0.0" y="320" width="320" height="144"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="143"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Personal" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Bco-yP-qms">
|
||||
<rect key="frame" x="10" y="2" width="77" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Keychain" lineBreakMode="tailTruncation" minimumFontSize="10" id="146-3h-mdD">
|
||||
<rect key="frame" x="20" y="20" width="280" height="21"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Bold" family="Gill Sans" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="AES-encrypted." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="NXj-vT-H4k">
|
||||
<rect key="frame" x="10" y="24" width="99" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="These types store a user-specified password in your device's keychain." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="Bbk-lL-BeB">
|
||||
<rect key="frame" x="20" y="49" width="280" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-LightItalic" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_first.png" highlightedImage="list_first_active.png" id="fxL-ee-UVP">
|
||||
<rect key="frame" x="10" y="100" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Personal" lineBreakMode="tailTruncation" minimumFontSize="10" id="kzc-rQ-74F">
|
||||
<rect key="frame" x="20" y="100" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Keychain storage, AES-encrypted." lineBreakMode="tailTruncation" minimumFontSize="10" id="vNa-Yq-XIJ">
|
||||
<rect key="frame" x="20" y="124" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" textLabel="gdC-Zp-VYP" detailTextLabel="c5J-6k-O49" style="IBUITableViewCellStyleSubtitle" id="Qll-7W-FvO">
|
||||
<rect key="frame" x="0.0" y="418" width="320" height="45"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="ePk-a9-aNi">
|
||||
<rect key="frame" x="0.0" y="464" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="10" y="1" width="300" height="43"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Device-private" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="gdC-Zp-VYP">
|
||||
<rect key="frame" x="10" y="2" width="124" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_last.png" highlightedImage="list_last_active.png" id="PUy-Qk-CeF">
|
||||
<rect key="frame" x="10" y="0.0" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Device Private" lineBreakMode="tailTruncation" minimumFontSize="10" id="2kB-0P-FeR">
|
||||
<rect key="frame" x="20" y="0.0" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="AES-encrypted, excluded from backups." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="c5J-6k-O49">
|
||||
<rect key="frame" x="10" y="24" width="250" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Keychain storage, AES-encrypted, not backed up." lineBreakMode="tailTruncation" minimumFontSize="10" id="6S8-9Y-pzj">
|
||||
<rect key="frame" x="20" y="24" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
</cells>
|
||||
</tableViewSection>
|
||||
<tableViewSection id="gSo-5f-umo">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="144" id="w3P-Kp-ThX">
|
||||
<rect key="frame" x="0.0" y="508" width="320" height="144"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="143"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Google® Authenticator" lineBreakMode="tailTruncation" minimumFontSize="10" id="UQV-0l-m1n">
|
||||
<rect key="frame" x="20" y="20" width="280" height="21"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Bold" family="Gill Sans" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Useful for logging into your Google account or another application that supports the Google authenticator." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" id="jYS-eD-SvL">
|
||||
<rect key="frame" x="20" y="49" width="280" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-LightItalic" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_first.png" highlightedImage="list_first_active.png" id="IEv-rr-FYK">
|
||||
<rect key="frame" x="10" y="100" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Time Based" lineBreakMode="tailTruncation" minimumFontSize="10" id="TsD-2p-06X">
|
||||
<rect key="frame" x="20" y="100" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Single-use, short-lived, no storage." lineBreakMode="tailTruncation" minimumFontSize="10" id="gdJ-yU-Nq1">
|
||||
<rect key="frame" x="20" y="124" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="mNd-Mf-m7b">
|
||||
<rect key="frame" x="0.0" y="652" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="list_last.png" highlightedImage="list_last_active.png" id="d68-HV-PnO">
|
||||
<rect key="frame" x="10" y="0.0" width="300" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.050000000000000003" width="0.89999999999999991" height="0.89999999999999991"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Counter Based" lineBreakMode="tailTruncation" minimumFontSize="10" id="voz-p2-qnL">
|
||||
<rect key="frame" x="20" y="0.0" width="280" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans" family="Gill Sans" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Single-use, requires storage." lineBreakMode="tailTruncation" minimumFontSize="10" id="gL8-Rf-kqz">
|
||||
<rect key="frame" x="20" y="24" width="280" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="GillSans-Light" family="Gill Sans" pointSize="14"/>
|
||||
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
@ -207,11 +355,11 @@
|
||||
</tableViewSection>
|
||||
</sections>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="EH5-VR-7ME" id="Ut7-iv-UFs"/>
|
||||
<outlet property="delegate" destination="EH5-VR-7ME" id="qgY-zg-QOQ"/>
|
||||
<outlet property="dataSource" destination="NKe-nv-566" id="5yH-j4-f9c"/>
|
||||
<outlet property="delegate" destination="NKe-nv-566" id="O5k-hI-7Tf"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
<navigationItem key="navigationItem" title="Type" id="LY1-XK-usc"/>
|
||||
<navigationItem key="navigationItem" id="rak-Td-wu1"/>
|
||||
</tableViewController>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="962" y="182"/>
|
||||
@ -224,30 +372,33 @@
|
||||
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<searchBar contentMode="redraw" placeholder="apple.com" id="qeo-n2-WVh">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<gestureRecognizers/>
|
||||
<color key="tintColor" red="0.18039215689999999" green="0.20000000000000001" blue="0.2274509804" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="PQa-Xl-A3x" id="oXp-0r-Gkl"/>
|
||||
</connections>
|
||||
</searchBar>
|
||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="MiF-It-p1O">
|
||||
<rect key="frame" x="0.0" y="44" width="320" height="372"/>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="top" image="Content-Backdrop.png" id="0hY-LL-ITu">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="416"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</imageView>
|
||||
<view contentMode="scaleToFill" id="g9q-4d-ZgJ">
|
||||
<rect key="frame" x="0.0" y="43" width="320" height="155"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="Content-Backdrop.png" id="0hY-LL-ITu">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="165"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="top" image="Content-Backdrop.png" id="enb-OH-DVZ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="155"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</imageView>
|
||||
<button opaque="NO" alpha="0.80000000000000004" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="Zji-Vg-VwX">
|
||||
<imageView userInteractionEnabled="NO" contentMode="top" image="Square-top.png" id="qWn-td-zdb">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="155"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</imageView>
|
||||
<imageView userInteractionEnabled="NO" alpha="0.80000000000000004" contentMode="scaleToFill" image="display.png" id="0Yh-Py-lB6">
|
||||
<rect key="frame" x="11" y="20" width="298" height="86"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<rect key="contentStretch" x="0.050000000000000003" y="0.10000000000000001" width="0.89999999999999991" height="0.79999999999999982"/>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" id="Zji-Vg-VwX">
|
||||
<rect key="frame" x="11" y="20" width="298" height="86"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" size="button"/>
|
||||
<state key="normal" backgroundImage="display.png">
|
||||
<state key="normal">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
@ -255,7 +406,7 @@
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="didTriggerContent" destination="PQa-Xl-A3x" eventType="touchUpInside" id="fET-Qd-wzg"/>
|
||||
<action selector="copyContent" destination="PQa-Xl-A3x" eventType="touchUpInside" id="9tS-J5-wlx"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.50000000000000011" contentMode="left" text="apple.com" lineBreakMode="tailTruncation" minimumFontSize="10" id="gSK-aB-wNI">
|
||||
@ -265,16 +416,19 @@
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="S3cre7^Pa$swcrD" textAlignment="center" minimumFontSize="17" clearButtonMode="always" id="fiX-10-fif">
|
||||
<rect key="frame" x="20" y="43" width="280" height="63"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="S3cre7^Pa$swcrD" textAlignment="center" minimumFontSize="17" clearButtonMode="whileEditing" id="fiX-10-fif">
|
||||
<rect key="frame" x="20" y="46" width="280" height="60"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="textColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<fontDescription key="fontDescription" name="Optima-ExtraBlack" family="Optima" pointSize="26"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="PQa-Xl-A3x" id="qOM-gq-c6g"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="Cei-5z-uWE">
|
||||
<rect key="frame" x="10" y="130" width="299" height="35"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<rect key="frame" x="11" y="119" width="299" height="35"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<state key="normal" title="Long" backgroundImage="list_first.png">
|
||||
<color key="titleColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
@ -284,20 +438,21 @@
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<segue destination="EH5-VR-7ME" kind="push" identifier="OP_Main_ChooseType" id="u9c-ed-Wn9"/>
|
||||
<segue destination="NKe-nv-566" kind="push" identifier="OP_Main_ChooseType" id="vw4-Vd-O6q"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.50000000000000011" contentMode="left" text="1" textAlignment="right" lineBreakMode="tailTruncation" minimumFontSize="10" id="Iuf-np-e9C">
|
||||
<rect key="frame" x="240" y="26" width="40" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<rect key="frame" x="240" y="27" width="40" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="Optima-ExtraBlack" family="Optima" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" alpha="0.50000000000000011" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="jec-mu-nPt">
|
||||
<rect key="frame" x="281" y="25" width="24" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<rect key="frame" x="276" y="20" width="34" height="34"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="5" minY="5" maxX="5" maxY="5"/>
|
||||
<state key="normal" image="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"/>
|
||||
@ -306,28 +461,82 @@
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<action selector="didIncrementPasswordCounter" destination="PQa-Xl-A3x" eventType="touchUpInside" id="xCQ-hF-pLc"/>
|
||||
<action selector="incrementPasswordCounter" destination="PQa-Xl-A3x" eventType="touchUpInside" id="hMc-kb-yFA"/>
|
||||
</connections>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" image="Square.png" id="qWn-td-zdb">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="222"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<button opaque="NO" alpha="0.5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="9FS-fS-xH6">
|
||||
<rect key="frame" x="276" y="20" width="34" height="34"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<inset key="contentEdgeInsets" minX="5" minY="5" maxX="5" maxY="5"/>
|
||||
<state key="normal" image="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="editPassword" destination="PQa-Xl-A3x" eventType="touchUpInside" id="jZC-Jm-ZZ0"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<view clipsSubviews="YES" alpha="0.60000000000000009" contentMode="scaleToFill" id="61G-By-qLB">
|
||||
<rect key="frame" x="0.0" y="196" width="320" height="220"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="bottom" image="Square-bottom.png" id="lbm-A0-3PK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="58"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
</imageView>
|
||||
<webView opaque="NO" contentMode="scaleToFill" id="8FQ-x4-lR9">
|
||||
<rect key="frame" x="20" y="165" width="280" height="207"/>
|
||||
<rect key="frame" x="0.0" y="1" width="320" height="219"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</webView>
|
||||
</subviews>
|
||||
</scrollView>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
|
||||
</view>
|
||||
<searchBar contentMode="redraw" barStyle="blackOpaque" placeholder="Site" id="qeo-n2-WVh">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<gestureRecognizers/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="PQa-Xl-A3x" id="oXp-0r-Gkl"/>
|
||||
</connections>
|
||||
</searchBar>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.14901960784313725" green="0.16470588235294117" blue="0.1803921568627451" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" title="One Password" id="hB9-S6-KHC"/>
|
||||
<navigationItem key="navigationItem" title="One Password" id="hB9-S6-KHC">
|
||||
<barButtonItem key="leftBarButtonItem" id="2Bg-ut-2K4">
|
||||
<button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="infoLight" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" id="C1k-kx-Gcx">
|
||||
<rect key="frame" x="5" y="12" width="18" height="19"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||
<state key="normal">
|
||||
<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="toggleHelp" destination="PQa-Xl-A3x" eventType="touchUpInside" id="BpO-gU-wS3"/>
|
||||
</connections>
|
||||
</button>
|
||||
</barButtonItem>
|
||||
</navigationItem>
|
||||
<connections>
|
||||
<outlet property="contentContainer" destination="g9q-4d-ZgJ" id="Hgw-Hp-FHB"/>
|
||||
<outlet property="contentField" destination="fiX-10-fif" id="b2c-gv-qMp"/>
|
||||
<outlet property="helpContainer" destination="61G-By-qLB" id="Jwt-0d-ZAV"/>
|
||||
<outlet property="helpView" destination="8FQ-x4-lR9" id="MOg-5s-kvK"/>
|
||||
<outlet property="passwordCounter" destination="Iuf-np-e9C" id="KHv-8K-K0s"/>
|
||||
<outlet property="passwordEdit" destination="9FS-fS-xH6" id="YeB-HF-ZPk"/>
|
||||
<outlet property="passwordIncrementer" destination="jec-mu-nPt" id="i9B-lX-zzX"/>
|
||||
<outlet property="searchDisplayController" destination="P8c-gf-nN3" id="CLs-YI-7NC"/>
|
||||
<outlet property="searchResultsController" destination="0QO-2P-OhD" id="xEC-gV-lHp"/>
|
||||
@ -359,10 +568,9 @@
|
||||
<navigationController id="KZF-fe-y9n" sceneMemberID="viewController">
|
||||
<toolbarItems/>
|
||||
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackTranslucent"/>
|
||||
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="sif-x3-Fol">
|
||||
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" barStyle="blackOpaque" id="sif-x3-Fol">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<color key="tintColor" red="0.18039215689999999" green="0.20000000000000001" blue="0.2274509804" alpha="1" colorSpace="calibratedRGB"/>
|
||||
</navigationBar>
|
||||
<nil name="viewControllers"/>
|
||||
<connections>
|
||||
@ -374,12 +582,50 @@
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="Content-Backdrop.png" width="320" height="166"/>
|
||||
<image name="Square.png" width="551" height="222"/>
|
||||
<image name="Content-Backdrop.png" width="480" height="480"/>
|
||||
<image name="Square-bottom.png" width="551" height="58"/>
|
||||
<image name="Square-top.png" width="551" height="164"/>
|
||||
<image name="display.png" width="298" height="86"/>
|
||||
<image name="edit.png" width="32" height="32"/>
|
||||
<image name="list_first.png" width="299" height="35"/>
|
||||
<image name="list_first_active.png" width="299" height="35"/>
|
||||
<image name="list_last.png" width="299" height="35"/>
|
||||
<image name="list_last_active.png" width="299" height="36"/>
|
||||
<image name="list_middle.png" width="299" height="34"/>
|
||||
<image name="list_middle_active.png" width="299" height="34"/>
|
||||
<image name="plus.png" width="32" height="32"/>
|
||||
</resources>
|
||||
<classes>
|
||||
<class className="OPMainViewController" superclassName="UIViewController">
|
||||
<source key="sourceIdentifier" type="project" relativePath="./Classes/OPMainViewController.h"/>
|
||||
<relationships>
|
||||
<relationship kind="action" name="copyContent"/>
|
||||
<relationship kind="action" name="editPassword"/>
|
||||
<relationship kind="action" name="incrementPasswordCounter"/>
|
||||
<relationship kind="action" name="toggleHelp"/>
|
||||
<relationship kind="outlet" name="contentContainer" candidateClass="UIView"/>
|
||||
<relationship kind="outlet" name="contentField" candidateClass="UITextField"/>
|
||||
<relationship kind="outlet" name="helpContainer" candidateClass="UIView"/>
|
||||
<relationship kind="outlet" name="helpView" candidateClass="UIWebView"/>
|
||||
<relationship kind="outlet" name="passwordCounter" candidateClass="UILabel"/>
|
||||
<relationship kind="outlet" name="passwordEdit" candidateClass="UIButton"/>
|
||||
<relationship kind="outlet" name="passwordIncrementer" candidateClass="UIButton"/>
|
||||
<relationship kind="outlet" name="searchResultsController" candidateClass="OPSearchDelegate"/>
|
||||
<relationship kind="outlet" name="siteName" candidateClass="UILabel"/>
|
||||
<relationship kind="outlet" name="typeButton" candidateClass="UIButton"/>
|
||||
</relationships>
|
||||
</class>
|
||||
<class className="OPSearchDelegate" superclassName="NSObject">
|
||||
<source key="sourceIdentifier" type="project" relativePath="./Classes/OPSearchDelegate.h"/>
|
||||
<relationships>
|
||||
<relationship kind="outlet" name="delegate"/>
|
||||
<relationship kind="outlet" name="searchDisplayController" candidateClass="UISearchDisplayController"/>
|
||||
</relationships>
|
||||
</class>
|
||||
<class className="OPTypeViewController" superclassName="UITableViewController">
|
||||
<source key="sourceIdentifier" type="project" relativePath="./Classes/OPTypeViewController.h"/>
|
||||
</class>
|
||||
</classes>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
|