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

Commit e0cbb65e authored by Ritesh Reddy's avatar Ritesh Reddy Committed by Android (Google) Code Review
Browse files

Merge "Revert "Enabled NetworkPolicy backup and restore.""

parents 37f153b4 6b7f0f30
Loading
Loading
Loading
Loading
+0 −186
Original line number Diff line number Diff line
package com.android.providers.settings;

import android.net.NetworkPolicy;
import android.net.NetworkTemplate;
import android.util.Log;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

/**
 * Backup/Restore Serializer Class for android.net.NetworkPolicy
 */
public class NetworkPolicySerializer {
    private static final boolean DEBUG = false;
    private static final String TAG = "NetworkPolicySerializer";

    private static final int NULL = 0;
    private static final int NOT_NULL = 1;
    /**
     * Current Version of the Serializer.
     */
    private static int STATE_VERSION = 1;

    /**
     * Marshals an array of NetworkPolicy objects into a byte-array.
     *
     * @param policies - NetworkPolicies to be Marshaled
     * @return byte array
     */

    public static byte[] marshalNetworkPolicies(NetworkPolicy policies[]) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        if (policies != null && policies.length != 0) {
            DataOutputStream out = new DataOutputStream(baos);
            try {
                out.writeInt(STATE_VERSION);
                out.writeInt(policies.length);
                for (NetworkPolicy policy : policies) {
                    byte[] marshaledPolicy = marshalNetworkPolicy(policy);
                    if (marshaledPolicy != null) {
                        out.writeByte(NOT_NULL);
                        out.writeInt(marshaledPolicy.length);
                        out.write(marshaledPolicy);
                    } else {
                        out.writeByte(NULL);
                    }
                }
            } catch (IOException ioe) {
                Log.e(TAG, "Failed to Convert NetworkPolicies to byte array", ioe);
                baos.reset();
            }
        }
        return baos.toByteArray();
    }

    /**
     * Unmarshals a byte array into an array of NetworkPolicy Objects
     *
     * @param data - marshaled NetworkPolicies Array
     * @return NetworkPolicy[] array
     */
    public static NetworkPolicy[] unmarshalNetworkPolicies(byte[] data) {
        if (data == null || data.length == 0) {
            return new NetworkPolicy[0];
        }
        DataInputStream in = new DataInputStream(new ByteArrayInputStream(data));
        try {
            int version = in.readInt();
            int length = in.readInt();
            NetworkPolicy[] policies = new NetworkPolicy[length];
            for (int i = 0; i < length; i++) {
                byte isNull = in.readByte();
                if (isNull == NULL) continue;
                int byteLength = in.readInt();
                byte[] policyData = new byte[byteLength];
                in.read(policyData, 0, byteLength);
                policies[i] = unmarshalNetworkPolicy(policyData);
            }
            return policies;
        } catch (IOException ioe) {
            Log.e(TAG, "Failed to Convert byte array to NetworkPolicies", ioe);
            return new NetworkPolicy[0];
        }
    }

    /**
     * Marshals a NetworkPolicy object into a byte-array.
     *
     * @param networkPolicy - NetworkPolicy to be Marshaled
     * @return byte array
     */
    public static byte[] marshalNetworkPolicy(NetworkPolicy networkPolicy) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        if (networkPolicy != null) {
            DataOutputStream out = new DataOutputStream(baos);
            try {
                out.writeInt(STATE_VERSION);
                writeNetworkTemplate(out, networkPolicy.template);
                out.writeInt(networkPolicy.cycleDay);
                writeString(out, networkPolicy.cycleTimezone);
                out.writeLong(networkPolicy.warningBytes);
                out.writeLong(networkPolicy.limitBytes);
                out.writeLong(networkPolicy.lastWarningSnooze);
                out.writeLong(networkPolicy.lastLimitSnooze);
                out.writeInt(networkPolicy.metered ? 1 : 0);
                out.writeInt(networkPolicy.inferred ? 1 : 0);
            } catch (IOException ioe) {
                Log.e(TAG, "Failed to Convert NetworkPolicy to byte array", ioe);
                baos.reset();
            }
        }
        return baos.toByteArray();
    }

    /**
     * Unmarshals a byte array into a NetworkPolicy Object
     *
     * @param data - marshaled NetworkPolicy Object
     * @return NetworkPolicy Object
     */
    public static NetworkPolicy unmarshalNetworkPolicy(byte[] data) {
        if (data == null || data.length == 0) {
            return null;
        }
        DataInputStream in = new DataInputStream(new ByteArrayInputStream(data));
        try {
            int version = in.readInt();
            NetworkTemplate template = readNetworkTemplate(in, version);
            int cycleDay = in.readInt();
            String cycleTimeZone = readString(in, version);
            long warningBytes = in.readLong();
            long limitBytes = in.readLong();
            long lastWarningSnooze = in.readLong();
            long lastLimitSnooze = in.readLong();
            boolean metered = in.readInt() == 1;
            boolean inferred = in.readInt() == 1;
            return new NetworkPolicy(template, cycleDay, cycleTimeZone, warningBytes, limitBytes,
                    lastWarningSnooze, lastLimitSnooze, metered, inferred);
        } catch (IOException ioe) {
            Log.e(TAG, "Failed to Convert byte array to NetworkPolicy", ioe);
            return null;
        }
    }

    private static NetworkTemplate readNetworkTemplate(DataInputStream in, int version)
            throws IOException {
        byte isNull = in.readByte();
        if (isNull == NULL) return null;
        int matchRule = in.readInt();
        String subscriberId = readString(in, version);
        String networkId = readString(in, version);
        return new NetworkTemplate(matchRule, subscriberId, networkId);
    }

    private static void writeNetworkTemplate(DataOutputStream out, NetworkTemplate template)
            throws IOException {
        if (template != null) {
            out.writeByte(NOT_NULL);
            out.writeInt(template.getMatchRule());
            writeString(out, template.getSubscriberId());
            writeString(out, template.getNetworkId());
        } else {
            out.writeByte(NULL);
        }
    }

    private static String readString(DataInputStream in, int version) throws IOException {
        byte isNull = in.readByte();
        if (isNull == NOT_NULL) {
            return in.readUTF();
        }
        return null;
    }

    private static void writeString(DataOutputStream out, String val) throws IOException {
        if (val != null) {
            out.writeByte(NOT_NULL);
            out.writeUTF(val);
        } else {
            out.writeByte(NULL);
        }
    }
}
+9 −50
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.NetworkPolicyManager;
import android.net.Uri;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.KeyMgmt;
@@ -83,12 +82,10 @@ public class SettingsBackupAgent extends BackupAgentHelper {
    private static final String KEY_LOCALE = "locale";
    private static final String KEY_LOCK_SETTINGS = "lock_settings";
    private static final String KEY_SOFTAP_CONFIG = "softap_config";
    private static final String KEY_NET_POLICIES = "network_policies";


    // Versioning of the state file.  Increment this version
    // number any time the set of state items is altered.
    private static final int STATE_VERSION = 6;
    private static final int STATE_VERSION = 5;

    // Slots in the checksum array.  Never insert new items in the middle
    // of this array; new slots must be appended.
@@ -100,9 +97,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
    private static final int STATE_GLOBAL          = 5;
    private static final int STATE_LOCK_SETTINGS   = 6;
    private static final int STATE_SOFTAP_CONFIG   = 7;
    private static final int STATE_NET_POLICIES    = 8;

    private static final int STATE_SIZE            = 9; // The current number of state items
    private static final int STATE_SIZE            = 8; // The current number of state items

    // Number of entries in the checksum array at various version numbers
    private static final int STATE_SIZES[] = {
@@ -111,8 +107,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
            5,              // version 2 added STATE_WIFI_CONFIG
            6,              // version 3 added STATE_GLOBAL
            7,              // version 4 added STATE_LOCK_SETTINGS
            8,              // version 5 added STATE_SOFTAP_CONFIG
            STATE_SIZE      // version 6 added STATE_NET_POLICIES
            STATE_SIZE      // version 5 added STATE_SOFTAP_CONFIG
    };

    // Versioning of the 'full backup' format
@@ -120,7 +115,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
    private static final int FULL_BACKUP_ADDED_GLOBAL = 2;  // added the "global" entry
    private static final int FULL_BACKUP_ADDED_LOCK_SETTINGS = 3; // added the "lock_settings" entry
    private static final int FULL_BACKUP_ADDED_SOFTAP_CONF = 4; //added the "softap_config" entry
    private static final int FULL_BACKUP_ADDED_NET_POLICIES = 5; //added the "network_policies" entry

    private static final int INTEGER_BYTE_COUNT = Integer.SIZE / Byte.SIZE;

@@ -416,7 +410,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        byte[] wifiSupplicantData = getWifiSupplicant(FILE_WIFI_SUPPLICANT);
        byte[] wifiConfigData = getFileData(mWifiConfigFile);
        byte[] softApConfigData = getSoftAPConfiguration();
        byte[] netPoliciesData = getNetworkPolicies();

        long[] stateChecksums = readOldChecksums(oldState);

@@ -440,9 +433,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        stateChecksums[STATE_SOFTAP_CONFIG] =
                writeIfChanged(stateChecksums[STATE_SOFTAP_CONFIG], KEY_SOFTAP_CONFIG,
                        softApConfigData, data);
        stateChecksums[STATE_NET_POLICIES] =
                writeIfChanged(stateChecksums[STATE_NET_POLICIES], KEY_NET_POLICIES,
                        netPoliciesData, data);

        writeNewChecksums(stateChecksums, newState);
    }
@@ -583,10 +573,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
                byte[] softapData = new byte[size];
                data.readEntityData(softapData, 0, size);
                restoreSoftApConfiguration(softapData);
            } else if (KEY_NET_POLICIES.equals(key)) {
                byte[] netPoliciesData = new byte[size];
                data.readEntityData(netPoliciesData, 0, size);
                restoreNetworkPolicies(netPoliciesData);
            } else {
                data.skipEntityData();
            }
@@ -616,7 +602,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        byte[] wifiSupplicantData = getWifiSupplicant(FILE_WIFI_SUPPLICANT);
        byte[] wifiConfigData = getFileData(mWifiConfigFile);
        byte[] softApConfigData = getSoftAPConfiguration();
        byte[] netPoliciesData = getNetworkPolicies();

        // Write the data to the staging file, then emit that as our tarfile
        // representation of the backed-up settings.
@@ -654,9 +639,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
            if (DEBUG_BACKUP) Log.d(TAG, softApConfigData.length + " bytes of softap config data");
            out.writeInt(softApConfigData.length);
            out.write(softApConfigData);
            if (DEBUG_BACKUP) Log.d(TAG, netPoliciesData.length + " bytes of network policies data");
            out.writeInt(netPoliciesData.length);
            out.write(netPoliciesData);

            out.flush();    // also flushes downstream

@@ -759,16 +741,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
                }
            }

            if (version >= FULL_BACKUP_ADDED_NET_POLICIES){
                nBytes = in.readInt();
                if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of network policies data");
                if (nBytes > buffer.length) buffer = new byte[nBytes];
                if (nBytes > 0) {
                    in.readFully(buffer, 0, nBytes);
                    restoreNetworkPolicies(buffer);
                }
            }

            if (DEBUG_BACKUP) Log.d(TAG, "Full restore complete.");
        } else {
            data.close();
@@ -1224,20 +1196,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
        wifiManager.setWifiApConfiguration(WiFiConfigurationSerializer.unmarshalWifiConfig(data));
    }

    private byte[] getNetworkPolicies(){
        NetworkPolicyManager networkPolicyManager =
                (NetworkPolicyManager)getSystemService(NETWORK_POLICY_SERVICE);
        return NetworkPolicySerializer
                .marshalNetworkPolicies(networkPolicyManager.getNetworkPolicies());
    }

    private void restoreNetworkPolicies(byte[] data){
        NetworkPolicyManager networkPolicyManager =
                (NetworkPolicyManager)getSystemService(NETWORK_POLICY_SERVICE);
        networkPolicyManager
                .setNetworkPolicies(NetworkPolicySerializer.unmarshalNetworkPolicies(data));
    }

    /**
     * Write an int in BigEndian into the byte array.
     * @param out byte array
@@ -1259,7 +1217,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
    }

    private int readInt(byte[] in, int pos) {
        int result =    ((in[pos    ] & 0xFF) << 24) |
        int result =
                ((in[pos    ] & 0xFF) << 24) |
                        ((in[pos + 1] & 0xFF) << 16) |
                        ((in[pos + 2] & 0xFF) <<  8) |
                        ((in[pos + 3] & 0xFF) <<  0);
+2 −5
Original line number Diff line number Diff line
@@ -5,10 +5,7 @@ include $(CLEAR_VARS)
# Note we statically link SettingsState to do some unit tests.  It's not accessible otherwise
# because this test is not an instrumentation test. (because the target runs in the system process.)
LOCAL_SRC_FILES := $(call all-subdir-java-files) \
    ../src/com/android/providers/settings/SettingsState.java \
    ../src/com/android/providers/settings/WiFiConfigurationSerializer.java \
    ../src/com/android/providers/settings/NetworkPolicySerializer.java

    ../src/com/android/providers/settings/SettingsState.java

LOCAL_PACKAGE_NAME := SettingsProviderTest

+0 −117
Original line number Diff line number Diff line
package com.android.providers.settings;

import android.net.NetworkPolicy;
import android.net.NetworkTemplate;
import android.test.AndroidTestCase;

import java.util.Random;

/**
 * Tests for NetworkPolicySerializer
 */
public class NetworkPolicySerializerTest extends AndroidTestCase {
    static Random sRandom = new Random();

    public void testMarshallAndUnmarshalNetworkPolicy() {
        NetworkPolicy policy = getDummyNetworkPolicy();
        byte[] data = NetworkPolicySerializer.marshalNetworkPolicy(policy);
        assertNotNull("Got Null data from marshal", data);
        assertFalse("Got back an empty byte[] from marshal", data.length == 0);

        NetworkPolicy unmarshaled = NetworkPolicySerializer.unmarshalNetworkPolicy(data);
        assertNotNull("Got Null data from unmarshaled", unmarshaled);
        assertTrue("NetworkPolicy Marshall and Unmarshal Failed!", policy.equals(unmarshaled));
    }

    public void testMarshallNetworkPolicyEdgeCases() {
        byte[] data = NetworkPolicySerializer.marshalNetworkPolicy(null);
        assertNotNull("NetworkPolicy marshal returned null. Expected: byte[0]", data);
        assertEquals("NetworkPolicy marshal returned incomplete byte array. Expected: byte[0]",
                data.length, 0);
    }

    public void testUnmarshallNetworkPolicyEdgeCases() {
        NetworkPolicy policy = NetworkPolicySerializer.unmarshalNetworkPolicy(null);
        assertNull("Non null NetworkPolicy returned for null byte[] input", policy);

        policy = NetworkPolicySerializer.unmarshalNetworkPolicy(new byte[0]);
        assertNull("Non null NetworkPolicy returned for empty byte[] input", policy);

        policy = NetworkPolicySerializer.unmarshalNetworkPolicy(new byte[]{10, 20, 30, 40, 50, 60});
        assertNull("Non null NetworkPolicy returned for incomplete byte[] input", policy);
    }

    public void testMarshallAndUnmarshalNetworkPolicies() {
        NetworkPolicy[] policies = getDummyNetworkPolicies(5);
        byte[] data = NetworkPolicySerializer.marshalNetworkPolicies(policies);
        assertNotNull("Got Null data from marshal", data);
        assertFalse("Got back an empty byte[] from marshal", data.length == 0);

        NetworkPolicy[] unmarshaled = NetworkPolicySerializer.unmarshalNetworkPolicies(data);
        assertNotNull("Got Null data from unmarshaled", unmarshaled);
        try {
            for (int i = 0; i < policies.length; i++) {
                assertTrue("NetworkPolicies Marshall and Unmarshal Failed!",
                        policies[i].equals(unmarshaled[i]));
            }
        } catch (NullPointerException npe) {
            assertTrue("Some policies were not marshaled/unmarshaled correctly", false);
        }
    }

    public void testMarshallNetworkPoliciesEdgeCases() {
        byte[] data = NetworkPolicySerializer.marshalNetworkPolicies(null);
        assertNotNull("NetworkPolicies marshal returned null!", data);
        assertEquals("NetworkPolicies marshal returned incomplete byte array", data.length, 0);

        data = NetworkPolicySerializer.marshalNetworkPolicies(new NetworkPolicy[0]);
        assertNotNull("NetworkPolicies marshal returned null for empty NetworkPolicy[]", data);
        assertEquals("NetworkPolicies marshal returned incomplete byte array for empty NetworkPolicy[]"
                , data.length, 0);
    }

    public void testUnmarshalNetworkPoliciesEdgeCases() {
        NetworkPolicy[] policies = NetworkPolicySerializer.unmarshalNetworkPolicies(null);
        assertNotNull("NetworkPolicies unmarshal returned null for null input. Expected: byte[0] ",
                policies);
        assertEquals("Non Empty NetworkPolicy[] returned for null input Expected: byte[0]",
                policies.length, 0);

        policies = NetworkPolicySerializer.unmarshalNetworkPolicies(new byte[0]);
        assertNotNull("NetworkPolicies unmarshal returned null for empty byte[] input. Expected: byte[0]",
                policies);
        assertEquals("Non Empty NetworkPolicy[] returned for empty byte[] input. Expected: byte[0]",
                policies.length, 0);

        policies = NetworkPolicySerializer.unmarshalNetworkPolicies(new byte[]{10, 20, 30, 40, 50, 60});
        assertNotNull("NetworkPolicies unmarshal returned null for incomplete byte[] input. " +
                "Expected: byte[0] ", policies);
        assertEquals("Non Empty NetworkPolicy[] returned for incomplete byte[] input Expected: byte[0]",
                policies.length, 0);

    }

    private NetworkPolicy[] getDummyNetworkPolicies(int num) {
        NetworkPolicy[] policies = new NetworkPolicy[num];
        for (int i = 0; i < num; i++) {
            policies[i] = getDummyNetworkPolicy();
        }
        return policies;
    }

    private NetworkPolicy getDummyNetworkPolicy() {
        NetworkTemplate template = new NetworkTemplate(NetworkTemplate.MATCH_MOBILE_ALL, "subId",
                "GoogleGuest");
        int cycleDay = sRandom.nextInt();
        String cycleTimezone = "timezone";
        long warningBytes = sRandom.nextLong();
        long limitBytes = sRandom.nextLong();
        long lastWarningSnooze = sRandom.nextLong();
        long lastLimitSnooze = sRandom.nextLong();
        boolean metered = sRandom.nextInt() % 2 == 0;
        boolean inferred = sRandom.nextInt() % 2 == 0;
        return new NetworkPolicy(template, cycleDay, cycleTimezone, warningBytes, limitBytes,
                lastWarningSnooze, lastLimitSnooze, metered, inferred);
    }

}