Skip to content

Commit 798b4b6

Browse files
committed
Simplify and reduce code duplication in Transaction constructors
- Leverage delegating constructor to avoid code duplication between the two available Transaction constructors. - The constructor without 'id' argument delegates to the one that receives it by providing `nullptr` as a value, which is used to flag that an id needs to be generated. - Simplified constructor by removing member initialization where the default constructor will be invoked.
1 parent c2a879e commit 798b4b6

File tree

4 files changed

+31
-120
lines changed

4 files changed

+31
-120
lines changed

headers/modsecurity/transaction.h

+13-9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
*
1414
*/
1515

16+
#ifndef HEADERS_MODSECURITY_TRANSACTION_H_
17+
#define HEADERS_MODSECURITY_TRANSACTION_H_
18+
1619
#ifdef __cplusplus
1720
#include <cassert>
1821
#include <ctime>
@@ -33,9 +36,6 @@
3336
#include <stdlib.h>
3437
#include <stddef.h>
3538

36-
#ifndef HEADERS_MODSECURITY_TRANSACTION_H_
37-
#define HEADERS_MODSECURITY_TRANSACTION_H_
38-
3939
#ifndef __cplusplus
4040
typedef struct ModSecurity_t ModSecurity;
4141
typedef struct Transaction_t Transaction;
@@ -327,8 +327,8 @@ class TransactionSecMarkerManagement {
327327
/** @ingroup ModSecurity_CPP_API */
328328
class Transaction : public TransactionAnchoredVariables, public TransactionSecMarkerManagement {
329329
public:
330-
Transaction(ModSecurity *transaction, RulesSet *rules, void *logCbData);
331-
Transaction(ModSecurity *transaction, RulesSet *rules, char *id,
330+
Transaction(ModSecurity *ms, RulesSet *rules, void *logCbData);
331+
Transaction(ModSecurity *ms, RulesSet *rules, const char *id,
332332
void *logCbData);
333333
~Transaction();
334334

@@ -426,7 +426,7 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa
426426
* need to be filled if there is no rule using the variable
427427
* `duration'.
428428
*/
429-
clock_t m_creationTimeStamp;
429+
const clock_t m_creationTimeStamp;
430430

431431
/**
432432
* Holds the client IP address.
@@ -505,7 +505,7 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa
505505
/**
506506
* Rules object utilized during this specific transaction.
507507
*/
508-
RulesSet *m_rules;
508+
RulesSet * const m_rules;
509509

510510
/**
511511
*
@@ -568,7 +568,7 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa
568568
* Contains the unique ID of the transaction. Use by the variable
569569
* `UNIQUE_ID'. This unique id is also saved as part of the AuditLog.
570570
*/
571-
std::string m_id;
571+
const std::string m_id;
572572

573573
/**
574574
* Holds the amount of rules that should be skipped. If bigger than 0 the
@@ -600,7 +600,7 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa
600600
* TODO: m_timeStamp and m_creationTimeStamp may be merged into a single
601601
* variable.
602602
*/
603-
time_t m_timeStamp;
603+
const time_t m_timeStamp;
604604

605605

606606
/**
@@ -636,6 +636,10 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa
636636
std::vector<std::shared_ptr<RequestBodyProcessor::MultipartPartTmpFile>> m_multipartPartTmpFiles;
637637

638638
private:
639+
640+
Transaction(ModSecurity *ms, RulesSet *rules, const char *id,
641+
void *logCbData, const time_t timestamp);
642+
639643
/**
640644
* Pointer to the callback function that will be called to fill
641645
* the web server (connector) log.

src/audit_log/writer/parallel.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Parallel::~Parallel() {
4949
}
5050

5151

52-
inline std::string Parallel::logFilePath(time_t *t,
52+
inline std::string Parallel::logFilePath(const time_t *t,
5353
int part) {
5454
std::string name;
5555

src/audit_log/writer/parallel.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class Parallel : public Writer {
6565
YearMonthDayAndTimeFileName = 8,
6666
};
6767

68-
static inline std::string logFilePath(time_t *t, int part);
68+
static inline std::string logFilePath(const time_t *t, int part);
6969
};
7070

7171
} // namespace writer

src/transaction.cc

+16-109
Original file line numberDiff line numberDiff line change
@@ -102,90 +102,23 @@ namespace modsecurity {
102102
* @endcode
103103
*
104104
*/
105-
Transaction::Transaction(ModSecurity *ms, RulesSet *rules, void *logCbData)
106-
: m_creationTimeStamp(utils::cpu_seconds()),
107-
m_clientIpAddress(""),
108-
m_httpVersion(""),
109-
m_serverIpAddress(""),
110-
m_requestHostName(""),
111-
m_uri(""),
112-
m_uri_no_query_string_decoded(""),
113-
m_ARGScombinedSizeDouble(0),
114-
m_clientPort(0),
115-
m_highestSeverityAction(255),
116-
m_httpCodeReturned(200),
117-
m_serverPort(0),
118-
m_ms(ms),
119-
m_requestBodyType(UnknownFormat),
120-
m_requestBodyProcessor(UnknownFormat),
121-
m_rules(rules),
122-
m_ruleRemoveById(),
123-
m_ruleRemoveByIdRange(),
124-
m_ruleRemoveByTag(),
125-
m_ruleRemoveTargetByTag(),
126-
m_ruleRemoveTargetById(),
127-
m_requestBodyAccess(RulesSet::PropertyNotSetConfigBoolean),
128-
m_auditLogModifier(),
129-
m_ctlAuditEngine(AuditLog::AuditLogStatus::NotSetLogStatus),
130-
m_rulesMessages(),
131-
m_requestBody(),
132-
m_responseBody(),
133-
/* m_id(), */
134-
m_skip_next(0),
135-
m_allowType(modsecurity::actions::disruptive::NoneAllowType),
136-
m_uri_decoded(""),
137-
m_actions(),
138-
m_it(),
139-
m_timeStamp(std::time(NULL)),
140-
m_collections(ms->m_global_collection, ms->m_ip_collection,
141-
ms->m_session_collection, ms->m_user_collection,
142-
ms->m_resource_collection),
143-
m_matched(),
144-
#ifdef WITH_LIBXML2
145-
m_xml(new RequestBodyProcessor::XML(this)),
146-
#else
147-
m_xml(NULL),
148-
#endif
149-
#ifdef WITH_YAJL
150-
m_json(new RequestBodyProcessor::JSON(this)),
151-
#else
152-
m_json(NULL),
153-
#endif
154-
m_secRuleEngine(RulesSetProperties::PropertyNotSetRuleEngine),
155-
m_variableDuration(""),
156-
m_variableEnvs(),
157-
m_variableHighestSeverityAction(""),
158-
m_variableRemoteUser(""),
159-
m_variableTime(""),
160-
m_variableTimeDay(""),
161-
m_variableTimeEpoch(""),
162-
m_variableTimeHour(""),
163-
m_variableTimeMin(""),
164-
m_variableTimeSec(""),
165-
m_variableTimeWDay(""),
166-
m_variableTimeYear(""),
167-
m_logCbData(logCbData),
168-
TransactionAnchoredVariables(this) {
169-
m_id = std::to_string(m_timeStamp) +
170-
std::to_string(modsecurity::utils::generate_transaction_unique_id());
171105

172-
m_variableUrlEncodedError.set("0", 0);
173-
m_variableMscPcreError.set("0", 0);
174-
m_variableMscPcreLimitsExceeded.set("0", 0);
106+
static std::string get_id(const char *id, const time_t timestamp) {
107+
return (id == nullptr) ?
108+
std::to_string(timestamp) +
109+
std::to_string(modsecurity::utils::generate_transaction_unique_id())
110+
: id;
111+
}
175112

176-
ms_dbg(4, "Initializing transaction");
113+
Transaction::Transaction(ModSecurity *ms, RulesSet *rules, void *logCbData)
114+
: Transaction(ms, rules, nullptr, logCbData) { }
177115

178-
intervention::clean(&m_it);
179-
}
116+
Transaction::Transaction(ModSecurity *ms, RulesSet *rules, const char *id, void *logCbData)
117+
: Transaction(ms, rules, id, logCbData, std::time(nullptr)) { }
180118

181-
Transaction::Transaction(ModSecurity *ms, RulesSet *rules, char *id, void *logCbData)
119+
Transaction::Transaction(ModSecurity *ms, RulesSet *rules, const char *id,
120+
void *logCbData, const time_t timestamp)
182121
: m_creationTimeStamp(utils::cpu_seconds()),
183-
m_clientIpAddress(""),
184-
m_httpVersion(""),
185-
m_serverIpAddress(""),
186-
m_requestHostName(""),
187-
m_uri(""),
188-
m_uri_no_query_string_decoded(""),
189122
m_ARGScombinedSizeDouble(0),
190123
m_clientPort(0),
191124
m_highestSeverityAction(255),
@@ -195,54 +128,28 @@ Transaction::Transaction(ModSecurity *ms, RulesSet *rules, char *id, void *logCb
195128
m_requestBodyType(UnknownFormat),
196129
m_requestBodyProcessor(UnknownFormat),
197130
m_rules(rules),
198-
m_ruleRemoveById(),
199-
m_ruleRemoveByIdRange(),
200-
m_ruleRemoveByTag(),
201-
m_ruleRemoveTargetByTag(),
202-
m_ruleRemoveTargetById(),
203131
m_requestBodyAccess(RulesSet::PropertyNotSetConfigBoolean),
204-
m_auditLogModifier(),
205132
m_ctlAuditEngine(AuditLog::AuditLogStatus::NotSetLogStatus),
206-
m_rulesMessages(),
207-
m_requestBody(),
208-
m_responseBody(),
209-
m_id(id),
210133
m_skip_next(0),
134+
m_id(get_id(id, timestamp)),
211135
m_allowType(modsecurity::actions::disruptive::NoneAllowType),
212-
m_uri_decoded(""),
213-
m_actions(),
214-
m_it(),
215-
m_timeStamp(std::time(NULL)),
136+
m_timeStamp(timestamp),
216137
m_collections(ms->m_global_collection, ms->m_ip_collection,
217138
ms->m_session_collection, ms->m_user_collection,
218139
ms->m_resource_collection),
219-
m_matched(),
220140
#ifdef WITH_LIBXML2
221141
m_xml(new RequestBodyProcessor::XML(this)),
222142
#else
223-
m_xml(NULL),
143+
m_xml(nullptr),
224144
#endif
225145
#ifdef WITH_YAJL
226146
m_json(new RequestBodyProcessor::JSON(this)),
227147
#else
228-
m_json(NULL),
148+
m_json(nullptr),
229149
#endif
230150
m_secRuleEngine(RulesSetProperties::PropertyNotSetRuleEngine),
231-
m_variableDuration(""),
232-
m_variableEnvs(),
233-
m_variableHighestSeverityAction(""),
234-
m_variableRemoteUser(""),
235-
m_variableTime(""),
236-
m_variableTimeDay(""),
237-
m_variableTimeEpoch(""),
238-
m_variableTimeHour(""),
239-
m_variableTimeMin(""),
240-
m_variableTimeSec(""),
241-
m_variableTimeWDay(""),
242-
m_variableTimeYear(""),
243151
m_logCbData(logCbData),
244152
TransactionAnchoredVariables(this) {
245-
246153
m_variableUrlEncodedError.set("0", 0);
247154
m_variableMscPcreError.set("0", 0);
248155
m_variableMscPcreLimitsExceeded.set("0", 0);

0 commit comments

Comments
 (0)