... |
... |
@@ -2127,8 +2127,6 @@ function UpdatePatch(patch) { |
2127
|
2127
|
}
|
2128
|
2128
|
break;
|
2129
|
2129
|
case "finalURL":
|
2130
|
|
- case "hashFunction":
|
2131
|
|
- case "hashValue":
|
2132
|
2130
|
case "state":
|
2133
|
2131
|
case "type":
|
2134
|
2132
|
case "URL":
|
... |
... |
@@ -2148,8 +2146,6 @@ UpdatePatch.prototype = { |
2148
|
2146
|
// over writing nsIUpdatePatch attributes.
|
2149
|
2147
|
_attrNames: [
|
2150
|
2148
|
"errorCode",
|
2151
|
|
- "hashFunction",
|
2152
|
|
- "hashValue",
|
2153
|
2149
|
"finalURL",
|
2154
|
2150
|
"selected",
|
2155
|
2151
|
"size",
|
... |
... |
@@ -2163,8 +2159,6 @@ UpdatePatch.prototype = { |
2163
|
2159
|
*/
|
2164
|
2160
|
serialize: function UpdatePatch_serialize(updates) {
|
2165
|
2161
|
var patch = updates.createElementNS(URI_UPDATE_NS, "patch");
|
2166
|
|
- patch.setAttribute("hashFunction", this.hashFunction);
|
2167
|
|
- patch.setAttribute("hashValue", this.hashValue);
|
2168
|
2162
|
patch.setAttribute("size", this.size);
|
2169
|
2163
|
patch.setAttribute("type", this.type);
|
2170
|
2164
|
patch.setAttribute("URL", this.URL);
|
... |
... |
@@ -3737,18 +3731,20 @@ UpdateService.prototype = { |
3737
|
3731
|
|
3738
|
3732
|
switch (aUpdate.type) {
|
3739
|
3733
|
case "major":
|
3740
|
|
- if (!majorUpdate) {
|
|
3734
|
+ if (!majorUpdate || majorUpdate.unsupported) {
|
3741
|
3735
|
majorUpdate = aUpdate;
|
3742
|
3736
|
} else if (
|
|
3737
|
+ !aUpdate.unsupported &&
|
3743
|
3738
|
vc.compare(majorUpdate.appVersion, aUpdate.appVersion) <= 0
|
3744
|
3739
|
) {
|
3745
|
3740
|
majorUpdate = aUpdate;
|
3746
|
3741
|
}
|
3747
|
3742
|
break;
|
3748
|
3743
|
case "minor":
|
3749
|
|
- if (!minorUpdate) {
|
|
3744
|
+ if (!minorUpdate || minorUpdate.unsupported) {
|
3750
|
3745
|
minorUpdate = aUpdate;
|
3751
|
3746
|
} else if (
|
|
3747
|
+ !aUpdate.unsupported &&
|
3752
|
3748
|
vc.compare(minorUpdate.appVersion, aUpdate.appVersion) <= 0
|
3753
|
3749
|
) {
|
3754
|
3750
|
minorUpdate = aUpdate;
|
... |
... |
@@ -5792,56 +5788,7 @@ Downloader.prototype = { |
5792
|
5788
|
}
|
5793
|
5789
|
|
5794
|
5790
|
LOG("Downloader:_verifyDownload downloaded size == expected size.");
|
5795
|
|
- let fileStream = Cc[
|
5796
|
|
- "@mozilla.org/network/file-input-stream;1"
|
5797
|
|
- ].createInstance(Ci.nsIFileInputStream);
|
5798
|
|
- fileStream.init(
|
5799
|
|
- destination,
|
5800
|
|
- FileUtils.MODE_RDONLY,
|
5801
|
|
- FileUtils.PERMS_FILE,
|
5802
|
|
- 0
|
5803
|
|
- );
|
5804
|
|
-
|
5805
|
|
- let digest;
|
5806
|
|
- try {
|
5807
|
|
- let hash = Cc["@mozilla.org/security/hash;1"].createInstance(
|
5808
|
|
- Ci.nsICryptoHash
|
5809
|
|
- );
|
5810
|
|
- var hashFunction =
|
5811
|
|
- Ci.nsICryptoHash[this._patch.hashFunction.toUpperCase()];
|
5812
|
|
- if (hashFunction == undefined) {
|
5813
|
|
- throw Components.Exception("", Cr.NS_ERROR_UNEXPECTED);
|
5814
|
|
- }
|
5815
|
|
- hash.init(hashFunction);
|
5816
|
|
- hash.updateFromStream(fileStream, -1);
|
5817
|
|
- // NOTE: For now, we assume that the format of _patch.hashValue is hex
|
5818
|
|
- // encoded binary (such as what is typically output by programs like
|
5819
|
|
- // sha1sum). In the future, this may change to base64 depending on how
|
5820
|
|
- // we choose to compute these hashes.
|
5821
|
|
- hash = hash.finish(false);
|
5822
|
|
- digest = Array.from(hash, (c, i) =>
|
5823
|
|
- hash.charCodeAt(i).toString(16).padStart(2, "0")
|
5824
|
|
- ).join("");
|
5825
|
|
- } catch (e) {
|
5826
|
|
- LOG(
|
5827
|
|
- "Downloader:_verifyDownload - failed to compute hash of the downloaded update archive"
|
5828
|
|
- );
|
5829
|
|
- digest = "";
|
5830
|
|
- }
|
5831
|
|
-
|
5832
|
|
- fileStream.close();
|
5833
|
|
-
|
5834
|
|
- if (digest == this._patch.hashValue.toLowerCase()) {
|
5835
|
|
- LOG("Downloader:_verifyDownload hashes match.");
|
5836
|
|
- return true;
|
5837
|
|
- }
|
5838
|
|
-
|
5839
|
|
- LOG("Downloader:_verifyDownload hashes do not match. ");
|
5840
|
|
- AUSTLMY.pingDownloadCode(
|
5841
|
|
- this.isCompleteUpdate,
|
5842
|
|
- AUSTLMY.DWNLD_ERR_VERIFY_NO_HASH_MATCH
|
5843
|
|
- );
|
5844
|
|
- return false;
|
|
5791
|
+ return true;
|
5845
|
5792
|
},
|
5846
|
5793
|
|
5847
|
5794
|
/**
|
... |
... |
@@ -6477,9 +6424,6 @@ Downloader.prototype = { |
6477
|
6424
|
" is higher than patch size: " +
|
6478
|
6425
|
this._patch.size
|
6479
|
6426
|
);
|
6480
|
|
- // It's important that we use a different code than
|
6481
|
|
- // NS_ERROR_CORRUPTED_CONTENT so that tests can verify the difference
|
6482
|
|
- // between a hash error and a wrong download error.
|
6483
|
6427
|
AUSTLMY.pingDownloadCode(
|
6484
|
6428
|
this.isCompleteUpdate,
|
6485
|
6429
|
AUSTLMY.DWNLD_ERR_PATCH_SIZE_LARGER
|
... |
... |
@@ -6498,9 +6442,6 @@ Downloader.prototype = { |
6498
|
6442
|
" is not equal to expected patch size: " +
|
6499
|
6443
|
this._patch.size
|
6500
|
6444
|
);
|
6501
|
|
- // It's important that we use a different code than
|
6502
|
|
- // NS_ERROR_CORRUPTED_CONTENT so that tests can verify the difference
|
6503
|
|
- // between a hash error and a wrong download error.
|
6504
|
6445
|
AUSTLMY.pingDownloadCode(
|
6505
|
6446
|
this.isCompleteUpdate,
|
6506
|
6447
|
AUSTLMY.DWNLD_ERR_PATCH_SIZE_NOT_EQUAL
|