• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.managedprovisioning.task.wifi;
18 
19 import android.net.IpConfiguration.ProxySettings;
20 import android.net.ProxyInfo;
21 import android.net.wifi.WifiConfiguration;
22 import android.text.TextUtils;
23 
24 import com.android.internal.annotations.VisibleForTesting;
25 import com.android.managedprovisioning.model.WifiInfo;
26 
27 /**
28  * Utility class for configuring a new {@link WifiConfiguration} object from the provisioning
29  * parameters represented via {@link WifiInfo}.
30  */
31 public class WifiConfigurationProvider {
32 
33     @VisibleForTesting
34     static final String WPA = "WPA";
35     @VisibleForTesting
36     static final String WEP = "WEP";
37     @VisibleForTesting
38     static final String NONE = "NONE";
39 
40     /**
41      * Create a {@link WifiConfiguration} object from the internal representation given via
42      * {@link WifiInfo}.
43      */
generateWifiConfiguration(WifiInfo wifiInfo)44     public WifiConfiguration generateWifiConfiguration(WifiInfo wifiInfo) {
45         WifiConfiguration wifiConf = new WifiConfiguration();
46         wifiConf.SSID = wifiInfo.ssid;
47         wifiConf.status = WifiConfiguration.Status.ENABLED;
48         wifiConf.hiddenSSID = wifiInfo.hidden;
49         wifiConf.userApproved = WifiConfiguration.USER_APPROVED;
50         String securityType = wifiInfo.securityType != null ? wifiInfo.securityType : NONE;
51         switch (securityType) {
52             case WPA:
53                 updateForWPAConfiguration(wifiConf, wifiInfo.password);
54                 break;
55             case WEP:
56                 updateForWEPConfiguration(wifiConf, wifiInfo.password);
57                 break;
58             default: // NONE
59                 wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
60                 wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
61                 break;
62         }
63 
64         updateForProxy(
65                 wifiConf,
66                 wifiInfo.proxyHost,
67                 wifiInfo.proxyPort,
68                 wifiInfo.proxyBypassHosts,
69                 wifiInfo.pacUrl);
70         return wifiConf;
71     }
72 
updateForWPAConfiguration(WifiConfiguration wifiConf, String wifiPassword)73     private void updateForWPAConfiguration(WifiConfiguration wifiConf, String wifiPassword) {
74         wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
75         wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
76         wifiConf.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
77         wifiConf.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
78         wifiConf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
79         wifiConf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
80         wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
81         wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
82         if (!TextUtils.isEmpty(wifiPassword)) {
83             wifiConf.preSharedKey = "\"" + wifiPassword + "\"";
84         }
85     }
86 
updateForWEPConfiguration(WifiConfiguration wifiConf, String password)87     private void updateForWEPConfiguration(WifiConfiguration wifiConf, String password) {
88         wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
89         wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
90         wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
91         wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
92         wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
93         wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
94         wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
95         int length = password.length();
96         if ((length == 10 || length == 26 || length == 58) && password.matches("[0-9A-Fa-f]*")) {
97             wifiConf.wepKeys[0] = password;
98         } else {
99             wifiConf.wepKeys[0] = '"' + password + '"';
100         }
101         wifiConf.wepTxKeyIndex = 0;
102     }
103 
updateForProxy(WifiConfiguration wifiConf, String proxyHost, int proxyPort, String proxyBypassHosts, String pacUrl)104     private void updateForProxy(WifiConfiguration wifiConf, String proxyHost, int proxyPort,
105             String proxyBypassHosts, String pacUrl) {
106         if (TextUtils.isEmpty(proxyHost) && TextUtils.isEmpty(pacUrl)) {
107             return;
108         }
109         if (!TextUtils.isEmpty(proxyHost)) {
110             ProxyInfo proxy = new ProxyInfo(proxyHost, proxyPort, proxyBypassHosts);
111             wifiConf.setProxy(ProxySettings.STATIC, proxy);
112         } else {
113             ProxyInfo proxy = new ProxyInfo(pacUrl);
114             wifiConf.setProxy(ProxySettings.PAC, proxy);
115         }
116     }
117 }
118