version 0.3.0
[fms.git] / src / http / fmshttprequesthandlerfactory.cpp
diff --git a/src/http/fmshttprequesthandlerfactory.cpp b/src/http/fmshttprequesthandlerfactory.cpp
new file mode 100644 (file)
index 0000000..819b02b
--- /dev/null
@@ -0,0 +1,93 @@
+#include "../../include/http/fmshttprequesthandlerfactory.h"\r
+#include "../../include/option.h"\r
+#include "../../include/stringfunctions.h"\r
+#include "../../include/http/pages/homepage.h"\r
+#include "../../include/http/pages/optionspage.h"\r
+#include "../../include/http/pages/createidentitypage.h"\r
+#include "../../include/http/pages/localidentitiespage.h"\r
+#include "../../include/http/pages/confirmpage.h"\r
+#include "../../include/http/pages/showcaptchapage.h"\r
+#include "../../include/http/pages/announceidentitypage.h"\r
+#include "../../include/http/pages/execquerypage.h"\r
+#include "../../include/http/pages/boardspage.h"\r
+#include "../../include/http/pages/insertedfilespage.h"\r
+#include "../../include/http/pages/addpeerpage.h"\r
+#include "../../include/http/pages/peerdetailspage.h"\r
+#include "../../include/http/pages/controlboardpage.h"\r
+#include "../../include/http/pages/peermaintenancepage.h"\r
+#include "../../include/http/pages/peertrustpage.h"\r
+\r
+FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory()\r
+{\r
+       // set template\r
+       std::string templatestr="<html><head></head><body><a href=\"home.htm\">Home</a><br><h1>Could not open template.htm!  Place in program directory and restart!</h1><br>[CONTENT]</body></html>";\r
+       FILE *infile=fopen("template.htm","r+b");\r
+       if(infile)\r
+       {\r
+               fseek(infile,0,SEEK_END);\r
+               long len=ftell(infile);\r
+               std::vector<char> data(len,0);\r
+               fseek(infile,0,SEEK_SET);\r
+               fread(&data[0],1,len,infile);\r
+               fclose(infile);\r
+               templatestr.assign(data.begin(),data.end());\r
+       }\r
+       else\r
+       {\r
+               m_log->error("HTTPThread::HTTPThread could not open template.htm");\r
+       }\r
+\r
+       // push back page handlers\r
+       m_pagehandlers.push_back(new OptionsPage(templatestr));\r
+       m_pagehandlers.push_back(new CreateIdentityPage(templatestr));\r
+       m_pagehandlers.push_back(new LocalIdentitiesPage(templatestr));\r
+       m_pagehandlers.push_back(new ConfirmPage(templatestr));\r
+       m_pagehandlers.push_back(new ShowCaptchaPage());\r
+       m_pagehandlers.push_back(new AnnounceIdentityPage(templatestr));\r
+       m_pagehandlers.push_back(new ExecQueryPage(templatestr));\r
+       m_pagehandlers.push_back(new BoardsPage(templatestr));\r
+       m_pagehandlers.push_back(new InsertedFilesPage(templatestr));\r
+       m_pagehandlers.push_back(new AddPeerPage(templatestr));\r
+       m_pagehandlers.push_back(new PeerDetailsPage(templatestr));\r
+       m_pagehandlers.push_back(new ControlBoardPage(templatestr));\r
+       m_pagehandlers.push_back(new PeerMaintenancePage(templatestr));\r
+       m_pagehandlers.push_back(new PeerTrustPage(templatestr));\r
+       // homepage must be last - catch all page handler\r
+       m_pagehandlers.push_back(new HomePage(templatestr));\r
+\r
+       // initialize the access control list\r
+       std::string aclstr;\r
+       std::vector<std::string> aclparts;\r
+       Option::Instance()->Get("HTTPAccessControl",aclstr);\r
+       StringFunctions::Split(aclstr,",",aclparts);\r
+       for(std::vector<std::string>::iterator i=aclparts.begin(); i!=aclparts.end(); i++)\r
+       {\r
+               m_acl.Add((*i));\r
+       }\r
+}\r
+\r
+FMSHTTPRequestHandlerFactory::~FMSHTTPRequestHandlerFactory()\r
+{\r
+\r
+       for(std::vector<IPageHandler *>::iterator i=m_pagehandlers.begin(); i!=m_pagehandlers.end(); i++)\r
+       {\r
+               delete (*i);\r
+       }\r
+\r
+}\r
+\r
+Poco::Net::HTTPRequestHandler *FMSHTTPRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest &request)\r
+{\r
+       if(m_acl.IsAllowed(request.clientAddress().host()))\r
+       {\r
+               for(std::vector<IPageHandler *>::iterator i=m_pagehandlers.begin(); i!=m_pagehandlers.end(); i++)\r
+               {\r
+                       if((*i)->WillHandleURI(request.getURI()))\r
+                       {\r
+                               // we need to return a new object because the HTTPServer will destory it when it's done.\r
+                               return (*i)->New();\r
+                       }\r
+               }\r
+       }\r
+       return 0;\r
+}\r