-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPasswordManager.m
105 lines (81 loc) · 4.01 KB
/
PasswordManager.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#import "PasswordManager.h"
@implementation PasswordManager
+ (id)sharedInstance {
static PasswordManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
-(void)authenticate:(void(^)(BOOL isAuthenticated, NSError *authenticationError))completion {
NSDictionary *bundleDefaults = [[NSUserDefaults standardUserDefaults] persistentDomainForName:USER_DEFAULTS_DOMAIN];
NSLog(@"current bundleDefaults: %@", bundleDefaults);
NSDictionary *bundleDefaultsPasscode = [[NSUserDefaults standardUserDefaults] persistentDomainForName:USER_DEFAULTS_DOMAIN_PASSCODE];
NSLog(@"current passcode: %@", bundleDefaultsPasscode);
NSString *appLockPasscode = bundleDefaultsPasscode[BUNDLE_DEFAULTS_PASSCODE_KEY];
BOOL isBiometricsEnabled = [bundleDefaults[BIOMETRICS_SPECIFIER_KEY] boolValue];
BOOL isPasscodeEnabled = [bundleDefaults[PASSCODE_SPECIFIER_KEY] boolValue];
if (isBiometricsEnabled == true) {
[self checkBiometrics:^(BOOL isBiometricsCorrect, NSError *checkError) {
if (isBiometricsCorrect == true) {
completion(isBiometricsCorrect, checkError);
}
}];
}
if (isPasscodeEnabled == true) {
[self checkForPassword:appLockPasscode withCompletion:^(BOOL isPasswordCorrect) {
if (isPasswordCorrect == true) {
completion(isPasswordCorrect, nil);
}
}];
}
}
-(void)checkBiometrics:(void(^)(BOOL isBiometricsCorrect, NSError *checkError))completion {
LAContext *laContext = [[LAContext alloc]init];
NSError *evaluatePolicyError;
BOOL isBiometricsAvailable = [laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&evaluatePolicyError];
if (isBiometricsAvailable == true) {
[laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"authenticate to open app"
reply:^(BOOL success, NSError *error) {
completion(success, error);
}];
} else {
UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
NSString *alertTitle = @"Error";
NSString *alertMessage = @"No biometrics detected, please enabled FaceID or TouchID in settings";
[UIAlertController showAlertControllerWithVC:rootVC withMessage:alertMessage withTitle:alertTitle];
//don't run completion biometrics is not availalbe
// completion(isBiometricsCorrect, nil);
}
}
-(void)checkForPassword:(NSString *)password withCompletion:(void(^)(BOOL isPasswordCorrect))completion {
UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
[self showAlertControllerPasswordCheckerWithVC:rootVC withCompletion:^(UIAlertController *alertController) {
UITextField *textField = alertController.textFields[0];
NSString *passwordInput = textField.text;
if ([passwordInput isEqual:password]) {
completion(true);
} else {
completion(false);
}
}];
}
-(void)showAlertControllerPasswordCheckerWithVC:(UIViewController *)VC withCompletion:(void(^)(UIAlertController *alertController))completion {
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"App Locked"
message:@"please enter your password"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
// UITextField *alertViewTextField = alert.textFields[0];
completion(alert);
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.secureTextEntry = true;
}];
[alert addAction:defaultAction];
[VC presentViewController:alert animated:YES completion:nil];
}
@end