From 6862d2f6c6b99177de9f92b22a9d6da1253358e4 Mon Sep 17 00:00:00 2001 From: Glen Kuhne Date: Tue, 22 Nov 2016 16:25:08 -0800 Subject: [PATCH] Unhide WifiConfiguration proxy accessors Unhiding HttpProxy accessors in WifiConfiguration. This change occurs in parrallel with changes that restrict updating of WifiConfigurations with new or updated proxy info to uids holding permission OVERRIDE_WIFI_CONFIG, or holding DeviceOwner or ProfileOwner policies. Bug: 14669153 Test: None Change-Id: Id69525cfec152ea52697693f9a3bd6f86019c694 Merged-In: Id69525cfec152ea52697693f9a3bd6f86019c694 --- api/current.txt | 2 + api/system-current.txt | 2 + api/test-current.txt | 2 + .../android/net/wifi/WifiConfiguration.java | 43 +++++++++++++++++-- wifi/java/android/net/wifi/WifiManager.java | 4 ++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/api/current.txt b/api/current.txt index 964712a35462a..0c1cebf5c049a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -24528,7 +24528,9 @@ package android.net.wifi { public class WifiConfiguration implements android.os.Parcelable { ctor public WifiConfiguration(); method public int describeContents(); + method public android.net.ProxyInfo getHttpProxy(); method public boolean isPasspoint(); + method public void setHttpProxy(android.net.ProxyInfo); method public void writeToParcel(android.os.Parcel, int); field public java.lang.String BSSID; field public java.lang.String FQDN; diff --git a/api/system-current.txt b/api/system-current.txt index 49dc7c54a6da0..9e22e6df582ce 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -26865,9 +26865,11 @@ package android.net.wifi { public class WifiConfiguration implements android.os.Parcelable { ctor public WifiConfiguration(); method public int describeContents(); + method public android.net.ProxyInfo getHttpProxy(); method public boolean hasNoInternetAccess(); method public boolean isNoInternetAccessExpected(); method public boolean isPasspoint(); + method public void setHttpProxy(android.net.ProxyInfo); method public void writeToParcel(android.os.Parcel, int); field public java.lang.String BSSID; field public java.lang.String FQDN; diff --git a/api/test-current.txt b/api/test-current.txt index 2b0ca00d718c1..349d5d94365e3 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -24601,7 +24601,9 @@ package android.net.wifi { public class WifiConfiguration implements android.os.Parcelable { ctor public WifiConfiguration(); method public int describeContents(); + method public android.net.ProxyInfo getHttpProxy(); method public boolean isPasspoint(); + method public void setHttpProxy(android.net.ProxyInfo); method public void writeToParcel(android.os.Parcel, int); field public java.lang.String BSSID; field public java.lang.String FQDN; diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 958279badf755..3a4567112704e 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -22,6 +22,7 @@ import android.net.IpConfiguration; import android.net.IpConfiguration.ProxySettings; import android.net.ProxyInfo; import android.net.StaticIpConfiguration; +import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; @@ -1805,14 +1806,48 @@ public class WifiConfiguration implements Parcelable { mIpConfiguration.proxySettings = proxySettings; } - /** @hide */ + /** + * Returns the HTTP proxy used by this object. + * @return a {@link ProxyInfo httpProxy} representing the proxy specified by this + * WifiConfiguration, or {@code null} if no proxy is specified. + */ public ProxyInfo getHttpProxy() { - return mIpConfiguration.httpProxy; + if (mIpConfiguration.proxySettings == IpConfiguration.ProxySettings.NONE) { + return null; + } + return new ProxyInfo(mIpConfiguration.httpProxy); } - /** @hide */ + /** + * Set the {@link ProxyInfo} for this WifiConfiguration. + * @param httpProxy {@link ProxyInfo} representing the httpProxy to be used by this + * WifiConfiguration. Setting this {@code null} will explicitly set no proxy, + * removing any proxy that was previously set. + * @exception throw IllegalArgumentException for invalid httpProxy + */ public void setHttpProxy(ProxyInfo httpProxy) { - mIpConfiguration.httpProxy = httpProxy; + if (httpProxy == null) { + mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE); + mIpConfiguration.setHttpProxy(null); + return; + } + ProxyInfo httpProxyCopy; + ProxySettings proxySettingCopy; + if (!Uri.EMPTY.equals(httpProxy.getPacFileUrl())) { + proxySettingCopy = IpConfiguration.ProxySettings.PAC; + // Construct a new PAC URL Proxy + httpProxyCopy = new ProxyInfo(httpProxy.getPacFileUrl(), httpProxy.getPort()); + } else { + proxySettingCopy = IpConfiguration.ProxySettings.STATIC; + // Construct a new HTTP Proxy + httpProxyCopy = new ProxyInfo(httpProxy.getHost(), httpProxy.getPort(), + httpProxy.getExclusionListAsString()); + } + if (!httpProxyCopy.isValid()) { + throw new IllegalArgumentException("Invalid ProxyInfo: " + httpProxyCopy.toString()); + } + mIpConfiguration.setProxySettings(proxySettingCopy); + mIpConfiguration.setHttpProxy(httpProxyCopy); } /** @hide */ diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index ab6b3e3f43c85..3b6e76f766777 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -791,6 +791,8 @@ public class WifiManager { * * @param config the set of variables that describe the configuration, * contained in a {@link WifiConfiguration} object. + * If the {@link WifiConfiguration} has an Http Proxy set + * the calling app must be System, or be provisioned as the Profile or Device Owner. * @return the ID of the newly created network description. This is used in * other operations to specified the network to be acted upon. * Returns {@code -1} on failure. @@ -811,6 +813,8 @@ public class WifiManager { * be sparse, so that only the items that are being changed * are non-null. The {@code networkId} field * must be set to the ID of the existing network being updated. + * If the {@link WifiConfiguration} has an Http Proxy set + * the calling app must be System, or be provisioned as the Profile or Device Owner. * @return Returns the {@code networkId} of the supplied * {@code WifiConfiguration} on success. *