PageRenderTime 47ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/apache2/re_tfns.c

https://github.com/peterwillcn/ModSecurity
C | 1051 lines | 1016 code | 7 blank | 28 comment | 3 complexity | 2fc58dd9d141c7eefe55e15f3e8f8336 MD5 | raw file
Possible License(s): Apache-2.0
  1. /*
  2. * ModSecurity for Apache 2.x, http://www.modsecurity.org/
  3. * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
  4. *
  5. * You may not use this file except in compliance with
  6. * the License.  You may obtain a copy of the License at
  7. *
  8. *     http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * If any of the files related to licensing are missing or if you have any
  11. * other questions related to licensing please contact Trustwave Holdings, Inc.
  12. * directly using the email address security@modsecurity.org.
  13. */
  14. #include <ctype.h>
  15. #include "apr_md5.h"
  16. #include "apr_sha1.h"
  17. #include "apr_base64.h"
  18. #include "msc_unicode.h"
  19. #include "re.h"
  20. #include "msc_util.h"
  21. /* cmdline */
  22. /**
  23. * \brief cmdline transformation function
  24. *
  25. * \param mptmp Pointer to resource pool
  26. * \param input Pointer to input data
  27. * \param input_len Input data length
  28. * \param rval Pointer to decoded buffer
  29. * \param rval_len Decoded buffer length
  30. *
  31. * \retval 0 On failure
  32. * \retval 1 On Success
  33. */
  34. static int msre_fn_cmdline_execute(apr_pool_t *mptmp, unsigned char *input,
  35. long int input_len, char **rval, long int *rval_len)
  36. {
  37. int space = 0;
  38. unsigned char *s = input;
  39. if (rval == NULL) return -1;
  40. *rval = (char *)input;
  41. /* Check characters */
  42. for ( ; *input; input++ ) {
  43. switch(*input) {
  44. /* remove some characters */
  45. case '"':
  46. case '\'':
  47. case '\\':
  48. case '^':
  49. continue;
  50. /* replace some characters to space (only one) */
  51. case ' ':
  52. case ',':
  53. case ';':
  54. case '\t':
  55. case '\r':
  56. case '\n':
  57. if (!space) {
  58. *s++ = ' ';
  59. space++;
  60. }
  61. break;
  62. case '/':
  63. case '(':
  64. /* remove space before / or ( */
  65. if (space) s--;
  66. space = 0;
  67. *s++ = *input;
  68. break;
  69. /* copy normal characters */
  70. default :
  71. *s++ = tolower(*input);
  72. space = 0;
  73. }
  74. }
  75. *s = 0;
  76. *rval_len = strlen(*rval);
  77. return 1;
  78. }
  79. /* lowercase */
  80. static int msre_fn_lowercase_execute(apr_pool_t *mptmp, unsigned char *input,
  81. long int input_len, char **rval, long int *rval_len)
  82. {
  83. long int i;
  84. int changed = 0;
  85. if (rval == NULL) return -1;
  86. *rval = NULL;
  87. i = 0;
  88. while(i < input_len) {
  89. int x = input[i];
  90. input[i] = tolower(x);
  91. if (x != input[i]) changed = 1;
  92. i++;
  93. }
  94. *rval = (char *)input;
  95. *rval_len = input_len;
  96. return changed;
  97. }
  98. /* trimLeft */
  99. static int msre_fn_trimLeft_execute(apr_pool_t *mptmp, unsigned char *input,
  100. long int input_len, char **rval, long int *rval_len)
  101. {
  102. long int i;
  103. *rval = (char *)input;
  104. for (i = 0; i < input_len; i++) {
  105. if (isspace(**rval) == 0) {
  106. break;
  107. }
  108. (*rval)++;
  109. }
  110. *rval_len = input_len - i;
  111. return (*rval_len == input_len ? 0 : 1);
  112. }
  113. /* trimRight */
  114. static int msre_fn_trimRight_execute(apr_pool_t *mptmp, unsigned char *input,
  115. long int input_len, char **rval, long int *rval_len)
  116. {
  117. long int i;
  118. *rval = (char *)input;
  119. for (i = input_len - 1; i >= 0; i--) {
  120. if (isspace((*rval)[i]) == 0) {
  121. break;
  122. }
  123. (*rval)[i] = '\0';
  124. }
  125. *rval_len = i + 1;
  126. return (*rval_len == input_len ? 0 : 1);
  127. }
  128. /* trim */
  129. static int msre_fn_trim_execute(apr_pool_t *mptmp, unsigned char *input,
  130. long int input_len, char **rval, long int *rval_len)
  131. {
  132. int rc = 0;
  133. rc = msre_fn_trimLeft_execute(mptmp, input, input_len, rval, rval_len);
  134. if (rc == 1) {
  135. rc = msre_fn_trimRight_execute(mptmp, (unsigned char *)*rval, *rval_len, rval, rval_len);
  136. }
  137. else {
  138. rc = msre_fn_trimRight_execute(mptmp, input, input_len, rval, rval_len);
  139. }
  140. return (*rval_len == input_len ? 0 : 1);
  141. }
  142. /* removeNulls */
  143. static int msre_fn_removeNulls_execute(apr_pool_t *mptmp, unsigned char *input,
  144. long int input_len, char **rval, long int *rval_len)
  145. {
  146. long int i, j;
  147. int changed = 0;
  148. i = j = 0;
  149. while(i < input_len) {
  150. if (input[i] == '\0') {
  151. changed = 1;
  152. } else {
  153. input[j] = input[i];
  154. j++;
  155. }
  156. i++;
  157. }
  158. *rval = (char *)input;
  159. *rval_len = j;
  160. return changed;
  161. }
  162. /* replaceNulls */
  163. static int msre_fn_replaceNulls_execute(apr_pool_t *mptmp, unsigned char *input,
  164. long int input_len, char **rval, long int *rval_len)
  165. {
  166. long int i;
  167. int changed = 0;
  168. if (rval == NULL) return -1;
  169. *rval = NULL;
  170. i = 0;
  171. while(i < input_len) {
  172. if (input[i] == '\0') {
  173. changed = 1;
  174. input[i] = ' ';
  175. }
  176. i++;
  177. }
  178. *rval = (char *)input;
  179. *rval_len = input_len;
  180. return changed;
  181. }
  182. /* compressWhitespace */
  183. static int msre_fn_compressWhitespace_execute(apr_pool_t *mptmp, unsigned char *input,
  184. long int input_len, char **rval, long int *rval_len)
  185. {
  186. long int i, j, count;
  187. int changed = 0;
  188. int inwhitespace = 0;
  189. i = j = count = 0;
  190. while(i < input_len) {
  191. if (isspace(input[i])||(input[i] == NBSP)) {
  192. if (inwhitespace) changed = 1;
  193. inwhitespace = 1;
  194. count++;
  195. } else {
  196. inwhitespace = 0;
  197. if (count) {
  198. input[j] = ' ';
  199. count = 0;
  200. j++;
  201. }
  202. input[j] = input[i];
  203. j++;
  204. }
  205. i++;
  206. }
  207. if (count) {
  208. input[j] = ' ';
  209. j++;
  210. }
  211. *rval = (char *)input;
  212. *rval_len = j;
  213. return changed;
  214. }
  215. /* cssDecode */
  216. static int msre_fn_cssDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  217. long int input_len, char **rval, long int *rval_len)
  218. {
  219. long int length;
  220. length = css_decode_inplace(input, input_len);
  221. *rval = (char *)input;
  222. *rval_len = length;
  223. return (*rval_len == input_len ? 0 : 1);
  224. }
  225. /* removeWhitespace */
  226. static int msre_fn_removeWhitespace_execute(apr_pool_t *mptmp, unsigned char *input,
  227. long int input_len, char **rval, long int *rval_len)
  228. {
  229. long int i, j;
  230. int changed = 0;
  231. i = j = 0;
  232. while(i < input_len) {
  233. if (isspace(input[i])||(input[i] == NBSP)) {
  234. /* do nothing */
  235. changed = 1;
  236. } else {
  237. input[j] = input[i];
  238. j++;
  239. }
  240. i++;
  241. }
  242. *rval = (char *)input;
  243. *rval_len = j;
  244. return changed;
  245. }
  246. /* removeCommentsChar */
  247. static int msre_fn_removeCommentsChar_execute(apr_pool_t *mptmp, unsigned char *input,
  248. long int input_len, char **rval, long int *rval_len)
  249. {
  250. long int i, j;
  251. int changed = 0;
  252. i = j = 0;
  253. while(i < input_len) {
  254. if ((input[i] == '/')&&(i + 1 < input_len)&&(input[i + 1] == '*')) {
  255. changed = 1;
  256. i += 2;
  257. } else if ((input[i] == '*')&&(i + 1 < input_len)&&(input[i + 1] == '/')) {
  258. changed = 1;
  259. i += 2;
  260. } else if ((input[i] == '<')&&(i + 1 < input_len)&&(input[i + 1] == '!')&&
  261. (i + 2 < input_len)&&(input[i+2] == '-')&&(i + 3 < input_len)&&
  262. (input[i + 3] == '-')) {
  263. changed = 1;
  264. i += 4;
  265. } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')&&
  266. (i + 2 < input_len)&&(input[i+2] == '>')) {
  267. changed = 1;
  268. i += 3;
  269. } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')) {
  270. changed = 1;
  271. i += 2;
  272. } else if (input[i] == '#') {
  273. changed = 1;
  274. i++;
  275. } else {
  276. input[j] = input[i];
  277. i++;
  278. j++;
  279. }
  280. }
  281. input[j] = '\0';
  282. *rval = (char *)input;
  283. *rval_len = j;
  284. return changed;
  285. }
  286. /* removeComments */
  287. static int msre_fn_removeComments_execute(apr_pool_t *mptmp, unsigned char *input,
  288. long int input_len, char **rval, long int *rval_len)
  289. {
  290. long int i, j, incomment;
  291. int changed = 0;
  292. i = j = incomment = 0;
  293. while(i < input_len) {
  294. if (incomment == 0) {
  295. if ((input[i] == '/')&&(i + 1 < input_len)&&(input[i + 1] == '*')) {
  296. changed = 1;
  297. incomment = 1;
  298. i += 2;
  299. } else if ((input[i] == '<')&&(i + 1 < input_len)&&(input[i + 1] == '!')&&
  300. (i + 2 < input_len)&&(input[i+2] == '-')&&(i + 3 < input_len)&&
  301. (input[i + 3] == '-') && (incomment == 0)) {
  302. incomment = 1;
  303. changed = 1;
  304. i += 4;
  305. } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')
  306. && (incomment == 0)) {
  307. changed = 1;
  308. input[i] = ' ';
  309. break;
  310. } else if (input[i] == '#' && (incomment == 0)) {
  311. changed = 1;
  312. input[i] = ' ';
  313. break;
  314. } else {
  315. input[j] = input[i];
  316. i++;
  317. j++;
  318. }
  319. } else {
  320. if ((input[i] == '*')&&(i + 1 < input_len)&&(input[i + 1] == '/')) {
  321. incomment = 0;
  322. i += 2;
  323. input[j] = input[i];
  324. i++;
  325. j++;
  326. } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')&&
  327. (i + 2 < input_len)&&(input[i+2] == '>')) {
  328. incomment = 0;
  329. i += 3;
  330. input[j] = input[i];
  331. i++;
  332. j++;
  333. } else {
  334. i++;
  335. }
  336. }
  337. }
  338. if (incomment) {
  339. input[j++] = ' ';
  340. }
  341. *rval = (char *)input;
  342. *rval_len = j;
  343. return changed;
  344. }
  345. /* replaceComments */
  346. static int msre_fn_replaceComments_execute(apr_pool_t *mptmp, unsigned char *input,
  347. long int input_len, char **rval, long int *rval_len)
  348. {
  349. long int i, j, incomment;
  350. int changed = 0;
  351. i = j = incomment = 0;
  352. while(i < input_len) {
  353. if (incomment == 0) {
  354. if ((input[i] == '/')&&(i + 1 < input_len)&&(input[i + 1] == '*')) {
  355. changed = 1;
  356. incomment = 1;
  357. i += 2;
  358. } else {
  359. input[j] = input[i];
  360. i++;
  361. j++;
  362. }
  363. } else {
  364. if ((input[i] == '*')&&(i + 1 < input_len)&&(input[i + 1] == '/')) {
  365. incomment = 0;
  366. i += 2;
  367. input[j] = ' ';
  368. j++;
  369. } else {
  370. i++;
  371. }
  372. }
  373. }
  374. if (incomment) {
  375. input[j++] = ' ';
  376. }
  377. *rval = (char *)input;
  378. *rval_len = j;
  379. return changed;
  380. }
  381. /* jsDecode */
  382. static int msre_fn_jsDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  383. long int input_len, char **rval, long int *rval_len)
  384. {
  385. long int length;
  386. length = js_decode_nonstrict_inplace(input, input_len);
  387. *rval = (char *)input;
  388. *rval_len = length;
  389. return (*rval_len == input_len ? 0 : 1);
  390. }
  391. /* urlDecode */
  392. static int msre_fn_urlDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  393. long int input_len, char **rval, long int *rval_len)
  394. {
  395. long int length;
  396. int invalid_count;
  397. int changed;
  398. length = urldecode_nonstrict_inplace_ex(input, input_len, &invalid_count, &changed);
  399. *rval = (char *)input;
  400. *rval_len = length;
  401. return changed;
  402. }
  403. /* urlDecodeUni */
  404. static int msre_fn_urlDecodeUni_execute(apr_pool_t *mptmp, unsigned char *input,
  405. long int input_len, char **rval, long int *rval_len)
  406. {
  407. long int length;
  408. int changed;
  409. length = urldecode_uni_nonstrict_inplace_ex(input, input_len, &changed);
  410. *rval = (char *)input;
  411. *rval_len = length;
  412. return changed;
  413. }
  414. static int msre_fn_utf8Unicode_execute(apr_pool_t *mptmp, unsigned char *input,
  415. long int input_len, char **rval, long int *rval_len)
  416. {
  417. int changed = 0;
  418. *rval = (char *)utf8_unicode_inplace_ex(mptmp, input, input_len, &changed);
  419. *rval_len = strlen(*rval);
  420. return changed;
  421. }
  422. /* urlEncode */
  423. static int msre_fn_urlEncode_execute(apr_pool_t *mptmp, unsigned char *input,
  424. long int input_len, char **rval, long int *rval_len)
  425. {
  426. int changed;
  427. *rval = url_encode(mptmp, (char *)input, input_len, &changed);
  428. *rval_len = strlen(*rval);
  429. return changed;
  430. }
  431. /* base64Encode */
  432. static int msre_fn_base64Encode_execute(apr_pool_t *mptmp, unsigned char *input,
  433. long int input_len, char **rval, long int *rval_len)
  434. {
  435. *rval_len = apr_base64_encode_len(input_len); /* returns len with NULL byte included */
  436. *rval = apr_palloc(mptmp, *rval_len);
  437. apr_base64_encode(*rval, (const char *)input, input_len);
  438. (*rval_len)--;
  439. return *rval_len ? 1 : 0;
  440. }
  441. /* base64Decode */
  442. static int msre_fn_base64Decode_execute(apr_pool_t *mptmp, unsigned char *input,
  443. long int input_len, char **rval, long int *rval_len)
  444. {
  445. *rval_len = apr_base64_decode_len((const char *)input); /* returns len with NULL byte included */
  446. *rval = apr_palloc(mptmp, *rval_len);
  447. *rval_len = apr_base64_decode(*rval, (const char *)input);
  448. return *rval_len ? 1 : 0;
  449. }
  450. /* length */
  451. static int msre_fn_length_execute(apr_pool_t *mptmp, unsigned char *input,
  452. long int input_len, char **rval, long int *rval_len)
  453. {
  454. *rval = apr_psprintf(mptmp, "%ld", input_len);
  455. *rval_len = strlen(*rval);
  456. return 1;
  457. }
  458. /* md5 */
  459. static int msre_fn_md5_execute(apr_pool_t *mptmp, unsigned char *input,
  460. long int input_len, char **rval, long int *rval_len)
  461. {
  462. unsigned char digest[APR_MD5_DIGESTSIZE];
  463. apr_md5(digest, input, input_len);
  464. *rval_len = APR_MD5_DIGESTSIZE;
  465. *rval = apr_pstrmemdup(mptmp, (const char *)digest, APR_MD5_DIGESTSIZE);
  466. return 1;
  467. }
  468. /* sha1 */
  469. static int msre_fn_sha1_execute(apr_pool_t *mptmp, unsigned char *input,
  470. long int input_len, char **rval, long int *rval_len)
  471. {
  472. unsigned char digest[APR_SHA1_DIGESTSIZE];
  473. apr_sha1_ctx_t context;
  474. apr_sha1_init(&context);
  475. apr_sha1_update(&context, (const char *)input, input_len);
  476. apr_sha1_final(digest, &context);
  477. *rval_len = APR_SHA1_DIGESTSIZE;
  478. *rval = apr_pstrmemdup(mptmp, (const char *)digest, APR_SHA1_DIGESTSIZE);
  479. return 1;
  480. }
  481. /**
  482. * \brief SqlHexDecode transformation function. Transform xNN data.
  483. *
  484. * \param mptmp Pointer to resource pool
  485. * \param input Pointer to input data
  486. * \param input_len Input data length
  487. * \param rval Pointer to decoded buffer
  488. * \param rval_len Decoded buffer length
  489. *
  490. * \retval 0 On failure
  491. * \retval 1 On Success
  492. */
  493. static int msre_fn_sqlHexDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  494. long int input_len, char **rval, long int *rval_len)
  495. {
  496. *rval_len = sql_hex2bytes_inplace(input, input_len);
  497. *rval = (char *)input;
  498. return 1;
  499. }
  500. /* hexDecode */
  501. static int msre_fn_hexDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  502. long int input_len, char **rval, long int *rval_len)
  503. {
  504. *rval_len = hex2bytes_inplace(input, input_len);
  505. *rval = (char *)input;
  506. return 1;
  507. }
  508. /* hexEncode */
  509. static int msre_fn_hexEncode_execute(apr_pool_t *mptmp, unsigned char *input,
  510. long int input_len, char **rval, long int *rval_len)
  511. {
  512. *rval = bytes2hex(mptmp, input, input_len);
  513. *rval_len = strlen(*rval);
  514. return 1;
  515. }
  516. /* htmlEntityDecode */
  517. static int msre_fn_htmlEntityDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  518. long int input_len, char **rval, long int *rval_len)
  519. {
  520. *rval_len = html_entities_decode_inplace(mptmp, input, input_len);
  521. *rval = (char *)input;
  522. return (*rval_len == input_len ? 0 : 1);
  523. }
  524. /* escapeSeqDecode */
  525. static int msre_fn_escapeSeqDecode_execute(apr_pool_t *mptmp, unsigned char *input,
  526. long int input_len, char **rval, long int *rval_len)
  527. {
  528. *rval_len = ansi_c_sequences_decode_inplace(input, input_len);
  529. *rval = (char *)input;
  530. return (*rval_len == input_len ? 0 : 1);
  531. }
  532. /* normalizePath */
  533. static int msre_fn_normalizePath_execute(apr_pool_t *mptmp, unsigned char *input,
  534. long int input_len, char **rval, long int *rval_len)
  535. {
  536. int changed;
  537. *rval_len = normalize_path_inplace(input, input_len, 0, &changed);
  538. *rval = (char *)input;
  539. return changed;
  540. }
  541. /* normalizePathWin */
  542. static int msre_fn_normalizePathWin_execute(apr_pool_t *mptmp, unsigned char *input,
  543. long int input_len, char **rval, long int *rval_len)
  544. {
  545. int changed;
  546. *rval_len = normalize_path_inplace(input, input_len, 1, &changed);
  547. *rval = (char *)input;
  548. return changed;
  549. }
  550. /* parityEven7bit */
  551. static int msre_fn_parityEven7bit_execute(apr_pool_t *mptmp, unsigned char *input,
  552. long int input_len, char **rval, long int *rval_len)
  553. {
  554. long int i;
  555. int changed = 0;
  556. if (rval == NULL) return -1;
  557. *rval = NULL;
  558. i = 0;
  559. while(i < input_len) {
  560. unsigned int x = input[i];
  561. input[i] ^= input[i] >> 4;
  562. input[i] &= 0xf;
  563. if ((0x6996 >> input[i]) & 1) {
  564. input[i] = x | 0x80;
  565. }
  566. else {
  567. input[i] = x & 0x7f;
  568. }
  569. if (x != input[i]) changed = 1;
  570. i++;
  571. }
  572. *rval = (char *)input;
  573. *rval_len = input_len;
  574. return changed;
  575. }
  576. /* parityZero7bit */
  577. static int msre_fn_parityZero7bit_execute(apr_pool_t *mptmp, unsigned char *input,
  578. long int input_len, char **rval, long int *rval_len)
  579. {
  580. long int i;
  581. int changed = 0;
  582. if (rval == NULL) return -1;
  583. *rval = NULL;
  584. i = 0;
  585. while(i < input_len) {
  586. unsigned char c = input[i];
  587. input[i] &= 0x7f;
  588. if (c != input[i]) changed = 1;
  589. i++;
  590. }
  591. *rval = (char *)input;
  592. *rval_len = input_len;
  593. return changed;
  594. }
  595. /* parityOdd7bit */
  596. static int msre_fn_parityOdd7bit_execute(apr_pool_t *mptmp, unsigned char *input,
  597. long int input_len, char **rval, long int *rval_len)
  598. {
  599. long int i;
  600. int changed = 0;
  601. if (rval == NULL) return -1;
  602. *rval = NULL;
  603. i = 0;
  604. while(i < input_len) {
  605. unsigned int x = input[i];
  606. input[i] ^= input[i] >> 4;
  607. input[i] &= 0xf;
  608. if ((0x6996 >> input[i]) & 1) {
  609. input[i] = x & 0x7f;
  610. }
  611. else {
  612. input[i] = x | 0x80;
  613. }
  614. if (x != input[i]) changed = 1;
  615. i++;
  616. }
  617. *rval = (char *)input;
  618. *rval_len = input_len;
  619. return changed;
  620. }
  621. /**
  622. * \brief Base64 transformation function based on RFC2045
  623. *
  624. * \param mptmp Pointer to resource pool
  625. * \param input Pointer to input data
  626. * \param input_len Input data length
  627. * \param rval Pointer to decoded buffer
  628. * \param rval_len Decoded buffer length
  629. *
  630. * \retval 0 On failure
  631. * \retval 1 On Success
  632. */
  633. static int msre_fn_base64DecodeExt_execute(apr_pool_t *mptmp, unsigned char *input, long int input_len, char **rval, long int *rval_len)
  634. {
  635. *rval_len = input_len;
  636. *rval = apr_palloc(mptmp, *rval_len);
  637. *rval_len = decode_base64_ext(*rval, (const unsigned char *)input, input_len);
  638. return *rval_len ? 1 : 0;
  639. }
  640. /* ------------------------------------------------------------------------------ */
  641. /**
  642. * Registers one transformation function with the engine.
  643. */
  644. void msre_engine_tfn_register(msre_engine *engine, const char *name,
  645. fn_tfn_execute_t execute)
  646. {
  647. msre_tfn_metadata *metadata = (msre_tfn_metadata *)apr_pcalloc(engine->mp,
  648. sizeof(msre_tfn_metadata));
  649. if (metadata == NULL) return;
  650. metadata->name = name;
  651. metadata->execute = execute;
  652. apr_table_setn(engine->tfns, name, (void *)metadata);
  653. }
  654. /**
  655. * Returns transformation function metadata given a name.
  656. */
  657. msre_tfn_metadata *msre_engine_tfn_resolve(msre_engine *engine, const char *name) {
  658. return (msre_tfn_metadata *)apr_table_get(engine->tfns, name);
  659. }
  660. /**
  661. * Register the default transformation functions.
  662. */
  663. void msre_engine_register_default_tfns(msre_engine *engine) {
  664. /* none */
  665. msre_engine_tfn_register(engine,
  666. "none",
  667. NULL
  668. );
  669. /* base64Decode */
  670. msre_engine_tfn_register(engine,
  671. "base64Decode",
  672. msre_fn_base64Decode_execute
  673. );
  674. /* base64Encode */
  675. msre_engine_tfn_register(engine,
  676. "base64Encode",
  677. msre_fn_base64Encode_execute
  678. );
  679. /* compressWhitespace */
  680. msre_engine_tfn_register(engine,
  681. "compressWhitespace",
  682. msre_fn_compressWhitespace_execute
  683. );
  684. /* cssDecode */
  685. msre_engine_tfn_register(engine,
  686. "cssDecode",
  687. msre_fn_cssDecode_execute
  688. );
  689. /* escapeSeqDecode */
  690. msre_engine_tfn_register(engine,
  691. "escapeSeqDecode",
  692. msre_fn_escapeSeqDecode_execute
  693. );
  694. /* sqlHexDecode */
  695. msre_engine_tfn_register(engine,
  696. "sqlHexDecode",
  697. msre_fn_sqlHexDecode_execute
  698. );
  699. /* hexDecode */
  700. msre_engine_tfn_register(engine,
  701. "hexDecode",
  702. msre_fn_hexDecode_execute
  703. );
  704. /* hexEncode */
  705. msre_engine_tfn_register(engine,
  706. "hexEncode",
  707. msre_fn_hexEncode_execute
  708. );
  709. /* htmlEntityDecode */
  710. msre_engine_tfn_register(engine,
  711. "htmlEntityDecode",
  712. msre_fn_htmlEntityDecode_execute
  713. );
  714. /* jsDecode */
  715. msre_engine_tfn_register(engine,
  716. "jsDecode",
  717. msre_fn_jsDecode_execute
  718. );
  719. /* length */
  720. msre_engine_tfn_register(engine,
  721. "length",
  722. msre_fn_length_execute
  723. );
  724. /* lowercase */
  725. msre_engine_tfn_register(engine,
  726. "lowercase",
  727. msre_fn_lowercase_execute
  728. );
  729. /* md5 */
  730. msre_engine_tfn_register(engine,
  731. "md5",
  732. msre_fn_md5_execute
  733. );
  734. /* normalisePath */
  735. msre_engine_tfn_register(engine,
  736. "normalisePath",
  737. msre_fn_normalizePath_execute
  738. );
  739. /* normalizePath */
  740. msre_engine_tfn_register(engine,
  741. "normalizePath",
  742. msre_fn_normalizePath_execute
  743. );
  744. /* normalisePathWin */
  745. msre_engine_tfn_register(engine,
  746. "normalisePathWin",
  747. msre_fn_normalizePathWin_execute
  748. );
  749. /* normalizePathWin */
  750. msre_engine_tfn_register(engine,
  751. "normalizePathWin",
  752. msre_fn_normalizePathWin_execute
  753. );
  754. /* parityEven7bit */
  755. msre_engine_tfn_register(engine,
  756. "parityEven7bit",
  757. msre_fn_parityEven7bit_execute
  758. );
  759. /* parityZero7bit */
  760. msre_engine_tfn_register(engine,
  761. "parityZero7bit",
  762. msre_fn_parityZero7bit_execute
  763. );
  764. /* parityOdd7bit */
  765. msre_engine_tfn_register(engine,
  766. "parityOdd7bit",
  767. msre_fn_parityOdd7bit_execute
  768. );
  769. /* removeWhitespace */
  770. msre_engine_tfn_register(engine,
  771. "removeWhitespace",
  772. msre_fn_removeWhitespace_execute
  773. );
  774. /* removeNulls */
  775. msre_engine_tfn_register(engine,
  776. "removeNulls",
  777. msre_fn_removeNulls_execute
  778. );
  779. /* replaceNulls */
  780. msre_engine_tfn_register(engine,
  781. "replaceNulls",
  782. msre_fn_replaceNulls_execute
  783. );
  784. /* removeComments */
  785. msre_engine_tfn_register(engine,
  786. "removeComments",
  787. msre_fn_removeComments_execute
  788. );
  789. /* removeCommentsChar */
  790. msre_engine_tfn_register(engine,
  791. "removeCommentsChar",
  792. msre_fn_removeCommentsChar_execute
  793. );
  794. /* replaceComments */
  795. msre_engine_tfn_register(engine,
  796. "replaceComments",
  797. msre_fn_replaceComments_execute
  798. );
  799. /* sha1 */
  800. msre_engine_tfn_register(engine,
  801. "sha1",
  802. msre_fn_sha1_execute
  803. );
  804. /* trim */
  805. msre_engine_tfn_register(engine,
  806. "trim",
  807. msre_fn_trim_execute
  808. );
  809. /* trimLeft */
  810. msre_engine_tfn_register(engine,
  811. "trimLeft",
  812. msre_fn_trimLeft_execute
  813. );
  814. msre_engine_tfn_register(engine,
  815. "cmdline",
  816. msre_fn_cmdline_execute
  817. );
  818. /* trimRight */
  819. msre_engine_tfn_register(engine,
  820. "trimRight",
  821. msre_fn_trimRight_execute
  822. );
  823. /* urlDecode */
  824. msre_engine_tfn_register(engine,
  825. "urlDecode",
  826. msre_fn_urlDecode_execute
  827. );
  828. /* urlDecodeUni */
  829. msre_engine_tfn_register(engine,
  830. "urlDecodeUni",
  831. msre_fn_urlDecodeUni_execute
  832. );
  833. /* Utf8Unicode */
  834. msre_engine_tfn_register(engine,
  835. "Utf8toUnicode",
  836. msre_fn_utf8Unicode_execute
  837. );
  838. /* urlEncode */
  839. msre_engine_tfn_register(engine,
  840. "urlEncode",
  841. msre_fn_urlEncode_execute
  842. );
  843. /* base64DecodeExt */
  844. msre_engine_tfn_register(engine,
  845. "base64DecodeExt",
  846. msre_fn_base64DecodeExt_execute
  847. );
  848. }