Timesheets-Server
Timesheets server
Načítám...
Vyhledávám...
Nebylo nic nalezeno
requestmapper.cpp
Zobrazit dokumentaci tohoto souboru.
1
6
7#include "requestmapper.h"
8#include "httprequest.h"
9#include "httpresponse.h"
10#include "httpconnection.h"
11#include "sessionstore.h"
12#include "staticfilecontroller.h"
13#include "msettings.h"
14#include "pdebug.h"
15#include "pluginstore.h"
16#include "plugininterface.h"
17#include "requestauthorizer.h"
18#include <QRegularExpression>
19
20// nové API
21#include "controllerserver.h"
27#include "controllerstatuses.h"
29#include "controllertickets.h"
30#include "controllerticketsvw.h"
35#include "controllerusers.h"
37#include "controllertimesheet.h"
38#include "controlleroverview.h"
40
41// Docházka
43#include "controlleremployees.h"
44#include "controllerdoors.h"
45#include "controllerdooremployees.h"
46#include "controllerdepartmentemployees.h"
47#include "controllerdepartmenthasmanager.h"
48#include "controllerrfidemployees.h"
49#include "controllerrfids.h"
51#include "controllerevents.h"
52#include "controllerholidays.h"
54#include "controllerattendancechecklist.h"
55#include "controllerattendancesummary.h"
56#include "controllerattendancepresent.h"
57#include "controllerattendancerecent.h"
58
59using namespace HobrasoftHttpd;
60using namespace Httpd;
61
73
74
75RequestMapper::~RequestMapper() {
76}
77
78
79RequestMapper::RequestMapper(HobrasoftHttpd::HttpConnection *parent) : HobrasoftHttpd::HttpRequestHandler(parent) {
80 // PDEBUG << parent->thread() << this->thread();
81 m_authorizer = new RequestAuthorizer(parent);
82}
83
84
85void RequestMapper::service(HttpRequest *request, HttpResponse *response) {
86 m_path = request->path();
87 PDEBUG << request->method() << request->fullPath();
88
89 #define ROUTER(adresa, trida) { \
90 if (m_path.contains(QRegularExpression(adresa))) { \
91 AbstractController *controller = new trida (connection()); \
92 controller->setAuthorizer(m_authorizer); \
93 controller->service(request, response); \
94 return; \
95 } \
96 }
97
98 if (m_path.contains(QRegExp("^/public/.*\\.shtml"))) {
99 serviceShtmlFile(request, response);
100 response->flush();
101 return;
102 }
103
104 if (m_path.startsWith("/index.html") || m_path == "/") {
105 StaticFileController(connection()).service(request, response);
106 response->flush();
107 return;
108 }
109
110 if (m_path.startsWith("/public/")) {
111 StaticFileController(connection()).service(request, response);
112 response->flush();
113 return;
114 }
115
116
117 // Možné bez přihlášení
118 ROUTER("^/api/v1/overview/0x", ControllerOverviewPublic);
119 ROUTER("^/api/v1/server/about", ControllerServer);
120
121 // Kontrola přihlášení
122 if (!m_authorizer->isLoggedIn(request, response)) {
123 return;
124 }
125
129 ROUTER("^/api/v1/doors/(\\d+)/employees(?:/(\\d+))?/?", ControllerDoorEmployees);
130 ROUTER("^/api/v1/departments/(\\d+)/employees(?:/(\\d+))?/?", ControllerDepartmentEmployees);
131 ROUTER("^/api/v1/departments/(\\d+)/managers(?:/(\\d+))?/?", ControllerDepartmentHasManager);
132 ROUTER("^/api/v1/rfids/(\\d+)/employees(?:/(\\d+))?/?", ControllerRfidEmployees);
133 ROUTER("^/api/v1/categoriessiblings", ControllerCategoriesSiblings);
134 ROUTER("^/api/v1/tickettimesheets", ControllerTicketTimesheets);
135 ROUTER("^/api/v1/categoriestoroot", ControllerCategoriesToRoot);
136 ROUTER("^/api/v1/statustemplates", ControllerStatusTemplates);
137 ROUTER("^/api/v1/userscategories", ControllerUsersCategories);
138 ROUTER("^/api/v1/categoriestree", ControllerCategoriesTree);
139 ROUTER("^/api/v1/ticketvalues", ControllerTicketValues);
140 ROUTER("^/api/v1/ticketstatus", ControllerTicketStatus);
141 ROUTER("^/api/v1/ticketfiles", ControllerTicketFiles);
142 ROUTER("^/api/v1/departments", ControllerDepartments);
143 ROUTER("^/api/v1/statusorder", ControllerStatusOrder);
144 ROUTER("^/api/v1/categories", ControllerCategories);
145 ROUTER("^/api/v1/eventtypes", ControllerEventTypes);
146 ROUTER("^/api/v1/ticketsvw", ControllerTicketsVw);
147 ROUTER("^/api/v1/timesheet", ControllerTimesheet);
148 ROUTER("^/api/v1/employees", ControllerEmployees);
149 ROUTER("^/api/v1/overview", ControllerOverview);
150 ROUTER("^/api/v1/statuses", ControllerStatuses);
151 ROUTER("^/api/v1/tickets", ControllerTickets);
152 ROUTER("^/api/v1/server", ControllerServer);
153 ROUTER("^/api/v1/events", ControllerEvents);
154 ROUTER("^/api/v1/users", ControllerUsers);
155 ROUTER("^/api/v1/doors", ControllerDoors);
156 ROUTER("^/api/v1/rfids", ControllerRfids);
157 ROUTER("^/api/v1/holidays/copy/(\\d+)/(\\d+)$", ControllerHolidays);
158 ROUTER("^/api/v1/holidays", ControllerHolidays);
159 ROUTER("^/api/v1/workcalendar/generate/(\\d+)$", ControllerWorkCalendar);
160 ROUTER("^/api/v1/workcalendar", ControllerWorkCalendar);
161 ROUTER("^/api/v1/attendancechecklist", ControllerAttendanceChecklist);
162 ROUTER("^/api/v1/attendancepresent", ControllerAttendancePresent);
163 ROUTER("^/api/v1/attendancerecent", ControllerAttendanceRecent);
164 ROUTER("^/api/v1/attendancesummary", ControllerAttendanceSummary);
165
166 if (m_path.contains(QRegularExpression(".*\\.shtml"))) {
167 serviceShtmlFile(request, response);
168 response->flush();
169 return;
170 }
171
172 StaticFileController(connection()).service(request, response);
173}
174
175
176void RequestMapper::serviceShtmlFile(HttpRequest *request, HttpResponse *response) {
177 Q_UNUSED(request);
178 QByteArray data;
179 try {
180 data = readFile(m_path, response);
181 }
182 catch (...) {
183 return;
184 }
185 response->setHeader("Content-Type", "text/html; charset=" + connection()->settings()->encoding());
186 response->write(data);
187 response->flush();
188}
189
190
191QByteArray RequestMapper::readFile(const QString& path, HttpResponse *response) {
192 QByteArray data;
193 if (path.startsWith("/..") || path.startsWith("..")) {
194 response->setStatus(403,"Forbidden");
195 response->write(QString("403 Forbidden: %1<br>\nDo not use ../ in your file path").arg(path).toUtf8());
196 response->flush();
197 throw false;
198 }
199
200 QFile file(connection()->settings()->docroot()+"/"+path);
201 if (!file.exists()) {
202 response->setStatus(404, "Not found");
203 response->write(QString("404 File not found: %1").arg(file.fileName()).toUtf8());
204 response->flush();
205 throw false;
206 }
207
208 if (!file.open(QIODevice::ReadOnly)) {
209 response->setStatus(403, "Forbidden");
210 response->write(QString("403 Forbidden: %1").arg(file.fileName()).toUtf8());
211 response->flush();
212 throw false;
213 }
214
215 QString rolename = Security::Roles::toString(m_authorizer->role());
216
217 while (!file.atEnd()) {
218 QString line = QString::fromUtf8(file.readLine());
219 line = line.replace("${ROLE}", rolename);
220 // if (line.contains(QRegExp("^\\s*<!--\\s*#include\\s+\".+\"\\s*-->\\s*$"))) {
221 if (line.contains(QRegExp(R"X(^\s*<!--\s*#include\s+['"].+['"]\s*-->\s*$)X"))) {
222 QStringList lineparts = line.split(QRegExp(R"X(['"])X"));
223 if (lineparts.size() != 3) {
224 continue;
225 }
226 data += readFile(lineparts[1], response);
227 continue;
228 }
229 data += line.toUtf8();
230 }
231
232 file.close();
233 return data;
234}
235
236
237
Vrací seznam kategorií od zadané kategorie až k rootu.
Manipulace s kategoriemi.
Manipuluje s informacemi o odděleních v docházce.
Manipuluje s informacemi o dveřích v docházce.
Manipuluje s informacemi o zaměstnancích v docházce.
Manipuluje s informacemi o typu události v event logu v docházce.
Manipuluje se záznamy událostí v docházce.
Vrací podklady pro tištěný pracovní výkaz.
Vrací podklady pro tištěný pracovní výkaz.
Manipuluje s informacemi o RFID kartách v docházce.
Vrací informace o serveru.
Vrací informace o pořadí přechodů mezi jednotlivými stavy ticketu.
Manipulace se šablonami stavů
Manipulace se stavy ticketů
Manipulace se soubory ticketů
Manipulace se stavy ticketů
Manipulace se záznamy pracovního výkazu.
Manipulace s přibalenými objekty ticketů
Manipuluje s informacemi o ticketech.
Manipuluje s informacemi o ticketech.
Nastartování nebo zastavení pracovního výkazu.
Manipulace s uživateli.
Kontroluje přihlašování uživatelů a jejich oprávnění přes webové rozhraní
QString m_path
Obsluhovaná cesta (URL adresa).
RequestMapper(HobrasoftHttpd::HttpConnection *parent)
Konstruktor.
void service(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response)
Vyřizuje jeden požadavek.
Jmenný prostor pro obsluhu konkrétních HTTP požadavků aplikace.
static QString toString(Role role)
Vrací název odpovídající role v textu.
Definition roles.h:31