From eb7836f11ec4e9753db7c6ecd9414e153bb7bdbe Mon Sep 17 00:00:00 2001 From: Chung-yih Wang Date: Mon, 6 Jul 2009 17:03:53 +0800 Subject: [PATCH] Apply the new keystore and certtool library in Wifi setting. 1. Certificate related APIs were moved to CertTool. Therefore, we have to migrate to CertTool instead. 2. Unlock the keystore if it is not unlocked yet(send the intent out to credential storage) for EAP access points. 3. Add Password field for WPA_EAP and IEEE8021X(this is for phase 2 auth.) --- res/layout/wifi_ap_configure.xml | 46 +++--- .../settings/wifi/AccessPointDialog.java | 154 +++++++++--------- .../settings/wifi/AccessPointState.java | 22 ++- .../android/settings/wifi/WifiSettings.java | 10 +- 4 files changed, 123 insertions(+), 109 deletions(-) diff --git a/res/layout/wifi_ap_configure.xml b/res/layout/wifi_ap_configure.xml index e3ddf35bc6b..f8eb39a62bd 100644 --- a/res/layout/wifi_ap_configure.xml +++ b/res/layout/wifi_ap_configure.xml @@ -66,7 +66,7 @@ - - - - + + + + diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java index 43081a53c28..bf2007a9a5a 100644 --- a/src/com/android/settings/wifi/AccessPointDialog.java +++ b/src/com/android/settings/wifi/AccessPointDialog.java @@ -17,11 +17,14 @@ package com.android.settings.wifi; import com.android.settings.R; +import com.android.settings.SecuritySettings; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.content.res.Resources; +import android.security.CertTool; import android.security.Keystore; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; @@ -129,13 +132,13 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On private TextView mSecurityText; private Spinner mSecuritySpinner; private Spinner mWepTypeSpinner; - private Keystore mKeystore; + private CertTool mCertTool; public AccessPointDialog(Context context, WifiLayer wifiLayer) { super(context); mWifiLayer = wifiLayer; - mKeystore = Keystore.getInstance(); + mCertTool = CertTool.getInstance(); } @Override @@ -240,7 +243,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On setEnterpriseFieldsVisible(false); } else if (mMode == MODE_INFO) { - if (isEnterprise() && !mState.configured) { + if (mState.isEnterprise() && !mState.configured) { setLayout(R.layout.wifi_ap_configure); defaultPasswordVisibility = false; setEnterpriseFieldsVisible(true); @@ -287,16 +290,6 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On setButtons(positiveButtonResId, negativeButtonResId, neutralButtonResId); } - private boolean isEnterprise() { - - if(AccessPointState.WPA_EAP.equals(mState.security) || - AccessPointState.IEEE8021X.equals(mState.security)) { - return true; - } else { - return false; - } - } - /** Called when we need to set our member variables to point to the views. */ private void onReferenceViews(View view) { mPasswordText = (TextView) view.findViewById(R.id.password_text); @@ -322,7 +315,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On mTable = (ViewGroup) view.findViewById(R.id.table); } /* for enterprise one */ - if (mMode == MODE_CONFIGURE || (isEnterprise() && !mState.configured)) { + if (mMode == MODE_CONFIGURE || + (mState.isEnterprise() && !mState.configured)) { setEnterpriseFields(view); mEapSpinner.setSelection(getSelectionIndex( R.array.wifi_eap_entries, mState.getEap())); @@ -336,15 +330,14 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On } private String[] getAllCaCertificateKeys() { - return appendEmptyInSelection(mKeystore.getAllCaCertificateKeys()); + return appendEmptyInSelection(mCertTool.getAllCaCertificateKeys()); } private String[] getAllUserCertificateKeys() { - return appendEmptyInSelection(mKeystore.getAllUserCertificateKeys()); + return appendEmptyInSelection(mCertTool.getAllUserCertificateKeys()); } private String[] appendEmptyInSelection(String[] keys) { - if (keys.length == 0) return keys; String[] selections = new String[keys.length + 1]; System.arraycopy(keys, 0, selections, 0, keys.length); selections[keys.length] = NOT_APPLICABLE; @@ -436,8 +429,9 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On if (!TextUtils.isEmpty(ssid)) { mSsidEdit.setText(ssid); } - - mPasswordEdit.setHint(R.string.wifi_password_unchanged); + if (mState.configured) { + mPasswordEdit.setHint(R.string.wifi_password_unchanged); + } } updatePasswordCaption(mState.security); @@ -505,15 +499,15 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On Log.w(TAG, "Assuming connecting to a new network."); } - if (isEnterprise()) { + if (mState.isEnterprise()) { if(!mState.configured) { updateEnterpriseFields( AccessPointState.WPA_EAP.equals(mState.security) ? SECURITY_WPA_EAP : SECURITY_IEEE8021X); } - } else { - updatePasswordField(); } + updatePasswordField(); + mWifiLayer.connectToNetwork(mState); } @@ -558,58 +552,53 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On mState.setSsid(ssid); int securityType = getSecurityTypeFromSpinner(); - - if (!TextUtils.isEmpty(password)) { - switch (securityType) { - - case SECURITY_WPA_PERSONAL: { - mState.setSecurity(AccessPointState.WPA); - mState.setPassword(password); - break; - } - - case SECURITY_WPA2_PERSONAL: { - mState.setSecurity(AccessPointState.WPA2); - mState.setPassword(password); - break; - } - - case SECURITY_AUTO: { - mState.setPassword(password); - break; - } - - case SECURITY_WEP: { - mState.setSecurity(AccessPointState.WEP); - mState.setPassword(password, - WEP_TYPE_VALUES[mWepTypeSpinner.getSelectedItemPosition()]); - break; - } - - } - } else { - switch (securityType) { - case SECURITY_WPA_EAP: - mState.setSecurity(AccessPointState.WPA_EAP); - break; - case SECURITY_IEEE8021X: - mState.setSecurity(AccessPointState.IEEE8021X); - break; - default: - mState.setSecurity(AccessPointState.OPEN); - break; - } - if (isEnterprise() && !mState.configured) { - updateEnterpriseFields( - AccessPointState.WPA_EAP.equals(mState.security) ? - SECURITY_WPA_EAP : SECURITY_IEEE8021X); - } + + if (!TextUtils.isEmpty(password) && (securityType != SECURITY_WEP)) { + mState.setPassword(password); } - - if (securityType == SECURITY_NONE) { - mState.setSecurity(AccessPointState.OPEN); + + switch (securityType) { + case SECURITY_WPA_PERSONAL: { + mState.setSecurity(AccessPointState.WPA); + break; + } + + case SECURITY_WPA2_PERSONAL: { + mState.setSecurity(AccessPointState.WPA2); + break; + } + + case SECURITY_AUTO: { + break; + } + + case SECURITY_WEP: { + mState.setSecurity(AccessPointState.WEP); + mState.setPassword(password, WEP_TYPE_VALUES[ + mWepTypeSpinner.getSelectedItemPosition()]); + break; + } + + case SECURITY_WPA_EAP: + mState.setSecurity(AccessPointState.WPA_EAP); + break; + + case SECURITY_IEEE8021X: + mState.setSecurity(AccessPointState.IEEE8021X); + break; + + case SECURITY_NONE: + default: + mState.setSecurity(AccessPointState.OPEN); + break; } - + + if (mState.isEnterprise() && !mState.configured) { + updateEnterpriseFields( + AccessPointState.WPA_EAP.equals(mState.security) ? + SECURITY_WPA_EAP : SECURITY_IEEE8021X); + } + if (!mWifiLayer.saveNetwork(mState)) { return; } @@ -649,13 +638,13 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On Spinner spinner = mClientCertSpinner; int index = spinner.getSelectedItemPosition(); if (index != (spinner.getCount() - 1)) { - String key = getAllUserCertificateKeys()[index]; - value = mKeystore.getUserCertificate(key); + String key = (String)spinner.getSelectedItem(); + value = mCertTool.getUserCertificate(key); if (!TextUtils.isEmpty(value)) { mState.setEnterpriseField(AccessPointState.CLIENT_CERT, value); } - value = mKeystore.getUserPrivateKey(key); + value = mCertTool.getUserPrivateKey(key); if (!TextUtils.isEmpty(value)) { mState.setEnterpriseField(AccessPointState.PRIVATE_KEY, value); @@ -664,8 +653,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On spinner = mCaCertSpinner; index = spinner.getSelectedItemPosition(); if (index != (spinner.getCount() - 1)) { - String key = getAllCaCertificateKeys()[index]; - value = mKeystore.getCaCertificate(key); + String key = (String)spinner.getSelectedItem(); + value = mCertTool.getCaCertificate(key); if (!TextUtils.isEmpty(value)) { mState.setEnterpriseField(AccessPointState.CA_CERT, value); @@ -738,7 +727,6 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On mEnterpriseView.setVisibility(visibility); if (visible) { setWepVisible(false); - setGenericPasswordVisible(false); } if (mMode != MODE_CONFIGURE) { mSsidText.setVisibility(View.GONE); @@ -792,7 +780,17 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On } case SECURITY_WPA_EAP: case SECURITY_IEEE8021X: { + // Unlock the keystore if it is not unlocked yet. + if (Keystore.getInstance().getState() != Keystore.UNLOCKED) { + getContext().startActivity(new Intent( + SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE)); + mSecuritySpinner.setSelection(0); + return; + } setEnterpriseFieldsVisible(true); + setGenericPasswordVisible(true); + // Both WPA and WPA2 show the same caption, so either is ok + updatePasswordCaption(AccessPointState.WPA); break; } } diff --git a/src/com/android/settings/wifi/AccessPointState.java b/src/com/android/settings/wifi/AccessPointState.java index 7ea2dc91bdf..8fb651bc012 100644 --- a/src/com/android/settings/wifi/AccessPointState.java +++ b/src/com/android/settings/wifi/AccessPointState.java @@ -276,7 +276,12 @@ public final class AccessPointState implements Comparable, Par requestRefresh(); } } - + + public boolean isEnterprise() { + return (WPA_EAP.equals(security) || + AccessPointState.IEEE8021X.equals(security)); + } + public void setSecurity(String security) { if (TextUtils.isEmpty(this.security) || !this.security.equals(security)) { this.security = security; @@ -592,14 +597,17 @@ public final class AccessPointState implements Comparable, Par } else if (security.equals(OPEN)) { config.allowedKeyManagement.set(KeyMgmt.NONE); - } else if (security.equals(WPA_EAP)) { + } else if (security.equals(WPA_EAP) || security.equals(IEEE8021X)) { config.allowedGroupCiphers.set(GroupCipher.TKIP); config.allowedGroupCiphers.set(GroupCipher.CCMP); - config.allowedKeyManagement.set(KeyMgmt.WPA_EAP); - } else if (security.equals(IEEE8021X)) { - config.allowedGroupCiphers.set(GroupCipher.TKIP); - config.allowedGroupCiphers.set(GroupCipher.CCMP); - config.allowedKeyManagement.set(KeyMgmt.IEEE8021X); + if (security.equals(WPA_EAP)) { + config.allowedKeyManagement.set(KeyMgmt.WPA_EAP); + } else { + config.allowedKeyManagement.set(KeyMgmt.IEEE8021X); + } + if (!TextUtils.isEmpty(mPassword)) { + config.password = convertToQuotedString(mPassword); + } } } diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index d2683c0f44f..a0155343a20 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -18,6 +18,7 @@ package com.android.settings.wifi; import com.android.settings.ProgressCategory; import com.android.settings.R; +import com.android.settings.SecuritySettings; import android.app.Dialog; import android.content.DialogInterface; @@ -29,6 +30,7 @@ import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.preference.CheckBoxPreference; import android.provider.Settings; +import android.security.Keystore; import android.util.Log; import android.view.ContextMenu; import android.view.Menu; @@ -259,7 +261,7 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba @Override public boolean onContextItemSelected(MenuItem item) { - + AccessPointState state = getStateFromMenuInfo(item.getMenuInfo()); if (state == null) { return false; @@ -352,6 +354,12 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba } public void showAccessPointDialog(AccessPointState state, int mode) { + if (state.isEnterprise() && + Keystore.getInstance().getState() != Keystore.UNLOCKED) { + startActivity(new Intent( + SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE)); + return; + } AccessPointDialog dialog = new AccessPointDialog(this, mWifiLayer); dialog.setMode(mode); dialog.setState(state);