spoofchecker_main.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. +----------------------------------------------------------------------+
  3. | This source file is subject to version 3.01 of the PHP license, |
  4. | that is bundled with this package in the file LICENSE, and is |
  5. | available through the world-wide-web at the following url: |
  6. | https://www.php.net/license/3_01.txt |
  7. | If you did not receive a copy of the PHP license and are unable to |
  8. | obtain it through the world-wide-web, please send a note to |
  9. | license@php.net so we can mail you a copy immediately. |
  10. +----------------------------------------------------------------------+
  11. | Authors: Scott MacVicar <scottmac@php.net> |
  12. +----------------------------------------------------------------------+
  13. */
  14. #ifdef HAVE_CONFIG_H
  15. #include "config.h"
  16. #endif
  17. #include "php_intl.h"
  18. #include "spoofchecker_class.h"
  19. /* {{{ Checks if a given text contains any suspicious characters */
  20. PHP_METHOD(Spoofchecker, isSuspicious)
  21. {
  22. int ret;
  23. char *text;
  24. size_t text_len;
  25. zval *error_code = NULL;
  26. SPOOFCHECKER_METHOD_INIT_VARS;
  27. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &text, &text_len, &error_code)) {
  28. RETURN_THROWS();
  29. }
  30. SPOOFCHECKER_METHOD_FETCH_OBJECT;
  31. ret = uspoof_checkUTF8(co->uspoof, text, text_len, NULL, SPOOFCHECKER_ERROR_CODE_P(co));
  32. if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
  33. php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
  34. RETURN_TRUE;
  35. }
  36. if (error_code) {
  37. zval_ptr_dtor(error_code);
  38. ZVAL_LONG(error_code, ret);
  39. }
  40. RETVAL_BOOL(ret != 0);
  41. }
  42. /* }}} */
  43. /* {{{ Checks if a given text contains any confusable characters */
  44. PHP_METHOD(Spoofchecker, areConfusable)
  45. {
  46. int ret;
  47. char *s1, *s2;
  48. size_t s1_len, s2_len;
  49. zval *error_code = NULL;
  50. SPOOFCHECKER_METHOD_INIT_VARS;
  51. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "ss|z", &s1, &s1_len,
  52. &s2, &s2_len, &error_code)) {
  53. RETURN_THROWS();
  54. }
  55. SPOOFCHECKER_METHOD_FETCH_OBJECT;
  56. if(s1_len > INT32_MAX || s2_len > INT32_MAX) {
  57. SPOOFCHECKER_ERROR_CODE(co) = U_BUFFER_OVERFLOW_ERROR;
  58. } else {
  59. ret = uspoof_areConfusableUTF8(co->uspoof, s1, (int32_t)s1_len, s2, (int32_t)s2_len, SPOOFCHECKER_ERROR_CODE_P(co));
  60. }
  61. if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
  62. php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
  63. RETURN_TRUE;
  64. }
  65. if (error_code) {
  66. zval_ptr_dtor(error_code);
  67. ZVAL_LONG(error_code, ret);
  68. }
  69. RETVAL_BOOL(ret != 0);
  70. }
  71. /* }}} */
  72. /* {{{ Locales to use when running checks */
  73. PHP_METHOD(Spoofchecker, setAllowedLocales)
  74. {
  75. char *locales;
  76. size_t locales_len;
  77. SPOOFCHECKER_METHOD_INIT_VARS;
  78. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s", &locales, &locales_len)) {
  79. RETURN_THROWS();
  80. }
  81. SPOOFCHECKER_METHOD_FETCH_OBJECT;
  82. uspoof_setAllowedLocales(co->uspoof, locales, SPOOFCHECKER_ERROR_CODE_P(co));
  83. if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
  84. php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
  85. return;
  86. }
  87. }
  88. /* }}} */
  89. /* {{{ Set the checks to run */
  90. PHP_METHOD(Spoofchecker, setChecks)
  91. {
  92. zend_long checks;
  93. SPOOFCHECKER_METHOD_INIT_VARS;
  94. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "l", &checks)) {
  95. RETURN_THROWS();
  96. }
  97. SPOOFCHECKER_METHOD_FETCH_OBJECT;
  98. uspoof_setChecks(co->uspoof, checks, SPOOFCHECKER_ERROR_CODE_P(co));
  99. if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
  100. php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
  101. }
  102. }
  103. /* }}} */
  104. #if U_ICU_VERSION_MAJOR_NUM >= 58
  105. /* TODO Document this method on PHP.net */
  106. /* {{{ Set the loosest restriction level allowed for strings. */
  107. PHP_METHOD(Spoofchecker, setRestrictionLevel)
  108. {
  109. zend_long level;
  110. SPOOFCHECKER_METHOD_INIT_VARS;
  111. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "l", &level)) {
  112. RETURN_THROWS();
  113. }
  114. SPOOFCHECKER_METHOD_FETCH_OBJECT;
  115. if (USPOOF_ASCII != level &&
  116. USPOOF_SINGLE_SCRIPT_RESTRICTIVE != level &&
  117. USPOOF_HIGHLY_RESTRICTIVE != level &&
  118. USPOOF_MODERATELY_RESTRICTIVE != level &&
  119. USPOOF_MINIMALLY_RESTRICTIVE != level &&
  120. USPOOF_UNRESTRICTIVE != level) {
  121. zend_argument_value_error(1, "must be one of Spoofchecker::ASCII, Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE, "
  122. "Spoofchecker::SINGLE_HIGHLY_RESTRICTIVE, Spoofchecker::SINGLE_MODERATELY_RESTRICTIVE, "
  123. "Spoofchecker::SINGLE_MINIMALLY_RESTRICTIVE, or Spoofchecker::UNRESTRICTIVE");
  124. RETURN_THROWS();
  125. }
  126. uspoof_setRestrictionLevel(co->uspoof, (URestrictionLevel)level);
  127. }
  128. /* }}} */
  129. #endif