blob: b2a5b5612ca7f0402eea8cad93ba853c9c49e1f9 [file] [log] [blame]
Jan Nordqvist994932f2015-03-25 18:56:30 -07001package com.android.certinstaller;
2
3import android.app.Activity;
4import android.app.AlertDialog;
Jan Nordqvist8eca13b2015-04-15 15:22:50 -07005import android.content.ActivityNotFoundException;
Jan Nordqvist994932f2015-03-25 18:56:30 -07006import android.content.Context;
7import android.content.DialogInterface;
8import android.content.Intent;
9import android.content.res.Resources;
Peter Qiuffac6552016-12-12 13:50:01 -080010import android.net.Uri;
Jan Nordqvist994932f2015-03-25 18:56:30 -070011import android.net.wifi.WifiConfiguration;
12import android.net.wifi.WifiEnterpriseConfig;
13import android.net.wifi.WifiManager;
14import android.os.Bundle;
Jan Nordqvist8eca13b2015-04-15 15:22:50 -070015import android.security.Credentials;
16import android.security.KeyStore;
Jan Nordqvist994932f2015-03-25 18:56:30 -070017import android.util.Log;
18import android.view.View;
19import android.widget.Button;
20import android.widget.TextView;
Sanket Padawe909641b2015-08-05 14:06:23 -070021import android.widget.Toast;
22import android.os.AsyncTask;
Peter Qiuffac6552016-12-12 13:50:01 -080023import android.provider.DocumentsContract;
Jan Nordqvist994932f2015-03-25 18:56:30 -070024
25import java.security.PrivateKey;
26import java.security.interfaces.RSAPrivateKey;
27import java.util.Collection;
Jan Nordqvist580c5f52015-07-09 12:10:52 -070028import java.util.Iterator;
29import java.util.LinkedList;
30import java.util.List;
Jan Nordqvist994932f2015-03-25 18:56:30 -070031
32public class WiFiInstaller extends Activity {
33
Jan Nordqvist7c543b72015-04-17 12:12:31 -070034 private static final String TAG = "WifiInstaller";
Sanket Padawe122def32015-05-13 16:12:26 -070035 private static final String NETWORK_NAME = "network_name";
36 private static final String INSTALL_STATE = "install_state";
Sanket Padawe66177c32015-06-22 19:30:58 -070037 public static final int INSTALL_SUCCESS = 2;
38 public static final int INSTALL_FAIL = 1;
39 public static final int INSTALL_FAIL_NO_WIFI = 0;
Sanket Padawe122def32015-05-13 16:12:26 -070040 WifiConfiguration mWifiConfiguration;
41 WifiManager mWifiManager;
42 boolean doNotInstall;
Jan Nordqvist8eca13b2015-04-15 15:22:50 -070043
Jan Nordqvist994932f2015-03-25 18:56:30 -070044 @Override
45 protected void onCreate(Bundle savedStates) {
46 super.onCreate(savedStates);
47
48 Bundle bundle = getIntent().getExtras();
49 String uriString = bundle.getString(CertInstallerMain.WIFI_CONFIG_FILE);
50 String mimeType = bundle.getString(CertInstallerMain.WIFI_CONFIG);
51 byte[] data = bundle.getByteArray(CertInstallerMain.WIFI_CONFIG_DATA);
52
Jan Nordqvist8eca13b2015-04-15 15:22:50 -070053 Log.d(TAG, "WiFi data for " + CertInstallerMain.WIFI_CONFIG + ": " +
Jan Nordqvist994932f2015-03-25 18:56:30 -070054 mimeType + " is " + (data != null ? data.length : "-"));
55
Sanket Padawe122def32015-05-13 16:12:26 -070056 mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
57 mWifiConfiguration = mWifiManager.buildWifiConfig(uriString, mimeType, data);
Peter Qiuffac6552016-12-12 13:50:01 -080058 dropFile(Uri.parse(uriString), getApplicationContext());
Jan Nordqvist8eca13b2015-04-15 15:22:50 -070059
Sanket Padawe122def32015-05-13 16:12:26 -070060 if (mWifiConfiguration != null) {
61 WifiEnterpriseConfig enterpriseConfig = mWifiConfiguration.enterpriseConfig;
62 doNotInstall = (enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TTLS
63 || enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS)
64 && enterpriseConfig.getCaCertificate() == null;
65 if (!doNotInstall && (enterpriseConfig.getClientCertificate() != null
66 || enterpriseConfig.getCaCertificate() != null)) {
67 if (!KeyStore.getInstance().isUnlocked()) {
68 try {
69 startActivity(new Intent(Credentials.UNLOCK_ACTION));
70 } catch (ActivityNotFoundException e) {
71 Log.w(TAG, e);
72 }
Jan Nordqvist8eca13b2015-04-15 15:22:50 -070073 }
74 }
Sanket Padawe122def32015-05-13 16:12:26 -070075 } else {
Jan Nordqvistfb90c6f2015-07-31 15:33:29 -070076 Log.w(TAG, "failed to build wifi configuration");
Sanket Padawe122def32015-05-13 16:12:26 -070077 doNotInstall = true;
Jan Nordqvist994932f2015-03-25 18:56:30 -070078 }
79 }
80
Sanket Padawe122def32015-05-13 16:12:26 -070081 @Override
82 protected void onResume() {
83 super.onResume();
84 createMainDialog();
Jan Nordqvist994932f2015-03-25 18:56:30 -070085 }
86
Jan Nordqvist580c5f52015-07-09 12:10:52 -070087 public static List<String> splitDomain(String domain) {
88 if (domain.endsWith(".")) {
89 domain = domain.substring(0, domain.length() - 1);
90 }
91
92 String[] labels = domain.toLowerCase().split("\\.");
93 LinkedList<String> labelList = new LinkedList<>();
94 for (String label : labels) {
95 labelList.addFirst(label);
96 }
97
98 return labelList;
99 }
100
101 public static boolean sameBaseDomain(List<String> arg1, String domain) {
102 if (domain == null) {
103 return false;
104 }
105
106 List<String> arg2 = splitDomain(domain);
107 if (arg2.isEmpty()) {
108 return false;
109 }
110 Iterator<String> l1 = arg1.iterator();
111 Iterator<String> l2 = arg2.iterator();
112
113 while(l1.hasNext() && l2.hasNext()) {
114 if (!l1.next().equals(l2.next())) {
115 return false;
116 }
117 }
118 return true;
119 }
120
Sanket Padawe122def32015-05-13 16:12:26 -0700121 private void createMainDialog() {
Jan Nordqvist994932f2015-03-25 18:56:30 -0700122 Resources res = getResources();
123 AlertDialog.Builder builder = new AlertDialog.Builder(this);
124 View layout = getLayoutInflater().inflate(R.layout.wifi_main_dialog, null);
125 builder.setView(layout);
126
127 TextView text = (TextView) layout.findViewById(R.id.wifi_info);
Sanket Padawe122def32015-05-13 16:12:26 -0700128 if (!doNotInstall) {
129 text.setText(String.format(getResources().getString(R.string.wifi_installer_detail),
130 mWifiConfiguration.providerFriendlyName));
Jan Nordqvist994932f2015-03-25 18:56:30 -0700131
Sanket Padawe122def32015-05-13 16:12:26 -0700132 builder.setTitle(mWifiConfiguration.providerFriendlyName);
133 builder.setIcon(res.getDrawable(R.drawable.signal_wifi_4_bar_lock_black_24dp));
Jan Nordqvist994932f2015-03-25 18:56:30 -0700134
Sanket Padawe122def32015-05-13 16:12:26 -0700135 builder.setPositiveButton(R.string.wifi_install_label,
136 new DialogInterface.OnClickListener() {
137 @Override
138 public void onClick(DialogInterface dialog, int which) {
Sanket Padawe909641b2015-08-05 14:06:23 -0700139 final boolean wifiEnabled = mWifiManager.isWifiEnabled();
140 if (wifiEnabled) {
141 Toast.makeText(WiFiInstaller.this, getString(R.string.wifi_installing_label),
142 Toast.LENGTH_LONG).show();
143 }
144 AsyncTask.execute(new Runnable() {
145 @Override
146 public void run() {
147 boolean success = false;
148 if (wifiEnabled) {
149 List<String> newDomain = splitDomain(mWifiConfiguration.FQDN);
150 for (WifiConfiguration config :
151 mWifiManager.getConfiguredNetworks()) {
152 if (sameBaseDomain(newDomain, config.FQDN)) {
153 mWifiManager.removeNetwork(config.networkId);
154 break;
155 }
156 }
157 try {
158 success = mWifiManager.addNetwork(mWifiConfiguration) != -1
159 && mWifiManager.saveConfiguration();
160 }
161 catch (RuntimeException rte) {
162 Log.w(TAG, "Caught exception while installing wifi config: " +
163 rte, rte);
164 success = false;
165 }
166 }
167 if (success) {
168 Intent intent = new Intent(getApplicationContext(),
169 CredentialsInstallDialog.class);
170 intent.putExtra(NETWORK_NAME,
171 mWifiConfiguration.providerFriendlyName);
172 intent.putExtra(INSTALL_STATE, INSTALL_SUCCESS);
173 startActivity(intent);
174 } else {
175 Intent intent = new Intent(getApplicationContext(),
176 CredentialsInstallDialog.class);
177 if (!wifiEnabled) {
178 intent.putExtra(INSTALL_STATE, INSTALL_FAIL_NO_WIFI);
179 } else {
180 intent.putExtra(INSTALL_STATE, INSTALL_FAIL);
181 }
182 startActivity(intent);
183 }
184 finish();
Jan Nordqvist580c5f52015-07-09 12:10:52 -0700185 }
Sanket Padawe909641b2015-08-05 14:06:23 -0700186 });
Sanket Padawe122def32015-05-13 16:12:26 -0700187 dialog.dismiss();
Sanket Padawe122def32015-05-13 16:12:26 -0700188 }
189 });
Jan Nordqvist994932f2015-03-25 18:56:30 -0700190
Sanket Padawe122def32015-05-13 16:12:26 -0700191 builder.setNegativeButton(R.string.wifi_cancel_label, new
192 DialogInterface.OnClickListener() {
193 @Override
194 public void onClick(DialogInterface dialog, int which) {
195 dialog.dismiss();
196 finish();
197 }
Sanket Padawe909641b2015-08-05 14:06:23 -0700198 });
Sanket Padawe122def32015-05-13 16:12:26 -0700199 } else {
200 text.setText(getResources().getString(R.string.wifi_installer_download_error));
201 builder.setPositiveButton(R.string.done_label, new DialogInterface.OnClickListener() {
202 @Override
203 public void onClick(DialogInterface dialog, int which) {
204 dialog.dismiss();
205 finish();
206 }
207 });
Jan Nordqvist994932f2015-03-25 18:56:30 -0700208 }
Sanket Padawe122def32015-05-13 16:12:26 -0700209 builder.create().show();
Jan Nordqvist994932f2015-03-25 18:56:30 -0700210 }
Peter Qiuffac6552016-12-12 13:50:01 -0800211
212 /**
213 * Delete the file specified by the given URI.
214 *
215 * @param uri The URI of the file
216 * @param context The context of the current application
217 */
218 private static void dropFile(Uri uri, Context context) {
219 if (DocumentsContract.isDocumentUri(context, uri)) {
220 DocumentsContract.deleteDocument(context.getContentResolver(), uri);
221 } else {
222 context.getContentResolver().delete(uri, null, null);
223 }
224 }
Jan Nordqvist994932f2015-03-25 18:56:30 -0700225}