#23 Digest computation on packed 200 jars should only consider jar content

This commit is contained in:
Réda Housni Alaoui
2015-09-15 15:55:51 +02:00
parent c38ddc2305
commit 8076999d68
@@ -5,10 +5,7 @@
package com.threerings.getdown.data; package com.threerings.getdown.data;
import java.io.File; import java.io.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.util.Collections; import java.util.Collections;
@@ -16,12 +13,14 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
import com.samskivert.io.StreamUtil; import com.samskivert.io.StreamUtil;
import com.samskivert.util.StringUtil; import com.samskivert.util.StringUtil;
import com.threerings.getdown.util.FileUtil; import com.threerings.getdown.util.FileUtil;
import com.threerings.getdown.util.ProgressObserver; import com.threerings.getdown.util.ProgressObserver;
import sun.misc.IOUtils;
import static com.threerings.getdown.Log.log; import static com.threerings.getdown.Log.log;
@@ -42,8 +41,8 @@ public class Resource
_marker = new File(lpath + "v"); _marker = new File(lpath + "v");
_unpack = unpack; _unpack = unpack;
_isJar = lpath.endsWith(".jar"); _isJar = isJar(lpath);
_isPacked200Jar = (lpath.endsWith(".jar.pack") || lpath.endsWith(".jar.pack.gz")); _isPacked200Jar = isPacked200Jar(lpath);
if (_unpack && _isJar) { if (_unpack && _isJar) {
_unpacked = _local.getParentFile(); _unpacked = _local.getParentFile();
} else if(_unpack && _isPacked200Jar) { } else if(_unpack && _isPacked200Jar) {
@@ -218,6 +217,14 @@ public class Resource
return _path; return _path;
} }
private static boolean isJar(String path){
return path.endsWith(".jar");
}
private static boolean isPacked200Jar(String path){
return path.endsWith(".jar.pack") || path.endsWith(".jar.pack.gz");
}
/** /**
* Computes the MD5 hash of the supplied file. * Computes the MD5 hash of the supplied file.
*/ */
@@ -229,12 +236,25 @@ public class Resource
byte[] buffer = new byte[DIGEST_BUFFER_SIZE]; byte[] buffer = new byte[DIGEST_BUFFER_SIZE];
int read; int read;
boolean isJar = isJar(target.getPath());
boolean isPacked200Jar = isPacked200Jar(target.getPath());
// if this is a jar file, we need to compute the digest in a // if this is a jar file, we need to compute the digest in a
// timestamp and file order agnostic manner to properly correlate // timestamp and file order agnostic manner to properly correlate
// jardiff patched jars with their unpatched originals // jardiff patched jars with their unpatched originals
if (target.getPath().endsWith(".jar")) { if(isJar || isPacked200Jar){
JarFile jar = new JarFile(target); File tmpJarFile = null;
JarFile jar = null;
try { try {
// if this is a compressed jar file, we need to uncompress it to compute the jar file digest
if(isPacked200Jar){
tmpJarFile = new File(target.getPath() + ".tmp");
FileUtil.unpackPacked200Jar(target, tmpJarFile);
jar = new JarFile(tmpJarFile);
} else{
jar = new JarFile(target);
}
List<JarEntry> entries = Collections.list(jar.entries()); List<JarEntry> entries = Collections.list(jar.entries());
Collections.sort(entries, ENTRY_COMP); Collections.sort(entries, ENTRY_COMP);
@@ -261,12 +281,16 @@ public class Resource
} finally { } finally {
try { try {
jar.close(); if(jar != null){
jar.close();
}
} catch (IOException ioe) { } catch (IOException ioe) {
log.warning("Error closing jar [path=" + target + ", error=" + ioe + "]."); log.warning("Error closing jar [path=" + target + ", error=" + ioe + "].");
} }
if(tmpJarFile != null){
tmpJarFile.delete();
}
} }
} else { } else {
long totalSize = target.length(), position = 0L; long totalSize = target.length(), position = 0L;
FileInputStream fin = null; FileInputStream fin = null;