-
-
Notifications
You must be signed in to change notification settings - Fork 226
/
Copy pathtactioncontroller.h
220 lines (194 loc) · 8.38 KB
/
tactioncontroller.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#pragma once
#include <QHostAddress>
#include <QtCore>
#include <TAbstractController>
#include <TAccessValidator>
#include <TActionHelper>
#include <TCookieJar>
#include <THttpRequest>
#include <THttpResponse>
#include <TActionContext>
#include <TSession>
#include <TGlobal>
class TActionView;
class TAbstractUser;
class TFormValidator;
class TCache;
class QDomDocument;
class T_CORE_EXPORT TActionController : public TAbstractController, public TActionHelper, protected TAccessValidator {
public:
TActionController();
virtual ~TActionController();
QString name() const override;
QString activeAction() const override;
QStringList arguments() const override;
const THttpRequest &request() const override;
const THttpRequest &httpRequest() const override { return request(); }
const THttpResponse &response() const { return _response; }
const THttpResponse &httpResponse() const { return response(); }
const TSession &session() const override { return _sessionStore; }
QString getRenderingData(const QString &templateName, const QVariantMap &vars = QVariantMap()) override;
virtual bool sessionEnabled() const { return true; }
virtual bool csrfProtectionEnabled() const { return true; }
virtual QStringList exceptionActionsOfCsrfProtection() const { return QStringList(); }
virtual bool transactionEnabled() const { return true; }
QByteArray authenticityToken() const override;
QVariantMap flashVariants() const override;
QVariant flashVariant(const QString &key) const override;
QJsonObject flashVariantsJson() const override;
QJsonObject flashVariantJson(const QString &key) const override;
//QString flash(const QString &name) const;
QHostAddress clientAddress() const;
virtual bool isUserLoggedIn() const override;
virtual QString identityKeyOfLoginUser() const;
void setFlash(const QString &name, const QVariant &value) override;
void reset() override;
static void setCsrfProtectionInto(TSession &session);
static const QStringList &availableControllers();
static const QStringList &disabledControllers();
static QString loginUserNameKey();
protected:
virtual bool preFilter() { return true; }
virtual void postFilter() {}
void setLayoutEnabled(bool enable);
void setLayoutDisabled(bool disable);
bool layoutEnabled() const;
void setLayout(const QString &layout);
QString layout() const;
void setStatusCode(int code);
int statusCode() const { return _statCode; }
void setFlashValidationErrors(const TFormValidator &validator, const QString &prefix = QString("err_"));
TSession &session() override { return _sessionStore; }
void setSession(const TSession &session);
bool addCookie(const TCookie &cookie) override;
bool addCookie(const QByteArray &name, const QByteArray &value, const QDateTime &expire = QDateTime(), const QString &path = QString(), const QString &domain = QString(), bool secure = false, bool httpOnly = false, const QByteArray &sameSite = "Lax") override;
bool addCookie(const QByteArray &name, const QByteArray &value, int64_t maxAge, const QString &path = QString(), const QString &domain = QString(), bool secure = false, bool httpOnly = false, const QByteArray &sameSite = "Lax") override;
QByteArray contentType() const;
void setContentType(const QByteArray &type);
bool render(const QString &action = QString(), const QString &layout = QString());
bool renderTemplate(const QString &templateName, const QString &layout = QString());
bool renderText(const QString &text, bool layoutEnable = false, const QString &layout = QString());
bool renderXml(const QDomDocument &document);
bool renderXml(const QVariantMap &map);
bool renderXml(const QVariantList &list);
bool renderXml(const QStringList &list);
bool renderJson(const QJsonDocument &document);
bool renderJson(const QJsonObject &object);
bool renderJson(const QJsonArray &array);
bool renderJson(const QVariantMap &map);
bool renderJson(const QVariantList &list);
bool renderJson(const QStringList &list);
bool renderAndCache(const QByteArray &key, int seconds, const QString &action = QString(), const QString &layout = QString());
bool renderOnCache(const QByteArray &key);
void removeCache(const QByteArray &key);
bool renderCbor(const QVariant &variant, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
bool renderCbor(const QVariantMap &map, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
bool renderCbor(const QVariantHash &hash, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
bool renderCbor(const QCborValue &value, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
bool renderCbor(const QCborMap &map, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
bool renderCbor(const QCborArray &array, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
bool renderErrorResponse(int statusCode);
void redirect(const QUrl &url, int statusCode = Tf::Found);
bool sendFile(const QString &filePath, const QByteArray &contentType, const QString &name = QString(), bool autoRemove = false);
bool sendData(const QByteArray &data, const QByteArray &contentType, const QString &name = QString());
void rollbackTransaction() { _rollback = true; }
void setAutoRemove(const QString &filePath);
bool validateAccess(const TAbstractUser *user);
// For WebSocket
void sendTextToWebSocket(int socket, const QString &text);
void sendBinaryToWebSocket(int socket, const QByteArray &binary);
void closeWebSokcet(int socket, int closeCode = Tf::NormalClosure);
void publish(const QString &topic, const QString &text);
void publish(const QString &topic, const QByteArray &binary);
void flushResponse();
virtual bool userLogin(const TAbstractUser *user);
virtual void userLogout();
virtual void setAccessRules() {}
THttpRequest &request();
THttpRequest &httpRequest() { return request(); }
THttpResponse &httpResponse() { return _response; }
private:
enum WebSocketTaskType {
SendTextTo = 0,
SendBinaryTo,
SendCloseTo,
PublishText,
PublishBinary,
};
enum class RenderState {
NotRendered = 0,
Rendered,
DataSent,
};
void setActionName(const QString &name);
void setArguments(const QStringList &arguments) { _args = arguments; }
bool verifyRequest(const THttpRequest &request) const;
QByteArray renderView(TActionView *view);
void exportAllFlashVariants();
const TActionController *controller() const override { return this; }
bool rollbackRequested() const { return _rollback; }
static QString layoutClassName(const QString &layout);
static QString partialViewClassName(const QString &partial);
mutable QString _ctrlName;
QString _actionName;
QStringList _args;
int _statCode {Tf::OK}; // 200 OK
RenderState _rendered {RenderState::NotRendered};
bool _layoutEnable {true};
QString _layoutName;
THttpResponse _response;
QVariantMap _flashVars;
TSession _sessionStore;
TCookieJar _cookieJar;
bool _rollback {false};
QStringList _autoRemoveFiles;
QList<QPair<int, QVariant>> _taskList;
friend class TActionContext;
friend class TSessionCookieStore;
T_DISABLE_COPY(TActionController)
T_DISABLE_MOVE(TActionController)
};
inline QString TActionController::activeAction() const
{
return _actionName;
}
inline QStringList TActionController::arguments() const
{
return _args;
}
inline void TActionController::setActionName(const QString &name)
{
_actionName = name;
}
inline void TActionController::setLayoutEnabled(bool enable)
{
_layoutEnable = enable;
}
inline void TActionController::setLayoutDisabled(bool disable)
{
_layoutEnable = !disable;
}
inline bool TActionController::layoutEnabled() const
{
return _layoutEnable;
}
inline QString TActionController::layout() const
{
return _layoutName;
}
inline void TActionController::setStatusCode(int code)
{
_statCode = code;
}
// inline QString TActionController::flash(const QString &name) const
// {
// return _flashVars.value(name).toString();
// }
inline QByteArray TActionController::contentType() const
{
return _response.header().contentType();
}
inline void TActionController::setContentType(const QByteArray &type)
{
_response.header().setContentType(type);
}