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

Commit de5edb61 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Handle errors during policy loading from file" into udc-dev am: c9fd9867

parents 91b0c7c5 c9fd9867
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.Parcelable;


import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.modules.utils.TypedXmlSerializer;
import android.util.Log;


import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserException;


@@ -41,6 +42,9 @@ import java.util.Objects;
@SuppressLint({"ParcelNotFinal", "ParcelCreator"})
@SuppressLint({"ParcelNotFinal", "ParcelCreator"})
@SystemApi
@SystemApi
public abstract class PolicyKey implements Parcelable {
public abstract class PolicyKey implements Parcelable {

    static final String TAG = "PolicyKey";

    /**
    /**
     * @hide
     * @hide
     */
     */
@@ -76,9 +80,14 @@ public abstract class PolicyKey implements Parcelable {
    /**
    /**
     * @hide
     * @hide
     */
     */
    @Nullable
    public static PolicyKey readGenericPolicyKeyFromXml(TypedXmlPullParser parser) {
    public static PolicyKey readGenericPolicyKeyFromXml(TypedXmlPullParser parser) {
        String identifier = parser.getAttributeValue(
        String identifier = parser.getAttributeValue(
                /* namespace= */ null, ATTR_POLICY_IDENTIFIER);
                /* namespace= */ null, ATTR_POLICY_IDENTIFIER);
        if (identifier == null) {
            Log.wtf(TAG, "Error parsing generic policy key, identifier is null.");
            return null;
        }
        return new NoArgsPolicyKey(identifier);
        return new NoArgsPolicyKey(identifier);
    }
    }


+15 −6
Original line number Original line Diff line number Diff line
@@ -56,6 +56,7 @@ import android.util.Xml;
import com.android.internal.util.XmlUtils;
import com.android.internal.util.XmlUtils;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.utils.Slogf;


import libcore.io.IoUtils;
import libcore.io.IoUtils;


@@ -1511,7 +1512,7 @@ final class DevicePolicyEngine {
                readInner(parser);
                readInner(parser);


            } catch (XmlPullParserException | IOException | ClassNotFoundException e) {
            } catch (XmlPullParserException | IOException | ClassNotFoundException e) {
                Log.e(TAG, "Error parsing resources file", e);
                Slogf.wtf(TAG, "Error parsing resources file", e);
            } finally {
            } finally {
                IoUtils.closeQuietly(input);
                IoUtils.closeQuietly(input);
            }
            }
@@ -1533,7 +1534,7 @@ final class DevicePolicyEngine {
                        readEnforcingAdminsInner(parser);
                        readEnforcingAdminsInner(parser);
                        break;
                        break;
                    default:
                    default:
                        Log.e(TAG, "Unknown tag " + tag);
                        Slogf.wtf(TAG, "Unknown tag " + tag);
                }
                }
            }
            }
        }
        }
@@ -1554,7 +1555,7 @@ final class DevicePolicyEngine {
                        policyState = PolicyState.readFromXml(parser);
                        policyState = PolicyState.readFromXml(parser);
                        break;
                        break;
                    default:
                    default:
                        Log.e(TAG, "Unknown tag for local policy entry" + tag);
                        Slogf.wtf(TAG, "Unknown tag for local policy entry" + tag);
                }
                }
            }
            }


@@ -1564,7 +1565,9 @@ final class DevicePolicyEngine {
                }
                }
                mLocalPolicies.get(userId).put(policyKey, policyState);
                mLocalPolicies.get(userId).put(policyKey, policyState);
            } else {
            } else {
                Log.e(TAG, "Error parsing local policy");
                Slogf.wtf(TAG, "Error parsing local policy, policyKey is "
                        + (policyKey == null ? "null" : policyKey) + ", and policyState is "
                        + (policyState == null ? "null" : policyState) + ".");
            }
            }
        }
        }


@@ -1583,20 +1586,26 @@ final class DevicePolicyEngine {
                        policyState = PolicyState.readFromXml(parser);
                        policyState = PolicyState.readFromXml(parser);
                        break;
                        break;
                    default:
                    default:
                        Log.e(TAG, "Unknown tag for local policy entry" + tag);
                        Slogf.wtf(TAG, "Unknown tag for local policy entry" + tag);
                }
                }
            }
            }


            if (policyKey != null && policyState != null) {
            if (policyKey != null && policyState != null) {
                mGlobalPolicies.put(policyKey, policyState);
                mGlobalPolicies.put(policyKey, policyState);
            } else {
            } else {
                Log.e(TAG, "Error parsing global policy");
                Slogf.wtf(TAG, "Error parsing global policy, policyKey is "
                        + (policyKey == null ? "null" : policyKey) + ", and policyState is "
                        + (policyState == null ? "null" : policyState) + ".");
            }
            }
        }
        }


        private void readEnforcingAdminsInner(TypedXmlPullParser parser)
        private void readEnforcingAdminsInner(TypedXmlPullParser parser)
                throws XmlPullParserException {
                throws XmlPullParserException {
            EnforcingAdmin admin = EnforcingAdmin.readFromXml(parser);
            EnforcingAdmin admin = EnforcingAdmin.readFromXml(parser);
            if (admin == null) {
                Slogf.wtf(TAG, "Error parsing enforcingAdmins, EnforcingAdmin is null.");
                return;
            }
            if (!mEnforcingAdmins.contains(admin.getUserId())) {
            if (!mEnforcingAdmins.contains(admin.getUserId())) {
                mEnforcingAdmins.put(admin.getUserId(), new HashSet<>());
                mEnforcingAdmins.put(admin.getUserId(), new HashSet<>());
            }
            }
+17 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.role.RoleManagerLocal;
import com.android.role.RoleManagerLocal;
import com.android.server.LocalManagerRegistry;
import com.android.server.LocalManagerRegistry;
import com.android.server.utils.Slogf;


import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserException;


@@ -51,6 +52,9 @@ import java.util.Set;
 *
 *
 */
 */
final class EnforcingAdmin {
final class EnforcingAdmin {

    static final String TAG = "EnforcingAdmin";

    static final String ROLE_AUTHORITY_PREFIX = "role:";
    static final String ROLE_AUTHORITY_PREFIX = "role:";
    static final String DPC_AUTHORITY = "enterprise";
    static final String DPC_AUTHORITY = "enterprise";
    static final String DEVICE_ADMIN_AUTHORITY = "device_admin";
    static final String DEVICE_ADMIN_AUTHORITY = "device_admin";
@@ -286,6 +290,7 @@ final class EnforcingAdmin {
        }
        }
    }
    }


    @Nullable
    static EnforcingAdmin readFromXml(TypedXmlPullParser parser)
    static EnforcingAdmin readFromXml(TypedXmlPullParser parser)
            throws XmlPullParserException {
            throws XmlPullParserException {
        String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
        String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
@@ -294,13 +299,25 @@ final class EnforcingAdmin {
        int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);
        int userId = parser.getAttributeInt(/* namespace= */ null, ATTR_USER_ID);


        if (isRoleAuthority) {
        if (isRoleAuthority) {
            if (packageName == null) {
                Slogf.wtf(TAG, "Error parsing EnforcingAdmin with RoleAuthority, packageName is "
                        + "null.");
                return null;
            }
            // TODO(b/281697976): load active admin
            // TODO(b/281697976): load active admin
            return new EnforcingAdmin(packageName, userId, null);
            return new EnforcingAdmin(packageName, userId, null);
        } else {
        } else {
            if (packageName == null || authoritiesStr == null) {
                Slogf.wtf(TAG, "Error parsing EnforcingAdmin, packageName is "
                        + (packageName == null ? "null" : packageName) + ", and authorities is "
                        + (authoritiesStr == null ? "null" : authoritiesStr) + ".");
                return null;
            }
            String className = parser.getAttributeValue(/* namespace= */ null, ATTR_CLASS_NAME);
            String className = parser.getAttributeValue(/* namespace= */ null, ATTR_CLASS_NAME);
            ComponentName componentName = className == null
            ComponentName componentName = className == null
                    ? null :  new ComponentName(packageName, className);
                    ? null :  new ComponentName(packageName, className);
            Set<String> authorities = Set.of(authoritiesStr.split(ATTR_AUTHORITIES_SEPARATOR));
            Set<String> authorities = Set.of(authoritiesStr.split(ATTR_AUTHORITIES_SEPARATOR));
            // TODO(b/281697976): load active admin
            return new EnforcingAdmin(packageName, componentName, authorities, userId, null);
            return new EnforcingAdmin(packageName, componentName, authorities, userId, null);
        }
        }
    }
    }
+1 −0
Original line number Original line Diff line number Diff line
@@ -457,6 +457,7 @@ class OwnersData {
                case TAG_POLICY_ENGINE_MIGRATION:
                case TAG_POLICY_ENGINE_MIGRATION:
                    mMigratedToPolicyEngine = parser.getAttributeBoolean(
                    mMigratedToPolicyEngine = parser.getAttributeBoolean(
                            null, ATTR_MIGRATED_TO_POLICY_ENGINE, false);
                            null, ATTR_MIGRATED_TO_POLICY_ENGINE, false);
                    break;
                default:
                default:
                    Slog.e(TAG, "Unexpected tag: " + tag);
                    Slog.e(TAG, "Unexpected tag: " + tag);
                    return false;
                    return false;
+22 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ import android.os.UserManager;
import com.android.internal.util.function.QuadFunction;
import com.android.internal.util.function.QuadFunction;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.utils.Slogf;


import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserException;


@@ -53,6 +54,9 @@ import java.util.Map;
import java.util.Set;
import java.util.Set;


final class PolicyDefinition<V> {
final class PolicyDefinition<V> {

    static final String TAG = "PolicyDefinition";

    private static final int POLICY_FLAG_NONE = 0;
    private static final int POLICY_FLAG_NONE = 0;


    // Only use this flag if a policy can not be applied locally.
    // Only use this flag if a policy can not be applied locally.
@@ -596,22 +600,40 @@ final class PolicyDefinition<V> {
        mPolicyKey.saveToXml(serializer);
        mPolicyKey.saveToXml(serializer);
    }
    }


    @Nullable
    static <V> PolicyDefinition<V> readFromXml(TypedXmlPullParser parser)
    static <V> PolicyDefinition<V> readFromXml(TypedXmlPullParser parser)
            throws XmlPullParserException, IOException {
            throws XmlPullParserException, IOException {
        // TODO: can we avoid casting?
        // TODO: can we avoid casting?
        PolicyKey policyKey = readPolicyKeyFromXml(parser);
        PolicyKey policyKey = readPolicyKeyFromXml(parser);
        if (policyKey == null) {
            Slogf.wtf(TAG, "Error parsing PolicyDefinition, PolicyKey is null.");
            return null;
        }
        PolicyDefinition<V> genericPolicyDefinition =
        PolicyDefinition<V> genericPolicyDefinition =
                (PolicyDefinition<V>) POLICY_DEFINITIONS.get(policyKey.getIdentifier());
                (PolicyDefinition<V>) POLICY_DEFINITIONS.get(policyKey.getIdentifier());
        if (genericPolicyDefinition == null) {
            Slogf.wtf(TAG, "Unknown generic policy key: " + policyKey);
            return null;
        }
        return genericPolicyDefinition.createPolicyDefinition(policyKey);
        return genericPolicyDefinition.createPolicyDefinition(policyKey);
    }
    }


    @Nullable
    static <V> PolicyKey readPolicyKeyFromXml(TypedXmlPullParser parser)
    static <V> PolicyKey readPolicyKeyFromXml(TypedXmlPullParser parser)
            throws XmlPullParserException, IOException {
            throws XmlPullParserException, IOException {
        // TODO: can we avoid casting?
        // TODO: can we avoid casting?
        PolicyKey policyKey = PolicyKey.readGenericPolicyKeyFromXml(parser);
        PolicyKey policyKey = PolicyKey.readGenericPolicyKeyFromXml(parser);
        if (policyKey == null) {
            Slogf.wtf(TAG, "Error parsing PolicyKey, GenericPolicyKey is null");
            return null;
        }
        PolicyDefinition<PolicyValue<V>> genericPolicyDefinition =
        PolicyDefinition<PolicyValue<V>> genericPolicyDefinition =
                (PolicyDefinition<PolicyValue<V>>) POLICY_DEFINITIONS.get(
                (PolicyDefinition<PolicyValue<V>>) POLICY_DEFINITIONS.get(
                        policyKey.getIdentifier());
                        policyKey.getIdentifier());
        if (genericPolicyDefinition == null) {
            Slogf.wtf(TAG, "Error parsing PolicyKey, Unknown generic policy key: " + policyKey);
            return null;
        }
        return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
        return genericPolicyDefinition.mPolicyKey.readFromXml(parser);
    }
    }


Loading