Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2965f6bc authored by Pavel Grafov's avatar Pavel Grafov Committed by Android (Google) Code Review
Browse files

Merge changes from topic "presubmit-am-ba0ca280754b426bbc91a336347cfd0d" into tm-mainline-prod

* changes:
  [automerge] Simplyfy DPM binder by using WifiSsidPolicy. 2p: 8d2caa2b
  Simplyfy DPM binder by using WifiSsidPolicy.
parents 6a0297be f082c62e
Loading
Loading
Loading
Loading
+9 −42
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@ import android.graphics.drawable.Drawable;
import android.net.PrivateDnsConnectivityChecker;
import android.net.ProxyInfo;
import android.net.Uri;
import android.net.wifi.WifiSsid;
import android.nfc.NfcAdapter;
import android.os.Binder;
import android.os.Build;
@@ -112,7 +111,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
@@ -15237,26 +15235,15 @@ public class DevicePolicyManager {
     */
    public void setWifiSsidPolicy(@Nullable WifiSsidPolicy policy) {
        throwIfParentInstance("setWifiSsidPolicy");
        if (mService != null) {
            try {
                if (policy == null) {
                    mService.setSsidAllowlist(new ArrayList<>());
                } else {
                    int policyType = policy.getPolicyType();
                    List<String> ssidList = new ArrayList<>();
                    for (WifiSsid ssid : policy.getSsids()) {
                        ssidList.add(new String(ssid.getBytes(), StandardCharsets.UTF_8));
                    }
                    if (policyType == WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST) {
                        mService.setSsidAllowlist(ssidList);
                    } else {
                        mService.setSsidDenylist(ssidList);
                    }
        if (mService == null) {
            return;
        }
        try {
            mService.setWifiSsidPolicy(policy);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        }
    }
    /**
@@ -15274,30 +15261,10 @@ public class DevicePolicyManager {
            return null;
        }
        try {
            List<String> allowlist = mService.getSsidAllowlist();
            if (!allowlist.isEmpty()) {
                List<WifiSsid> wifiSsidAllowlist = new ArrayList<>();
                for (String ssid : allowlist) {
                    wifiSsidAllowlist.add(
                            WifiSsid.fromBytes(ssid.getBytes(StandardCharsets.UTF_8)));
                }
                return new WifiSsidPolicy(WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST,
                        new ArraySet<>(wifiSsidAllowlist));
            }
            List<String> denylist = mService.getSsidDenylist();
            if (!denylist.isEmpty()) {
                List<WifiSsid> wifiSsidDenylist = new ArrayList<>();
                for (String ssid : denylist) {
                    wifiSsidDenylist.add(
                            WifiSsid.fromBytes(ssid.getBytes(StandardCharsets.UTF_8)));
                }
                return new WifiSsidPolicy(WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST,
                        new ArraySet<>(wifiSsidDenylist));
            }
            return mService.getWifiSsidPolicy();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return null;
    }
    /**
+3 −4
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.app.admin.PasswordMetrics;
import android.app.admin.FactoryResetProtectionPolicy;
import android.app.admin.ManagedProfileProvisioningParams;
import android.app.admin.FullyManagedDeviceProvisioningParams;
import android.app.admin.WifiSsidPolicy;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
@@ -545,10 +546,8 @@ interface IDevicePolicyManager {
    void setMinimumRequiredWifiSecurityLevel(int level);
    int getMinimumRequiredWifiSecurityLevel();

    void setSsidAllowlist(in List<String> ssids);
    List<String> getSsidAllowlist();
    void setSsidDenylist(in List<String> ssids);
    List<String> getSsidDenylist();
    void setWifiSsidPolicy(in WifiSsidPolicy policy);
    WifiSsidPolicy getWifiSsidPolicy();

    List<UserHandle> listForegroundAffiliatedUsers();
    void setDrawables(in List<DevicePolicyDrawableResource> drawables);
+18 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.util.ArraySet;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
import java.util.Set;

/**
@@ -134,6 +135,23 @@ public final class WifiSsidPolicy implements Parcelable {
        dest.writeArraySet(mSsids);
    }

    @Override
    public boolean equals(Object thatObject) {
        if (this == thatObject) {
            return true;
        }
        if (!(thatObject instanceof WifiSsidPolicy)) {
            return false;
        }
        WifiSsidPolicy that = (WifiSsidPolicy) thatObject;
        return mPolicyType == that.mPolicyType && Objects.equals(mSsids, that.mSsids);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mPolicyType, mSsids);
    }

    @Override
    public int describeContents() {
        return 0;
+45 −21
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.server.devicepolicy;
import static android.app.admin.DevicePolicyManager.NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
import static android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST;
import static android.app.admin.WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST;

import static com.android.server.devicepolicy.DevicePolicyManagerService.LOG_TAG;

@@ -33,7 +35,9 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.FactoryResetProtectionPolicy;
import android.app.admin.PasswordPolicy;
import android.app.admin.PreferentialNetworkServiceConfig;
import android.app.admin.WifiSsidPolicy;
import android.graphics.Color;
import android.net.wifi.WifiSsid;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.os.UserHandle;
@@ -53,6 +57,7 @@ import com.android.server.utils.Slogf;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -60,6 +65,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;

class ActiveAdmin {
    private static final String TAG_DISABLE_KEYGUARD_FEATURES = "disable-keyguard-features";
@@ -242,13 +248,8 @@ class ActiveAdmin {
    // List of package names to keep cached.
    List<String> keepUninstalledPackages;

    // The allowlist of SSIDs the device may connect to.
    // By default, the allowlist restriction is deactivated.
    List<String> mSsidAllowlist;

    // The denylist of SSIDs the device may not connect to.
    // By default, the denylist restriction is deactivated.
    List<String> mSsidDenylist;
    // Wi-Fi SSID restriction policy.
    WifiSsidPolicy mWifiSsidPolicy;

    // TODO: review implementation decisions with frameworks team
    boolean specifiesGlobalProxy = false;
@@ -594,12 +595,20 @@ class ActiveAdmin {
        if (mWifiMinimumSecurityLevel != DevicePolicyManager.WIFI_SECURITY_OPEN) {
            writeAttributeValueToXml(out, TAG_WIFI_MIN_SECURITY, mWifiMinimumSecurityLevel);
        }
        if (mSsidAllowlist != null && !mSsidAllowlist.isEmpty()) {
            writeAttributeValuesToXml(out, TAG_SSID_ALLOWLIST, TAG_SSID, mSsidAllowlist);
        if (mWifiSsidPolicy != null) {
            List<String> ssids = ssidsToStrings(mWifiSsidPolicy.getSsids());
            if (mWifiSsidPolicy.getPolicyType() == WIFI_SSID_POLICY_TYPE_ALLOWLIST) {
                writeAttributeValuesToXml(out, TAG_SSID_ALLOWLIST, TAG_SSID, ssids);
            } else if (mWifiSsidPolicy.getPolicyType() == WIFI_SSID_POLICY_TYPE_DENYLIST) {
                writeAttributeValuesToXml(out, TAG_SSID_DENYLIST, TAG_SSID, ssids);
            }
        }
        if (mSsidDenylist != null && !mSsidDenylist.isEmpty()) {
            writeAttributeValuesToXml(out, TAG_SSID_DENYLIST, TAG_SSID, mSsidDenylist);
    }

    private List<String> ssidsToStrings(Set<WifiSsid> ssids) {
        return ssids.stream()
                .map(ssid -> new String(ssid.getBytes(), StandardCharsets.UTF_8))
                .collect(Collectors.toList());
    }

    void writeTextToXml(TypedXmlSerializer out, String tag, String text) throws IOException {
@@ -855,11 +864,13 @@ class ActiveAdmin {
            } else if (TAG_WIFI_MIN_SECURITY.equals(tag)) {
                mWifiMinimumSecurityLevel = parser.getAttributeInt(null, ATTR_VALUE);
            } else if (TAG_SSID_ALLOWLIST.equals(tag)) {
                mSsidAllowlist = new ArrayList<>();
                readAttributeValues(parser, TAG_SSID, mSsidAllowlist);
                List<WifiSsid> ssids = readWifiSsids(parser, TAG_SSID);
                mWifiSsidPolicy = new WifiSsidPolicy(
                        WIFI_SSID_POLICY_TYPE_ALLOWLIST, new ArraySet<>(ssids));
            } else if (TAG_SSID_DENYLIST.equals(tag)) {
                mSsidDenylist = new ArrayList<>();
                readAttributeValues(parser, TAG_SSID, mSsidDenylist);
                List<WifiSsid> ssids = readWifiSsids(parser, TAG_SSID);
                mWifiSsidPolicy = new WifiSsidPolicy(
                        WIFI_SSID_POLICY_TYPE_DENYLIST, new ArraySet<>(ssids));
            } else {
                Slogf.w(LOG_TAG, "Unknown admin tag: %s", tag);
                XmlUtils.skipCurrentTag(parser);
@@ -867,6 +878,16 @@ class ActiveAdmin {
        }
    }

    private List<WifiSsid> readWifiSsids(TypedXmlPullParser parser, String tag)
            throws XmlPullParserException, IOException {
        List<String> ssidStrings = new ArrayList<>();
        readAttributeValues(parser, tag, ssidStrings);
        List<WifiSsid> ssids = ssidStrings.stream()
                .map(ssid -> WifiSsid.fromBytes(ssid.getBytes(StandardCharsets.UTF_8)))
                .collect(Collectors.toList());
        return ssids;
    }

    private List<String> readPackageList(TypedXmlPullParser parser,
            String tag) throws XmlPullParserException, IOException {
        List<String> result = new ArrayList<String>();
@@ -1222,11 +1243,14 @@ class ActiveAdmin {
        pw.print("mWifiMinimumSecurityLevel=");
        pw.println(mWifiMinimumSecurityLevel);

        if (mWifiSsidPolicy != null) {
            if (mWifiSsidPolicy.getPolicyType() == WIFI_SSID_POLICY_TYPE_ALLOWLIST) {
                pw.print("mSsidAllowlist=");
        pw.println(mSsidAllowlist);

            } else {
                pw.print("mSsidDenylist=");
        pw.println(mSsidDenylist);
            }
            pw.println(ssidsToStrings(mWifiSsidPolicy.getSsids()));
        }

        if (mFactoryResetProtectionPolicy != null) {
            pw.println("mFactoryResetProtectionPolicy:");
+11 −59
Original line number Diff line number Diff line
@@ -274,7 +274,6 @@ import android.net.Uri;
import android.net.VpnManager;
import android.net.metrics.IpConnectivityLog;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiSsid;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -395,7 +394,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.nio.charset.StandardCharsets;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
@@ -18569,13 +18567,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
                        .notifyMinimumRequiredWifiSecurityLevelChanged(level));
    }
    private void notifyWifiSsidPolicyChanged(int policyType, List<String> ssids) {
        List<WifiSsid> wifiSsidList = new ArrayList<>();
        for (String ssid : ssids) {
            wifiSsidList.add(
                    WifiSsid.fromBytes(ssid.getBytes(StandardCharsets.UTF_8)));
    private void notifyWifiSsidPolicyChanged(WifiSsidPolicy policy) {
        if (policy == null) {
            // If policy doesn't limit SSIDs, no need to disconnect anything.
            return;
        }
        WifiSsidPolicy policy = new WifiSsidPolicy(policyType, new ArraySet<>(wifiSsidList));
        mInjector.binderWithCleanCallingIdentity(
                () -> mInjector.getWifiManager().notifyWifiSsidPolicyChanged(policy));
    }
@@ -18611,84 +18607,40 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
    }
    @Override
    public void setSsidAllowlist(List<String> ssids) {
        final CallerIdentity caller = getCallerIdentity();
        Preconditions.checkCallAuthorization(
                isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller),
                "SSID allowlist can only be controlled by a device owner or "
                        + "a profile owner on an organization-owned device.");
        Collections.sort(ssids);
        boolean changed = false;
        synchronized (getLockObject()) {
            final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller);
            if (!ssids.equals(admin.mSsidAllowlist)) {
                admin.mSsidAllowlist = ssids;
                admin.mSsidDenylist = null;
                changed = true;
            }
            if (changed) saveSettingsLocked(caller.getUserId());
        }
        if (changed && !ssids.isEmpty()) {
            notifyWifiSsidPolicyChanged(WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_ALLOWLIST, ssids);
        }
    }
    @Override
    public List<String> getSsidAllowlist() {
    public WifiSsidPolicy getWifiSsidPolicy() {
        final CallerIdentity caller = getCallerIdentity();
        Preconditions.checkCallAuthorization(
                isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller)
                        || canQueryAdminPolicy(caller),
                "SSID allowlist can only be retrieved by a device owner or "
                "SSID policy can only be retrieved by a device owner or "
                        + "a profile owner on an organization-owned device or "
                        + "an app with the QUERY_ADMIN_POLICY permission.");
        synchronized (getLockObject()) {
            final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked(
                    UserHandle.USER_SYSTEM);
            return (admin == null || admin.mSsidAllowlist == null) ? new ArrayList<>()
                    : admin.mSsidAllowlist;
            return admin != null ? admin.mWifiSsidPolicy : null;
        }
    }
    @Override
    public void setSsidDenylist(List<String> ssids) {
    public void setWifiSsidPolicy(WifiSsidPolicy policy) {
        final CallerIdentity caller = getCallerIdentity();
        Preconditions.checkCallAuthorization(
                isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller),
                "SSID denylist can only be controlled by a device owner or "
                        + "a profile owner on an organization-owned device.");
        Collections.sort(ssids);
        boolean changed = false;
        synchronized (getLockObject()) {
            final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller);
            if (!ssids.equals(admin.mSsidDenylist)) {
                admin.mSsidDenylist = ssids;
                admin.mSsidAllowlist = null;
            if (!Objects.equals(policy, admin.mWifiSsidPolicy)) {
                admin.mWifiSsidPolicy = policy;
                changed = true;
            }
            if (changed) saveSettingsLocked(caller.getUserId());
        }
        if (changed) {
            notifyWifiSsidPolicyChanged(WifiSsidPolicy.WIFI_SSID_POLICY_TYPE_DENYLIST, ssids);
        }
    }
    @Override
    public List<String> getSsidDenylist() {
        final CallerIdentity caller = getCallerIdentity();
        Preconditions.checkCallAuthorization(
                isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller)
                        || canQueryAdminPolicy(caller),
                "SSID denylist can only be retrieved by a device owner or "
                        + "a profile owner on an organization-owned device or "
                        + "an app with the QUERY_ADMIN_POLICY permission.");
        synchronized (getLockObject()) {
            final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked(
                    UserHandle.USER_SYSTEM);
            return (admin == null || admin.mSsidDenylist == null) ? new ArrayList<>()
                    : admin.mSsidDenylist;
            notifyWifiSsidPolicyChanged(policy);
        }
    }