package com.android.certinstaller; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiEnterpriseConfig; import android.net.wifi.WifiManager; import android.os.Bundle; import android.security.Credentials; import android.security.KeyStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.security.PrivateKey; import java.security.interfaces.RSAPrivateKey; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class WiFiInstaller extends Activity { private static final String TAG = "WifiInstaller"; private static final String NETWORK_NAME = "network_name"; private static final String INSTALL_STATE = "install_state"; public static final int INSTALL_SUCCESS = 2; public static final int INSTALL_FAIL = 1; public static final int INSTALL_FAIL_NO_WIFI = 0; WifiConfiguration mWifiConfiguration; WifiManager mWifiManager; boolean doNotInstall; @Override protected void onCreate(Bundle savedStates) { super.onCreate(savedStates); Bundle bundle = getIntent().getExtras(); String uriString = bundle.getString(CertInstallerMain.WIFI_CONFIG_FILE); String mimeType = bundle.getString(CertInstallerMain.WIFI_CONFIG); byte[] data = bundle.getByteArray(CertInstallerMain.WIFI_CONFIG_DATA); Log.d(TAG, "WiFi data for " + CertInstallerMain.WIFI_CONFIG + ": " + mimeType + " is " + (data != null ? data.length : "-")); mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); mWifiConfiguration = mWifiManager.buildWifiConfig(uriString, mimeType, data); if (mWifiConfiguration != null) { WifiEnterpriseConfig enterpriseConfig = mWifiConfiguration.enterpriseConfig; doNotInstall = (enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TTLS || enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS) && enterpriseConfig.getCaCertificate() == null; if (!doNotInstall && (enterpriseConfig.getClientCertificate() != null || enterpriseConfig.getCaCertificate() != null)) { if (!KeyStore.getInstance().isUnlocked()) { try { startActivity(new Intent(Credentials.UNLOCK_ACTION)); } catch (ActivityNotFoundException e) { Log.w(TAG, e); } } } } else { Log.w(TAG, "failed to build wifi configuration"); doNotInstall = true; } } @Override protected void onResume() { super.onResume(); createMainDialog(); } public static List splitDomain(String domain) { if (domain.endsWith(".")) { domain = domain.substring(0, domain.length() - 1); } String[] labels = domain.toLowerCase().split("\\."); LinkedList labelList = new LinkedList<>(); for (String label : labels) { labelList.addFirst(label); } return labelList; } public static boolean sameBaseDomain(List arg1, String domain) { if (domain == null) { return false; } List arg2 = splitDomain(domain); if (arg2.isEmpty()) { return false; } Iterator l1 = arg1.iterator(); Iterator l2 = arg2.iterator(); while(l1.hasNext() && l2.hasNext()) { if (!l1.next().equals(l2.next())) { return false; } } return true; } private void createMainDialog() { Resources res = getResources(); AlertDialog.Builder builder = new AlertDialog.Builder(this); View layout = getLayoutInflater().inflate(R.layout.wifi_main_dialog, null); builder.setView(layout); TextView text = (TextView) layout.findViewById(R.id.wifi_info); if (!doNotInstall) { text.setText(String.format(getResources().getString(R.string.wifi_installer_detail), mWifiConfiguration.providerFriendlyName)); builder.setTitle(mWifiConfiguration.providerFriendlyName); builder.setIcon(res.getDrawable(R.drawable.signal_wifi_4_bar_lock_black_24dp)); builder.setPositiveButton(R.string.wifi_install_label, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { List newDomain = splitDomain(mWifiConfiguration.FQDN); for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) { if (sameBaseDomain(newDomain, config.FQDN)) { mWifiManager.removeNetwork(config.networkId); break; } } boolean success; try { success = mWifiManager.addNetwork(mWifiConfiguration) != -1 && mWifiManager.saveConfiguration(); } catch (RuntimeException rte) { Log.w(TAG, "Caught exception while installing wifi config: " + rte, rte); success = false; } if (success) { Intent intent = new Intent(getApplicationContext(), CredentialsInstallDialog.class); intent.putExtra(NETWORK_NAME, mWifiConfiguration.providerFriendlyName); intent.putExtra(INSTALL_STATE, INSTALL_SUCCESS); startActivity(intent); } else { Intent intent = new Intent(getApplicationContext(), CredentialsInstallDialog.class); if (!mWifiManager.isWifiEnabled()) { intent.putExtra(INSTALL_STATE, INSTALL_FAIL_NO_WIFI); } else { intent.putExtra(INSTALL_STATE, INSTALL_FAIL); } startActivity(intent); } dialog.dismiss(); finish(); } }); builder.setNegativeButton(R.string.wifi_cancel_label, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); finish(); } }); } else { text.setText(getResources().getString(R.string.wifi_installer_download_error)); builder.setPositiveButton(R.string.done_label, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); finish(); } }); } builder.create().show(); } }