diff options
| author | 2021-01-22 13:51:56 +0000 | |
|---|---|---|
| committer | 2021-01-22 13:51:56 +0000 | |
| commit | 8357d23b51f8332d02980b407349a0024eaccbd2 (patch) | |
| tree | 7367cc46f25d597bcddf152580b279497311cc42 | |
| parent | de044a60ac84a886946c808840285005c00dcd25 (diff) | |
| parent | 6fc985c39c623a4787ed4cfe7de9f42803d8b41b (diff) | |
Merge "Add test for proxy spec building"
| -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; |