Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 14 matching lines...) Expand all Loading... | |
25 import java.io.File; | 25 import java.io.File; |
26 import java.io.FileInputStream; | 26 import java.io.FileInputStream; |
27 import java.io.FileOutputStream; | 27 import java.io.FileOutputStream; |
28 import java.io.IOException; | 28 import java.io.IOException; |
29 import java.io.StringReader; | 29 import java.io.StringReader; |
30 import java.net.URL; | 30 import java.net.URL; |
31 import java.nio.charset.StandardCharsets; | 31 import java.nio.charset.StandardCharsets; |
32 import java.security.MessageDigest; | 32 import java.security.MessageDigest; |
33 import java.security.NoSuchAlgorithmException; | 33 import java.security.NoSuchAlgorithmException; |
34 import java.util.ArrayList; | 34 import java.util.ArrayList; |
35 import java.util.Arrays; | |
35 import java.util.Collection; | 36 import java.util.Collection; |
36 import java.util.Collections; | 37 import java.util.Collections; |
37 import java.util.HashMap; | 38 import java.util.HashMap; |
38 import java.util.HashSet; | 39 import java.util.HashSet; |
39 import java.util.List; | 40 import java.util.List; |
40 import java.util.Locale; | 41 import java.util.Locale; |
41 import java.util.Map; | 42 import java.util.Map; |
42 import java.util.Map.Entry; | 43 import java.util.Map.Entry; |
43 import java.util.zip.GZIPInputStream; | 44 import java.util.zip.GZIPInputStream; |
44 import java.util.zip.GZIPOutputStream; | 45 import java.util.zip.GZIPOutputStream; |
45 | 46 |
46 import android.text.TextUtils; | 47 import android.text.TextUtils; |
47 import android.text.format.DateUtils; | 48 import android.text.format.DateUtils; |
48 import android.util.Log; | 49 import android.util.Log; |
49 | 50 |
50 /** | 51 /** |
51 * Simple subscription representation. | 52 * Simple subscription representation. |
52 */ | 53 */ |
53 final class Subscription | 54 final class Subscription |
54 { | 55 { |
55 private static final String TAG = Subscription.class.getSimpleName(); | 56 private static final String TAG = Subscription.class.getSimpleName(); |
56 public static final String KEY_TITLE = "title"; | 57 public static final String KEY_TITLE = "title"; |
57 public static final String KEY_VERSION = "version"; | 58 public static final String KEY_VERSION = "version"; |
58 public static final String KEY_FORCED_TITLE = "_title"; | |
59 public static final String KEY_HTTP_ETAG = "_etag"; | 59 public static final String KEY_HTTP_ETAG = "_etag"; |
60 public static final String KEY_HTTP_LAST_MODIFIED = "_last_modified"; | 60 public static final String KEY_HTTP_LAST_MODIFIED = "_last_modified"; |
61 public static final String KEY_UPDATE_TIMESTAMP = "_update_timestamp"; | 61 public static final String KEY_UPDATE_TIMESTAMP = "_update_timestamp"; |
62 public static final String KEY_TRIED_UPDATE_TIMESTAMP = "_tried_update_timesta mp"; | 62 public static final String KEY_TRIED_UPDATE_TIMESTAMP = "_tried_update_timesta mp"; |
63 public static final String KEY_DOWNLOAD_COUNT = "_download_count"; | 63 public static final String KEY_DOWNLOAD_COUNT = "_download_count"; |
64 public static final String KEY_ENABLED = "_enabled"; | 64 public static final String KEY_ENABLED = "_enabled"; |
65 public static final String KEY_HAS_FILTERS = "_has_filters"; | |
66 public static final String KEY_META_HASH = "_meta_hash"; | 65 public static final String KEY_META_HASH = "_meta_hash"; |
67 | 66 |
68 private static final long MINIMAL_DOWNLOAD_INTERVAL = DateUtils.HOUR_IN_MILLIS / 4; | 67 private static final long MINIMAL_DOWNLOAD_INTERVAL = DateUtils.HOUR_IN_MILLIS / 4; |
69 private static final long DOWNLOAD_RETRY_INTERVAL = DateUtils.HOUR_IN_MILLIS; | 68 private static final long DOWNLOAD_RETRY_INTERVAL = DateUtils.HOUR_IN_MILLIS; |
70 | 69 |
71 private static final HashSet<String> ALLOWED_META_KEYS = new HashSet<>(); | 70 /** |
71 * List of meta keys that are allowed to import from a downloaded | |
72 * subscription. | |
73 */ | |
74 private static final String[] ALLOWED_META_KEYS_ARRAY = | |
75 { | |
76 "checksum", KEY_VERSION, KEY_TITLE, "last modified", "expires", "homep age", "licence" | |
77 }; | |
78 private static final HashSet<String> ALLOWED_META_KEYS = | |
79 new HashSet<>(Arrays.asList(ALLOWED_META_KEYS_ARRAY)); | |
80 | |
72 private static final Locale LOCALE_EN = Locale.ENGLISH; | 81 private static final Locale LOCALE_EN = Locale.ENGLISH; |
73 | 82 |
74 private final long updateInterval = DateUtils.DAY_IN_MILLIS | 83 private final long updateInterval = DateUtils.DAY_IN_MILLIS |
75 + (long) (DateUtils.HOUR_IN_MILLIS * 8. * Math.random()); | 84 + (long) (DateUtils.HOUR_IN_MILLIS * 8. * Math.random()); |
76 | |
77 /** | |
78 * List of meta keys that are allowed to import from a downloaded | |
79 * subscription. | |
80 */ | |
81 private static final String[] ALLOWED_META_KEYS_ARRAY = | |
82 { | |
83 "checksum", KEY_VERSION, KEY_TITLE, "last modified", "expires", "homepage" , "licence" | |
84 }; | |
85 | 85 |
86 private final URL url; | 86 private final URL url; |
87 private final Type type; | 87 private final Type type; |
88 private final HashMap<String, String> meta = new HashMap<>(); | 88 private final HashMap<String, String> meta = new HashMap<>(); |
89 private final HashSet<String> filters = new HashSet<>(); | 89 private final HashSet<String> filters = new HashSet<>(); |
90 | 90 |
91 private boolean metaDataValid = true; | 91 private boolean metaDataValid = true; |
92 private boolean filtersValid = true; | 92 private boolean filtersValid = true; |
93 | |
94 static | |
95 { | |
96 Collections.addAll(ALLOWED_META_KEYS, ALLOWED_META_KEYS_ARRAY); | |
97 } | |
98 | 93 |
99 /** | 94 /** |
100 * Subscription type. | 95 * Subscription type. |
101 * | 96 * |
102 * @author René Jeschke <rene@adblockplus.org> | 97 * @author René Jeschke <rene@adblockplus.org> |
103 */ | 98 */ |
104 public enum Type | 99 public enum Type |
105 { | 100 { |
106 /** | 101 /** |
107 * Initiated from an URL, can be automatically downloaded. | 102 * Initiated from an URL, can be automatically downloaded. |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
395 } | 390 } |
396 catch (final NoSuchAlgorithmException e) | 391 catch (final NoSuchAlgorithmException e) |
397 { | 392 { |
398 throw new IOException("MD5 is unavailable: " + e.getMessage(), e); | 393 throw new IOException("MD5 is unavailable: " + e.getMessage(), e); |
399 } | 394 } |
400 } | 395 } |
401 | 396 |
402 public void serializeMetaData(final File metaFile) throws IOException | 397 public void serializeMetaData(final File metaFile) throws IOException |
403 { | 398 { |
404 this.putMeta(KEY_META_HASH, createMetaDataHash(this.meta)); | 399 this.putMeta(KEY_META_HASH, createMetaDataHash(this.meta)); |
405 try (final DataOutputStream metaOut = new DataOutputStream(new BufferedOutpu tStream( | 400 try (final DataOutputStream metaOut = new DataOutputStream(new BufferedOutpu tStream( |
anton
2017/06/02 07:39:56
here and below: what's the purpose of buffering be
diegocarloslima
2017/06/02 21:03:42
Basically, it's because GZIP Streams already hold
| |
406 new GZIPOutputStream(new FileOutputStream(metaFile))))) | 401 new GZIPOutputStream(new FileOutputStream(metaFile))))) |
407 { | 402 { |
408 metaOut.writeUTF(this.url != null ? this.url.toString() : ""); | 403 metaOut.writeUTF(this.url != null ? this.url.toString() : ""); |
409 metaOut.writeInt(this.meta.size()); | 404 metaOut.writeInt(this.meta.size()); |
410 for (final Entry<String, String> e : this.meta.entrySet()) | 405 for (final Entry<String, String> e : this.meta.entrySet()) |
411 { | 406 { |
412 metaOut.writeUTF(e.getKey()); | 407 metaOut.writeUTF(e.getKey()); |
413 metaOut.writeUTF(e.getValue()); | 408 metaOut.writeUTF(e.getValue()); |
414 } | 409 } |
415 } | 410 } |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
605 this.serializeMetaData(metaFile); | 600 this.serializeMetaData(metaFile); |
606 if (filtersChanged) | 601 if (filtersChanged) |
607 { | 602 { |
608 this.serializeFilters(filtersFile); | 603 this.serializeFilters(filtersFile); |
609 this.clearFilters(); | 604 this.clearFilters(); |
610 } | 605 } |
611 | 606 |
612 return filtersChanged; | 607 return filtersChanged; |
613 } | 608 } |
614 } | 609 } |
LEFT | RIGHT |