version 0.3.13
[fms.git] / src / http / fmshttprequesthandlerfactory.cpp
1 #include "../../include/http/fmshttprequesthandlerfactory.h"\r
2 #include "../../include/option.h"\r
3 #include "../../include/stringfunctions.h"\r
4 #include "../../include/http/pages/homepage.h"\r
5 #include "../../include/http/pages/optionspage.h"\r
6 #include "../../include/http/pages/createidentitypage.h"\r
7 #include "../../include/http/pages/localidentitiespage.h"\r
8 #include "../../include/http/pages/confirmpage.h"\r
9 #include "../../include/http/pages/showcaptchapage.h"\r
10 #include "../../include/http/pages/announceidentitypage.h"\r
11 #include "../../include/http/pages/execquerypage.h"\r
12 #include "../../include/http/pages/boardspage.h"\r
13 #include "../../include/http/pages/insertedfilespage.h"\r
14 #include "../../include/http/pages/addpeerpage.h"\r
15 #include "../../include/http/pages/peerdetailspage.h"\r
16 #include "../../include/http/pages/controlboardpage.h"\r
17 #include "../../include/http/pages/peermaintenancepage.h"\r
18 #include "../../include/http/pages/peertrustpage.h"\r
19 #include "../../include/http/pages/versioninfopage.h"\r
20 #include "../../include/http/pages/recentlyaddedpage.h"\r
21 \r
22 FMSHTTPRequestHandlerFactory::FMSHTTPRequestHandlerFactory()\r
23 {\r
24         // set template\r
25         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
26         FILE *infile=fopen("template.htm","r+b");\r
27         if(infile)\r
28         {\r
29                 fseek(infile,0,SEEK_END);\r
30                 long len=ftell(infile);\r
31                 std::vector<char> data(len,0);\r
32                 fseek(infile,0,SEEK_SET);\r
33                 fread(&data[0],1,len,infile);\r
34                 fclose(infile);\r
35                 templatestr.assign(data.begin(),data.end());\r
36         }\r
37         else\r
38         {\r
39                 m_log->error("HTTPThread::HTTPThread could not open template.htm");\r
40         }\r
41 \r
42         // push back page handlers\r
43         m_pagehandlers.push_back(new OptionsPage(templatestr));\r
44         m_pagehandlers.push_back(new CreateIdentityPage(templatestr));\r
45         m_pagehandlers.push_back(new LocalIdentitiesPage(templatestr));\r
46         m_pagehandlers.push_back(new ConfirmPage(templatestr));\r
47         m_pagehandlers.push_back(new ShowCaptchaPage());\r
48         m_pagehandlers.push_back(new AnnounceIdentityPage(templatestr));\r
49         m_pagehandlers.push_back(new ExecQueryPage(templatestr));\r
50         m_pagehandlers.push_back(new BoardsPage(templatestr));\r
51         m_pagehandlers.push_back(new InsertedFilesPage(templatestr));\r
52         m_pagehandlers.push_back(new AddPeerPage(templatestr));\r
53         m_pagehandlers.push_back(new PeerDetailsPage(templatestr));\r
54         m_pagehandlers.push_back(new ControlBoardPage(templatestr));\r
55         m_pagehandlers.push_back(new PeerMaintenancePage(templatestr));\r
56         m_pagehandlers.push_back(new PeerTrustPage(templatestr));\r
57         m_pagehandlers.push_back(new VersionInfoPage(templatestr));\r
58         m_pagehandlers.push_back(new RecentlyAddedPage(templatestr));\r
59         // homepage must be last - catch all page handler\r
60         m_pagehandlers.push_back(new HomePage(templatestr));\r
61 \r
62         // initialize the access control list\r
63         std::string aclstr;\r
64         std::vector<std::string> aclparts;\r
65         Option::Instance()->Get("HTTPAccessControl",aclstr);\r
66         StringFunctions::Split(aclstr,",",aclparts);\r
67         for(std::vector<std::string>::iterator i=aclparts.begin(); i!=aclparts.end(); i++)\r
68         {\r
69                 m_acl.Add((*i));\r
70         }\r
71 }\r
72 \r
73 FMSHTTPRequestHandlerFactory::~FMSHTTPRequestHandlerFactory()\r
74 {\r
75 \r
76         for(std::vector<IPageHandler *>::iterator i=m_pagehandlers.begin(); i!=m_pagehandlers.end(); i++)\r
77         {\r
78                 delete (*i);\r
79         }\r
80 \r
81 }\r
82 \r
83 Poco::Net::HTTPRequestHandler *FMSHTTPRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest &request)\r
84 {\r
85         if(m_acl.IsAllowed(request.clientAddress().host()))\r
86         {\r
87                 for(std::vector<IPageHandler *>::iterator i=m_pagehandlers.begin(); i!=m_pagehandlers.end(); i++)\r
88                 {\r
89                         if((*i)->WillHandleURI(request.getURI()))\r
90                         {\r
91                                 // we need to return a new object because the HTTPServer will destory it when it's done.\r
92                                 return (*i)->New();\r
93                         }\r
94                 }\r
95         }\r
96         else\r
97         {\r
98                 m_log->debug("FMSHTTPRequestHandlerFactory::createRequestHandler host denied access "+request.clientAddress().host().toString());\r
99         }\r
100         return 0;\r
101 }\r