Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b857491c authored by Betty Chang's avatar Betty Chang Committed by Android (Google) Code Review
Browse files

Merge "Adding an option to install a certificate from the CA certificate menu" into sc-dev

parents dc00faec 916bac8f
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -85,6 +85,13 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        mUIController.showSecurityFields(
            /* refreshEapMethods */ false, /* refreshCertificates */ true);
    }

    @Override
    public void onViewStateRestored(Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
@@ -110,7 +117,6 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER) {
            if (resultCode != Activity.RESULT_OK) {
                return;
+7 −0
Original line number Diff line number Diff line
@@ -127,6 +127,13 @@ public class ConfigureWifiEntryFragment extends InstrumentedFragment implements
        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        mUiController.showSecurityFields(
            /* refreshEapMethods */ false, /* refreshCertificates */ true);
    }

    @Override
    public void onViewStateRestored(Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
+37 −8
Original line number Diff line number Diff line
@@ -16,7 +16,10 @@

package com.android.settings.wifi;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.InetAddresses;
import android.net.IpConfiguration;
@@ -32,6 +35,7 @@ import android.net.wifi.WifiEnterpriseConfig.Eap;
import android.net.wifi.WifiEnterpriseConfig.Phase2;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.os.UserHandle;
import android.security.keystore.KeyProperties;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -144,6 +148,15 @@ public class WifiConfigController2 implements TextWatcher,
        UNDESIRED_CERTIFICATE_MACRANDSAPSECRET
    };

    /* These values are for install certificate */
    private static final String ACTION_INSTALL_CERTS = "android.credentials.INSTALL";
    private static final String PACKAGE_INSTALL_CERTS = "com.android.certinstaller";
    private static final String CLASS_INSTALL_CERTS = "com.android.certinstaller.CertInstallerMain";
    private static final String KEY_INSTALL_CERTIFICATE = "certificate_install_usage";
    private static final String INSTALL_CERTIFICATE_VALUE = "wifi";

    protected int REQUEST_INSTALL_CERTS = 1;

    /* Phase2 methods supported by PEAP are limited */
    private ArrayAdapter<CharSequence> mPhase2PeapAdapter;
    /* Phase2 methods supported by TTLS are limited */
@@ -159,12 +172,13 @@ public class WifiConfigController2 implements TextWatcher,
    private String mMultipleCertSetString;
    private String mUseSystemCertsString;
    private String mDoNotProvideEapUserCertString;
    @VisibleForTesting String mInstallCertsString;

    private Spinner mSecuritySpinner;
    @VisibleForTesting Spinner mEapMethodSpinner;
    private int mLastShownEapMethod;
    @VisibleForTesting Spinner mEapSimSpinner;    // For EAP-SIM, EAP-AKA and EAP-AKA-PRIME.
    private Spinner mEapCaCertSpinner;
    @VisibleForTesting Spinner mEapCaCertSpinner;
    private Spinner mEapOcspSpinner;
    private TextView mEapDomainView;
    private Spinner mPhase2Spinner;
@@ -258,6 +272,7 @@ public class WifiConfigController2 implements TextWatcher,
        mUseSystemCertsString = mContext.getString(R.string.wifi_use_system_certs);
        mDoNotProvideEapUserCertString =
            mContext.getString(R.string.wifi_do_not_provide_eap_user_cert);
        mInstallCertsString = mContext.getString(R.string.wifi_install_credentials);

        mSsidScanButton = (ImageButton) mView.findViewById(R.id.ssid_scanner_button);
        mIpSettingsSpinner = (Spinner) mView.findViewById(R.id.ip_settings);
@@ -942,7 +957,7 @@ public class WifiConfigController2 implements TextWatcher,
        }
    }

    private void showSecurityFields(boolean refreshEapMethods, boolean refreshCertificates) {
    protected void showSecurityFields(boolean refreshEapMethods, boolean refreshCertificates) {
        if (mWifiEntrySecurity == WifiEntry.SECURITY_NONE
                || mWifiEntrySecurity == WifiEntry.SECURITY_OWE) {
            mView.findViewById(R.id.security_fields).setVisibility(View.GONE);
@@ -1031,11 +1046,8 @@ public class WifiConfigController2 implements TextWatcher,
                    mDoNotProvideEapUserCertString,
                    false /* showMultipleCerts */,
                    false /* showUsePreinstalledCertOption */);
            // To avoid the user connects to a non-secure network unexpectedly,
            // request using system trusted certificates by default
            // unless the user explicitly chooses "Do not validate" or other
            // CA certificates.
            setSelection(mEapCaCertSpinner, mUseSystemCertsString);

            setSelection(mEapCaCertSpinner, mUnspecifiedCertString);
        }

        // Modifying an existing network
@@ -1494,6 +1506,7 @@ public class WifiConfigController2 implements TextWatcher,
        }
        if (showUsePreinstalledCertOption) {
            certs.add(mUseSystemCertsString);
            certs.add(mInstallCertsString);
        }

        if (choices != null && choices.size() != 0) {
@@ -1661,6 +1674,10 @@ public class WifiConfigController2 implements TextWatcher,
                showSecurityFields(/* refreshEapMethods */false, /* refreshCertificates */ true);
            }
        } else if (parent == mEapCaCertSpinner) {
            String selectedItem = parent.getItemAtPosition(position).toString();
            if (selectedItem.equals(mInstallCertsString)) {
                startActivityForInstallCerts();
            }
            showSecurityFields(/* refreshEapMethods */ false, /* refreshCertificates */ false);
        } else if (parent == mPhase2Spinner
                && mEapMethodSpinner.getSelectedItemPosition() == WIFI_EAP_METHOD_PEAP) {
@@ -1682,6 +1699,18 @@ public class WifiConfigController2 implements TextWatcher,
        //
    }

    /**
     * Start the install page for user to install the existing certificate.
     */
    private void startActivityForInstallCerts() {
        Intent intent = new Intent(ACTION_INSTALL_CERTS);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setComponent(new ComponentName(PACKAGE_INSTALL_CERTS, CLASS_INSTALL_CERTS));
        intent.putExtra(KEY_INSTALL_CERTIFICATE, INSTALL_CERTIFICATE_VALUE);

        mContext.startActivity(intent);
    }

    /**
     * Make the characters of the password visible if show_password is checked.
     */
+39 −2
Original line number Diff line number Diff line
@@ -18,11 +18,17 @@ package com.android.settings.wifi;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;

import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
@@ -30,12 +36,14 @@ import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiEnterpriseConfig.Eap;
import android.net.wifi.WifiEnterpriseConfig.Phase2;
import android.net.wifi.WifiManager;
import android.os.UserHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
@@ -54,6 +62,7 @@ import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -81,6 +90,7 @@ public class WifiConfigController2Test {
    private Spinner mHiddenSettingsSpinner;
    private Spinner mEapCaCertSpinner;
    private Spinner mEapUserCertSpinner;
    private String mUnspecifiedCertString;
    private String mUseSystemCertsString;
    private String mDoNotProvideEapUserCertString;
    private ShadowSubscriptionManager mShadowSubscriptionManager;
@@ -107,10 +117,16 @@ public class WifiConfigController2Test {
    private static final String SAVED_CA_CERT = "saved CA cert";
    private static final String SAVED_USER_CERT = "saved user cert";

    private static final int POSITION_SYSTEM_CERT = 1;
    private static final int POSITION_INSTALL_CERT = 2;
    private static final String ACTION_INSTALL_CERTS = "android.credentials.INSTALL";
    private static final String KEY_INSTALL_CERTIFICATE = "certificate_install_usage";
    private static final String INSTALL_CERTIFICATE_VALUE = "wifi";

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mContext = spy(RuntimeEnvironment.application);
        when(mConfigUiBase.getContext()).thenReturn(mContext);
        when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
        mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null);
@@ -119,6 +135,7 @@ public class WifiConfigController2Test {
        mEapCaCertSpinner = mView.findViewById(R.id.ca_cert);
        mEapUserCertSpinner = mView.findViewById(R.id.user_cert);
        mUseSystemCertsString = mContext.getString(R.string.wifi_use_system_certs);
        mUnspecifiedCertString = mContext.getString(R.string.wifi_unspecified);
        mDoNotProvideEapUserCertString =
                mContext.getString(R.string.wifi_do_not_provide_eap_user_cert);
        ipSettingsSpinner.setSelection(DHCP);
@@ -709,7 +726,6 @@ public class WifiConfigController2Test {
                Phase2.AKA_PRIME);
    }


    @Test
    public void getEapConfig_withPeapPhase2Unknown_shouldContainNoneMethod() {
        setUpModifyingSavedPeapConfigController();
@@ -835,9 +851,30 @@ public class WifiConfigController2Test {
    public void loadCaCertificateValue_shouldPersistentAsDefault() {
        setUpModifyingSavedCertificateConfigController(null, null);

        mEapCaCertSpinner.setSelection(POSITION_SYSTEM_CERT);
        assertThat(mEapCaCertSpinner.getSelectedItem()).isEqualTo(mUseSystemCertsString);
    }

    @Test
    public void onItemSelected_shouldPersistentInstallCertsAndStartInstallActivity() {
        String installCertsString = "install_certs";
        Spinner eapCaCertSpinner = mock(Spinner.class);
        AdapterView view = mock(AdapterView.class);
        when(eapCaCertSpinner.getItemAtPosition(anyInt())).thenReturn(view);
        when(view.toString()).thenReturn(installCertsString);
        mController.mInstallCertsString = installCertsString;
        mController.mEapCaCertSpinner = eapCaCertSpinner;

        mController.onItemSelected(eapCaCertSpinner, null, POSITION_INSTALL_CERT, 0);

        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
        verify(mContext).startActivity(argumentCaptor.capture());
        final Intent intent = argumentCaptor.getValue();
        assertThat(intent.getAction()).isEqualTo(ACTION_INSTALL_CERTS);
        assertThat(intent.getExtra(KEY_INSTALL_CERTIFICATE, ""))
                .isEqualTo(INSTALL_CERTIFICATE_VALUE);
    }

    @Test
    public void loadSavedCaCertificateValue_shouldBeCorrectValue() {
        setUpModifyingSavedCertificateConfigController(SAVED_CA_CERT, null);