mirror of
https://github.com/packwiz/packwiz-installer.git
synced 2025-04-19 21:16:30 +02:00
Manifest file loading, hashing, pack file loading
This commit is contained in:
parent
e32d98fb98
commit
c181a36edc
@ -8,8 +8,9 @@ plugins {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation 'commons-cli:commons-cli:1.4'
|
implementation 'commons-cli:commons-cli:1.4'
|
||||||
implementation 'com.moandjiezana.toml:toml4j:0.7.2'
|
implementation 'com.moandjiezana.toml:toml4j:0.7.2'
|
||||||
|
// TODO: Implement tests
|
||||||
//testImplementation 'junit:junit:4.12'
|
//testImplementation 'junit:junit:4.12'
|
||||||
// TODO: add GSON, as toml4j depends on it anyway
|
implementation 'com.google.code.gson:gson:2.8.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
@ -1,7 +1,20 @@
|
|||||||
package link.infra.packwiz.installer;
|
package link.infra.packwiz.installer;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonIOException;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
|
||||||
|
import link.infra.packwiz.installer.metadata.HashInputStream;
|
||||||
|
import link.infra.packwiz.installer.metadata.HashTypeAdapter;
|
||||||
|
import link.infra.packwiz.installer.metadata.ManifestFile;
|
||||||
|
import link.infra.packwiz.installer.request.HandlerManager;
|
||||||
import link.infra.packwiz.installer.ui.IUserInterface;
|
import link.infra.packwiz.installer.ui.IUserInterface;
|
||||||
import link.infra.packwiz.installer.ui.InstallProgress;
|
import link.infra.packwiz.installer.ui.InstallProgress;
|
||||||
|
|
||||||
@ -71,7 +84,42 @@ public class UpdateManager {
|
|||||||
|
|
||||||
protected void start() {
|
protected void start() {
|
||||||
this.checkOptions();
|
this.checkOptions();
|
||||||
|
|
||||||
|
ui.submitProgress(new InstallProgress("Loading manifest file..."));
|
||||||
|
Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new HashTypeAdapter()).create();
|
||||||
|
ManifestFile manifest;
|
||||||
|
try {
|
||||||
|
manifest = gson.fromJson(new FileReader(Paths.get(opts.packFolder, opts.manifestFile).toString()),
|
||||||
|
ManifestFile.class);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
manifest = new ManifestFile();
|
||||||
|
} catch (JsonSyntaxException | JsonIOException e) {
|
||||||
|
ui.handleExceptionAndExit(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ui.submitProgress(new InstallProgress("Loading pack file..."));
|
ui.submitProgress(new InstallProgress("Loading pack file..."));
|
||||||
|
HashInputStream packFileStream;
|
||||||
|
try {
|
||||||
|
packFileStream = new HashInputStream(HandlerManager.getFileInputStream(opts.downloadURI));
|
||||||
|
} catch (Exception e) {
|
||||||
|
ui.handleExceptionAndExit(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TODO: read file
|
||||||
|
try {
|
||||||
|
packFileStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
byte[] packFileHash = packFileStream.getHashValue();
|
||||||
|
if (packFileHash.equals(manifest.packFileHash)) {
|
||||||
|
// WOOO it's already up to date
|
||||||
|
// todo: --force?
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: save manifest file
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void checkOptions() {
|
protected void checkOptions() {
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package link.infra.packwiz.installer.metadata;
|
||||||
|
|
||||||
|
import java.io.FilterInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
public class HashInputStream extends FilterInputStream {
|
||||||
|
|
||||||
|
private MessageDigest md;
|
||||||
|
private byte[] output;
|
||||||
|
|
||||||
|
public HashInputStream(InputStream in) throws NoSuchAlgorithmException {
|
||||||
|
super(in);
|
||||||
|
md = MessageDigest.getInstance("SHA-256");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
int value = super.read();
|
||||||
|
if (value == -1) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
md.update((byte) value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
|
int bytesRead = super.read(b, off, len);
|
||||||
|
if (bytesRead > 0) {
|
||||||
|
md.update(b, off, len);
|
||||||
|
}
|
||||||
|
return bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws IOException {
|
||||||
|
throw new IOException("HashInputStream doesn't support reset()");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean markSupported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mark(int readlimit) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getHashValue() {
|
||||||
|
if (output == null) {
|
||||||
|
output = md.digest();
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package link.infra.packwiz.installer.metadata;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
|
import com.google.gson.JsonDeserializationContext;
|
||||||
|
import com.google.gson.JsonDeserializer;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.JsonPrimitive;
|
||||||
|
import com.google.gson.JsonSerializationContext;
|
||||||
|
import com.google.gson.JsonSerializer;
|
||||||
|
|
||||||
|
public class HashTypeAdapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
|
||||||
|
return new JsonPrimitive(printHexBinary(src));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||||
|
throws JsonParseException {
|
||||||
|
return parseHexBinary(json.getAsString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Why did Java remove this in 1.9????!
|
||||||
|
public static byte[] parseHexBinary(String s) {
|
||||||
|
final int len = s.length();
|
||||||
|
|
||||||
|
// "111" is not a valid hex encoding.
|
||||||
|
if( len%2 != 0 )
|
||||||
|
throw new IllegalArgumentException("hexBinary needs to be even-length: "+s);
|
||||||
|
|
||||||
|
byte[] out = new byte[len/2];
|
||||||
|
|
||||||
|
for( int i=0; i<len; i+=2 ) {
|
||||||
|
int h = hexToBin(s.charAt(i ));
|
||||||
|
int l = hexToBin(s.charAt(i+1));
|
||||||
|
if( h==-1 || l==-1 )
|
||||||
|
throw new IllegalArgumentException("contains illegal character for hexBinary: "+s);
|
||||||
|
|
||||||
|
out[i/2] = (byte)(h*16+l);
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int hexToBin( char ch ) {
|
||||||
|
if( '0'<=ch && ch<='9' ) return ch-'0';
|
||||||
|
if( 'A'<=ch && ch<='F' ) return ch-'A'+10;
|
||||||
|
if( 'a'<=ch && ch<='f' ) return ch-'a'+10;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final char[] hexCode = "0123456789ABCDEF".toCharArray();
|
||||||
|
|
||||||
|
public static String printHexBinary(byte[] data) {
|
||||||
|
StringBuilder r = new StringBuilder(data.length*2);
|
||||||
|
for ( byte b : data) {
|
||||||
|
r.append(hexCode[(b >> 4) & 0xF]);
|
||||||
|
r.append(hexCode[(b & 0xF)]);
|
||||||
|
}
|
||||||
|
return r.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package link.infra.packwiz.installer.metadata;
|
||||||
|
|
||||||
|
public class ManifestFile {
|
||||||
|
public byte[] packFileHash = null;
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package link.infra.packwiz.installer.metadata;
|
||||||
|
|
||||||
|
public class PackFile {
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user