diff options
Diffstat (limited to 'src/WebAdmin.h')
-rw-r--r-- | src/WebAdmin.h | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/src/WebAdmin.h b/src/WebAdmin.h new file mode 100644 index 000000000..c629d44ff --- /dev/null +++ b/src/WebAdmin.h @@ -0,0 +1,215 @@ + +// WebAdmin.h + +// Declares the cWebAdmin class representing the admin interface over http protocol, and related services (API) + +#pragma once + +#include "OSSupport/Socket.h" +#include "Bindings/LuaState.h" +#include "inifile/iniFile.h" +#include "HTTPServer/HTTPServer.h" +#include "HTTPServer/HTTPFormParser.h" + + + + + +// Disable MSVC warnings: +#if defined(_MSC_VER) + #pragma warning(push) + #pragma warning(disable:4355) // 'this' : used in base member initializer list +#endif + + + + + +// fwd: +class cEvent; +class cWebPlugin; + + + + + +// tolua_begin +struct HTTPFormData +{ + std::string Name; + std::string Value; + std::string Type; +} ; +// tolua_end + + + + +// tolua_begin +struct HTTPRequest +{ + typedef std::map< std::string, std::string > StringStringMap; + typedef std::map< std::string, HTTPFormData > FormDataMap; + + AString Method; + AString Path; + AString Username; + // tolua_end + + /// Parameters given in the URL, after the questionmark + StringStringMap Params; // >> EXPORTED IN MANUALBINDINGS << + + /// Parameters posted as a part of a form - either in the URL (GET method) or in the body (POST method) + StringStringMap PostParams; // >> EXPORTED IN MANUALBINDINGS << + + /// Same as PostParams + FormDataMap FormData; // >> EXPORTED IN MANUALBINDINGS << +} ; // tolua_export + + + + + +// tolua_begin +struct HTTPTemplateRequest +{ + HTTPRequest Request; +} ; +// tolua_end + + + + + +// tolua_begin +struct sWebAdminPage +{ + AString Content; + AString PluginName; + AString TabName; +}; +// tolua_end + + + + + +// tolua_begin +class cWebAdmin : + public cHTTPServer::cCallbacks +{ +public: + // tolua_end + + typedef std::list< cWebPlugin* > PluginList; + + + cWebAdmin(void); + ~cWebAdmin(); + + /// Initializes the object. Returns true if successfully initialized and ready to start + bool Init(void); + + /// Starts the HTTP server taking care of the admin. Returns true if successful + bool Start(void); + + void AddPlugin( cWebPlugin* a_Plugin ); + void RemovePlugin( cWebPlugin* a_Plugin ); + + // TODO: Convert this to the auto-locking callback mechanism used for looping players in worlds and such + PluginList GetPlugins() const { return m_Plugins; } // >> EXPORTED IN MANUALBINDINGS << + + // tolua_begin + + sWebAdminPage GetPage(const HTTPRequest & a_Request); + + /// Returns the contents of the default page - the list of plugins and players + AString GetDefaultPage(void); + + /// Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style) + AString GetBaseURL(const AString & a_URL); + + /// Escapes text passed into it, so it can be embedded into html. + static AString GetHTMLEscapedString(const AString & a_Input); + + // tolua_end + + /// Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style) + AString GetBaseURL(const AStringVector& a_URLSplit); + +protected: + /// Common base class for request body data handlers + class cRequestData + { + public: + virtual ~cRequestData() {} // Force a virtual destructor in all descendants + + /// Called when a new chunk of body data is received + virtual void OnBody(const char * a_Data, int a_Size) = 0; + } ; + + /// The body handler for requests in the "/webadmin" and "/~webadmin" paths + class cWebadminRequestData : + public cRequestData, + public cHTTPFormParser::cCallbacks + { + public: + cHTTPFormParser m_Form; + + + cWebadminRequestData(cHTTPRequest & a_Request) : + m_Form(a_Request, *this) + { + } + + // cRequestData overrides: + virtual void OnBody(const char * a_Data, int a_Size) override; + + // cHTTPFormParser::cCallbacks overrides. Files are ignored: + virtual void OnFileStart(cHTTPFormParser & a_Parser, const AString & a_FileName) override {} + virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, int a_Size) override {} + virtual void OnFileEnd(cHTTPFormParser & a_Parser) override {} + } ; + + + /// Set to true if Init() succeeds and the webadmin isn't to be disabled + bool m_IsInitialized; + + /// The webadmin.ini file, used for the settings and allowed logins + cIniFile m_IniFile; + + PluginList m_Plugins; + + /// The Lua template script to provide templates: + cLuaState m_TemplateScript; + + /// The HTTP server which provides the underlying HTTP parsing, serialization and events + cHTTPServer m_HTTPServer; + + + AString GetTemplate(void); + + /// Handles requests coming to the "/webadmin" or "/~webadmin" URLs + void HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request); + + /// Handles requests for the root page + void HandleRootRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request); + + // cHTTPServer::cCallbacks overrides: + virtual void OnRequestBegun (cHTTPConnection & a_Connection, cHTTPRequest & a_Request) override; + virtual void OnRequestBody (cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size) override; + virtual void OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & a_Request) override; +} ; // tolua_export + + + + + +// Revert MSVC warnings back to orignal state: +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + + + + |