summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHowaner <franzi.moos@googlemail.com>2014-08-31 12:59:04 +0200
committerHowaner <franzi.moos@googlemail.com>2014-08-31 12:59:04 +0200
commit7e5f22141f72fd1ad0ec7982df03f126e9c11244 (patch)
tree53bbef8ad0420f7d09bbe6b45aa9c07b28f2c4e2
parentMerge pull request #1355 from mc-server/fixes (diff)
downloadcuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.tar
cuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.tar.gz
cuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.tar.bz2
cuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.tar.lz
cuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.tar.xz
cuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.tar.zst
cuberite-7e5f22141f72fd1ad0ec7982df03f126e9c11244.zip
-rw-r--r--src/WebAdmin.cpp106
-rw-r--r--src/WebAdmin.h6
2 files changed, 102 insertions, 10 deletions
diff --git a/src/WebAdmin.cpp b/src/WebAdmin.cpp
index 23eedbd14..0646c9d1c 100644
--- a/src/WebAdmin.cpp
+++ b/src/WebAdmin.cpp
@@ -135,6 +135,20 @@ bool cWebAdmin::Start(void)
m_TemplateScript.Close();
}
+ if (!LoadLoginTemplate())
+ {
+ LOGWARN("Could not load WebAdmin login template \"%s\", using fallback template.", FILE_IO_PREFIX "webadmin/login_template.html");
+
+ // Sets the fallback template:
+ m_LoginTemplate = \
+ "<h1>MCServer WebAdmin</h1>" \
+ "<center>" \
+ "<form method='get' action='webadmin/'>" \
+ "<input type='submit' value='Log in'>" \
+ "</form>" \
+ "</center>";
+ }
+
m_IsRunning = m_HTTPServer.Start(*this);
return m_IsRunning;
}
@@ -159,6 +173,28 @@ void cWebAdmin::Stop(void)
+bool cWebAdmin::LoadLoginTemplate(void)
+{
+ cFile File(FILE_IO_PREFIX "webadmin/login_template.html", cFile::fmRead);
+ if (!File.IsOpen())
+ {
+ return false;
+ }
+
+ AString TemplateContent;
+ if (File.ReadRestOfFile(TemplateContent) == -1)
+ {
+ return false;
+ }
+
+ m_LoginTemplate = TemplateContent;
+ return true;
+}
+
+
+
+
+
void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request)
{
if (!a_Request.HasAuth())
@@ -298,17 +334,11 @@ void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPReque
void cWebAdmin::HandleRootRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request)
{
UNUSED(a_Request);
- static const char LoginForm[] = \
- "<h1>MCServer WebAdmin</h1>" \
- "<center>" \
- "<form method='get' action='webadmin/'>" \
- "<input type='submit' value='Log in'>" \
- "</form>" \
- "</center>";
+
cHTTPResponse Resp;
Resp.SetContentType("text/html");
a_Connection.Send(Resp);
- a_Connection.Send(LoginForm, sizeof(LoginForm) - 1);
+ a_Connection.Send(m_LoginTemplate);
a_Connection.FinishResponse();
}
@@ -528,7 +558,64 @@ void cWebAdmin::OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest &
}
else
{
- // TODO: Handle other requests
+ AString FileURL = URL;
+ std::replace(FileURL.begin(), FileURL.end(), '\\', '/');
+
+ // Remove all backsplashes on the first place:
+ if (FileURL[0] == '/')
+ {
+ size_t FirstCharToRead = FileURL.find_first_not_of('/');
+ if (FirstCharToRead != AString::npos)
+ {
+ FileURL = FileURL.substr(FirstCharToRead);
+ }
+ }
+
+ // Remove all "../" strings:
+ ReplaceString(FileURL, "../", "");
+
+ bool LoadedSuccessfull = false;
+ AString Content = "<h2>404 Not Found</h2>";
+ AString Path = Printf(FILE_IO_PREFIX "webadmin/files/%s", FileURL.c_str());
+ if (cFile::IsFile(Path))
+ {
+ cFile File(Path, cFile::fmRead);
+ AString FileContent;
+ if (File.IsOpen() && (File.ReadRestOfFile(FileContent) != -1))
+ {
+ LoadedSuccessfull = true;
+ Content = FileContent;
+ }
+ }
+
+ // Find content type (The currently method is very bad. We should change it later)
+ AString ContentType = "text/html";
+ size_t LastPointPosition = Path.find_last_of('.');
+ if (LoadedSuccessfull && (LastPointPosition != AString::npos) && (LastPointPosition < Path.length()))
+ {
+ const AString & FileExtension = StrToLower(Path.substr(LastPointPosition + 1));
+ if (FileExtension == "png") ContentType = "image/png";
+ if (FileExtension == "fif") ContentType = "image/fif";
+ if (FileExtension == "gif") ContentType = "image/gif";
+ if (FileExtension == "jpeg") ContentType = "image/jpeg";
+ if (FileExtension == "jpg") ContentType = "image/jpeg";
+ if (FileExtension == "jpe") ContentType = "image/jpeg";
+ if (FileExtension == "tiff") ContentType = "image/tiff";
+ if (FileExtension == "ico") ContentType = "image/ico";
+ if (FileExtension == "csv") ContentType = "text/comma-separated-values";
+ if (FileExtension == "css") ContentType = "text/css";
+ if (FileExtension == "js") ContentType = "text/javascript";
+ if (FileExtension == "txt") ContentType = "text/plain";
+ if (FileExtension == "rtx") ContentType = "text/richtext";
+ if (FileExtension == "xml") ContentType = "text/xml";
+ }
+
+ // Send the response:
+ cHTTPResponse Resp;
+ Resp.SetContentType(ContentType);
+ a_Connection.Send(Resp);
+ a_Connection.Send(Content);
+ a_Connection.FinishResponse();
}
// Delete any request data assigned to the request:
@@ -551,4 +638,3 @@ void cWebAdmin::cWebadminRequestData::OnBody(const char * a_Data, size_t a_Size)
-
diff --git a/src/WebAdmin.h b/src/WebAdmin.h
index aefc1d145..a59c69096 100644
--- a/src/WebAdmin.h
+++ b/src/WebAdmin.h
@@ -116,6 +116,9 @@ public:
/** Stops the HTTP server, if it was started. */
void Stop(void);
+ /** Loads the login template. Returns true if the loading success, false if not. */
+ bool LoadLoginTemplate(void);
+
void AddPlugin(cWebPlugin * a_Plugin);
void RemovePlugin(cWebPlugin * a_Plugin);
@@ -205,6 +208,9 @@ protected:
/** The Lua template script to provide templates: */
cLuaState m_TemplateScript;
+ /** The template who provide the login side: */
+ AString m_LoginTemplate;
+
/** The HTTP server which provides the underlying HTTP parsing, serialization and events */
cHTTPServer m_HTTPServer;