diff options
| -rw-r--r-- | core/java/android/app/admin/DevicePolicyManager.java | 64 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java | 54 | 
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;  |