summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dmitry Dementyev <dementyev@google.com> 2017-12-21 17:30:48 -0800
committer Dmitry Dementyev <dementyev@google.com> 2017-12-21 20:15:08 -0800
commit3b17c63f698fb09fb14f457053edb2db186fea9a (patch)
tree8a4d275915b3f670320be20bfe817010a02c1214
parent897719ef13eef79cae5b32dfc4ab9b5db2e4033b (diff)
Implement RecoverableKeyStoreLoader.setSnapshotCreatedPendingIntent
Bug: 66499222 Test: adb shell am instrument -w -e package \ com.android.server.locksettings.recoverablekeystore \ com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner Change-Id: I45905a2594ae5b4a681f15e78a7f63293c8fb4d5
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java17
2 files changed, 24 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index cfeaaf8ec8d9..fd62282e8099 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -64,6 +64,7 @@ public class RecoverableKeyStoreManager {
private final RecoverableKeyStoreDb mDatabase;
private final RecoverySessionStorage mRecoverySessionStorage;
private final ExecutorService mExecutorService;
+ private final ListenersStorage mListenersStorage;
/**
* Returns a new or existing instance.
@@ -77,7 +78,8 @@ public class RecoverableKeyStoreManager {
mContext.getApplicationContext(),
db,
new RecoverySessionStorage(),
- Executors.newSingleThreadExecutor());
+ Executors.newSingleThreadExecutor(),
+ ListenersStorage.getInstance());
}
return mInstance;
}
@@ -87,11 +89,13 @@ public class RecoverableKeyStoreManager {
Context context,
RecoverableKeyStoreDb recoverableKeyStoreDb,
RecoverySessionStorage recoverySessionStorage,
- ExecutorService executorService) {
+ ExecutorService executorService,
+ ListenersStorage listenersStorage) {
mContext = context;
mDatabase = recoverableKeyStoreDb;
mRecoverySessionStorage = recoverySessionStorage;
mExecutorService = executorService;
+ mListenersStorage = listenersStorage;
}
public int initRecoveryService(
@@ -134,7 +138,8 @@ public class RecoverableKeyStoreManager {
public void setSnapshotCreatedPendingIntent(@Nullable PendingIntent intent, int userId)
throws RemoteException {
checkRecoverKeyStorePermission();
- throw new UnsupportedOperationException();
+ final int recoveryAgentUid = Binder.getCallingUid();
+ mListenersStorage.setSnapshotListener(recoveryAgentUid, intent);
}
/**
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index fb2d3413907f..c57035454168 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -27,7 +27,10 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
import android.os.RemoteException;
import android.security.recoverablekeystore.KeyDerivationParameters;
import android.security.recoverablekeystore.KeyEntryRecoveryData;
@@ -89,6 +92,7 @@ public class RecoverableKeyStoreManagerTest {
private static final String TEST_ALIAS = "nick";
@Mock private Context mMockContext;
+ @Mock private ListenersStorage mMockListenersStorage;
private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
private File mDatabaseFile;
@@ -107,7 +111,8 @@ public class RecoverableKeyStoreManagerTest {
mMockContext,
mRecoverableKeyStoreDb,
mRecoverySessionStorage,
- Executors.newSingleThreadExecutor());
+ Executors.newSingleThreadExecutor(),
+ mMockListenersStorage);
}
@After
@@ -301,6 +306,16 @@ public class RecoverableKeyStoreManagerTest {
TEST_USER_ID);
}
+ @Test
+ public void setSnapshotCreatedPendingIntent() throws Exception {
+ int uid = Binder.getCallingUid();
+ PendingIntent intent = PendingIntent.getBroadcast(
+ InstrumentationRegistry.getTargetContext(), /*requestCode=*/1,
+ new Intent(), /*flags=*/ 0);
+ mRecoverableKeyStoreManager.setSnapshotCreatedPendingIntent(intent, /*userId=*/ 0);
+ verify(mMockListenersStorage).setSnapshotListener(eq(uid), any(PendingIntent.class));
+ }
+
private static byte[] randomEncryptedApplicationKey(SecretKey recoveryKey) throws Exception {
return KeySyncUtils.encryptKeysWithRecoveryKey(recoveryKey, ImmutableMap.of(
"alias", new SecretKeySpec(randomBytes(32), "AES")