added launcher icon, fixed crash due to AppContext = null (damn Android GC), made...
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / fragments / WifiSettings.java
index d57671a83f759cb3caceb454c4df1a612a35b84c..c172ed5f241f0e10da180a002c94031218eef751 100644 (file)
@@ -8,13 +8,20 @@ import android.net.wifi.WifiManager;
 import android.os.Build;
 import android.os.Bundle;
 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 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 +44,150 @@ 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 username;
+        String password;
+
+        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 certificate) {
+            this.caCertStr = certificate;
+            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 WifiNetworkSettingsSet[] wifiPresets;
+    private WifiManager wifimanager;
+
+    private void loadDhbwWifiDefinitions() {
+        int numOfNetworks = 2;
+        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("-----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));
+    }
+
+
+    @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();
+                enterpriseConfig.setIdentity(settings.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);
+    }
+
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -49,7 +199,7 @@ public class WifiSettings extends CampusAppFragment {
         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 +208,14 @@ 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[0];
+                    settings.setAuthData(username, password);
+                    connectToWiFi(settings);
                 }
-                else if(username.length() > 0 && password.length() > 0)
-                    connectToDHWiFi(username, password);
 
                 connectBtn.setEnabled(true);
             }
@@ -72,26 +224,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);
-    }
-
-
-
 }