Browse Source

move passcode lock to keychain

Felix Paul Kühne 10 years ago
parent
commit
abdc383820
3 changed files with 38 additions and 8 deletions
  1. 2 1
      Sources/VLCAppDelegate.m
  2. 2 0
      Sources/VLCConstants.h
  3. 34 7
      Sources/VLCKeychainCoordinator.m

+ 2 - 1
Sources/VLCAppDelegate.m

@@ -457,7 +457,8 @@ continueUserActivity:(NSUserActivity *)userActivity
 
     if (!_passcodeValidated && [keychainCoordinator passcodeLockEnabled]) {
         [keychainCoordinator validatePasscode];
-    }
+    } else
+        _passcodeValidated = YES;
 }
 
 #pragma mark - idle timer preventer

+ 2 - 0
Sources/VLCConstants.h

@@ -13,6 +13,8 @@
 
 #define kVLCVersionCodename @"All Along the Watchtower"
 
+#define kVLCApplicationGroupIdentifier @"group.org.videolan.vlc-ios"
+
 #define kVLCSettingPasscodeKey @"Passcode"
 #define kVLCSettingPasscodeOnKey @"PasscodeProtection"
 #define kVLCSettingContinueAudioInBackgroundKey @"BackgroundAudioPlayback"

+ 34 - 7
Sources/VLCKeychainCoordinator.m

@@ -13,12 +13,16 @@
 #import "VLCKeychainCoordinator.h"
 #import "PAPasscodeViewController.h"
 #import "VLCAppDelegate.h"
+#import "KeychainItemWrapper.h"
 
 NSString *const VLCPasscodeValidated = @"VLCPasscodeValidated";
 
+NSString *const VLCPasscode = @"org.videolan.vlc-ios.passcode";
+
 @interface VLCKeychainCoordinator () <PAPasscodeViewControllerDelegate>
 {
     PAPasscodeViewController *_passcodeLockController;
+    NSDictionary *_passcodeQuery;
 }
 
 @end
@@ -37,10 +41,28 @@ NSString *const VLCPasscodeValidated = @"VLCPasscodeValidated";
     return sharedInstance;
 }
 
+
+- (NSString *)_obtainPasscode
+{
+    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:VLCPasscode
+                                                                        accessGroup:kVLCApplicationGroupIdentifier];
+    NSString *passcode = [keychain objectForKey:(__bridge id)kSecValueData];
+
+    if (!passcode) {
+        /* legacy passcode retrieval */
+        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+        passcode = [defaults objectForKey:kVLCSettingPasscodeKey];
+        if (passcode)
+            [self setPasscode:passcode];
+    }
+
+    return passcode;
+}
+
 - (BOOL)passcodeLockEnabled
 {
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    NSString *passcode = [defaults objectForKey:kVLCSettingPasscodeKey];
+    NSString *passcode = [self _obtainPasscode];
+
     if (!passcode)
         return NO;
 
@@ -52,8 +74,7 @@ NSString *const VLCPasscodeValidated = @"VLCPasscodeValidated";
 
 - (void)validatePasscode
 {
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    NSString *passcode = [defaults objectForKey:kVLCSettingPasscodeKey];
+    NSString *passcode = [self _obtainPasscode];
     if ([passcode isEqualToString:@""]) {
         [[NSNotificationCenter defaultCenter] postNotificationName:VLCPasscodeValidated object:self];
     }
@@ -88,9 +109,15 @@ NSString *const VLCPasscodeValidated = @"VLCPasscodeValidated";
 
 - (void)setPasscode:(NSString *)passcode
 {
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    [defaults setObject:passcode forKey:kVLCSettingPasscodeKey];
-    [defaults synchronize];
+    if (!passcode)
+        passcode = @"";
+
+    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:VLCPasscode
+                                                                        accessGroup:kVLCApplicationGroupIdentifier];
+    [keychain setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id)kSecAttrAccessible];
+    [keychain setObject:passcode forKey:(__bridge id)kSecValueData];
+
+    keychain = nil;
 }
 
 @end