From e5b90b856af4f00137914adf10e0a7b106da4a5f Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 26 Nov 2017 22:51:37 +0100 Subject: [PATCH] iOS: Finish support for key files --- LegacyPasswordGenerator.h | 2 +- LegacyPasswordGenerator.m | 2 +- NewPasswordGenerator.h | 2 +- NewPasswordGenerator.m | 2 +- PasswordGenerator.h | 2 +- ScryptPWGen.h | 2 +- iOS/AboutController.h | 2 +- iOS/AboutController.m | 2 +- iOS/AddSiteController.h | 3 +- iOS/AddSiteController.m | 21 +++-- iOS/AppDelegate.h | 2 +- iOS/AppDelegate.m | 2 +- iOS/Base.lproj/Main.storyboard | 32 ++++++++ iOS/Info.plist | 2 + iOS/MainViewController.h | 2 +- iOS/MainViewController.m | 4 +- iOS/SelectKeyFileController.h | 34 ++++++++ iOS/SelectKeyFileController.m | 95 ++++++++++++++++++++++ iOS/ShowDetailsController.h | 2 +- iOS/ShowDetailsController.m | 25 +++++- iOS/SiteStorage.h | 2 +- iOS/SiteStorage.m | 2 +- iOS/main.m | 2 +- iOS/scrypt-pwgen.xcodeproj/project.pbxproj | 6 ++ 24 files changed, 225 insertions(+), 27 deletions(-) create mode 100644 iOS/SelectKeyFileController.h create mode 100644 iOS/SelectKeyFileController.m diff --git a/LegacyPasswordGenerator.h b/LegacyPasswordGenerator.h index 5d02283..0bc83da 100644 --- a/LegacyPasswordGenerator.h +++ b/LegacyPasswordGenerator.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/LegacyPasswordGenerator.m b/LegacyPasswordGenerator.m index 1f9af24..ce50f0f 100644 --- a/LegacyPasswordGenerator.m +++ b/LegacyPasswordGenerator.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/NewPasswordGenerator.h b/NewPasswordGenerator.h index aa8781e..16a07cc 100644 --- a/NewPasswordGenerator.h +++ b/NewPasswordGenerator.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/NewPasswordGenerator.m b/NewPasswordGenerator.m index 9771df8..cf71cd9 100644 --- a/NewPasswordGenerator.m +++ b/NewPasswordGenerator.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/PasswordGenerator.h b/PasswordGenerator.h index bb8865e..62faa75 100644 --- a/PasswordGenerator.h +++ b/PasswordGenerator.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/ScryptPWGen.h b/ScryptPWGen.h index 8a27178..28e6adc 100644 --- a/ScryptPWGen.h +++ b/ScryptPWGen.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/AboutController.h b/iOS/AboutController.h index 4dcbb2e..d4ca3b6 100644 --- a/iOS/AboutController.h +++ b/iOS/AboutController.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/AboutController.m b/iOS/AboutController.m index 9a95475..3c6d93f 100644 --- a/iOS/AboutController.m +++ b/iOS/AboutController.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/AddSiteController.h b/iOS/AddSiteController.h index 33d0782..23d5ade 100644 --- a/iOS/AddSiteController.h +++ b/iOS/AddSiteController.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * @@ -28,6 +28,7 @@ @property (nonatomic, retain) IBOutlet UITextField *nameField; @property (nonatomic, retain) IBOutlet UITextField *lengthField; @property (nonatomic, retain) IBOutlet UISwitch *legacySwitch; +@property (nonatomic, copy) NSString *keyFile; @property (nonatomic, retain) IBOutlet UILabel *keyFileLabel; @property (retain) MainViewController *mainViewController; diff --git a/iOS/AddSiteController.m b/iOS/AddSiteController.m index 689fd7e..620b1e1 100644 --- a/iOS/AddSiteController.m +++ b/iOS/AddSiteController.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * @@ -23,6 +23,7 @@ #import #import "AddSiteController.h" +#import "SelectKeyFileController.h" static void showAlert(UIViewController *controller, NSString *title, NSString *message) @@ -47,6 +48,7 @@ showAlert(UIViewController *controller, NSString *title, NSString *message) [_nameField release]; [_lengthField release]; [_legacySwitch release]; + [_keyFile release]; [_keyFileLabel release]; [_mainViewController release]; @@ -60,7 +62,8 @@ showAlert(UIViewController *controller, NSString *title, NSString *message) animated: YES]; if (indexPath.section == 1 && indexPath.row == 1) - [self selectKeyFile]; + [self performSegueWithIdentifier: @"selectKeyFile" + sender: self]; } - (NSIndexPath *)tableView: (UITableView *)tableView @@ -72,11 +75,6 @@ showAlert(UIViewController *controller, NSString *title, NSString *message) return nil; } -- (void)selectKeyFile -{ - showAlert(self, @"Not Supported", @"Key files are not supported yet"); -} - - (IBAction)done: (id)sender { OFString *name = self.nameField.text.OFObject; @@ -113,7 +111,7 @@ showAlert(UIViewController *controller, NSString *title, NSString *message) [self.mainViewController.siteStorage setSite: name length: length legacy: self.legacySwitch.on - keyFile: nil]; + keyFile: self.keyFile.OFObject]; [self.mainViewController reset]; [self.navigationController popViewControllerAnimated: YES]; @@ -123,4 +121,11 @@ showAlert(UIViewController *controller, NSString *title, NSString *message) { [self.navigationController popViewControllerAnimated: YES]; } + +- (void)prepareForSegue: (UIStoryboardSegue *)segue + sender: (id)sender +{ + if ([segue.identifier isEqual: @"selectKeyFile"]) + [segue.destinationViewController setAddSiteController: self]; +} @end diff --git a/iOS/AppDelegate.h b/iOS/AppDelegate.h index 76fed46..89bf183 100644 --- a/iOS/AppDelegate.h +++ b/iOS/AppDelegate.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/AppDelegate.m b/iOS/AppDelegate.m index d5a9eae..c7450cc 100644 --- a/iOS/AppDelegate.m +++ b/iOS/AppDelegate.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/Base.lproj/Main.storyboard b/iOS/Base.lproj/Main.storyboard index f38802b..36ce758 100644 --- a/iOS/Base.lproj/Main.storyboard +++ b/iOS/Base.lproj/Main.storyboard @@ -293,6 +293,7 @@ + @@ -302,6 +303,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/Info.plist b/iOS/Info.plist index 33cfa14..fa08f8e 100644 --- a/iOS/Info.plist +++ b/iOS/Info.plist @@ -35,5 +35,7 @@ UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown + UIFileSharingEnabled + diff --git a/iOS/MainViewController.h b/iOS/MainViewController.h index 4e45c8f..aa9c63b 100644 --- a/iOS/MainViewController.h +++ b/iOS/MainViewController.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/MainViewController.m b/iOS/MainViewController.m index 250faa8..38a4b73 100644 --- a/iOS/MainViewController.m +++ b/iOS/MainViewController.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * @@ -60,7 +60,7 @@ - (NSInteger)tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger)section { - return [self.sites count]; + return self.sites.count; } - (UITableViewCell *)tableView: (UITableView *)tableView diff --git a/iOS/SelectKeyFileController.h b/iOS/SelectKeyFileController.h new file mode 100644 index 0000000..b829814 --- /dev/null +++ b/iOS/SelectKeyFileController.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016, 2017, Jonathan Schleifer + * + * https://heap.zone/git/scrypt-pwgen.git + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +#import "AddSiteController.h" + +@interface SelectKeyFileController: UITableViewController +{ + NSArray *_keyFiles; +} + +@property (retain) AddSiteController *addSiteController; +@end diff --git a/iOS/SelectKeyFileController.m b/iOS/SelectKeyFileController.m new file mode 100644 index 0000000..3ac3bad --- /dev/null +++ b/iOS/SelectKeyFileController.m @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016, 2017, Jonathan Schleifer + * + * https://heap.zone/git/scrypt-pwgen.git + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SelectKeyFileController.h" + +@implementation SelectKeyFileController +- (void)viewDidLoad +{ + NSString *documentDirectory; + NSArray *keyFiles; + NSError *error; + + [super viewDidLoad]; + + if ((documentDirectory = NSSearchPathForDirectoriesInDomains( + NSDocumentDirectory, NSUserDomainMask, YES).firstObject) == nil) { + NSLog(@"Could not get key files: No documents directory"); + [self.navigationController popViewControllerAnimated: YES]; + return; + } + + keyFiles = [NSFileManager.defaultManager + contentsOfDirectoryAtPath: documentDirectory + error: &error]; + + if (keyFiles == nil) { + NSLog(@"Could not get key files: %@", error); + [self.navigationController popViewControllerAnimated: YES]; + return; + } + + _keyFiles = [[keyFiles sortedArrayUsingSelector: + @selector(compare:)] retain]; +} + +- (void)dealloc +{ + [_keyFiles release]; + + [super dealloc]; +} + +- (NSInteger)tableView: (UITableView *)tableView + numberOfRowsInSection: (NSInteger)section +{ + return _keyFiles.count + 1; +} + +- (UITableViewCell *)tableView: (UITableView *)tableView + cellForRowAtIndexPath: (NSIndexPath *)indexPath +{ + UITableViewCell *cell = [tableView + dequeueReusableCellWithIdentifier: @"keyFile"]; + + if (cell == nil) + cell = [[[UITableViewCell alloc] + initWithStyle: UITableViewCellStyleDefault + reuseIdentifier: @"keyFile"] autorelease]; + + cell.textLabel.text = + (indexPath.row > 0 ? _keyFiles[indexPath.row - 1] : @"None"); + + return cell; +} + +- (void)tableView: (UITableView *)tableView + didSelectRowAtIndexPath: (NSIndexPath *)indexPath +{ + self.addSiteController.keyFile = + (indexPath.row > 0 ? _keyFiles[indexPath.row - 1] : nil); + self.addSiteController.keyFileLabel.text = + (indexPath.row > 0 ? _keyFiles[indexPath.row - 1] : @"None"); + + [self.navigationController popViewControllerAnimated: YES]; +} +@end diff --git a/iOS/ShowDetailsController.h b/iOS/ShowDetailsController.h index 995630b..5bb11b4 100644 --- a/iOS/ShowDetailsController.h +++ b/iOS/ShowDetailsController.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/ShowDetailsController.m b/iOS/ShowDetailsController.m index 8c846c1..e1a7fab 100644 --- a/iOS/ShowDetailsController.m +++ b/iOS/ShowDetailsController.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * @@ -186,6 +186,24 @@ clearNSMutableString(NSMutableString *string) generator.site = _name; generator.length = _length; + if (_keyFile != nil) { + NSString *documentDirectory; + OFString *keyFilePath; + + if ((documentDirectory = NSSearchPathForDirectoriesInDomains( + NSDocumentDirectory, NSUserDomainMask, YES).firstObject) == + nil) { + NSLog(@"Could not get key files: No documents " + @"directory"); + return; + } + + keyFilePath = [documentDirectory.OFObject + stringByAppendingPathComponent: _keyFile]; + generator.keyFile = [OFMutableData + dataWithContentsOfFile: keyFilePath]; + } + passphrase = of_strdup(self.passphraseField.text.UTF8String); generator.passphrase = passphrase; @@ -200,6 +218,11 @@ clearNSMutableString(NSMutableString *string) @try { [generator derivePassword]; } @finally { + if (generator.keyFile != nil) + of_explicit_memset( + (void *)generator.keyFile.items, 0, + generator.keyFile.count); + of_explicit_memset(passphrase, 0, strlen(passphrase)); free(passphrase); } diff --git a/iOS/SiteStorage.h b/iOS/SiteStorage.h index 6d7b3c8..8fb9815 100644 --- a/iOS/SiteStorage.h +++ b/iOS/SiteStorage.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/SiteStorage.m b/iOS/SiteStorage.m index 0df1967..291f30e 100644 --- a/iOS/SiteStorage.m +++ b/iOS/SiteStorage.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/main.m b/iOS/main.m index 28ec29f..08db493 100644 --- a/iOS/main.m +++ b/iOS/main.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Jonathan Schleifer + * Copyright (c) 2016, 2017, Jonathan Schleifer * * https://heap.zone/git/scrypt-pwgen.git * diff --git a/iOS/scrypt-pwgen.xcodeproj/project.pbxproj b/iOS/scrypt-pwgen.xcodeproj/project.pbxproj index c2c51e3..41f831e 100644 --- a/iOS/scrypt-pwgen.xcodeproj/project.pbxproj +++ b/iOS/scrypt-pwgen.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 4BA115D31DA9432D007ED4EA /* NewPasswordGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BA115D01DA9432D007ED4EA /* NewPasswordGenerator.m */; settings = {COMPILER_FLAGS = "-fconstant-string-class=OFConstantString -fno-constant-cfstrings"; }; }; 4BA115D61DA94390007ED4EA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA115D51DA94390007ED4EA /* UIKit.framework */; }; 4BB3CDFD1DA9764300FEE5ED /* AddSiteController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BB3CDFC1DA9764300FEE5ED /* AddSiteController.m */; }; + 4BC29DD51FCB5FAE00A1E786 /* SelectKeyFileController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BC29DD41FCB5FAE00A1E786 /* SelectKeyFileController.m */; }; 4BF4ADEA1DA9A3DB0073B995 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BF4ADE91DA9A3DB0073B995 /* Foundation.framework */; }; 4BF4ADED1DA9A6B00073B995 /* SiteStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BF4ADEC1DA9A6B00073B995 /* SiteStorage.m */; settings = {COMPILER_FLAGS = "-fconstant-string-class=OFConstantString -fno-constant-cfstrings"; }; }; /* End PBXBuildFile section */ @@ -67,6 +68,8 @@ 4BA115D51DA94390007ED4EA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 4BB3CDFB1DA9764300FEE5ED /* AddSiteController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddSiteController.h; sourceTree = ""; }; 4BB3CDFC1DA9764300FEE5ED /* AddSiteController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddSiteController.m; sourceTree = ""; }; + 4BC29DD41FCB5FAE00A1E786 /* SelectKeyFileController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SelectKeyFileController.m; sourceTree = ""; }; + 4BC29DD61FCB5FC400A1E786 /* SelectKeyFileController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SelectKeyFileController.h; sourceTree = ""; }; 4BF4ADE91DA9A3DB0073B995 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 4BF4ADEB1DA9A6B00073B995 /* SiteStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SiteStorage.h; sourceTree = ""; }; 4BF4ADEC1DA9A6B00073B995 /* SiteStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SiteStorage.m; sourceTree = ""; }; @@ -120,6 +123,8 @@ 4B2E52E81DA942840040D091 /* Main.storyboard */, 4B2E52E51DA942840040D091 /* MainViewController.h */, 4B2E52E61DA942840040D091 /* MainViewController.m */, + 4BC29DD61FCB5FC400A1E786 /* SelectKeyFileController.h */, + 4BC29DD41FCB5FAE00A1E786 /* SelectKeyFileController.m */, 4B0719231DAA78D80065997A /* ShowDetailsController.h */, 4B0719241DAA78D80065997A /* ShowDetailsController.m */, 4BF4ADEB1DA9A6B00073B995 /* SiteStorage.h */, @@ -226,6 +231,7 @@ buildActionMask = 2147483647; files = ( 4B82D1151DAAAFCE00F32B2F /* AboutController.m in Sources */, + 4BC29DD51FCB5FAE00A1E786 /* SelectKeyFileController.m in Sources */, 4BB3CDFD1DA9764300FEE5ED /* AddSiteController.m in Sources */, 4B2E52E41DA942840040D091 /* AppDelegate.m in Sources */, 4BA115D21DA9432D007ED4EA /* LegacyPasswordGenerator.m in Sources */,