Trust the certificate after unlocking screenlock

When trust button is clicked, if ConfirmCredential (CC) is shown,
and user successfully unlock CC, trust the cert immediately

Bug: 28752364
Change-Id: Ied4aeda59a668a9dd2bf079a385b1fecd8eabb9e
This commit is contained in:
Victor Chang
2016-05-23 19:47:38 +01:00
parent ffe930ec76
commit 45ca906e27
2 changed files with 36 additions and 7 deletions

View File

@@ -38,12 +38,14 @@ import com.android.settings.TrustedCredentialsSettings.CertHolder;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.IntConsumer;
class TrustedCredentialsDialogBuilder extends AlertDialog.Builder { class TrustedCredentialsDialogBuilder extends AlertDialog.Builder {
public interface DelegateInterface { public interface DelegateInterface {
List<X509Certificate> getX509CertsFromCertHolder(CertHolder certHolder); List<X509Certificate> getX509CertsFromCertHolder(CertHolder certHolder);
void removeOrInstallCert(CertHolder certHolder); void removeOrInstallCert(CertHolder certHolder);
boolean startConfirmCredentialIfNotConfirmed(int userId); boolean startConfirmCredentialIfNotConfirmed(int userId,
IntConsumer onCredentialConfirmedListener);
} }
private final DialogEventHandler mDialogEventHandler; private final DialogEventHandler mDialogEventHandler;
@@ -145,7 +147,8 @@ class TrustedCredentialsDialogBuilder extends AlertDialog.Builder {
private void onClickTrust() { private void onClickTrust() {
CertHolder certHolder = getCurrentCertInfo(); CertHolder certHolder = getCurrentCertInfo();
if (!mDelegate.startConfirmCredentialIfNotConfirmed(certHolder.getUserId())) { if (!mDelegate.startConfirmCredentialIfNotConfirmed(certHolder.getUserId(),
this::onCredentialConfirmed)) {
mDpm.approveCaCert(certHolder.getAlias(), certHolder.getUserId(), true); mDpm.approveCaCert(certHolder.getAlias(), certHolder.getUserId(), true);
nextOrDismiss(); nextOrDismiss();
} }
@@ -168,6 +171,14 @@ class TrustedCredentialsDialogBuilder extends AlertDialog.Builder {
.show(); .show();
} }
private void onCredentialConfirmed(int userId) {
if (mDialog.isShowing() && mNeedsApproval && getCurrentCertInfo() != null
&& getCurrentCertInfo().getUserId() == userId) {
// Treat it as user just clicks "trust" for this cert
onClickTrust();
}
}
private CertHolder getCurrentCertInfo() { private CertHolder getCurrentCertInfo() {
return mCurrentCertIndex < mCertHolders.length ? mCertHolders[mCurrentCertIndex] : null; return mCurrentCertIndex < mCertHolders.length ? mCertHolders[mCurrentCertIndex] : null;
} }

View File

@@ -68,6 +68,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.IntConsumer;
public class TrustedCredentialsSettings extends OptionsMenuFragment public class TrustedCredentialsSettings extends OptionsMenuFragment
implements TrustedCredentialsDialogBuilder.DelegateInterface { implements TrustedCredentialsDialogBuilder.DelegateInterface {
@@ -159,6 +160,7 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
private AliasOperation mAliasOperation; private AliasOperation mAliasOperation;
private ArraySet<Integer> mConfirmedCredentialUsers; private ArraySet<Integer> mConfirmedCredentialUsers;
private int mConfirmingCredentialUser; private int mConfirmingCredentialUser;
private IntConsumer mConfirmingCredentialListener;
private Set<AdapterData.AliasLoader> mAliasLoaders = new ArraySet<AdapterData.AliasLoader>(2); private Set<AdapterData.AliasLoader> mAliasLoaders = new ArraySet<AdapterData.AliasLoader>(2);
private final SparseArray<KeyChainConnection> private final SparseArray<KeyChainConnection>
mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>(); mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>();
@@ -199,6 +201,8 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
} }
} }
mConfirmingCredentialListener = null;
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
@@ -246,10 +250,18 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CONFIRM_CREDENTIALS) { if (requestCode == REQUEST_CONFIRM_CREDENTIALS) {
if (resultCode == Activity.RESULT_OK) { int userId = mConfirmingCredentialUser;
mConfirmedCredentialUsers.add(mConfirmingCredentialUser); IntConsumer listener = mConfirmingCredentialListener;
} // reset them before calling the listener because the listener may call back to start
// activity again. (though it should never happen.)
mConfirmingCredentialUser = UserHandle.USER_NULL; mConfirmingCredentialUser = UserHandle.USER_NULL;
mConfirmingCredentialListener = null;
if (resultCode == Activity.RESULT_OK) {
mConfirmedCredentialUsers.add(userId);
if (listener != null) {
listener.accept(userId);
}
}
} }
} }
@@ -942,12 +954,18 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
} }
@Override @Override
public boolean startConfirmCredentialIfNotConfirmed(int userId) { public boolean startConfirmCredentialIfNotConfirmed(int userId,
IntConsumer onCredentialConfirmedListener) {
if (mConfirmedCredentialUsers.contains(userId)) { if (mConfirmedCredentialUsers.contains(userId)) {
// Credential has been confirmed. Don't start activity. // Credential has been confirmed. Don't start activity.
return false; return false;
} }
return startConfirmCredential(userId);
boolean result = startConfirmCredential(userId);
if (result) {
mConfirmingCredentialListener = onCredentialConfirmedListener;
}
return result;
} }
private class AliasOperation extends AsyncTask<Void, Void, Boolean> { private class AliasOperation extends AsyncTask<Void, Void, Boolean> {