From 3819c57adf6d97ac285179d6c79a7777678d5cb9 Mon Sep 17 00:00:00 2001 From: Steven Lawson Date: Tue, 27 Aug 2013 20:20:11 -0400 Subject: [PATCH] Finished file serving module (default). Added config options. --- src/config.yml | 6 +- .../TotalFreedomMod/HTTPD/Module_file.java | 6 +- .../TotalFreedomMod/HTTPD/Module_help.java | 4 +- .../HTTPD/TFM_HTTPD_Manager.java | 90 +++++++++++++++---- .../TotalFreedomMod/TFM_ConfigEntry.java | 3 + 5 files changed, 88 insertions(+), 21 deletions(-) diff --git a/src/config.yml b/src/config.yml index 23e3b2e6..dd514dce 100644 --- a/src/config.yml +++ b/src/config.yml @@ -154,7 +154,6 @@ unbannable_usernames: - grumm - cavemanfilms - # TwitterBot - Used to allow superadmins to verify themselves using twitter twitterbot_enabled: false twitterbot_url: '' @@ -169,3 +168,8 @@ logs_register_url: '' # Mojang service checker service_checker_url: http://status.mojang.com/check + +# HTTPD +httpd_enabled: true +httpd_public_folder: ./public_html +httpd_port: 28966 diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java index 6d53f703..b73d1795 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_file.java @@ -14,10 +14,14 @@ import java.util.Map; import java.util.StringTokenizer; import static me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.*; +import me.StevenLawson.TotalFreedomMod.TFM_ConfigEntry; +/* + * This class was adapted from https://github.com/NanoHttpd/nanohttpd/blob/master/webserver/src/main/java/fi/iki/elonen/SimpleWebServer.java + */ public class Module_file extends TFM_HTTPD_Module { - private final File rootDir = new File("./public/"); + private final File rootDir = new File(TFM_ConfigEntry.HTTPD_PUBLIC_FOLDER.getString()); private static final Map MIME_TYPES = new HashMap(); static diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java index 79e3fa30..16c4f15a 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java @@ -36,7 +36,7 @@ public class Module_help extends TFM_HTTPD_Module return paragraph("Error loading commands."); } - responseBody.append(heading("Command Help Index", 1)); + responseBody.append(heading("Command Help", 1)).append(paragraph("This page is an automatically generated listing of all plugin commands that are currently live on the server. Please note that it does not include vanilla server commands.")); final Map> commandsByPlugin = new HashMap>(); @@ -48,7 +48,7 @@ public class Module_help extends TFM_HTTPD_Module final Command command = entry.getValue(); if (name.equalsIgnoreCase(command.getName())) { - String pluginName = "Bukkit"; + String pluginName = "Bukkit Default"; if (command instanceof PluginIdentifiableCommand) { pluginName = ((PluginIdentifiableCommand) command).getPlugin().getName(); diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java index 4fc1febc..8df08589 100644 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.Future; +import static me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.MIME_PLAINTEXT; +import me.StevenLawson.TotalFreedomMod.TFM_ConfigEntry; import me.StevenLawson.TotalFreedomMod.TFM_Log; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; import org.apache.commons.lang.StringUtils; @@ -11,7 +13,7 @@ import org.bukkit.Bukkit; public class TFM_HTTPD_Manager { - public static final int PORT = 8748; + public static final int PORT = TFM_ConfigEntry.HTTPD_PORT.getInteger(); // private final TFM_HTTPD httpd = new TFM_HTTPD(PORT); @@ -21,6 +23,11 @@ public class TFM_HTTPD_Manager public void start() { + if (!TFM_ConfigEntry.HTTPD_ENABLED.getBoolean()) + { + return; + } + try { httpd.start(); @@ -42,11 +49,54 @@ public class TFM_HTTPD_Manager public void stop() { + if (!TFM_ConfigEntry.HTTPD_ENABLED.getBoolean()) + { + return; + } + httpd.stop(); TFM_Log.info("TFM HTTPd stopped."); } + private static enum ModuleType + { + DUMP(false, "dump"), + HELP(true, "help"), + LIST(true, "list"), + FILE(false, "file"); + private final boolean runOnBukkitThread; + private final String name; + + private ModuleType(boolean runOnBukkitThread, String name) + { + this.runOnBukkitThread = runOnBukkitThread; + this.name = name; + } + + public boolean isRunOnBukkitThread() + { + return runOnBukkitThread; + } + + public String getName() + { + return name; + } + + private static ModuleType getByName(String needle) + { + for (ModuleType type : values()) + { + if (type.getName().equalsIgnoreCase(needle)) + { + return type; + } + } + return FILE; + } + } + private static class TFM_HTTPD extends NanoHTTPD { public TFM_HTTPD(int port) @@ -65,30 +115,24 @@ public class TFM_HTTPD_Manager Response response = null; final String[] args = StringUtils.split(uri, "/"); - if (args.length >= 1) + final ModuleType moduleType = args.length >= 1 ? ModuleType.getByName(args[0]) : ModuleType.FILE; + + if (moduleType.isRunOnBukkitThread()) { Future responseCall = Bukkit.getScheduler().callSyncMethod(TotalFreedomMod.plugin, new Callable() { @Override public Response call() throws Exception { - if ("dump".equalsIgnoreCase(args[0])) + switch (moduleType) { - return new Module_dump(uri, method, headers, params, files).getResponse(); + case HELP: + return new Module_help(uri, method, headers, params, files).getResponse(); + case LIST: + return new Module_list(uri, method, headers, params, files).getResponse(); + default: + return null; } - else if ("list".equalsIgnoreCase(args[0])) - { - return new Module_list(uri, method, headers, params, files).getResponse(); - } - else if ("help".equalsIgnoreCase(args[0])) - { - return new Module_help(uri, method, headers, params, files).getResponse(); - } - else if ("public".equalsIgnoreCase(args[0])) - { - return new Module_file(uri, method, headers, params, files).getResponse(); - } - return null; } }); @@ -101,6 +145,18 @@ public class TFM_HTTPD_Manager TFM_Log.severe(ex); } } + else + { + switch (moduleType) + { + case DUMP: + response = new Module_dump(uri, method, headers, params, files).getResponse(); + break; + default: + response = new Module_file(uri, method, headers, params, files).getResponse(); + } + } + if (response == null) { diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java b/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java index e3dafb41..15a663c7 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java @@ -31,6 +31,7 @@ public enum TFM_ConfigEntry PROTECTED_AREAS_ENABLED(Boolean.class, "protected_areas_enabled"), TOSSMOB_ENABLED(Boolean.class, "tossmob_enabled"), TWITTERBOT_ENABLED(Boolean.class, "twitterbot_enabled"), + HTTPD_ENABLED(Boolean.class, "httpd_enabled"), // AUTO_PROTECT_RADIUS(Double.class, "auto_protect_radius"), EXPLOSIVE_RADIUS(Double.class, "explosive_radius"), @@ -40,6 +41,7 @@ public enum TFM_ConfigEntry MOB_LIMITER_MAX(Integer.class, "mob_limiter_max"), NUKE_MONITOR_COUNT_BREAK(Integer.class, "nuke_monitor_count_break"), NUKE_MONITOR_COUNT_PLACE(Integer.class, "nuke_monitor_count_place"), + HTTPD_PORT(Integer.class, "httpd_port"), // FLATLANDS_GENERATION_PARAMS(String.class, "flatlands_generation_params"), LOGS_REGISTER_PASSWORD(String.class, "logs_register_password"), @@ -47,6 +49,7 @@ public enum TFM_ConfigEntry SERVICE_CHECKER_URL(String.class, "service_checker_url"), TWITTERBOT_SECRET(String.class, "twitterbot_secret"), TWITTERBOT_URL(String.class, "twitterbot_url"), + HTTPD_PUBLIC_FOLDER(String.class, "httpd_public_folder"), // BLOCKED_COMMANDS(List.class, "blocked_commands"), HOST_SENDER_NAMES(List.class, "host_sender_names"),