diff --git a/src/de/tudbut/tryumph/example/FileServer.java b/src/de/tudbut/tryumph/example/FileServer.java index 9b9d1ee..640d2c5 100644 --- a/src/de/tudbut/tryumph/example/FileServer.java +++ b/src/de/tudbut/tryumph/example/FileServer.java @@ -1,5 +1,6 @@ package de.tudbut.tryumph.example; +import java.io.File; import java.net.Socket; import org.w3c.dom.Document; @@ -58,28 +59,28 @@ public class FileServer implements IRequestCatcher, RequestHandler.Listener { private String fileContent(Request request, String s) { String r; - if(!s.endsWith(".html") && !s.endsWith(".htm")) { - r = request.context.file(s); + if(new File(s + "/index.html").exists()) + s += "/index.html"; + if(!s.endsWith(".html") && !s.endsWith(".htm") && !(new File(s).isDirectory())) { + r = request.context.file(s, data.getBoolean("autoindex") ? request.realPath : null); r = "
" + r.replace("<", "<").replace(">", ">") + "
"; } else - r = request.context.fileUTF(s); + r = request.context.fileUTF(s, data.getBoolean("autoindex") ? request.realPath : null); return r; } @GET - @Path(".*/") - public void onIndex(Request request, Callback res, Callback rej) { - res.call(new Response(request, fileContent(request, data.getString("dir") + request.realPath.replace("..", "") + "/index.html"), 200, "OK")); - } - - @GET - @Path("/.+") + @Path("/.*") public void onFile(Request request, Callback res, Callback rej) { if(request.realPath.equals("/style.css")) { res.call(new Response(request, request.context.file("style.css"), 200, "OK", "text/css")); return; } + if(request.realPath.matches("/.$|/./|/..$|/../")) { + res.call(new Response(request, "

" + request.realPath + " is an illegal path

", 400, "Bad request")); + return; + } res.call(new Response(request, fileContent(request, data.getString("dir") + request.realPath.replace("..", "")), 200, "OK")); } diff --git a/src/de/tudbut/tryumph/server/BrowserContext.java b/src/de/tudbut/tryumph/server/BrowserContext.java index 09838d7..9789729 100644 --- a/src/de/tudbut/tryumph/server/BrowserContext.java +++ b/src/de/tudbut/tryumph/server/BrowserContext.java @@ -3,6 +3,7 @@ package de.tudbut.tryumph.server; import static de.tudbut.async.Async.*; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -124,20 +125,36 @@ public class BrowserContext { private static final HashMap cache = new HashMap<>(); public String file(String file) { + return file(file, null); + } + public String fileUTF(String file) { + return fileUTF(file, null); + } + public String file(String file, String path) { if(cache.containsKey(file)) return cache.get(file); StringBuilder builder = new StringBuilder(); try { InputStream stream = requestCatcher.getClass().getClassLoader().getResourceAsStream(file); - if(stream == null) + if(stream == null) { + if(new File(file).isDirectory() && path != null) { + File[] files = new File(file).listFiles(); + builder.append(""); + return builder.toString(); + } stream = new FileInputStream(file); + int i = 0; + while((i = stream.read()) != -1) { + builder.append((char) i); + } - int i = 0; - while((i = stream.read()) != -1) { - builder.append((char) i); + stream.close(); } - stream.close(); if(!TryConfig.nocache) cache.put(file, builder.toString()); } catch (IOException e) { @@ -146,24 +163,35 @@ public class BrowserContext { } return builder.toString(); } - public String fileUTF(String file) { + public String fileUTF(String file, String path) { if(cache.containsKey(file)) return cache.get(file); String st = null; try { InputStream stream = requestCatcher.getClass().getClassLoader().getResourceAsStream(file); - if(stream == null) + if(stream == null) { + if(new File(file).isDirectory() && path != null) { + File[] files = new File(file).listFiles(); + StringBuilder builder = new StringBuilder(); + builder.append(""); + return builder.toString(); + } stream = new FileInputStream(file); - ByteArrayOutputStream s = new ByteArrayOutputStream(); + ByteArrayOutputStream s = new ByteArrayOutputStream(); - int i = 0; - while((i = stream.read()) != -1) { - s.write(i); + int i = 0; + while((i = stream.read()) != -1) { + s.write(i); + } + + stream.close(); + s.close(); + st = new String(s.toByteArray()); } - - stream.close(); - s.close(); - st = new String(s.toByteArray()); if(!TryConfig.nocache) cache.put(file, st); } catch (IOException e) {