From 0067e2cc65f5edddb72863e9e959f419c1f75ac8 Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Tue, 3 Sep 2013 10:28:56 -0400 Subject: [PATCH 1/2] Added socket parameter for access to remote IP. Started on schematic module. --- .../TotalFreedomMod/HTTPD/Module_dump.java | 5 +- .../TotalFreedomMod/HTTPD/Module_file.java | 5 +- .../TotalFreedomMod/HTTPD/Module_help.java | 5 +- .../TotalFreedomMod/HTTPD/Module_list.java | 5 +- .../HTTPD/Module_schematic.java | 86 +++++++++++++++++++ .../TotalFreedomMod/HTTPD/NanoHTTPD.java | 16 +++- .../HTTPD/TFM_HTTPD_Manager.java | 23 +++-- .../HTTPD/TFM_HTTPD_Module.java | 5 +- 8 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java index f3a85b65..a6a955c1 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java @@ -1,5 +1,6 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.net.Socket; import java.util.Map; import org.apache.commons.lang.StringUtils; @@ -7,9 +8,9 @@ import static me.StevenLawson.TotalFreedomMod.HTTPD.HTMLGenerationTools.*; public class Module_dump extends TFM_HTTPD_Module { - public Module_dump(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + public Module_dump(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files, Socket socket) { - super(uri, method, headers, params, files); + super(uri, method, headers, params, files, socket); } @Override diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java index b73d1795..1454848b 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java @@ -5,6 +5,7 @@ import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.net.Socket; import java.net.URLEncoder; import java.util.Arrays; import java.util.Collections; @@ -53,9 +54,9 @@ public class Module_file extends TFM_HTTPD_Module MIME_TYPES.put("class", "application/octet-stream"); } - public Module_file(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + public Module_file(String uri, Method method, Map headers, Map params, Map files, Socket socket) { - super(uri, method, headers, params, files); + super(uri, method, headers, params, files, socket); } private File getRootDir() diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java index ddd22f93..ea9db2be 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java @@ -1,5 +1,6 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.net.Socket; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,9 +21,9 @@ import static org.apache.commons.lang3.StringEscapeUtils.*; public class Module_help extends TFM_HTTPD_Module { - public Module_help(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + public Module_help(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files, Socket socket) { - super(uri, method, headers, params, files); + super(uri, method, headers, params, files, socket); } @Override diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java index 561a047e..4db7282f 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java @@ -1,5 +1,6 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.net.Socket; import java.util.Map; import me.StevenLawson.TotalFreedomMod.TFM_SuperadminList; import me.StevenLawson.TotalFreedomMod.TFM_Util; @@ -8,9 +9,9 @@ import org.bukkit.entity.Player; public class Module_list extends TFM_HTTPD_Module { - public Module_list(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + public Module_list(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files, Socket socket) { - super(uri, method, headers, params, files); + super(uri, method, headers, params, files, socket); } @Override diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java new file mode 100644 index 00000000..92bcf3db --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java @@ -0,0 +1,86 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.net.Socket; +import java.util.Map; +import org.apache.commons.lang.StringUtils; + +public class Module_schematic extends TFM_HTTPD_Module +{ + public Module_schematic(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files, Socket socket) + { + super(uri, method, headers, params, files, socket); + } + + @Override + public String getTitle() + { + return "TotalFreedomMod :: Schematic Manager"; + } + + @Override + public String getBody() + { + final StringBuilder out = new StringBuilder(); + + final String[] args = StringUtils.split(uri, "/"); + ModuleMode mode = ModuleMode.getMode(getArg(args, 1)); + + switch (mode) + { + case DOWNLOAD: + { + break; + } + case UPLOAD: + { + break; + } + default: + { + out.append(HTMLGenerationTools.paragraph("Invalid request mode.")); + break; + } + } + + return out.toString(); + } + + private static enum ModuleMode + { + UPLOAD("upload"), + DOWNLOAD("download"), + INVALID(null); + // + private final String modeName; + + private ModuleMode(String modeName) + { + this.modeName = modeName; + } + + @Override + public String toString() + { + return this.modeName; + } + + public static ModuleMode getMode(String needle) + { + for (ModuleMode mode : values()) + { + final String haystack = mode.toString(); + if (haystack != null && haystack.equalsIgnoreCase(needle)) + { + return mode; + } + } + return INVALID; + } + } + + private String getArg(String[] args, int index) + { + String out = (args.length == index + 1 ? args[index] : null); + return (out == null ? null : (out.trim().isEmpty() ? null : out.trim())); + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/NanoHTTPD.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/NanoHTTPD.java index 86ebabaa..ac7875c3 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/NanoHTTPD.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/NanoHTTPD.java @@ -134,7 +134,7 @@ public abstract class NanoHTTPD { outputStream = finalAccept.getOutputStream(); TempFileManager tempFileManager = tempFileManagerFactory.create(); - HTTPSession session = new HTTPSession(tempFileManager, inputStream, outputStream); + HTTPSession session = new HTTPSession(tempFileManager, inputStream, outputStream, finalAccept); while (!finalAccept.isClosed()) { session.execute(); @@ -200,7 +200,7 @@ public abstract class NanoHTTPD * @return HTTP response, see class Response for details */ public abstract Response serve(String uri, Method method, Map headers, Map parms, - Map files); + Map files, Socket socket); /** * Override this to customize the server. @@ -232,7 +232,8 @@ public abstract class NanoHTTPD Method method = session.getMethod(); Map parms = session.getParms(); Map headers = session.getHeaders(); - return serve(uri, method, headers, parms, files); + Socket socket = session.getSocket(); + return serve(uri, method, headers, parms, files, socket); } /** @@ -742,12 +743,14 @@ public abstract class NanoHTTPD private Method method; private Map parms; private Map headers; + private Socket socket; - public HTTPSession(TempFileManager tempFileManager, InputStream inputStream, OutputStream outputStream) + private HTTPSession(TempFileManager tempFileManager, InputStream inputStream, OutputStream outputStream, Socket socket) { this.tempFileManager = tempFileManager; this.inputStream = inputStream; this.outputStream = outputStream; + this.socket = socket; } public void execute() throws IOException @@ -1281,6 +1284,11 @@ public abstract class NanoHTTPD { return inputStream; } + + public final Socket getSocket() + { + return socket; + } } private static final class ResponseException extends Exception diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java index 8df08589..13efcb89 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java @@ -1,6 +1,7 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; import java.io.IOException; +import java.net.Socket; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -64,7 +65,8 @@ public class TFM_HTTPD_Manager DUMP(false, "dump"), HELP(true, "help"), LIST(true, "list"), - FILE(false, "file"); + FILE(false, "file"), + SCHEMATIC(false, "schematic"); private final boolean runOnBukkitThread; private final String name; @@ -110,7 +112,13 @@ public class TFM_HTTPD_Manager } @Override - public Response serve(final String uri, final Method method, final Map headers, final Map params, final Map files) + public Response serve( + final String uri, + final Method method, + final Map headers, + final Map params, + final Map files, + final Socket socket) { Response response = null; @@ -127,9 +135,9 @@ public class TFM_HTTPD_Manager switch (moduleType) { case HELP: - return new Module_help(uri, method, headers, params, files).getResponse(); + return new Module_help(uri, method, headers, params, files, socket).getResponse(); case LIST: - return new Module_list(uri, method, headers, params, files).getResponse(); + return new Module_list(uri, method, headers, params, files, socket).getResponse(); default: return null; } @@ -150,10 +158,13 @@ public class TFM_HTTPD_Manager switch (moduleType) { case DUMP: - response = new Module_dump(uri, method, headers, params, files).getResponse(); + response = new Module_dump(uri, method, headers, params, files, socket).getResponse(); + break; + case SCHEMATIC: + response = new Module_schematic(uri, method, headers, params, files, socket).getResponse(); break; default: - response = new Module_file(uri, method, headers, params, files).getResponse(); + response = new Module_file(uri, method, headers, params, files, socket).getResponse(); } } diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java index 3dfcb364..2b11743d 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java @@ -1,5 +1,6 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.net.Socket; import java.util.Map; import me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.*; @@ -10,14 +11,16 @@ public abstract class TFM_HTTPD_Module protected final Map headers; protected final Map params; protected final Map files; + protected final Socket socket; - public TFM_HTTPD_Module(String uri, Method method, Map headers, Map params, Map files) + public TFM_HTTPD_Module(String uri, Method method, Map headers, Map params, Map files, Socket socket) { this.uri = uri; this.method = method; this.headers = headers; this.params = params; this.files = files; + this.socket = socket; } public String getBody() From 41cca7cd6ad9b83b358fb60646bfd005e9408635 Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Tue, 3 Sep 2013 15:20:28 -0400 Subject: [PATCH 2/2] Working on schematic uploader. Sorry for not branching out on this, but its almost done. --- .../HTTPD/HTMLGenerationTools.java | 4 +- .../TotalFreedomMod/HTTPD/Module_dump.java | 68 +++++++++ .../TotalFreedomMod/HTTPD/Module_file.java | 2 +- .../HTTPD/Module_schematic.java | 134 +++++++++++++++++- .../HTTPD/TFM_HTTPD_Manager.java | 44 +++++- 5 files changed, 246 insertions(+), 6 deletions(-) diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java index d970b949..35c869f7 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java @@ -1,7 +1,7 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.Map; import static org.apache.commons.lang3.StringEscapeUtils.*; @@ -41,7 +41,7 @@ public class HTMLGenerationTools return output.toString(); } - public static String list(List list) + public static String list(Collection list) { StringBuilder output = new StringBuilder(); diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java index a6a955c1..57ca4343 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java @@ -1,29 +1,64 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.io.File; +import java.io.IOException; import java.net.Socket; +import java.util.Iterator; import java.util.Map; import org.apache.commons.lang.StringUtils; +import org.apache.commons.io.FileUtils; +import me.StevenLawson.TotalFreedomMod.TFM_Log; import static me.StevenLawson.TotalFreedomMod.HTTPD.HTMLGenerationTools.*; public class Module_dump extends TFM_HTTPD_Module { + private File echoFile = null; + private final String body; + public Module_dump(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files, Socket socket) { super(uri, method, headers, params, files, socket); + + //Body needs to be computed before getResponse, so we know if a text response or a file echo is needed. + this.body = body(); + } + + @Override + public NanoHTTPD.Response getResponse() + { + String echo = params.get("echo"); + boolean doEcho = echo != null && ((echo = echo.toLowerCase().trim()).equalsIgnoreCase("true") || echo.equalsIgnoreCase("1")); + + if (doEcho && this.echoFile != null && this.echoFile.exists()) + { + return TFM_HTTPD_Manager.serveFileBasic(this.echoFile); + } + else + { + return super.getResponse(); + } } @Override public String getBody() + { + return body; + } + + private String body() { StringBuilder responseBody = new StringBuilder(); + String remoteAddress = socket.getInetAddress().getHostAddress(); + String[] args = StringUtils.split(uri, "/"); responseBody .append(paragraph("URI: " + uri)) .append(paragraph("args (Length: " + args.length + "): " + StringUtils.join(args, ","))) .append(paragraph("Method: " + method.toString())) + .append(paragraph("Remote Address: " + remoteAddress)) .append(paragraph("Headers:")) .append(list(headers)) .append(paragraph("Params:")) @@ -31,6 +66,39 @@ public class Module_dump extends TFM_HTTPD_Module .append(paragraph("Files:")) .append(list(files)); + Iterator> it = files.entrySet().iterator(); + while (it.hasNext()) + { + Map.Entry entry = it.next(); + String formName = entry.getKey(); + String tempFileName = entry.getValue(); + String origFileName = params.get(formName); + + File tempFile = new File(tempFileName); + if (tempFile.exists()) + { + this.echoFile = tempFile; + + if (origFileName.contains("../")) + { + continue; + } + + String targetFileName = "./public_html/uploads/" + origFileName; + + File targetFile = new File(targetFileName); + + try + { + FileUtils.copyFile(tempFile, targetFile); + } + catch (IOException ex) + { + TFM_Log.severe(ex); + } + } + } + return responseBody.toString(); } diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java index 1454848b..6bfd9ae5 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java @@ -23,7 +23,7 @@ import me.StevenLawson.TotalFreedomMod.TFM_ConfigEntry; public class Module_file extends TFM_HTTPD_Module { private final File rootDir = new File(TFM_ConfigEntry.HTTPD_PUBLIC_FOLDER.getString()); - private static final Map MIME_TYPES = new HashMap(); + public static final Map MIME_TYPES = new HashMap(); static { diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java index 92bcf3db..0e3e9354 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_schematic.java @@ -1,11 +1,31 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.io.File; +import java.io.IOException; import java.net.Socket; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Map; +import java.util.regex.Pattern; +import me.StevenLawson.TotalFreedomMod.TFM_Log; +import me.StevenLawson.TotalFreedomMod.TFM_Superadmin; +import me.StevenLawson.TotalFreedomMod.TFM_SuperadminList; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringEscapeUtils; public class Module_schematic extends TFM_HTTPD_Module { + private static final File SCHEMATIC_FOLDER = new File("./plugins/WorldEdit/schematics/"); + private static final String REQUEST_FORM_FILE_ELEMENT_NAME = "schematicFile"; + private static final Pattern SCHEMATIC_FILENAME = Pattern.compile("^[a-zA-Z0-9]+\\.schematic$"); + private static final String[] SCHEMATIC_FILTER = new String[] + { + "schematic" + }; + public Module_schematic(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files, Socket socket) { super(uri, method, headers, params, files, socket); @@ -23,16 +43,55 @@ public class Module_schematic extends TFM_HTTPD_Module final StringBuilder out = new StringBuilder(); final String[] args = StringUtils.split(uri, "/"); - ModuleMode mode = ModuleMode.getMode(getArg(args, 1)); + final ModuleMode mode = ModuleMode.getMode(getArg(args, 1)); switch (mode) { + case LIST: + { + Collection schematics = FileUtils.listFiles(SCHEMATIC_FOLDER, SCHEMATIC_FILTER, false); + + final List schematicsFormatted = new ArrayList(); + for (File schematic : schematics) + { + String filename = StringEscapeUtils.escapeHtml4(schematic.getName()); + schematicsFormatted.add("
  • " + filename + "
  • "); + } + + Collections.sort(schematicsFormatted); + + out + .append(HTMLGenerationTools.heading("Schematics:", 1)) + .append("
      ") + .append(StringUtils.join(schematicsFormatted, "\r\n")) + .append("
    "); + + break; + } case DOWNLOAD: { + out.append(HTMLGenerationTools.paragraph("Not yet implemented - Download: " + params.get("schematicName"))); break; } case UPLOAD: { + final String remoteAddress = socket.getInetAddress().getHostAddress(); + if (!isAuthorized(remoteAddress)) + { + out.append(HTMLGenerationTools.paragraph("Schematic upload access denied: Your IP, " + remoteAddress + ", is not registered to a superadmin on this server.")); + } + else + { + try + { + uploadSchematic(); + out.append(HTMLGenerationTools.paragraph("Schematic uploaded successfully.")); + } + catch (SchematicUploadException ex) + { + out.append(HTMLGenerationTools.paragraph("Error uploading schematic.")); + } + } break; } default: @@ -45,8 +104,81 @@ public class Module_schematic extends TFM_HTTPD_Module return out.toString(); } + private boolean uploadSchematic() throws SchematicUploadException + { + final String tempFileName = files.get(REQUEST_FORM_FILE_ELEMENT_NAME); + if (tempFileName != null) + { + final String origFileName = params.get(REQUEST_FORM_FILE_ELEMENT_NAME).trim(); + if (origFileName == null || origFileName.trim().isEmpty()) + { + throw new SchematicUploadException("Can't resolve original file name."); + } + else + { + final File tempFile = new File(tempFileName); + if (tempFile.exists()) + { + if (SCHEMATIC_FILENAME.matcher(origFileName).find()) + { + final File targetFile = new File(SCHEMATIC_FOLDER.getPath(), origFileName); + if (targetFile.exists()) + { + throw new SchematicUploadException("Schematic exists on the server already."); + } + else + { + try + { + FileUtils.copyFile(tempFile, targetFile); + } + catch (IOException ex) + { + TFM_Log.severe(ex); + throw new SchematicUploadException(); + } + } + } + else + { + throw new SchematicUploadException("File name must be alphanumeric with a \".schematic\" extension."); + } + } + else + { + throw new SchematicUploadException(); + } + } + } + else + { + throw new SchematicUploadException("No file transmitted to server."); + } + + return true; + } + + private static class SchematicUploadException extends Exception + { + public SchematicUploadException() + { + } + + public SchematicUploadException(String string) + { + super(string); + } + } + + private boolean isAuthorized(String remoteAddress) + { + TFM_Superadmin entry = TFM_SuperadminList.getAdminEntryByIP(remoteAddress); + return entry != null && entry.isActivated(); + } + private static enum ModuleMode { + LIST("list"), UPLOAD("upload"), DOWNLOAD("download"), INVALID(null); diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java index 13efcb89..49626e92 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java @@ -1,11 +1,16 @@ package me.StevenLawson.TotalFreedomMod.HTTPD; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.net.Socket; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.Future; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.MIME_PLAINTEXT; +import me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.Response; import me.StevenLawson.TotalFreedomMod.TFM_ConfigEntry; import me.StevenLawson.TotalFreedomMod.TFM_Log; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; @@ -14,6 +19,8 @@ import org.bukkit.Bukkit; public class TFM_HTTPD_Manager { + private static final Pattern EXT_REGEX = Pattern.compile("\\.([^\\.\\s]+)$"); + // public static final int PORT = TFM_ConfigEntry.HTTPD_PORT.getInteger(); // private final TFM_HTTPD httpd = new TFM_HTTPD(PORT); @@ -158,7 +165,8 @@ public class TFM_HTTPD_Manager switch (moduleType) { case DUMP: - response = new Module_dump(uri, method, headers, params, files, socket).getResponse(); + //response = new Module_dump(uri, method, headers, params, files, socket).getResponse(); + response = new Response(Response.Status.OK, MIME_PLAINTEXT, "The DUMP module is disabled. It is intended for debugging use only."); break; case SCHEMATIC: response = new Module_schematic(uri, method, headers, params, files, socket).getResponse(); @@ -168,7 +176,6 @@ public class TFM_HTTPD_Manager } } - if (response == null) { return new Response(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "Error 404: Not Found - The requested resource was not found on this server."); @@ -180,6 +187,39 @@ public class TFM_HTTPD_Manager } } + public static Response serveFileBasic(File file) + { + Response response = null; + + if (file != null && file.exists()) + { + try + { + String mimetype = null; + + Matcher matcher = EXT_REGEX.matcher(file.getCanonicalPath()); + if (matcher.find()) + { + mimetype = Module_file.MIME_TYPES.get(matcher.group(1)); + } + + if (mimetype == null || mimetype.trim().isEmpty()) + { + mimetype = NanoHTTPD.MIME_DEFAULT_BINARY; + } + + response = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, mimetype, new FileInputStream(file)); + response.addHeader("Content-Length", "" + file.length()); + } + catch (IOException ex) + { + TFM_Log.severe(ex); + } + } + + return response; + } + public static TFM_HTTPD_Manager getInstance() { return TFM_HTTPDManagerHolder.INSTANCE;