summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java64
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java54
2 files changed, 91 insertions, 27 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index d5ffa4fa13b8..bffbce15ee51 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -88,6 +88,7 @@ import android.telephony.data.ApnSetting;
import android.util.ArraySet;
import android.util.DebugUtils;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.net.NetworkUtilsInternal;
@@ -5276,30 +5277,10 @@ public class DevicePolicyManager {
if (!proxySpec.type().equals(Proxy.Type.HTTP)) {
throw new IllegalArgumentException();
}
- InetSocketAddress sa = (InetSocketAddress)proxySpec.address();
- String hostName = sa.getHostName();
- int port = sa.getPort();
- StringBuilder hostBuilder = new StringBuilder();
- hostSpec = hostBuilder.append(hostName)
- .append(":").append(Integer.toString(port)).toString();
- if (exclusionList == null) {
- exclSpec = "";
- } else {
- StringBuilder listBuilder = new StringBuilder();
- boolean firstDomain = true;
- for (String exclDomain : exclusionList) {
- if (!firstDomain) {
- listBuilder = listBuilder.append(",");
- } else {
- firstDomain = false;
- }
- listBuilder = listBuilder.append(exclDomain.trim());
- }
- exclSpec = listBuilder.toString();
- }
- if (android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec)
- != android.net.Proxy.PROXY_VALID)
- throw new IllegalArgumentException();
+ final Pair<String, String> proxyParams =
+ getProxyParameters(proxySpec, exclusionList);
+ hostSpec = proxyParams.first;
+ exclSpec = proxyParams.second;
}
return mService.setGlobalProxy(admin, hostSpec, exclSpec);
} catch (RemoteException e) {
@@ -5310,6 +5291,41 @@ public class DevicePolicyManager {
}
/**
+ * Build HTTP proxy parameters for {@link IDevicePolicyManager#setGlobalProxy}.
+ * @throws IllegalArgumentException Invalid proxySpec
+ * @hide
+ */
+ @VisibleForTesting
+ public Pair<String, String> getProxyParameters(Proxy proxySpec, List<String> exclusionList) {
+ InetSocketAddress sa = (InetSocketAddress) proxySpec.address();
+ String hostName = sa.getHostName();
+ int port = sa.getPort();
+ StringBuilder hostBuilder = new StringBuilder();
+ final String hostSpec = hostBuilder.append(hostName)
+ .append(":").append(Integer.toString(port)).toString();
+ final String exclSpec;
+ if (exclusionList == null) {
+ exclSpec = "";
+ } else {
+ StringBuilder listBuilder = new StringBuilder();
+ boolean firstDomain = true;
+ for (String exclDomain : exclusionList) {
+ if (!firstDomain) {
+ listBuilder = listBuilder.append(",");
+ } else {
+ firstDomain = false;
+ }
+ listBuilder = listBuilder.append(exclDomain.trim());
+ }
+ exclSpec = listBuilder.toString();
+ }
+ if (android.net.Proxy.validate(hostName, Integer.toString(port), exclSpec)
+ != android.net.Proxy.PROXY_VALID) throw new IllegalArgumentException();
+
+ return new Pair<>(hostSpec, exclSpec);
+ }
+
+ /**
* Set a network-independent global HTTP proxy. This is not normally what you want for typical
* HTTP proxies - they are generally network dependent. However if you're doing something
* unusual like general internal filtering this may be useful. On a private network where the
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 065a2f307f5b..3b753940cb23 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -31,6 +31,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
import static android.app.admin.DevicePolicyManager.WIPE_EUICC;
import static android.app.admin.PasswordMetrics.computeForPassword;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE;
+import static android.net.InetAddresses.parseNumericAddress;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.internal.widget.LockPatternUtils.EscrowTokenStateChangeCallback;
@@ -66,6 +67,8 @@ import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import static org.testng.Assert.assertThrows;
+import static java.util.Collections.emptyList;
+
import android.Manifest.permission;
import android.app.Activity;
import android.app.AppOpsManager;
@@ -126,6 +129,8 @@ import org.mockito.internal.util.collections.Sets;
import org.mockito.stubbing.Answer;
import java.io.File;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -2360,6 +2365,49 @@ public class DevicePolicyManagerTest extends DpmTestBase {
}
@Test
+ public void testGetProxyParameters() throws Exception {
+ assertThat(dpm.getProxyParameters(inetAddrProxy("192.0.2.1", 1234), emptyList()))
+ .isEqualTo(new Pair<>("192.0.2.1:1234", ""));
+ assertThat(dpm.getProxyParameters(inetAddrProxy("192.0.2.1", 1234),
+ listOf("one.example.com ", " two.example.com ")))
+ .isEqualTo(new Pair<>("192.0.2.1:1234", "one.example.com,two.example.com"));
+ assertThat(dpm.getProxyParameters(hostnameProxy("proxy.example.com", 1234), emptyList()))
+ .isEqualTo(new Pair<>("proxy.example.com:1234", ""));
+ assertThat(dpm.getProxyParameters(hostnameProxy("proxy.example.com", 1234),
+ listOf("excluded.example.com")))
+ .isEqualTo(new Pair<>("proxy.example.com:1234", "excluded.example.com"));
+
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ inetAddrProxy("192.0.2.1", 0), emptyList()));
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ hostnameProxy("", 1234), emptyList()));
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ hostnameProxy("", 0), emptyList()));
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ hostnameProxy("invalid! hostname", 1234), emptyList()));
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ hostnameProxy("proxy.example.com", 1234), listOf("invalid exclusion")));
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ hostnameProxy("proxy.example.com", -1), emptyList()));
+ assertThrows(IllegalArgumentException.class, () -> dpm.getProxyParameters(
+ hostnameProxy("proxy.example.com", 0xFFFF + 1), emptyList()));
+ }
+
+ private static Proxy inetAddrProxy(String inetAddr, int port) {
+ return new Proxy(
+ Proxy.Type.HTTP, new InetSocketAddress(parseNumericAddress(inetAddr), port));
+ }
+
+ private static Proxy hostnameProxy(String hostname, int port) {
+ return new Proxy(
+ Proxy.Type.HTTP, InetSocketAddress.createUnresolved(hostname, port));
+ }
+
+ private static List<String> listOf(String... args) {
+ return Arrays.asList(args);
+ }
+
+ @Test
public void testSetKeyguardDisabledFeaturesWithDO() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
@@ -5494,7 +5542,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
// Attempt to set to empty list (which means no listener is allowlisted)
mContext.binder.callingUid = adminUid;
assertThat(dpms.setPermittedCrossProfileNotificationListeners(
- admin1, Collections.emptyList())).isFalse();
+ admin1, emptyList())).isFalse();
assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1)).isNull();
mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
@@ -5588,7 +5636,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
// Setting an empty allowlist - only system listeners allowed
mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
assertThat(dpms.setPermittedCrossProfileNotificationListeners(
- admin1, Collections.emptyList())).isTrue();
+ admin1, emptyList())).isTrue();
assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1).size()).isEqualTo(0);
mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
@@ -5653,7 +5701,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
// all allowed in primary profile
mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
assertThat(dpms.setPermittedCrossProfileNotificationListeners(
- admin1, Collections.emptyList())).isTrue();
+ admin1, emptyList())).isTrue();
assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1).size()).isEqualTo(0);
mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;