added multiple network configurations
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / fragments / WifiSettings.java
index d57671a83f759cb3caceb454c4df1a612a35b84c..fceca54869de7be2dcd55218aa419dd62426ead7 100644 (file)
@@ -2,19 +2,29 @@ package de.dhbwloe.campusapp.fragments;
 
 
 import android.annotation.TargetApi;
+import android.app.ActionBar;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiEnterpriseConfig;
 import android.net.wifi.WifiManager;
 import android.os.Build;
 import android.os.Bundle;
+import android.support.design.widget.TabLayout;
 import android.support.v4.app.Fragment;
+import android.util.Base64;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.EditText;
+import android.widget.TextView;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.StringReader;
 import java.lang.reflect.Field;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
 
 import de.dhbwloe.campusapp.CampusAppFragment;
 import de.dhbwloe.campusapp.R;
@@ -37,7 +47,268 @@ public class WifiSettings extends CampusAppFragment {
         };
     }
 
+    private enum WifiNetworkAuthenticationTypes {
+        WIFI_AUTHTYPE_NONE,
+        WIFI_AUTHTYPE_WEP,
+        WIFI_AUTHTYPE_WPA,
+        WIFI_AUTHTYPE_WPA_ENTERPRISE,
+    };
+    private class WifiNetworkSettingsSet {
+        String name;
+        String ssid;
+        WifiNetworkAuthenticationTypes authType;
+        int[] authAlgorithms;
+        int   eapMethod;
+        int   phase2Method;
+
+        String caCertStr;
+        String caName;
+
+        String usernameSuffix;
+        String username;
+        String password;
+
+        TabLayout.Tab tab;
+
+        public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) {
+            this.name = name;
+            this.ssid = ssid;
+            this.authType = authType;
+        }
+
+        public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) {
+            this.authAlgorithms = authAlgorithms;
+            this.eapMethod = eapMethod;
+            this.phase2Method = phase2Method;
+            this.username = username;
+            return this;
+        }
+
+        public WifiNetworkSettingsSet setPassword(String password) {
+            this.password = password;
+            return this;
+        }
+
+        public WifiNetworkSettingsSet setCACertificate(String caname, String certificate) {
+            this.caName = caname;
+            this.caCertStr = certificate;
+            return this;
+        }
+
+        public WifiNetworkSettingsSet setUserSuffix(String suffix) {
+            this.usernameSuffix = suffix;
+            return this;
+        }
+
+        public void setAuthData(String username, String password) {
+            this.username = username;
+            this.password = password;
+        }
+
+        public void setAuthData(String password) {
+            this.password = password;
+        }
+
+        public X509Certificate generateCertificate() throws CertificateException, IOException {
+            byte [] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT);
+            return (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded));
+        }
+    }
+
     private View view;
+    private TabLayout tablayout;
+    private WifiNetworkSettingsSet[] wifiPresets;
+    private WifiManager wifimanager;
+    private int selectedNetworkIndex = 0;
+
+    private void loadDhbwWifiDefinitions() {
+        int numOfNetworks = 3;
+        int i = 0;
+        wifiPresets = new WifiNetworkSettingsSet[numOfNetworks];
+
+        wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
+                setWpaEnterprise(
+                        new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
+                        WifiEnterpriseConfig.Eap.PEAP,
+                        WifiEnterpriseConfig.Phase2.MSCHAPV2,
+                        null
+                ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
+                "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
+                "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
+                "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
+                "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
+                "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
+                "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
+                "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
+                "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
+                "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
+                "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
+                "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
+                "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
+                "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
+                "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
+                "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
+                "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
+                "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
+                "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
+                "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
+                "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
+                "-----END CERTIFICATE-----");
+
+        wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE));
+
+        wifiPresets[i++] = (new WifiNetworkSettingsSet("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)).
+                setWpaEnterprise(
+                        new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X},
+                        WifiEnterpriseConfig.Eap.PEAP,
+                        WifiEnterpriseConfig.Phase2.MSCHAPV2,
+                        null
+                ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" +
+                "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" +
+                "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" +
+                "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" +
+                "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" +
+                "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" +
+                "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" +
+                "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" +
+                "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" +
+                "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" +
+                "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" +
+                "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" +
+                "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" +
+                "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" +
+                "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" +
+                "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" +
+                "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" +
+                "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" +
+                "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" +
+                "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" +
+                "Cm26OWMohpLzGITY+9HPBVZkVw==\n" +
+                "-----END CERTIFICATE-----").
+                setUserSuffix("@dhbw-loerrach.de");
+    }
+
+
+    @TargetApi(18)
+    private void connectToWiFi(WifiNetworkSettingsSet settings) {
+        WifiConfiguration wifiConfig = new WifiConfiguration();
+        wifiConfig.SSID = settings.ssid;
+        for(int i = 0; i < settings.authAlgorithms.length; i++)
+            wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]);
+
+        switch(settings.authType) {
+            case WIFI_AUTHTYPE_NONE:
+                break;
+            case WIFI_AUTHTYPE_WEP:
+                // not supported by our app
+                break;
+            case WIFI_AUTHTYPE_WPA:
+
+                break;
+            case WIFI_AUTHTYPE_WPA_ENTERPRISE:
+                WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+                String username = settings.username;
+                if(settings.usernameSuffix != null)
+                    username += settings.usernameSuffix;
+                enterpriseConfig.setIdentity(username);
+                enterpriseConfig.setPassword(settings.password);
+                enterpriseConfig.setEapMethod(settings.eapMethod);
+                enterpriseConfig.setPhase2Method(settings.phase2Method);
+                try {
+                    enterpriseConfig.setCaCertificate(settings.generateCertificate());
+                } catch (CertificateException e) {
+                } catch (IOException e) {
+                }
+                wifiConfig.enterpriseConfig = enterpriseConfig;
+                break;
+        }
+        int networkId = wifimanager.addNetwork(wifiConfig);
+        wifimanager.enableNetwork(networkId, true);
+    }
+
+
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        loadDhbwWifiDefinitions();
+        wifimanager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
+    }
+
+    private void updateSelectedNetworkInformation() {
+        if(view == null)
+            return;
+        if(selectedNetworkIndex >= wifiPresets.length)
+            return;
+
+        WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
+        TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo);
+        TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo);
+        TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo);
+        TextView phase2InfoView = (TextView) view.findViewById(R.id.phase2Info);
+        TextView cacertInfoView = (TextView) view.findViewById(R.id.cacertInfo);
+
+        ssidInfoView.setText(settings.ssid);
+        switch(settings.authType) {
+            case WIFI_AUTHTYPE_NONE:
+                securityInfoView.setText(R.string.wifiopts_security_open);
+                break;
+            case WIFI_AUTHTYPE_WEP:
+                securityInfoView.setText(R.string.wifiopts_security_wep);
+                // unsupported!
+                break;
+            case WIFI_AUTHTYPE_WPA:
+                securityInfoView.setText(R.string.wifiopts_security_wpa);
+                break;
+            case WIFI_AUTHTYPE_WPA_ENTERPRISE:
+                securityInfoView.setText(R.string.wifiopts_security_wpa_enterprise);
+                break;
+        }
+
+        if(settings.authType == WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) {
+            int eapStringId = 0;
+            switch(settings.eapMethod) {
+                case WifiEnterpriseConfig.Eap.PEAP:
+                    eapStringId = R.string.wifiopts_eap_peap;
+                    break;
+                case WifiEnterpriseConfig.Eap.TLS:
+                    eapStringId = R.string.wifiopts_eap_tls;
+                    break;
+                case WifiEnterpriseConfig.Eap.TTLS:
+                    eapStringId = R.string.wifiopts_eap_ttls;
+                    break;
+                case WifiEnterpriseConfig.Eap.PWD:
+                    eapStringId = R.string.wifiopts_eap_pwd;
+                    break;
+            }
+            if(eapStringId > 0)
+                eapInfoView.setText(eapStringId);
+            else
+                eapInfoView.setText("");
+
+            int phase2StringId = 0;
+            switch(settings.phase2Method) {
+                case WifiEnterpriseConfig.Phase2.MSCHAPV2:
+                    phase2StringId = R.string.wifiopts_phase2_mschapv2;
+                    break;
+                case WifiEnterpriseConfig.Phase2.GTC:
+                    phase2StringId = R.string.wifiopts_phase2_gtc;
+                    break;
+            }
+            if(phase2StringId > 0)
+                phase2InfoView.setText(phase2StringId);
+            else
+                phase2InfoView.setText("");
+
+            cacertInfoView.setText(settings.caName);
+        } else {
+            eapInfoView.setText("-");
+            phase2InfoView.setText("-");
+            cacertInfoView.setText("-");
+        }
+
+    }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -45,11 +316,36 @@ public class WifiSettings extends CampusAppFragment {
         view = inflater.inflate(R.layout.fragment_wifi_settings, container, false);
         AppContext.setTitle("DHBW WLAN Settings");
 
+        updateSelectedNetworkInformation();
+
+        tablayout = (TabLayout) view.findViewById(R.id.tabs);
+        tablayout.removeAllTabs();
+        for(int i = 0; i < wifiPresets.length; i++) {
+            TabLayout.Tab tab = tablayout.newTab();
+            tab.setText(wifiPresets[i].name);
+            tablayout.addTab(tab);
+        }
+        tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                selectedNetworkIndex = tab.getPosition();
+                updateSelectedNetworkInformation();
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+            }
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+            }
+        });
+
         Button connectBtn = (Button) view.findViewById(R.id.wifiConnectBtn);
         connectBtn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                Button connectBtn = (Button)v;
+                Button connectBtn = (Button) v;
                 connectBtn.setEnabled(false);
 
                 EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername);
@@ -58,12 +354,16 @@ public class WifiSettings extends CampusAppFragment {
                 String username = usernameEdt.getText().toString();
                 String password = passwordEdt.getText().toString();
 
-                if(Build.VERSION.SDK_INT < 18) {
+                if (Build.VERSION.SDK_INT < 18) {
                     // connectToDHWiFi not supported!
                     // do something else?
+                } else if (username.length() > 0 && password.length() > 0) {
+                    WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex];
+                    if(settings != null) {
+                        settings.setAuthData(username, password);
+                        connectToWiFi(settings);
+                    }
                 }
-                else if(username.length() > 0 && password.length() > 0)
-                    connectToDHWiFi(username, password);
 
                 connectBtn.setEnabled(true);
             }
@@ -72,26 +372,4 @@ public class WifiSettings extends CampusAppFragment {
         return view;
     }
 
-    @TargetApi(18)
-    private void connectToDHWiFi(String username, String password) {
-        WifiConfiguration wifiConfig = new WifiConfiguration();
-        wifiConfig.SSID = "dhbw-secure";
-        wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
-        wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
-
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setIdentity(username);
-        enterpriseConfig.setPassword(password);
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PEAP);
-        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2);
-        wifiConfig.enterpriseConfig = enterpriseConfig;
-
-        WifiManager wfm = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE);
-
-        int networkId = wfm.addNetwork(wifiConfig);
-        wfm.enableNetwork(networkId, true);
-    }
-
-
-
 }