Commit 53d75f1e authored by Gant Laborde's avatar Gant Laborde Committed by GitHub
Browse files

Merge pull request #157 from kacynMedallia/security-callback

Change PIN/Fingerprint check from constant to callback
parents 4d812f2d f87253f4
Loading
Loading
Loading
Loading
+32 −22
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ var DeviceInfo = require('react-native-device-info');
```

| Name                       | Method                           | Return                                                                                        | Notes                                                                                                            |
| :------------------------- | :--------------------- | :-------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------- |
| :------------------------- | :------------------------------- | :-------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------- |
| Device Unique ID           | `getUniqueID()`                  | FCDBD8EF-62FC-4ECB-B2F5-92C9E79AC7F9                                                          | This is IDFV on iOS so it will change if all apps from the current apps vendor have been previously uninstalled. |
| Device Manufacturer        | `getManufacturer()`              | Apple                                                                                         |                                                                                                                  |
| Device Brand               | `getBrand()`                     | Apple / htc / Xiaomi                                                                          |                                                                                                                  |           
@@ -182,4 +182,14 @@ var DeviceInfo = require('react-native-device-info');
| App Instance ID            | `getInstanceID()`                |                                                                                               | ANDROID ONLY - see https://developers.google.com/instance-id/                                                    |
| App is running in emulator | `isEmulator()`                   | true                                                                                          | if app is running in emulator return true                                                                        |
| App is running on a tablet | `isTablet()`                     | true                                                                                          | if app is running on a tablet return true                                                                        |
| PIN or fingerprint set     | `isPinOrFingerprintSet`| true                                                                                          | return true if PIN or fingerprint is configured.  Only supported in Android and iOS 9.0 and above
| PIN or fingerprint set     | `isPinOrFingerprintSet(callback)`|                                                                                               | Only supported in Android and iOS 9.0 and above

Since the device setting for PIN/Fingerprint can be modified while the app is still open, this is available via callback instead of as a constant.  To use, pass a callback function in your javascript:

```js
RNDeviceInfo.isPinOrFingerprintSet(isPinOrFingerprintSet => {
  if (!isPinOrFingerprintSet) {
    ...
  }
}
```
+7 −7
Original line number Diff line number Diff line
@@ -163,12 +163,6 @@ RCT_EXPORT_MODULE()
  return [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
}

- (bool) isPinOrFingerprintSet
{
  LAContext *context = [[LAContext alloc] init];
  return ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil]);
}

- (NSDictionary *)constantsToExport
{
    UIDevice *currentDevice = [UIDevice currentDevice];
@@ -193,8 +187,14 @@ RCT_EXPORT_MODULE()
             @"timezone": self.timezone,
             @"isEmulator": @(self.isEmulator),
             @"isTablet": @(self.isTablet),
             @"isPinOrFingerprintSet": @(self.isPinOrFingerprintSet),
             };
}

RCT_EXPORT_METHOD(isPinOrFingerprintSet:(RCTResponseSenderBlock)callback)
{
    LAContext *context = [[LAContext alloc] init];
    BOOL isPinOrFingerprintSet = ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil]);
    callback(@[[NSNumber numberWithBool:isPinOrFingerprintSet]]);
}

@end
+6 −4
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@ import com.google.android.gms.iid.InstanceID;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;

import java.util.HashMap;
import java.util.Locale;
@@ -71,9 +73,10 @@ public class RNDeviceModule extends ReactContextBaseJavaModule {
    return layout == Configuration.SCREENLAYOUT_SIZE_LARGE || layout == Configuration.SCREENLAYOUT_SIZE_XLARGE;
  }

  private Boolean isPinOrFingerprintSet() {
  @ReactMethod
  public void isPinOrFingerprintSet(Callback callback) {
    KeyguardManager keyguardManager = (KeyguardManager) this.reactContext.getSystemService(Context.KEYGUARD_SERVICE); //api 16+
    return keyguardManager.isKeyguardSecure();
    callback.invoke(keyguardManager.isKeyguardSecure());
  }

  @Override
@@ -99,7 +102,7 @@ public class RNDeviceModule extends ReactContextBaseJavaModule {

    try {
      BluetoothAdapter myDevice = BluetoothAdapter.getDefaultAdapter();
      if(mDevice!=null){
      if(myDevice!=null){
        deviceName = myDevice.getName();
      }
    } catch(Exception e) {
@@ -122,7 +125,6 @@ public class RNDeviceModule extends ReactContextBaseJavaModule {
    constants.put("timezone", TimeZone.getDefault().getID());
    constants.put("isEmulator", this.isEmulator());
    constants.put("isTablet", this.isTablet());
    constants.put("isPinOrFingerprintSet", this.isPinOrFingerprintSet());
    return constants;
  }
}