@@ -179,167 +179,199 @@ class VariableMonkeyResolution {
179
179
static void stringMatchResolveMulti (Transaction *t,
180
180
const std::string &variable,
181
181
std::vector<const VariableValue *> *l) {
182
- size_t collection = variable.find (" ." );
183
- if (collection == std::string::npos) {
184
- collection = variable.find (" :" );
182
+ size_t collection_delimiter_offset = variable.find (" ." );
183
+ if (collection_delimiter_offset == std::string::npos) {
184
+ collection_delimiter_offset = variable.find (" :" );
185
185
}
186
- if (collection == std::string::npos) {
187
- if (comp (variable, " RESPONSE_CONTENT_TYPE" )) {
188
- t->m_variableResponseContentType .evaluate (l);
189
- } else if (comp (variable, " ARGS_COMBINED_SIZE" )) {
190
- t->m_variableARGScombinedSize .evaluate (l);
191
- } else if (comp (variable, " AUTH_TYPE" )) {
192
- t->m_variableAuthType .evaluate (l);
193
- } else if (comp (variable, " FILES_COMBINED_SIZE" )) {
194
- t->m_variableFilesCombinedSize .evaluate (l);
195
- } else if (comp (variable, " FULL_REQUEST" )) {
196
- t->m_variableFullRequest .evaluate (l);
197
- } else if (comp (variable, " FULL_REQUEST_LENGTH" )) {
198
- t->m_variableFullRequestLength .evaluate (l);
199
- } else if (comp (variable, " INBOUND_DATA_ERROR" )) {
200
- t->m_variableInboundDataError .evaluate (l);
201
- } else if (comp (variable, " MATCHED_VAR" )) {
202
- t->m_variableMatchedVar .evaluate (l);
203
- } else if (comp (variable, " MATCHED_VAR_NAME" )) {
204
- t->m_variableMatchedVarName .evaluate (l);
205
- } else if (comp (variable, " MSC_PCRE_ERROR" )) {
206
- t->m_variableMscPcreError .evaluate (l);
207
- } else if (comp (variable, " MSC_PCRE_LIMITS_EXCEEDED" )) {
208
- t->m_variableMscPcreLimitsExceeded .evaluate (l);
209
- } else if (comp (variable, " MULTIPART_CRLF_LF_LINES" )) {
210
- t->m_variableMultipartCrlfLFLines .evaluate (l);
211
- } else if (comp (variable, " MULTIPART_DATA_AFTER" )) {
212
- t->m_variableMultipartDataAfter .evaluate (l);
213
- } else if (comp (variable, " MULTIPART_FILE_LIMIT_EXCEEDED" )) {
214
- t->m_variableMultipartFileLimitExceeded .evaluate (l);
215
- } else if (comp (variable, " MULTIPART_STRICT_ERROR" )) {
216
- t->m_variableMultipartStrictError .evaluate (l);
217
- } else if (comp (variable, " MULTIPART_HEADER_FOLDING" )) {
218
- t->m_variableMultipartHeaderFolding .evaluate (l);
219
- } else if (comp (variable, " MULTIPART_INVALID_QUOTING" )) {
220
- t->m_variableMultipartInvalidQuoting .evaluate (l);
221
- } else if (comp (variable, " MULTIPART_INVALID_HEADER_FOLDING" )) {
222
- t->m_variableMultipartInvalidHeaderFolding .evaluate (l);
223
- } else if (comp (variable, " MULTIPART_UNMATCHED_BOUNDARY" )) {
224
- t->m_variableMultipartUnmatchedBoundary .evaluate (l);
225
- } else if (comp (variable, " OUTBOUND_DATA_ERROR" )) {
226
- t->m_variableOutboundDataError .evaluate (l);
227
- } else if (comp (variable, " PATH_INFO" )) {
228
- t->m_variablePathInfo .evaluate (l);
229
- } else if (comp (variable, " QUERY_STRING" )) {
230
- t->m_variableQueryString .evaluate (l);
231
- } else if (comp (variable, " REMOTE_ADDR" )) {
232
- t->m_variableRemoteAddr .evaluate (l);
233
- } else if (comp (variable, " REMOTE_HOST" )) {
234
- t->m_variableRemoteHost .evaluate (l);
235
- } else if (comp (variable, " REMOTE_PORT" )) {
236
- t->m_variableRemotePort .evaluate (l);
237
- } else if (comp (variable, " REQBODY_ERROR" )) {
238
- t->m_variableReqbodyError .evaluate (l);
239
- } else if (comp (variable, " REQBODY_ERROR_MSG" )) {
240
- t->m_variableReqbodyErrorMsg .evaluate (l);
241
- } else if (comp (variable, " REQBODY_PROCESSOR_ERROR_MSG" )) {
242
- t->m_variableReqbodyProcessorErrorMsg .evaluate (l);
243
- } else if (comp (variable, " REQBODY_PROCESSOR_ERROR" )) {
244
- t->m_variableReqbodyProcessorError .evaluate (l);
245
- } else if (comp (variable, " REQBODY_PROCESSOR" )) {
246
- t->m_variableReqbodyProcessor .evaluate (l);
247
- } else if (comp (variable, " REQUEST_BASENAME" )) {
248
- t->m_variableRequestBasename .evaluate (l);
249
- } else if (comp (variable, " REQUEST_BODY" )) {
250
- t->m_variableRequestBody .evaluate (l);
251
- } else if (comp (variable, " REQUEST_BODY_LENGTH" )) {
252
- t->m_variableRequestBodyLength .evaluate (l);
253
- } else if (comp (variable, " REQUEST_FILENAME" )) {
254
- t->m_variableRequestFilename .evaluate (l);
255
- } else if (comp (variable, " REQUEST_LINE" )) {
256
- t->m_variableRequestLine .evaluate (l);
257
- } else if (comp (variable, " REQUEST_METHOD" )) {
258
- t->m_variableRequestMethod .evaluate (l);
259
- } else if (comp (variable, " REQUEST_PROTOCOL" )) {
260
- t->m_variableRequestProtocol .evaluate (l);
261
- } else if (comp (variable, " REQUEST_URI" )) {
262
- t->m_variableRequestURI .evaluate (l);
263
- } else if (comp (variable, " REQUEST_URI_RAW" )) {
264
- t->m_variableRequestURIRaw .evaluate (l);
265
- } else if (comp (variable, " RESOURCE" )) {
266
- t->m_variableResource .evaluate (l);
267
- } else if (comp (variable, " RESPONSE_BODY" )) {
268
- t->m_variableResponseBody .evaluate (l);
269
- } else if (comp (variable, " RESPONSE_CONTENT_LENGTH" )) {
270
- t->m_variableResponseContentLength .evaluate (l);
271
- } else if (comp (variable, " RESPONSE_PROTOCOL" )) {
272
- t->m_variableResponseProtocol .evaluate (l);
273
- } else if (comp (variable, " RESPONSE_STATUS" )) {
274
- t->m_variableResponseStatus .evaluate (l);
275
- } else if (comp (variable, " SERVER_ADDR" )) {
276
- t->m_variableServerAddr .evaluate (l);
277
- } else if (comp (variable, " SERVER_NAME" )) {
278
- t->m_variableServerName .evaluate (l);
279
- } else if (comp (variable, " SERVER_PORT" )) {
280
- t->m_variableServerPort .evaluate (l);
281
- } else if (comp (variable, " SESSIONID" )) {
282
- t->m_variableSessionID .evaluate (l);
283
- } else if (comp (variable, " UNIQUE_ID" )) {
284
- t->m_variableUniqueID .evaluate (l);
285
- } else if (comp (variable, " URLENCODED_ERROR" )) {
286
- t->m_variableUrlEncodedError .evaluate (l);
287
- } else if (comp (variable, " USERID" )) {
288
- t->m_variableUserID .evaluate (l);
186
+ std::string col; // collection name excluding individual variable specification
187
+ std::string var; // variable within the collection
188
+ if (collection_delimiter_offset == std::string::npos) {
189
+ col = variable;
190
+ } else {
191
+ col = std::string (variable, 0 , collection_delimiter_offset);
192
+ var = std::string (variable, collection_delimiter_offset + 1 ,
193
+ variable.length () - (collection_delimiter_offset + 1 ));
194
+ }
195
+
196
+ // First check if the request is for a collection of type AnchoredSetVariable
197
+ AnchoredSetVariable* anchoredSetVariable = NULL ;
198
+ if (comp (col, " ARGS" )) {
199
+ anchoredSetVariable = &t->m_variableArgs ;
200
+ } else if (comp (col, " ARGS_GET" )) {
201
+ anchoredSetVariable = &t->m_variableArgsGet ;
202
+ } else if (comp (col, " ARGS_POST" )) {
203
+ anchoredSetVariable = &t->m_variableArgsPost ;
204
+ } else if (comp (col, " FILES_SIZES" )) {
205
+ anchoredSetVariable = &t->m_variableFilesSizes ;
206
+ } else if (comp (col, " FILES_NAMES" )) {
207
+ anchoredSetVariable = &t->m_variableFilesNames ;
208
+ } else if (comp (col, " FILES_TMP_CONTENT" )) {
209
+ anchoredSetVariable = &t->m_variableFilesTmpContent ;
210
+ } else if (comp (col, " MULTIPART_FILENAME" )) {
211
+ anchoredSetVariable = &t->m_variableMultipartFileName ;
212
+ } else if (comp (col, " MULTIPART_NAME" )) {
213
+ anchoredSetVariable = &t->m_variableMultipartName ;
214
+ } else if (comp (col, " MATCHED_VARS_NAMES" )) {
215
+ anchoredSetVariable = &t->m_variableMatchedVarsNames ;
216
+ } else if (comp (col, " MATCHED_VARS" )) {
217
+ anchoredSetVariable = &t->m_variableMatchedVars ;
218
+ } else if (comp (col, " FILES" )) {
219
+ anchoredSetVariable = &t->m_variableFiles ;
220
+ } else if (comp (col, " REQUEST_COOKIES" )) {
221
+ anchoredSetVariable = &t->m_variableRequestCookies ;
222
+ } else if (comp (col, " REQUEST_HEADERS" )) {
223
+ anchoredSetVariable = &t->m_variableRequestHeaders ;
224
+ } else if (comp (variable, " REQUEST_HEADERS_NAMES" )) {
225
+ anchoredSetVariable = &t->m_variableRequestHeadersNames ;
226
+ } else if (comp (col, " RESPONSE_HEADERS" )) {
227
+ anchoredSetVariable = &t->m_variableResponseHeaders ;
228
+ } else if (comp (variable, " RESPONSE_HEADERS_NAMES" )) {
229
+ anchoredSetVariable = &t->m_variableResponseHeadersNames ;
230
+ } else if (comp (col, " GEO" )) {
231
+ anchoredSetVariable = &t->m_variableGeo ;
232
+ } else if (comp (col, " REQUEST_COOKIES_NAMES" )) {
233
+ anchoredSetVariable = &t->m_variableRequestCookiesNames ;
234
+ } else if (comp (col, " FILES_TMPNAMES" )) {
235
+ anchoredSetVariable = &t->m_variableFilesTmpNames ;
236
+ }
237
+ if (anchoredSetVariable != NULL ) {
238
+ if (collection_delimiter_offset == std::string::npos) {
239
+ anchoredSetVariable->resolve (l);
289
240
} else {
290
- throw std::invalid_argument ( " Variable not found. " );
241
+ anchoredSetVariable-> resolve (var, l );
291
242
}
292
- } else {
293
- std::string col = std::string (variable, 0 , collection);
294
- std::string var = std::string (variable, collection + 1 ,
295
- variable.length () - (collection + 1 ));
296
- if (comp (col, " ARGS" )) {
297
- t->m_variableArgs .resolve (var, l);
298
- } else if (comp (variable, " ARGS_NAMES" )) {
299
- t->m_variableArgsNames .resolve (var, l);
300
- } else if (comp (variable, " ARGS_GET_NAMES" )) {
301
- t->m_variableArgsGetNames .resolve (var, l);
302
- } else if (comp (variable, " ARGS_POST_NAMES" )) {
303
- t->m_variableArgsPostNames .resolve (var, l);
304
- } else if (comp (col, " ARGS_GET" )) {
305
- t->m_variableArgsGet .resolve (var, l);
306
- } else if (comp (col, " ARGS_POST" )) {
307
- t->m_variableArgsPost .resolve (var, l);
308
- } else if (comp (col, " FILES_SIZES" )) {
309
- t->m_variableFilesSizes .resolve (var, l);
310
- } else if (comp (col, " FILES_NAMES" )) {
311
- t->m_variableFilesNames .resolve (var, l);
312
- } else if (comp (col, " FILES_TMP_CONTENT" )) {
313
- t->m_variableFilesTmpContent .resolve (var, l);
314
- } else if (comp (col, " MULTIPART_FILENAME" )) {
315
- t->m_variableMultipartFileName .resolve (var, l);
316
- } else if (comp (col, " MULTIPART_NAME" )) {
317
- t->m_variableMultipartName .resolve (var, l);
318
- } else if (comp (col, " MATCHED_VARS_NAMES" )) {
319
- t->m_variableMatchedVarsNames .resolve (var, l);
320
- } else if (comp (col, " MATCHED_VARS" )) {
321
- t->m_variableMatchedVars .resolve (var, l);
322
- } else if (comp (col, " FILES" )) {
323
- t->m_variableFiles .resolve (var, l);
324
- } else if (comp (col, " REQUEST_COOKIES" )) {
325
- t->m_variableRequestCookies .resolve (var, l);
326
- } else if (comp (col, " REQUEST_HEADERS" )) {
327
- t->m_variableRequestHeaders .resolve (var, l);
328
- } else if (comp (variable, " REQUEST_HEADERS_NAMES" )) {
329
- t->m_variableRequestHeadersNames .resolve (var, l);
330
- } else if (comp (col, " RESPONSE_HEADERS" )) {
331
- t->m_variableResponseHeaders .resolve (var, l);
332
- } else if (comp (variable, " RESPONSE_HEADERS_NAMES" )) {
333
- t->m_variableResponseHeadersNames .resolve (var, l);
334
- } else if (comp (col, " GEO" )) {
335
- t->m_variableGeo .resolve (var, l);
336
- } else if (comp (col, " REQUEST_COOKIES_NAMES" )) {
337
- t->m_variableRequestCookiesNames .resolve (var, l);
338
- } else if (comp (col, " FILES_TMPNAMES" )) {
339
- t->m_variableFilesTmpNames .resolve (var, l);
243
+ return ;
244
+ }
245
+
246
+ // Next check for collection of type AnchoredSetVariableTranslationProxy
247
+ AnchoredSetVariableTranslationProxy* anchoredSetVariableTranslationProxy = NULL ;
248
+ if (comp (col, " ARGS_NAMES" )) {
249
+ anchoredSetVariableTranslationProxy = &t->m_variableArgsNames ;
250
+ } else if (comp (col, " ARGS_GET_NAMES" )) {
251
+ anchoredSetVariableTranslationProxy = &t->m_variableArgsGetNames ;
252
+ } else if (comp (col, " ARGS_POST_NAMES" )) {
253
+ anchoredSetVariableTranslationProxy = &t->m_variableArgsPostNames ;
254
+ }
255
+ if (anchoredSetVariableTranslationProxy != NULL ) {
256
+ if (collection_delimiter_offset == std::string::npos) {
257
+ anchoredSetVariableTranslationProxy->resolve (l);
340
258
} else {
341
- throw std::invalid_argument ( " Variable not found. " );
259
+ anchoredSetVariableTranslationProxy-> resolve (var, l );
342
260
}
261
+ return ;
262
+ }
263
+
264
+
265
+ // It could still be a non-collection variable, but in that case
266
+ // there should not be a request for a variable-within-a-collection
267
+ if (collection_delimiter_offset != std::string::npos) {
268
+ throw std::invalid_argument (" Variable not found." );
269
+ }
270
+
271
+ if (comp (variable, " RESPONSE_CONTENT_TYPE" )) {
272
+ t->m_variableResponseContentType .evaluate (l);
273
+ } else if (comp (variable, " ARGS_COMBINED_SIZE" )) {
274
+ t->m_variableARGScombinedSize .evaluate (l);
275
+ } else if (comp (variable, " AUTH_TYPE" )) {
276
+ t->m_variableAuthType .evaluate (l);
277
+ } else if (comp (variable, " FILES_COMBINED_SIZE" )) {
278
+ t->m_variableFilesCombinedSize .evaluate (l);
279
+ } else if (comp (variable, " FULL_REQUEST" )) {
280
+ t->m_variableFullRequest .evaluate (l);
281
+ } else if (comp (variable, " FULL_REQUEST_LENGTH" )) {
282
+ t->m_variableFullRequestLength .evaluate (l);
283
+ } else if (comp (variable, " INBOUND_DATA_ERROR" )) {
284
+ t->m_variableInboundDataError .evaluate (l);
285
+ } else if (comp (variable, " MATCHED_VAR" )) {
286
+ t->m_variableMatchedVar .evaluate (l);
287
+ } else if (comp (variable, " MATCHED_VAR_NAME" )) {
288
+ t->m_variableMatchedVarName .evaluate (l);
289
+ } else if (comp (variable, " MSC_PCRE_ERROR" )) {
290
+ t->m_variableMscPcreError .evaluate (l);
291
+ } else if (comp (variable, " MSC_PCRE_LIMITS_EXCEEDED" )) {
292
+ t->m_variableMscPcreLimitsExceeded .evaluate (l);
293
+ } else if (comp (variable, " MULTIPART_CRLF_LF_LINES" )) {
294
+ t->m_variableMultipartCrlfLFLines .evaluate (l);
295
+ } else if (comp (variable, " MULTIPART_DATA_AFTER" )) {
296
+ t->m_variableMultipartDataAfter .evaluate (l);
297
+ } else if (comp (variable, " MULTIPART_FILE_LIMIT_EXCEEDED" )) {
298
+ t->m_variableMultipartFileLimitExceeded .evaluate (l);
299
+ } else if (comp (variable, " MULTIPART_STRICT_ERROR" )) {
300
+ t->m_variableMultipartStrictError .evaluate (l);
301
+ } else if (comp (variable, " MULTIPART_HEADER_FOLDING" )) {
302
+ t->m_variableMultipartHeaderFolding .evaluate (l);
303
+ } else if (comp (variable, " MULTIPART_INVALID_QUOTING" )) {
304
+ t->m_variableMultipartInvalidQuoting .evaluate (l);
305
+ } else if (comp (variable, " MULTIPART_INVALID_HEADER_FOLDING" )) {
306
+ t->m_variableMultipartInvalidHeaderFolding .evaluate (l);
307
+ } else if (comp (variable, " MULTIPART_UNMATCHED_BOUNDARY" )) {
308
+ t->m_variableMultipartUnmatchedBoundary .evaluate (l);
309
+ } else if (comp (variable, " OUTBOUND_DATA_ERROR" )) {
310
+ t->m_variableOutboundDataError .evaluate (l);
311
+ } else if (comp (variable, " PATH_INFO" )) {
312
+ t->m_variablePathInfo .evaluate (l);
313
+ } else if (comp (variable, " QUERY_STRING" )) {
314
+ t->m_variableQueryString .evaluate (l);
315
+ } else if (comp (variable, " REMOTE_ADDR" )) {
316
+ t->m_variableRemoteAddr .evaluate (l);
317
+ } else if (comp (variable, " REMOTE_HOST" )) {
318
+ t->m_variableRemoteHost .evaluate (l);
319
+ } else if (comp (variable, " REMOTE_PORT" )) {
320
+ t->m_variableRemotePort .evaluate (l);
321
+ } else if (comp (variable, " REQBODY_ERROR" )) {
322
+ t->m_variableReqbodyError .evaluate (l);
323
+ } else if (comp (variable, " REQBODY_ERROR_MSG" )) {
324
+ t->m_variableReqbodyErrorMsg .evaluate (l);
325
+ } else if (comp (variable, " REQBODY_PROCESSOR_ERROR_MSG" )) {
326
+ t->m_variableReqbodyProcessorErrorMsg .evaluate (l);
327
+ } else if (comp (variable, " REQBODY_PROCESSOR_ERROR" )) {
328
+ t->m_variableReqbodyProcessorError .evaluate (l);
329
+ } else if (comp (variable, " REQBODY_PROCESSOR" )) {
330
+ t->m_variableReqbodyProcessor .evaluate (l);
331
+ } else if (comp (variable, " REQUEST_BASENAME" )) {
332
+ t->m_variableRequestBasename .evaluate (l);
333
+ } else if (comp (variable, " REQUEST_BODY" )) {
334
+ t->m_variableRequestBody .evaluate (l);
335
+ } else if (comp (variable, " REQUEST_BODY_LENGTH" )) {
336
+ t->m_variableRequestBodyLength .evaluate (l);
337
+ } else if (comp (variable, " REQUEST_FILENAME" )) {
338
+ t->m_variableRequestFilename .evaluate (l);
339
+ } else if (comp (variable, " REQUEST_LINE" )) {
340
+ t->m_variableRequestLine .evaluate (l);
341
+ } else if (comp (variable, " REQUEST_METHOD" )) {
342
+ t->m_variableRequestMethod .evaluate (l);
343
+ } else if (comp (variable, " REQUEST_PROTOCOL" )) {
344
+ t->m_variableRequestProtocol .evaluate (l);
345
+ } else if (comp (variable, " REQUEST_URI" )) {
346
+ t->m_variableRequestURI .evaluate (l);
347
+ } else if (comp (variable, " REQUEST_URI_RAW" )) {
348
+ t->m_variableRequestURIRaw .evaluate (l);
349
+ } else if (comp (variable, " RESOURCE" )) {
350
+ t->m_variableResource .evaluate (l);
351
+ } else if (comp (variable, " RESPONSE_BODY" )) {
352
+ t->m_variableResponseBody .evaluate (l);
353
+ } else if (comp (variable, " RESPONSE_CONTENT_LENGTH" )) {
354
+ t->m_variableResponseContentLength .evaluate (l);
355
+ } else if (comp (variable, " RESPONSE_PROTOCOL" )) {
356
+ t->m_variableResponseProtocol .evaluate (l);
357
+ } else if (comp (variable, " RESPONSE_STATUS" )) {
358
+ t->m_variableResponseStatus .evaluate (l);
359
+ } else if (comp (variable, " SERVER_ADDR" )) {
360
+ t->m_variableServerAddr .evaluate (l);
361
+ } else if (comp (variable, " SERVER_NAME" )) {
362
+ t->m_variableServerName .evaluate (l);
363
+ } else if (comp (variable, " SERVER_PORT" )) {
364
+ t->m_variableServerPort .evaluate (l);
365
+ } else if (comp (variable, " SESSIONID" )) {
366
+ t->m_variableSessionID .evaluate (l);
367
+ } else if (comp (variable, " UNIQUE_ID" )) {
368
+ t->m_variableUniqueID .evaluate (l);
369
+ } else if (comp (variable, " URLENCODED_ERROR" )) {
370
+ t->m_variableUrlEncodedError .evaluate (l);
371
+ } else if (comp (variable, " USERID" )) {
372
+ t->m_variableUserID .evaluate (l);
373
+ } else {
374
+ throw std::invalid_argument (" Variable not found." );
343
375
}
344
376
}
345
377
0 commit comments