fceca54869de7be2dcd55218aa419dd62426ead7
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / fragments / WifiSettings.java
1 package de.dhbwloe.campusapp.fragments;
2
3
4 import android.annotation.TargetApi;
5 import android.app.ActionBar;
6 import android.net.wifi.WifiConfiguration;
7 import android.net.wifi.WifiEnterpriseConfig;
8 import android.net.wifi.WifiManager;
9 import android.os.Build;
10 import android.os.Bundle;
11 import android.support.design.widget.TabLayout;
12 import android.support.v4.app.Fragment;
13 import android.util.Base64;
14 import android.view.LayoutInflater;
15 import android.view.View;
16 import android.view.ViewGroup;
17 import android.widget.Button;
18 import android.widget.EditText;
19 import android.widget.TextView;
20
21 import java.io.ByteArrayInputStream;
22 import java.io.IOException;
23 import java.io.StringReader;
24 import java.lang.reflect.Field;
25 import java.security.cert.CertificateException;
26 import java.security.cert.CertificateFactory;
27 import java.security.cert.X509Certificate;
28
29 import de.dhbwloe.campusapp.CampusAppFragment;
30 import de.dhbwloe.campusapp.R;
31 import de.dhbwloe.campusapp.search.SearchIndices;
32
33 /**
34  * A simple {@link Fragment} subclass.
35  */
36 public class WifiSettings extends CampusAppFragment {
37     /* implement this for search results ;) */
38     public static SearchIndices[] GetSearchIndices() {
39         return new SearchIndices[] {
40                 new SearchIndices("WifiSettings", true) {{
41                     setUpdateTime(1);
42                     setTarget("#WifiSettings");
43                     setTitle("Wifi Settings");
44                     setDescription("WLAN Konfiguration für dieses Gerät");
45                     addKeyWord("wlan, secure, dhbw-secure, wifi, w-lan, wireless, internet, netzwerk");
46                 }},
47         };
48     }
49
50     private enum WifiNetworkAuthenticationTypes {
51         WIFI_AUTHTYPE_NONE,
52         WIFI_AUTHTYPE_WEP,
53         WIFI_AUTHTYPE_WPA,
54         WIFI_AUTHTYPE_WPA_ENTERPRISE,
55     };
56     private class WifiNetworkSettingsSet {
57         String name;
58         String ssid;
59         WifiNetworkAuthenticationTypes authType;
60         int[] authAlgorithms;
61         int   eapMethod;
62         int   phase2Method;
63
64         String caCertStr;
65         String caName;
66
67         String usernameSuffix;
68         String username;
69         String password;
70
71         TabLayout.Tab tab;
72
73         public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
74             this.name = name;
75             this.ssid = ssid;
76             this.authType = authType;
77         }
78
79         public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) {
80             this.authAlgorithms = authAlgorithms;
81             this.eapMethod = eapMethod;
82             this.phase2Method = phase2Method;
83             this.username = username;
84             return this;
85         }
86
87         public WifiNetworkSettingsSet setPassword(String password) {
88             this.password = password;
89             return this;
90         }
91
92         public WifiNetworkSettingsSet setCACertificate(String caname, String certificate) {
93             this.caName = caname;
94             this.caCertStr = certificate;
95             return this;
96         }
97
98         public WifiNetworkSettingsSet setUserSuffix(String suffix) {
99             this.usernameSuffix = suffix;
100             return this;
101         }
102
103         public void setAuthData(String username, String password) {
104             this.username = username;
105             this.password = password;
106         }
107
108         public void setAuthData(String password) {
109             this.password = password;
110         }
111
112         public X509Certificate generateCertificate() throws CertificateException, IOException {
113             byte [] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT);
114             return (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded));
115         }
116     }
117
118     private View view;
119     private TabLayout tablayout;
120     private WifiNetworkSettingsSet[] wifiPresets;
121     private WifiManager wifimanager;
122     private int selectedNetworkIndex = 0;
123
124     private void loadDhbwWifiDefinitions() {
125         int numOfNetworks = 3;
126         int i = 0;
127         wifiPresets = new WifiNetworkSettingsSet[numOfNetworks];
128
129         wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
130                 setWpaEnterprise(
131                         new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
132                         WifiEnterpriseConfig.Eap.PEAP,
133                         WifiEnterpriseConfig.Phase2.MSCHAPV2,
134                         null
135                 ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
136                 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
137                 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
138                 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
139                 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
140                 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
141                 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
142                 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
143                 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
144                 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
145                 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
146                 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
147                 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
148                 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
149                 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
150                 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
151                 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
152                 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
153                 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
154                 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
155                 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
156                 "-----END CERTIFICATE-----");
157
158         wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE));
159
160         wifiPresets[i++] = (new WifiNetworkSettingsSet("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
161                 setWpaEnterprise(
162                         new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
163                         WifiEnterpriseConfig.Eap.PEAP,
164                         WifiEnterpriseConfig.Phase2.MSCHAPV2,
165                         null
166                 ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
167                 "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
168                 "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
169                 "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
170                 "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
171                 "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
172                 "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
173                 "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
174                 "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
175                 "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
176                 "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
177                 "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
178                 "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
179                 "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
180                 "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
181                 "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
182                 "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
183                 "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
184                 "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
185                 "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
186                 "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
187                 "-----END CERTIFICATE-----").
188                 setUserSuffix("@dhbw-loerrach.de");
189     }
190
191
192     @TargetApi(18)
193     private void connectToWiFi(WifiNetworkSettingsSet settings) {
194         WifiConfiguration wifiConfig = new WifiConfiguration();
195         wifiConfig.SSID = settings.ssid;
196         for(int i = 0; i < settings.authAlgorithms.length; i++)
197             wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
198
199         switch(settings.authType) {
200             case WIFI_AUTHTYPE_NONE:
201                 break;
202             case WIFI_AUTHTYPE_WEP:
203                 // not supported by our app
204                 break;
205             case WIFI_AUTHTYPE_WPA:
206
207                 break;
208             case WIFI_AUTHTYPE_WPA_ENTERPRISE:
209                 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
210                 String username = settings.username;
211                 if(settings.usernameSuffix != null)
212                     username += settings.usernameSuffix;
213                 enterpriseConfig.setIdentity(username);
214                 enterpriseConfig.setPassword(settings.password);
215                 enterpriseConfig.setEapMethod(settings.eapMethod);
216                 enterpriseConfig.setPhase2Method(settings.phase2Method);
217                 try {
218                     enterpriseConfig.setCaCertificate(settings.generateCertificate());
219                 } catch (CertificateException e) {
220                 } catch (IOException e) {
221                 }
222                 wifiConfig.enterpriseConfig = enterpriseConfig;
223                 break;
224         }
225         int networkId = wifimanager.addNetwork(wifiConfig);
226         wifimanager.enableNetwork(networkId, true);
227     }
228
229
230
231
232     @Override
233     public void onCreate(Bundle savedInstanceState) {
234         super.onCreate(savedInstanceState);
235         loadDhbwWifiDefinitions();
236         wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
237     }
238
239     private void updateSelectedNetworkInformation() {
240         if(view == null)
241             return;
242         if(selectedNetworkIndex >= wifiPresets.length)
243             return;
244
245         WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
246         TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo);
247         TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo);
248         TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo);
249         TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info);
250         TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo);
251
252         ssidInfoView.setText(settings.ssid);
253         switch(settings.authType) {
254             case WIFI_AUTHTYPE_NONE:
255                 securityInfoView.setText(R.string.wifiopts_security_open);
256                 break;
257             case WIFI_AUTHTYPE_WEP:
258                 securityInfoView.setText(R.string.wifiopts_security_wep);
259                 // unsupported!
260                 break;
261             case WIFI_AUTHTYPE_WPA:
262                 securityInfoView.setText(R.string.wifiopts_security_wpa);
263                 break;
264             case WIFI_AUTHTYPE_WPA_ENTERPRISE:
265                 securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise);
266                 break;
267         }
268
269         if(settings.authType == WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) {
270             int eapStringId = 0;
271             switch(settings.eapMethod) {
272                 case WifiEnterpriseConfig.Eap.PEAP:
273                     eapStringId = R.string.wifiopts_eap_peap;
274                     break;
275                 case WifiEnterpriseConfig.Eap.TLS:
276                     eapStringId = R.string.wifiopts_eap_tls;
277                     break;
278                 case WifiEnterpriseConfig.Eap.TTLS:
279                     eapStringId = R.string.wifiopts_eap_ttls;
280                     break;
281                 case WifiEnterpriseConfig.Eap.PWD:
282                     eapStringId = R.string.wifiopts_eap_pwd;
283                     break;
284             }
285             if(eapStringId > 0)
286                 eapInfoView.setText(eapStringId);
287             else
288                 eapInfoView.setText("");
289
290             int phase2StringId = 0;
291             switch(settings.phase2Method) {
292                 case WifiEnterpriseConfig.Phase2.MSCHAPV2:
293                     phase2StringId = R.string.wifiopts_phase2_mschapv2;
294                     break;
295                 case WifiEnterpriseConfig.Phase2.GTC:
296                     phase2StringId = R.string.wifiopts_phase2_gtc;
297                     break;
298             }
299             if(phase2StringId > 0)
300                 phase2InfoView.setText(phase2StringId);
301             else
302                 phase2InfoView.setText("");
303
304             cacertInfoView.setText(settings.caName);
305         } else {
306             eapInfoView.setText("-");
307             phase2InfoView.setText("-");
308             cacertInfoView.setText("-");
309         }
310
311     }
312
313     @Override
314     public View onCreateView(LayoutInflater inflater, ViewGroup container,
315                              Bundle savedInstanceState) {
316         view = inflater.inflate(R.layout.fragment_wifi_settings, container, false);
317         AppContext.setTitle("DHBW WLAN Settings");
318
319         updateSelectedNetworkInformation();
320
321         tablayout = (TabLayout) view.findViewById(R.id.tabs);
322         tablayout.removeAllTabs();
323         for(int i = 0; i < wifiPresets.length; i++) {
324             TabLayout.Tab tab = tablayout.newTab();
325             tab.setText(wifiPresets[i].name);
326             tablayout.addTab(tab);
327         }
328         tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
329             @Override
330             public void onTabSelected(TabLayout.Tab tab) {
331                 selectedNetworkIndex = tab.getPosition();
332                 updateSelectedNetworkInformation();
333             }
334
335             @Override
336             public void onTabUnselected(TabLayout.Tab tab) {
337             }
338
339             @Override
340             public void onTabReselected(TabLayout.Tab tab) {
341             }
342         });
343
344         Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
345         connectBtn.setOnClickListener(new View.OnClickListener() {
346             @Override
347             public void onClick(View v) {
348                 Button connectBtn = (Button) v;
349                 connectBtn.setEnabled(false);
350
351                 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
352                 EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword);
353
354                 String username = usernameEdt.getText().toString();
355                 String password = passwordEdt.getText().toString();
356
357                 if (Build.VERSION.SDK_INT < 18) {
358                     // connectToDHWiFi not supported!
359                     // do something else?
360                 } else if (username.length() > 0 && password.length() > 0) {
361                     WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
362                     if(settings != null) {
363                         settings.setAuthData(username, password);
364                         connectToWiFi(settings);
365                     }
366                 }
367
368                 connectBtn.setEnabled(true);
369             }
370         });
371
372         return view;
373     }
374
375 }