浏览代码

enhance pass protection system

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 6 年之前
父节点
当前提交
c1ff580ea5

+ 3 - 1
src/gplay/java/com/nextcloud/client/di/VariantComponentsModule.java

@@ -28,5 +28,7 @@ import dagger.android.ContributesAndroidInjector;
 @Module
 abstract class VariantComponentsModule {
     @ContributesAndroidInjector abstract NCFirebaseInstanceIDService ncFirebaseInstanceIDService();
-    @ContributesAndroidInjector abstract ModifiedAuthenticatorActivity modifiedAuthenticatorActivity();
+
+    @ContributesAndroidInjector
+    abstract ModifiedAuthenticatorActivity modifiedAuthenticatorActivity();
 }

+ 3 - 1
src/main/AndroidManifest.xml

@@ -296,7 +296,9 @@
         <service android:name=".files.services.FileUploader" />
         <service android:name=".media.MediaService" />
 
-        <activity android:name=".ui.activity.PassCodeActivity" />
+        <activity
+            android:name=".ui.activity.PassCodeActivity"
+            android:launchMode="singleTask" />
         <activity
             android:name=".ui.activity.RequestCredentialsActivity"
             android:launchMode="singleTask" />

+ 1 - 2
src/main/java/com/owncloud/android/MainApp.java

@@ -242,18 +242,17 @@ public class MainApp extends MultiDexApplication implements
             public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                 Log_OC.d(activity.getClass().getSimpleName(), "onCreate(Bundle) starting");
                 WhatsNewActivity.runIfNeeded(activity, preferences);
-                passCodeManager.onActivityCreated(activity);
             }
 
             @Override
             public void onActivityStarted(Activity activity) {
                 Log_OC.d(activity.getClass().getSimpleName(), "onStart() starting");
-                passCodeManager.onActivityStarted(activity);
             }
 
             @Override
             public void onActivityResumed(Activity activity) {
                 Log_OC.d(activity.getClass().getSimpleName(), "onResume() starting");
+                passCodeManager.onActivityStarted(activity);
             }
 
             @Override

+ 8 - 0
src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -89,6 +89,7 @@ import com.google.android.material.snackbar.Snackbar;
 import com.google.android.material.textfield.TextInputLayout;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
+import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.OwnCloudAccount;
@@ -251,6 +252,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     @Inject
     protected UserAccountManager accountManager;
 
+    @Inject
+    protected AppPreferences preferences;
+
     /**
      * {@inheritDoc}
      *
@@ -845,6 +849,10 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
             super.finish();
         }
 
+        // Passcode
+        PassCodeManager passCodeManager = new PassCodeManager(preferences);
+        passCodeManager.onActivityStarted(this);
+
         Uri data = intent.getData();
 
         if (data != null && data.toString().startsWith(getString(R.string.login_data_own_scheme))) {

+ 19 - 4
src/main/java/com/owncloud/android/authentication/PassCodeManager.java

@@ -76,31 +76,46 @@ public final class PassCodeManager {
         }
     }
 
-    public void onActivityStarted(Activity activity) {
+    public boolean onActivityStarted(Activity activity) {
+        boolean askedForPin = false;
         Long timestamp = AppPreferencesImpl.fromContext(activity).getLockTimestamp();
+
         if (!exemptOfPasscodeActivities.contains(activity.getClass()) && passCodeShouldBeRequested(timestamp)) {
+            askedForPin = true;
+
+            preferences.setLockTimestamp(0);
 
             Intent i = new Intent(MainApp.getAppContext(), PassCodeActivity.class);
             i.setAction(PassCodeActivity.ACTION_CHECK);
-            i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+            i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
             activity.startActivityForResult(i, PASSCODE_ACTIVITY);
         }
 
         if (!exemptOfPasscodeActivities.contains(activity.getClass()) &&
             Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && deviceCredentialsShouldBeRequested(timestamp, activity)) {
+            askedForPin = true;
+
+            preferences.setLockTimestamp(0);
+
             Intent i = new Intent(MainApp.getAppContext(), RequestCredentialsActivity.class);
-            i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+            i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
             activity.startActivityForResult(i, PASSCODE_ACTIVITY);
+        } else {
+            if (preferences.getLockTimestamp() != 0) {
+                preferences.setLockTimestamp(System.currentTimeMillis());
+            }
         }
 
         visibleActivitiesCounter++;    // keep it AFTER passCodeShouldBeRequested was checked
+
+        return askedForPin;
     }
 
     public void onActivityStopped(Activity activity) {
         if (visibleActivitiesCounter > 0) {
             visibleActivitiesCounter--;
         }
-        setUnlockTimestamp(activity);
+
         PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
         if ((isPassCodeEnabled() || deviceCredentialsAreEnabled(activity)) && powerMgr != null
                 && !powerMgr.isScreenOn()) {

+ 3 - 0
src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -1395,6 +1395,9 @@ public abstract class DrawerActivity extends ToolbarActivity
 
     @Override
     protected void onStop() {
+        if (preferences.getLockTimestamp() != 0) {
+            preferences.setLockTimestamp(System.currentTimeMillis());
+        }
         EventBus.getDefault().unregister(this);
         super.onStop();
     }

+ 2 - 2
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -221,10 +221,10 @@ public class FileDisplayActivity extends FileActivity
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         Log_OC.v(TAG, "onCreate() start");
+        super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
+
         // Set the default theme to replace the launch screen theme.
         setTheme(R.style.Theme_ownCloud_Toolbar_Drawer);
-        super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account
-        // is valid
 
         /// Load of saved instance state
         if (savedInstanceState != null) {

+ 3 - 0
src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java

@@ -40,6 +40,7 @@ import android.widget.TextView;
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
+import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.ThemeUtils;
@@ -239,6 +240,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
         if (ACTION_CHECK.equals(getIntent().getAction())) {
             if (checkPassCode()) {
                 /// pass code accepted in request, user is allowed to access the app
+                AppPreferencesImpl.fromContext(this).setLockTimestamp(System.currentTimeMillis());
                 hideSoftKeyboard();
                 finish();
 
@@ -248,6 +250,7 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
 
         } else if (ACTION_CHECK_WITH_RESULT.equals(getIntent().getAction())) {
             if (checkPassCode()) {
+                AppPreferencesImpl.fromContext(this).setLockTimestamp(System.currentTimeMillis());
                 Intent resultIntent = new Intent();
                 resultIntent.putExtra(KEY_CHECK_RESULT, true);
                 setResult(RESULT_OK, resultIntent);

+ 2 - 0
src/main/java/com/owncloud/android/ui/activity/RequestCredentialsActivity.java

@@ -27,6 +27,7 @@ import android.content.Intent;
 import android.os.Build;
 import android.widget.Toast;
 
+import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.DeviceCredentialUtils;
@@ -52,6 +53,7 @@ public class RequestCredentialsActivity extends Activity {
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
             if (resultCode == Activity.RESULT_OK) {
+                AppPreferencesImpl.fromContext(this).setLockTimestamp(System.currentTimeMillis());
                 finishWithResult(KEY_CHECK_RESULT_TRUE);
             } else if (resultCode == Activity.RESULT_CANCELED) {
                 finishWithResult(KEY_CHECK_RESULT_CANCEL);