Use UUID in file url, not (encoded) file path.

This fixes a bunch of issues where funny characters in the file path
(spaces, unicode, etc) would cause the file server in this process to
respond with a 404 when asked for the file. The 404 would then cause
the push to fail.

Now we just use a UUID as an opaque and unambiguous identifier for each file.
This commit is contained in:
Shane Kilkelly 2019-07-04 14:14:01 +01:00
parent 1e3b973d9a
commit 88adce3a02
3 changed files with 13 additions and 16 deletions

View file

@ -5,13 +5,10 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import uk.ac.ic.wlgitbridge.data.filestore.RawFile;
import uk.ac.ic.wlgitbridge.data.filestore.RawDirectory;
import uk.ac.ic.wlgitbridge.util.Log;
import uk.ac.ic.wlgitbridge.util.Util;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@ -80,7 +77,7 @@ public class CandidateSnapshot implements AutoCloseable {
);
for (ServletFile file : files) {
if (file.isChanged()) {
file.writeToDisk(attsDirectory);
file.writeToDiskWithName(attsDirectory, file.getUniqueIdentifier());
}
}
}
@ -118,16 +115,8 @@ public class CandidateSnapshot implements AutoCloseable {
JsonObject jsonFile = new JsonObject();
jsonFile.addProperty("name", file.getPath());
if (file.isChanged()) {
String path = file.getPath();
String encodedPath;
try {
encodedPath = URLEncoder.encode(path, "UTF-8");
} catch (UnsupportedEncodingException e) {
// This should never happen
Log.error("Error while encoding file path: projectUrl={}, path={}", projectURL, path, e);
encodedPath = path;
}
String url = projectURL + "/" + encodedPath + "?key=" + postbackKey;
String identifier = file.getUniqueIdentifier();
String url = projectURL + "/" + identifier + "?key=" + postbackKey;
jsonFile.addProperty("url", url);
}
return jsonFile;

View file

@ -1,6 +1,7 @@
package uk.ac.ic.wlgitbridge.data;
import uk.ac.ic.wlgitbridge.data.filestore.RawFile;
import java.util.UUID;
/**
* Created by Winston on 21/02/15.
@ -9,12 +10,16 @@ public class ServletFile extends RawFile {
private final RawFile file;
private final boolean changed;
private String uuid;
public ServletFile(RawFile file, RawFile oldFile) {
this.file = file;
this.uuid = UUID.randomUUID().toString();
changed = !equals(oldFile);
}
public String getUniqueIdentifier() { return uuid; }
@Override
public String getPath() {
return file.getPath();
@ -38,5 +43,4 @@ public class ServletFile extends RawFile {
public String toString() {
return getPath();
}
}

View file

@ -20,7 +20,11 @@ public abstract class RawFile {
public abstract long size();
public final void writeToDisk(File directory) throws IOException {
File file = new File(directory, getPath());
writeToDiskWithName(directory, getPath());
}
public final void writeToDiskWithName(File directory, String name) throws IOException {
File file = new File(directory, name);
file.getParentFile().mkdirs();
file.createNewFile();
OutputStream out = new FileOutputStream(file);