test_config.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /* Copyright (c) 2001-2004, Roger Dingledine.
  2. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  3. * Copyright (c) 2007-2013, The Tor Project, Inc. */
  4. /* See LICENSE for licensing information */
  5. #include "orconfig.h"
  6. #include "or.h"
  7. #include "addressmap.h"
  8. #include "config.h"
  9. #include "confparse.h"
  10. #include "connection_edge.h"
  11. #include "test.h"
  12. static void
  13. test_config_addressmap(void *arg)
  14. {
  15. char buf[1024];
  16. char address[256];
  17. time_t expires = TIME_MAX;
  18. (void)arg;
  19. strlcpy(buf, "MapAddress .invalidwildcard.com *.torserver.exit\n" // invalid
  20. "MapAddress *invalidasterisk.com *.torserver.exit\n" // invalid
  21. "MapAddress *.google.com *.torserver.exit\n"
  22. "MapAddress *.yahoo.com *.google.com.torserver.exit\n"
  23. "MapAddress *.cn.com www.cnn.com\n"
  24. "MapAddress *.cnn.com www.cnn.com\n"
  25. "MapAddress ex.com www.cnn.com\n"
  26. "MapAddress ey.com *.cnn.com\n"
  27. "MapAddress www.torproject.org 1.1.1.1\n"
  28. "MapAddress other.torproject.org "
  29. "this.torproject.org.otherserver.exit\n"
  30. "MapAddress test.torproject.org 2.2.2.2\n"
  31. "MapAddress www.google.com 3.3.3.3\n"
  32. "MapAddress www.example.org 4.4.4.4\n"
  33. "MapAddress 4.4.4.4 7.7.7.7\n"
  34. "MapAddress 4.4.4.4 5.5.5.5\n"
  35. "MapAddress www.infiniteloop.org 6.6.6.6\n"
  36. "MapAddress 6.6.6.6 www.infiniteloop.org\n"
  37. , sizeof(buf));
  38. config_get_lines(buf, &(get_options_mutable()->AddressMap), 0);
  39. config_register_addressmaps(get_options());
  40. /* Use old interface for now, so we don't need to rewrite the unit tests */
  41. #define addressmap_rewrite(a,s,eo,ao) \
  42. addressmap_rewrite((a),(s),AMR_FLAG_USE_IPV4_DNS|AMR_FLAG_USE_IPV6_DNS, \
  43. (eo),(ao))
  44. /* MapAddress .invalidwildcard.com .torserver.exit - no match */
  45. strlcpy(address, "www.invalidwildcard.com", sizeof(address));
  46. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  47. /* MapAddress *invalidasterisk.com .torserver.exit - no match */
  48. strlcpy(address, "www.invalidasterisk.com", sizeof(address));
  49. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  50. /* Where no mapping for FQDN match on top-level domain */
  51. /* MapAddress .google.com .torserver.exit */
  52. strlcpy(address, "reader.google.com", sizeof(address));
  53. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  54. test_streq(address, "reader.torserver.exit");
  55. /* MapAddress *.yahoo.com *.google.com.torserver.exit */
  56. strlcpy(address, "reader.yahoo.com", sizeof(address));
  57. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  58. test_streq(address, "reader.google.com.torserver.exit");
  59. /*MapAddress *.cnn.com www.cnn.com */
  60. strlcpy(address, "cnn.com", sizeof(address));
  61. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  62. test_streq(address, "www.cnn.com");
  63. /* MapAddress .cn.com www.cnn.com */
  64. strlcpy(address, "www.cn.com", sizeof(address));
  65. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  66. test_streq(address, "www.cnn.com");
  67. /* MapAddress ex.com www.cnn.com - no match */
  68. strlcpy(address, "www.ex.com", sizeof(address));
  69. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  70. /* MapAddress ey.com *.cnn.com - invalid expression */
  71. strlcpy(address, "ey.com", sizeof(address));
  72. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  73. /* Where mapping for FQDN match on FQDN */
  74. strlcpy(address, "www.google.com", sizeof(address));
  75. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  76. test_streq(address, "3.3.3.3");
  77. strlcpy(address, "www.torproject.org", sizeof(address));
  78. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  79. test_streq(address, "1.1.1.1");
  80. strlcpy(address, "other.torproject.org", sizeof(address));
  81. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  82. test_streq(address, "this.torproject.org.otherserver.exit");
  83. strlcpy(address, "test.torproject.org", sizeof(address));
  84. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  85. test_streq(address, "2.2.2.2");
  86. /* Test a chain of address mappings and the order in which they were added:
  87. "MapAddress www.example.org 4.4.4.4"
  88. "MapAddress 4.4.4.4 7.7.7.7"
  89. "MapAddress 4.4.4.4 5.5.5.5"
  90. */
  91. strlcpy(address, "www.example.org", sizeof(address));
  92. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  93. test_streq(address, "5.5.5.5");
  94. /* Test infinite address mapping results in no change */
  95. strlcpy(address, "www.infiniteloop.org", sizeof(address));
  96. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  97. test_streq(address, "www.infiniteloop.org");
  98. /* Test we don't find false positives */
  99. strlcpy(address, "www.example.com", sizeof(address));
  100. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  101. /* Test top-level-domain matching a bit harder */
  102. addressmap_clear_configured();
  103. strlcpy(buf, "MapAddress *.com *.torserver.exit\n"
  104. "MapAddress *.torproject.org 1.1.1.1\n"
  105. "MapAddress *.net 2.2.2.2\n"
  106. , sizeof(buf));
  107. config_get_lines(buf, &(get_options_mutable()->AddressMap), 0);
  108. config_register_addressmaps(get_options());
  109. strlcpy(address, "www.abc.com", sizeof(address));
  110. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  111. test_streq(address, "www.abc.torserver.exit");
  112. strlcpy(address, "www.def.com", sizeof(address));
  113. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  114. test_streq(address, "www.def.torserver.exit");
  115. strlcpy(address, "www.torproject.org", sizeof(address));
  116. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  117. test_streq(address, "1.1.1.1");
  118. strlcpy(address, "test.torproject.org", sizeof(address));
  119. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  120. test_streq(address, "1.1.1.1");
  121. strlcpy(address, "torproject.net", sizeof(address));
  122. test_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
  123. test_streq(address, "2.2.2.2");
  124. /* We don't support '*' as a mapping directive */
  125. addressmap_clear_configured();
  126. strlcpy(buf, "MapAddress * *.torserver.exit\n", sizeof(buf));
  127. config_get_lines(buf, &(get_options_mutable()->AddressMap), 0);
  128. config_register_addressmaps(get_options());
  129. strlcpy(address, "www.abc.com", sizeof(address));
  130. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  131. strlcpy(address, "www.def.net", sizeof(address));
  132. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  133. strlcpy(address, "www.torproject.org", sizeof(address));
  134. test_assert(!addressmap_rewrite(address, sizeof(address), &expires, NULL));
  135. #undef addressmap_rewrite
  136. done:
  137. ;
  138. }
  139. #define CONFIG_TEST(name, flags) \
  140. { #name, test_config_ ## name, flags, NULL, NULL }
  141. struct testcase_t config_tests[] = {
  142. CONFIG_TEST(addressmap, 0),
  143. END_OF_TESTCASES
  144. };