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

Commit f90ec838 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Implement range-based pin list"

parents 8eec8676 baa9f50c
Loading
Loading
Loading
Loading
+46 −20
Original line number Diff line number Diff line
@@ -381,9 +381,8 @@ class SignApk {
        byte[] buffer = new byte[4096];
        int num;

        List<Pattern> pinPatterns = extractPinPatterns(in);
        List<Hints.PatternWithRange> pinPatterns = extractPinPatterns(in);
        ArrayList<Hints.ByteRange> pinByteRanges = pinPatterns == null ? null : new ArrayList<>();
        HashSet<String> namesToPin = new HashSet<>();

        ArrayList<String> names = new ArrayList<String>();
        for (Enumeration<JarEntry> e = in.entries(); e.hasMoreElements();) {
@@ -399,13 +398,6 @@ class SignApk {
            if (Hints.PIN_BYTE_RANGE_ZIP_ENTRY_NAME.equals(entryName)) {
                continue;  // We regenerate it below.
            }
            if (pinPatterns != null) {
                for (Pattern pinPattern : pinPatterns) {
                    if (pinPattern.matcher(entryName).matches()) {
                        namesToPin.add(entryName);
                    }
                }
            }
            names.add(entryName);
        }
        Collections.sort(names);
@@ -485,6 +477,7 @@ class SignApk {
            DataSink entryDataSink =
                    (inspectEntryRequest != null) ? inspectEntryRequest.getDataSink() : null;

            long entryDataStart = outCounter.getWrittenBytes();
            try (InputStream data = in.getInputStream(inEntry)) {
                while ((num = data.read(buffer)) > 0) {
                    out.write(buffer, 0, num);
@@ -500,11 +493,27 @@ class SignApk {
                inspectEntryRequest.done();
            }

            if (namesToPin.contains(name)) {
                pinByteRanges.add(
            if (pinPatterns != null) {
                boolean pinFileHeader = false;
                for (Hints.PatternWithRange pinPattern : pinPatterns) {
                    if (!pinPattern.matcher(name).matches()) {
                        continue;
                    }
                    Hints.ByteRange dataRange =
                        new Hints.ByteRange(
                        entryHeaderStart,
                        outCounter.getWrittenBytes()));
                            entryDataStart,
                            outCounter.getWrittenBytes());
                    Hints.ByteRange pinRange =
                        pinPattern.ClampToAbsoluteByteRange(dataRange);
                    if (pinRange != null) {
                        pinFileHeader = true;
                        pinByteRanges.add(pinRange);
                    }
                }
                if (pinFileHeader) {
                    pinByteRanges.add(new Hints.ByteRange(entryHeaderStart,
                                                          entryDataStart));
                }
            }
        }

@@ -528,6 +537,7 @@ class SignApk {
            DataSink entryDataSink =
                    (inspectEntryRequest != null) ? inspectEntryRequest.getDataSink() : null;

            long entryDataStart = outCounter.getWrittenBytes();
            InputStream data = in.getInputStream(inEntry);
            while ((num = data.read(buffer)) > 0) {
                out.write(buffer, 0, num);
@@ -541,11 +551,27 @@ class SignApk {
                inspectEntryRequest.done();
            }

            if (namesToPin.contains(name)) {
                pinByteRanges.add(
            if (pinPatterns != null) {
                boolean pinFileHeader = false;
                for (Hints.PatternWithRange pinPattern : pinPatterns) {
                    if (!pinPattern.matcher(name).matches()) {
                        continue;
                    }
                    Hints.ByteRange dataRange =
                        new Hints.ByteRange(
                        entryHeaderStart,
                        outCounter.getWrittenBytes()));
                            entryDataStart,
                            outCounter.getWrittenBytes());
                    Hints.ByteRange pinRange =
                        pinPattern.ClampToAbsoluteByteRange(dataRange);
                    if (pinRange != null) {
                        pinFileHeader = true;
                        pinByteRanges.add(pinRange);
                    }
                }
                if (pinFileHeader) {
                    pinByteRanges.add(new Hints.ByteRange(entryHeaderStart,
                                                          entryDataStart));
                }
            }
        }

@@ -558,7 +584,7 @@ class SignApk {
        }
    }

    private static List<Pattern> extractPinPatterns(JarFile in) throws IOException {
    private static List<Hints.PatternWithRange> extractPinPatterns(JarFile in) throws IOException {
        ZipEntry pinMetaEntry = in.getEntry(Hints.PIN_HINT_ASSET_ZIP_ENTRY_NAME);
        if (pinMetaEntry == null) {
            return null;